| 1 | /*- |
| 2 | * Copyright (c) 2001 Atsushi Onoe |
| 3 | * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting |
| 4 | * All rights reserved. |
| 5 | * |
| 6 | * Redistribution and use in source and binary forms, with or without |
| 7 | * modification, are permitted provided that the following conditions |
| 8 | * are met: |
| 9 | * 1. Redistributions of source code must retain the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer. |
| 11 | * 2. Redistributions in binary form must reproduce the above copyright |
| 12 | * notice, this list of conditions and the following disclaimer in the |
| 13 | * documentation and/or other materials provided with the distribution. |
| 14 | * |
| 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| 16 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 17 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 18 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 21 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 22 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 25 | * |
| 26 | * $FreeBSD$ |
| 27 | */ |
| 28 | #ifndef _NET80211_IEEE80211_H_ |
| 29 | #define _NET80211_IEEE80211_H_ |
| 30 | |
| 31 | /* |
| 32 | * 802.11 protocol definitions. |
| 33 | */ |
| 34 | |
| 35 | #define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ |
| 36 | /* is 802.11 address multicast/broadcast? */ |
| 37 | #define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) |
| 38 | |
| 39 | #ifdef _KERNEL |
| 40 | extern const uint8_t ieee80211broadcastaddr[]; |
| 41 | #endif |
| 42 | |
| 43 | typedef uint16_t ieee80211_seq; |
| 44 | |
| 45 | /* IEEE 802.11 PLCP header */ |
| 46 | struct ieee80211_plcp_hdr { |
| 47 | uint16_t i_sfd; |
| 48 | uint8_t i_signal; |
| 49 | uint8_t i_service; |
| 50 | uint16_t i_length; |
| 51 | uint16_t i_crc; |
| 52 | } __packed; |
| 53 | |
| 54 | #define IEEE80211_PLCP_SFD 0xF3A0 |
| 55 | #define IEEE80211_PLCP_SERVICE 0x00 |
| 56 | #define IEEE80211_PLCP_SERVICE_LOCKED 0x04 |
| 57 | #define IEEE80211_PLCL_SERVICE_PBCC 0x08 |
| 58 | #define IEEE80211_PLCP_SERVICE_LENEXT5 0x20 |
| 59 | #define IEEE80211_PLCP_SERVICE_LENEXT6 0x40 |
| 60 | #define IEEE80211_PLCP_SERVICE_LENEXT7 0x80 |
| 61 | |
| 62 | /* |
| 63 | * generic definitions for IEEE 802.11 frames |
| 64 | */ |
| 65 | struct ieee80211_frame { |
| 66 | uint8_t i_fc[2]; |
| 67 | uint8_t i_dur[2]; |
| 68 | uint8_t i_addr1[IEEE80211_ADDR_LEN]; |
| 69 | uint8_t i_addr2[IEEE80211_ADDR_LEN]; |
| 70 | uint8_t i_addr3[IEEE80211_ADDR_LEN]; |
| 71 | uint8_t i_seq[2]; |
| 72 | /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ |
| 73 | /* see below */ |
| 74 | } __packed; |
| 75 | |
| 76 | struct ieee80211_qosframe { |
| 77 | uint8_t i_fc[2]; |
| 78 | uint8_t i_dur[2]; |
| 79 | uint8_t i_addr1[IEEE80211_ADDR_LEN]; |
| 80 | uint8_t i_addr2[IEEE80211_ADDR_LEN]; |
| 81 | uint8_t i_addr3[IEEE80211_ADDR_LEN]; |
| 82 | uint8_t i_seq[2]; |
| 83 | uint8_t i_qos[2]; |
| 84 | /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */ |
| 85 | /* see below */ |
| 86 | } __packed; |
| 87 | |
| 88 | struct ieee80211_qoscntl { |
| 89 | uint8_t i_qos[2]; |
| 90 | }; |
| 91 | |
| 92 | struct ieee80211_frame_addr4 { |
| 93 | uint8_t i_fc[2]; |
| 94 | uint8_t i_dur[2]; |
| 95 | uint8_t i_addr1[IEEE80211_ADDR_LEN]; |
| 96 | uint8_t i_addr2[IEEE80211_ADDR_LEN]; |
| 97 | uint8_t i_addr3[IEEE80211_ADDR_LEN]; |
| 98 | uint8_t i_seq[2]; |
| 99 | uint8_t i_addr4[IEEE80211_ADDR_LEN]; |
| 100 | } __packed; |
| 101 | |
| 102 | |
| 103 | struct ieee80211_qosframe_addr4 { |
| 104 | uint8_t i_fc[2]; |
| 105 | uint8_t i_dur[2]; |
| 106 | uint8_t i_addr1[IEEE80211_ADDR_LEN]; |
| 107 | uint8_t i_addr2[IEEE80211_ADDR_LEN]; |
| 108 | uint8_t i_addr3[IEEE80211_ADDR_LEN]; |
| 109 | uint8_t i_seq[2]; |
| 110 | uint8_t i_addr4[IEEE80211_ADDR_LEN]; |
| 111 | uint8_t i_qos[2]; |
| 112 | } __packed; |
| 113 | |
| 114 | #define IEEE80211_FC0_VERSION_MASK 0x03 |
| 115 | #define IEEE80211_FC0_VERSION_SHIFT 0 |
| 116 | #define IEEE80211_FC0_VERSION_0 0x00 |
| 117 | #define IEEE80211_FC0_TYPE_MASK 0x0c |
| 118 | #define IEEE80211_FC0_TYPE_SHIFT 2 |
| 119 | #define IEEE80211_FC0_TYPE_MGT 0x00 |
| 120 | #define IEEE80211_FC0_TYPE_CTL 0x04 |
| 121 | #define IEEE80211_FC0_TYPE_DATA 0x08 |
| 122 | |
| 123 | #define IEEE80211_FC0_SUBTYPE_MASK 0xf0 |
| 124 | #define IEEE80211_FC0_SUBTYPE_SHIFT 4 |
| 125 | /* for TYPE_MGT */ |
| 126 | #define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00 |
| 127 | #define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10 |
| 128 | #define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20 |
| 129 | #define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30 |
| 130 | #define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40 |
| 131 | #define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50 |
| 132 | #define IEEE80211_FC0_SUBTYPE_TIMING_ADV 0x60 |
| 133 | #define IEEE80211_FC0_SUBTYPE_BEACON 0x80 |
| 134 | #define IEEE80211_FC0_SUBTYPE_ATIM 0x90 |
| 135 | #define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0 |
| 136 | #define IEEE80211_FC0_SUBTYPE_AUTH 0xb0 |
| 137 | #define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0 |
| 138 | #define IEEE80211_FC0_SUBTYPE_ACTION 0xd0 |
| 139 | #define IEEE80211_FC0_SUBTYPE_ACTION_NOACK 0xe0 |
| 140 | /* for TYPE_CTL */ |
| 141 | #define IEEE80211_FC0_SUBTYPE_CONTROL_WRAP 0x70 |
| 142 | #define IEEE80211_FC0_SUBTYPE_BAR 0x80 |
| 143 | #define IEEE80211_FC0_SUBTYPE_BA 0x90 |
| 144 | #define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0 |
| 145 | #define IEEE80211_FC0_SUBTYPE_RTS 0xb0 |
| 146 | #define IEEE80211_FC0_SUBTYPE_CTS 0xc0 |
| 147 | #define IEEE80211_FC0_SUBTYPE_ACK 0xd0 |
| 148 | #define IEEE80211_FC0_SUBTYPE_CF_END 0xe0 |
| 149 | #define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0 |
| 150 | /* for TYPE_DATA (bit combination) */ |
| 151 | #define IEEE80211_FC0_SUBTYPE_DATA 0x00 |
| 152 | #define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10 |
| 153 | #define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20 |
| 154 | #define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30 |
| 155 | #define IEEE80211_FC0_SUBTYPE_NODATA 0x40 |
| 156 | #define IEEE80211_FC0_SUBTYPE_CFACK 0x50 |
| 157 | #define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60 |
| 158 | #define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70 |
| 159 | #define IEEE80211_FC0_SUBTYPE_QOS 0x80 |
| 160 | #define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0 |
| 161 | |
| 162 | #define IEEE80211_FC1_DIR_MASK 0x03 |
| 163 | #define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */ |
| 164 | #define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */ |
| 165 | #define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */ |
| 166 | #define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */ |
| 167 | |
| 168 | #define IEEE80211_IS_DSTODS(wh) \ |
| 169 | (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS) |
| 170 | |
| 171 | #define IEEE80211_FC1_MORE_FRAG 0x04 |
| 172 | #define IEEE80211_FC1_RETRY 0x08 |
| 173 | #define IEEE80211_FC1_PWR_MGT 0x10 |
| 174 | #define IEEE80211_FC1_MORE_DATA 0x20 |
| 175 | #define IEEE80211_FC1_PROTECTED 0x40 |
| 176 | #define IEEE80211_FC1_ORDER 0x80 |
| 177 | |
| 178 | #define IEEE80211_HAS_SEQ(type, subtype) \ |
| 179 | ((type) != IEEE80211_FC0_TYPE_CTL && \ |
| 180 | !((type) == IEEE80211_FC0_TYPE_DATA && \ |
| 181 | ((subtype) & IEEE80211_FC0_SUBTYPE_QOS_NULL) == \ |
| 182 | IEEE80211_FC0_SUBTYPE_QOS_NULL)) |
| 183 | #define IEEE80211_SEQ_FRAG_MASK 0x000f |
| 184 | #define IEEE80211_SEQ_FRAG_SHIFT 0 |
| 185 | #define IEEE80211_SEQ_SEQ_MASK 0xfff0 |
| 186 | #define IEEE80211_SEQ_SEQ_SHIFT 4 |
| 187 | #define IEEE80211_SEQ_RANGE 4096 |
| 188 | |
| 189 | #define IEEE80211_SEQ_ADD(seq, incr) \ |
| 190 | (((seq) + (incr)) & (IEEE80211_SEQ_RANGE-1)) |
| 191 | #define IEEE80211_SEQ_INC(seq) IEEE80211_SEQ_ADD(seq,1) |
| 192 | #define IEEE80211_SEQ_SUB(a, b) \ |
| 193 | (((a) + IEEE80211_SEQ_RANGE - (b)) & (IEEE80211_SEQ_RANGE-1)) |
| 194 | |
| 195 | #define IEEE80211_SEQ_BA_RANGE 2048 /* 2^11 */ |
| 196 | #define IEEE80211_SEQ_BA_BEFORE(a, b) \ |
| 197 | (IEEE80211_SEQ_SUB(b, a+1) < IEEE80211_SEQ_BA_RANGE-1) |
| 198 | |
| 199 | #define IEEE80211_NWID_LEN 32 |
| 200 | #define IEEE80211_MESHID_LEN 32 |
| 201 | |
| 202 | #define IEEE80211_QOS_TXOP 0x00ff |
| 203 | /* bit 8 is reserved */ |
| 204 | #define IEEE80211_QOS_AMSDU 0x80 |
| 205 | #define IEEE80211_QOS_AMSDU_S 7 |
| 206 | #define IEEE80211_QOS_ACKPOLICY 0x60 |
| 207 | #define IEEE80211_QOS_ACKPOLICY_S 5 |
| 208 | #define IEEE80211_QOS_ACKPOLICY_NOACK 0x20 /* No ACK required */ |
| 209 | #define IEEE80211_QOS_ACKPOLICY_BA 0x60 /* Block ACK */ |
| 210 | #define IEEE80211_QOS_EOSP 0x10 /* EndOfService Period*/ |
| 211 | #define IEEE80211_QOS_EOSP_S 4 |
| 212 | #define IEEE80211_QOS_TID 0x0f |
| 213 | /* qos[1] byte used for all frames sent by mesh STAs in a mesh BSS */ |
| 214 | #define IEEE80211_QOS_MC 0x01 /* Mesh control */ |
| 215 | /* Mesh power save level*/ |
| 216 | #define IEEE80211_QOS_MESH_PSL 0x02 |
| 217 | /* Mesh Receiver Service Period Initiated */ |
| 218 | #define IEEE80211_QOS_RSPI 0x04 |
| 219 | /* bits 11 to 15 reserved */ |
| 220 | |
| 221 | /* does frame have QoS sequence control data */ |
| 222 | #define IEEE80211_QOS_HAS_SEQ(wh) \ |
| 223 | (((wh)->i_fc[0] & \ |
| 224 | (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_QOS)) == \ |
| 225 | (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS)) |
| 226 | |
| 227 | /* |
| 228 | * WME/802.11e information element. |
| 229 | */ |
| 230 | struct ieee80211_wme_info { |
| 231 | uint8_t wme_id; /* IEEE80211_ELEMID_VENDOR */ |
| 232 | uint8_t wme_len; /* length in bytes */ |
| 233 | uint8_t wme_oui[3]; /* 0x00, 0x50, 0xf2 */ |
| 234 | uint8_t wme_type; /* OUI type */ |
| 235 | uint8_t wme_subtype; /* OUI subtype */ |
| 236 | uint8_t wme_version; /* spec revision */ |
| 237 | uint8_t wme_info; /* QoS info */ |
| 238 | } __packed; |
| 239 | |
| 240 | /* |
| 241 | * WME/802.11e Tspec Element |
| 242 | */ |
| 243 | struct ieee80211_wme_tspec { |
| 244 | uint8_t ts_id; |
| 245 | uint8_t ts_len; |
| 246 | uint8_t ts_oui[3]; |
| 247 | uint8_t ts_oui_type; |
| 248 | uint8_t ts_oui_subtype; |
| 249 | uint8_t ts_version; |
| 250 | uint8_t ts_tsinfo[3]; |
| 251 | uint8_t ts_nom_msdu[2]; |
| 252 | uint8_t ts_max_msdu[2]; |
| 253 | uint8_t ts_min_svc[4]; |
| 254 | uint8_t ts_max_svc[4]; |
| 255 | uint8_t ts_inactv_intv[4]; |
| 256 | uint8_t ts_susp_intv[4]; |
| 257 | uint8_t ts_start_svc[4]; |
| 258 | uint8_t ts_min_rate[4]; |
| 259 | uint8_t ts_mean_rate[4]; |
| 260 | uint8_t ts_max_burst[4]; |
| 261 | uint8_t ts_min_phy[4]; |
| 262 | uint8_t ts_peak_rate[4]; |
| 263 | uint8_t ts_delay[4]; |
| 264 | uint8_t ts_surplus[2]; |
| 265 | uint8_t ts_medium_time[2]; |
| 266 | } __packed; |
| 267 | |
| 268 | /* |
| 269 | * WME AC parameter field |
| 270 | */ |
| 271 | struct ieee80211_wme_acparams { |
| 272 | uint8_t acp_aci_aifsn; |
| 273 | uint8_t acp_logcwminmax; |
| 274 | uint16_t acp_txop; |
| 275 | } __packed; |
| 276 | |
| 277 | #define WME_NUM_AC 4 /* 4 AC categories */ |
| 278 | #define WME_NUM_TID 16 /* 16 tids */ |
| 279 | |
| 280 | #define WME_PARAM_ACI 0x60 /* Mask for ACI field */ |
| 281 | #define WME_PARAM_ACI_S 5 /* Shift for ACI field */ |
| 282 | #define WME_PARAM_ACM 0x10 /* Mask for ACM bit */ |
| 283 | #define WME_PARAM_ACM_S 4 /* Shift for ACM bit */ |
| 284 | #define WME_PARAM_AIFSN 0x0f /* Mask for aifsn field */ |
| 285 | #define WME_PARAM_AIFSN_S 0 /* Shift for aifsn field */ |
| 286 | #define WME_PARAM_LOGCWMIN 0x0f /* Mask for CwMin field (in log) */ |
| 287 | #define WME_PARAM_LOGCWMIN_S 0 /* Shift for CwMin field */ |
| 288 | #define WME_PARAM_LOGCWMAX 0xf0 /* Mask for CwMax field (in log) */ |
| 289 | #define WME_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */ |
| 290 | |
| 291 | #define WME_AC_TO_TID(_ac) ( \ |
| 292 | ((_ac) == WME_AC_VO) ? 6 : \ |
| 293 | ((_ac) == WME_AC_VI) ? 5 : \ |
| 294 | ((_ac) == WME_AC_BK) ? 1 : \ |
| 295 | 0) |
| 296 | |
| 297 | #define TID_TO_WME_AC(_tid) ( \ |
| 298 | ((_tid) == 0 || (_tid) == 3) ? WME_AC_BE : \ |
| 299 | ((_tid) < 3) ? WME_AC_BK : \ |
| 300 | ((_tid) < 6) ? WME_AC_VI : \ |
| 301 | WME_AC_VO) |
| 302 | |
| 303 | /* |
| 304 | * WME Parameter Element |
| 305 | */ |
| 306 | struct ieee80211_wme_param { |
| 307 | uint8_t param_id; |
| 308 | uint8_t param_len; |
| 309 | uint8_t param_oui[3]; |
| 310 | uint8_t param_oui_type; |
| 311 | uint8_t param_oui_subtype; |
| 312 | uint8_t param_version; |
| 313 | uint8_t param_qosInfo; |
| 314 | #define WME_QOSINFO_COUNT 0x0f /* Mask for param count field */ |
| 315 | uint8_t param_reserved; |
| 316 | struct ieee80211_wme_acparams params_acParams[WME_NUM_AC]; |
| 317 | } __packed; |
| 318 | |
| 319 | /* |
| 320 | * WME U-APSD qos info field defines |
| 321 | */ |
| 322 | #define WME_CAPINFO_UAPSD_EN 0x00000080 |
| 323 | #define WME_CAPINFO_UAPSD_VO 0x00000001 |
| 324 | #define WME_CAPINFO_UAPSD_VI 0x00000002 |
| 325 | #define WME_CAPINFO_UAPSD_BK 0x00000004 |
| 326 | #define WME_CAPINFO_UAPSD_BE 0x00000008 |
| 327 | #define WME_CAPINFO_UAPSD_ACFLAGS_SHIFT 0 |
| 328 | #define WME_CAPINFO_UAPSD_ACFLAGS_MASK 0xF |
| 329 | #define WME_CAPINFO_UAPSD_MAXSP_SHIFT 5 |
| 330 | #define WME_CAPINFO_UAPSD_MAXSP_MASK 0x3 |
| 331 | #define WME_CAPINFO_IE_OFFSET 8 |
| 332 | #define WME_UAPSD_MAXSP(_qosinfo) \ |
| 333 | (((_qosinfo) >> WME_CAPINFO_UAPSD_MAXSP_SHIFT) & \ |
| 334 | WME_CAPINFO_UAPSD_MAXSP_MASK) |
| 335 | #define WME_UAPSD_AC_ENABLED(_ac, _qosinfo) \ |
| 336 | ((1 << (3 - (_ac))) & ( \ |
| 337 | ((_qosinfo) >> WME_CAPINFO_UAPSD_ACFLAGS_SHIFT) & \ |
| 338 | WME_CAPINFO_UAPSD_ACFLAGS_MASK)) |
| 339 | |
| 340 | /* |
| 341 | * Management Notification Frame |
| 342 | */ |
| 343 | struct ieee80211_mnf { |
| 344 | uint8_t mnf_category; |
| 345 | uint8_t mnf_action; |
| 346 | uint8_t mnf_dialog; |
| 347 | uint8_t mnf_status; |
| 348 | } __packed; |
| 349 | #define MNF_SETUP_REQ 0 |
| 350 | #define MNF_SETUP_RESP 1 |
| 351 | #define MNF_TEARDOWN 2 |
| 352 | |
| 353 | /* |
| 354 | * 802.11n Management Action Frames |
| 355 | */ |
| 356 | /* generic frame format */ |
| 357 | struct ieee80211_action { |
| 358 | uint8_t ia_category; |
| 359 | uint8_t ia_action; |
| 360 | } __packed; |
| 361 | |
| 362 | #define IEEE80211_ACTION_CAT_SM 0 /* Spectrum Management */ |
| 363 | #define IEEE80211_ACTION_CAT_QOS 1 /* QoS */ |
| 364 | #define IEEE80211_ACTION_CAT_DLS 2 /* DLS */ |
| 365 | #define IEEE80211_ACTION_CAT_BA 3 /* BA */ |
| 366 | #define IEEE80211_ACTION_CAT_HT 7 /* HT */ |
| 367 | #define IEEE80211_ACTION_CAT_MESH 13 /* Mesh */ |
| 368 | #define IEEE80211_ACTION_CAT_SELF_PROT 15 /* Self-protected */ |
| 369 | /* 16 - 125 reserved */ |
| 370 | #define IEEE80211_ACTION_VHT 21 |
| 371 | #define IEEE80211_ACTION_CAT_VENDOR 127 /* Vendor Specific */ |
| 372 | |
| 373 | #define IEEE80211_ACTION_HT_TXCHWIDTH 0 /* recommended xmit chan width*/ |
| 374 | #define IEEE80211_ACTION_HT_MIMOPWRSAVE 1 /* MIMO power save */ |
| 375 | |
| 376 | /* HT - recommended transmission channel width */ |
| 377 | struct ieee80211_action_ht_txchwidth { |
| 378 | struct ieee80211_action at_header; |
| 379 | uint8_t at_chwidth; |
| 380 | } __packed; |
| 381 | |
| 382 | #define IEEE80211_A_HT_TXCHWIDTH_20 0 |
| 383 | #define IEEE80211_A_HT_TXCHWIDTH_2040 1 |
| 384 | |
| 385 | /* HT - MIMO Power Save (NB: D2.04) */ |
| 386 | struct ieee80211_action_ht_mimopowersave { |
| 387 | struct ieee80211_action am_header; |
| 388 | uint8_t am_control; |
| 389 | } __packed; |
| 390 | |
| 391 | #define IEEE80211_A_HT_MIMOPWRSAVE_ENA 0x01 /* PS enabled */ |
| 392 | #define IEEE80211_A_HT_MIMOPWRSAVE_MODE 0x02 |
| 393 | #define IEEE80211_A_HT_MIMOPWRSAVE_MODE_S 1 |
| 394 | #define IEEE80211_A_HT_MIMOPWRSAVE_DYNAMIC 0x02 /* Dynamic Mode */ |
| 395 | #define IEEE80211_A_HT_MIMOPWRSAVE_STATIC 0x00 /* no SM packets */ |
| 396 | /* bits 2-7 reserved */ |
| 397 | |
| 398 | /* Block Ack actions */ |
| 399 | #define IEEE80211_ACTION_BA_ADDBA_REQUEST 0 /* ADDBA request */ |
| 400 | #define IEEE80211_ACTION_BA_ADDBA_RESPONSE 1 /* ADDBA response */ |
| 401 | #define IEEE80211_ACTION_BA_DELBA 2 /* DELBA */ |
| 402 | |
| 403 | /* Block Ack Parameter Set */ |
| 404 | #define IEEE80211_BAPS_BUFSIZ 0xffc0 /* buffer size */ |
| 405 | #define IEEE80211_BAPS_BUFSIZ_S 6 |
| 406 | #define IEEE80211_BAPS_TID 0x003c /* TID */ |
| 407 | #define IEEE80211_BAPS_TID_S 2 |
| 408 | #define IEEE80211_BAPS_POLICY 0x0002 /* block ack policy */ |
| 409 | #define IEEE80211_BAPS_POLICY_S 1 |
| 410 | |
| 411 | #define IEEE80211_BAPS_POLICY_DELAYED (0<<IEEE80211_BAPS_POLICY_S) |
| 412 | #define IEEE80211_BAPS_POLICY_IMMEDIATE (1<<IEEE80211_BAPS_POLICY_S) |
| 413 | |
| 414 | /* Block Ack Sequence Control */ |
| 415 | #define IEEE80211_BASEQ_START 0xfff0 /* starting seqnum */ |
| 416 | #define IEEE80211_BASEQ_START_S 4 |
| 417 | #define IEEE80211_BASEQ_FRAG 0x000f /* fragment number */ |
| 418 | #define IEEE80211_BASEQ_FRAG_S 0 |
| 419 | |
| 420 | /* Delayed Block Ack Parameter Set */ |
| 421 | #define IEEE80211_DELBAPS_TID 0xf000 /* TID */ |
| 422 | #define IEEE80211_DELBAPS_TID_S 12 |
| 423 | #define IEEE80211_DELBAPS_INIT 0x0800 /* initiator */ |
| 424 | #define IEEE80211_DELBAPS_INIT_S 11 |
| 425 | |
| 426 | /* BA - ADDBA request */ |
| 427 | struct ieee80211_action_ba_addbarequest { |
| 428 | struct ieee80211_action rq_header; |
| 429 | uint8_t rq_dialogtoken; |
| 430 | uint16_t rq_baparamset; |
| 431 | uint16_t rq_batimeout; /* in TUs */ |
| 432 | uint16_t rq_baseqctl; |
| 433 | } __packed; |
| 434 | |
| 435 | /* BA - ADDBA response */ |
| 436 | struct ieee80211_action_ba_addbaresponse { |
| 437 | struct ieee80211_action rs_header; |
| 438 | uint8_t rs_dialogtoken; |
| 439 | uint16_t rs_statuscode; |
| 440 | uint16_t rs_baparamset; |
| 441 | uint16_t rs_batimeout; /* in TUs */ |
| 442 | } __packed; |
| 443 | |
| 444 | /* BA - DELBA */ |
| 445 | struct ieee80211_action_ba_delba { |
| 446 | struct ieee80211_action dl_header; |
| 447 | uint16_t dl_baparamset; |
| 448 | uint16_t dl_reasoncode; |
| 449 | } __packed; |
| 450 | |
| 451 | /* BAR Control */ |
| 452 | #define IEEE80211_BAR_TID 0xf000 /* TID */ |
| 453 | #define IEEE80211_BAR_TID_S 12 |
| 454 | #define IEEE80211_BAR_COMP 0x0004 /* Compressed Bitmap */ |
| 455 | #define IEEE80211_BAR_MTID 0x0002 /* Multi-TID */ |
| 456 | #define IEEE80211_BAR_NOACK 0x0001 /* No-Ack policy */ |
| 457 | |
| 458 | /* BAR Starting Sequence Control */ |
| 459 | #define IEEE80211_BAR_SEQ_START 0xfff0 /* starting seqnum */ |
| 460 | #define IEEE80211_BAR_SEQ_START_S 4 |
| 461 | |
| 462 | struct ieee80211_ba_request { |
| 463 | uint16_t rq_barctl; |
| 464 | uint16_t rq_barseqctl; |
| 465 | } __packed; |
| 466 | |
| 467 | /* |
| 468 | * Control frames. |
| 469 | */ |
| 470 | struct ieee80211_frame_min { |
| 471 | uint8_t i_fc[2]; |
| 472 | uint8_t i_dur[2]; |
| 473 | uint8_t i_addr1[IEEE80211_ADDR_LEN]; |
| 474 | uint8_t i_addr2[IEEE80211_ADDR_LEN]; |
| 475 | /* FCS */ |
| 476 | } __packed; |
| 477 | |
| 478 | struct ieee80211_frame_rts { |
| 479 | uint8_t i_fc[2]; |
| 480 | uint8_t i_dur[2]; |
| 481 | uint8_t i_ra[IEEE80211_ADDR_LEN]; |
| 482 | uint8_t i_ta[IEEE80211_ADDR_LEN]; |
| 483 | /* FCS */ |
| 484 | } __packed; |
| 485 | |
| 486 | struct ieee80211_frame_cts { |
| 487 | uint8_t i_fc[2]; |
| 488 | uint8_t i_dur[2]; |
| 489 | uint8_t i_ra[IEEE80211_ADDR_LEN]; |
| 490 | /* FCS */ |
| 491 | } __packed; |
| 492 | |
| 493 | struct ieee80211_frame_ack { |
| 494 | uint8_t i_fc[2]; |
| 495 | uint8_t i_dur[2]; |
| 496 | uint8_t i_ra[IEEE80211_ADDR_LEN]; |
| 497 | /* FCS */ |
| 498 | } __packed; |
| 499 | |
| 500 | struct ieee80211_frame_pspoll { |
| 501 | uint8_t i_fc[2]; |
| 502 | uint8_t i_aid[2]; |
| 503 | uint8_t i_bssid[IEEE80211_ADDR_LEN]; |
| 504 | uint8_t i_ta[IEEE80211_ADDR_LEN]; |
| 505 | /* FCS */ |
| 506 | } __packed; |
| 507 | |
| 508 | struct ieee80211_frame_cfend { /* NB: also CF-End+CF-Ack */ |
| 509 | uint8_t i_fc[2]; |
| 510 | uint8_t i_dur[2]; /* should be zero */ |
| 511 | uint8_t i_ra[IEEE80211_ADDR_LEN]; |
| 512 | uint8_t i_bssid[IEEE80211_ADDR_LEN]; |
| 513 | /* FCS */ |
| 514 | } __packed; |
| 515 | |
| 516 | struct ieee80211_frame_bar { |
| 517 | uint8_t i_fc[2]; |
| 518 | uint8_t i_dur[2]; |
| 519 | uint8_t i_ra[IEEE80211_ADDR_LEN]; |
| 520 | uint8_t i_ta[IEEE80211_ADDR_LEN]; |
| 521 | uint16_t i_ctl; |
| 522 | uint16_t i_seq; |
| 523 | /* FCS */ |
| 524 | } __packed; |
| 525 | |
| 526 | /* |
| 527 | * BEACON management packets |
| 528 | * |
| 529 | * octet timestamp[8] |
| 530 | * octet beacon interval[2] |
| 531 | * octet capability information[2] |
| 532 | * information element |
| 533 | * octet elemid |
| 534 | * octet length |
| 535 | * octet information[length] |
| 536 | */ |
| 537 | |
| 538 | #define IEEE80211_BEACON_INTERVAL(beacon) \ |
| 539 | ((beacon)[8] | ((beacon)[9] << 8)) |
| 540 | #define IEEE80211_BEACON_CAPABILITY(beacon) \ |
| 541 | ((beacon)[10] | ((beacon)[11] << 8)) |
| 542 | |
| 543 | #define IEEE80211_CAPINFO_ESS 0x0001 |
| 544 | #define IEEE80211_CAPINFO_IBSS 0x0002 |
| 545 | #define IEEE80211_CAPINFO_CF_POLLABLE 0x0004 |
| 546 | #define IEEE80211_CAPINFO_CF_POLLREQ 0x0008 |
| 547 | #define IEEE80211_CAPINFO_PRIVACY 0x0010 |
| 548 | #define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020 |
| 549 | #define IEEE80211_CAPINFO_PBCC 0x0040 |
| 550 | #define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080 |
| 551 | #define IEEE80211_CAPINFO_SPECTRUM_MGMT 0x0100 |
| 552 | /* bit 9 is reserved */ |
| 553 | #define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400 |
| 554 | #define IEEE80211_CAPINFO_RSN 0x0800 |
| 555 | /* bit 12 is reserved */ |
| 556 | #define IEEE80211_CAPINFO_DSSSOFDM 0x2000 |
| 557 | /* bits 14-15 are reserved */ |
| 558 | |
| 559 | #define IEEE80211_CAPINFO_BITS \ |
| 560 | "\20\1ESS\2IBSS\3CF_POLLABLE\4CF_POLLREQ\5PRIVACY\6SHORT_PREAMBLE" \ |
| 561 | "\7PBCC\10CHNL_AGILITY\11SPECTRUM_MGMT\13SHORT_SLOTTIME\14RSN" \ |
| 562 | "\16DSSOFDM" |
| 563 | |
| 564 | /* |
| 565 | * 802.11i/WPA information element (maximally sized). |
| 566 | */ |
| 567 | struct ieee80211_ie_wpa { |
| 568 | uint8_t wpa_id; /* IEEE80211_ELEMID_VENDOR */ |
| 569 | uint8_t wpa_len; /* length in bytes */ |
| 570 | uint8_t wpa_oui[3]; /* 0x00, 0x50, 0xf2 */ |
| 571 | uint8_t wpa_type; /* OUI type */ |
| 572 | uint16_t wpa_version; /* spec revision */ |
| 573 | uint32_t wpa_mcipher[1]; /* multicast/group key cipher */ |
| 574 | uint16_t wpa_uciphercnt; /* # pairwise key ciphers */ |
| 575 | uint32_t wpa_uciphers[8];/* ciphers */ |
| 576 | uint16_t wpa_authselcnt; /* authentication selector cnt*/ |
| 577 | uint32_t wpa_authsels[8];/* selectors */ |
| 578 | uint16_t wpa_caps; /* 802.11i capabilities */ |
| 579 | uint16_t wpa_pmkidcnt; /* 802.11i pmkid count */ |
| 580 | uint16_t wpa_pmkids[8]; /* 802.11i pmkids */ |
| 581 | } __packed; |
| 582 | |
| 583 | /* |
| 584 | * 802.11n HT Capability IE |
| 585 | * NB: these reflect D1.10 |
| 586 | */ |
| 587 | struct ieee80211_ie_htcap { |
| 588 | uint8_t hc_id; /* element ID */ |
| 589 | uint8_t hc_len; /* length in bytes */ |
| 590 | uint16_t hc_cap; /* HT caps (see below) */ |
| 591 | uint8_t hc_param; /* HT params (see below) */ |
| 592 | uint8_t hc_mcsset[16]; /* supported MCS set */ |
| 593 | uint16_t hc_extcap; /* extended HT capabilities */ |
| 594 | uint32_t hc_txbf; /* txbf capabilities */ |
| 595 | uint8_t hc_antenna; /* antenna capabilities */ |
| 596 | } __packed; |
| 597 | |
| 598 | /* HT capability flags (ht_cap) */ |
| 599 | #define IEEE80211_HTCAP_LDPC 0x0001 /* LDPC supported */ |
| 600 | #define IEEE80211_HTCAP_CHWIDTH40 0x0002 /* 20/40 supported */ |
| 601 | #define IEEE80211_HTCAP_SMPS 0x000c /* SM Power Save mode */ |
| 602 | #define IEEE80211_HTCAP_SMPS_OFF 0x000c /* disabled */ |
| 603 | #define IEEE80211_HTCAP_SMPS_DYNAMIC 0x0004 /* send RTS first */ |
| 604 | /* NB: SMPS value 2 is reserved */ |
| 605 | #define IEEE80211_HTCAP_SMPS_ENA 0x0000 /* enabled (static mode) */ |
| 606 | #define IEEE80211_HTCAP_GREENFIELD 0x0010 /* Greenfield supported */ |
| 607 | #define IEEE80211_HTCAP_SHORTGI20 0x0020 /* Short GI in 20MHz */ |
| 608 | #define IEEE80211_HTCAP_SHORTGI40 0x0040 /* Short GI in 40MHz */ |
| 609 | #define IEEE80211_HTCAP_TXSTBC 0x0080 /* STBC tx ok */ |
| 610 | #define IEEE80211_HTCAP_RXSTBC 0x0300 /* STBC rx support */ |
| 611 | #define IEEE80211_HTCAP_RXSTBC_S 8 |
| 612 | #define IEEE80211_HTCAP_RXSTBC_1STREAM 0x0100 /* 1 spatial stream */ |
| 613 | #define IEEE80211_HTCAP_RXSTBC_2STREAM 0x0200 /* 1-2 spatial streams*/ |
| 614 | #define IEEE80211_HTCAP_RXSTBC_3STREAM 0x0300 /* 1-3 spatial streams*/ |
| 615 | #define IEEE80211_HTCAP_DELBA 0x0400 /* HT DELBA supported */ |
| 616 | #define IEEE80211_HTCAP_MAXAMSDU 0x0800 /* max A-MSDU length */ |
| 617 | #define IEEE80211_HTCAP_MAXAMSDU_7935 0x0800 /* 7935 octets */ |
| 618 | #define IEEE80211_HTCAP_MAXAMSDU_3839 0x0000 /* 3839 octets */ |
| 619 | #define IEEE80211_HTCAP_DSSSCCK40 0x1000 /* DSSS/CCK in 40MHz */ |
| 620 | #define IEEE80211_HTCAP_PSMP 0x2000 /* PSMP supported */ |
| 621 | #define IEEE80211_HTCAP_40INTOLERANT 0x4000 /* 40MHz intolerant */ |
| 622 | #define IEEE80211_HTCAP_LSIGTXOPPROT 0x8000 /* L-SIG TXOP prot */ |
| 623 | |
| 624 | #define IEEE80211_HTCAP_BITS \ |
| 625 | "\20\1LDPC\2CHWIDTH40\5GREENFIELD\6SHORTGI20\7SHORTGI40\10TXSTBC" \ |
| 626 | "\13DELBA\14AMSDU(7935)\15DSSSCCK40\16PSMP\1740INTOLERANT" \ |
| 627 | "\20LSIGTXOPPROT" |
| 628 | |
| 629 | /* HT parameters (hc_param) */ |
| 630 | #define IEEE80211_HTCAP_MAXRXAMPDU 0x03 /* max rx A-MPDU factor */ |
| 631 | #define IEEE80211_HTCAP_MAXRXAMPDU_S 0 |
| 632 | #define IEEE80211_HTCAP_MAXRXAMPDU_8K 0 |
| 633 | #define IEEE80211_HTCAP_MAXRXAMPDU_16K 1 |
| 634 | #define IEEE80211_HTCAP_MAXRXAMPDU_32K 2 |
| 635 | #define IEEE80211_HTCAP_MAXRXAMPDU_64K 3 |
| 636 | #define IEEE80211_HTCAP_MPDUDENSITY 0x1c /* min MPDU start spacing */ |
| 637 | #define IEEE80211_HTCAP_MPDUDENSITY_S 2 |
| 638 | #define IEEE80211_HTCAP_MPDUDENSITY_NA 0 /* no time restriction */ |
| 639 | #define IEEE80211_HTCAP_MPDUDENSITY_025 1 /* 1/4 us */ |
| 640 | #define IEEE80211_HTCAP_MPDUDENSITY_05 2 /* 1/2 us */ |
| 641 | #define IEEE80211_HTCAP_MPDUDENSITY_1 3 /* 1 us */ |
| 642 | #define IEEE80211_HTCAP_MPDUDENSITY_2 4 /* 2 us */ |
| 643 | #define IEEE80211_HTCAP_MPDUDENSITY_4 5 /* 4 us */ |
| 644 | #define IEEE80211_HTCAP_MPDUDENSITY_8 6 /* 8 us */ |
| 645 | #define IEEE80211_HTCAP_MPDUDENSITY_16 7 /* 16 us */ |
| 646 | |
| 647 | /* HT extended capabilities (hc_extcap) */ |
| 648 | #define IEEE80211_HTCAP_PCO 0x0001 /* PCO capable */ |
| 649 | #define IEEE80211_HTCAP_PCOTRANS 0x0006 /* PCO transition time */ |
| 650 | #define IEEE80211_HTCAP_PCOTRANS_S 1 |
| 651 | #define IEEE80211_HTCAP_PCOTRANS_04 0x0002 /* 400 us */ |
| 652 | #define IEEE80211_HTCAP_PCOTRANS_15 0x0004 /* 1.5 ms */ |
| 653 | #define IEEE80211_HTCAP_PCOTRANS_5 0x0006 /* 5 ms */ |
| 654 | /* bits 3-7 reserved */ |
| 655 | #define IEEE80211_HTCAP_MCSFBACK 0x0300 /* MCS feedback */ |
| 656 | #define IEEE80211_HTCAP_MCSFBACK_S 8 |
| 657 | #define IEEE80211_HTCAP_MCSFBACK_NONE 0x0000 /* nothing provided */ |
| 658 | #define IEEE80211_HTCAP_MCSFBACK_UNSOL 0x0200 /* unsolicited feedback */ |
| 659 | #define IEEE80211_HTCAP_MCSFBACK_MRQ 0x0300 /* " "+respond to MRQ */ |
| 660 | #define IEEE80211_HTCAP_HTC 0x0400 /* +HTC support */ |
| 661 | #define IEEE80211_HTCAP_RDR 0x0800 /* reverse direction responder*/ |
| 662 | /* bits 12-15 reserved */ |
| 663 | |
| 664 | /* |
| 665 | * 802.11n HT Information IE |
| 666 | */ |
| 667 | struct ieee80211_ie_htinfo { |
| 668 | uint8_t hi_id; /* element ID */ |
| 669 | uint8_t hi_len; /* length in bytes */ |
| 670 | uint8_t hi_ctrlchannel; /* primary channel */ |
| 671 | uint8_t hi_byte1; /* ht ie byte 1 */ |
| 672 | uint8_t hi_byte2; /* ht ie byte 2 */ |
| 673 | uint8_t hi_byte3; /* ht ie byte 3 */ |
| 674 | uint16_t hi_byte45; /* ht ie bytes 4+5 */ |
| 675 | uint8_t hi_basicmcsset[16]; /* basic MCS set */ |
| 676 | } __packed; |
| 677 | |
| 678 | /* byte1 */ |
| 679 | #define IEEE80211_HTINFO_2NDCHAN 0x03 /* secondary/ext chan offset */ |
| 680 | #define IEEE80211_HTINFO_2NDCHAN_S 0 |
| 681 | #define IEEE80211_HTINFO_2NDCHAN_NONE 0x00 /* no secondary/ext channel */ |
| 682 | #define IEEE80211_HTINFO_2NDCHAN_ABOVE 0x01 /* above private channel */ |
| 683 | /* NB: 2 is reserved */ |
| 684 | #define IEEE80211_HTINFO_2NDCHAN_BELOW 0x03 /* below primary channel */ |
| 685 | #define IEEE80211_HTINFO_TXWIDTH 0x04 /* tx channel width */ |
| 686 | #define IEEE80211_HTINFO_TXWIDTH_20 0x00 /* 20MHz width */ |
| 687 | #define IEEE80211_HTINFO_TXWIDTH_2040 0x04 /* any supported width */ |
| 688 | #define IEEE80211_HTINFO_RIFSMODE 0x08 /* Reduced IFS (RIFS) use */ |
| 689 | #define IEEE80211_HTINFO_RIFSMODE_PROH 0x00 /* RIFS use prohibited */ |
| 690 | #define IEEE80211_HTINFO_RIFSMODE_PERM 0x08 /* RIFS use permitted */ |
| 691 | #define IEEE80211_HTINFO_PMSPONLY 0x10 /* PSMP required to associate */ |
| 692 | #define IEEE80211_HTINFO_SIGRAN 0xe0 /* shortest Service Interval */ |
| 693 | #define IEEE80211_HTINFO_SIGRAN_S 5 |
| 694 | #define IEEE80211_HTINFO_SIGRAN_5 0x00 /* 5 ms */ |
| 695 | /* XXX add rest */ |
| 696 | |
| 697 | /* bytes 2+3 */ |
| 698 | #define IEEE80211_HTINFO_OPMODE 0x03 /* operating mode */ |
| 699 | #define IEEE80211_HTINFO_OPMODE_S 0 |
| 700 | #define IEEE80211_HTINFO_OPMODE_PURE 0x00 /* no protection */ |
| 701 | #define IEEE80211_HTINFO_OPMODE_PROTOPT 0x01 /* protection optional */ |
| 702 | #define IEEE80211_HTINFO_OPMODE_HT20PR 0x02 /* protection for HT20 sta's */ |
| 703 | #define IEEE80211_HTINFO_OPMODE_MIXED 0x03 /* protection for legacy sta's*/ |
| 704 | #define IEEE80211_HTINFO_NONGF_PRESENT 0x04 /* non-GF sta's present */ |
| 705 | #define IEEE80211_HTINFO_TXBL 0x08 /* transmit burst limit */ |
| 706 | #define IEEE80211_HTINFO_NONHT_PRESENT 0x10 /* non-HT sta's present */ |
| 707 | /* bits 5-15 reserved */ |
| 708 | |
| 709 | /* bytes 4+5 */ |
| 710 | #define IEEE80211_HTINFO_2NDARYBEACON 0x01 |
| 711 | #define IEEE80211_HTINFO_LSIGTXOPPROT 0x02 |
| 712 | #define IEEE80211_HTINFO_PCO_ACTIVE 0x04 |
| 713 | #define IEEE80211_HTINFO_40MHZPHASE 0x08 |
| 714 | |
| 715 | /* byte5 */ |
| 716 | #define IEEE80211_HTINFO_BASIC_STBCMCS 0x7f |
| 717 | #define IEEE80211_HTINFO_BASIC_STBCMCS_S 0 |
| 718 | #define IEEE80211_HTINFO_DUALPROTECTED 0x80 |
| 719 | |
| 720 | |
| 721 | /* |
| 722 | * 802.11ac definitions - 802.11ac-2013 . |
| 723 | */ |
| 724 | |
| 725 | /* VHT opmode bits */ |
| 726 | #define IEEE80211_VHT_OPMODE_CHANWIDTH_MASK 3 |
| 727 | #define IEEE80211_VHT_OPMODE_CHANWIDTH_20MHZ 0 |
| 728 | #define IEEE80211_VHT_OPMODE_CHANWIDTH_40MHZ 1 |
| 729 | #define IEEE80211_VHT_OPMODE_CHANWIDTH_80MHZ 2 |
| 730 | #define IEEE80211_VHT_OPMODE_CHANWIDTH_160MHZ 3 |
| 731 | #define IEEE80211_VHT_OPMODE_RX_NSS_MASK 0x70 |
| 732 | #define IEEE80211_VHT_OPMODE_RX_NSS_SHIFT 4 |
| 733 | #define IEEE80211_VHT_OPMODE_RX_NSS_TYPE_BF 0x80 |
| 734 | |
| 735 | /* |
| 736 | * Maximum length of A-MPDU that the STA can RX in VHT. |
| 737 | * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets) |
| 738 | */ |
| 739 | #define IEEE80211_VHTCAP_MAX_AMPDU_8K 0 |
| 740 | #define IEEE80211_VHTCAP_MAX_AMPDU_16K 1 |
| 741 | #define IEEE80211_VHTCAP_MAX_AMPDU_32K 2 |
| 742 | #define IEEE80211_VHTCAP_MAX_AMPDU_64K 3 |
| 743 | #define IEEE80211_VHTCAP_MAX_AMPDU_128K 4 |
| 744 | #define IEEE80211_VHTCAP_MAX_AMPDU_256K 5 |
| 745 | #define IEEE80211_VHTCAP_MAX_AMPDU_512K 6 |
| 746 | #define IEEE80211_VHTCAP_MAX_AMPDU_1024K 7 |
| 747 | |
| 748 | /* |
| 749 | * VHT MCS information. |
| 750 | * + rx_highest/tx_highest: optional; maximum long GI VHT PPDU |
| 751 | * data rate. 1Mbit/sec units. |
| 752 | * + rx_mcs_map/tx_mcs_map: bitmap of per-stream supported MCS; |
| 753 | * 2 bits each. |
| 754 | */ |
| 755 | #define IEEE80211_VHT_MCS_SUPPORT_0_7 0 /* MCS0-7 */ |
| 756 | #define IEEE80211_VHT_MCS_SUPPORT_0_8 1 /* MCS0-8 */ |
| 757 | #define IEEE80211_VHT_MCS_SUPPORT_0_9 2 /* MCS0-9 */ |
| 758 | #define IEEE80211_VHT_MCS_NOT_SUPPORTED 3 /* not supported */ |
| 759 | |
| 760 | struct ieee80211_vht_mcs_info { |
| 761 | uint16_t rx_mcs_map; |
| 762 | uint16_t rx_highest; |
| 763 | uint16_t tx_mcs_map; |
| 764 | uint16_t tx_highest; |
| 765 | } __packed; |
| 766 | |
| 767 | /* VHT capabilities element: 802.11ac-2013 8.4.2.160 */ |
| 768 | struct ieee80211_ie_vhtcap { |
| 769 | uint8_t ie; |
| 770 | uint8_t len; |
| 771 | uint32_t vht_cap_info; |
| 772 | struct ieee80211_vht_mcs_info supp_mcs; |
| 773 | } __packed; |
| 774 | |
| 775 | #define IEEE80211_VHT_CHANWIDTH_USE_HT 0 /* Use HT IE for chw */ |
| 776 | #define IEEE80211_VHT_CHANWIDTH_80MHZ 1 /* 80MHz */ |
| 777 | #define IEEE80211_VHT_CHANWIDTH_160MHZ 2 /* 160MHz */ |
| 778 | #define IEEE80211_VHT_CHANWIDTH_80P80MHZ 3 /* 80+80MHz */ |
| 779 | |
| 780 | /* VHT operation IE - 802.11ac-2013 8.4.2.161 */ |
| 781 | struct ieee80211_ie_vht_operation { |
| 782 | uint8_t ie; |
| 783 | uint8_t len; |
| 784 | uint8_t chan_width; |
| 785 | uint8_t center_freq_seg1_idx; |
| 786 | uint8_t center_freq_seg2_idx; |
| 787 | uint16_t basic_mcs_set; |
| 788 | } __packed; |
| 789 | |
| 790 | /* 802.11ac VHT Capabilities */ |
| 791 | #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_3895 0x00000000 |
| 792 | #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_7991 0x00000001 |
| 793 | #define IEEE80211_VHTCAP_MAX_MPDU_LENGTH_11454 0x00000002 |
| 794 | #define IEEE80211_VHTCAP_MAX_MPDU_MASK 0x00000003 |
| 795 | #define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004 |
| 796 | #define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008 |
| 797 | #define IEEE80211_VHTCAP_SUPP_CHAN_WIDTH_MASK 0x0000000C |
| 798 | #define IEEE80211_VHTCAP_RXLDPC 0x00000010 |
| 799 | #define IEEE80211_VHTCAP_SHORT_GI_80 0x00000020 |
| 800 | #define IEEE80211_VHTCAP_SHORT_GI_160 0x00000040 |
| 801 | #define IEEE80211_VHTCAP_TXSTBC 0x00000080 |
| 802 | #define IEEE80211_VHTCAP_RXSTBC_1 0x00000100 |
| 803 | #define IEEE80211_VHTCAP_RXSTBC_2 0x00000200 |
| 804 | #define IEEE80211_VHTCAP_RXSTBC_3 0x00000300 |
| 805 | #define IEEE80211_VHTCAP_RXSTBC_4 0x00000400 |
| 806 | #define IEEE80211_VHTCAP_RXSTBC_MASK 0x00000700 |
| 807 | #define IEEE80211_VHTCAP_SU_BEAMFORMER_CAPABLE 0x00000800 |
| 808 | #define IEEE80211_VHTCAP_SU_BEAMFORMEE_CAPABLE 0x00001000 |
| 809 | #define IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT 13 |
| 810 | #define IEEE80211_VHTCAP_BEAMFORMEE_STS_MASK \ |
| 811 | (7 << IEEE80211_VHTCAP_BEAMFORMEE_STS_SHIFT) |
| 812 | #define IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_SHIFT 16 |
| 813 | #define IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_MASK \ |
| 814 | (7 << IEEE80211_VHTCAP_SOUNDING_DIMENSIONS_SHIFT) |
| 815 | #define IEEE80211_VHTCAP_MU_BEAMFORMER_CAPABLE 0x00080000 |
| 816 | #define IEEE80211_VHTCAP_MU_BEAMFORMEE_CAPABLE 0x00100000 |
| 817 | #define IEEE80211_VHTCAP_VHT_TXOP_PS 0x00200000 |
| 818 | #define IEEE80211_VHTCAP_HTC_VHT 0x00400000 |
| 819 | #define IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT 23 |
| 820 | #define IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \ |
| 821 | (7 << IEEE80211_VHTCAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT) |
| 822 | #define IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB 0x08000000 |
| 823 | #define IEEE80211_VHTCAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB 0x0c000000 |
| 824 | #define IEEE80211_VHTCAP_RX_ANTENNA_PATTERN 0x10000000 |
| 825 | #define IEEE80211_VHTCAP_TX_ANTENNA_PATTERN 0x20000000 |
| 826 | |
| 827 | /* |
| 828 | * VHT Transmit Power Envelope element - 802.11ac-2013 8.4.2.164 |
| 829 | * |
| 830 | * This defines the maximum transmit power for various bandwidths. |
| 831 | */ |
| 832 | /* |
| 833 | * Count is how many elements follow and what they're for: |
| 834 | * |
| 835 | * 0 - 20 MHz |
| 836 | * 1 - 20+40 MHz |
| 837 | * 2 - 20+40+80 MHz |
| 838 | * 3 - 20+40+80+(160, 80+80) MHz |
| 839 | */ |
| 840 | #define IEEE80211_VHT_TXPWRENV_INFO_COUNT_SHIFT 0 |
| 841 | #define IEEE80211_VHT_TXPWRENV_INFO_COUNT_MASK 0x07 |
| 842 | |
| 843 | /* |
| 844 | * Unit is the tx power representation. It should be EIRP for now; |
| 845 | * other values are reserved. |
| 846 | */ |
| 847 | #define IEEE80211_VHT_TXPWRENV_UNIT_MASK 0x38 |
| 848 | #define IEEE80211_VHT_TXPWRENV_UNIT_SHIFT 3 |
| 849 | |
| 850 | /* This value is within the unit mask/shift above */ |
| 851 | #define IEEE80211_VHT_TXPWRENV_UNIT_EIRP 0 |
| 852 | |
| 853 | struct ieee80211_ie_vht_txpwrenv { |
| 854 | uint8_t ie; |
| 855 | uint8_t len; |
| 856 | uint8_t tx_info; |
| 857 | int8_t tx_elem[0]; /* TX power elements, 1/2 dB, signed */ |
| 858 | }; |
| 859 | |
| 860 | /* VHT action codes */ |
| 861 | #define WLAN_ACTION_VHT_COMPRESSED_BF 0 |
| 862 | #define WLAN_ACTION_VHT_GROUPID_MGMT 1 |
| 863 | #define WLAN_ACTION_VHT_OPMODE_NOTIF 2 |
| 864 | |
| 865 | /* |
| 866 | * Management information element payloads. |
| 867 | */ |
| 868 | |
| 869 | enum { |
| 870 | IEEE80211_ELEMID_SSID = 0, |
| 871 | IEEE80211_ELEMID_RATES = 1, |
| 872 | IEEE80211_ELEMID_FHPARMS = 2, |
| 873 | IEEE80211_ELEMID_DSPARMS = 3, |
| 874 | IEEE80211_ELEMID_CFPARMS = 4, |
| 875 | IEEE80211_ELEMID_TIM = 5, |
| 876 | IEEE80211_ELEMID_IBSSPARMS = 6, |
| 877 | IEEE80211_ELEMID_COUNTRY = 7, |
| 878 | IEEE80211_ELEMID_BSSLOAD = 11, |
| 879 | IEEE80211_ELEMID_TSPEC = 13, |
| 880 | IEEE80211_ELEMID_TCLAS = 14, |
| 881 | IEEE80211_ELEMID_CHALLENGE = 16, |
| 882 | /* 17-31 reserved for challenge text extension */ |
| 883 | IEEE80211_ELEMID_PWRCNSTR = 32, |
| 884 | IEEE80211_ELEMID_PWRCAP = 33, |
| 885 | IEEE80211_ELEMID_TPCREQ = 34, |
| 886 | IEEE80211_ELEMID_TPCREP = 35, |
| 887 | IEEE80211_ELEMID_SUPPCHAN = 36, |
| 888 | IEEE80211_ELEMID_CSA = 37, |
| 889 | IEEE80211_ELEMID_MEASREQ = 38, |
| 890 | IEEE80211_ELEMID_MEASREP = 39, |
| 891 | IEEE80211_ELEMID_QUIET = 40, |
| 892 | IEEE80211_ELEMID_IBSSDFS = 41, |
| 893 | IEEE80211_ELEMID_ERP = 42, |
| 894 | IEEE80211_ELEMID_HTCAP = 45, |
| 895 | IEEE80211_ELEMID_QOS = 46, |
| 896 | IEEE80211_ELEMID_RESERVED_47 = 47, |
| 897 | IEEE80211_ELEMID_RSN = 48, |
| 898 | IEEE80211_ELEMID_XRATES = 50, |
| 899 | IEEE80211_ELEMID_APCHANREP = 51, |
| 900 | IEEE80211_ELEMID_MOBILITY_DOMAIN = 54, |
| 901 | IEEE80211_ELEMID_HTINFO = 61, |
| 902 | IEEE80211_ELEMID_SECCHAN_OFFSET = 62, |
| 903 | IEEE80211_ELEMID_RRM_ENACAPS = 70, |
| 904 | IEEE80211_ELEMID_MULTIBSSID = 71, |
| 905 | IEEE80211_ELEMID_COEX_2040 = 72, |
| 906 | IEEE80211_ELEMID_INTOL_CHN_REPORT = 73, |
| 907 | IEEE80211_ELEMID_OVERLAP_BSS_SCAN_PARAM = 74, |
| 908 | IEEE80211_ELEMID_TSF_REQ = 91, |
| 909 | IEEE80211_ELEMID_TSF_RESP = 92, |
| 910 | IEEE80211_ELEMID_WNM_SLEEP_MODE = 93, |
| 911 | IEEE80211_ELEMID_TIM_BCAST_REQ = 94, |
| 912 | IEEE80211_ELEMID_TIM_BCAST_RESP = 95, |
| 913 | IEEE80211_ELEMID_TPC = 150, |
| 914 | IEEE80211_ELEMID_CCKM = 156, |
| 915 | IEEE80211_ELEMID_VENDOR = 221, /* vendor private */ |
| 916 | |
| 917 | /* |
| 918 | * 802.11s IEs |
| 919 | * NB: On vanilla Linux still IEEE80211_ELEMID_MESHPEER = 55, |
| 920 | * but they defined a new with id 117 called PEER_MGMT. |
| 921 | * NB: complies with open80211 |
| 922 | */ |
| 923 | IEEE80211_ELEMID_MESHCONF = 113, |
| 924 | IEEE80211_ELEMID_MESHID = 114, |
| 925 | IEEE80211_ELEMID_MESHLINK = 115, |
| 926 | IEEE80211_ELEMID_MESHCNGST = 116, |
| 927 | IEEE80211_ELEMID_MESHPEER = 117, |
| 928 | IEEE80211_ELEMID_MESHCSA = 118, |
| 929 | IEEE80211_ELEMID_MESHTIM = 39, /* XXX: remove */ |
| 930 | IEEE80211_ELEMID_MESHAWAKEW = 119, |
| 931 | IEEE80211_ELEMID_MESHBEACONT = 120, |
| 932 | /* 121-124 MMCAOP not implemented yet */ |
| 933 | IEEE80211_ELEMID_MESHGANN = 125, |
| 934 | IEEE80211_ELEMID_MESHRANN = 126, |
| 935 | /* 127 Extended Capabilities */ |
| 936 | IEEE80211_ELEMID_EXTCAP = 127, |
| 937 | /* 128-129 reserved */ |
| 938 | IEEE80211_ELEMID_MESHPREQ = 130, |
| 939 | IEEE80211_ELEMID_MESHPREP = 131, |
| 940 | IEEE80211_ELEMID_MESHPERR = 132, |
| 941 | /* 133-136 reserved */ |
| 942 | IEEE80211_ELEMID_MESHPXU = 137, |
| 943 | IEEE80211_ELEMID_MESHPXUC = 138, |
| 944 | IEEE80211_ELEMID_MESHAH = 60, /* XXX: remove */ |
| 945 | |
| 946 | /* 802.11ac */ |
| 947 | IEEE80211_ELEMID_VHT_CAP = 191, |
| 948 | IEEE80211_ELEMID_VHT_OPMODE = 192, |
| 949 | IEEE80211_ELEMID_VHT_PWR_ENV = 195, |
| 950 | }; |
| 951 | |
| 952 | struct ieee80211_tim_ie { |
| 953 | uint8_t tim_ie; /* IEEE80211_ELEMID_TIM */ |
| 954 | uint8_t tim_len; |
| 955 | uint8_t tim_count; /* DTIM count */ |
| 956 | uint8_t tim_period; /* DTIM period */ |
| 957 | uint8_t tim_bitctl; /* bitmap control */ |
| 958 | uint8_t tim_bitmap[1]; /* variable-length bitmap */ |
| 959 | } __packed; |
| 960 | |
| 961 | struct ieee80211_country_ie { |
| 962 | uint8_t ie; /* IEEE80211_ELEMID_COUNTRY */ |
| 963 | uint8_t len; |
| 964 | uint8_t cc[3]; /* ISO CC+(I)ndoor/(O)utdoor */ |
| 965 | struct { |
| 966 | uint8_t schan; /* starting channel */ |
| 967 | uint8_t nchan; /* number channels */ |
| 968 | uint8_t maxtxpwr; /* tx power cap */ |
| 969 | } __packed band[1]; /* sub bands (NB: var size) */ |
| 970 | } __packed; |
| 971 | |
| 972 | #define IEEE80211_COUNTRY_MAX_BANDS 84 /* max possible bands */ |
| 973 | #define IEEE80211_COUNTRY_MAX_SIZE \ |
| 974 | (sizeof(struct ieee80211_country_ie) + 3*(IEEE80211_COUNTRY_MAX_BANDS-1)) |
| 975 | |
| 976 | struct ieee80211_bss_load_ie { |
| 977 | uint8_t ie; |
| 978 | uint8_t len; |
| 979 | uint16_t sta_count; /* station count */ |
| 980 | uint8_t chan_load; /* channel utilization */ |
| 981 | uint8_t aac; /* available admission capacity */ |
| 982 | } __packed; |
| 983 | |
| 984 | struct ieee80211_ap_chan_report_ie { |
| 985 | uint8_t ie; |
| 986 | uint8_t len; |
| 987 | uint8_t i_class; /* operating class */ |
| 988 | /* Annex E, E.1 Country information and operating classes */ |
| 989 | uint8_t chan_list[0]; |
| 990 | } __packed; |
| 991 | |
| 992 | #define IEEE80211_EXTCAP_CMS (1ULL << 0) /* 20/40 BSS coexistence management support */ |
| 993 | #define IEEE80211_EXTCAP_RSVD_1 (1ULL << 1) |
| 994 | #define IEEE80211_EXTCAP_ECS (1ULL << 2) /* extended channel switching */ |
| 995 | #define IEEE80211_EXTCAP_RSVD_3 (1ULL << 3) |
| 996 | #define IEEE80211_EXTCAP_PSMP_CAP (1ULL << 4) /* PSMP capability */ |
| 997 | #define IEEE80211_EXTCAP_RSVD_5 (1ULL << 5) |
| 998 | #define IEEE80211_EXTCAP_S_PSMP_SUPP (1ULL << 6) |
| 999 | #define IEEE80211_EXTCAP_EVENT (1ULL << 7) |
| 1000 | #define IEEE80211_EXTCAP_DIAGNOSTICS (1ULL << 8) |
| 1001 | #define IEEE80211_EXTCAP_MCAST_DIAG (1ULL << 9) |
| 1002 | #define IEEE80211_EXTCAP_LOC_TRACKING (1ULL << 10) |
| 1003 | #define IEEE80211_EXTCAP_FMS (1ULL << 11) |
| 1004 | #define IEEE80211_EXTCAP_PROXY_ARP (1ULL << 12) |
| 1005 | #define IEEE80211_EXTCAP_CIR (1ULL << 13) /* collocated interference reporting */ |
| 1006 | #define IEEE80211_EXTCAP_CIVIC_LOC (1ULL << 14) |
| 1007 | #define IEEE80211_EXTCAP_GEOSPATIAL_LOC (1ULL << 15) |
| 1008 | #define IEEE80211_EXTCAP_TFS (1ULL << 16) |
| 1009 | #define IEEE80211_EXTCAP_WNM_SLEEPMODE (1ULL << 17) |
| 1010 | #define IEEE80211_EXTCAP_TIM_BROADCAST (1ULL << 18) |
| 1011 | #define IEEE80211_EXTCAP_BSS_TRANSITION (1ULL << 19) |
| 1012 | #define IEEE80211_EXTCAP_QOS_TRAF_CAP (1ULL << 20) |
| 1013 | #define IEEE80211_EXTCAP_AC_STA_COUNT (1ULL << 21) |
| 1014 | #define IEEE80211_EXTCAP_M_BSSID (1ULL << 22) /* multiple BSSID field */ |
| 1015 | #define IEEE80211_EXTCAP_TIMING_MEAS (1ULL << 23) |
| 1016 | #define IEEE80211_EXTCAP_CHAN_USAGE (1ULL << 24) |
| 1017 | #define IEEE80211_EXTCAP_SSID_LIST (1ULL << 25) |
| 1018 | #define IEEE80211_EXTCAP_DMS (1ULL << 26) |
| 1019 | #define IEEE80211_EXTCAP_UTC_TSF_OFFSET (1ULL << 27) |
| 1020 | #define IEEE80211_EXTCAP_TLDS_BUF_STA_SUPP (1ULL << 28) /* TDLS peer U-APSP buffer STA support */ |
| 1021 | #define IEEE80211_EXTCAP_TLDS_PPSM_SUPP (1ULL << 29) /* TDLS peer PSM support */ |
| 1022 | #define IEEE80211_EXTCAP_TLDS_CH_SW (1ULL << 30) /* TDLS channel switching */ |
| 1023 | #define IEEE80211_EXTCAP_INTERWORKING (1ULL << 31) |
| 1024 | #define IEEE80211_EXTCAP_QOSMAP (1ULL << 32) |
| 1025 | #define IEEE80211_EXTCAP_EBR (1ULL << 33) |
| 1026 | #define IEEE80211_EXTCAP_SSPN_IF (1ULL << 34) |
| 1027 | #define IEEE80211_EXTCAP_RSVD_35 (1ULL << 35) |
| 1028 | #define IEEE80211_EXTCAP_MSGCF_CAP (1ULL << 36) |
| 1029 | #define IEEE80211_EXTCAP_TLDS_SUPP (1ULL << 37) |
| 1030 | #define IEEE80211_EXTCAP_TLDS_PROHIB (1ULL << 38) |
| 1031 | #define IEEE80211_EXTCAP_TLDS_CH_SW_PROHIB (1ULL << 39) /* TDLS channel switching prohibited */ |
| 1032 | #define IEEE80211_EXTCAP_RUF (1ULL << 40) /* reject unadmitted frame */ |
| 1033 | /* service interval granularity */ |
| 1034 | #define IEEE80211_EXTCAP_SIG \ |
| 1035 | ((1ULL << 41) | (1ULL << 42) | (1ULL << 43)) |
| 1036 | #define IEEE80211_EXTCAP_ID_LOC (1ULL << 44) |
| 1037 | #define IEEE80211_EXTCAP_U_APSD_COEX (1ULL << 45) |
| 1038 | #define IEEE80211_EXTCAP_WNM_NOTIFICATION (1ULL << 46) |
| 1039 | #define IEEE80211_EXTCAP_RSVD_47 (1ULL << 47) |
| 1040 | #define IEEE80211_EXTCAP_SSID (1ULL << 48) /* UTF-8 SSID */ |
| 1041 | /* bits 49-n are reserved */ |
| 1042 | |
| 1043 | struct ieee80211_extcap_ie { |
| 1044 | uint8_t ie; |
| 1045 | uint8_t len; |
| 1046 | } __packed; |
| 1047 | |
| 1048 | /* |
| 1049 | * 802.11h Quiet Time Element. |
| 1050 | */ |
| 1051 | struct ieee80211_quiet_ie { |
| 1052 | uint8_t quiet_ie; /* IEEE80211_ELEMID_QUIET */ |
| 1053 | uint8_t len; |
| 1054 | uint8_t tbttcount; /* quiet start */ |
| 1055 | uint8_t period; /* beacon intervals between quiets */ |
| 1056 | uint16_t duration; /* TUs of each quiet*/ |
| 1057 | uint16_t offset; /* TUs of from TBTT of quiet start */ |
| 1058 | } __packed; |
| 1059 | |
| 1060 | /* |
| 1061 | * 802.11h Channel Switch Announcement (CSA). |
| 1062 | */ |
| 1063 | struct ieee80211_csa_ie { |
| 1064 | uint8_t csa_ie; /* IEEE80211_ELEMID_CHANSWITCHANN */ |
| 1065 | uint8_t csa_len; |
| 1066 | uint8_t csa_mode; /* Channel Switch Mode */ |
| 1067 | uint8_t csa_newchan; /* New Channel Number */ |
| 1068 | uint8_t csa_count; /* Channel Switch Count */ |
| 1069 | } __packed; |
| 1070 | |
| 1071 | /* |
| 1072 | * Note the min acceptable CSA count is used to guard against |
| 1073 | * malicious CSA injection in station mode. Defining this value |
| 1074 | * as other than 0 violates the 11h spec. |
| 1075 | */ |
| 1076 | #define IEEE80211_CSA_COUNT_MIN 2 |
| 1077 | #define IEEE80211_CSA_COUNT_MAX 255 |
| 1078 | |
| 1079 | /* rate set entries are in .5 Mb/s units, and potentially marked as basic */ |
| 1080 | #define IEEE80211_RATE_BASIC 0x80 |
| 1081 | #define IEEE80211_RATE_VAL 0x7f |
| 1082 | #define IEEE80211_RV(v) ((v) & IEEE80211_RATE_VAL) |
| 1083 | |
| 1084 | /* ERP information element flags */ |
| 1085 | #define IEEE80211_ERP_NON_ERP_PRESENT 0x01 |
| 1086 | #define IEEE80211_ERP_USE_PROTECTION 0x02 |
| 1087 | #define IEEE80211_ERP_LONG_PREAMBLE 0x04 |
| 1088 | |
| 1089 | #define IEEE80211_ERP_BITS \ |
| 1090 | "\20\1NON_ERP_PRESENT\2USE_PROTECTION\3LONG_PREAMBLE" |
| 1091 | |
| 1092 | #define ATH_OUI 0x7f0300 /* Atheros OUI */ |
| 1093 | #define ATH_OUI_TYPE 0x01 /* Atheros protocol ie */ |
| 1094 | |
| 1095 | /* NB: Atheros allocated the OUI for this purpose ~2005 but beware ... */ |
| 1096 | #define TDMA_OUI ATH_OUI |
| 1097 | #define TDMA_OUI_TYPE 0x02 /* TDMA protocol ie */ |
| 1098 | |
| 1099 | #define BCM_OUI 0x4c9000 /* Broadcom OUI */ |
| 1100 | #define BCM_OUI_HTCAP 51 /* pre-draft HTCAP ie */ |
| 1101 | #define BCM_OUI_HTINFO 52 /* pre-draft HTINFO ie */ |
| 1102 | |
| 1103 | #define WPA_OUI 0xf25000 |
| 1104 | #define WPA_OUI_TYPE 0x01 |
| 1105 | #define WPA_VERSION 1 /* current supported version */ |
| 1106 | |
| 1107 | #define WPA_CSE_NULL 0x00 |
| 1108 | #define WPA_CSE_WEP40 0x01 |
| 1109 | #define WPA_CSE_TKIP 0x02 |
| 1110 | #define WPA_CSE_CCMP 0x04 |
| 1111 | #define WPA_CSE_WEP104 0x05 |
| 1112 | |
| 1113 | #define WPA_ASE_NONE 0x00 |
| 1114 | #define WPA_ASE_8021X_UNSPEC 0x01 |
| 1115 | #define WPA_ASE_8021X_PSK 0x02 |
| 1116 | |
| 1117 | #define WPS_OUI_TYPE 0x04 |
| 1118 | |
| 1119 | #define RSN_OUI 0xac0f00 |
| 1120 | #define RSN_VERSION 1 /* current supported version */ |
| 1121 | |
| 1122 | #define RSN_CSE_NULL 0x00 |
| 1123 | #define RSN_CSE_WEP40 0x01 |
| 1124 | #define RSN_CSE_TKIP 0x02 |
| 1125 | #define RSN_CSE_WRAP 0x03 |
| 1126 | #define RSN_CSE_CCMP 0x04 |
| 1127 | #define RSN_CSE_WEP104 0x05 |
| 1128 | |
| 1129 | #define RSN_ASE_NONE 0x00 |
| 1130 | #define RSN_ASE_8021X_UNSPEC 0x01 |
| 1131 | #define RSN_ASE_8021X_PSK 0x02 |
| 1132 | |
| 1133 | #define RSN_CAP_PREAUTH 0x01 |
| 1134 | |
| 1135 | #define WME_OUI 0xf25000 |
| 1136 | #define WME_OUI_TYPE 0x02 |
| 1137 | #define WME_INFO_OUI_SUBTYPE 0x00 |
| 1138 | #define WME_PARAM_OUI_SUBTYPE 0x01 |
| 1139 | #define WME_VERSION 1 |
| 1140 | |
| 1141 | /* WME stream classes */ |
| 1142 | #define WME_AC_BE 0 /* best effort */ |
| 1143 | #define WME_AC_BK 1 /* background */ |
| 1144 | #define WME_AC_VI 2 /* video */ |
| 1145 | #define WME_AC_VO 3 /* voice */ |
| 1146 | |
| 1147 | /* |
| 1148 | * AUTH management packets |
| 1149 | * |
| 1150 | * octet algo[2] |
| 1151 | * octet seq[2] |
| 1152 | * octet status[2] |
| 1153 | * octet chal.id |
| 1154 | * octet chal.length |
| 1155 | * octet chal.text[253] NB: 1-253 bytes |
| 1156 | */ |
| 1157 | |
| 1158 | /* challenge length for shared key auth */ |
| 1159 | #define IEEE80211_CHALLENGE_LEN 128 |
| 1160 | |
| 1161 | #define IEEE80211_AUTH_ALG_OPEN 0x0000 |
| 1162 | #define IEEE80211_AUTH_ALG_SHARED 0x0001 |
| 1163 | #define IEEE80211_AUTH_ALG_LEAP 0x0080 |
| 1164 | |
| 1165 | enum { |
| 1166 | IEEE80211_AUTH_OPEN_REQUEST = 1, |
| 1167 | IEEE80211_AUTH_OPEN_RESPONSE = 2, |
| 1168 | }; |
| 1169 | |
| 1170 | enum { |
| 1171 | IEEE80211_AUTH_SHARED_REQUEST = 1, |
| 1172 | IEEE80211_AUTH_SHARED_CHALLENGE = 2, |
| 1173 | IEEE80211_AUTH_SHARED_RESPONSE = 3, |
| 1174 | IEEE80211_AUTH_SHARED_PASS = 4, |
| 1175 | }; |
| 1176 | |
| 1177 | /* |
| 1178 | * Reason and status codes. |
| 1179 | * |
| 1180 | * Reason codes are used in management frames to indicate why an |
| 1181 | * action took place (e.g. on disassociation). Status codes are |
| 1182 | * used in management frames to indicate the result of an operation. |
| 1183 | * |
| 1184 | * Unlisted codes are reserved |
| 1185 | */ |
| 1186 | |
| 1187 | enum { |
| 1188 | IEEE80211_REASON_UNSPECIFIED = 1, |
| 1189 | IEEE80211_REASON_AUTH_EXPIRE = 2, |
| 1190 | IEEE80211_REASON_AUTH_LEAVE = 3, |
| 1191 | IEEE80211_REASON_ASSOC_EXPIRE = 4, |
| 1192 | IEEE80211_REASON_ASSOC_TOOMANY = 5, |
| 1193 | IEEE80211_REASON_NOT_AUTHED = 6, |
| 1194 | IEEE80211_REASON_NOT_ASSOCED = 7, |
| 1195 | IEEE80211_REASON_ASSOC_LEAVE = 8, |
| 1196 | IEEE80211_REASON_ASSOC_NOT_AUTHED = 9, |
| 1197 | IEEE80211_REASON_DISASSOC_PWRCAP_BAD = 10, /* 11h */ |
| 1198 | IEEE80211_REASON_DISASSOC_SUPCHAN_BAD = 11, /* 11h */ |
| 1199 | IEEE80211_REASON_IE_INVALID = 13, /* 11i */ |
| 1200 | IEEE80211_REASON_MIC_FAILURE = 14, /* 11i */ |
| 1201 | IEEE80211_REASON_4WAY_HANDSHAKE_TIMEOUT = 15, /* 11i */ |
| 1202 | IEEE80211_REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, /* 11i */ |
| 1203 | IEEE80211_REASON_IE_IN_4WAY_DIFFERS = 17, /* 11i */ |
| 1204 | IEEE80211_REASON_GROUP_CIPHER_INVALID = 18, /* 11i */ |
| 1205 | IEEE80211_REASON_PAIRWISE_CIPHER_INVALID= 19, /* 11i */ |
| 1206 | IEEE80211_REASON_AKMP_INVALID = 20, /* 11i */ |
| 1207 | IEEE80211_REASON_UNSUPP_RSN_IE_VERSION = 21, /* 11i */ |
| 1208 | IEEE80211_REASON_INVALID_RSN_IE_CAP = 22, /* 11i */ |
| 1209 | IEEE80211_REASON_802_1X_AUTH_FAILED = 23, /* 11i */ |
| 1210 | IEEE80211_REASON_CIPHER_SUITE_REJECTED = 24, /* 11i */ |
| 1211 | IEEE80211_REASON_UNSPECIFIED_QOS = 32, /* 11e */ |
| 1212 | IEEE80211_REASON_INSUFFICIENT_BW = 33, /* 11e */ |
| 1213 | IEEE80211_REASON_TOOMANY_FRAMES = 34, /* 11e */ |
| 1214 | IEEE80211_REASON_OUTSIDE_TXOP = 35, /* 11e */ |
| 1215 | IEEE80211_REASON_LEAVING_QBSS = 36, /* 11e */ |
| 1216 | IEEE80211_REASON_BAD_MECHANISM = 37, /* 11e */ |
| 1217 | IEEE80211_REASON_SETUP_NEEDED = 38, /* 11e */ |
| 1218 | IEEE80211_REASON_TIMEOUT = 39, /* 11e */ |
| 1219 | |
| 1220 | IEEE80211_REASON_PEER_LINK_CANCELED = 52, /* 11s */ |
| 1221 | IEEE80211_REASON_MESH_MAX_PEERS = 53, /* 11s */ |
| 1222 | IEEE80211_REASON_MESH_CPVIOLATION = 54, /* 11s */ |
| 1223 | IEEE80211_REASON_MESH_CLOSE_RCVD = 55, /* 11s */ |
| 1224 | IEEE80211_REASON_MESH_MAX_RETRIES = 56, /* 11s */ |
| 1225 | IEEE80211_REASON_MESH_CONFIRM_TIMEOUT = 57, /* 11s */ |
| 1226 | IEEE80211_REASON_MESH_INVALID_GTK = 58, /* 11s */ |
| 1227 | IEEE80211_REASON_MESH_INCONS_PARAMS = 59, /* 11s */ |
| 1228 | IEEE80211_REASON_MESH_INVALID_SECURITY = 60, /* 11s */ |
| 1229 | IEEE80211_REASON_MESH_PERR_NO_PROXY = 61, /* 11s */ |
| 1230 | IEEE80211_REASON_MESH_PERR_NO_FI = 62, /* 11s */ |
| 1231 | IEEE80211_REASON_MESH_PERR_DEST_UNREACH = 63, /* 11s */ |
| 1232 | IEEE80211_REASON_MESH_MAC_ALRDY_EXISTS_MBSS = 64, /* 11s */ |
| 1233 | IEEE80211_REASON_MESH_CHAN_SWITCH_REG = 65, /* 11s */ |
| 1234 | IEEE80211_REASON_MESH_CHAN_SWITCH_UNSPEC = 66, /* 11s */ |
| 1235 | |
| 1236 | IEEE80211_STATUS_SUCCESS = 0, |
| 1237 | IEEE80211_STATUS_UNSPECIFIED = 1, |
| 1238 | IEEE80211_STATUS_CAPINFO = 10, |
| 1239 | IEEE80211_STATUS_NOT_ASSOCED = 11, |
| 1240 | IEEE80211_STATUS_OTHER = 12, |
| 1241 | IEEE80211_STATUS_ALG = 13, |
| 1242 | IEEE80211_STATUS_SEQUENCE = 14, |
| 1243 | IEEE80211_STATUS_CHALLENGE = 15, |
| 1244 | IEEE80211_STATUS_TIMEOUT = 16, |
| 1245 | IEEE80211_STATUS_TOOMANY = 17, |
| 1246 | IEEE80211_STATUS_BASIC_RATE = 18, |
| 1247 | IEEE80211_STATUS_SP_REQUIRED = 19, /* 11b */ |
| 1248 | IEEE80211_STATUS_PBCC_REQUIRED = 20, /* 11b */ |
| 1249 | IEEE80211_STATUS_CA_REQUIRED = 21, /* 11b */ |
| 1250 | IEEE80211_STATUS_SPECMGMT_REQUIRED = 22, /* 11h */ |
| 1251 | IEEE80211_STATUS_PWRCAP_REQUIRED = 23, /* 11h */ |
| 1252 | IEEE80211_STATUS_SUPCHAN_REQUIRED = 24, /* 11h */ |
| 1253 | IEEE80211_STATUS_SHORTSLOT_REQUIRED = 25, /* 11g */ |
| 1254 | IEEE80211_STATUS_DSSSOFDM_REQUIRED = 26, /* 11g */ |
| 1255 | IEEE80211_STATUS_MISSING_HT_CAPS = 27, /* 11n D3.0 */ |
| 1256 | IEEE80211_STATUS_INVALID_IE = 40, /* 11i */ |
| 1257 | IEEE80211_STATUS_GROUP_CIPHER_INVALID = 41, /* 11i */ |
| 1258 | IEEE80211_STATUS_PAIRWISE_CIPHER_INVALID = 42, /* 11i */ |
| 1259 | IEEE80211_STATUS_AKMP_INVALID = 43, /* 11i */ |
| 1260 | IEEE80211_STATUS_UNSUPP_RSN_IE_VERSION = 44, /* 11i */ |
| 1261 | IEEE80211_STATUS_INVALID_RSN_IE_CAP = 45, /* 11i */ |
| 1262 | IEEE80211_STATUS_CIPHER_SUITE_REJECTED = 46, /* 11i */ |
| 1263 | }; |
| 1264 | |
| 1265 | #define IEEE80211_WEP_KEYLEN 5 /* 40bit */ |
| 1266 | #define IEEE80211_WEP_IVLEN 3 /* 24bit */ |
| 1267 | #define IEEE80211_WEP_KIDLEN 1 /* 1 octet */ |
| 1268 | #define IEEE80211_WEP_CRCLEN 4 /* CRC-32 */ |
| 1269 | #define IEEE80211_WEP_TOTLEN (IEEE80211_WEP_IVLEN + \ |
| 1270 | IEEE80211_WEP_KIDLEN + \ |
| 1271 | IEEE80211_WEP_CRCLEN) |
| 1272 | #define IEEE80211_WEP_NKID 4 /* number of key ids */ |
| 1273 | |
| 1274 | /* |
| 1275 | * 802.11i defines an extended IV for use with non-WEP ciphers. |
| 1276 | * When the EXTIV bit is set in the key id byte an additional |
| 1277 | * 4 bytes immediately follow the IV for TKIP. For CCMP the |
| 1278 | * EXTIV bit is likewise set but the 8 bytes represent the |
| 1279 | * CCMP header rather than IV+extended-IV. |
| 1280 | */ |
| 1281 | #define IEEE80211_WEP_EXTIV 0x20 |
| 1282 | #define IEEE80211_WEP_EXTIVLEN 4 /* extended IV length */ |
| 1283 | #define IEEE80211_WEP_MICLEN 8 /* trailing MIC */ |
| 1284 | |
| 1285 | #define IEEE80211_CRC_LEN 4 |
| 1286 | |
| 1287 | /* |
| 1288 | * Maximum acceptable MTU is: |
| 1289 | * IEEE80211_MAX_LEN - WEP overhead - CRC - |
| 1290 | * QoS overhead - RSN/WPA overhead |
| 1291 | * Min is arbitrarily chosen > IEEE80211_MIN_LEN. The default |
| 1292 | * mtu is Ethernet-compatible; it's set by ether_ifattach. |
| 1293 | */ |
| 1294 | #define IEEE80211_MTU_MAX 2290 |
| 1295 | #define IEEE80211_MTU_MIN 32 |
| 1296 | |
| 1297 | #define IEEE80211_MAX_LEN (2300 + IEEE80211_CRC_LEN + \ |
| 1298 | (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + IEEE80211_WEP_CRCLEN)) |
| 1299 | #define IEEE80211_ACK_LEN \ |
| 1300 | (sizeof(struct ieee80211_frame_ack) + IEEE80211_CRC_LEN) |
| 1301 | #define IEEE80211_MIN_LEN \ |
| 1302 | (sizeof(struct ieee80211_frame_min) + IEEE80211_CRC_LEN) |
| 1303 | |
| 1304 | /* |
| 1305 | * The 802.11 spec says at most 2007 stations may be |
| 1306 | * associated at once. For most AP's this is way more |
| 1307 | * than is feasible so we use a default of IEEE80211_AID_DEF. |
| 1308 | * This number may be overridden by the driver and/or by |
| 1309 | * user configuration but may not be less than IEEE80211_AID_MIN |
| 1310 | * (see _ieee80211.h for implementation-specific settings). |
| 1311 | */ |
| 1312 | #define IEEE80211_AID_MAX 2007 |
| 1313 | |
| 1314 | #define IEEE80211_AID(b) ((b) &~ 0xc000) |
| 1315 | |
| 1316 | /* |
| 1317 | * RTS frame length parameters. The default is specified in |
| 1318 | * the 802.11 spec as 512; we treat it as implementation-dependent |
| 1319 | * so it's defined in ieee80211_var.h. The max may be wrong |
| 1320 | * for jumbo frames. |
| 1321 | */ |
| 1322 | #define IEEE80211_RTS_MIN 1 |
| 1323 | #define IEEE80211_RTS_MAX 2346 |
| 1324 | |
| 1325 | /* |
| 1326 | * TX fragmentation parameters. As above for RTS, we treat |
| 1327 | * default as implementation-dependent so define it elsewhere. |
| 1328 | */ |
| 1329 | #define IEEE80211_FRAG_MIN 256 |
| 1330 | #define IEEE80211_FRAG_MAX 2346 |
| 1331 | |
| 1332 | /* |
| 1333 | * Beacon interval (TU's). Min+max come from WiFi requirements. |
| 1334 | * As above, we treat default as implementation-dependent so |
| 1335 | * define it elsewhere. |
| 1336 | */ |
| 1337 | #define IEEE80211_BINTVAL_MAX 1000 /* max beacon interval (TU's) */ |
| 1338 | #define IEEE80211_BINTVAL_MIN 25 /* min beacon interval (TU's) */ |
| 1339 | |
| 1340 | /* |
| 1341 | * DTIM period (beacons). Min+max are not really defined |
| 1342 | * by the protocol but we want them publicly visible so |
| 1343 | * define them here. |
| 1344 | */ |
| 1345 | #define IEEE80211_DTIM_MAX 15 /* max DTIM period */ |
| 1346 | #define IEEE80211_DTIM_MIN 1 /* min DTIM period */ |
| 1347 | |
| 1348 | /* |
| 1349 | * Beacon miss threshold (beacons). As for DTIM, we define |
| 1350 | * them here to be publicly visible. Note the max may be |
| 1351 | * clamped depending on device capabilities. |
| 1352 | */ |
| 1353 | #define IEEE80211_HWBMISS_MIN 1 |
| 1354 | #define IEEE80211_HWBMISS_MAX 255 |
| 1355 | |
| 1356 | /* |
| 1357 | * 802.11 frame duration definitions. |
| 1358 | */ |
| 1359 | |
| 1360 | struct ieee80211_duration { |
| 1361 | uint16_t d_rts_dur; |
| 1362 | uint16_t d_data_dur; |
| 1363 | uint16_t d_plcp_len; |
| 1364 | uint8_t d_residue; /* unused octets in time slot */ |
| 1365 | }; |
| 1366 | |
| 1367 | /* One Time Unit (TU) is 1Kus = 1024 microseconds. */ |
| 1368 | #define IEEE80211_DUR_TU 1024 |
| 1369 | |
| 1370 | /* IEEE 802.11b durations for DSSS PHY in microseconds */ |
| 1371 | #define IEEE80211_DUR_DS_LONG_PREAMBLE 144 |
| 1372 | #define IEEE80211_DUR_DS_SHORT_PREAMBLE 72 |
| 1373 | |
| 1374 | #define IEEE80211_DUR_DS_SLOW_PLCPHDR 48 |
| 1375 | #define IEEE80211_DUR_DS_FAST_PLCPHDR 24 |
| 1376 | #define IEEE80211_DUR_DS_SLOW_ACK 112 |
| 1377 | #define IEEE80211_DUR_DS_FAST_ACK 56 |
| 1378 | #define IEEE80211_DUR_DS_SLOW_CTS 112 |
| 1379 | #define IEEE80211_DUR_DS_FAST_CTS 56 |
| 1380 | |
| 1381 | #define IEEE80211_DUR_DS_SLOT 20 |
| 1382 | #define IEEE80211_DUR_DS_SIFS 10 |
| 1383 | #define IEEE80211_DUR_DS_PIFS (IEEE80211_DUR_DS_SIFS + IEEE80211_DUR_DS_SLOT) |
| 1384 | #define IEEE80211_DUR_DS_DIFS (IEEE80211_DUR_DS_SIFS + \ |
| 1385 | 2 * IEEE80211_DUR_DS_SLOT) |
| 1386 | #define IEEE80211_DUR_DS_EIFS (IEEE80211_DUR_DS_SIFS + \ |
| 1387 | IEEE80211_DUR_DS_SLOW_ACK + \ |
| 1388 | IEEE80211_DUR_DS_LONG_PREAMBLE + \ |
| 1389 | IEEE80211_DUR_DS_SLOW_PLCPHDR + \ |
| 1390 | IEEE80211_DUR_DIFS) |
| 1391 | |
| 1392 | #endif /* _NET80211_IEEE80211_H_ */ |