802.11.h 55 KB

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