home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / ieee80211.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  30.0 KB  |  1,061 lines

  1. /*
  2.  * IEEE 802.11 defines
  3.  *
  4.  * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
  5.  * <jkmaline@cc.hut.fi>
  6.  * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
  7.  * Copyright (c) 2005, Devicescape Software, Inc.
  8.  * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License version 2 as
  12.  * published by the Free Software Foundation.
  13.  */
  14.  
  15. #ifndef IEEE80211_H
  16. #define IEEE80211_H
  17.  
  18. #include <linux/types.h>
  19. #include <asm/byteorder.h>
  20.  
  21. #define FCS_LEN 4
  22.  
  23. #define IEEE80211_FCTL_VERS        0x0003
  24. #define IEEE80211_FCTL_FTYPE        0x000c
  25. #define IEEE80211_FCTL_STYPE        0x00f0
  26. #define IEEE80211_FCTL_TODS        0x0100
  27. #define IEEE80211_FCTL_FROMDS        0x0200
  28. #define IEEE80211_FCTL_MOREFRAGS    0x0400
  29. #define IEEE80211_FCTL_RETRY        0x0800
  30. #define IEEE80211_FCTL_PM        0x1000
  31. #define IEEE80211_FCTL_MOREDATA        0x2000
  32. #define IEEE80211_FCTL_PROTECTED    0x4000
  33. #define IEEE80211_FCTL_ORDER        0x8000
  34.  
  35. #define IEEE80211_SCTL_FRAG        0x000F
  36. #define IEEE80211_SCTL_SEQ        0xFFF0
  37.  
  38. #define IEEE80211_FTYPE_MGMT        0x0000
  39. #define IEEE80211_FTYPE_CTL        0x0004
  40. #define IEEE80211_FTYPE_DATA        0x0008
  41.  
  42. /* management */
  43. #define IEEE80211_STYPE_ASSOC_REQ    0x0000
  44. #define IEEE80211_STYPE_ASSOC_RESP    0x0010
  45. #define IEEE80211_STYPE_REASSOC_REQ    0x0020
  46. #define IEEE80211_STYPE_REASSOC_RESP    0x0030
  47. #define IEEE80211_STYPE_PROBE_REQ    0x0040
  48. #define IEEE80211_STYPE_PROBE_RESP    0x0050
  49. #define IEEE80211_STYPE_BEACON        0x0080
  50. #define IEEE80211_STYPE_ATIM        0x0090
  51. #define IEEE80211_STYPE_DISASSOC    0x00A0
  52. #define IEEE80211_STYPE_AUTH        0x00B0
  53. #define IEEE80211_STYPE_DEAUTH        0x00C0
  54. #define IEEE80211_STYPE_ACTION        0x00D0
  55.  
  56. /* control */
  57. #define IEEE80211_STYPE_BACK_REQ    0x0080
  58. #define IEEE80211_STYPE_BACK        0x0090
  59. #define IEEE80211_STYPE_PSPOLL        0x00A0
  60. #define IEEE80211_STYPE_RTS        0x00B0
  61. #define IEEE80211_STYPE_CTS        0x00C0
  62. #define IEEE80211_STYPE_ACK        0x00D0
  63. #define IEEE80211_STYPE_CFEND        0x00E0
  64. #define IEEE80211_STYPE_CFENDACK    0x00F0
  65.  
  66. /* data */
  67. #define IEEE80211_STYPE_DATA            0x0000
  68. #define IEEE80211_STYPE_DATA_CFACK        0x0010
  69. #define IEEE80211_STYPE_DATA_CFPOLL        0x0020
  70. #define IEEE80211_STYPE_DATA_CFACKPOLL        0x0030
  71. #define IEEE80211_STYPE_NULLFUNC        0x0040
  72. #define IEEE80211_STYPE_CFACK            0x0050
  73. #define IEEE80211_STYPE_CFPOLL            0x0060
  74. #define IEEE80211_STYPE_CFACKPOLL        0x0070
  75. #define IEEE80211_STYPE_QOS_DATA        0x0080
  76. #define IEEE80211_STYPE_QOS_DATA_CFACK        0x0090
  77. #define IEEE80211_STYPE_QOS_DATA_CFPOLL        0x00A0
  78. #define IEEE80211_STYPE_QOS_DATA_CFACKPOLL    0x00B0
  79. #define IEEE80211_STYPE_QOS_NULLFUNC        0x00C0
  80. #define IEEE80211_STYPE_QOS_CFACK        0x00D0
  81. #define IEEE80211_STYPE_QOS_CFPOLL        0x00E0
  82. #define IEEE80211_STYPE_QOS_CFACKPOLL        0x00F0
  83.  
  84.  
  85. /* miscellaneous IEEE 802.11 constants */
  86. #define IEEE80211_MAX_FRAG_THRESHOLD    2352
  87. #define IEEE80211_MAX_RTS_THRESHOLD    2353
  88. #define IEEE80211_MAX_AID        2007
  89. #define IEEE80211_MAX_TIM_LEN        251
  90. /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
  91.    6.2.1.1.2.
  92.  
  93.    802.11e clarifies the figure in section 7.1.2. The frame body is
  94.    up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */
  95. #define IEEE80211_MAX_DATA_LEN        2304
  96. /* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */
  97. #define IEEE80211_MAX_FRAME_LEN        2352
  98.  
  99. #define IEEE80211_MAX_SSID_LEN        32
  100. #define IEEE80211_MAX_MESH_ID_LEN    32
  101. #define IEEE80211_QOS_CTL_LEN        2
  102. #define IEEE80211_QOS_CTL_TID_MASK    0x000F
  103. #define IEEE80211_QOS_CTL_TAG1D_MASK    0x0007
  104.  
  105. struct ieee80211_hdr {
  106.     __le16 frame_control;
  107.     __le16 duration_id;
  108.     u8 addr1[6];
  109.     u8 addr2[6];
  110.     u8 addr3[6];
  111.     __le16 seq_ctrl;
  112.     u8 addr4[6];
  113. } __attribute__ ((packed));
  114.  
  115. /**
  116.  * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
  117.  * @fc: frame control bytes in little-endian byteorder
  118.  */
  119. static inline int ieee80211_has_tods(__le16 fc)
  120. {
  121.     return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
  122. }
  123.  
  124. /**
  125.  * ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
  126.  * @fc: frame control bytes in little-endian byteorder
  127.  */
  128. static inline int ieee80211_has_fromds(__le16 fc)
  129. {
  130.     return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
  131. }
  132.  
  133. /**
  134.  * ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and IEEE80211_FCTL_FROMDS are set
  135.  * @fc: frame control bytes in little-endian byteorder
  136.  */
  137. static inline int ieee80211_has_a4(__le16 fc)
  138. {
  139.     __le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
  140.     return (fc & tmp) == tmp;
  141. }
  142.  
  143. /**
  144.  * ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
  145.  * @fc: frame control bytes in little-endian byteorder
  146.  */
  147. static inline int ieee80211_has_morefrags(__le16 fc)
  148. {
  149.     return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
  150. }
  151.  
  152. /**
  153.  * ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
  154.  * @fc: frame control bytes in little-endian byteorder
  155.  */
  156. static inline int ieee80211_has_retry(__le16 fc)
  157. {
  158.     return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
  159. }
  160.  
  161. /**
  162.  * ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
  163.  * @fc: frame control bytes in little-endian byteorder
  164.  */
  165. static inline int ieee80211_has_pm(__le16 fc)
  166. {
  167.     return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
  168. }
  169.  
  170. /**
  171.  * ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
  172.  * @fc: frame control bytes in little-endian byteorder
  173.  */
  174. static inline int ieee80211_has_moredata(__le16 fc)
  175. {
  176.     return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
  177. }
  178.  
  179. /**
  180.  * ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
  181.  * @fc: frame control bytes in little-endian byteorder
  182.  */
  183. static inline int ieee80211_has_protected(__le16 fc)
  184. {
  185.     return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
  186. }
  187.  
  188. /**
  189.  * ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
  190.  * @fc: frame control bytes in little-endian byteorder
  191.  */
  192. static inline int ieee80211_has_order(__le16 fc)
  193. {
  194.     return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
  195. }
  196.  
  197. /**
  198.  * ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
  199.  * @fc: frame control bytes in little-endian byteorder
  200.  */
  201. static inline int ieee80211_is_mgmt(__le16 fc)
  202. {
  203.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
  204.            cpu_to_le16(IEEE80211_FTYPE_MGMT);
  205. }
  206.  
  207. /**
  208.  * ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
  209.  * @fc: frame control bytes in little-endian byteorder
  210.  */
  211. static inline int ieee80211_is_ctl(__le16 fc)
  212. {
  213.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
  214.            cpu_to_le16(IEEE80211_FTYPE_CTL);
  215. }
  216.  
  217. /**
  218.  * ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
  219.  * @fc: frame control bytes in little-endian byteorder
  220.  */
  221. static inline int ieee80211_is_data(__le16 fc)
  222. {
  223.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
  224.            cpu_to_le16(IEEE80211_FTYPE_DATA);
  225. }
  226.  
  227. /**
  228.  * ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA and IEEE80211_STYPE_QOS_DATA is set
  229.  * @fc: frame control bytes in little-endian byteorder
  230.  */
  231. static inline int ieee80211_is_data_qos(__le16 fc)
  232. {
  233.     /*
  234.      * mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
  235.      * to check the one bit
  236.      */
  237.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
  238.            cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
  239. }
  240.  
  241. /**
  242.  * ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
  243.  * @fc: frame control bytes in little-endian byteorder
  244.  */
  245. static inline int ieee80211_is_data_present(__le16 fc)
  246. {
  247.     /*
  248.      * mask with 0x40 and test that that bit is clear to only return true
  249.      * for the data-containing substypes.
  250.      */
  251.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
  252.            cpu_to_le16(IEEE80211_FTYPE_DATA);
  253. }
  254.  
  255. /**
  256.  * ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_REQ
  257.  * @fc: frame control bytes in little-endian byteorder
  258.  */
  259. static inline int ieee80211_is_assoc_req(__le16 fc)
  260. {
  261.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  262.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
  263. }
  264.  
  265. /**
  266.  * ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_RESP
  267.  * @fc: frame control bytes in little-endian byteorder
  268.  */
  269. static inline int ieee80211_is_assoc_resp(__le16 fc)
  270. {
  271.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  272.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
  273. }
  274.  
  275. /**
  276.  * ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_REQ
  277.  * @fc: frame control bytes in little-endian byteorder
  278.  */
  279. static inline int ieee80211_is_reassoc_req(__le16 fc)
  280. {
  281.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  282.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
  283. }
  284.  
  285. /**
  286.  * ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_RESP
  287.  * @fc: frame control bytes in little-endian byteorder
  288.  */
  289. static inline int ieee80211_is_reassoc_resp(__le16 fc)
  290. {
  291.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  292.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
  293. }
  294.  
  295. /**
  296.  * ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_REQ
  297.  * @fc: frame control bytes in little-endian byteorder
  298.  */
  299. static inline int ieee80211_is_probe_req(__le16 fc)
  300. {
  301.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  302.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
  303. }
  304.  
  305. /**
  306.  * ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_RESP
  307.  * @fc: frame control bytes in little-endian byteorder
  308.  */
  309. static inline int ieee80211_is_probe_resp(__le16 fc)
  310. {
  311.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  312.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
  313. }
  314.  
  315. /**
  316.  * ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_BEACON
  317.  * @fc: frame control bytes in little-endian byteorder
  318.  */
  319. static inline int ieee80211_is_beacon(__le16 fc)
  320. {
  321.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  322.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
  323. }
  324.  
  325. /**
  326.  * ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
  327.  * @fc: frame control bytes in little-endian byteorder
  328.  */
  329. static inline int ieee80211_is_atim(__le16 fc)
  330. {
  331.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  332.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
  333. }
  334.  
  335. /**
  336.  * ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DISASSOC
  337.  * @fc: frame control bytes in little-endian byteorder
  338.  */
  339. static inline int ieee80211_is_disassoc(__le16 fc)
  340. {
  341.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  342.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
  343. }
  344.  
  345. /**
  346.  * ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
  347.  * @fc: frame control bytes in little-endian byteorder
  348.  */
  349. static inline int ieee80211_is_auth(__le16 fc)
  350. {
  351.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  352.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
  353. }
  354.  
  355. /**
  356.  * ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DEAUTH
  357.  * @fc: frame control bytes in little-endian byteorder
  358.  */
  359. static inline int ieee80211_is_deauth(__le16 fc)
  360. {
  361.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  362.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
  363. }
  364.  
  365. /**
  366.  * ieee80211_is_action - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ACTION
  367.  * @fc: frame control bytes in little-endian byteorder
  368.  */
  369. static inline int ieee80211_is_action(__le16 fc)
  370. {
  371.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  372.            cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
  373. }
  374.  
  375. /**
  376.  * ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK_REQ
  377.  * @fc: frame control bytes in little-endian byteorder
  378.  */
  379. static inline int ieee80211_is_back_req(__le16 fc)
  380. {
  381.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  382.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
  383. }
  384.  
  385. /**
  386.  * ieee80211_is_back - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK
  387.  * @fc: frame control bytes in little-endian byteorder
  388.  */
  389. static inline int ieee80211_is_back(__le16 fc)
  390. {
  391.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  392.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
  393. }
  394.  
  395. /**
  396.  * ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_PSPOLL
  397.  * @fc: frame control bytes in little-endian byteorder
  398.  */
  399. static inline int ieee80211_is_pspoll(__le16 fc)
  400. {
  401.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  402.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
  403. }
  404.  
  405. /**
  406.  * ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
  407.  * @fc: frame control bytes in little-endian byteorder
  408.  */
  409. static inline int ieee80211_is_rts(__le16 fc)
  410. {
  411.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  412.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
  413. }
  414.  
  415. /**
  416.  * ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
  417.  * @fc: frame control bytes in little-endian byteorder
  418.  */
  419. static inline int ieee80211_is_cts(__le16 fc)
  420. {
  421.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  422.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
  423. }
  424.  
  425. /**
  426.  * ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
  427.  * @fc: frame control bytes in little-endian byteorder
  428.  */
  429. static inline int ieee80211_is_ack(__le16 fc)
  430. {
  431.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  432.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
  433. }
  434.  
  435. /**
  436.  * ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
  437.  * @fc: frame control bytes in little-endian byteorder
  438.  */
  439. static inline int ieee80211_is_cfend(__le16 fc)
  440. {
  441.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  442.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
  443. }
  444.  
  445. /**
  446.  * ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFENDACK
  447.  * @fc: frame control bytes in little-endian byteorder
  448.  */
  449. static inline int ieee80211_is_cfendack(__le16 fc)
  450. {
  451.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  452.            cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
  453. }
  454.  
  455. /**
  456.  * ieee80211_is_nullfunc - check if FTYPE=IEEE80211_FTYPE_DATA and STYPE=IEEE80211_STYPE_NULLFUNC
  457.  * @fc: frame control bytes in little-endian byteorder
  458.  */
  459. static inline int ieee80211_is_nullfunc(__le16 fc)
  460. {
  461.     return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  462.            cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
  463. }
  464.  
  465. struct ieee80211s_hdr {
  466.     u8 flags;
  467.     u8 ttl;
  468.     __le32 seqnum;
  469.     u8 eaddr1[6];
  470.     u8 eaddr2[6];
  471.     u8 eaddr3[6];
  472. } __attribute__ ((packed));
  473.  
  474. /* Mesh flags */
  475. #define MESH_FLAGS_AE_A4     0x1
  476. #define MESH_FLAGS_AE_A5_A6    0x2
  477. #define MESH_FLAGS_PS_DEEP    0x4
  478.  
  479. /**
  480.  * struct ieee80211_quiet_ie
  481.  *
  482.  * This structure refers to "Quiet information element"
  483.  */
  484. struct ieee80211_quiet_ie {
  485.     u8 count;
  486.     u8 period;
  487.     __le16 duration;
  488.     __le16 offset;
  489. } __attribute__ ((packed));
  490.  
  491. /**
  492.  * struct ieee80211_msrment_ie
  493.  *
  494.  * This structure refers to "Measurement Request/Report information element"
  495.  */
  496. struct ieee80211_msrment_ie {
  497.     u8 token;
  498.     u8 mode;
  499.     u8 type;
  500.     u8 request[0];
  501. } __attribute__ ((packed));
  502.  
  503. /**
  504.  * struct ieee80211_channel_sw_ie
  505.  *
  506.  * This structure refers to "Channel Switch Announcement information element"
  507.  */
  508. struct ieee80211_channel_sw_ie {
  509.     u8 mode;
  510.     u8 new_ch_num;
  511.     u8 count;
  512. } __attribute__ ((packed));
  513.  
  514. /**
  515.  * struct ieee80211_tim
  516.  *
  517.  * This structure refers to "Traffic Indication Map information element"
  518.  */
  519. struct ieee80211_tim_ie {
  520.     u8 dtim_count;
  521.     u8 dtim_period;
  522.     u8 bitmap_ctrl;
  523.     /* variable size: 1 - 251 bytes */
  524.     u8 virtual_map[0];
  525. } __attribute__ ((packed));
  526.  
  527. struct ieee80211_mgmt {
  528.     __le16 frame_control;
  529.     __le16 duration;
  530.     u8 da[6];
  531.     u8 sa[6];
  532.     u8 bssid[6];
  533.     __le16 seq_ctrl;
  534.     union {
  535.         struct {
  536.             __le16 auth_alg;
  537.             __le16 auth_transaction;
  538.             __le16 status_code;
  539.             /* possibly followed by Challenge text */
  540.             u8 variable[0];
  541.         } __attribute__ ((packed)) auth;
  542.         struct {
  543.             __le16 reason_code;
  544.         } __attribute__ ((packed)) deauth;
  545.         struct {
  546.             __le16 capab_info;
  547.             __le16 listen_interval;
  548.             /* followed by SSID and Supported rates */
  549.             u8 variable[0];
  550.         } __attribute__ ((packed)) assoc_req;
  551.         struct {
  552.             __le16 capab_info;
  553.             __le16 status_code;
  554.             __le16 aid;
  555.             /* followed by Supported rates */
  556.             u8 variable[0];
  557.         } __attribute__ ((packed)) assoc_resp, reassoc_resp;
  558.         struct {
  559.             __le16 capab_info;
  560.             __le16 listen_interval;
  561.             u8 current_ap[6];
  562.             /* followed by SSID and Supported rates */
  563.             u8 variable[0];
  564.         } __attribute__ ((packed)) reassoc_req;
  565.         struct {
  566.             __le16 reason_code;
  567.         } __attribute__ ((packed)) disassoc;
  568.         struct {
  569.             __le64 timestamp;
  570.             __le16 beacon_int;
  571.             __le16 capab_info;
  572.             /* followed by some of SSID, Supported rates,
  573.              * FH Params, DS Params, CF Params, IBSS Params, TIM */
  574.             u8 variable[0];
  575.         } __attribute__ ((packed)) beacon;
  576.         struct {
  577.             /* only variable items: SSID, Supported rates */
  578.             u8 variable[0];
  579.         } __attribute__ ((packed)) probe_req;
  580.         struct {
  581.             __le64 timestamp;
  582.             __le16 beacon_int;
  583.             __le16 capab_info;
  584.             /* followed by some of SSID, Supported rates,
  585.              * FH Params, DS Params, CF Params, IBSS Params */
  586.             u8 variable[0];
  587.         } __attribute__ ((packed)) probe_resp;
  588.         struct {
  589.             u8 category;
  590.             union {
  591.                 struct {
  592.                     u8 action_code;
  593.                     u8 dialog_token;
  594.                     u8 status_code;
  595.                     u8 variable[0];
  596.                 } __attribute__ ((packed)) wme_action;
  597.                 struct{
  598.                     u8 action_code;
  599.                     u8 element_id;
  600.                     u8 length;
  601.                     struct ieee80211_channel_sw_ie sw_elem;
  602.                 } __attribute__((packed)) chan_switch;
  603.                 struct{
  604.                     u8 action_code;
  605.                     u8 dialog_token;
  606.                     u8 element_id;
  607.                     u8 length;
  608.                     struct ieee80211_msrment_ie msr_elem;
  609.                 } __attribute__((packed)) measurement;
  610.                 struct{
  611.                     u8 action_code;
  612.                     u8 dialog_token;
  613.                     __le16 capab;
  614.                     __le16 timeout;
  615.                     __le16 start_seq_num;
  616.                 } __attribute__((packed)) addba_req;
  617.                 struct{
  618.                     u8 action_code;
  619.                     u8 dialog_token;
  620.                     __le16 status;
  621.                     __le16 capab;
  622.                     __le16 timeout;
  623.                 } __attribute__((packed)) addba_resp;
  624.                 struct{
  625.                     u8 action_code;
  626.                     __le16 params;
  627.                     __le16 reason_code;
  628.                 } __attribute__((packed)) delba;
  629.                 struct{
  630.                     u8 action_code;
  631.                     /* capab_info for open and confirm,
  632.                      * reason for close
  633.                      */
  634.                     __le16 aux;
  635.                     /* Followed in plink_confirm by status
  636.                      * code, AID and supported rates,
  637.                      * and directly by supported rates in
  638.                      * plink_open and plink_close
  639.                      */
  640.                     u8 variable[0];
  641.                 } __attribute__((packed)) plink_action;
  642.                 struct{
  643.                     u8 action_code;
  644.                     u8 variable[0];
  645.                 } __attribute__((packed)) mesh_action;
  646.             } u;
  647.         } __attribute__ ((packed)) action;
  648.     } u;
  649. } __attribute__ ((packed));
  650.  
  651. /* mgmt header + 1 byte category code */
  652. #define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
  653.  
  654.  
  655. /* Control frames */
  656. struct ieee80211_rts {
  657.     __le16 frame_control;
  658.     __le16 duration;
  659.     u8 ra[6];
  660.     u8 ta[6];
  661. } __attribute__ ((packed));
  662.  
  663. struct ieee80211_cts {
  664.     __le16 frame_control;
  665.     __le16 duration;
  666.     u8 ra[6];
  667. } __attribute__ ((packed));
  668.  
  669. /**
  670.  * struct ieee80211_bar - HT Block Ack Request
  671.  *
  672.  * This structure refers to "HT BlockAckReq" as
  673.  * described in 802.11n draft section 7.2.1.7.1
  674.  */
  675. struct ieee80211_bar {
  676.     __le16 frame_control;
  677.     __le16 duration;
  678.     __u8 ra[6];
  679.     __u8 ta[6];
  680.     __le16 control;
  681.     __le16 start_seq_num;
  682. } __attribute__((packed));
  683.  
  684. /* 802.11 BAR control masks */
  685. #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL     0x0000
  686. #define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA  0x0004
  687.  
  688. /**
  689.  * struct ieee80211_ht_cap - HT capabilities
  690.  *
  691.  * This structure refers to "HT capabilities element" as
  692.  * described in 802.11n draft section 7.3.2.52
  693.  */
  694. struct ieee80211_ht_cap {
  695.     __le16 cap_info;
  696.     u8 ampdu_params_info;
  697.     u8 supp_mcs_set[16];
  698.     __le16 extended_ht_cap_info;
  699.     __le32 tx_BF_cap_info;
  700.     u8 antenna_selection_info;
  701. } __attribute__ ((packed));
  702.  
  703. /**
  704.  * struct ieee80211_ht_cap - HT additional information
  705.  *
  706.  * This structure refers to "HT information element" as
  707.  * described in 802.11n draft section 7.3.2.53
  708.  */
  709. struct ieee80211_ht_addt_info {
  710.     u8 control_chan;
  711.     u8 ht_param;
  712.     __le16 operation_mode;
  713.     __le16 stbc_param;
  714.     u8 basic_set[16];
  715. } __attribute__ ((packed));
  716.  
  717. /* 802.11n HT capabilities masks */
  718. #define IEEE80211_HT_CAP_SUP_WIDTH        0x0002
  719. #define IEEE80211_HT_CAP_SM_PS            0x000C
  720. #define IEEE80211_HT_CAP_GRN_FLD        0x0010
  721. #define IEEE80211_HT_CAP_SGI_20            0x0020
  722. #define IEEE80211_HT_CAP_SGI_40            0x0040
  723. #define IEEE80211_HT_CAP_DELAY_BA        0x0400
  724. #define IEEE80211_HT_CAP_MAX_AMSDU        0x0800
  725. #define IEEE80211_HT_CAP_DSSSCCK40        0x1000
  726. /* 802.11n HT capability AMPDU settings */
  727. #define IEEE80211_HT_CAP_AMPDU_FACTOR        0x03
  728. #define IEEE80211_HT_CAP_AMPDU_DENSITY        0x1C
  729. /* 802.11n HT capability MSC set */
  730. #define IEEE80211_SUPP_MCS_SET_UEQM        4
  731. #define IEEE80211_HT_CAP_MAX_STREAMS        4
  732. #define IEEE80211_SUPP_MCS_SET_LEN        10
  733. /* maximum streams the spec allows */
  734. #define IEEE80211_HT_CAP_MCS_TX_DEFINED        0x01
  735. #define IEEE80211_HT_CAP_MCS_TX_RX_DIFF        0x02
  736. #define IEEE80211_HT_CAP_MCS_TX_STREAMS        0x0C
  737. #define IEEE80211_HT_CAP_MCS_TX_UEQM        0x10
  738. /* 802.11n HT IE masks */
  739. #define IEEE80211_HT_IE_CHA_SEC_OFFSET        0x03
  740. #define IEEE80211_HT_IE_CHA_SEC_NONE         0x00
  741. #define IEEE80211_HT_IE_CHA_SEC_ABOVE         0x01
  742. #define IEEE80211_HT_IE_CHA_SEC_BELOW         0x03
  743. #define IEEE80211_HT_IE_CHA_WIDTH        0x04
  744. #define IEEE80211_HT_IE_HT_PROTECTION        0x0003
  745. #define IEEE80211_HT_IE_NON_GF_STA_PRSNT    0x0004
  746. #define IEEE80211_HT_IE_NON_HT_STA_PRSNT    0x0010
  747.  
  748. /* block-ack parameters */
  749. #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
  750. #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
  751. #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0
  752. #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
  753. #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
  754.  
  755. /*
  756.  * A-PMDU buffer sizes
  757.  * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
  758.  */
  759. #define IEEE80211_MIN_AMPDU_BUF 0x8
  760. #define IEEE80211_MAX_AMPDU_BUF 0x40
  761.  
  762.  
  763. /* Spatial Multiplexing Power Save Modes */
  764. #define WLAN_HT_CAP_SM_PS_STATIC    0
  765. #define WLAN_HT_CAP_SM_PS_DYNAMIC    1
  766. #define WLAN_HT_CAP_SM_PS_INVALID    2
  767. #define WLAN_HT_CAP_SM_PS_DISABLED    3
  768.  
  769. /* Authentication algorithms */
  770. #define WLAN_AUTH_OPEN 0
  771. #define WLAN_AUTH_SHARED_KEY 1
  772. #define WLAN_AUTH_FAST_BSS_TRANSITION 2
  773. #define WLAN_AUTH_LEAP 128
  774.  
  775. #define WLAN_AUTH_CHALLENGE_LEN 128
  776.  
  777. #define WLAN_CAPABILITY_ESS        (1<<0)
  778. #define WLAN_CAPABILITY_IBSS        (1<<1)
  779. #define WLAN_CAPABILITY_CF_POLLABLE    (1<<2)
  780. #define WLAN_CAPABILITY_CF_POLL_REQUEST    (1<<3)
  781. #define WLAN_CAPABILITY_PRIVACY        (1<<4)
  782. #define WLAN_CAPABILITY_SHORT_PREAMBLE    (1<<5)
  783. #define WLAN_CAPABILITY_PBCC        (1<<6)
  784. #define WLAN_CAPABILITY_CHANNEL_AGILITY    (1<<7)
  785.  
  786. /* 802.11h */
  787. #define WLAN_CAPABILITY_SPECTRUM_MGMT    (1<<8)
  788. #define WLAN_CAPABILITY_QOS        (1<<9)
  789. #define WLAN_CAPABILITY_SHORT_SLOT_TIME    (1<<10)
  790. #define WLAN_CAPABILITY_DSSS_OFDM    (1<<13)
  791. /* measurement */
  792. #define IEEE80211_SPCT_MSR_RPRT_MODE_LATE    (1<<0)
  793. #define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE    (1<<1)
  794. #define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED    (1<<2)
  795.  
  796. #define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC    0
  797. #define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA    1
  798. #define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI    2
  799.  
  800.  
  801. /* 802.11g ERP information element */
  802. #define WLAN_ERP_NON_ERP_PRESENT (1<<0)
  803. #define WLAN_ERP_USE_PROTECTION (1<<1)
  804. #define WLAN_ERP_BARKER_PREAMBLE (1<<2)
  805.  
  806. /* WLAN_ERP_BARKER_PREAMBLE values */
  807. enum {
  808.     WLAN_ERP_PREAMBLE_SHORT = 0,
  809.     WLAN_ERP_PREAMBLE_LONG = 1,
  810. };
  811.  
  812. /* Status codes */
  813. enum ieee80211_statuscode {
  814.     WLAN_STATUS_SUCCESS = 0,
  815.     WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
  816.     WLAN_STATUS_CAPS_UNSUPPORTED = 10,
  817.     WLAN_STATUS_REASSOC_NO_ASSOC = 11,
  818.     WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
  819.     WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
  820.     WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
  821.     WLAN_STATUS_CHALLENGE_FAIL = 15,
  822.     WLAN_STATUS_AUTH_TIMEOUT = 16,
  823.     WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
  824.     WLAN_STATUS_ASSOC_DENIED_RATES = 18,
  825.     /* 802.11b */
  826.     WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
  827.     WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
  828.     WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
  829.     /* 802.11h */
  830.     WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
  831.     WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
  832.     WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
  833.     /* 802.11g */
  834.     WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
  835.     WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
  836.     /* 802.11i */
  837.     WLAN_STATUS_INVALID_IE = 40,
  838.     WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
  839.     WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
  840.     WLAN_STATUS_INVALID_AKMP = 43,
  841.     WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
  842.     WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
  843.     WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
  844.     /* 802.11e */
  845.     WLAN_STATUS_UNSPECIFIED_QOS = 32,
  846.     WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
  847.     WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
  848.     WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
  849.     WLAN_STATUS_REQUEST_DECLINED = 37,
  850.     WLAN_STATUS_INVALID_QOS_PARAM = 38,
  851.     WLAN_STATUS_CHANGE_TSPEC = 39,
  852.     WLAN_STATUS_WAIT_TS_DELAY = 47,
  853.     WLAN_STATUS_NO_DIRECT_LINK = 48,
  854.     WLAN_STATUS_STA_NOT_PRESENT = 49,
  855.     WLAN_STATUS_STA_NOT_QSTA = 50,
  856. };
  857.  
  858.  
  859. /* Reason codes */
  860. enum ieee80211_reasoncode {
  861.     WLAN_REASON_UNSPECIFIED = 1,
  862.     WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
  863.     WLAN_REASON_DEAUTH_LEAVING = 3,
  864.     WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
  865.     WLAN_REASON_DISASSOC_AP_BUSY = 5,
  866.     WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
  867.     WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
  868.     WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
  869.     WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
  870.     /* 802.11h */
  871.     WLAN_REASON_DISASSOC_BAD_POWER = 10,
  872.     WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
  873.     /* 802.11i */
  874.     WLAN_REASON_INVALID_IE = 13,
  875.     WLAN_REASON_MIC_FAILURE = 14,
  876.     WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
  877.     WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
  878.     WLAN_REASON_IE_DIFFERENT = 17,
  879.     WLAN_REASON_INVALID_GROUP_CIPHER = 18,
  880.     WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
  881.     WLAN_REASON_INVALID_AKMP = 20,
  882.     WLAN_REASON_UNSUPP_RSN_VERSION = 21,
  883.     WLAN_REASON_INVALID_RSN_IE_CAP = 22,
  884.     WLAN_REASON_IEEE8021X_FAILED = 23,
  885.     WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
  886.     /* 802.11e */
  887.     WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
  888.     WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
  889.     WLAN_REASON_DISASSOC_LOW_ACK = 34,
  890.     WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
  891.     WLAN_REASON_QSTA_LEAVE_QBSS = 36,
  892.     WLAN_REASON_QSTA_NOT_USE = 37,
  893.     WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
  894.     WLAN_REASON_QSTA_TIMEOUT = 39,
  895.     WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
  896. };
  897.  
  898.  
  899. /* Information Element IDs */
  900. enum ieee80211_eid {
  901.     WLAN_EID_SSID = 0,
  902.     WLAN_EID_SUPP_RATES = 1,
  903.     WLAN_EID_FH_PARAMS = 2,
  904.     WLAN_EID_DS_PARAMS = 3,
  905.     WLAN_EID_CF_PARAMS = 4,
  906.     WLAN_EID_TIM = 5,
  907.     WLAN_EID_IBSS_PARAMS = 6,
  908.     WLAN_EID_CHALLENGE = 16,
  909.     /* 802.11d */
  910.     WLAN_EID_COUNTRY = 7,
  911.     WLAN_EID_HP_PARAMS = 8,
  912.     WLAN_EID_HP_TABLE = 9,
  913.     WLAN_EID_REQUEST = 10,
  914.     /* 802.11e */
  915.     WLAN_EID_QBSS_LOAD = 11,
  916.     WLAN_EID_EDCA_PARAM_SET = 12,
  917.     WLAN_EID_TSPEC = 13,
  918.     WLAN_EID_TCLAS = 14,
  919.     WLAN_EID_SCHEDULE = 15,
  920.     WLAN_EID_TS_DELAY = 43,
  921.     WLAN_EID_TCLAS_PROCESSING = 44,
  922.     WLAN_EID_QOS_CAPA = 46,
  923.     /* 802.11s
  924.      *
  925.      * All mesh EID numbers are pending IEEE 802.11 ANA approval.
  926.      * The numbers have been incremented from those suggested in
  927.      * 802.11s/D2.0 so that MESH_CONFIG does not conflict with
  928.      * EXT_SUPP_RATES.
  929.      */
  930.     WLAN_EID_MESH_CONFIG = 51,
  931.     WLAN_EID_MESH_ID = 52,
  932.     WLAN_EID_PEER_LINK = 55,
  933.     WLAN_EID_PREQ = 68,
  934.     WLAN_EID_PREP = 69,
  935.     WLAN_EID_PERR = 70,
  936.     /* 802.11h */
  937.     WLAN_EID_PWR_CONSTRAINT = 32,
  938.     WLAN_EID_PWR_CAPABILITY = 33,
  939.     WLAN_EID_TPC_REQUEST = 34,
  940.     WLAN_EID_TPC_REPORT = 35,
  941.     WLAN_EID_SUPPORTED_CHANNELS = 36,
  942.     WLAN_EID_CHANNEL_SWITCH = 37,
  943.     WLAN_EID_MEASURE_REQUEST = 38,
  944.     WLAN_EID_MEASURE_REPORT = 39,
  945.     WLAN_EID_QUIET = 40,
  946.     WLAN_EID_IBSS_DFS = 41,
  947.     /* 802.11g */
  948.     WLAN_EID_ERP_INFO = 42,
  949.     WLAN_EID_EXT_SUPP_RATES = 50,
  950.     /* 802.11n */
  951.     WLAN_EID_HT_CAPABILITY = 45,
  952.     WLAN_EID_HT_EXTRA_INFO = 61,
  953.     /* 802.11i */
  954.     WLAN_EID_RSN = 48,
  955.     WLAN_EID_WPA = 221,
  956.     WLAN_EID_GENERIC = 221,
  957.     WLAN_EID_VENDOR_SPECIFIC = 221,
  958.     WLAN_EID_QOS_PARAMETER = 222
  959. };
  960.  
  961. /* Action category code */
  962. enum ieee80211_category {
  963.     WLAN_CATEGORY_SPECTRUM_MGMT = 0,
  964.     WLAN_CATEGORY_QOS = 1,
  965.     WLAN_CATEGORY_DLS = 2,
  966.     WLAN_CATEGORY_BACK = 3,
  967.     WLAN_CATEGORY_WMM = 17,
  968. };
  969.  
  970. /* SPECTRUM_MGMT action code */
  971. enum ieee80211_spectrum_mgmt_actioncode {
  972.     WLAN_ACTION_SPCT_MSR_REQ = 0,
  973.     WLAN_ACTION_SPCT_MSR_RPRT = 1,
  974.     WLAN_ACTION_SPCT_TPC_REQ = 2,
  975.     WLAN_ACTION_SPCT_TPC_RPRT = 3,
  976.     WLAN_ACTION_SPCT_CHL_SWITCH = 4,
  977. };
  978.  
  979. /* BACK action code */
  980. enum ieee80211_back_actioncode {
  981.     WLAN_ACTION_ADDBA_REQ = 0,
  982.     WLAN_ACTION_ADDBA_RESP = 1,
  983.     WLAN_ACTION_DELBA = 2,
  984. };
  985.  
  986. /* BACK (block-ack) parties */
  987. enum ieee80211_back_parties {
  988.     WLAN_BACK_RECIPIENT = 0,
  989.     WLAN_BACK_INITIATOR = 1,
  990.     WLAN_BACK_TIMER = 2,
  991. };
  992.  
  993. /* A-MSDU 802.11n */
  994. #define IEEE80211_QOS_CONTROL_A_MSDU_PRESENT 0x0080
  995.  
  996. /* cipher suite selectors */
  997. #define WLAN_CIPHER_SUITE_USE_GROUP    0x000FAC00
  998. #define WLAN_CIPHER_SUITE_WEP40        0x000FAC01
  999. #define WLAN_CIPHER_SUITE_TKIP        0x000FAC02
  1000. /* reserved:                 0x000FAC03 */
  1001. #define WLAN_CIPHER_SUITE_CCMP        0x000FAC04
  1002. #define WLAN_CIPHER_SUITE_WEP104    0x000FAC05
  1003.  
  1004. #define WLAN_MAX_KEY_LEN        32
  1005.  
  1006. /**
  1007.  * ieee80211_get_qos_ctl - get pointer to qos control bytes
  1008.  * @hdr: the frame
  1009.  *
  1010.  * The qos ctrl bytes come after the frame_control, duration, seq_num
  1011.  * and 3 or 4 addresses of length ETH_ALEN.
  1012.  * 3 addr: 2 + 2 + 2 + 3*6 = 24
  1013.  * 4 addr: 2 + 2 + 2 + 4*6 = 30
  1014.  */
  1015. static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
  1016. {
  1017.     if (ieee80211_has_a4(hdr->frame_control))
  1018.         return (u8 *)hdr + 30;
  1019.     else
  1020.         return (u8 *)hdr + 24;
  1021. }
  1022.  
  1023. /**
  1024.  * ieee80211_get_SA - get pointer to SA
  1025.  * @hdr: the frame
  1026.  *
  1027.  * Given an 802.11 frame, this function returns the offset
  1028.  * to the source address (SA). It does not verify that the
  1029.  * header is long enough to contain the address, and the
  1030.  * header must be long enough to contain the frame control
  1031.  * field.
  1032.  */
  1033. static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
  1034. {
  1035.     if (ieee80211_has_a4(hdr->frame_control))
  1036.         return hdr->addr4;
  1037.     if (ieee80211_has_fromds(hdr->frame_control))
  1038.         return hdr->addr3;
  1039.     return hdr->addr2;
  1040. }
  1041.  
  1042. /**
  1043.  * ieee80211_get_DA - get pointer to DA
  1044.  * @hdr: the frame
  1045.  *
  1046.  * Given an 802.11 frame, this function returns the offset
  1047.  * to the destination address (DA). It does not verify that
  1048.  * the header is long enough to contain the address, and the
  1049.  * header must be long enough to contain the frame control
  1050.  * field.
  1051.  */
  1052. static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
  1053. {
  1054.     if (ieee80211_has_tods(hdr->frame_control))
  1055.         return hdr->addr3;
  1056.     else
  1057.         return hdr->addr1;
  1058. }
  1059.  
  1060. #endif /* IEEE80211_H */
  1061.