File: [local] / src / sys / net80211 / ieee80211.h (download)
Revision 1.63, Mon Mar 14 15:07:24 2022 UTC (2 years, 2 months ago) by stsp
Branch: MAIN
CVS Tags: OPENBSD_7_5_BASE, OPENBSD_7_5, OPENBSD_7_4_BASE, OPENBSD_7_4, OPENBSD_7_3_BASE, OPENBSD_7_3, OPENBSD_7_2_BASE, OPENBSD_7_2, OPENBSD_7_1_BASE, OPENBSD_7_1, HEAD Changes since 1.62: +90 -2 lines
Add initial 802.11ac (VHT) support to net80211.
Add VHT capability and operation IE definitions to ieee80211.h.
Introduce channel flags to identify 80MHz and 160MHz capable channels.
Parse VHT IEs in beacons, announce the driver's VHT capabilities in
probe requests and assoc requests, and hop into 11ac mode after
association to the AP if possible.
Enable VHT by default if the driver announces support for it.
ok claudio@
|
/* $OpenBSD: ieee80211.h,v 1.63 2022/03/14 15:07:24 stsp Exp $ */
/* $NetBSD: ieee80211.h,v 1.6 2004/04/30 23:51:53 dyoung Exp $ */
/*-
* Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _NET80211_IEEE80211_H_
#define _NET80211_IEEE80211_H_
/*
* 802.11 protocol definitions.
*/
#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
/* is 802.11 address multicast/broadcast? */
#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)
/*
* Generic definitions for IEEE 802.11 frames.
*/
struct ieee80211_frame {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
} __packed;
struct ieee80211_qosframe {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
u_int8_t i_qos[2];
} __packed;
struct ieee80211_htframe { /* 11n */
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
u_int8_t i_qos[2];
u_int8_t i_ht[4];
} __packed;
struct ieee80211_frame_addr4 {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
u_int8_t i_addr4[IEEE80211_ADDR_LEN];
} __packed;
struct ieee80211_qosframe_addr4 {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
u_int8_t i_addr4[IEEE80211_ADDR_LEN];
u_int8_t i_qos[2];
} __packed;
struct ieee80211_htframe_addr4 { /* 11n */
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
u_int8_t i_addr3[IEEE80211_ADDR_LEN];
u_int8_t i_seq[2];
u_int8_t i_addr4[IEEE80211_ADDR_LEN];
u_int8_t i_qos[2];
u_int8_t i_ht[4];
} __packed;
#define IEEE80211_FC0_VERSION_MASK 0x03
#define IEEE80211_FC0_VERSION_SHIFT 0
#define IEEE80211_FC0_VERSION_0 0x00
#define IEEE80211_FC0_TYPE_MASK 0x0c
#define IEEE80211_FC0_TYPE_SHIFT 2
#define IEEE80211_FC0_TYPE_MGT 0x00
#define IEEE80211_FC0_TYPE_CTL 0x04
#define IEEE80211_FC0_TYPE_DATA 0x08
#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
#define IEEE80211_FC0_SUBTYPE_SHIFT 4
/* for TYPE_MGT */
#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00
#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10
#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20
#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30
#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40
#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50
#define IEEE80211_FC0_SUBTYPE_BEACON 0x80
#define IEEE80211_FC0_SUBTYPE_ATIM 0x90
#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0
#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0
#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0
#define IEEE80211_FC0_SUBTYPE_ACTION 0xd0
#define IEEE80211_FC0_SUBTYPE_ACTION_NOACK 0xe0 /* 11n */
/* for TYPE_CTL */
#define IEEE80211_FC0_SUBTYPE_WRAPPER 0x70 /* 11n */
#define IEEE80211_FC0_SUBTYPE_BAR 0x80
#define IEEE80211_FC0_SUBTYPE_BA 0x90
#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0
#define IEEE80211_FC0_SUBTYPE_RTS 0xb0
#define IEEE80211_FC0_SUBTYPE_CTS 0xc0
#define IEEE80211_FC0_SUBTYPE_ACK 0xd0
#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0
#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0
/* for TYPE_DATA (bit combination) */
#define IEEE80211_FC0_SUBTYPE_DATA 0x00
#define IEEE80211_FC0_SUBTYPE_DATA_CF_ACK 0x10
#define IEEE80211_FC0_SUBTYPE_DATA_CF_POLL 0x20
#define IEEE80211_FC0_SUBTYPE_DATA_CF_ACKPOLL 0x30
#define IEEE80211_FC0_SUBTYPE_NODATA 0x40
#define IEEE80211_FC0_SUBTYPE_NODATA_CF_ACK 0x50
#define IEEE80211_FC0_SUBTYPE_NODATA_CF_POLL 0x60
#define IEEE80211_FC0_SUBTYPE_NODATA_CF_ACKPOLL 0x70
#define IEEE80211_FC0_SUBTYPE_QOS 0x80
#define IEEE80211_FC1_DIR_MASK 0x03
#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
#define IEEE80211_FC1_MORE_FRAG 0x04
#define IEEE80211_FC1_RETRY 0x08
#define IEEE80211_FC1_PWR_MGT 0x10
#define IEEE80211_FC1_MORE_DATA 0x20
#define IEEE80211_FC1_PROTECTED 0x40
#define IEEE80211_FC1_WEP 0x40 /* pre-RSNA compat */
#define IEEE80211_FC1_ORDER 0x80
#define IEEE80211_FC1_BITS \
"\20\03MORE_FRAG\04RETRY\05PWR_MGT\06MORE_DATA" \
"\07PROTECTED\08ORDER"
/*
* Sequence Control field (see 802.11-2012 8.2.4.4).
*/
#define IEEE80211_SEQ_FRAG_MASK 0x000f
#define IEEE80211_SEQ_FRAG_SHIFT 0
#define IEEE80211_SEQ_SEQ_MASK 0xfff0
#define IEEE80211_SEQ_SEQ_SHIFT 4
#define IEEE80211_NWID_LEN 32
#define IEEE80211_MMIE_LEN 18 /* 11w */
/*
* QoS Control field (see 802.11-2012 8.2.4.5).
*/
#define IEEE80211_QOS_TXOP 0xff00
#define IEEE80211_QOS_AMSDU 0x0080 /* 11n */
#define IEEE80211_QOS_ACK_POLICY_NORMAL 0x0000
#define IEEE80211_QOS_ACK_POLICY_NOACK 0x0020
#define IEEE80211_QOS_ACK_POLICY_NOEXPLACK 0x0040
#define IEEE80211_QOS_ACK_POLICY_BA 0x0060
#define IEEE80211_QOS_ACK_POLICY_MASK 0x0060
#define IEEE80211_QOS_ACK_POLICY_SHIFT 5
#define IEEE80211_QOS_EOSP 0x0010
#define IEEE80211_QOS_TID 0x000f
/*
* Control frames.
*/
struct ieee80211_frame_min {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_addr1[IEEE80211_ADDR_LEN];
u_int8_t i_addr2[IEEE80211_ADDR_LEN];
/* FCS */
} __packed;
struct ieee80211_frame_rts {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_ra[IEEE80211_ADDR_LEN];
u_int8_t i_ta[IEEE80211_ADDR_LEN];
/* FCS */
} __packed;
struct ieee80211_frame_cts {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_ra[IEEE80211_ADDR_LEN];
/* FCS */
} __packed;
struct ieee80211_frame_ack {
u_int8_t i_fc[2];
u_int8_t i_dur[2];
u_int8_t i_ra[IEEE80211_ADDR_LEN];
/* FCS */
} __packed;
struct ieee80211_frame_pspoll {
u_int8_t i_fc[2];
u_int8_t i_aid[2];
u_int8_t i_bssid[IEEE80211_ADDR_LEN];
u_int8_t i_ta[IEEE80211_ADDR_LEN];
/* FCS */
} __packed;
struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */
u_int8_t i_fc[2];
u_int8_t i_dur[2]; /* should be zero */
u_int8_t i_ra[IEEE80211_ADDR_LEN];
u_int8_t i_bssid[IEEE80211_ADDR_LEN];
/* FCS */
} __packed;
#ifdef _KERNEL
static __inline int
ieee80211_has_seq(const struct ieee80211_frame *wh)
{
return (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) !=
IEEE80211_FC0_TYPE_CTL;
}
static __inline int
ieee80211_has_addr4(const struct ieee80211_frame *wh)
{
return (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) ==
IEEE80211_FC1_DIR_DSTODS;
}
static __inline int
ieee80211_has_qos(const struct ieee80211_frame *wh)
{
return (wh->i_fc[0] &
(IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) ==
(IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS);
}
static __inline int
ieee80211_has_htc(const struct ieee80211_frame *wh)
{
return (wh->i_fc[1] & IEEE80211_FC1_ORDER) &&
(ieee80211_has_qos(wh) ||
(wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
IEEE80211_FC0_TYPE_MGT);
}
static __inline u_int16_t
ieee80211_get_qos(const struct ieee80211_frame *wh)
{
const u_int8_t *frm;
if (ieee80211_has_addr4(wh))
frm = ((const struct ieee80211_qosframe_addr4 *)wh)->i_qos;
else
frm = ((const struct ieee80211_qosframe *)wh)->i_qos;
return letoh16(*(const u_int16_t *)frm);
}
#endif /* _KERNEL */
/*
* Capability Information field (see 802.11-2012 8.4.1.4).
*/
#define IEEE80211_CAPINFO_ESS 0x0001
#define IEEE80211_CAPINFO_IBSS 0x0002
#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004
#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008
#define IEEE80211_CAPINFO_PRIVACY 0x0010
#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020
#define IEEE80211_CAPINFO_PBCC 0x0040
#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080
#define IEEE80211_CAPINFO_SPECTRUM_MGMT 0x0100
#define IEEE80211_CAPINFO_QOS 0x0200
#define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400
#define IEEE80211_CAPINFO_APSD 0x0800
#define IEEE80211_CAPINFO_RADIO_MEASUREMENT 0x1000
#define IEEE80211_CAPINFO_DSSSOFDM 0x2000
#define IEEE80211_CAPINFO_DELAYED_B_ACK 0x4000
#define IEEE80211_CAPINFO_IMMEDIATE_B_ACK 0x8000
#define IEEE80211_CAPINFO_BITS \
"\10\01ESS\02IBSS\03CF_POLLABLE\04CF_POLLREQ" \
"\05PRIVACY\06SHORT_PREAMBLE\07PBCC\10CHNL_AGILITY" \
"\11SPECTRUM_MGMT\12QOS\13SHORT_SLOTTIME\14APSD" \
"\15RADIO_MEASUREMENT\16DSSSOFDM\17DELAYED_B_ACK\20IMMEDIATE_B_ACK"
/*
* Information element IDs (see 802.11-2012 Table 8.4.2).
*/
enum {
IEEE80211_ELEMID_SSID = 0,
IEEE80211_ELEMID_RATES = 1,
IEEE80211_ELEMID_FHPARMS = 2,
IEEE80211_ELEMID_DSPARMS = 3,
IEEE80211_ELEMID_CFPARMS = 4,
IEEE80211_ELEMID_TIM = 5,
IEEE80211_ELEMID_IBSSPARMS = 6,
IEEE80211_ELEMID_COUNTRY = 7,
IEEE80211_ELEMID_HOPPING_PARMS = 8,
IEEE80211_ELEMID_HOPPING_PATTERN = 9,
IEEE80211_ELEMID_REQUEST = 10,
IEEE80211_ELEMID_QBSS_LOAD = 11,
IEEE80211_ELEMID_EDCAPARMS = 12,
IEEE80211_ELEMID_TSPEC = 13,
IEEE80211_ELEMID_TCLASS = 14,
IEEE80211_ELEMID_SCHEDULE = 15,
IEEE80211_ELEMID_CHALLENGE = 16,
/* 17-31 reserved for challenge text extension */
IEEE80211_ELEMID_POWER_CONSTRAINT = 32,
IEEE80211_ELEMID_POWER_CAP = 33,
IEEE80211_ELEMID_TPC_REQUEST = 34,
IEEE80211_ELEMID_TPC_REPORT = 35,
IEEE80211_ELEMID_SUPP_CHNLS = 35,
IEEE80211_ELEMID_CSA = 37, /* 11h */
IEEE80211_ELEMID_MEASUREMENT_REQUEST = 38, /* DFS */
IEEE80211_ELEMID_MEASUREMENT_REPORT = 39, /* DFS */
IEEE80211_ELEMID_QUIET = 40,
IEEE80211_ELEMID_IBSS_DFS = 41,
IEEE80211_ELEMID_ERP = 42,
IEEE80211_ELEMID_TS_DELAY = 43,
IEEE80211_ELEMID_TCLAS = 44,
IEEE80211_ELEMID_HTCAPS = 45, /* 11n */
IEEE80211_ELEMID_QOS_CAP = 46,
/* 47 reserved */
IEEE80211_ELEMID_RSN = 48,
/* 49 reserved */
IEEE80211_ELEMID_XRATES = 50,
IEEE80211_ELEMID_AP_CHNL_REPORT = 51,
IEEE80211_ELEMID_NBR_REPORT = 52,
IEEE80211_ELEMID_RCPI = 53,
IEEE80211_ELEMID_MDE = 54,
IEEE80211_ELEMID_FTE = 55,
IEEE80211_ELEMID_TIE = 56, /* 11r */
IEEE80211_ELEMID_RDE = 57,
IEEE80211_ELEMID_DSE = 58,
IEEE80211_ELEMID_SUPP_OPCLASS = 59,
IEEE80211_ELEMID_XCSA = 60,
IEEE80211_ELEMID_HTOP = 61, /* 11n */
IEEE80211_ELEMID_SECONDARY_CHANL_OFFSET = 62, /* 11n */
IEEE80211_ELEMID_AVG_ACCESS_DELAY = 63,
IEEE80211_ELEMID_ANTENNA = 64,
IEEE80211_ELEMID_RSNI = 65,
IEEE80211_ELEMID_MEASUREMENT_PILOT_TX = 66,
IEEE80211_ELEMID_AVAIL_CAPACITY = 67,
IEEE80211_ELEMID_AC_ACCESS_DELAY = 68,
IEEE80211_ELEMID_TIME_ADVERT = 69,
IEEE80211_ELEMID_RM = 70,
IEEE80211_ELEMID_MULTI_BSSID = 71,
IEEE80211_ELEMID_20_40_CBW_COEX = 72, /* 11n */
IEEE80211_ELEMID_20_40_CBW_INTOLERANT = 73, /* 11n */
IEEE80211_ELEMID_SCAN_PARAM_OVERLAP = 74,
IEEE80211_ELEMID_RIC = 75,
IEEE80211_ELEMID_MMIE = 76, /* 11w */
IEEE80211_ELEMID_EVENT_REQUEST = 78,
IEEE80211_ELEMID_EVENT_REPORT = 79,
IEEE80211_ELEMID_DIAG_REQUEST = 80,
IEEE80211_ELEMID_DIAG_REPORT = 81,
IEEE80211_ELEMID_LOCATION_PARMS = 82,
IEEE80211_ELEMID_NONTX_BSSID = 83,
IEEE80211_ELEMID_SSID_LIST = 84,
IEEE80211_ELEMID_MULTI_BSSID_IDX = 85,
IEEE80211_ELEMID_FMS_DESC = 86,
IEEE80211_ELEMID_FMS_REQUEST = 87,
IEEE80211_ELEMID_FMS_RESPONSE = 88,
IEEE80211_ELEMID_QOS_TRAFFIC_CAP = 89,
IEEE80211_ELEMID_MAX_IDLE_PERIOD = 90,
IEEE80211_ELEMID_TFS_REQUEST = 91,
IEEE80211_ELEMID_TFS_RESPONSE = 92,
IEEE80211_ELEMID_WNM_SLEEP = 93,
IEEE80211_ELEMID_TIM_BCAST_REQUEST = 94,
IEEE80211_ELEMID_TIM_BCAST_RESPONSE = 95,
IEEE80211_ELEMID_INTERFERENCE_REPORT = 96,
IEEE80211_ELEMID_CHNL_USAGE = 97,
IEEE80211_ELEMID_TIME_ZONE = 98,
IEEE80211_ELEMID_DMS_REQUEST = 99,
IEEE80211_ELEMID_DMS_RESPONSE = 100,
IEEE80211_ELEMID_LINK_ID = 101,
IEEE80211_ELEMID_WAKE_SCHED = 102,
/* 103 undefined */
IEEE80211_ELEMID_CHNL_SWITCH_TIMING = 104,
IEEE80211_ELEMID_PTI_CTRL = 105,
IEEE80211_ELEMID_TPU_BUF_STATUS = 106,
IEEE80211_ELEMID_INTERWORKING = 107,
IEEE80211_ELEMID_ADVERT_PROTOCOL = 108,
IEEE80211_ELEMID_EXPEDITED_BW_REQUEST = 109,
IEEE80211_ELEMID_QOS_MAP_SET = 110,
IEEE80211_ELEMID_ROAMING_CONSORTIUM = 111,
IEEE80211_ELEMID_EMERGENCY_ALERT_ID = 112,
IEEE80211_ELEMID_MESHCONF = 113,
IEEE80211_ELEMID_MESHID = 114,
IEEE80211_ELEMID_MESHLINK = 115,
IEEE80211_ELEMID_MESHCNGST = 116,
IEEE80211_ELEMID_MESHPEER = 117,
IEEE80211_ELEMID_MESHCSA = 118,
IEEE80211_ELEMID_MESHAWAKEW = 119,
IEEE80211_ELEMID_MESHBEACONT = 120,
IEEE80211_ELEMID_MCCAOP_SETUP_REQUEST = 121,
IEEE80211_ELEMID_MCCAOP_SETUP_REPLY = 122,
IEEE80211_ELEMID_MCCAOP_ADVERT = 123,
IEEE80211_ELEMID_MCCAOP_TEARDOWN = 124,
IEEE80211_ELEMID_MESHGANN = 125,
IEEE80211_ELEMID_MESHRANN = 126,
IEEE80211_ELEMID_XCAPS = 127,
/* 128-129 reserved */
IEEE80211_ELEMID_MESHPREQ = 130,
IEEE80211_ELEMID_MESHPREP = 131,
IEEE80211_ELEMID_MESHPERR = 132,
/* 133-136 reserved */
IEEE80211_ELEMID_MESHPXU = 137,
IEEE80211_ELEMID_MESHPXUC = 138,
IEEE80211_ELEMID_AUTH_MESH_PEERING_XCHG = 139,
IEEE80211_ELEMID_MIC = 140,
IEEE80211_ELEMID_DEST_URI = 141,
IEEE80211_ELEMID_U_APSD_COEX = 142,
/* 143-174 reserved */
IEEE80211_ELEMID_MCCAOP_ADVERT_OVIEW = 174,
/* 175-190 reserved */
IEEE80211_ELEMID_VHTCAPS = 191, /* 11ac */
IEEE80211_ELEMID_VHTOP = 192, /* 11ac */
IEEE80211_ELEMID_EXT_BSS_LOAD = 193, /* 11ac */
IEEE80211_ELEMID_WIDEBAND_CHNL_SWITCH = 194, /* 11ac */
IEEE80211_ELEMID_VHT_TXPOWER = 195, /* 11ac */
IEEE80211_ELEMID_CHNL_SWITCH_WRAPPER = 196, /* 11ac */
IEEE80211_ELEMID_AID = 197, /* 11ac */
IEEE80211_ELEMID_QUIET_CHNL = 198, /* 11ac */
IEEE80211_ELEMID_OPMODE_NOTIF = 199, /* 11ac */
/* 200-220 reserved */
IEEE80211_ELEMID_VENDOR = 221 /* vendor private */
/* 222-255 reserved */
};
/*
* Action field category values (see 802.11-2012 8.4.1.11 Table 8-38).
*/
enum {
IEEE80211_CATEG_SPECTRUM = 0,
IEEE80211_CATEG_QOS = 1,
IEEE80211_CATEG_DLS = 2,
IEEE80211_CATEG_BA = 3,
IEEE80211_CATEG_PUB = 4,
IEEE80211_CATEG_RADIO_MSRMNT = 5,
IEEE80211_CATEG_FAST_BSS_TRANS = 6,
IEEE80211_CATEG_HT = 7, /* 11n */
IEEE80211_CATEG_SA_QUERY = 8, /* 11w */
IEEE80211_CATEG_PROT_DUAL_PUBLIC_ACTION = 9,
IEEE80211_CATEG_WNM = 10,
IEEE80211_CATEG_UNPROT_WNM = 11,
IEEE80211_CATEG_TDLS = 12,
IEEE80211_CATEG_MESH = 13,
IEEE80211_CATEG_MULTIHOP = 14,
IEEE80211_CATEG_SELF_PROT = 15,
/* 16-125 reserved */
IEEE80211_CATEG_PROT_VENDOR = 126,
IEEE80211_CATEG_VENDOR = 127
/* 128-255 error */
};
/*
* Block Ack Action field values (see 802.11-2012 8.5.5 Table 8-202).
*/
#define IEEE80211_ACTION_ADDBA_REQ 0
#define IEEE80211_ACTION_ADDBA_RESP 1
#define IEEE80211_ACTION_DELBA 2
/* 3-255 reserved */
/*
* SA Query Action field values (see 802.11-2012 8.5.10 Table 8-227).
*/
#define IEEE80211_ACTION_SA_QUERY_REQ 0
#define IEEE80211_ACTION_SA_QUERY_RESP 1
/*
* HT Action field values (see 802.11-2012 8.5.12 Table 8-229).
*/
#define IEEE80211_ACTION_NOTIFYCW 0
#define IEEE80211_ACTION_SM_PWRSAVE 1
#define IEEE80211_ACTION_PSMP 2
#define IEEE80211_ACTION_SET_PCO_PHASE 3
#define IEEE80211_ACTION_CSI 4
#define IEEE80211_ACTION_NONCOMPRESSED_BF 5
#define IEEE80211_ACTION_COMPRESSED_BF 6
#define IEEE80211_ACTION_ASEL_IDX_FEEDBACK 7
/* 8-255 reserved */
#define IEEE80211_RATE_BASIC 0x80
#define IEEE80211_RATE_VAL 0x7f
#define IEEE80211_RATE_SIZE 8 /* 802.11 standard */
#define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */
#define IEEE80211_HT_NUM_MCS 77
#define IEEE80211_VHT_NUM_MCS 10
/*
* BlockAck/BlockAckReq Control field (see 802.11-2012 8.3.1.9 Figure 8-25).
*/
#define IEEE80211_BA_ACK_POLICY 0x0001
#define IEEE80211_BA_MULTI_TID 0x0002
#define IEEE80211_BA_COMPRESSED 0x0004
#define IEEE80211_BA_TID_INFO_MASK 0xf000
#define IEEE80211_BA_TID_INFO_SHIFT 12
/*
* ADDBA Parameter Set field (see 802.11-2012 8.4.1.14 Figure 8-48).
*/
#define IEEE80211_ADDBA_AMSDU 0x0001 /* A-MSDU in A-MPDU supported */
#define IEEE80211_ADDBA_BA_POLICY 0x0002 /* 1=immediate BA 0=delayed BA */
#define IEEE80211_ADDBA_TID_MASK 0x003c
#define IEEE80211_ADDBA_TID_SHIFT 2
#define IEEE80211_ADDBA_BUFSZ_MASK 0xffc0
#define IEEE80211_ADDBA_BUFSZ_SHIFT 6
/*
* DELBA Parameter Set field (see 802.11-2012 8.4.1.16 Figure 8-50).
*/
#define IEEE80211_DELBA_INITIATOR 0x0800
#define IEEE80211_DELBA_TID_INFO_MASK 0xf000
#define IEEE80211_DELBA_TID_INFO_SHIFT 12
/*
* ERP information element parameters (see 802.11-2012 8.4.2.14 Figure 8-95).
*/
#define IEEE80211_ERP_NON_ERP_PRESENT 0x01
#define IEEE80211_ERP_USE_PROTECTION 0x02
#define IEEE80211_ERP_BARKER_MODE 0x04
/*
* RSN capabilities (see 802.11-2012 8.4.2.27.4).
*/
#define IEEE80211_RSNCAP_PREAUTH 0x0001
#define IEEE80211_RSNCAP_NOPAIRWISE 0x0002
#define IEEE80211_RSNCAP_PTKSA_RCNT_MASK 0x000c
#define IEEE80211_RSNCAP_PTKSA_RCNT_SHIFT 2
#define IEEE80211_RSNCAP_GTKSA_RCNT_MASK 0x0030
#define IEEE80211_RSNCAP_GTKSA_RCNT_SHIFT 4
#define IEEE80211_RSNCAP_RCNT1 0
#define IEEE80211_RSNCAP_RCNT2 1
#define IEEE80211_RSNCAP_RCNT4 2
#define IEEE80211_RSNCAP_RCNT16 3
#define IEEE80211_RSNCAP_MFPR 0x0040 /* 11w */
#define IEEE80211_RSNCAP_MFPC 0x0080 /* 11w */
#define IEEE80211_RSNCAP_PEERKEYENA 0x0200
#define IEEE80211_RSNCAP_SPPAMSDUC 0x0400 /* 11n */
#define IEEE80211_RSNCAP_SPPAMSDUR 0x0800 /* 11n */
#define IEEE80211_RSNCAP_PBAC 0x1000 /* 11n */
#define IEEE80211_RSNCAP_EXTENDED_KEYID 0x2000
/*
* HT Capabilities Info (see 802.11-2012 8.4.2.58.2).
*/
#define IEEE80211_HTCAP_LDPC 0x00000001
#define IEEE80211_HTCAP_CBW20_40 0x00000002
#define IEEE80211_HTCAP_SMPS_MASK 0x0000000c
#define IEEE80211_HTCAP_SMPS_SHIFT 2
#define IEEE80211_HTCAP_SMPS_STA 0
#define IEEE80211_HTCAP_SMPS_DYN 1
#define IEEE80211_HTCAP_SMPS_DIS 3
#define IEEE80211_HTCAP_GF 0x00000010
#define IEEE80211_HTCAP_SGI20 0x00000020
#define IEEE80211_HTCAP_SGI40 0x00000040
#define IEEE80211_HTCAP_TXSTBC 0x00000080
#define IEEE80211_HTCAP_RXSTBC_MASK 0x00000300
#define IEEE80211_HTCAP_RXSTBC_SHIFT 8
#define IEEE80211_HTCAP_DELAYEDBA 0x00000400
#define IEEE80211_HTCAP_AMSDU7935 0x00000800
#define IEEE80211_HTCAP_DSSSCCK40 0x00001000
#define IEEE80211_HTCAP_PSMP 0x00002000
#define IEEE80211_HTCAP_40INTOLERANT 0x00004000
#define IEEE80211_HTCAP_LSIGTXOPPROT 0x00008000
/*
* HT A-MPDU parameters (see 802.11-2012 8.4.2.58.3).
*/
#define IEEE80211_AMPDU_PARAM_LE 0x03
#define IEEE80211_AMPDU_PARAM_SS 0x1c
#define IEEE80211_AMPDU_PARAM_SS_NONE (0 << 2)
#define IEEE80211_AMPDU_PARAM_SS_0_25 (1 << 2)
#define IEEE80211_AMPDU_PARAM_SS_0_5 (2 << 2)
#define IEEE80211_AMPDU_PARAM_SS_1 (3 << 2)
#define IEEE80211_AMPDU_PARAM_SS_2 (4 << 2)
#define IEEE80211_AMPDU_PARAM_SS_4 (5 << 2)
#define IEEE80211_AMPDU_PARAM_SS_8 (6 << 2)
#define IEEE80211_AMPDU_PARAM_SS_16 (7 << 2)
/* bits 5-7 reserved */
/*
* HT Supported MCS Set (see 802.11-2012 8.4.2.58.4).
* This field is 16 bytes in size. Bitmasks given below
* operate on 8 or 16 bit integer subsets of this field
* for use with ieee80211com and ieee80211_node.
*/
/* Bits 0-76: Supported Rx MCS bitmask */
/* Bits 77-79: Reserved */
/* Bits 80-89: Highest Rx rate in units of 1MB/s */
#define IEEE80211_MCS_RX_RATE_HIGH 0x03ff
/* Bits 90-95: Reserved */
/* Bits 96-100: Tx MCS set */
#define IEEE80211_TX_MCS_SET_DEFINED 0x01
#define IEEE80211_TX_RX_MCS_NOT_EQUAL 0x02
#define IEEE80211_TX_SPATIAL_STREAMS 0x0c
#define IEEE80211_TX_UNEQUAL_MODULATION 0x10
/* Bits 101-127: Reserved */
/*
* HT Extended Capabilities (see 802.11-2012 8.4.2.58.5).
*/
#define IEEE80211_HTXCAP_PCO 0x0001
#define IEEE80211_HTXCAP_PCOTT_MASK 0x0006
#define IEEE80211_HTXCAP_PCOTT_SHIFT 1
#define IEEE80211_HTXCAP_PCOTT_400 1
#define IEEE80211_HTXCAP_PCOTT_1500 2
#define IEEE80211_HTXCAP_PCOTT_5000 3
/* Bits 3-7 are reserved. */
#define IEEE80211_HTXCAP_MFB_MASK 0x0300
#define IEEE80211_HTXCAP_MFB_SHIFT 8
#define IEEE80211_HTXCAP_MFB_NONE 0
#define IEEE80211_HTXCAP_MFB_UNSOL 2
#define IEEE80211_HTXCAP_MFB_BOTH 3
#define IEEE80211_HTXCAP_HTC 0x0400
#define IEEE80211_HTXCAP_RDRESP 0x0800
/* Bits 12-15 are reserved. */
/*
* Transmit Beamforming (TxBF) Capabilities (see 802.11-2012 8.4.2.58.6).
*/
#define IEEE80211_TXBFCAP_IMPLICIT_RX 0x00000001
#define IEEE80211_TXBFCAP_RSSC 0x00000002
#define IEEE80211_TXBFCAP_TSSC 0x00000004
#define IEEE80211_TXBFCAP_RNDP 0x00000008
#define IEEE80211_TXBFCAP_TNDP 0x00000010
#define IEEE80211_TXBFCAP_IMPLICIT_TX 0x00000020
#define IEEE80211_TXBFCAP_CALIB_MASK 0x000000c0
#define IEEE80211_TXBFCAP_CALIB_SHIFT 6
#define IEEE80211_TXBFCAP_TX_CSI 0x00000100
#define IEEE80211_TXBFCAP_EXPLICIT_NSC 0x00000200
#define IEEE80211_TXBFCAP_EXPLICIT_CSC 0x00000400
#define IEEE80211_TXBFCAP_CSI_FB_DELAYED 0x00000800
#define IEEE80211_TXBFCAP_CSI_FB_IMMEDIATE 0x00001000
#define IEEE80211_TXBFCAP_EXPLICIT_NB_FB_DELAYED 0x00002000
#define IEEE80211_TXBFCAP_EXPLICIT_NB_FB_IMMEDIATE 0x00004000
#define IEEE80211_TXBFCAP_EXPLICIT_CB_FB_DELAYED 0x00008000
#define IEEE80211_TXBFCAP_EXPLICIT_CB_FB_IMMEDIATE 0x00010000
#define IEEE80211_TXBFCAP_MINIMAL_GROUPING_1_2 0x00020000
#define IEEE80211_TXBFCAP_MINIMAL_GROUPING_1_4 0x00040000
#define IEEE80211_TXBFCAP_CSI_NUM_ANT_MASK 0x00180000
#define IEEE80211_TXBFCAP_CSI_NUM_ANT_SHIFT 19
#define IEEE80211_TXBFCAP_NS_NUM_ANT_MASK 0x00600000
#define IEEE80211_TXBFCAP_NS_NUM_ANT_SHIFT 21
#define IEEE80211_TXBFCAP_CS_NUM_ANT_MASK 0x01800000
#define IEEE80211_TXBFCAP_CS_NUM_ANT_SHIFT 23
#define IEEE80211_TXBFCAP_CSI_NUM_ROWS_MASK 0x06000000
#define IEEE80211_TXBFCAP_CSI_NUM_ROWS_SHIFT 25
#define IEEE80211_TXBFCAP_CHANL_ESTIMATE_MASK 0x18000000
#define IEEE80211_TXBFCAP_CHANL_ESTIMATE_SHIFT 27
/*
* Antenna Selection (ASEL) Capability (see 802.11-2012 8.4.2.58.7).
*/
#define IEEE80211_ASELCAP_ASEL 0x01
#define IEEE80211_ASELCAP_CSIFB_TX 0x02
#define IEEE80211_ASELCAP_ANT_IDX_FB_TX 0x04
#define IEEE80211_ASELCAP_CSIFB 0x08
#define IEEE80211_ASELCAP_ANT_IDX_FB 0x10
#define IEEE80211_ASELCAP_ASEL_RX 0x20
#define IEEE80211_ASELCAP_TX_SOUND_PPDU 0x20
/* Bit 7 is reserved. */
/*
* HT Operation element (see 802.11-2012 8.4.2.59).
*/
/* Byte 0 contains primary channel number. */
/* Byte 1. */
#define IEEE80211_HTOP0_SCO_MASK 0x03
#define IEEE80211_HTOP0_SCO_SHIFT 0
#define IEEE80211_HTOP0_SCO_SCN 0
#define IEEE80211_HTOP0_SCO_SCA 1
#define IEEE80211_HTOP0_SCO_SCB 3
#define IEEE80211_HTOP0_CHW 0x04
#define IEEE80211_HTOP0_RIFS 0x08
/* bits 4-7 reserved */
/* Bytes 2-3. */
#define IEEE80211_HTOP1_PROT_MASK 0x0003
#define IEEE80211_HTOP1_PROT_SHIFT 0
#define IEEE80211_HTOP1_NONGF_STA 0x0004
/* Bit 3 is reserved. */
#define IEEE80211_HTOP1_OBSS_NONHT_STA 0x0010
/* Bits 5-15 are reserved. */
/* Bytes 4-5. */
/* Bits 0-5 are reserved. */
#define IEEE80211_HTOP2_DUALBEACON 0x0040
#define IEEE80211_HTOP2_DUALCTSPROT 0x0080
#define IEEE80211_HTOP2_STBCBEACON 0x0100
#define IEEE80211_HTOP2_LSIGTXOP 0x0200
#define IEEE80211_HTOP2_PCOACTIVE 0x0400
#define IEEE80211_HTOP2_PCOPHASE40 0x0800
/* Bits 12-15 are reserved. */
/*
* VHT Capabilities Info (see 802.11ac-2013 8.4.2.160.2).
*/
#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_MASK 0x00000003
#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_SHIFT 0
#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_3895 0
#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_7991 1
#define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_11454 2
#define IEEE80211_VHTCAP_CHAN_WIDTH_MASK 0x0c
#define IEEE80211_VHTCAP_CHAN_WIDTH_SHIFT 2
#define IEEE80211_VHTCAP_CHAN_WIDTH_80 0
#define IEEE80211_VHTCAP_CHAN_WIDTH_160 1
#define IEEE80211_VHTCAP_CHAN_WIDTH_160_8080 2
#define IEEE80211_VHTCAP_RX_LDPC 0x00000010
#define IEEE80211_VHTCAP_SGI80 0x00000020
#define IEEE80211_VHTCAP_SGI160 0x00000040
#define IEEE80211_VHTCAP_TX_STBC 0x00000080
#define IEEE80211_VHTCAP_RX_STBC_SS_MASK 0x00000700
#define IEEE80211_VHTCAP_RX_STBC_SS_SHIFT 8
#define IEEE80211_VHTCAP_SU_BEAMFORMER 0x00000800
#define IEEE80211_VHTCAP_SU_BEAMFORMEE 0x00001000
#define IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK 0x0000e000
#define IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT 13
#define IEEE80211_VHTCAP_NUM_STS_MASK 0x00070000
#define IEEE80211_VHTCAP_NUM_STS_SHIFT 16
#define IEEE80211_VHTCAP_MU_BEAMFORMER 0x00080000
#define IEEE80211_VHTCAP_MU_BEAMFORMEE 0x00100000
#define IEEE80211_VHTCAP_TXOP_PS 0x00200000
#define IEEE80211_VHTCAP_HTC_VHT 0x00400000
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_MASK 0x03800000
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_SHIFT 23
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_8K 0
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_16K 1
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_32K 2
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_64K 3
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_128K 4
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_256K 5
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_512K 6
#define IEEE80211_VHTCAP_MAX_AMPDU_LEN_1024K 7
#define IEEE80211_VHTCAP_LINK_ADAPT_MASK 0x0c000000
#define IEEE80211_VHTCAP_LINK_ADAPT_SHIFT 26
#define IEEE80211_VHTCAP_LINK_ADAPT_UNSOL_MFB 2
#define IEEE80211_VHTCAP_LINK_ADAPT_MRQ_MFB 3
#define IEEE80211_VHTCAP_RX_ANT_PATTERN 0x10000000
#define IEEE80211_VHTCAP_TX_ANT_PATTERN 0x20000000
/*
* VHT-MCS and NSS map (see 802.11ac-2013 8.4.2.160.3, Figure 8-401bs).
* Set of VHT MCS supported for a given number of spatial streams, `n'.
* Used by the VHT capabilities IE and by the basic VHT MSC set in
* the VHT operation IE.
*/
#define IEEE80211_VHT_MCS_FOR_SS_MASK(n) (0x3 << (2*((n)-1)))
#define IEEE80211_VHT_MCS_FOR_SS_SHIFT(n) (2*((n)-1))
#define IEEE80211_VHT_MCS_0_7 0
#define IEEE80211_VHT_MCS_0_8 1
#define IEEE80211_VHT_MCS_0_9 2
#define IEEE80211_VHT_MCS_SS_NOT_SUPP 3
#define IEEE80211_VHT_MAX_LGI_MBIT_S_MASK 0x1fff
#define IEEE80211_VHT_MAX_LGI_MBIT_S_SHIFT 0
/* The highest number of spatial streams supported by VHT. */
#define IEEE80211_VHT_NUM_SS 8
/*
* VHT Operation element (see 802.11ac-2013 8.4.2.161).
*/
/* Byte 0. */
#define IEEE80211_VHTOP0_CHAN_WIDTH_MASK 0x03
#define IEEE80211_VHTOP0_CHAN_WIDTH_SHIFT 0
#define IEEE80211_VHTOP0_CHAN_WIDTH_HT 0
#define IEEE80211_VHTOP0_CHAN_WIDTH_80 1
#define IEEE80211_VHTOP0_CHAN_WIDTH_160 2
#define IEEE80211_VHTOP0_CHAN_WIDTH_8080 3
/* Byte 1 contains channel center frequency index 0 for 80, 80+80, 160 MHz. */
/* Byte 2 contains channel center frequency index 1 for 80+80 MHz only. */
/*
* EDCA Access Categories.
*/
enum ieee80211_edca_ac {
EDCA_AC_BK = 1, /* Background */
EDCA_AC_BE = 0, /* Best Effort */
EDCA_AC_VI = 2, /* Video */
EDCA_AC_VO = 3 /* Voice */
};
#define EDCA_NUM_AC 4
/* number of TID values (traffic identifier) */
#define IEEE80211_NUM_TID 16
/* Atheros private advanced capabilities info */
#define ATHEROS_CAP_TURBO_PRIME 0x01
#define ATHEROS_CAP_COMPRESSION 0x02
#define ATHEROS_CAP_FAST_FRAME 0x04
/* bits 3-6 reserved */
#define ATHEROS_CAP_BOOST 0x80
/*-
* Organizationally Unique Identifiers.
* See http://standards.ieee.org/regauth/oui/oui.txt for a list.
*/
#define ATHEROS_OUI ((const u_int8_t[]){ 0x00, 0x03, 0x7f })
#define BROADCOM_OUI ((const u_int8_t[]){ 0x00, 0x90, 0x4c })
#define IEEE80211_OUI ((const u_int8_t[]){ 0x00, 0x0f, 0xac })
#define MICROSOFT_OUI ((const u_int8_t[]){ 0x00, 0x50, 0xf2 })
#define IEEE80211_AUTH_ALGORITHM(auth) \
((auth)[0] | ((auth)[1] << 8))
#define IEEE80211_AUTH_TRANSACTION(auth) \
((auth)[2] | ((auth)[3] << 8))
#define IEEE80211_AUTH_STATUS(auth) \
((auth)[4] | ((auth)[5] << 8))
/*
* Authentication Algorithm Number field (see 7.3.1.1).
*/
#define IEEE80211_AUTH_ALG_OPEN 0x0000
#define IEEE80211_AUTH_ALG_SHARED 0x0001
#define IEEE80211_AUTH_ALG_LEAP 0x0080
/*
* Authentication Transaction Sequence Number field (see 7.3.1.2).
*/
enum {
IEEE80211_AUTH_OPEN_REQUEST = 1,
IEEE80211_AUTH_OPEN_RESPONSE = 2
};
enum {
IEEE80211_AUTH_SHARED_REQUEST = 1,
IEEE80211_AUTH_SHARED_CHALLENGE = 2,
IEEE80211_AUTH_SHARED_RESPONSE = 3,
IEEE80211_AUTH_SHARED_PASS = 4
};
/*
* Reason codes (see Table 22).
*/
enum {
IEEE80211_REASON_UNSPECIFIED = 1,
IEEE80211_REASON_AUTH_EXPIRE = 2,
IEEE80211_REASON_AUTH_LEAVE = 3,
IEEE80211_REASON_ASSOC_EXPIRE = 4,
IEEE80211_REASON_ASSOC_TOOMANY = 5,
IEEE80211_REASON_NOT_AUTHED = 6,
IEEE80211_REASON_NOT_ASSOCED = 7,
IEEE80211_REASON_ASSOC_LEAVE = 8,
IEEE80211_REASON_ASSOC_NOT_AUTHED = 9,
/* XXX the following two reason codes are not correct */
IEEE80211_REASON_RSN_REQUIRED = 11,
IEEE80211_REASON_RSN_INCONSISTENT = 12,
IEEE80211_REASON_IE_INVALID = 13,
IEEE80211_REASON_MIC_FAILURE = 14,
IEEE80211_REASON_4WAY_TIMEOUT = 15,
IEEE80211_REASON_GROUP_TIMEOUT = 16,
IEEE80211_REASON_RSN_DIFFERENT_IE = 17,
IEEE80211_REASON_BAD_GROUP_CIPHER = 18,
IEEE80211_REASON_BAD_PAIRWISE_CIPHER = 19,
IEEE80211_REASON_BAD_AKMP = 20,
IEEE80211_REASON_RSN_IE_VER_UNSUP = 21,
IEEE80211_REASON_RSN_IE_BAD_CAP = 22,
IEEE80211_REASON_CIPHER_REJ_POLICY = 24,
IEEE80211_REASON_SETUP_REQUIRED = 38,
IEEE80211_REASON_TIMEOUT = 39
};
/*
* Status codes (see Table 23).
*/
enum {
IEEE80211_STATUS_SUCCESS = 0,
IEEE80211_STATUS_UNSPECIFIED = 1,
IEEE80211_STATUS_CAPINFO = 10,
IEEE80211_STATUS_NOT_ASSOCED = 11,
IEEE80211_STATUS_OTHER = 12,
IEEE80211_STATUS_ALG = 13,
IEEE80211_STATUS_SEQUENCE = 14,
IEEE80211_STATUS_CHALLENGE = 15,
IEEE80211_STATUS_TIMEOUT = 16,
IEEE80211_STATUS_TOOMANY = 17,
IEEE80211_STATUS_BASIC_RATE = 18,
IEEE80211_STATUS_SP_REQUIRED = 19,
IEEE80211_STATUS_PBCC_REQUIRED = 20,
IEEE80211_STATUS_CA_REQUIRED = 21,
IEEE80211_STATUS_TOO_MANY_STATIONS = 22,
IEEE80211_STATUS_RATES = 23,
IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25,
IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26,
IEEE80211_STATUS_TRY_AGAIN_LATER = 30,
IEEE80211_STATUS_MFP_POLICY = 31,
IEEE80211_STATUS_REFUSED = 37,
IEEE80211_STATUS_INVALID_PARAM = 38,
IEEE80211_STATUS_IE_INVALID = 40,
IEEE80211_STATUS_BAD_GROUP_CIPHER = 41,
IEEE80211_STATUS_BAD_PAIRWISE_CIPHER = 42,
IEEE80211_STATUS_BAD_AKMP = 43,
IEEE80211_STATUS_RSN_IE_VER_UNSUP = 44,
IEEE80211_STATUS_CIPHER_REJ_POLICY = 46
};
#define IEEE80211_WEP_KEYLEN 5 /* 40bit */
#define IEEE80211_WEP_NKID 4 /* number of key ids */
#define IEEE80211_CHALLENGE_LEN 128
/* WEP header constants */
#define IEEE80211_WEP_IVLEN 3 /* 24bit */
#define IEEE80211_WEP_KIDLEN 1 /* 1 octet */
#define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */
#define IEEE80211_CRC_LEN 4
#define IEEE80211_WEP_TOTLEN (IEEE80211_WEP_IVLEN + \
IEEE80211_WEP_KIDLEN + \
IEEE80211_WEP_CRCLEN)
/*
* 802.11i defines an extended IV for use with non-WEP ciphers.
* When the EXTIV bit is set in the key id byte an additional
* 4 bytes immediately follow the IV for TKIP. For CCMP the
* EXTIV bit is likewise set but the 8 bytes represent the
* CCMP header rather than IV+extended-IV.
*/
#define IEEE80211_WEP_EXTIV 0x20
#define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */
#define IEEE80211_WEP_MICLEN 8 /* trailing MIC */
/*
* Maximum acceptable MTU is:
* IEEE80211_MAX_LEN - WEP overhead - CRC -
* QoS overhead - RSN/WPA overhead
* Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default
* mtu is Ethernet-compatible; it's set by ether_ifattach.
*/
#define IEEE80211_MTU_MAX 2290
#define IEEE80211_MTU_MIN 32
#define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \
(IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN))
#define IEEE80211_ACK_LEN \
(sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN)
#define IEEE80211_MIN_LEN \
(sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN)
/*
* The 802.11 spec says at most 2007 stations may be
* associated at once. For most AP's this is way more
* than is feasible so we use a default of 1800. This
* number may be overridden by the driver and/or by
* user configuration.
*/
#define IEEE80211_AID_MAX 2007
#define IEEE80211_AID_DEF 1800
#define IEEE80211_AID(b) ((b) &~ 0xc000)
/*
* RTS frame length parameters. The default is specified in
* the 802.11 spec. The max may be wrong for jumbo frames.
*/
#define IEEE80211_RTS_DEFAULT 512
#define IEEE80211_RTS_MIN 1
#define IEEE80211_RTS_MAX IEEE80211_MAX_LEN
#define IEEE80211_PLCP_SERVICE 0x00
#define IEEE80211_PLCP_SERVICE_PBCC 0x08 /* PBCC encoded */
#define IEEE80211_PLCP_SERVICE_LENEXT 0x80 /* length extension bit */
/* One Time Unit (TU) is 1Kus = 1024 microseconds. */
#define IEEE80211_DUR_TU 1024
/* IEEE 802.11b durations for DSSS PHY in microseconds */
#define IEEE80211_DUR_DS_LONG_PREAMBLE 144
#define IEEE80211_DUR_DS_SHORT_PREAMBLE 72
#define IEEE80211_DUR_DS_PREAMBLE_DIFFERENCE \
(IEEE80211_DUR_DS_LONG_PREAMBLE - IEEE80211_DUR_DS_SHORT_PREAMBLE)
#define IEEE80211_DUR_DS_FAST_PLCPHDR 24
#define IEEE80211_DUR_DS_SLOW_PLCPHDR 48
#define IEEE80211_DUR_DS_PLCPHDR_DIFFERENCE \
(IEEE80211_DUR_DS_SLOW_PLCPHDR - IEEE80211_DUR_DS_FAST_PLCPHDR)
#define IEEE80211_DUR_DS_SLOW_ACK 112
#define IEEE80211_DUR_DS_FAST_ACK 56
#define IEEE80211_DUR_DS_SLOW_CTS 112
#define IEEE80211_DUR_DS_FAST_CTS 56
#define IEEE80211_DUR_DS_SLOT 20
#define IEEE80211_DUR_DS_SHSLOT 9
#define IEEE80211_DUR_DS_SIFS 10
#define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT)
#define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \
2 * IEEE80211_DUR_DS_SLOT)
#define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \
IEEE80211_DUR_DS_SLOW_ACK + \
IEEE80211_DUR_DS_LONG_PREAMBLE + \
IEEE80211_DUR_DS_SLOW_PLCPHDR + \
IEEE80211_DUR_DIFS)
/*
* The RSNA key descriptor used by IEEE 802.11 does not use the IEEE 802.1X
* key descriptor. Instead, it uses the key descriptor described in 8.5.2.
*/
#define EAPOL_KEY_NONCE_LEN 32
#define EAPOL_KEY_IV_LEN 16
#define EAPOL_KEY_MIC_LEN 16
struct ieee80211_eapol_key {
u_int8_t version;
#define EAPOL_VERSION 1
u_int8_t type;
/* IEEE Std 802.1X-2004, 7.5.4 (only type EAPOL-Key is used here) */
#define EAP_PACKET 0
#define EAPOL_START 1
#define EAPOL_LOGOFF 2
#define EAPOL_KEY 3
#define EAPOL_ASF_ALERT 4
u_int8_t len[2];
u_int8_t desc;
/* IEEE Std 802.1X-2004, 7.6.1 */
#define EAPOL_KEY_DESC_RC4 1 /* deprecated */
#define EAPOL_KEY_DESC_IEEE80211 2
#define EAPOL_KEY_DESC_WPA 254 /* non-standard WPA */
u_int8_t info[2];
#define EAPOL_KEY_VERSION_MASK 0x7
#define EAPOL_KEY_DESC_V1 1
#define EAPOL_KEY_DESC_V2 2
#define EAPOL_KEY_DESC_V3 3 /* 11r */
#define EAPOL_KEY_PAIRWISE (1 << 3)
#define EAPOL_KEY_INSTALL (1 << 6) /* I */
#define EAPOL_KEY_KEYACK (1 << 7) /* A */
#define EAPOL_KEY_KEYMIC (1 << 8) /* M */
#define EAPOL_KEY_SECURE (1 << 9) /* S */
#define EAPOL_KEY_ERROR (1 << 10)
#define EAPOL_KEY_REQUEST (1 << 11)
#define EAPOL_KEY_ENCRYPTED (1 << 12)
#define EAPOL_KEY_SMK (1 << 13)
/* WPA compatibility */
#define EAPOL_KEY_WPA_KID_MASK 0x3
#define EAPOL_KEY_WPA_KID_SHIFT 4
#define EAPOL_KEY_WPA_TX EAPOL_KEY_INSTALL
u_int8_t keylen[2];
u_int8_t replaycnt[8];
u_int8_t nonce[EAPOL_KEY_NONCE_LEN];
u_int8_t iv[EAPOL_KEY_IV_LEN];
u_int8_t rsc[8];
u_int8_t reserved[8];
u_int8_t mic[EAPOL_KEY_MIC_LEN];
u_int8_t paylen[2];
} __packed;
/* Pairwise Transient Key (see 8.5.1.2) */
struct ieee80211_ptk {
u_int8_t kck[16]; /* Key Confirmation Key */
u_int8_t kek[16]; /* Key Encryption Key */
u_int8_t tk[32]; /* Temporal Key */
} __packed;
#define IEEE80211_PMKID_LEN 16
#define IEEE80211_SMKID_LEN 16
/*
* Key Data Encapsulation (see Table 62).
*/
enum {
IEEE80211_KDE_GTK = 1,
IEEE80211_KDE_MACADDR = 3,
IEEE80211_KDE_PMKID = 4,
IEEE80211_KDE_SMK = 5,
IEEE80211_KDE_NONCE = 6,
IEEE80211_KDE_LIFETIME = 7,
IEEE80211_KDE_ERROR = 8,
IEEE80211_KDE_IGTK = 9 /* 11w */
};
/*
* HT protection modes (see 802.11-2012 8.4.2.59)
*/
enum ieee80211_htprot {
IEEE80211_HTPROT_NONE = 0, /* only 20/40MHz HT STAs exist */
IEEE80211_HTPROT_NONMEMBER, /* non-HT STA overlaps our channel */
IEEE80211_HTPROT_20MHZ, /* 20MHz HT STA on a 40MHz channel */
IEEE80211_HTPROT_NONHT_MIXED /* non-HT STA associated to our BSS */
};
#endif /* _NET80211_IEEE80211_H_ */