| 1 | /* |
| 2 | * Copyright 2007, Broadcom Corporation |
| 3 | * All Rights Reserved. |
| 4 | * |
| 5 | * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY |
| 6 | * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM |
| 7 | * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS |
| 8 | * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. |
| 9 | * |
| 10 | * Fundamental types and constants relating to 802.11 |
| 11 | * |
| 12 | */ |
| 13 | |
| 14 | #ifndef _802_11_H_ |
| 15 | #define _802_11_H_ |
| 16 | |
| 17 | #ifndef _TYPEDEFS_H_ |
| 18 | #include <typedefs.h> |
| 19 | #endif |
| 20 | |
| 21 | #ifndef _NET_ETHERNET_H_ |
| 22 | #include <proto/ethernet.h> |
| 23 | #endif |
| 24 | |
| 25 | #include <proto/wpa.h> |
| 26 | |
| 27 | /* enable structure packing */ |
| 28 | #if defined(__GNUC__) |
| 29 | #define PACKED __attribute__((packed)) |
| 30 | #else |
| 31 | #pragma pack(1) |
| 32 | #define PACKED |
| 33 | #endif |
| 34 | |
| 35 | #define DOT11_TU_TO_US 1024 /* 802.11 Time Unit is 1024 microseconds */ |
| 36 | |
| 37 | /* Generic 802.11 frame constants */ |
| 38 | #define DOT11_A3_HDR_LEN 24 /* d11 header length with A3 */ |
| 39 | #define DOT11_A4_HDR_LEN 30 /* d11 header length with A4 */ |
| 40 | #define DOT11_MAC_HDR_LEN DOT11_A3_HDR_LEN /* MAC header length */ |
| 41 | #define DOT11_FCS_LEN 4 /* d11 FCS length */ |
| 42 | #define DOT11_ICV_LEN 4 /* d11 ICV length */ |
| 43 | #define DOT11_ICV_AES_LEN 8 /* d11 ICV/AES length */ |
| 44 | #define DOT11_QOS_LEN 2 /* d11 QoS length */ |
| 45 | #define DOT11_HTC_LEN 4 /* d11 HT Control field length */ |
| 46 | |
| 47 | #define DOT11_KEY_INDEX_SHIFT 6 /* d11 key index shift */ |
| 48 | #define DOT11_IV_LEN 4 /* d11 IV length */ |
| 49 | #define DOT11_IV_TKIP_LEN 8 /* d11 IV TKIP length */ |
| 50 | #define DOT11_IV_AES_OCB_LEN 4 /* d11 IV/AES/OCB length */ |
| 51 | #define DOT11_IV_AES_CCM_LEN 8 /* d11 IV/AES/CCM length */ |
| 52 | #define DOT11_IV_MAX_LEN 8 /* maximum iv len for any encryption */ |
| 53 | |
| 54 | /* Includes MIC */ |
| 55 | #define DOT11_MAX_MPDU_BODY_LEN 2304 /* max MPDU body length */ |
| 56 | /* A4 header + QoS + CCMP + PDU + ICV + FCS = 2352 */ |
| 57 | #define DOT11_MAX_MPDU_LEN (DOT11_A4_HDR_LEN + \ |
| 58 | DOT11_QOS_LEN + \ |
| 59 | DOT11_IV_AES_CCM_LEN + \ |
| 60 | DOT11_MAX_MPDU_BODY_LEN + \ |
| 61 | DOT11_ICV_LEN + \ |
| 62 | DOT11_FCS_LEN) /* d11 max MPDU length */ |
| 63 | |
| 64 | #define DOT11_MAX_SSID_LEN 32 /* d11 max ssid length */ |
| 65 | |
| 66 | /* dot11RTSThreshold */ |
| 67 | #define DOT11_DEFAULT_RTS_LEN 2347 /* d11 default RTS length */ |
| 68 | #define DOT11_MAX_RTS_LEN 2347 /* d11 max RTS length */ |
| 69 | |
| 70 | /* dot11FragmentationThreshold */ |
| 71 | #define DOT11_MIN_FRAG_LEN 256 /* d11 min fragmentation length */ |
| 72 | #define DOT11_MAX_FRAG_LEN 2346 /* Max frag is also limited by aMPDUMaxLength |
| 73 | * of the attached PHY |
| 74 | */ |
| 75 | #define DOT11_DEFAULT_FRAG_LEN 2346 /* d11 default fragmentation length */ |
| 76 | |
| 77 | /* dot11BeaconPeriod */ |
| 78 | #define DOT11_MIN_BEACON_PERIOD 1 /* d11 min beacon period */ |
| 79 | #define DOT11_MAX_BEACON_PERIOD 0xFFFF /* d11 max beacon period */ |
| 80 | |
| 81 | /* dot11DTIMPeriod */ |
| 82 | #define DOT11_MIN_DTIM_PERIOD 1 /* d11 min DTIM period */ |
| 83 | #define DOT11_MAX_DTIM_PERIOD 0xFF /* d11 max DTIM period */ |
| 84 | |
| 85 | /* 802.2 LLC/SNAP header used by 802.11 per 802.1H */ |
| 86 | #define DOT11_LLC_SNAP_HDR_LEN 8 /* d11 LLC/SNAP header length */ |
| 87 | #define DOT11_OUI_LEN 3 /* d11 OUI length */ |
| 88 | struct dot11_llc_snap_header { |
| 89 | uint8 dsap; /* always 0xAA */ |
| 90 | uint8 ssap; /* always 0xAA */ |
| 91 | uint8 ctl; /* always 0x03 */ |
| 92 | uint8 oui[DOT11_OUI_LEN]; /* RFC1042: 0x00 0x00 0x00 |
| 93 | * Bridge-Tunnel: 0x00 0x00 0xF8 |
| 94 | */ |
| 95 | uint16 type; /* ethertype */ |
| 96 | } PACKED; |
| 97 | |
| 98 | /* RFC1042 header used by 802.11 per 802.1H */ |
| 99 | #define RFC1042_HDR_LEN (ETHER_HDR_LEN + DOT11_LLC_SNAP_HDR_LEN) /* RCF1042 header length */ |
| 100 | |
| 101 | /* Generic 802.11 MAC header */ |
| 102 | /* |
| 103 | * N.B.: This struct reflects the full 4 address 802.11 MAC header. |
| 104 | * The fields are defined such that the shorter 1, 2, and 3 |
| 105 | * address headers just use the first k fields. |
| 106 | */ |
| 107 | struct dot11_header { |
| 108 | uint16 fc; /* frame control */ |
| 109 | uint16 durid; /* duration/ID */ |
| 110 | struct ether_addr a1; /* address 1 */ |
| 111 | struct ether_addr a2; /* address 2 */ |
| 112 | struct ether_addr a3; /* address 3 */ |
| 113 | uint16 seq; /* sequence control */ |
| 114 | struct ether_addr a4; /* address 4 */ |
| 115 | } PACKED; |
| 116 | |
| 117 | /* Control frames */ |
| 118 | |
| 119 | struct dot11_rts_frame { |
| 120 | uint16 fc; /* frame control */ |
| 121 | uint16 durid; /* duration/ID */ |
| 122 | struct ether_addr ra; /* receiver address */ |
| 123 | struct ether_addr ta; /* transmitter address */ |
| 124 | } PACKED; |
| 125 | #define DOT11_RTS_LEN 16 /* d11 RTS frame length */ |
| 126 | |
| 127 | struct dot11_cts_frame { |
| 128 | uint16 fc; /* frame control */ |
| 129 | uint16 durid; /* duration/ID */ |
| 130 | struct ether_addr ra; /* receiver address */ |
| 131 | } PACKED; |
| 132 | #define DOT11_CTS_LEN 10 /* d11 CTS frame length */ |
| 133 | |
| 134 | struct dot11_ack_frame { |
| 135 | uint16 fc; /* frame control */ |
| 136 | uint16 durid; /* duration/ID */ |
| 137 | struct ether_addr ra; /* receiver address */ |
| 138 | } PACKED; |
| 139 | #define DOT11_ACK_LEN 10 /* d11 ACK frame length */ |
| 140 | |
| 141 | struct dot11_ps_poll_frame { |
| 142 | uint16 fc; /* frame control */ |
| 143 | uint16 durid; /* AID */ |
| 144 | struct ether_addr bssid; /* receiver address, STA in AP */ |
| 145 | struct ether_addr ta; /* transmitter address */ |
| 146 | } PACKED; |
| 147 | #define DOT11_PS_POLL_LEN 16 /* d11 PS poll frame length */ |
| 148 | |
| 149 | struct dot11_cf_end_frame { |
| 150 | uint16 fc; /* frame control */ |
| 151 | uint16 durid; /* duration/ID */ |
| 152 | struct ether_addr ra; /* receiver address */ |
| 153 | struct ether_addr bssid; /* transmitter address, STA in AP */ |
| 154 | } PACKED; |
| 155 | #define DOT11_CS_END_LEN 16 /* d11 CF-END frame length */ |
| 156 | |
| 157 | /* BA/BAR Control parameters */ |
| 158 | #define DOT11_BA_CTL_POLICY_NORMAL 0x0000 /* normal ack */ |
| 159 | #define DOT11_BA_CTL_POLICY_NOACK 0x0001 /* no ack */ |
| 160 | #define DOT11_BA_CTL_POLICY_MASK 0x0001 /* ack policy mask */ |
| 161 | |
| 162 | #define DOT11_BA_CTL_MTID 0x0002 /* multi tid BA */ |
| 163 | #define DOT11_BA_CTL_COMPRESSED 0x0004 /* compressed bitmap */ |
| 164 | |
| 165 | #define DOT11_BA_CTL_NUMMSDU_MASK 0x0FC0 /* num msdu in bitmap mask */ |
| 166 | #define DOT11_BA_CTL_NUMMSDU_SHIFT 6 /* num msdu in bitmap shift */ |
| 167 | |
| 168 | #define DOT11_BA_CTL_TID_MASK 0xF000 /* tid mask */ |
| 169 | #define DOT11_BA_CTL_TID_SHIFT 12 /* tid shift */ |
| 170 | |
| 171 | /* control frame header (BA/BAR) */ |
| 172 | struct dot11_ctl_header { |
| 173 | uint16 fc; /* frame control */ |
| 174 | uint16 durid; /* duration/ID */ |
| 175 | struct ether_addr ra; /* receiver address */ |
| 176 | struct ether_addr ta; /* transmitter address */ |
| 177 | } PACKED; |
| 178 | #define DOT11_CTL_HDR_LEN 16 /* control frame hdr len */ |
| 179 | |
| 180 | /* BAR frame payload */ |
| 181 | struct dot11_bar { |
| 182 | uint16 bar_control; /* BAR Control */ |
| 183 | uint16 seqnum; /* Starting Sequence control */ |
| 184 | } PACKED; |
| 185 | #define DOT11_BAR_LEN 4 /* BAR frame payload length */ |
| 186 | |
| 187 | #define DOT11_BA_BITMAP_LEN 128 /* bitmap length */ |
| 188 | #define DOT11_BA_CMP_BITMAP_LEN 8 /* compressed bitmap length */ |
| 189 | /* BA frame payload */ |
| 190 | struct dot11_ba { |
| 191 | uint16 ba_control; /* BA Control */ |
| 192 | uint16 seqnum; /* Starting Sequence control */ |
| 193 | uint8 bitmap[DOT11_BA_BITMAP_LEN]; /* Block Ack Bitmap */ |
| 194 | } PACKED; |
| 195 | #define DOT11_BA_LEN 4 /* BA frame payload len (wo bitmap) */ |
| 196 | |
| 197 | /* Management frame header */ |
| 198 | struct dot11_management_header { |
| 199 | uint16 fc; /* frame control */ |
| 200 | uint16 durid; /* duration/ID */ |
| 201 | struct ether_addr da; /* receiver address */ |
| 202 | struct ether_addr sa; /* transmitter address */ |
| 203 | struct ether_addr bssid; /* BSS ID */ |
| 204 | uint16 seq; /* sequence control */ |
| 205 | } PACKED; |
| 206 | #define DOT11_MGMT_HDR_LEN 24 /* d11 management header length */ |
| 207 | |
| 208 | /* Management frame payloads */ |
| 209 | |
| 210 | struct dot11_bcn_prb { |
| 211 | uint32 timestamp[2]; |
| 212 | uint16 beacon_interval; |
| 213 | uint16 capability; |
| 214 | } PACKED; |
| 215 | #define DOT11_BCN_PRB_LEN 12 /* 802.11 beacon/probe frame fixed length */ |
| 216 | |
| 217 | struct dot11_auth { |
| 218 | uint16 alg; /* algorithm */ |
| 219 | uint16 seq; /* sequence control */ |
| 220 | uint16 status; /* status code */ |
| 221 | } PACKED; |
| 222 | #define DOT11_AUTH_FIXED_LEN 6 /* length of auth frame without challenge info |
| 223 | * elt |
| 224 | */ |
| 225 | |
| 226 | struct dot11_assoc_req { |
| 227 | uint16 capability; /* capability information */ |
| 228 | uint16 listen; /* listen interval */ |
| 229 | } PACKED; |
| 230 | #define DOT11_ASSOC_REQ_FIXED_LEN 4 /* length of assoc frame without info elts */ |
| 231 | |
| 232 | struct dot11_reassoc_req { |
| 233 | uint16 capability; /* capability information */ |
| 234 | uint16 listen; /* listen interval */ |
| 235 | struct ether_addr ap; /* Current AP address */ |
| 236 | } PACKED; |
| 237 | #define DOT11_REASSOC_REQ_FIXED_LEN 10 /* length of assoc frame without info elts */ |
| 238 | |
| 239 | struct dot11_assoc_resp { |
| 240 | uint16 capability; /* capability information */ |
| 241 | uint16 status; /* status code */ |
| 242 | uint16 aid; /* association ID */ |
| 243 | } PACKED; |
| 244 | |
| 245 | struct dot11_action_measure { |
| 246 | uint8 category; |
| 247 | uint8 action; |
| 248 | uint8 token; |
| 249 | uint8 data[1]; |
| 250 | } PACKED; |
| 251 | #define DOT11_ACTION_MEASURE_LEN 3 /* d11 action measurement header length */ |
| 252 | |
| 253 | struct dot11_action_ht_ch_width { |
| 254 | uint8 category; |
| 255 | uint8 action; |
| 256 | uint8 ch_width; |
| 257 | } PACKED; |
| 258 | |
| 259 | struct dot11_action_ht_mimops { |
| 260 | uint8 category; |
| 261 | uint8 action; |
| 262 | uint8 control; |
| 263 | } PACKED; |
| 264 | |
| 265 | #define SM_PWRSAVE_ENABLE 1 |
| 266 | #define SM_PWRSAVE_MODE 2 |
| 267 | |
| 268 | struct dot11_action_ht_info_xchg { |
| 269 | uint8 category; |
| 270 | uint8 action; |
| 271 | uint8 info; |
| 272 | } PACKED; |
| 273 | |
| 274 | #define DOT11_HT_INFO_XCHG_INFO_REQ 0x01 |
| 275 | #define DOT11_HT_INFO_XCHG_40MHZ_INTOLERANT 0x02 |
| 276 | #define DOT11_HT_INFO_XCHG_STA_CHAN_WIDTH 0x04 |
| 277 | |
| 278 | |
| 279 | /* ************* 802.11h related definitions. ************* */ |
| 280 | struct dot11_power_cnst { |
| 281 | uint8 id; |
| 282 | uint8 len; |
| 283 | uint8 power; |
| 284 | } PACKED; |
| 285 | typedef struct dot11_power_cnst dot11_power_cnst_t; |
| 286 | |
| 287 | struct dot11_power_cap { |
| 288 | uint8 min; |
| 289 | uint8 max; |
| 290 | } PACKED; |
| 291 | typedef struct dot11_power_cap dot11_power_cap_t; |
| 292 | |
| 293 | struct dot11_tpc_rep { |
| 294 | uint8 id; |
| 295 | uint8 len; |
| 296 | uint8 tx_pwr; |
| 297 | uint8 margin; |
| 298 | } PACKED; |
| 299 | typedef struct dot11_tpc_rep dot11_tpc_rep_t; |
| 300 | #define DOT11_MNG_IE_TPC_REPORT_LEN 2 /* length of IE data, not including 2 byte header */ |
| 301 | |
| 302 | struct dot11_supp_channels { |
| 303 | uint8 id; |
| 304 | uint8 len; |
| 305 | uint8 first_channel; |
| 306 | uint8 num_channels; |
| 307 | } PACKED; |
| 308 | typedef struct dot11_supp_channels dot11_supp_channels_t; |
| 309 | |
| 310 | /* Extension Channel Offset IE: 802.11n-D1.0 spec. added sideband |
| 311 | * offset for 40MHz operation. The possible 3 values are: |
| 312 | * 1 = above control channel |
| 313 | * 3 = below control channel |
| 314 | * 0 = no extension channel |
| 315 | */ |
| 316 | struct dot11_extch { |
| 317 | uint8 id; /* IE ID, 62, DOT11_MNG_EXT_CHANNEL_OFFSET */ |
| 318 | uint8 len; /* IE length */ |
| 319 | uint8 extch; |
| 320 | } PACKED; |
| 321 | typedef struct dot11_extch dot11_extch_ie_t; |
| 322 | |
| 323 | struct dot11_brcm_extch { |
| 324 | uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ |
| 325 | uint8 len; /* IE length */ |
| 326 | uint8 oui[3]; /* Proprietary OUI, BRCM_OUI */ |
| 327 | uint8 type; /* type inidicates what follows */ |
| 328 | uint8 extch; |
| 329 | } PACKED; |
| 330 | typedef struct dot11_brcm_extch dot11_brcm_extch_ie_t; |
| 331 | |
| 332 | #define BRCM_EXTCH_IE_LEN 5 |
| 333 | #define BRCM_EXTCH_IE_TYPE 53 /* 802.11n ID not yet assigned */ |
| 334 | #define DOT11_EXTCH_IE_LEN 1 |
| 335 | #define DOT11_EXT_CH_MASK 0x03 /* extension channel mask */ |
| 336 | #define DOT11_EXT_CH_UPPER 0x01 /* ext. ch. on upper sb */ |
| 337 | #define DOT11_EXT_CH_LOWER 0x03 /* ext. ch. on lower sb */ |
| 338 | #define DOT11_EXT_CH_NONE 0x00 /* no extension ch. */ |
| 339 | |
| 340 | struct dot11_action_frmhdr { |
| 341 | uint8 category; |
| 342 | uint8 action; |
| 343 | uint8 data[1]; |
| 344 | } PACKED; |
| 345 | |
| 346 | /* CSA IE data structure */ |
| 347 | struct dot11_channel_switch { |
| 348 | uint8 id; /* id DOT11_MNG_CHANNEL_SWITCH_ID */ |
| 349 | uint8 len; /* length of IE */ |
| 350 | uint8 mode; /* mode 0 or 1 */ |
| 351 | uint8 channel; /* channel switch to */ |
| 352 | uint8 count; /* number of beacons before switching */ |
| 353 | } PACKED; |
| 354 | typedef struct dot11_channel_switch dot11_chan_switch_ie_t; |
| 355 | |
| 356 | #define DOT11_SWITCH_IE_LEN 3 /* length of IE data, not including 2 byte header */ |
| 357 | /* CSA mode - 802.11h-2003 $7.3.2.20 */ |
| 358 | #define DOT11_CSA_MODE_ADVISORY 0 /* no DOT11_CSA_MODE_NO_TX restriction imposed */ |
| 359 | #define DOT11_CSA_MODE_NO_TX 1 /* no transmission upon receiving CSA frame. */ |
| 360 | |
| 361 | struct dot11_action_switch_channel { |
| 362 | uint8 category; |
| 363 | uint8 action; |
| 364 | dot11_chan_switch_ie_t chan_switch_ie; /* for switch IE */ |
| 365 | dot11_brcm_extch_ie_t extch_ie; /* extension channel offset */ |
| 366 | } PACKED; |
| 367 | |
| 368 | /* 11n Extended Channel Switch IE data structure */ |
| 369 | struct dot11_ext_csa { |
| 370 | uint8 id; /* id DOT11_MNG_EXT_CHANNEL_SWITCH_ID */ |
| 371 | uint8 len; /* length of IE */ |
| 372 | uint8 mode; /* mode 0 or 1 */ |
| 373 | uint8 reg; /* regulatory class */ |
| 374 | uint8 channel; /* channel switch to */ |
| 375 | uint8 count; /* number of beacons before switching */ |
| 376 | } PACKED; |
| 377 | typedef struct dot11_ext_csa dot11_ext_csa_ie_t; |
| 378 | #define DOT11_EXT_CSA_IE_LEN 4 /* length of extended channel switch IE body */ |
| 379 | |
| 380 | struct dot11_action_ext_csa { |
| 381 | uint8 category; |
| 382 | uint8 action; |
| 383 | dot11_ext_csa_ie_t chan_switch_ie; /* for switch IE */ |
| 384 | } PACKED; |
| 385 | |
| 386 | /* 802.11h Measurement Request/Report IEs */ |
| 387 | /* Measurement Type field */ |
| 388 | #define DOT11_MEASURE_TYPE_BASIC 0 /* d11 measurement basic type */ |
| 389 | #define DOT11_MEASURE_TYPE_CCA 1 /* d11 measurement CCA type */ |
| 390 | #define DOT11_MEASURE_TYPE_RPI 2 /* d11 measurement PRI type */ |
| 391 | |
| 392 | /* Measurement Request Modes */ |
| 393 | #define DOT11_MEASURE_MODE_ENABLE (1<<1) /* d11 measurement enable */ |
| 394 | #define DOT11_MEASURE_MODE_REQUEST (1<<2) /* d11 measurement request */ |
| 395 | #define DOT11_MEASURE_MODE_REPORT (1<<3) /* d11 measurement report */ |
| 396 | /* Measurement Report Modes */ |
| 397 | #define DOT11_MEASURE_MODE_LATE (1<<0) /* d11 measurement late */ |
| 398 | #define DOT11_MEASURE_MODE_INCAPABLE (1<<1) /* d11 measurement incapable */ |
| 399 | #define DOT11_MEASURE_MODE_REFUSED (1<<2) /* d11 measurement refuse */ |
| 400 | /* Basic Measurement Map bits */ |
| 401 | #define DOT11_MEASURE_BASIC_MAP_BSS ((uint8)(1<<0)) /* d11 measurement basic map BSS */ |
| 402 | #define DOT11_MEASURE_BASIC_MAP_OFDM ((uint8)(1<<1)) /* d11 measurement map OFDM */ |
| 403 | #define DOT11_MEASURE_BASIC_MAP_UKNOWN ((uint8)(1<<2)) /* d11 measurement map unknown */ |
| 404 | #define DOT11_MEASURE_BASIC_MAP_RADAR ((uint8)(1<<3)) /* d11 measurement map radar */ |
| 405 | #define DOT11_MEASURE_BASIC_MAP_UNMEAS ((uint8)(1<<4)) /* d11 measurement map unmeasuremnt */ |
| 406 | |
| 407 | struct dot11_meas_req { |
| 408 | uint8 id; |
| 409 | uint8 len; |
| 410 | uint8 token; |
| 411 | uint8 mode; |
| 412 | uint8 type; |
| 413 | uint8 channel; |
| 414 | uint8 start_time[8]; |
| 415 | uint16 duration; |
| 416 | } PACKED; |
| 417 | typedef struct dot11_meas_req dot11_meas_req_t; |
| 418 | #define DOT11_MNG_IE_MREQ_LEN 14 /* d11 measurement request IE length */ |
| 419 | /* length of Measure Request IE data not including variable len */ |
| 420 | #define DOT11_MNG_IE_MREQ_FIXED_LEN 3 /* d11 measurement request IE fixed length */ |
| 421 | |
| 422 | struct dot11_meas_rep { |
| 423 | uint8 id; |
| 424 | uint8 len; |
| 425 | uint8 token; |
| 426 | uint8 mode; |
| 427 | uint8 type; |
| 428 | union |
| 429 | { |
| 430 | struct { |
| 431 | uint8 channel; |
| 432 | uint8 start_time[8]; |
| 433 | uint16 duration; |
| 434 | uint8 map; |
| 435 | } PACKED basic; |
| 436 | uint8 data[1]; |
| 437 | } PACKED rep; |
| 438 | } PACKED; |
| 439 | typedef struct dot11_meas_rep dot11_meas_rep_t; |
| 440 | |
| 441 | /* length of Measure Report IE data not including variable len */ |
| 442 | #define DOT11_MNG_IE_MREP_FIXED_LEN 3 /* d11 measurement response IE fixed length */ |
| 443 | |
| 444 | struct dot11_meas_rep_basic { |
| 445 | uint8 channel; |
| 446 | uint8 start_time[8]; |
| 447 | uint16 duration; |
| 448 | uint8 map; |
| 449 | } PACKED; |
| 450 | typedef struct dot11_meas_rep_basic dot11_meas_rep_basic_t; |
| 451 | #define DOT11_MEASURE_BASIC_REP_LEN 12 /* d11 measurement basic report length */ |
| 452 | |
| 453 | struct dot11_quiet { |
| 454 | uint8 id; |
| 455 | uint8 len; |
| 456 | uint8 count; /* TBTTs until beacon interval in quiet starts */ |
| 457 | uint8 period; /* Beacon intervals between periodic quiet periods ? */ |
| 458 | uint16 duration; /* Length of quiet period, in TU's */ |
| 459 | uint16 offset; /* TU's offset from TBTT in Count field */ |
| 460 | } PACKED; |
| 461 | typedef struct dot11_quiet dot11_quiet_t; |
| 462 | |
| 463 | struct chan_map_tuple { |
| 464 | uint8 channel; |
| 465 | uint8 map; |
| 466 | } PACKED; |
| 467 | typedef struct chan_map_tuple chan_map_tuple_t; |
| 468 | |
| 469 | struct dot11_ibss_dfs { |
| 470 | uint8 id; |
| 471 | uint8 len; |
| 472 | uint8 eaddr[ETHER_ADDR_LEN]; |
| 473 | uint8 interval; |
| 474 | chan_map_tuple_t map[1]; |
| 475 | } PACKED; |
| 476 | typedef struct dot11_ibss_dfs dot11_ibss_dfs_t; |
| 477 | |
| 478 | /* WME Elements */ |
| 479 | #define WME_OUI "\x00\x50\xf2" /* WME OUI */ |
| 480 | #define WME_VER 1 /* WME version */ |
| 481 | #define WME_TYPE 2 /* WME type */ |
| 482 | #define WME_SUBTYPE_IE 0 /* Information Element */ |
| 483 | #define WME_SUBTYPE_PARAM_IE 1 /* Parameter Element */ |
| 484 | #define WME_SUBTYPE_TSPEC 2 /* Traffic Specification */ |
| 485 | |
| 486 | /* WME Access Category Indices (ACIs) */ |
| 487 | #define AC_BE 0 /* Best Effort */ |
| 488 | #define AC_BK 1 /* Background */ |
| 489 | #define AC_VI 2 /* Video */ |
| 490 | #define AC_VO 3 /* Voice */ |
| 491 | #define AC_COUNT 4 /* number of ACs */ |
| 492 | |
| 493 | typedef uint8 ac_bitmap_t; /* AC bitmap of (1 << AC_xx) */ |
| 494 | |
| 495 | #define AC_BITMAP_NONE 0x0 /* No ACs */ |
| 496 | #define AC_BITMAP_ALL 0xf /* All ACs */ |
| 497 | #define AC_BITMAP_TST(ab, ac) (((ab) & (1 << (ac))) != 0) |
| 498 | |
| 499 | /* WME Information Element (IE) */ |
| 500 | struct wme_ie { |
| 501 | uint8 oui[3]; |
| 502 | uint8 type; |
| 503 | uint8 subtype; |
| 504 | uint8 version; |
| 505 | uint8 qosinfo; |
| 506 | } PACKED; |
| 507 | typedef struct wme_ie wme_ie_t; |
| 508 | #define WME_IE_LEN 7 /* WME IE length */ |
| 509 | |
| 510 | struct edcf_acparam { |
| 511 | uint8 ACI; |
| 512 | uint8 ECW; |
| 513 | uint16 TXOP; /* stored in network order (ls octet first) */ |
| 514 | } PACKED; |
| 515 | typedef struct edcf_acparam edcf_acparam_t; |
| 516 | |
| 517 | /* WME Parameter Element (PE) */ |
| 518 | struct wme_param_ie { |
| 519 | uint8 oui[3]; |
| 520 | uint8 type; |
| 521 | uint8 subtype; |
| 522 | uint8 version; |
| 523 | uint8 qosinfo; |
| 524 | uint8 rsvd; |
| 525 | edcf_acparam_t acparam[AC_COUNT]; |
| 526 | } PACKED; |
| 527 | typedef struct wme_param_ie wme_param_ie_t; |
| 528 | #define WME_PARAM_IE_LEN 24 /* WME Parameter IE length */ |
| 529 | |
| 530 | /* QoS Info field for IE as sent from AP */ |
| 531 | #define WME_QI_AP_APSD_MASK 0x80 /* U-APSD Supported mask */ |
| 532 | #define WME_QI_AP_APSD_SHIFT 7 /* U-APSD Supported shift */ |
| 533 | #define WME_QI_AP_COUNT_MASK 0x0f /* Parameter set count mask */ |
| 534 | #define WME_QI_AP_COUNT_SHIFT 0 /* Parameter set count shift */ |
| 535 | |
| 536 | /* QoS Info field for IE as sent from STA */ |
| 537 | #define WME_QI_STA_MAXSPLEN_MASK 0x60 /* Max Service Period Length mask */ |
| 538 | #define WME_QI_STA_MAXSPLEN_SHIFT 5 /* Max Service Period Length shift */ |
| 539 | #define WME_QI_STA_APSD_ALL_MASK 0xf /* APSD all AC bits mask */ |
| 540 | #define WME_QI_STA_APSD_ALL_SHIFT 0 /* APSD all AC bits shift */ |
| 541 | #define WME_QI_STA_APSD_BE_MASK 0x8 /* APSD AC_BE mask */ |
| 542 | #define WME_QI_STA_APSD_BE_SHIFT 3 /* APSD AC_BE shift */ |
| 543 | #define WME_QI_STA_APSD_BK_MASK 0x4 /* APSD AC_BK mask */ |
| 544 | #define WME_QI_STA_APSD_BK_SHIFT 2 /* APSD AC_BK shift */ |
| 545 | #define WME_QI_STA_APSD_VI_MASK 0x2 /* APSD AC_VI mask */ |
| 546 | #define WME_QI_STA_APSD_VI_SHIFT 1 /* APSD AC_VI shift */ |
| 547 | #define WME_QI_STA_APSD_VO_MASK 0x1 /* APSD AC_VO mask */ |
| 548 | #define WME_QI_STA_APSD_VO_SHIFT 0 /* APSD AC_VO shift */ |
| 549 | |
| 550 | /* ACI */ |
| 551 | #define EDCF_AIFSN_MIN 1 /* AIFSN minimum value */ |
| 552 | #define EDCF_AIFSN_MAX 15 /* AIFSN maximum value */ |
| 553 | #define EDCF_AIFSN_MASK 0x0f /* AIFSN mask */ |
| 554 | #define EDCF_ACM_MASK 0x10 /* ACM mask */ |
| 555 | #define EDCF_ACI_MASK 0x60 /* ACI mask */ |
| 556 | #define EDCF_ACI_SHIFT 5 /* ACI shift */ |
| 557 | |
| 558 | /* ECW */ |
| 559 | #define EDCF_ECW_MIN 0 /* cwmin/cwmax exponent minimum value */ |
| 560 | #define EDCF_ECW_MAX 15 /* cwmin/cwmax exponent maximum value */ |
| 561 | #define EDCF_ECW2CW(exp) ((1 << (exp)) - 1) |
| 562 | #define EDCF_ECWMIN_MASK 0x0f /* cwmin exponent form mask */ |
| 563 | #define EDCF_ECWMAX_MASK 0xf0 /* cwmax exponent form mask */ |
| 564 | #define EDCF_ECWMAX_SHIFT 4 /* cwmax exponent form shift */ |
| 565 | |
| 566 | /* TXOP */ |
| 567 | #define EDCF_TXOP_MIN 0 /* TXOP minimum value */ |
| 568 | #define EDCF_TXOP_MAX 65535 /* TXOP maximum value */ |
| 569 | #define EDCF_TXOP2USEC(txop) ((txop) << 5) |
| 570 | |
| 571 | /* Default EDCF parameters that AP advertises for STA to use; WMM draft Table 12 */ |
| 572 | #define EDCF_AC_BE_ACI_STA 0x03 /* STA ACI value for best effort AC */ |
| 573 | #define EDCF_AC_BE_ECW_STA 0xA4 /* STA ECW value for best effort AC */ |
| 574 | #define EDCF_AC_BE_TXOP_STA 0x0000 /* STA TXOP value for best effort AC */ |
| 575 | #define EDCF_AC_BK_ACI_STA 0x27 /* STA ACI value for background AC */ |
| 576 | #define EDCF_AC_BK_ECW_STA 0xA4 /* STA ECW value for background AC */ |
| 577 | #define EDCF_AC_BK_TXOP_STA 0x0000 /* STA TXOP value for background AC */ |
| 578 | #define EDCF_AC_VI_ACI_STA 0x42 /* STA ACI value for video AC */ |
| 579 | #define EDCF_AC_VI_ECW_STA 0x43 /* STA ECW value for video AC */ |
| 580 | #define EDCF_AC_VI_TXOP_STA 0x005e /* STA TXOP value for video AC */ |
| 581 | #define EDCF_AC_VO_ACI_STA 0x62 /* STA ACI value for audio AC */ |
| 582 | #define EDCF_AC_VO_ECW_STA 0x32 /* STA ECW value for audio AC */ |
| 583 | #define EDCF_AC_VO_TXOP_STA 0x002f /* STA TXOP value for audio AC */ |
| 584 | |
| 585 | /* Default EDCF parameters that AP uses; WMM draft Table 14 */ |
| 586 | #define EDCF_AC_BE_ACI_AP 0x03 /* AP ACI value for best effort AC */ |
| 587 | #define EDCF_AC_BE_ECW_AP 0x64 /* AP ECW value for best effort AC */ |
| 588 | #define EDCF_AC_BE_TXOP_AP 0x0000 /* AP TXOP value for best effort AC */ |
| 589 | #define EDCF_AC_BK_ACI_AP 0x27 /* AP ACI value for background AC */ |
| 590 | #define EDCF_AC_BK_ECW_AP 0xA4 /* AP ECW value for background AC */ |
| 591 | #define EDCF_AC_BK_TXOP_AP 0x0000 /* AP TXOP value for background AC */ |
| 592 | #define EDCF_AC_VI_ACI_AP 0x41 /* AP ACI value for video AC */ |
| 593 | #define EDCF_AC_VI_ECW_AP 0x43 /* AP ECW value for video AC */ |
| 594 | #define EDCF_AC_VI_TXOP_AP 0x005e /* AP TXOP value for video AC */ |
| 595 | #define EDCF_AC_VO_ACI_AP 0x61 /* AP ACI value for audio AC */ |
| 596 | #define EDCF_AC_VO_ECW_AP 0x32 /* AP ECW value for audio AC */ |
| 597 | #define EDCF_AC_VO_TXOP_AP 0x002f /* AP TXOP value for audio AC */ |
| 598 | |
| 599 | struct dot11_qbss_load_ie { |
| 600 | uint8 id; /* 11, DOT11_MNG_QBSS_LOAD_ID */ |
| 601 | uint8 length; |
| 602 | uint16 station_count; /* total number of STAs associated */ |
| 603 | uint8 channel_utilization; /* % of time, normalized to 255, QAP sensed medium busy */ |
| 604 | uint16 aac; /* available admission capacity */ |
| 605 | } PACKED; |
| 606 | typedef struct dot11_qbss_load_ie dot11_qbss_load_ie_t; |
| 607 | |
| 608 | /* nom_msdu_size */ |
| 609 | #define FIXED_MSDU_SIZE 0x8000 /* MSDU size is fixed */ |
| 610 | #define MSDU_SIZE_MASK 0x7fff /* (Nominal or fixed) MSDU size */ |
| 611 | |
| 612 | /* surplus_bandwidth */ |
| 613 | /* Represented as 3 bits of integer, binary point, 13 bits fraction */ |
| 614 | #define INTEGER_SHIFT 13 /* integer shift */ |
| 615 | #define FRACTION_MASK 0x1FFF /* fraction mask */ |
| 616 | |
| 617 | /* Management Notification Frame */ |
| 618 | struct dot11_management_notification { |
| 619 | uint8 category; /* DOT11_ACTION_NOTIFICATION */ |
| 620 | uint8 action; |
| 621 | uint8 token; |
| 622 | uint8 status; |
| 623 | uint8 data[1]; /* Elements */ |
| 624 | } PACKED; |
| 625 | #define DOT11_MGMT_NOTIFICATION_LEN 4 /* Fixed length */ |
| 626 | |
| 627 | /* WME Action Codes */ |
| 628 | #define WME_ADDTS_REQUEST 0 /* WME ADDTS request */ |
| 629 | #define WME_ADDTS_RESPONSE 1 /* WME ADDTS response */ |
| 630 | #define WME_DELTS_REQUEST 2 /* WME DELTS request */ |
| 631 | |
| 632 | /* WME Setup Response Status Codes */ |
| 633 | #define WME_ADMISSION_ACCEPTED 0 /* WME admission accepted */ |
| 634 | #define WME_INVALID_PARAMETERS 1 /* WME invalide parameters */ |
| 635 | #define WME_ADMISSION_REFUSED 3 /* WME admission refused */ |
| 636 | |
| 637 | /* Macro to take a pointer to a beacon or probe response |
| 638 | * body and return the char* pointer to the SSID info element |
| 639 | */ |
| 640 | #define BCN_PRB_SSID(body) ((char*)(body) + DOT11_BCN_PRB_LEN) |
| 641 | |
| 642 | /* Authentication frame payload constants */ |
| 643 | #define DOT11_OPEN_SYSTEM 0 /* d11 open authentication */ |
| 644 | #define DOT11_SHARED_KEY 1 /* d11 shared authentication */ |
| 645 | #define DOT11_CHALLENGE_LEN 128 /* d11 challenge text length */ |
| 646 | |
| 647 | /* Frame control macros */ |
| 648 | #define FC_PVER_MASK 0x3 /* PVER mask */ |
| 649 | #define FC_PVER_SHIFT 0 /* PVER shift */ |
| 650 | #define FC_TYPE_MASK 0xC /* type mask */ |
| 651 | #define FC_TYPE_SHIFT 2 /* type shift */ |
| 652 | #define FC_SUBTYPE_MASK 0xF0 /* subtype mask */ |
| 653 | #define FC_SUBTYPE_SHIFT 4 /* subtype shift */ |
| 654 | #define FC_TODS 0x100 /* to DS */ |
| 655 | #define FC_TODS_SHIFT 8 /* to DS shift */ |
| 656 | #define FC_FROMDS 0x200 /* from DS */ |
| 657 | #define FC_FROMDS_SHIFT 9 /* from DS shift */ |
| 658 | #define FC_MOREFRAG 0x400 /* more frag. */ |
| 659 | #define FC_MOREFRAG_SHIFT 10 /* more frag. shift */ |
| 660 | #define FC_RETRY 0x800 /* retry */ |
| 661 | #define FC_RETRY_SHIFT 11 /* retry shift */ |
| 662 | #define FC_PM 0x1000 /* PM */ |
| 663 | #define FC_PM_SHIFT 12 /* PM shift */ |
| 664 | #define FC_MOREDATA 0x2000 /* more data */ |
| 665 | #define FC_MOREDATA_SHIFT 13 /* more data shift */ |
| 666 | #define FC_WEP 0x4000 /* WEP */ |
| 667 | #define FC_WEP_SHIFT 14 /* WEP shift */ |
| 668 | #define FC_ORDER 0x8000 /* order */ |
| 669 | #define FC_ORDER_SHIFT 15 /* order shift */ |
| 670 | |
| 671 | /* sequence control macros */ |
| 672 | #define SEQNUM_SHIFT 4 /* seq. number shift */ |
| 673 | #define SEQNUM_MAX 0x1000 /* max seqnum + 1 */ |
| 674 | #define FRAGNUM_MASK 0xF /* frag. number mask */ |
| 675 | |
| 676 | /* Frame Control type/subtype defs */ |
| 677 | |
| 678 | /* FC Types */ |
| 679 | #define FC_TYPE_MNG 0 /* management type */ |
| 680 | #define FC_TYPE_CTL 1 /* control type */ |
| 681 | #define FC_TYPE_DATA 2 /* data type */ |
| 682 | |
| 683 | /* Management Subtypes */ |
| 684 | #define FC_SUBTYPE_ASSOC_REQ 0 /* assoc. request */ |
| 685 | #define FC_SUBTYPE_ASSOC_RESP 1 /* assoc. response */ |
| 686 | #define FC_SUBTYPE_REASSOC_REQ 2 /* reassoc. request */ |
| 687 | #define FC_SUBTYPE_REASSOC_RESP 3 /* reassoc. response */ |
| 688 | #define FC_SUBTYPE_PROBE_REQ 4 /* probe request */ |
| 689 | #define FC_SUBTYPE_PROBE_RESP 5 /* probe response */ |
| 690 | #define FC_SUBTYPE_BEACON 8 /* beacon */ |
| 691 | #define FC_SUBTYPE_ATIM 9 /* ATIM */ |
| 692 | #define FC_SUBTYPE_DISASSOC 10 /* disassoc. */ |
| 693 | #define FC_SUBTYPE_AUTH 11 /* authentication */ |
| 694 | #define FC_SUBTYPE_DEAUTH 12 /* de-authentication */ |
| 695 | #define FC_SUBTYPE_ACTION 13 /* action */ |
| 696 | #define FC_SUBTYPE_ACTION_NOACK 14 /* action no-ack */ |
| 697 | |
| 698 | /* Control Subtypes */ |
| 699 | #define FC_SUBTYPE_CTL_WRAPPER 7 /* Control Wrapper */ |
| 700 | #define FC_SUBTYPE_BLOCKACK_REQ 8 /* Block Ack Req */ |
| 701 | #define FC_SUBTYPE_BLOCKACK 9 /* Block Ack */ |
| 702 | #define FC_SUBTYPE_PS_POLL 10 /* PS poll */ |
| 703 | #define FC_SUBTYPE_RTS 11 /* RTS */ |
| 704 | #define FC_SUBTYPE_CTS 12 /* CTS */ |
| 705 | #define FC_SUBTYPE_ACK 13 /* ACK */ |
| 706 | #define FC_SUBTYPE_CF_END 14 /* CF-END */ |
| 707 | #define FC_SUBTYPE_CF_END_ACK 15 /* CF-END ACK */ |
| 708 | |
| 709 | /* Data Subtypes */ |
| 710 | #define FC_SUBTYPE_DATA 0 /* Data */ |
| 711 | #define FC_SUBTYPE_DATA_CF_ACK 1 /* Data + CF-ACK */ |
| 712 | #define FC_SUBTYPE_DATA_CF_POLL 2 /* Data + CF-Poll */ |
| 713 | #define FC_SUBTYPE_DATA_CF_ACK_POLL 3 /* Data + CF-Ack + CF-Poll */ |
| 714 | #define FC_SUBTYPE_NULL 4 /* Null */ |
| 715 | #define FC_SUBTYPE_CF_ACK 5 /* CF-Ack */ |
| 716 | #define FC_SUBTYPE_CF_POLL 6 /* CF-Poll */ |
| 717 | #define FC_SUBTYPE_CF_ACK_POLL 7 /* CF-Ack + CF-Poll */ |
| 718 | #define FC_SUBTYPE_QOS_DATA 8 /* QoS Data */ |
| 719 | #define FC_SUBTYPE_QOS_DATA_CF_ACK 9 /* QoS Data + CF-Ack */ |
| 720 | #define FC_SUBTYPE_QOS_DATA_CF_POLL 10 /* QoS Data + CF-Poll */ |
| 721 | #define FC_SUBTYPE_QOS_DATA_CF_ACK_POLL 11 /* QoS Data + CF-Ack + CF-Poll */ |
| 722 | #define FC_SUBTYPE_QOS_NULL 12 /* QoS Null */ |
| 723 | #define FC_SUBTYPE_QOS_CF_POLL 14 /* QoS CF-Poll */ |
| 724 | #define FC_SUBTYPE_QOS_CF_ACK_POLL 15 /* QoS CF-Ack + CF-Poll */ |
| 725 | |
| 726 | /* Data Subtype Groups */ |
| 727 | #define FC_SUBTYPE_ANY_QOS(s) (((s) & 8) != 0) |
| 728 | #define FC_SUBTYPE_ANY_NULL(s) (((s) & 4) != 0) |
| 729 | #define FC_SUBTYPE_ANY_CF_POLL(s) (((s) & 2) != 0) |
| 730 | #define FC_SUBTYPE_ANY_CF_ACK(s) (((s) & 1) != 0) |
| 731 | |
| 732 | /* Type/Subtype Combos */ |
| 733 | #define FC_KIND_MASK (FC_TYPE_MASK | FC_SUBTYPE_MASK) /* FC kind mask */ |
| 734 | |
| 735 | #define FC_KIND(t, s) (((t) << FC_TYPE_SHIFT) | ((s) << FC_SUBTYPE_SHIFT)) /* FC kind */ |
| 736 | |
| 737 | #define FC_SUBTYPE(fc) (((fc) & FC_SUBTYPE_MASK) >> FC_SUBTYPE_SHIFT) /* Subtype from FC */ |
| 738 | #define FC_TYPE(fc) (((fc) & FC_TYPE_MASK) >> FC_TYPE_SHIFT) /* Type from FC */ |
| 739 | |
| 740 | #define FC_ASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_REQ) /* assoc. request */ |
| 741 | #define FC_ASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ASSOC_RESP) /* assoc. response */ |
| 742 | #define FC_REASSOC_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_REQ) /* reassoc. request */ |
| 743 | #define FC_REASSOC_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_REASSOC_RESP) /* reassoc. response */ |
| 744 | #define FC_PROBE_REQ FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_REQ) /* probe request */ |
| 745 | #define FC_PROBE_RESP FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_PROBE_RESP) /* probe response */ |
| 746 | #define FC_BEACON FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_BEACON) /* beacon */ |
| 747 | #define FC_DISASSOC FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DISASSOC) /* disassoc */ |
| 748 | #define FC_AUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_AUTH) /* authentication */ |
| 749 | #define FC_DEAUTH FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_DEAUTH) /* deauthentication */ |
| 750 | #define FC_ACTION FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION) /* action */ |
| 751 | #define FC_ACTION_NOACK FC_KIND(FC_TYPE_MNG, FC_SUBTYPE_ACTION_NOACK) /* action no-ack */ |
| 752 | |
| 753 | #define FC_CTL_WRAPPER FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTL_WRAPPER) /* Control Wrapper */ |
| 754 | #define FC_BLOCKACK_REQ FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK_REQ) /* Block Ack Req */ |
| 755 | #define FC_BLOCKACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_BLOCKACK) /* Block Ack */ |
| 756 | #define FC_PS_POLL FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_PS_POLL) /* PS poll */ |
| 757 | #define FC_RTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_RTS) /* RTS */ |
| 758 | #define FC_CTS FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CTS) /* CTS */ |
| 759 | #define FC_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_ACK) /* ACK */ |
| 760 | #define FC_CF_END FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END) /* CF-END */ |
| 761 | #define FC_CF_END_ACK FC_KIND(FC_TYPE_CTL, FC_SUBTYPE_CF_END_ACK) /* CF-END ACK */ |
| 762 | |
| 763 | #define FC_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA) /* data */ |
| 764 | #define FC_NULL_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_NULL) /* null data */ |
| 765 | #define FC_DATA_CF_ACK FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_DATA_CF_ACK) /* data CF ACK */ |
| 766 | #define FC_QOS_DATA FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_DATA) /* QoS data */ |
| 767 | #define FC_QOS_NULL FC_KIND(FC_TYPE_DATA, FC_SUBTYPE_QOS_NULL) /* QoS null */ |
| 768 | |
| 769 | /* QoS Control Field */ |
| 770 | |
| 771 | /* 802.1D Priority */ |
| 772 | #define QOS_PRIO_SHIFT 0 /* QoS priority shift */ |
| 773 | #define QOS_PRIO_MASK 0x0007 /* QoS priority mask */ |
| 774 | #define QOS_PRIO(qos) (((qos) & QOS_PRIO_MASK) >> QOS_PRIO_SHIFT) /* QoS priority */ |
| 775 | |
| 776 | /* Traffic Identifier */ |
| 777 | #define QOS_TID_SHIFT 0 /* QoS TID shift */ |
| 778 | #define QOS_TID_MASK 0x000f /* QoS TID mask */ |
| 779 | #define QOS_TID(qos) (((qos) & QOS_TID_MASK) >> QOS_TID_SHIFT) /* QoS TID */ |
| 780 | |
| 781 | /* End of Service Period (U-APSD) */ |
| 782 | #define QOS_EOSP_SHIFT 4 /* QoS End of Service Period shift */ |
| 783 | #define QOS_EOSP_MASK 0x0010 /* QoS End of Service Period mask */ |
| 784 | #define QOS_EOSP(qos) (((qos) & QOS_EOSP_MASK) >> QOS_EOSP_SHIFT) /* Qos EOSP */ |
| 785 | |
| 786 | /* Ack Policy */ |
| 787 | #define QOS_ACK_NORMAL_ACK 0 /* Normal Ack */ |
| 788 | #define QOS_ACK_NO_ACK 1 /* No Ack (eg mcast) */ |
| 789 | #define QOS_ACK_NO_EXP_ACK 2 /* No Explicit Ack */ |
| 790 | #define QOS_ACK_BLOCK_ACK 3 /* Block Ack */ |
| 791 | #define QOS_ACK_SHIFT 5 /* QoS ACK shift */ |
| 792 | #define QOS_ACK_MASK 0x0060 /* QoS ACK mask */ |
| 793 | #define QOS_ACK(qos) (((qos) & QOS_ACK_MASK) >> QOS_ACK_SHIFT) /* QoS ACK */ |
| 794 | |
| 795 | /* A-MSDU flag */ |
| 796 | #define QOS_AMSDU_SHIFT 7 /* AMSDU shift */ |
| 797 | #define QOS_AMSDU_MASK 0x0080 /* AMSDU mask */ |
| 798 | |
| 799 | /* Management Frames */ |
| 800 | |
| 801 | /* Management Frame Constants */ |
| 802 | |
| 803 | /* Fixed fields */ |
| 804 | #define DOT11_MNG_AUTH_ALGO_LEN 2 /* d11 management auth. algo. length */ |
| 805 | #define DOT11_MNG_AUTH_SEQ_LEN 2 /* d11 management auth. seq. length */ |
| 806 | #define DOT11_MNG_BEACON_INT_LEN 2 /* d11 management beacon interval length */ |
| 807 | #define DOT11_MNG_CAP_LEN 2 /* d11 management cap. length */ |
| 808 | #define DOT11_MNG_AP_ADDR_LEN 6 /* d11 management AP address length */ |
| 809 | #define DOT11_MNG_LISTEN_INT_LEN 2 /* d11 management listen interval length */ |
| 810 | #define DOT11_MNG_REASON_LEN 2 /* d11 management reason length */ |
| 811 | #define DOT11_MNG_AID_LEN 2 /* d11 management AID length */ |
| 812 | #define DOT11_MNG_STATUS_LEN 2 /* d11 management status length */ |
| 813 | #define DOT11_MNG_TIMESTAMP_LEN 8 /* d11 management timestamp length */ |
| 814 | |
| 815 | /* DUR/ID field in assoc resp is 0xc000 | AID */ |
| 816 | #define DOT11_AID_MASK 0x3fff /* d11 AID mask */ |
| 817 | |
| 818 | /* Reason Codes */ |
| 819 | #define DOT11_RC_RESERVED 0 /* d11 RC reserved */ |
| 820 | #define DOT11_RC_UNSPECIFIED 1 /* Unspecified reason */ |
| 821 | #define DOT11_RC_AUTH_INVAL 2 /* Previous authentication no longer valid */ |
| 822 | #define DOT11_RC_DEAUTH_LEAVING 3 /* Deauthenticated because sending station |
| 823 | * is leaving (or has left) IBSS or ESS |
| 824 | */ |
| 825 | #define DOT11_RC_INACTIVITY 4 /* Disassociated due to inactivity */ |
| 826 | #define DOT11_RC_BUSY 5 /* Disassociated because AP is unable to handle |
| 827 | * all currently associated stations |
| 828 | */ |
| 829 | #define DOT11_RC_INVAL_CLASS_2 6 /* Class 2 frame received from |
| 830 | * nonauthenticated station |
| 831 | */ |
| 832 | #define DOT11_RC_INVAL_CLASS_3 7 /* Class 3 frame received from |
| 833 | * nonassociated station |
| 834 | */ |
| 835 | #define DOT11_RC_DISASSOC_LEAVING 8 /* Disassociated because sending station is |
| 836 | * leaving (or has left) BSS |
| 837 | */ |
| 838 | #define DOT11_RC_NOT_AUTH 9 /* Station requesting (re)association is not |
| 839 | * authenticated with responding station |
| 840 | */ |
| 841 | #define DOT11_RC_BAD_PC 10 /* Unacceptable power capability element */ |
| 842 | #define DOT11_RC_BAD_CHANNELS 11 /* Unacceptable supported channels element */ |
| 843 | /* 12 is unused */ |
| 844 | |
| 845 | /* 32-39 are QSTA specific reasons added in 11e */ |
| 846 | #define DOT11_RC_UNSPECIFIED_QOS 32 /* unspecified QoS-related reason */ |
| 847 | #define DOT11_RC_INSUFFCIENT_BW 33 /* QAP lacks sufficient bandwidth */ |
| 848 | #define DOT11_RC_EXCESSIVE_FRAMES 34 /* excessive number of frames need ack */ |
| 849 | #define DOT11_RC_TX_OUTSIDE_TXOP 35 /* transmitting outside the limits of txop */ |
| 850 | #define DOT11_RC_LEAVING_QBSS 36 /* QSTA is leaving the QBSS (or restting) */ |
| 851 | #define DOT11_RC_BAD_MECHANISM 37 /* does not want to use the mechanism */ |
| 852 | #define DOT11_RC_SETUP_NEEDED 38 /* mechanism needs a setup */ |
| 853 | #define DOT11_RC_TIMEOUT 39 /* timeout */ |
| 854 | |
| 855 | #define DOT11_RC_MAX 23 /* Reason codes > 23 are reserved */ |
| 856 | |
| 857 | /* Status Codes */ |
| 858 | #define DOT11_SC_SUCCESS 0 /* Successful */ |
| 859 | #define DOT11_SC_FAILURE 1 /* Unspecified failure */ |
| 860 | #define DOT11_SC_CAP_MISMATCH 10 /* Cannot support all requested |
| 861 | * capabilities in the Capability |
| 862 | * Information field |
| 863 | */ |
| 864 | #define DOT11_SC_REASSOC_FAIL 11 /* Reassociation denied due to inability |
| 865 | * to confirm that association exists |
| 866 | */ |
| 867 | #define DOT11_SC_ASSOC_FAIL 12 /* Association denied due to reason |
| 868 | * outside the scope of this standard |
| 869 | */ |
| 870 | #define DOT11_SC_AUTH_MISMATCH 13 /* Responding station does not support |
| 871 | * the specified authentication |
| 872 | * algorithm |
| 873 | */ |
| 874 | #define DOT11_SC_AUTH_SEQ 14 /* Received an Authentication frame |
| 875 | * with authentication transaction |
| 876 | * sequence number out of expected |
| 877 | * sequence |
| 878 | */ |
| 879 | #define DOT11_SC_AUTH_CHALLENGE_FAIL 15 /* Authentication rejected because of |
| 880 | * challenge failure |
| 881 | */ |
| 882 | #define DOT11_SC_AUTH_TIMEOUT 16 /* Authentication rejected due to timeout |
| 883 | * waiting for next frame in sequence |
| 884 | */ |
| 885 | #define DOT11_SC_ASSOC_BUSY_FAIL 17 /* Association denied because AP is |
| 886 | * unable to handle additional |
| 887 | * associated stations |
| 888 | */ |
| 889 | #define DOT11_SC_ASSOC_RATE_MISMATCH 18 /* Association denied due to requesting |
| 890 | * station not supporting all of the |
| 891 | * data rates in the BSSBasicRateSet |
| 892 | * parameter |
| 893 | */ |
| 894 | #define DOT11_SC_ASSOC_SHORT_REQUIRED 19 /* Association denied due to requesting |
| 895 | * station not supporting the Short |
| 896 | * Preamble option |
| 897 | */ |
| 898 | #define DOT11_SC_ASSOC_PBCC_REQUIRED 20 /* Association denied due to requesting |
| 899 | * station not supporting the PBCC |
| 900 | * Modulation option |
| 901 | */ |
| 902 | #define DOT11_SC_ASSOC_AGILITY_REQUIRED 21 /* Association denied due to requesting |
| 903 | * station not supporting the Channel |
| 904 | * Agility option |
| 905 | */ |
| 906 | #define DOT11_SC_ASSOC_SPECTRUM_REQUIRED 22 /* Association denied because Spectrum |
| 907 | * Management capability is required. |
| 908 | */ |
| 909 | #define DOT11_SC_ASSOC_BAD_POWER_CAP 23 /* Association denied because the info |
| 910 | * in the Power Cap element is |
| 911 | * unacceptable. |
| 912 | */ |
| 913 | #define DOT11_SC_ASSOC_BAD_SUP_CHANNELS 24 /* Association denied because the info |
| 914 | * in the Supported Channel element is |
| 915 | * unacceptable |
| 916 | */ |
| 917 | #define DOT11_SC_ASSOC_SHORTSLOT_REQUIRED 25 /* Association denied due to requesting |
| 918 | * station not supporting the Short Slot |
| 919 | * Time option |
| 920 | */ |
| 921 | #define DOT11_SC_ASSOC_ERPBCC_REQUIRED 26 /* Association denied due to requesting |
| 922 | * station not supporting the ER-PBCC |
| 923 | * Modulation option |
| 924 | */ |
| 925 | #define DOT11_SC_ASSOC_DSSOFDM_REQUIRED 27 /* Association denied due to requesting |
| 926 | * station not supporting the DSS-OFDM |
| 927 | * option |
| 928 | */ |
| 929 | |
| 930 | #define DOT11_SC_DECLINED 37 /* request declined */ |
| 931 | #define DOT11_SC_INVALID_PARAMS 38 /* One or more params have invalid values */ |
| 932 | |
| 933 | /* Info Elts, length of INFORMATION portion of Info Elts */ |
| 934 | #define DOT11_MNG_DS_PARAM_LEN 1 /* d11 management DS parameter length */ |
| 935 | #define DOT11_MNG_IBSS_PARAM_LEN 2 /* d11 management IBSS parameter length */ |
| 936 | |
| 937 | /* TIM Info element has 3 bytes fixed info in INFORMATION field, |
| 938 | * followed by 1 to 251 bytes of Partial Virtual Bitmap |
| 939 | */ |
| 940 | #define DOT11_MNG_TIM_FIXED_LEN 3 /* d11 management TIM fixed length */ |
| 941 | #define DOT11_MNG_TIM_DTIM_COUNT 0 /* d11 management DTIM count */ |
| 942 | #define DOT11_MNG_TIM_DTIM_PERIOD 1 /* d11 management DTIM period */ |
| 943 | #define DOT11_MNG_TIM_BITMAP_CTL 2 /* d11 management TIM BITMAP control */ |
| 944 | #define DOT11_MNG_TIM_PVB 3 /* d11 management TIM PVB */ |
| 945 | |
| 946 | /* TLV defines */ |
| 947 | #define TLV_TAG_OFF 0 /* tag offset */ |
| 948 | #define TLV_LEN_OFF 1 /* length offset */ |
| 949 | #define TLV_HDR_LEN 2 /* header length */ |
| 950 | #define TLV_BODY_OFF 2 /* body offset */ |
| 951 | |
| 952 | /* Management Frame Information Element IDs */ |
| 953 | #define DOT11_MNG_SSID_ID 0 /* d11 management SSID id */ |
| 954 | #define DOT11_MNG_RATES_ID 1 /* d11 management rates id */ |
| 955 | #define DOT11_MNG_FH_PARMS_ID 2 /* d11 management FH parameter id */ |
| 956 | #define DOT11_MNG_DS_PARMS_ID 3 /* d11 management DS parameter id */ |
| 957 | #define DOT11_MNG_CF_PARMS_ID 4 /* d11 management CF parameter id */ |
| 958 | #define DOT11_MNG_TIM_ID 5 /* d11 management TIM id */ |
| 959 | #define DOT11_MNG_IBSS_PARMS_ID 6 /* d11 management IBSS parameter id */ |
| 960 | #define DOT11_MNG_COUNTRY_ID 7 /* d11 management country id */ |
| 961 | #define DOT11_MNG_HOPPING_PARMS_ID 8 /* d11 management hopping parameter id */ |
| 962 | #define DOT11_MNG_HOPPING_TABLE_ID 9 /* d11 management hopping table id */ |
| 963 | #define DOT11_MNG_REQUEST_ID 10 /* d11 management request id */ |
| 964 | #define DOT11_MNG_QBSS_LOAD_ID 11 /* d11 management QBSS Load id */ |
| 965 | #define DOT11_MNG_CHALLENGE_ID 16 /* d11 management chanllenge id */ |
| 966 | #define DOT11_MNG_PWR_CONSTRAINT_ID 32 /* 11H PowerConstraint */ |
| 967 | #define DOT11_MNG_PWR_CAP_ID 33 /* 11H PowerCapability */ |
| 968 | #define DOT11_MNG_TPC_REQUEST_ID 34 /* 11H TPC Request */ |
| 969 | #define DOT11_MNG_TPC_REPORT_ID 35 /* 11H TPC Report */ |
| 970 | #define DOT11_MNG_SUPP_CHANNELS_ID 36 /* 11H Supported Channels */ |
| 971 | #define DOT11_MNG_CHANNEL_SWITCH_ID 37 /* 11H ChannelSwitch Announcement */ |
| 972 | #define DOT11_MNG_MEASURE_REQUEST_ID 38 /* 11H MeasurementRequest */ |
| 973 | #define DOT11_MNG_MEASURE_REPORT_ID 39 /* 11H MeasurementReport */ |
| 974 | #define DOT11_MNG_QUIET_ID 40 /* 11H Quiet */ |
| 975 | #define DOT11_MNG_IBSS_DFS_ID 41 /* 11H IBSS_DFS */ |
| 976 | #define DOT11_MNG_ERP_ID 42 /* d11 management ERP id */ |
| 977 | #define DOT11_MNG_TS_DELAY_ID 43 /* d11 management TS Delay id */ |
| 978 | #define DOT11_MNG_HT_CAP 45 /* d11 mgmt HT cap id */ |
| 979 | #define DOT11_MNG_NONERP_ID 47 /* d11 management NON-ERP id */ |
| 980 | #define DOT11_MNG_RSN_ID 48 /* d11 management RSN id */ |
| 981 | #define DOT11_MNG_EXT_RATES_ID 50 /* d11 management ext. rates id */ |
| 982 | #define DOT11_MNG_EXT_CSA_ID 60 /* d11 Extended CSA */ |
| 983 | #define DOT11_MNG_HT_ADD 61 /* d11 mgmt additional HT info */ |
| 984 | #define DOT11_MNG_EXT_CHANNEL_OFFSET 62 /* d11 mgmt ext channel offset */ |
| 985 | #define DOT11_MNG_EXT_CAP 127 /* d11 mgmt ext capability */ |
| 986 | #define DOT11_MNG_WPA_ID 221 /* d11 management WPA id */ |
| 987 | #define DOT11_MNG_PROPR_ID 221 /* d11 management proprietary id */ |
| 988 | |
| 989 | /* Rate element Basic flag and rate mask */ |
| 990 | #define DOT11_RATE_BASIC 0x80 /* flag for a Basic Rate */ |
| 991 | #define DOT11_RATE_MASK 0x7F /* mask for numeric part of rate */ |
| 992 | |
| 993 | /* ERP info element bit values */ |
| 994 | #define DOT11_MNG_ERP_LEN 1 /* ERP is currently 1 byte long */ |
| 995 | #define DOT11_MNG_NONERP_PRESENT 0x01 /* NonERP (802.11b) STAs are present |
| 996 | *in the BSS |
| 997 | */ |
| 998 | #define DOT11_MNG_USE_PROTECTION 0x02 /* Use protection mechanisms for |
| 999 | *ERP-OFDM frames |
| 1000 | */ |
| 1001 | #define DOT11_MNG_BARKER_PREAMBLE 0x04 /* Short Preambles: 0 == allowed, |
| 1002 | * 1 == not allowed |
| 1003 | */ |
| 1004 | /* TS Delay element offset & size */ |
| 1005 | #define DOT11_MGN_TS_DELAY_LEN 4 /* length of TS DELAY IE */ |
| 1006 | #define TS_DELAY_FIELD_SIZE 4 /* TS DELAY field size */ |
| 1007 | |
| 1008 | /* Capability Information Field */ |
| 1009 | #define DOT11_CAP_ESS 0x0001 /* d11 cap. ESS */ |
| 1010 | #define DOT11_CAP_IBSS 0x0002 /* d11 cap. IBSS */ |
| 1011 | #define DOT11_CAP_POLLABLE 0x0004 /* d11 cap. pollable */ |
| 1012 | #define DOT11_CAP_POLL_RQ 0x0008 /* d11 cap. poll request */ |
| 1013 | #define DOT11_CAP_PRIVACY 0x0010 /* d11 cap. privacy */ |
| 1014 | #define DOT11_CAP_SHORT 0x0020 /* d11 cap. short */ |
| 1015 | #define DOT11_CAP_PBCC 0x0040 /* d11 cap. PBCC */ |
| 1016 | #define DOT11_CAP_AGILITY 0x0080 /* d11 cap. agility */ |
| 1017 | #define DOT11_CAP_SPECTRUM 0x0100 /* d11 cap. spectrum */ |
| 1018 | #define DOT11_CAP_SHORTSLOT 0x0400 /* d11 cap. shortslot */ |
| 1019 | #define DOT11_CAP_CCK_OFDM 0x2000 /* d11 cap. CCK/OFDM */ |
| 1020 | |
| 1021 | /* Extended Capability Information Field */ |
| 1022 | #define DOT11_EXT_CAP_HT_IE_SUPPORT 0x01 /* support for info xchg action frame */ |
| 1023 | |
| 1024 | /* Action Frame Constants */ |
| 1025 | #define DOT11_ACTION_HDR_LEN 2 /* action frame header length */ |
| 1026 | #define DOT11_ACTION_CAT_ERR_MASK 0x80 /* d11 action category error mask */ |
| 1027 | #define DOT11_ACTION_CAT_MASK 0x7F /* d11 action category mask */ |
| 1028 | #define DOT11_ACTION_CAT_SPECT_MNG 0x00 /* d11 action category spectrum management */ |
| 1029 | #define DOT11_ACTION_CAT_BLOCKACK 0x03 /* d11 action category block ack */ |
| 1030 | #define DOT11_ACTION_CAT_HT 0x07 /* d11 action category for HT */ |
| 1031 | #define DOT11_ACTION_NOTIFICATION 0x11 /* 17 */ |
| 1032 | |
| 1033 | #define DOT11_ACTION_ID_M_REQ 0 /* d11 action measurement request */ |
| 1034 | #define DOT11_ACTION_ID_M_REP 1 /* d11 action measurement response */ |
| 1035 | #define DOT11_ACTION_ID_TPC_REQ 2 /* d11 action TPC request */ |
| 1036 | #define DOT11_ACTION_ID_TPC_REP 3 /* d11 action TPC response */ |
| 1037 | #define DOT11_ACTION_ID_CHANNEL_SWITCH 4 /* d11 action channel switch */ |
| 1038 | #define DOT11_ACTION_ID_EXT_CSA 5 /* d11 extened CSA for 11n */ |
| 1039 | |
| 1040 | /* HT action ids */ |
| 1041 | #define DOT11_ACTION_ID_HT_CH_WIDTH 0 /* notify channel width action id */ |
| 1042 | #define DOT11_ACTION_ID_HT_MIMO_PS 1 /* mimo ps action id */ |
| 1043 | #define DOT11_ACTION_ID_HT_INFO_XCHG 8 /* HT Information Exchange action id */ |
| 1044 | |
| 1045 | /* Block Ack action types */ |
| 1046 | #define DOT11_BA_ACTION_ADDBA_REQ 0 /* ADDBA Req action frame type */ |
| 1047 | #define DOT11_BA_ACTION_ADDBA_RESP 1 /* ADDBA Resp action frame type */ |
| 1048 | #define DOT11_BA_ACTION_DELBA 2 /* DELBA action frame type */ |
| 1049 | |
| 1050 | /* ADDBA action parameters */ |
| 1051 | #define DOT11_ADDBA_PARAM_AMSDU_SUP 0x0001 /* AMSDU supported under BA */ |
| 1052 | #define DOT11_ADDBA_PARAM_POLICY_MASK 0x0002 /* policy mask(ack vs delayed) */ |
| 1053 | #define DOT11_ADDBA_PARAM_POLICY_SHIFT 1 /* policy shift */ |
| 1054 | #define DOT11_ADDBA_PARAM_TID_MASK 0x003c /* tid mask */ |
| 1055 | #define DOT11_ADDBA_PARAM_TID_SHIFT 2 /* tid shift */ |
| 1056 | #define DOT11_ADDBA_PARAM_BSIZE_MASK 0xffc0 /* buffer size mask */ |
| 1057 | #define DOT11_ADDBA_PARAM_BSIZE_SHIFT 6 /* buffer size shift */ |
| 1058 | |
| 1059 | #define DOT11_ADDBA_POLICY_DELAYED 0 /* delayed BA policy */ |
| 1060 | #define DOT11_ADDBA_POLICY_IMMEDIATE 1 /* immediate BA policy */ |
| 1061 | |
| 1062 | struct dot11_addba_req { |
| 1063 | uint8 category; /* category of action frame (3) */ |
| 1064 | uint8 action; /* action: addba req */ |
| 1065 | uint8 token; /* identifier */ |
| 1066 | uint16 addba_param_set; /* parameter set */ |
| 1067 | uint16 timeout; /* timeout in seconds */ |
| 1068 | uint16 start_seqnum; /* starting sequence number */ |
| 1069 | }PACKED; |
| 1070 | typedef struct dot11_addba_req dot11_addba_req_t; |
| 1071 | #define DOT11_ADDBA_REQ_LEN 9 /* length of addba req frame */ |
| 1072 | |
| 1073 | struct dot11_addba_resp { |
| 1074 | uint8 category; /* category of action frame (3) */ |
| 1075 | uint8 action; /* action: addba resp */ |
| 1076 | uint8 token; /* identifier */ |
| 1077 | uint16 status; /* status of add request */ |
| 1078 | uint16 addba_param_set; /* negotiated parameter set */ |
| 1079 | uint16 timeout; /* negotiated timeout in seconds */ |
| 1080 | }PACKED; |
| 1081 | typedef struct dot11_addba_resp dot11_addba_resp_t; |
| 1082 | #define DOT11_ADDBA_RESP_LEN 9 /* length of addba resp frame */ |
| 1083 | |
| 1084 | /* DELBA action parameters */ |
| 1085 | #define DOT11_DELBA_PARAM_INIT_MASK 0x0800 /* initiator mask */ |
| 1086 | #define DOT11_DELBA_PARAM_INIT_SHIFT 11 /* initiator shift */ |
| 1087 | #define DOT11_DELBA_PARAM_TID_MASK 0xf000 /* tid mask */ |
| 1088 | #define DOT11_DELBA_PARAM_TID_SHIFT 12 /* tid shift */ |
| 1089 | |
| 1090 | struct dot11_delba { |
| 1091 | uint8 category; /* category of action frame (3) */ |
| 1092 | uint8 action; /* action: addba req */ |
| 1093 | uint16 delba_param_set; /* paarmeter set */ |
| 1094 | uint16 reason; /* reason for dellba */ |
| 1095 | }PACKED; |
| 1096 | typedef struct dot11_delba dot11_delba_t; |
| 1097 | #define DOT11_DELBA_LEN 6 /* length of delba frame */ |
| 1098 | |
| 1099 | /* MLME Enumerations */ |
| 1100 | #define DOT11_BSSTYPE_INFRASTRUCTURE 0 /* d11 infrastructure */ |
| 1101 | #define DOT11_BSSTYPE_INDEPENDENT 1 /* d11 independent */ |
| 1102 | #define DOT11_BSSTYPE_ANY 2 /* d11 any BSS type */ |
| 1103 | #define DOT11_SCANTYPE_ACTIVE 0 /* d11 scan active */ |
| 1104 | #define DOT11_SCANTYPE_PASSIVE 1 /* d11 scan passive */ |
| 1105 | |
| 1106 | /* 802.11 BRCM "Compromise" Pre N constants */ |
| 1107 | #define PREN_PREAMBLE 24 /* green field preamble time */ |
| 1108 | #define PREN_MM_EXT 8 /* extra mixed mode preamble time */ |
| 1109 | #define PREN_PREAMBLE_EXT 4 /* extra preamble (multiply by unique_streams-1) */ |
| 1110 | |
| 1111 | /* 802.11 N PHY constants */ |
| 1112 | #define NPHY_RIFS_TIME 2 /* NPHY RIFS time */ |
| 1113 | |
| 1114 | /* 802.11 A PHY constants */ |
| 1115 | #define APHY_SLOT_TIME 9 /* APHY slot time */ |
| 1116 | #define APHY_SIFS_TIME 16 /* APHY SIFS time */ |
| 1117 | #define APHY_DIFS_TIME (APHY_SIFS_TIME + (2 * APHY_SLOT_TIME)) /* APHY DIFS time */ |
| 1118 | #define APHY_PREAMBLE_TIME 16 /* APHY preamble time */ |
| 1119 | #define APHY_SIGNAL_TIME 4 /* APHY signal time */ |
| 1120 | #define APHY_SYMBOL_TIME 4 /* APHY symbol time */ |
| 1121 | #define APHY_SERVICE_NBITS 16 /* APHY service nbits */ |
| 1122 | #define APHY_TAIL_NBITS 6 /* APHY tail nbits */ |
| 1123 | #define APHY_CWMIN 15 /* APHY cwmin */ |
| 1124 | |
| 1125 | /* 802.11 B PHY constants */ |
| 1126 | #define BPHY_SLOT_TIME 20 /* BPHY slot time */ |
| 1127 | #define BPHY_SIFS_TIME 10 /* BPHY SIFS time */ |
| 1128 | #define BPHY_DIFS_TIME 50 /* BPHY DIFS time */ |
| 1129 | #define BPHY_PLCP_TIME 192 /* BPHY PLCP time */ |
| 1130 | #define BPHY_PLCP_SHORT_TIME 96 /* BPHY PLCP short time */ |
| 1131 | #define BPHY_CWMIN 31 /* BPHY cwmin */ |
| 1132 | |
| 1133 | /* 802.11 G constants */ |
| 1134 | #define DOT11_OFDM_SIGNAL_EXTENSION 6 /* d11 OFDM signal extension */ |
| 1135 | |
| 1136 | #define PHY_CWMAX 1023 /* PHY cwmax */ |
| 1137 | |
| 1138 | #define DOT11_MAXNUMFRAGS 16 /* max # fragments per MSDU */ |
| 1139 | |
| 1140 | /* dot11Counters Table - 802.11 spec., Annex D */ |
| 1141 | typedef struct d11cnt { |
| 1142 | uint32 txfrag; /* dot11TransmittedFragmentCount */ |
| 1143 | uint32 txmulti; /* dot11MulticastTransmittedFrameCount */ |
| 1144 | uint32 txfail; /* dot11FailedCount */ |
| 1145 | uint32 txretry; /* dot11RetryCount */ |
| 1146 | uint32 txretrie; /* dot11MultipleRetryCount */ |
| 1147 | uint32 rxdup; /* dot11FrameduplicateCount */ |
| 1148 | uint32 txrts; /* dot11RTSSuccessCount */ |
| 1149 | uint32 txnocts; /* dot11RTSFailureCount */ |
| 1150 | uint32 txnoack; /* dot11ACKFailureCount */ |
| 1151 | uint32 rxfrag; /* dot11ReceivedFragmentCount */ |
| 1152 | uint32 rxmulti; /* dot11MulticastReceivedFrameCount */ |
| 1153 | uint32 rxcrc; /* dot11FCSErrorCount */ |
| 1154 | uint32 txfrmsnt; /* dot11TransmittedFrameCount */ |
| 1155 | uint32 rxundec; /* dot11WEPUndecryptableCount */ |
| 1156 | } d11cnt_t; |
| 1157 | |
| 1158 | /* BRCM OUI */ |
| 1159 | #define BRCM_OUI "\x00\x10\x18" /* Broadcom OUI */ |
| 1160 | |
| 1161 | /* OUI for BRCM proprietary IE */ |
| 1162 | #define BRCM_PROP_OUI "\x00\x90\x4C" /* Broadcom proprietary OUI */ |
| 1163 | |
| 1164 | /* BRCM info element */ |
| 1165 | struct brcm_ie { |
| 1166 | uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ |
| 1167 | uint8 len; /* IE length */ |
| 1168 | uint8 oui[3]; /* Proprietary OUI, BRCM_OUI */ |
| 1169 | uint8 ver; /* type/ver of this IE */ |
| 1170 | uint8 assoc; /* # of assoc STAs */ |
| 1171 | uint8 flags; /* misc flags */ |
| 1172 | uint8 flags1; /* misc flags */ |
| 1173 | uint16 amsdu_mtu_pref; /* preferred A-MSDU MTU */ |
| 1174 | } PACKED; |
| 1175 | typedef struct brcm_ie brcm_ie_t; |
| 1176 | #define BRCM_IE_LEN 11 /* BRCM IE length */ |
| 1177 | #define BRCM_IE_VER 2 /* BRCM IE version */ |
| 1178 | #define BRCM_IE_LEGACY_AES_VER 1 /* BRCM IE legacy AES version */ |
| 1179 | |
| 1180 | /* brcm_ie flags */ |
| 1181 | #define BRF_ABCAP 0x1 /* afterburner capable */ |
| 1182 | #define BRF_ABRQRD 0x2 /* afterburner requested */ |
| 1183 | #define BRF_LZWDS 0x4 /* lazy wds enabled */ |
| 1184 | #define BRF_BLOCKACK 0x8 /* BlockACK capable */ |
| 1185 | #define BRF_ABCOUNTER_MASK 0xf0 /* afterburner wds "state" counter */ |
| 1186 | #define BRF_ABCOUNTER_SHIFT 4 /* offset of afterburner wds "state" counter */ |
| 1187 | |
| 1188 | /* brcm_ie flags1 */ |
| 1189 | #define BRF1_AMSDU 0x1 /* A-MSDU capable */ |
| 1190 | #define BRF1_DPT 0x2 /* DPT capable */ |
| 1191 | |
| 1192 | #define AB_WDS_TIMEOUT_MAX 15 /* afterburner wds Max count indicating not |
| 1193 | * locally capable |
| 1194 | */ |
| 1195 | #define AB_WDS_TIMEOUT_MIN 1 /* afterburner wds, use zero count as indicating |
| 1196 | * "downrev" |
| 1197 | */ |
| 1198 | |
| 1199 | /* EWC definitions */ |
| 1200 | #define MCSSET_LEN 16 /* 16-bits per 8-bit set to give 128-bits bitmap of MCS Index */ |
| 1201 | #define MAX_MCS_NUM (128) /* max mcs number = 128 */ |
| 1202 | |
| 1203 | struct ewc_cap_ie { |
| 1204 | uint16 cap; |
| 1205 | uint8 params; |
| 1206 | uint8 supp_mcs[MCSSET_LEN]; |
| 1207 | uint16 ext_htcap; |
| 1208 | uint32 txbf_cap; |
| 1209 | uint8 as_cap; |
| 1210 | } PACKED; |
| 1211 | typedef struct ewc_cap_ie ewc_cap_ie_t; |
| 1212 | |
| 1213 | /* CAP IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */ |
| 1214 | /* the capability IE is primarily used to convey this nodes abilities */ |
| 1215 | struct ewc_prop_cap_ie { |
| 1216 | uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ |
| 1217 | uint8 len; /* IE length */ |
| 1218 | uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ |
| 1219 | uint8 type; /* type inidicates what follows */ |
| 1220 | ewc_cap_ie_t cap_ie; |
| 1221 | } PACKED; |
| 1222 | typedef struct ewc_prop_cap_ie ewc_prop_cap_ie_t; |
| 1223 | #define EWC_PROP_IE_OVERHEAD 4 /* overhead bytes for prop oui ie */ |
| 1224 | #define EWC_CAP_IE_LEN 26 |
| 1225 | #define EWC_CAP_IE_TYPE 51 |
| 1226 | |
| 1227 | #define EWC_CAP_LDPC_CODING 0x0001 /* Support for rx of LDPC coded pkts */ |
| 1228 | #define EWC_CAP_40MHZ 0x0002 /* FALSE:20Mhz, TRUE:20/40MHZ supported */ |
| 1229 | #define EWC_CAP_MIMO_PS_MASK 0x000C /* Mimo PS mask */ |
| 1230 | #define EWC_CAP_MIMO_PS_SHIFT 0x0002 /* Mimo PS shift */ |
| 1231 | #define EWC_CAP_MIMO_PS_OFF 0x0003 /* Mimo PS, no restriction */ |
| 1232 | #define EWC_CAP_MIMO_PS_RTS 0x0001 /* Mimo PS, send RTS/CTS around MIMO frames */ |
| 1233 | #define EWC_CAP_MIMO_PS_ON 0x0000 /* Mimo PS, MIMO disallowed */ |
| 1234 | #define EWC_CAP_GF 0x0010 /* Greenfield preamble support */ |
| 1235 | #define EWC_CAP_SHORT_GI_20 0x0020 /* 20MHZ short guard interval support */ |
| 1236 | #define EWC_CAP_SHORT_GI_40 0x0040 /* 40Mhz short guard interval support */ |
| 1237 | #define EWC_CAP_TX_STBC 0x0080 /* Tx STBC support */ |
| 1238 | #define EWC_CAP_RX_STBC_MASK 0x0300 /* Rx STBC mask */ |
| 1239 | #define EWC_CAP_RX_STBC_SHIFT 8 /* Rx STBC shift */ |
| 1240 | #define EWC_CAP_DELAYED_BA 0x0400 /* delayed BA support */ |
| 1241 | #define EWC_CAP_MAX_AMSDU 0x0800 /* Max AMSDU size in bytes , 0=3839, 1=7935 */ |
| 1242 | #define EWC_CAP_DSSS_CCK 0x1000 /* DSSS/CCK supported by the BSS */ |
| 1243 | #define EWC_CAP_PSMP 0x2000 /* Power Save Multi Poll support */ |
| 1244 | #define EWC_CAP_40MHZ_INTOLERANT 0x4000 /* 40MHz Intolerant */ |
| 1245 | #define EWC_CAP_LSIG_TXOP 0x8000 /* L-SIG TXOP protection support */ |
| 1246 | |
| 1247 | #define EWC_CAP_RX_STBC_NO 0x0 /* no rx STBC support */ |
| 1248 | #define EWC_CAP_RX_STBC_ONE_STREAM 0x1 /* rx STBC support of 1 spatial stream */ |
| 1249 | #define EWC_CAP_RX_STBC_TWO_STREAM 0x2 /* rx STBC support of 1-2 spatial streams */ |
| 1250 | #define EWC_CAP_RX_STBC_THREE_STREAM 0x3 /* rx STBC support of 1-3 spatial streams */ |
| 1251 | |
| 1252 | #define EWC_MAX_AMSDU 7935 /* max amsdu size (bytes) per the EWC spec */ |
| 1253 | #define EWC_MIN_AMSDU 3835 /* min amsdu size (bytes) per the EWC spec */ |
| 1254 | |
| 1255 | #define EWC_PARAMS_RX_FACTOR_MASK 0x03 /* ampdu rcv factor mask */ |
| 1256 | #define EWC_PARAMS_DENSITY_MASK 0x1C /* ampdu density mask */ |
| 1257 | #define EWC_PARAMS_DENSITY_SHIFT 2 /* ampdu density shift */ |
| 1258 | |
| 1259 | /* EWC/AMPDU specific define */ |
| 1260 | #define AMPDU_MAX_MPDU_DENSITY 7 /* max mpdu density; in 1/8 usec units */ |
| 1261 | #define AMPDU_MAX_RX_FACTOR 3 /* max rcv ampdu len (64kb) */ |
| 1262 | #define AMPDU_RX_FACTOR_BASE 8*1024 /* ampdu factor base for rx len */ |
| 1263 | #define AMPDU_DELIMITER_LEN 4 /* length of ampdu delimiter */ |
| 1264 | |
| 1265 | struct ewc_add_ie { |
| 1266 | uint8 ctl_ch; /* control channel number */ |
| 1267 | uint8 byte1; /* ext ch,rec. ch. width, RIFS support */ |
| 1268 | uint16 opmode; /* operation mode */ |
| 1269 | uint16 misc_bits; /* misc bits */ |
| 1270 | uint8 basic_mcs[MCSSET_LEN]; /* required MCS set */ |
| 1271 | } PACKED; |
| 1272 | typedef struct ewc_add_ie ewc_add_ie_t; |
| 1273 | |
| 1274 | /* ADD IE: EWC 1.0 spec. simply stole a 802.11 IE, we use our prop. IE until this is resolved */ |
| 1275 | /* the additional IE is primarily used to convey the current BSS configuration */ |
| 1276 | struct ewc_prop_add_ie { |
| 1277 | uint8 id; /* IE ID, 221, DOT11_MNG_PROPR_ID */ |
| 1278 | uint8 len; /* IE length */ |
| 1279 | uint8 oui[3]; /* Proprietary OUI, BRCM_PROP_OUI */ |
| 1280 | uint8 type; /* indicates what follows */ |
| 1281 | ewc_add_ie_t add_ie; |
| 1282 | } PACKED; |
| 1283 | typedef struct ewc_prop_add_ie ewc_prop_add_ie_t; |
| 1284 | |
| 1285 | #define EWC_ADD_IE_LEN 22 |
| 1286 | #define EWC_ADD_IE_TYPE 52 |
| 1287 | |
| 1288 | /* byte1 defn's */ |
| 1289 | #define EWC_BW_ANY 0x04 /* set, STA can use 20 or 40MHz */ |
| 1290 | #define EWC_RIFS_PERMITTED 0x08 /* RIFS allowed */ |
| 1291 | |
| 1292 | /* opmode defn's */ |
| 1293 | #define EWC_OPMODE_MASK 0x0003 /* protection mode mask */ |
| 1294 | #define EWC_OPMODE_SHIFT 0 /* protection mode shift */ |
| 1295 | #define EWC_OPMODE_PURE 0x0000 /* protection mode PURE */ |
| 1296 | #define EWC_OPMODE_OPTIONAL 0x0001 /* protection mode optional */ |
| 1297 | #define EWC_OPMODE_HT20IN40 0x0002 /* protection mode 20MHz HT in 40MHz BSS */ |
| 1298 | #define EWC_OPMODE_MIXED 0x0003 /* protection mode Mixed Mode */ |
| 1299 | #define EWC_OPMODE_NONGF 0x0004 /* protection mode non-GF */ |
| 1300 | #define DOT11N_TXBURST 0x0008 /* Tx burst limit */ |
| 1301 | #define DOT11N_OBSS_NONHT 0x0010 /* OBSS Non-HT STA present */ |
| 1302 | |
| 1303 | /* misc_bites defn's */ |
| 1304 | #define EWC_BASIC_STBC_MCS 0x007f /* basic STBC MCS */ |
| 1305 | #define EWC_DUAL_STBC_PROT 0x0080 /* Dual STBC Protection */ |
| 1306 | #define EWC_SECOND_BCN 0x0100 /* Secondary beacon support */ |
| 1307 | #define EWC_LSIG_TXOP 0x0200 /* L-SIG TXOP Protection full support */ |
| 1308 | #define EWC_PCO_ACTIVE 0x0400 /* PCO active */ |
| 1309 | #define EWC_PCO_PHASE 0x0800 /* PCO phase */ |
| 1310 | |
| 1311 | /* Tx Burst Limits */ |
| 1312 | #define DOT11N_2G_TXBURST_LIMIT 6160 /* 2G band Tx burst limit per 802.11n Draft 1.10 (usec) */ |
| 1313 | #define DOT11N_5G_TXBURST_LIMIT 3080 /* 5G band Tx burst limit per 802.11n Draft 1.10 (usec) */ |
| 1314 | |
| 1315 | /* Macros for opmode */ |
| 1316 | #define GET_EWC_OPMODE(add_ie) ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \ |
| 1317 | >> EWC_OPMODE_SHIFT) |
| 1318 | #define EWC_MIXEDMODE_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \ |
| 1319 | == EWC_OPMODE_MIXED) /* mixed mode present */ |
| 1320 | #define EWC_HT20_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \ |
| 1321 | == EWC_OPMODE_HT20IN40) /* 20MHz HT present */ |
| 1322 | #define EWC_OPTIONAL_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_MASK) \ |
| 1323 | == EWC_OPMODE_OPTIONAL) /* Optional protection present */ |
| 1324 | #define EWC_USE_PROTECTION(add_ie) (EWC_HT20_PRESENT((add_ie)) || \ |
| 1325 | EWC_MIXEDMODE_PRESENT((add_ie))) /* use protection */ |
| 1326 | #define EWC_NONGF_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & EWC_OPMODE_NONGF) \ |
| 1327 | == EWC_OPMODE_NONGF) /* non-GF present */ |
| 1328 | #define DOT11N_TXBURST_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_TXBURST) \ |
| 1329 | == DOT11N_TXBURST) /* Tx Burst present */ |
| 1330 | #define DOT11N_OBSS_NONHT_PRESENT(add_ie) ((ltoh16_ua(&add_ie->opmode) & DOT11N_OBSS_NONHT) \ |
| 1331 | == DOT11N_OBSS_NONHT) /* OBSS Non-HT present */ |
| 1332 | |
| 1333 | /* Vendor IE structure */ |
| 1334 | struct vndr_ie { |
| 1335 | uchar id; |
| 1336 | uchar len; |
| 1337 | uchar oui [3]; |
| 1338 | uchar data [1]; /* Variable size data */ |
| 1339 | } PACKED; |
| 1340 | typedef struct vndr_ie vndr_ie_t; |
| 1341 | |
| 1342 | #define VNDR_IE_HDR_LEN 2 /* id + len field */ |
| 1343 | #define VNDR_IE_MIN_LEN 3 /* size of the oui field */ |
| 1344 | #define VNDR_IE_MAX_LEN 256 /* verdor IE max length */ |
| 1345 | |
| 1346 | /* WPA definitions */ |
| 1347 | #define WPA_VERSION 1 /* WPA version */ |
| 1348 | #define WPA_OUI "\x00\x50\xF2" /* WPA OUI */ |
| 1349 | |
| 1350 | #define WPA2_VERSION 1 /* WPA2 version */ |
| 1351 | #define WPA2_VERSION_LEN 2 /* WAP2 version length */ |
| 1352 | #define WPA2_OUI "\x00\x0F\xAC" /* WPA2 OUI */ |
| 1353 | |
| 1354 | #define WPA_OUI_LEN 3 /* WPA OUI length */ |
| 1355 | |
| 1356 | /* RSN authenticated key managment suite */ |
| 1357 | #define RSN_AKM_NONE 0 /* None (IBSS) */ |
| 1358 | #define RSN_AKM_UNSPECIFIED 1 /* Over 802.1x */ |
| 1359 | #define RSN_AKM_PSK 2 /* Pre-shared Key */ |
| 1360 | |
| 1361 | /* Key related defines */ |
| 1362 | #define DOT11_MAX_DEFAULT_KEYS 4 /* number of default keys */ |
| 1363 | #define DOT11_MAX_KEY_SIZE 32 /* max size of any key */ |
| 1364 | #define DOT11_MAX_IV_SIZE 16 /* max size of any IV */ |
| 1365 | #define DOT11_EXT_IV_FLAG (1<<5) /* flag to indicate IV is > 4 bytes */ |
| 1366 | |
| 1367 | #define WEP1_KEY_SIZE 5 /* max size of any WEP key */ |
| 1368 | #define WEP1_KEY_HEX_SIZE 10 /* size of WEP key in hex. */ |
| 1369 | #define WEP128_KEY_SIZE 13 /* max size of any WEP key */ |
| 1370 | #define WEP128_KEY_HEX_SIZE 26 /* size of WEP key in hex. */ |
| 1371 | #define TKIP_MIC_SIZE 8 /* size of TKIP MIC */ |
| 1372 | #define TKIP_EOM_SIZE 7 /* max size of TKIP EOM */ |
| 1373 | #define TKIP_EOM_FLAG 0x5a /* TKIP EOM flag byte */ |
| 1374 | #define TKIP_KEY_SIZE 32 /* size of any TKIP key */ |
| 1375 | #define TKIP_MIC_AUTH_TX 16 /* offset to Authenticator MIC TX key */ |
| 1376 | #define TKIP_MIC_AUTH_RX 24 /* offset to Authenticator MIC RX key */ |
| 1377 | #define TKIP_MIC_SUP_RX TKIP_MIC_AUTH_TX /* offset to Supplicant MIC RX key */ |
| 1378 | #define TKIP_MIC_SUP_TX TKIP_MIC_AUTH_RX /* offset to Supplicant MIC TX key */ |
| 1379 | #define AES_KEY_SIZE 16 /* size of AES key */ |
| 1380 | |
| 1381 | #undef PACKED |
| 1382 | #if !defined(__GNUC__) |
| 1383 | #pragma pack() |
| 1384 | #endif |
| 1385 | |
| 1386 | #endif /* _802_11_H_ */ |
| 1387 | |