Blame view

include/linux/ieee80211.h 52 KB
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * IEEE 802.11 defines
   *
   * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
   * <jkmaline@cc.hut.fi>
   * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
   * Copyright (c) 2005, Devicescape Software, Inc.
   * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
9387b7caf   John W. Linville   wireless: use ind...
14
15
  #ifndef LINUX_IEEE80211_H
  #define LINUX_IEEE80211_H
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
16
17
  
  #include <linux/types.h>
f97df02e2   Johannes Berg   [PATCH] wireless ...
18
  #include <asm/byteorder.h>
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
19

3f46b29cd   Johannes Berg   ieee80211: docume...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  /*
   * DS bit usage
   *
   * TA = transmitter address
   * RA = receiver address
   * DA = destination address
   * SA = source address
   *
   * ToDS    FromDS  A1(RA)  A2(TA)  A3      A4      Use
   * -----------------------------------------------------------------
   *  0       0       DA      SA      BSSID   -       IBSS/DLS
   *  0       1       DA      BSSID   SA      -       AP -> STA
   *  1       0       BSSID   SA      DA      -       AP <- STA
   *  1       1       RA      TA      DA      SA      unspecified (WDS)
   */
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  #define FCS_LEN 4
  
  #define IEEE80211_FCTL_VERS		0x0003
  #define IEEE80211_FCTL_FTYPE		0x000c
  #define IEEE80211_FCTL_STYPE		0x00f0
  #define IEEE80211_FCTL_TODS		0x0100
  #define IEEE80211_FCTL_FROMDS		0x0200
  #define IEEE80211_FCTL_MOREFRAGS	0x0400
  #define IEEE80211_FCTL_RETRY		0x0800
  #define IEEE80211_FCTL_PM		0x1000
  #define IEEE80211_FCTL_MOREDATA		0x2000
  #define IEEE80211_FCTL_PROTECTED	0x4000
  #define IEEE80211_FCTL_ORDER		0x8000
  
  #define IEEE80211_SCTL_FRAG		0x000F
  #define IEEE80211_SCTL_SEQ		0xFFF0
  
  #define IEEE80211_FTYPE_MGMT		0x0000
  #define IEEE80211_FTYPE_CTL		0x0004
  #define IEEE80211_FTYPE_DATA		0x0008
  
  /* management */
  #define IEEE80211_STYPE_ASSOC_REQ	0x0000
  #define IEEE80211_STYPE_ASSOC_RESP	0x0010
  #define IEEE80211_STYPE_REASSOC_REQ	0x0020
  #define IEEE80211_STYPE_REASSOC_RESP	0x0030
  #define IEEE80211_STYPE_PROBE_REQ	0x0040
  #define IEEE80211_STYPE_PROBE_RESP	0x0050
  #define IEEE80211_STYPE_BEACON		0x0080
  #define IEEE80211_STYPE_ATIM		0x0090
  #define IEEE80211_STYPE_DISASSOC	0x00A0
  #define IEEE80211_STYPE_AUTH		0x00B0
  #define IEEE80211_STYPE_DEAUTH		0x00C0
  #define IEEE80211_STYPE_ACTION		0x00D0
  
  /* control */
6b4e32416   Ron Rindjunsky   mac80211: adding ...
71
72
  #define IEEE80211_STYPE_BACK_REQ	0x0080
  #define IEEE80211_STYPE_BACK		0x0090
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  #define IEEE80211_STYPE_PSPOLL		0x00A0
  #define IEEE80211_STYPE_RTS		0x00B0
  #define IEEE80211_STYPE_CTS		0x00C0
  #define IEEE80211_STYPE_ACK		0x00D0
  #define IEEE80211_STYPE_CFEND		0x00E0
  #define IEEE80211_STYPE_CFENDACK	0x00F0
  
  /* data */
  #define IEEE80211_STYPE_DATA			0x0000
  #define IEEE80211_STYPE_DATA_CFACK		0x0010
  #define IEEE80211_STYPE_DATA_CFPOLL		0x0020
  #define IEEE80211_STYPE_DATA_CFACKPOLL		0x0030
  #define IEEE80211_STYPE_NULLFUNC		0x0040
  #define IEEE80211_STYPE_CFACK			0x0050
  #define IEEE80211_STYPE_CFPOLL			0x0060
  #define IEEE80211_STYPE_CFACKPOLL		0x0070
  #define IEEE80211_STYPE_QOS_DATA		0x0080
  #define IEEE80211_STYPE_QOS_DATA_CFACK		0x0090
  #define IEEE80211_STYPE_QOS_DATA_CFPOLL		0x00A0
  #define IEEE80211_STYPE_QOS_DATA_CFACKPOLL	0x00B0
  #define IEEE80211_STYPE_QOS_NULLFUNC		0x00C0
  #define IEEE80211_STYPE_QOS_CFACK		0x00D0
  #define IEEE80211_STYPE_QOS_CFPOLL		0x00E0
  #define IEEE80211_STYPE_QOS_CFACKPOLL		0x00F0
  
  
  /* miscellaneous IEEE 802.11 constants */
c237899d1   Michael Wu   ieee80211: Add IE...
100
101
  #define IEEE80211_MAX_FRAG_THRESHOLD	2352
  #define IEEE80211_MAX_RTS_THRESHOLD	2353
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
102
103
  #define IEEE80211_MAX_AID		2007
  #define IEEE80211_MAX_TIM_LEN		251
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
104
105
  /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
     6.2.1.1.2.
c237899d1   Michael Wu   ieee80211: Add IE...
106
107
108
109
110
     802.11e clarifies the figure in section 7.1.2. The frame body is
     up to 2304 octets long (maximum MSDU size) plus any crypt overhead. */
  #define IEEE80211_MAX_DATA_LEN		2304
  /* 30 byte 4 addr hdr, 2 byte QoS, 2304 byte MSDU, 12 byte crypt, 4 byte FCS */
  #define IEEE80211_MAX_FRAME_LEN		2352
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
111
112
  
  #define IEEE80211_MAX_SSID_LEN		32
1239cd58d   Johannes Berg   wireless: move me...
113

37c579896   Luis Carlos Cobo   wireless: various...
114
  #define IEEE80211_MAX_MESH_ID_LEN	32
1239cd58d   Johannes Berg   wireless: move me...
115

fd7c8a40b   Harvey Harrison   mac80211: add hel...
116
  #define IEEE80211_QOS_CTL_LEN		2
04b7dcf97   Johannes Berg   wireless: unify Q...
117
118
119
120
121
122
123
124
125
126
127
  /* 1d tag mask */
  #define IEEE80211_QOS_CTL_TAG1D_MASK		0x0007
  /* TID mask */
  #define IEEE80211_QOS_CTL_TID_MASK		0x000f
  /* EOSP */
  #define IEEE80211_QOS_CTL_EOSP			0x0010
  /* ACK policy */
  #define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL	0x0000
  #define IEEE80211_QOS_CTL_ACK_POLICY_NOACK	0x0020
  #define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL	0x0040
  #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK	0x0060
6cc00d545   Thomas Pedersen   mac80211: QoS mul...
128
  #define IEEE80211_QOS_CTL_ACK_POLICY_MASK	0x0060
04b7dcf97   Johannes Berg   wireless: unify Q...
129
130
  /* A-MSDU 802.11n */
  #define IEEE80211_QOS_CTL_A_MSDU_PRESENT	0x0080
2154c81c3   Javier Cardona   mac80211: Mesh da...
131
132
  /* Mesh Control 802.11s */
  #define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT  0x0100
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
133

ab13315af   Kalle Valo   mac80211: add U-A...
134
135
  /* U-APSD queue for WMM IEs sent by AP */
  #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD	(1<<7)
44316cb1e   Bing Zhao   ieee80211: add Pa...
136
  #define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK	0x0f
ab13315af   Kalle Valo   mac80211: add U-A...
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  
  /* U-APSD queues for WMM IEs sent by STA */
  #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO	(1<<0)
  #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI	(1<<1)
  #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK	(1<<2)
  #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE	(1<<3)
  #define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK	0x0f
  
  /* U-APSD max SP length for WMM IEs sent by STA */
  #define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL	0x00
  #define IEEE80211_WMM_IE_STA_QOSINFO_SP_2	0x01
  #define IEEE80211_WMM_IE_STA_QOSINFO_SP_4	0x02
  #define IEEE80211_WMM_IE_STA_QOSINFO_SP_6	0x03
  #define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK	0x03
  #define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT	5
d0dd2de0d   Andriy Tkachuk   mac80211: Account...
152
  #define IEEE80211_HT_CTL_LEN		4
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
153
154
155
156
157
158
159
160
161
  struct ieee80211_hdr {
  	__le16 frame_control;
  	__le16 duration_id;
  	u8 addr1[6];
  	u8 addr2[6];
  	u8 addr3[6];
  	__le16 seq_ctrl;
  	u8 addr4[6];
  } __attribute__ ((packed));
7044cc565   Kalle Valo   mac80211: add fun...
162
163
164
165
166
167
168
169
  struct ieee80211_hdr_3addr {
  	__le16 frame_control;
  	__le16 duration_id;
  	u8 addr1[6];
  	u8 addr2[6];
  	u8 addr3[6];
  	__le16 seq_ctrl;
  } __attribute__ ((packed));
558a6669d   Kalle Valo   ieee80211: add st...
170
171
172
173
174
175
176
177
178
  struct ieee80211_qos_hdr {
  	__le16 frame_control;
  	__le16 duration_id;
  	u8 addr1[6];
  	u8 addr2[6];
  	u8 addr3[6];
  	__le16 seq_ctrl;
  	__le16 qos_ctrl;
  } __attribute__ ((packed));
fd7c8a40b   Harvey Harrison   mac80211: add hel...
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
  /**
   * ieee80211_has_tods - check if IEEE80211_FCTL_TODS is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_tods(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
  }
  
  /**
   * ieee80211_has_fromds - check if IEEE80211_FCTL_FROMDS is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_fromds(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
  }
  
  /**
   * ieee80211_has_a4 - check if IEEE80211_FCTL_TODS and IEEE80211_FCTL_FROMDS are set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_a4(__le16 fc)
  {
  	__le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
  	return (fc & tmp) == tmp;
  }
  
  /**
   * ieee80211_has_morefrags - check if IEEE80211_FCTL_MOREFRAGS is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_morefrags(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
  }
  
  /**
   * ieee80211_has_retry - check if IEEE80211_FCTL_RETRY is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_retry(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
  }
  
  /**
   * ieee80211_has_pm - check if IEEE80211_FCTL_PM is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_pm(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
  }
  
  /**
   * ieee80211_has_moredata - check if IEEE80211_FCTL_MOREDATA is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_moredata(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
  }
  
  /**
   * ieee80211_has_protected - check if IEEE80211_FCTL_PROTECTED is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_protected(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
  }
  
  /**
   * ieee80211_has_order - check if IEEE80211_FCTL_ORDER is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_has_order(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
  }
  
  /**
   * ieee80211_is_mgmt - check if type is IEEE80211_FTYPE_MGMT
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_mgmt(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT);
  }
  
  /**
   * ieee80211_is_ctl - check if type is IEEE80211_FTYPE_CTL
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_ctl(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL);
  }
  
  /**
   * ieee80211_is_data - check if type is IEEE80211_FTYPE_DATA
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_data(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_DATA);
  }
  
  /**
   * ieee80211_is_data_qos - check if type is IEEE80211_FTYPE_DATA and IEEE80211_STYPE_QOS_DATA is set
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_data_qos(__le16 fc)
  {
  	/*
  	 * mask with QOS_DATA rather than IEEE80211_FCTL_STYPE as we just need
  	 * to check the one bit
  	 */
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
  }
  
  /**
   * ieee80211_is_data_present - check if type is IEEE80211_FTYPE_DATA and has data
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_data_present(__le16 fc)
  {
  	/*
  	 * mask with 0x40 and test that that bit is clear to only return true
  	 * for the data-containing substypes.
  	 */
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_DATA);
  }
  
  /**
   * ieee80211_is_assoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_REQ
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_assoc_req(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
  }
  
  /**
   * ieee80211_is_assoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ASSOC_RESP
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_assoc_resp(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
  }
  
  /**
   * ieee80211_is_reassoc_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_REQ
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_reassoc_req(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
  }
  
  /**
   * ieee80211_is_reassoc_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_REASSOC_RESP
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_reassoc_resp(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
  }
  
  /**
   * ieee80211_is_probe_req - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_REQ
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_probe_req(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
  }
  
  /**
   * ieee80211_is_probe_resp - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_PROBE_RESP
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_probe_resp(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
  }
  
  /**
   * ieee80211_is_beacon - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_BEACON
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_beacon(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
  }
  
  /**
   * ieee80211_is_atim - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ATIM
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_atim(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
  }
  
  /**
   * ieee80211_is_disassoc - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DISASSOC
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_disassoc(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
  }
  
  /**
   * ieee80211_is_auth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_AUTH
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_auth(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
  }
  
  /**
   * ieee80211_is_deauth - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_DEAUTH
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_deauth(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
  }
  
  /**
   * ieee80211_is_action - check if IEEE80211_FTYPE_MGMT && IEEE80211_STYPE_ACTION
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_action(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
  }
  
  /**
   * ieee80211_is_back_req - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK_REQ
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_back_req(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
  }
  
  /**
   * ieee80211_is_back - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_BACK
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_back(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
  }
  
  /**
   * ieee80211_is_pspoll - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_PSPOLL
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_pspoll(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
  }
  
  /**
   * ieee80211_is_rts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_RTS
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_rts(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
  }
  
  /**
   * ieee80211_is_cts - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CTS
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_cts(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
  }
  
  /**
   * ieee80211_is_ack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_ACK
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_ack(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
  }
  
  /**
   * ieee80211_is_cfend - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFEND
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_cfend(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
  }
  
  /**
   * ieee80211_is_cfendack - check if IEEE80211_FTYPE_CTL && IEEE80211_STYPE_CFENDACK
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_cfendack(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
  }
  
  /**
22403def1   Johannes Berg   mac80211: also dr...
520
   * ieee80211_is_nullfunc - check if frame is a regular (non-QoS) nullfunc frame
fd7c8a40b   Harvey Harrison   mac80211: add hel...
521
522
523
524
525
526
527
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_nullfunc(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
  }
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
528

22403def1   Johannes Berg   mac80211: also dr...
529
530
531
532
533
534
535
536
537
  /**
   * ieee80211_is_qos_nullfunc - check if frame is a QoS nullfunc frame
   * @fc: frame control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_qos_nullfunc(__le16 fc)
  {
  	return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
  	       cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
  }
8cb25e14f   Helmut Schaa   ieee80211: Introd...
538
539
540
541
542
543
544
545
  /**
   * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
   * @seq_ctrl: frame sequence control bytes in little-endian byteorder
   */
  static inline int ieee80211_is_first_frag(__le16 seq_ctrl)
  {
  	return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0;
  }
37c579896   Luis Carlos Cobo   wireless: various...
546
547
548
  struct ieee80211s_hdr {
  	u8 flags;
  	u8 ttl;
51ceddade   Luis Carlos Cobo   mac80211: use 4-b...
549
  	__le32 seqnum;
37c579896   Luis Carlos Cobo   wireless: various...
550
551
  	u8 eaddr1[6];
  	u8 eaddr2[6];
37c579896   Luis Carlos Cobo   wireless: various...
552
  } __attribute__ ((packed));
79617deee   YanBo   mac80211: mesh po...
553
554
555
  /* Mesh flags */
  #define MESH_FLAGS_AE_A4 	0x1
  #define MESH_FLAGS_AE_A5_A6	0x2
e31a16d6f   Zhu Yi   wireless: move so...
556
  #define MESH_FLAGS_AE		0x3
79617deee   YanBo   mac80211: mesh po...
557
  #define MESH_FLAGS_PS_DEEP	0x4
f2df38596   Assaf Krauss   mac80211: 11h Inf...
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
  /**
   * struct ieee80211_quiet_ie
   *
   * This structure refers to "Quiet information element"
   */
  struct ieee80211_quiet_ie {
  	u8 count;
  	u8 period;
  	__le16 duration;
  	__le16 offset;
  } __attribute__ ((packed));
  
  /**
   * struct ieee80211_msrment_ie
   *
   * This structure refers to "Measurement Request/Report information element"
   */
  struct ieee80211_msrment_ie {
  	u8 token;
  	u8 mode;
  	u8 type;
  	u8 request[0];
  } __attribute__ ((packed));
  
  /**
   * struct ieee80211_channel_sw_ie
   *
   * This structure refers to "Channel Switch Announcement information element"
   */
  struct ieee80211_channel_sw_ie {
  	u8 mode;
  	u8 new_ch_num;
  	u8 count;
  } __attribute__ ((packed));
37c579896   Luis Carlos Cobo   wireless: various...
592

98f7dfd86   Emmanuel Grumbach   mac80211: pass dt...
593
594
595
596
597
598
599
600
601
602
  /**
   * struct ieee80211_tim
   *
   * This structure refers to "Traffic Indication Map information element"
   */
  struct ieee80211_tim_ie {
  	u8 dtim_count;
  	u8 dtim_period;
  	u8 bitmap_ctrl;
  	/* variable size: 1 - 251 bytes */
e7ec86f54   Johannes Berg   mac80211: validat...
603
  	u8 virtual_map[1];
98f7dfd86   Emmanuel Grumbach   mac80211: pass dt...
604
  } __attribute__ ((packed));
90a5e1699   Rui Paulo   mac80211: impleme...
605
  /**
136cfa286   Rui Paulo   mac80211: use a s...
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
   * struct ieee80211_meshconf_ie
   *
   * This structure refers to "Mesh Configuration information element"
   */
  struct ieee80211_meshconf_ie {
  	u8 meshconf_psel;
  	u8 meshconf_pmetric;
  	u8 meshconf_congest;
  	u8 meshconf_synch;
  	u8 meshconf_auth;
  	u8 meshconf_form;
  	u8 meshconf_cap;
  } __attribute__ ((packed));
  
  /**
90a5e1699   Rui Paulo   mac80211: impleme...
621
622
623
624
625
626
627
628
629
630
   * struct ieee80211_rann_ie
   *
   * This structure refers to "Root Announcement information element"
   */
  struct ieee80211_rann_ie {
  	u8 rann_flags;
  	u8 rann_hopcount;
  	u8 rann_ttl;
  	u8 rann_addr[6];
  	u32 rann_seq;
25d49e4d6   Thomas Pedersen   mac80211: update ...
631
  	u32 rann_interval;
90a5e1699   Rui Paulo   mac80211: impleme...
632
633
  	u32 rann_metric;
  } __attribute__ ((packed));
5ee68e5b3   Javier Cardona   mac80211: mesh ga...
634
635
636
  enum ieee80211_rann_flags {
  	RANN_FLAG_IS_GATE = 1 << 0,
  };
9dfd6ba35   Jouni Malinen   mac80211: Update ...
637
  #define WLAN_SA_QUERY_TR_ID_LEN 2
fea147328   Jouni Malinen   mac80211: 802.11w...
638

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
  struct ieee80211_mgmt {
  	__le16 frame_control;
  	__le16 duration;
  	u8 da[6];
  	u8 sa[6];
  	u8 bssid[6];
  	__le16 seq_ctrl;
  	union {
  		struct {
  			__le16 auth_alg;
  			__le16 auth_transaction;
  			__le16 status_code;
  			/* possibly followed by Challenge text */
  			u8 variable[0];
  		} __attribute__ ((packed)) auth;
  		struct {
  			__le16 reason_code;
  		} __attribute__ ((packed)) deauth;
  		struct {
  			__le16 capab_info;
  			__le16 listen_interval;
  			/* followed by SSID and Supported rates */
  			u8 variable[0];
  		} __attribute__ ((packed)) assoc_req;
  		struct {
  			__le16 capab_info;
  			__le16 status_code;
  			__le16 aid;
  			/* followed by Supported rates */
  			u8 variable[0];
  		} __attribute__ ((packed)) assoc_resp, reassoc_resp;
  		struct {
  			__le16 capab_info;
  			__le16 listen_interval;
  			u8 current_ap[6];
  			/* followed by SSID and Supported rates */
  			u8 variable[0];
  		} __attribute__ ((packed)) reassoc_req;
  		struct {
  			__le16 reason_code;
  		} __attribute__ ((packed)) disassoc;
  		struct {
  			__le64 timestamp;
  			__le16 beacon_int;
  			__le16 capab_info;
  			/* followed by some of SSID, Supported rates,
  			 * FH Params, DS Params, CF Params, IBSS Params, TIM */
  			u8 variable[0];
  		} __attribute__ ((packed)) beacon;
  		struct {
  			/* only variable items: SSID, Supported rates */
  			u8 variable[0];
  		} __attribute__ ((packed)) probe_req;
  		struct {
  			__le64 timestamp;
  			__le16 beacon_int;
  			__le16 capab_info;
  			/* followed by some of SSID, Supported rates,
  			 * FH Params, DS Params, CF Params, IBSS Params */
  			u8 variable[0];
  		} __attribute__ ((packed)) probe_resp;
  		struct {
  			u8 category;
  			union {
  				struct {
  					u8 action_code;
  					u8 dialog_token;
  					u8 status_code;
  					u8 variable[0];
  				} __attribute__ ((packed)) wme_action;
  				struct{
  					u8 action_code;
  					u8 element_id;
  					u8 length;
f2df38596   Assaf Krauss   mac80211: 11h Inf...
713
  					struct ieee80211_channel_sw_ie sw_elem;
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
714
  				} __attribute__((packed)) chan_switch;
6b4e32416   Ron Rindjunsky   mac80211: adding ...
715
716
717
  				struct{
  					u8 action_code;
  					u8 dialog_token;
f2df38596   Assaf Krauss   mac80211: 11h Inf...
718
719
720
721
722
723
724
  					u8 element_id;
  					u8 length;
  					struct ieee80211_msrment_ie msr_elem;
  				} __attribute__((packed)) measurement;
  				struct{
  					u8 action_code;
  					u8 dialog_token;
6b4e32416   Ron Rindjunsky   mac80211: adding ...
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
  					__le16 capab;
  					__le16 timeout;
  					__le16 start_seq_num;
  				} __attribute__((packed)) addba_req;
  				struct{
  					u8 action_code;
  					u8 dialog_token;
  					__le16 status;
  					__le16 capab;
  					__le16 timeout;
  				} __attribute__((packed)) addba_resp;
  				struct{
  					u8 action_code;
  					__le16 params;
  					__le16 reason_code;
  				} __attribute__((packed)) delba;
6709a6d96   Thomas Pedersen   ieee80211: introd...
741
742
743
744
  				struct {
  					u8 action_code;
  					u8 variable[0];
  				} __attribute__((packed)) self_prot;
37c579896   Luis Carlos Cobo   wireless: various...
745
746
747
748
  				struct{
  					u8 action_code;
  					u8 variable[0];
  				} __attribute__((packed)) mesh_action;
fea147328   Jouni Malinen   mac80211: 802.11w...
749
750
751
752
  				struct {
  					u8 action;
  					u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
  				} __attribute__ ((packed)) sa_query;
0f78231bf   Johannes Berg   mac80211: enable ...
753
754
755
756
  				struct {
  					u8 action;
  					u8 smps_control;
  				} __attribute__ ((packed)) ht_smps;
dfe018bf9   Arik Nemtsov   mac80211: handle ...
757
758
759
760
761
762
  				struct {
  					u8 action_code;
  					u8 dialog_token;
  					__le16 capability;
  					u8 variable[0];
  				} __packed tdls_discover_resp;
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
763
764
765
766
  			} u;
  		} __attribute__ ((packed)) action;
  	} u;
  } __attribute__ ((packed));
c74d084f9   Christian Lamparter   mac80211: handle ...
767
768
  /* Supported Rates value encodings in 802.11n-2009 7.3.2.2 */
  #define BSS_MEMBERSHIP_SELECTOR_HT_PHY	127
44d414dbf   Johannes Berg   mac80211: move so...
769
770
  /* mgmt header + 1 byte category code */
  #define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
771

765cb46a3   Jouni Malinen   mac80211: 802.11w...
772
773
774
775
776
777
778
779
  /* Management MIC information element (IEEE 802.11w) */
  struct ieee80211_mmie {
  	u8 element_id;
  	u8 length;
  	__le16 key_id;
  	u8 sequence_number[6];
  	u8 mic[8];
  } __attribute__ ((packed));
0c28ec587   Eliad Peller   cfg80211: add cfg...
780
781
782
783
784
785
  struct ieee80211_vendor_ie {
  	u8 element_id;
  	u8 len;
  	u8 oui[3];
  	u8 oui_type;
  } __packed;
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
786
787
788
789
790
791
792
793
794
795
796
797
798
  /* Control frames */
  struct ieee80211_rts {
  	__le16 frame_control;
  	__le16 duration;
  	u8 ra[6];
  	u8 ta[6];
  } __attribute__ ((packed));
  
  struct ieee80211_cts {
  	__le16 frame_control;
  	__le16 duration;
  	u8 ra[6];
  } __attribute__ ((packed));
fc6971d49   Jouni Malinen   mac80211_hwsim: A...
799
800
801
802
803
804
  struct ieee80211_pspoll {
  	__le16 frame_control;
  	__le16 aid;
  	u8 bssid[6];
  	u8 ta[6];
  } __attribute__ ((packed));
dfe018bf9   Arik Nemtsov   mac80211: handle ...
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
  /* TDLS */
  
  /* Link-id information element */
  struct ieee80211_tdls_lnkie {
  	u8 ie_type; /* Link Identifier IE */
  	u8 ie_len;
  	u8 bssid[6];
  	u8 init_sta[6];
  	u8 resp_sta[6];
  } __packed;
  
  struct ieee80211_tdls_data {
  	u8 da[6];
  	u8 sa[6];
  	__be16 ether_type;
  	u8 payload_type;
  	u8 category;
  	u8 action_code;
  	union {
  		struct {
  			u8 dialog_token;
  			__le16 capability;
  			u8 variable[0];
  		} __packed setup_req;
  		struct {
  			__le16 status_code;
  			u8 dialog_token;
  			__le16 capability;
  			u8 variable[0];
  		} __packed setup_resp;
  		struct {
  			__le16 status_code;
  			u8 dialog_token;
  			u8 variable[0];
  		} __packed setup_cfm;
  		struct {
  			__le16 reason_code;
  			u8 variable[0];
  		} __packed teardown;
  		struct {
  			u8 dialog_token;
  			u8 variable[0];
  		} __packed discover_req;
  	} u;
  } __packed;
6b4e32416   Ron Rindjunsky   mac80211: adding ...
850
851
852
853
854
855
856
857
858
859
860
  /**
   * struct ieee80211_bar - HT Block Ack Request
   *
   * This structure refers to "HT BlockAckReq" as
   * described in 802.11n draft section 7.2.1.7.1
   */
  struct ieee80211_bar {
  	__le16 frame_control;
  	__le16 duration;
  	__u8 ra[6];
  	__u8 ta[6];
a8b47ea3c   Ron Rindjunsky   mac80211: fixing ...
861
862
  	__le16 control;
  	__le16 start_seq_num;
6b4e32416   Ron Rindjunsky   mac80211: adding ...
863
  } __attribute__((packed));
429a38057   Ron Rindjunsky   mac80211: add blo...
864
  /* 802.11 BAR control masks */
c1407b6cb   Helmut Schaa   wireless: Introdu...
865
866
867
868
869
  #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL	0x0000
  #define IEEE80211_BAR_CTRL_MULTI_TID		0x0002
  #define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA	0x0004
  #define IEEE80211_BAR_CTRL_TID_INFO_MASK	0xf000
  #define IEEE80211_BAR_CTRL_TID_INFO_SHIFT	12
d9fe60dea   Johannes Berg   802.11: clean up/...
870
871
872
873
874
875
  
  #define IEEE80211_HT_MCS_MASK_LEN		10
  
  /**
   * struct ieee80211_mcs_info - MCS information
   * @rx_mask: RX mask
9da3e0681   Luis R. Rodriguez   mac80211: only bo...
876
877
878
879
   * @rx_highest: highest supported RX rate. If set represents
   *	the highest supported RX data rate in units of 1 Mbps.
   *	If this field is 0 this value should not be used to
   *	consider the highest RX data rate supported.
d9fe60dea   Johannes Berg   802.11: clean up/...
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
   * @tx_params: TX parameters
   */
  struct ieee80211_mcs_info {
  	u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN];
  	__le16 rx_highest;
  	u8 tx_params;
  	u8 reserved[3];
  } __attribute__((packed));
  
  /* 802.11n HT capability MSC set */
  #define IEEE80211_HT_MCS_RX_HIGHEST_MASK	0x3ff
  #define IEEE80211_HT_MCS_TX_DEFINED		0x01
  #define IEEE80211_HT_MCS_TX_RX_DIFF		0x02
  /* value 0 == 1 stream etc */
  #define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK	0x0C
  #define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT	2
  #define		IEEE80211_HT_MCS_TX_MAX_STREAMS	4
  #define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION	0x10
  
  /*
   * 802.11n D5.0 20.3.5 / 20.6 says:
   * - indices 0 to 7 and 32 are single spatial stream
   * - 8 to 31 are multiple spatial streams using equal modulation
   *   [8..15 for two streams, 16..23 for three and 24..31 for four]
   * - remainder are multiple spatial streams using unequal modulation
   */
  #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START 33
  #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START_BYTE \
  	(IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8)
6b4e32416   Ron Rindjunsky   mac80211: adding ...
909
910
911
  /**
   * struct ieee80211_ht_cap - HT capabilities
   *
d9fe60dea   Johannes Berg   802.11: clean up/...
912
913
   * This structure is the "HT capabilities element" as
   * described in 802.11n D5.0 7.3.2.57
6b4e32416   Ron Rindjunsky   mac80211: adding ...
914
915
916
917
   */
  struct ieee80211_ht_cap {
  	__le16 cap_info;
  	u8 ampdu_params_info;
d9fe60dea   Johannes Berg   802.11: clean up/...
918
919
920
  
  	/* 16 bytes MCS information */
  	struct ieee80211_mcs_info mcs;
6b4e32416   Ron Rindjunsky   mac80211: adding ...
921
922
923
924
  	__le16 extended_ht_cap_info;
  	__le32 tx_BF_cap_info;
  	u8 antenna_selection_info;
  } __attribute__ ((packed));
d9fe60dea   Johannes Berg   802.11: clean up/...
925
926
927
928
  /* 802.11n HT capabilities masks (for cap_info) */
  #define IEEE80211_HT_CAP_LDPC_CODING		0x0001
  #define IEEE80211_HT_CAP_SUP_WIDTH_20_40	0x0002
  #define IEEE80211_HT_CAP_SM_PS			0x000C
0f78231bf   Johannes Berg   mac80211: enable ...
929
  #define		IEEE80211_HT_CAP_SM_PS_SHIFT	2
d9fe60dea   Johannes Berg   802.11: clean up/...
930
931
932
933
934
  #define IEEE80211_HT_CAP_GRN_FLD		0x0010
  #define IEEE80211_HT_CAP_SGI_20			0x0020
  #define IEEE80211_HT_CAP_SGI_40			0x0040
  #define IEEE80211_HT_CAP_TX_STBC		0x0080
  #define IEEE80211_HT_CAP_RX_STBC		0x0300
f79d9bad3   Felix Fietkau   mac80211: add fla...
935
  #define		IEEE80211_HT_CAP_RX_STBC_SHIFT	8
d9fe60dea   Johannes Berg   802.11: clean up/...
936
937
938
  #define IEEE80211_HT_CAP_DELAY_BA		0x0400
  #define IEEE80211_HT_CAP_MAX_AMSDU		0x0800
  #define IEEE80211_HT_CAP_DSSSCCK40		0x1000
9a418af5d   Johannes Berg   mac80211: fix pee...
939
  #define IEEE80211_HT_CAP_RESERVED		0x2000
d9fe60dea   Johannes Berg   802.11: clean up/...
940
941
  #define IEEE80211_HT_CAP_40MHZ_INTOLERANT	0x4000
  #define IEEE80211_HT_CAP_LSIG_TXOP_PROT		0x8000
4dd365fd5   Bing Zhao   ieee80211: add HT...
942
943
944
945
946
947
948
949
  /* 802.11n HT extended capabilities masks (for extended_ht_cap_info) */
  #define IEEE80211_HT_EXT_CAP_PCO		0x0001
  #define IEEE80211_HT_EXT_CAP_PCO_TIME		0x0006
  #define		IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT	1
  #define IEEE80211_HT_EXT_CAP_MCS_FB		0x0300
  #define		IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT	8
  #define IEEE80211_HT_EXT_CAP_HTC_SUP		0x0400
  #define IEEE80211_HT_EXT_CAP_RD_RESPONDER	0x0800
d9fe60dea   Johannes Berg   802.11: clean up/...
950
951
952
  /* 802.11n HT capability AMPDU settings (for ampdu_params_info) */
  #define IEEE80211_HT_AMPDU_PARM_FACTOR		0x03
  #define IEEE80211_HT_AMPDU_PARM_DENSITY		0x1C
0f78231bf   Johannes Berg   mac80211: enable ...
953
  #define		IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT	2
d9fe60dea   Johannes Berg   802.11: clean up/...
954

d1eba2484   Sujith   mac80211: Add a f...
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
  /*
   * Maximum length of AMPDU that the STA can receive.
   * Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
   */
  enum ieee80211_max_ampdu_length_exp {
  	IEEE80211_HT_MAX_AMPDU_8K = 0,
  	IEEE80211_HT_MAX_AMPDU_16K = 1,
  	IEEE80211_HT_MAX_AMPDU_32K = 2,
  	IEEE80211_HT_MAX_AMPDU_64K = 3
  };
  
  #define IEEE80211_HT_MAX_AMPDU_FACTOR 13
  
  /* Minimum MPDU start spacing */
  enum ieee80211_min_mpdu_spacing {
  	IEEE80211_HT_MPDU_DENSITY_NONE = 0,	/* No restriction */
  	IEEE80211_HT_MPDU_DENSITY_0_25 = 1,	/* 1/4 usec */
  	IEEE80211_HT_MPDU_DENSITY_0_5 = 2,	/* 1/2 usec */
  	IEEE80211_HT_MPDU_DENSITY_1 = 3,	/* 1 usec */
  	IEEE80211_HT_MPDU_DENSITY_2 = 4,	/* 2 usec */
  	IEEE80211_HT_MPDU_DENSITY_4 = 5,	/* 4 usec */
  	IEEE80211_HT_MPDU_DENSITY_8 = 6,	/* 8 usec */
  	IEEE80211_HT_MPDU_DENSITY_16 = 7	/* 16 usec */
  };
6b4e32416   Ron Rindjunsky   mac80211: adding ...
979
  /**
d9fe60dea   Johannes Berg   802.11: clean up/...
980
   * struct ieee80211_ht_info - HT information
6b4e32416   Ron Rindjunsky   mac80211: adding ...
981
   *
d9fe60dea   Johannes Berg   802.11: clean up/...
982
983
   * This structure is the "HT information element" as
   * described in 802.11n D5.0 7.3.2.58
6b4e32416   Ron Rindjunsky   mac80211: adding ...
984
   */
d9fe60dea   Johannes Berg   802.11: clean up/...
985
  struct ieee80211_ht_info {
6b4e32416   Ron Rindjunsky   mac80211: adding ...
986
987
988
989
990
991
  	u8 control_chan;
  	u8 ht_param;
  	__le16 operation_mode;
  	__le16 stbc_param;
  	u8 basic_set[16];
  } __attribute__ ((packed));
d9fe60dea   Johannes Berg   802.11: clean up/...
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
  /* for ht_param */
  #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET		0x03
  #define		IEEE80211_HT_PARAM_CHA_SEC_NONE		0x00
  #define		IEEE80211_HT_PARAM_CHA_SEC_ABOVE	0x01
  #define		IEEE80211_HT_PARAM_CHA_SEC_BELOW	0x03
  #define IEEE80211_HT_PARAM_CHAN_WIDTH_ANY		0x04
  #define IEEE80211_HT_PARAM_RIFS_MODE			0x08
  #define IEEE80211_HT_PARAM_SPSMP_SUPPORT		0x10
  #define IEEE80211_HT_PARAM_SERV_INTERVAL_GRAN		0xE0
  
  /* for operation_mode */
  #define IEEE80211_HT_OP_MODE_PROTECTION			0x0003
  #define		IEEE80211_HT_OP_MODE_PROTECTION_NONE		0
  #define		IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER	1
  #define		IEEE80211_HT_OP_MODE_PROTECTION_20MHZ		2
  #define		IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED	3
  #define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT		0x0004
  #define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT		0x0010
  
  /* for stbc_param */
  #define IEEE80211_HT_STBC_PARAM_DUAL_BEACON		0x0040
  #define IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT		0x0080
  #define IEEE80211_HT_STBC_PARAM_STBC_BEACON		0x0100
  #define IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT	0x0200
  #define IEEE80211_HT_STBC_PARAM_PCO_ACTIVE		0x0400
  #define IEEE80211_HT_STBC_PARAM_PCO_PHASE		0x0800
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1018

44d414dbf   Johannes Berg   mac80211: move so...
1019
1020
1021
  /* block-ack parameters */
  #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
  #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
8d661f1e4   Amitkumar Karwar   ieee80211: correc...
1022
  #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
44d414dbf   Johannes Berg   mac80211: move so...
1023
1024
1025
1026
1027
1028
1029
1030
1031
  #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
  #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
  
  /*
   * A-PMDU buffer sizes
   * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
   */
  #define IEEE80211_MIN_AMPDU_BUF 0x8
  #define IEEE80211_MAX_AMPDU_BUF 0x40
0f78231bf   Johannes Berg   mac80211: enable ...
1032
  /* Spatial Multiplexing Power Save Modes (for capability) */
00c5ae2fa   Tomas Winkler   mac80211: change ...
1033
1034
1035
1036
  #define WLAN_HT_CAP_SM_PS_STATIC	0
  #define WLAN_HT_CAP_SM_PS_DYNAMIC	1
  #define WLAN_HT_CAP_SM_PS_INVALID	2
  #define WLAN_HT_CAP_SM_PS_DISABLED	3
e53cfe0ea   Tomas Winkler   iwlwifi: Fix MIMO...
1037

0f78231bf   Johannes Berg   mac80211: enable ...
1038
1039
1040
1041
  /* for SM power control field lower two bits */
  #define WLAN_HT_SMPS_CONTROL_DISABLED	0
  #define WLAN_HT_SMPS_CONTROL_STATIC	1
  #define WLAN_HT_SMPS_CONTROL_DYNAMIC	3
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1042
1043
1044
  /* Authentication algorithms */
  #define WLAN_AUTH_OPEN 0
  #define WLAN_AUTH_SHARED_KEY 1
636a5d362   Jouni Malinen   nl80211: Add MLME...
1045
  #define WLAN_AUTH_FT 2
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1046
  #define WLAN_AUTH_SAE 3
bb608e9db   Senthil Balasubramanian   wireless: Incorre...
1047
  #define WLAN_AUTH_LEAP 128
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1048
1049
1050
1051
1052
  
  #define WLAN_AUTH_CHALLENGE_LEN 128
  
  #define WLAN_CAPABILITY_ESS		(1<<0)
  #define WLAN_CAPABILITY_IBSS		(1<<1)
0a35d36d6   Javier Cardona   cfg80211: Use cap...
1053

333ba7325   Eliad Peller   cfg80211: don't d...
1054
1055
1056
1057
1058
1059
  /*
   * A mesh STA sets the ESS and IBSS capability bits to zero.
   * however, this holds true for p2p probe responses (in the p2p_find
   * phase) as well.
   */
  #define WLAN_CAPABILITY_IS_STA_BSS(cap)	\
0a35d36d6   Javier Cardona   cfg80211: Use cap...
1060
  	(!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1061
1062
1063
1064
1065
1066
  #define WLAN_CAPABILITY_CF_POLLABLE	(1<<2)
  #define WLAN_CAPABILITY_CF_POLL_REQUEST	(1<<3)
  #define WLAN_CAPABILITY_PRIVACY		(1<<4)
  #define WLAN_CAPABILITY_SHORT_PREAMBLE	(1<<5)
  #define WLAN_CAPABILITY_PBCC		(1<<6)
  #define WLAN_CAPABILITY_CHANNEL_AGILITY	(1<<7)
b66234866   Assaf Krauss   mac80211: 11h - H...
1067

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1068
1069
1070
1071
1072
  /* 802.11h */
  #define WLAN_CAPABILITY_SPECTRUM_MGMT	(1<<8)
  #define WLAN_CAPABILITY_QOS		(1<<9)
  #define WLAN_CAPABILITY_SHORT_SLOT_TIME	(1<<10)
  #define WLAN_CAPABILITY_DSSS_OFDM	(1<<13)
b66234866   Assaf Krauss   mac80211: 11h - H...
1073
1074
1075
1076
1077
1078
1079
1080
  /* measurement */
  #define IEEE80211_SPCT_MSR_RPRT_MODE_LATE	(1<<0)
  #define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE	(1<<1)
  #define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED	(1<<2)
  
  #define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC	0
  #define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA	1
  #define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI	2
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1081

5628221ca   Daniel Drake   [PATCH] mac80211:...
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
  /* 802.11g ERP information element */
  #define WLAN_ERP_NON_ERP_PRESENT (1<<0)
  #define WLAN_ERP_USE_PROTECTION (1<<1)
  #define WLAN_ERP_BARKER_PREAMBLE (1<<2)
  
  /* WLAN_ERP_BARKER_PREAMBLE values */
  enum {
  	WLAN_ERP_PREAMBLE_SHORT = 0,
  	WLAN_ERP_PREAMBLE_LONG = 1,
  };
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
  /* Status codes */
  enum ieee80211_statuscode {
  	WLAN_STATUS_SUCCESS = 0,
  	WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
  	WLAN_STATUS_CAPS_UNSUPPORTED = 10,
  	WLAN_STATUS_REASSOC_NO_ASSOC = 11,
  	WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
  	WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
  	WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
  	WLAN_STATUS_CHALLENGE_FAIL = 15,
  	WLAN_STATUS_AUTH_TIMEOUT = 16,
  	WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
  	WLAN_STATUS_ASSOC_DENIED_RATES = 18,
  	/* 802.11b */
  	WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
  	WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
  	WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
  	/* 802.11h */
  	WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
  	WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
  	WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
  	/* 802.11g */
  	WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
  	WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
63a5ab822   Jouni Malinen   mac80211: 802.11w...
1116
1117
1118
  	/* 802.11w */
  	WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY = 30,
  	WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31,
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1119
1120
1121
1122
1123
1124
1125
1126
  	/* 802.11i */
  	WLAN_STATUS_INVALID_IE = 40,
  	WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
  	WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
  	WLAN_STATUS_INVALID_AKMP = 43,
  	WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
  	WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
  	WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
6b4e32416   Ron Rindjunsky   mac80211: adding ...
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
  	/* 802.11e */
  	WLAN_STATUS_UNSPECIFIED_QOS = 32,
  	WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
  	WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
  	WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
  	WLAN_STATUS_REQUEST_DECLINED = 37,
  	WLAN_STATUS_INVALID_QOS_PARAM = 38,
  	WLAN_STATUS_CHANGE_TSPEC = 39,
  	WLAN_STATUS_WAIT_TS_DELAY = 47,
  	WLAN_STATUS_NO_DIRECT_LINK = 48,
  	WLAN_STATUS_STA_NOT_PRESENT = 49,
  	WLAN_STATUS_STA_NOT_QSTA = 50,
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1139
1140
1141
1142
  	/* 802.11s */
  	WLAN_STATUS_ANTI_CLOG_REQUIRED = 76,
  	WLAN_STATUS_FCG_NOT_SUPP = 78,
  	WLAN_STATUS_STA_NO_TBTT = 78,
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
  };
  
  
  /* Reason codes */
  enum ieee80211_reasoncode {
  	WLAN_REASON_UNSPECIFIED = 1,
  	WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
  	WLAN_REASON_DEAUTH_LEAVING = 3,
  	WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
  	WLAN_REASON_DISASSOC_AP_BUSY = 5,
  	WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
  	WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
  	WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
  	WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
  	/* 802.11h */
  	WLAN_REASON_DISASSOC_BAD_POWER = 10,
  	WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
  	/* 802.11i */
  	WLAN_REASON_INVALID_IE = 13,
  	WLAN_REASON_MIC_FAILURE = 14,
  	WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
  	WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
  	WLAN_REASON_IE_DIFFERENT = 17,
  	WLAN_REASON_INVALID_GROUP_CIPHER = 18,
  	WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
  	WLAN_REASON_INVALID_AKMP = 20,
  	WLAN_REASON_UNSUPP_RSN_VERSION = 21,
  	WLAN_REASON_INVALID_RSN_IE_CAP = 22,
  	WLAN_REASON_IEEE8021X_FAILED = 23,
  	WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
6b4e32416   Ron Rindjunsky   mac80211: adding ...
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
  	/* 802.11e */
  	WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
  	WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
  	WLAN_REASON_DISASSOC_LOW_ACK = 34,
  	WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
  	WLAN_REASON_QSTA_LEAVE_QBSS = 36,
  	WLAN_REASON_QSTA_NOT_USE = 37,
  	WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
  	WLAN_REASON_QSTA_TIMEOUT = 39,
  	WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
  	/* 802.11s */
  	WLAN_REASON_MESH_PEER_CANCELED = 52,
  	WLAN_REASON_MESH_MAX_PEERS = 53,
  	WLAN_REASON_MESH_CONFIG = 54,
  	WLAN_REASON_MESH_CLOSE = 55,
  	WLAN_REASON_MESH_MAX_RETRIES = 56,
  	WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57,
  	WLAN_REASON_MESH_INVALID_GTK = 58,
  	WLAN_REASON_MESH_INCONSISTENT_PARAM = 59,
  	WLAN_REASON_MESH_INVALID_SECURITY = 60,
  	WLAN_REASON_MESH_PATH_ERROR = 61,
  	WLAN_REASON_MESH_PATH_NOFORWARD = 62,
  	WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63,
  	WLAN_REASON_MAC_EXISTS_IN_MBSS = 64,
  	WLAN_REASON_MESH_CHAN_REGULATORY = 65,
  	WLAN_REASON_MESH_CHAN = 66,
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
  };
  
  
  /* Information Element IDs */
  enum ieee80211_eid {
  	WLAN_EID_SSID = 0,
  	WLAN_EID_SUPP_RATES = 1,
  	WLAN_EID_FH_PARAMS = 2,
  	WLAN_EID_DS_PARAMS = 3,
  	WLAN_EID_CF_PARAMS = 4,
  	WLAN_EID_TIM = 5,
  	WLAN_EID_IBSS_PARAMS = 6,
  	WLAN_EID_CHALLENGE = 16,
8e664fb3f   Johannes Berg   mac80211: split u...
1212

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1213
1214
1215
1216
  	WLAN_EID_COUNTRY = 7,
  	WLAN_EID_HP_PARAMS = 8,
  	WLAN_EID_HP_TABLE = 9,
  	WLAN_EID_REQUEST = 10,
8e664fb3f   Johannes Berg   mac80211: split u...
1217

6b4e32416   Ron Rindjunsky   mac80211: adding ...
1218
1219
1220
1221
1222
1223
1224
1225
  	WLAN_EID_QBSS_LOAD = 11,
  	WLAN_EID_EDCA_PARAM_SET = 12,
  	WLAN_EID_TSPEC = 13,
  	WLAN_EID_TCLAS = 14,
  	WLAN_EID_SCHEDULE = 15,
  	WLAN_EID_TS_DELAY = 43,
  	WLAN_EID_TCLAS_PROCESSING = 44,
  	WLAN_EID_QOS_CAPA = 46,
dfe018bf9   Arik Nemtsov   mac80211: handle ...
1226
1227
  	/* 802.11z */
  	WLAN_EID_LINK_ID = 101,
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1228
1229
1230
1231
1232
  	/* 802.11s */
  	WLAN_EID_MESH_CONFIG = 113,
  	WLAN_EID_MESH_ID = 114,
  	WLAN_EID_LINK_METRIC_REPORT = 115,
  	WLAN_EID_CONGESTION_NOTIFICATION = 116,
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
  	WLAN_EID_PEER_MGMT = 117,
  	WLAN_EID_CHAN_SWITCH_PARAM = 118,
  	WLAN_EID_MESH_AWAKE_WINDOW = 119,
  	WLAN_EID_BEACON_TIMING = 120,
  	WLAN_EID_MCCAOP_SETUP_REQ = 121,
  	WLAN_EID_MCCAOP_SETUP_RESP = 122,
  	WLAN_EID_MCCAOP_ADVERT = 123,
  	WLAN_EID_MCCAOP_TEARDOWN = 124,
  	WLAN_EID_GANN = 125,
  	WLAN_EID_RANN = 126,
  	WLAN_EID_PREQ = 130,
  	WLAN_EID_PREP = 131,
  	WLAN_EID_PERR = 132,
  	WLAN_EID_PXU = 137,
  	WLAN_EID_PXUC = 138,
  	WLAN_EID_AUTH_MESH_PEER_EXCH = 139,
  	WLAN_EID_MIC = 140,
8e664fb3f   Johannes Berg   mac80211: split u...
1250

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
  	WLAN_EID_PWR_CONSTRAINT = 32,
  	WLAN_EID_PWR_CAPABILITY = 33,
  	WLAN_EID_TPC_REQUEST = 34,
  	WLAN_EID_TPC_REPORT = 35,
  	WLAN_EID_SUPPORTED_CHANNELS = 36,
  	WLAN_EID_CHANNEL_SWITCH = 37,
  	WLAN_EID_MEASURE_REQUEST = 38,
  	WLAN_EID_MEASURE_REPORT = 39,
  	WLAN_EID_QUIET = 40,
  	WLAN_EID_IBSS_DFS = 41,
8e664fb3f   Johannes Berg   mac80211: split u...
1261

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1262
1263
  	WLAN_EID_ERP_INFO = 42,
  	WLAN_EID_EXT_SUPP_RATES = 50,
8e664fb3f   Johannes Berg   mac80211: split u...
1264

6b4e32416   Ron Rindjunsky   mac80211: adding ...
1265
  	WLAN_EID_HT_CAPABILITY = 45,
d9fe60dea   Johannes Berg   802.11: clean up/...
1266
  	WLAN_EID_HT_INFORMATION = 61,
8e664fb3f   Johannes Berg   mac80211: split u...
1267

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1268
  	WLAN_EID_RSN = 48,
8e664fb3f   Johannes Berg   mac80211: split u...
1269
  	WLAN_EID_MMIE = 76,
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1270
1271
1272
  	WLAN_EID_WPA = 221,
  	WLAN_EID_GENERIC = 221,
  	WLAN_EID_VENDOR_SPECIFIC = 221,
8e664fb3f   Johannes Berg   mac80211: split u...
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
  	WLAN_EID_QOS_PARAMETER = 222,
  
  	WLAN_EID_AP_CHAN_REPORT = 51,
  	WLAN_EID_NEIGHBOR_REPORT = 52,
  	WLAN_EID_RCPI = 53,
  	WLAN_EID_BSS_AVG_ACCESS_DELAY = 63,
  	WLAN_EID_ANTENNA_INFO = 64,
  	WLAN_EID_RSNI = 65,
  	WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66,
  	WLAN_EID_BSS_AVAILABLE_CAPACITY = 67,
  	WLAN_EID_BSS_AC_ACCESS_DELAY = 68,
  	WLAN_EID_RRM_ENABLED_CAPABILITIES = 70,
  	WLAN_EID_MULTIPLE_BSSID = 71,
b7e8941b2   Amitkumar Karwar   cfg80211: add som...
1286
1287
1288
  	WLAN_EID_BSS_COEX_2040 = 72,
  	WLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74,
  	WLAN_EID_EXT_CAPABILITY = 127,
8e664fb3f   Johannes Berg   mac80211: split u...
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
  
  	WLAN_EID_MOBILITY_DOMAIN = 54,
  	WLAN_EID_FAST_BSS_TRANSITION = 55,
  	WLAN_EID_TIMEOUT_INTERVAL = 56,
  	WLAN_EID_RIC_DATA = 57,
  	WLAN_EID_RIC_DESCRIPTOR = 75,
  
  	WLAN_EID_DSE_REGISTERED_LOCATION = 58,
  	WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59,
  	WLAN_EID_EXT_CHANSWITCH_ANN = 60,
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1299
  };
6b4e32416   Ron Rindjunsky   mac80211: adding ...
1300
1301
1302
1303
1304
1305
  /* Action category code */
  enum ieee80211_category {
  	WLAN_CATEGORY_SPECTRUM_MGMT = 0,
  	WLAN_CATEGORY_QOS = 1,
  	WLAN_CATEGORY_DLS = 2,
  	WLAN_CATEGORY_BACK = 3,
fb7333367   Jouni Malinen   mac80211: 802.11w...
1306
  	WLAN_CATEGORY_PUBLIC = 4,
528769cf1   Jouni Malinen   mac80211: Robust ...
1307
  	WLAN_CATEGORY_HT = 7,
fea147328   Jouni Malinen   mac80211: 802.11w...
1308
  	WLAN_CATEGORY_SA_QUERY = 8,
528769cf1   Jouni Malinen   mac80211: Robust ...
1309
  	WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9,
dfe018bf9   Arik Nemtsov   mac80211: handle ...
1310
  	WLAN_CATEGORY_TDLS = 12,
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1311
1312
1313
  	WLAN_CATEGORY_MESH_ACTION = 13,
  	WLAN_CATEGORY_MULTIHOP_ACTION = 14,
  	WLAN_CATEGORY_SELF_PROTECTED = 15,
6b4e32416   Ron Rindjunsky   mac80211: adding ...
1314
  	WLAN_CATEGORY_WMM = 17,
528769cf1   Jouni Malinen   mac80211: Robust ...
1315
1316
  	WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
  	WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
6b4e32416   Ron Rindjunsky   mac80211: adding ...
1317
  };
f2df38596   Assaf Krauss   mac80211: 11h Inf...
1318
1319
1320
1321
1322
1323
1324
1325
  /* SPECTRUM_MGMT action code */
  enum ieee80211_spectrum_mgmt_actioncode {
  	WLAN_ACTION_SPCT_MSR_REQ = 0,
  	WLAN_ACTION_SPCT_MSR_RPRT = 1,
  	WLAN_ACTION_SPCT_TPC_REQ = 2,
  	WLAN_ACTION_SPCT_TPC_RPRT = 3,
  	WLAN_ACTION_SPCT_CHL_SWITCH = 4,
  };
0f78231bf   Johannes Berg   mac80211: enable ...
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
  /* HT action codes */
  enum ieee80211_ht_actioncode {
  	WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0,
  	WLAN_HT_ACTION_SMPS = 1,
  	WLAN_HT_ACTION_PSMP = 2,
  	WLAN_HT_ACTION_PCO_PHASE = 3,
  	WLAN_HT_ACTION_CSI = 4,
  	WLAN_HT_ACTION_NONCOMPRESSED_BF = 5,
  	WLAN_HT_ACTION_COMPRESSED_BF = 6,
  	WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,
  };
6709a6d96   Thomas Pedersen   ieee80211: introd...
1337
1338
1339
1340
1341
1342
1343
1344
1345
  /* Self Protected Action codes */
  enum ieee80211_self_protected_actioncode {
  	WLAN_SP_RESERVED = 0,
  	WLAN_SP_MESH_PEERING_OPEN = 1,
  	WLAN_SP_MESH_PEERING_CONFIRM = 2,
  	WLAN_SP_MESH_PEERING_CLOSE = 3,
  	WLAN_SP_MGK_INFORM = 4,
  	WLAN_SP_MGK_ACK = 5,
  };
36c704fde   Thomas Pedersen   ieee80211: add me...
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
  /* Mesh action codes */
  enum ieee80211_mesh_actioncode {
  	WLAN_MESH_ACTION_LINK_METRIC_REPORT,
  	WLAN_MESH_ACTION_HWMP_PATH_SELECTION,
  	WLAN_MESH_ACTION_GATE_ANNOUNCEMENT,
  	WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION,
  	WLAN_MESH_ACTION_MCCA_SETUP_REQUEST,
  	WLAN_MESH_ACTION_MCCA_SETUP_REPLY,
  	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST,
  	WLAN_MESH_ACTION_MCCA_ADVERTISEMENT,
  	WLAN_MESH_ACTION_MCCA_TEARDOWN,
  	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST,
  	WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE,
  };
e31a16d6f   Zhu Yi   wireless: move so...
1360
1361
1362
1363
1364
1365
  /* Security key length */
  enum ieee80211_key_len {
  	WLAN_KEY_LEN_WEP40 = 5,
  	WLAN_KEY_LEN_WEP104 = 13,
  	WLAN_KEY_LEN_CCMP = 16,
  	WLAN_KEY_LEN_TKIP = 32,
8fc0fee09   Johannes Berg   cfg80211: use key...
1366
  	WLAN_KEY_LEN_AES_CMAC = 16,
e31a16d6f   Zhu Yi   wireless: move so...
1367
  };
dfe018bf9   Arik Nemtsov   mac80211: handle ...
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
  /* Public action codes */
  enum ieee80211_pub_actioncode {
  	WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
  };
  
  /* TDLS action codes */
  enum ieee80211_tdls_actioncode {
  	WLAN_TDLS_SETUP_REQUEST = 0,
  	WLAN_TDLS_SETUP_RESPONSE = 1,
  	WLAN_TDLS_SETUP_CONFIRM = 2,
  	WLAN_TDLS_TEARDOWN = 3,
  	WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4,
  	WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5,
  	WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6,
  	WLAN_TDLS_PEER_PSM_REQUEST = 7,
  	WLAN_TDLS_PEER_PSM_RESPONSE = 8,
  	WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9,
  	WLAN_TDLS_DISCOVERY_REQUEST = 10,
  };
  
  /*
   * TDLS capabililites to be enabled in the 5th byte of the
   * @WLAN_EID_EXT_CAPABILITY information element
   */
  #define WLAN_EXT_CAPA5_TDLS_ENABLED	BIT(5)
  #define WLAN_EXT_CAPA5_TDLS_PROHIBITED	BIT(6)
  
  /* TDLS specific payload type in the LLC/SNAP header */
  #define WLAN_TDLS_SNAP_RFTYPE	0x2
c80d545da   Javier Cardona   mac80211: Let use...
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
  /**
   * enum - mesh path selection protocol identifier
   *
   * @IEEE80211_PATH_PROTOCOL_HWMP: the default path selection protocol
   * @IEEE80211_PATH_PROTOCOL_VENDOR: a vendor specific protocol that will
   * be specified in a vendor specific information element
   */
  enum {
  	IEEE80211_PATH_PROTOCOL_HWMP = 0,
  	IEEE80211_PATH_PROTOCOL_VENDOR = 255,
  };
  
  /**
   * enum - mesh path selection metric identifier
   *
   * @IEEE80211_PATH_METRIC_AIRTIME: the default path selection metric
   * @IEEE80211_PATH_METRIC_VENDOR: a vendor specific metric that will be
   * specified in a vendor specific information element
   */
  enum {
  	IEEE80211_PATH_METRIC_AIRTIME = 0,
  	IEEE80211_PATH_METRIC_VENDOR = 255,
  };
3f2355cb9   Luis R. Rodriguez   cfg80211/mac80211...
1420
1421
1422
1423
1424
1425
1426
1427
1428
  /*
   * IEEE 802.11-2007 7.3.2.9 Country information element
   *
   * Minimum length is 8 octets, ie len must be evenly
   * divisible by 2
   */
  
  /* Although the spec says 8 I'm seeing 6 in practice */
  #define IEEE80211_COUNTRY_IE_MIN_LEN	6
80751e2b8   Bing Zhao   ieee80211: add IE...
1429
1430
  /* The Country String field of the element shall be 3 octets in length */
  #define IEEE80211_COUNTRY_STRING_LEN	3
3f2355cb9   Luis R. Rodriguez   cfg80211/mac80211...
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
  /*
   * For regulatory extension stuff see IEEE 802.11-2007
   * Annex I (page 1141) and Annex J (page 1147). Also
   * review 7.3.2.9.
   *
   * When dot11RegulatoryClassesRequired is true and the
   * first_channel/reg_extension_id is >= 201 then the IE
   * compromises of the 'ext' struct represented below:
   *
   *  - Regulatory extension ID - when generating IE this just needs
   *    to be monotonically increasing for each triplet passed in
   *    the IE
   *  - Regulatory class - index into set of rules
   *  - Coverage class - index into air propagation time (Table 7-27),
   *    in microseconds, you can compute the air propagation time from
   *    the index by multiplying by 3, so index 10 yields a propagation
   *    of 10 us. Valid values are 0-31, values 32-255 are not defined
   *    yet. A value of 0 inicates air propagation of <= 1 us.
   *
   *  See also Table I.2 for Emission limit sets and table
   *  I.3 for Behavior limit sets. Table J.1 indicates how to map
   *  a reg_class to an emission limit set and behavior limit set.
   */
  #define IEEE80211_COUNTRY_EXTENSION_ID 201
  
  /*
   *  Channels numbers in the IE must be monotonically increasing
   *  if dot11RegulatoryClassesRequired is not true.
   *
   *  If dot11RegulatoryClassesRequired is true consecutive
   *  subband triplets following a regulatory triplet shall
   *  have monotonically increasing first_channel number fields.
   *
   *  Channel numbers shall not overlap.
   *
   *  Note that max_power is signed.
   */
  struct ieee80211_country_ie_triplet {
  	union {
  		struct {
  			u8 first_channel;
  			u8 num_channels;
  			s8 max_power;
  		} __attribute__ ((packed)) chans;
  		struct {
  			u8 reg_extension_id;
  			u8 reg_class;
  			u8 coverage_class;
  		} __attribute__ ((packed)) ext;
  	};
  } __attribute__ ((packed));
f797eb7e2   Jouni Malinen   mac80211: Fix MFP...
1482
1483
1484
1485
1486
  enum ieee80211_timeout_interval_type {
  	WLAN_TIMEOUT_REASSOC_DEADLINE = 1 /* 802.11r */,
  	WLAN_TIMEOUT_KEY_LIFETIME = 2 /* 802.11r */,
  	WLAN_TIMEOUT_ASSOC_COMEBACK = 3 /* 802.11w */,
  };
6b4e32416   Ron Rindjunsky   mac80211: adding ...
1487
1488
1489
1490
1491
1492
  /* BACK action code */
  enum ieee80211_back_actioncode {
  	WLAN_ACTION_ADDBA_REQ = 0,
  	WLAN_ACTION_ADDBA_RESP = 1,
  	WLAN_ACTION_DELBA = 2,
  };
07db21839   Ron Rindjunsky   mac80211: A-MPDU ...
1493
1494
1495
1496
  /* BACK (block-ack) parties */
  enum ieee80211_back_parties {
  	WLAN_BACK_RECIPIENT = 0,
  	WLAN_BACK_INITIATOR = 1,
07db21839   Ron Rindjunsky   mac80211: A-MPDU ...
1497
  };
fea147328   Jouni Malinen   mac80211: 802.11w...
1498
1499
1500
1501
1502
  /* SA Query action */
  enum ieee80211_sa_query_action {
  	WLAN_ACTION_SA_QUERY_REQUEST = 0,
  	WLAN_ACTION_SA_QUERY_RESPONSE = 1,
  };
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1503
1504
1505
1506
1507
1508
1509
  /* cipher suite selectors */
  #define WLAN_CIPHER_SUITE_USE_GROUP	0x000FAC00
  #define WLAN_CIPHER_SUITE_WEP40		0x000FAC01
  #define WLAN_CIPHER_SUITE_TKIP		0x000FAC02
  /* reserved: 				0x000FAC03 */
  #define WLAN_CIPHER_SUITE_CCMP		0x000FAC04
  #define WLAN_CIPHER_SUITE_WEP104	0x000FAC05
3cfcf6ac6   Jouni Malinen   mac80211: 802.11w...
1510
  #define WLAN_CIPHER_SUITE_AES_CMAC	0x000FAC06
a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1511

c2e889a7f   Jouni Malinen   ieee80211: Define...
1512
  #define WLAN_CIPHER_SUITE_SMS4		0x00147201
6a669e65c   Johannes Berg   wireless: define ...
1513
1514
1515
  /* AKM suite selectors */
  #define WLAN_AKM_SUITE_8021X		0x000FAC01
  #define WLAN_AKM_SUITE_PSK		0x000FAC02
cfdfa4d3a   Steve deRosier   mac80211: Update ...
1516
1517
  #define WLAN_AKM_SUITE_SAE			0x000FAC08
  #define WLAN_AKM_SUITE_FT_OVER_SAE	0x000FAC09
6a669e65c   Johannes Berg   wireless: define ...
1518

a9de8ce09   Jiri Benc   [MAC80211]: Add g...
1519
  #define WLAN_MAX_KEY_LEN		32
67fbb16be   Samuel Ortiz   nl80211: PMKSA ca...
1520
  #define WLAN_PMKID_LEN			16
0c28ec587   Eliad Peller   cfg80211: add cfg...
1521
1522
  #define WLAN_OUI_WFA			0x506f9a
  #define WLAN_OUI_TYPE_WFA_P2P		9
856799d58   Kalle Valo   ieee80211: add fe...
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
  /*
   * WMM/802.11e Tspec Element
   */
  #define IEEE80211_WMM_IE_TSPEC_TID_MASK		0x0F
  #define IEEE80211_WMM_IE_TSPEC_TID_SHIFT	1
  
  enum ieee80211_tspec_status_code {
  	IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED = 0,
  	IEEE80211_TSPEC_STATUS_ADDTS_INVAL_PARAMS = 0x1,
  };
  
  struct ieee80211_tspec_ie {
  	u8 element_id;
  	u8 len;
  	u8 oui[3];
  	u8 oui_type;
  	u8 oui_subtype;
  	u8 version;
  	__le16 tsinfo;
  	u8 tsinfo_resvd;
  	__le16 nominal_msdu;
  	__le16 max_msdu;
  	__le32 min_service_int;
  	__le32 max_service_int;
  	__le32 inactivity_int;
  	__le32 suspension_int;
  	__le32 service_start_time;
  	__le32 min_data_rate;
  	__le32 mean_data_rate;
  	__le32 peak_data_rate;
  	__le32 max_burst_size;
  	__le32 delay_bound;
  	__le32 min_phy_rate;
  	__le16 sba;
  	__le16 medium_time;
  } __packed;
f97df02e2   Johannes Berg   [PATCH] wireless ...
1559
  /**
fd7c8a40b   Harvey Harrison   mac80211: add hel...
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
   * ieee80211_get_qos_ctl - get pointer to qos control bytes
   * @hdr: the frame
   *
   * The qos ctrl bytes come after the frame_control, duration, seq_num
   * and 3 or 4 addresses of length ETH_ALEN.
   * 3 addr: 2 + 2 + 2 + 3*6 = 24
   * 4 addr: 2 + 2 + 2 + 4*6 = 30
   */
  static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
  {
  	if (ieee80211_has_a4(hdr->frame_control))
  		return (u8 *)hdr + 30;
  	else
  		return (u8 *)hdr + 24;
  }
  
  /**
f97df02e2   Johannes Berg   [PATCH] wireless ...
1577
   * ieee80211_get_SA - get pointer to SA
fd7c8a40b   Harvey Harrison   mac80211: add hel...
1578
   * @hdr: the frame
f97df02e2   Johannes Berg   [PATCH] wireless ...
1579
1580
1581
1582
1583
1584
   *
   * Given an 802.11 frame, this function returns the offset
   * to the source address (SA). It does not verify that the
   * header is long enough to contain the address, and the
   * header must be long enough to contain the frame control
   * field.
f97df02e2   Johannes Berg   [PATCH] wireless ...
1585
1586
1587
   */
  static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
  {
fd7c8a40b   Harvey Harrison   mac80211: add hel...
1588
  	if (ieee80211_has_a4(hdr->frame_control))
5a433b3ad   Harvey Harrison   mac80211: remove ...
1589
  		return hdr->addr4;
fd7c8a40b   Harvey Harrison   mac80211: add hel...
1590
1591
1592
  	if (ieee80211_has_fromds(hdr->frame_control))
  		return hdr->addr3;
  	return hdr->addr2;
f97df02e2   Johannes Berg   [PATCH] wireless ...
1593
1594
1595
1596
  }
  
  /**
   * ieee80211_get_DA - get pointer to DA
fd7c8a40b   Harvey Harrison   mac80211: add hel...
1597
   * @hdr: the frame
f97df02e2   Johannes Berg   [PATCH] wireless ...
1598
1599
1600
1601
1602
1603
   *
   * Given an 802.11 frame, this function returns the offset
   * to the destination address (DA). It does not verify that
   * the header is long enough to contain the address, and the
   * header must be long enough to contain the frame control
   * field.
f97df02e2   Johannes Berg   [PATCH] wireless ...
1604
1605
1606
   */
  static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
  {
fd7c8a40b   Harvey Harrison   mac80211: add hel...
1607
  	if (ieee80211_has_tods(hdr->frame_control))
f97df02e2   Johannes Berg   [PATCH] wireless ...
1608
  		return hdr->addr3;
5a433b3ad   Harvey Harrison   mac80211: remove ...
1609
1610
  	else
  		return hdr->addr1;
f97df02e2   Johannes Berg   [PATCH] wireless ...
1611
  }
9ee677c22   David Kilroy   wireless: Add cha...
1612
  /**
fb7333367   Jouni Malinen   mac80211: 802.11w...
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
   * ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
   * @hdr: the frame (buffer must include at least the first octet of payload)
   */
  static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
  {
  	if (ieee80211_is_disassoc(hdr->frame_control) ||
  	    ieee80211_is_deauth(hdr->frame_control))
  		return true;
  
  	if (ieee80211_is_action(hdr->frame_control)) {
  		u8 *category;
  
  		/*
  		 * Action frames, excluding Public Action frames, are Robust
  		 * Management Frames. However, if we are looking at a Protected
  		 * frame, skip the check since the data may be encrypted and
  		 * the frame has already been found to be a Robust Management
  		 * Frame (by the other end).
  		 */
  		if (ieee80211_has_protected(hdr->frame_control))
  			return true;
  		category = ((u8 *) hdr) + 24;
528769cf1   Jouni Malinen   mac80211: Robust ...
1635
1636
  		return *category != WLAN_CATEGORY_PUBLIC &&
  			*category != WLAN_CATEGORY_HT &&
8f9cb77d6   Thomas Pedersen   mac80211: Self-pr...
1637
  			*category != WLAN_CATEGORY_SELF_PROTECTED &&
528769cf1   Jouni Malinen   mac80211: Robust ...
1638
  			*category != WLAN_CATEGORY_VENDOR_SPECIFIC;
fb7333367   Jouni Malinen   mac80211: 802.11w...
1639
1640
1641
1642
1643
1644
  	}
  
  	return false;
  }
  
  /**
3df6eaea7   Johannes Berg   mac80211: accept ...
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
   * ieee80211_is_public_action - check if frame is a public action frame
   * @hdr: the frame
   * @len: length of the frame
   */
  static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
  					      size_t len)
  {
  	struct ieee80211_mgmt *mgmt = (void *)hdr;
  
  	if (len < IEEE80211_MIN_ACTION_SIZE)
  		return false;
  	if (!ieee80211_is_action(hdr->frame_control))
  		return false;
  	return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
  }
  
  /**
9ee677c22   David Kilroy   wireless: Add cha...
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
   * ieee80211_fhss_chan_to_freq - get channel frequency
   * @channel: the FHSS channel
   *
   * Convert IEEE802.11 FHSS channel to frequency (MHz)
   * Ref IEEE 802.11-2007 section 14.6
   */
  static inline int ieee80211_fhss_chan_to_freq(int channel)
  {
  	if ((channel > 1) && (channel < 96))
  		return channel + 2400;
  	else
  		return -1;
  }
  
  /**
   * ieee80211_freq_to_fhss_chan - get channel
   * @freq: the channels frequency
   *
   * Convert frequency (MHz) to IEEE802.11 FHSS channel
   * Ref IEEE 802.11-2007 section 14.6
   */
  static inline int ieee80211_freq_to_fhss_chan(int freq)
  {
  	if ((freq > 2401) && (freq < 2496))
  		return freq - 2400;
  	else
  		return -1;
  }
  
  /**
   * ieee80211_dsss_chan_to_freq - get channel center frequency
   * @channel: the DSSS channel
   *
   * Convert IEEE802.11 DSSS channel to the center frequency (MHz).
   * Ref IEEE 802.11-2007 section 15.6
   */
  static inline int ieee80211_dsss_chan_to_freq(int channel)
  {
  	if ((channel > 0) && (channel < 14))
  		return 2407 + (channel * 5);
  	else if (channel == 14)
  		return 2484;
  	else
  		return -1;
  }
  
  /**
   * ieee80211_freq_to_dsss_chan - get channel
   * @freq: the frequency
   *
   * Convert frequency (MHz) to IEEE802.11 DSSS channel
   * Ref IEEE 802.11-2007 section 15.6
   *
   * This routine selects the channel with the closest center frequency.
   */
  static inline int ieee80211_freq_to_dsss_chan(int freq)
  {
  	if ((freq >= 2410) && (freq < 2475))
  		return (freq - 2405) / 5;
  	else if ((freq >= 2482) && (freq < 2487))
  		return 14;
  	else
  		return -1;
  }
  
  /* Convert IEEE802.11 HR DSSS channel to frequency (MHz) and back
   * Ref IEEE 802.11-2007 section 18.4.6.2
   *
   * The channels and frequencies are the same as those defined for DSSS
   */
  #define ieee80211_hr_chan_to_freq(chan) ieee80211_dsss_chan_to_freq(chan)
  #define ieee80211_freq_to_hr_chan(freq) ieee80211_freq_to_dsss_chan(freq)
  
  /* Convert IEEE802.11 ERP channel to frequency (MHz) and back
   * Ref IEEE 802.11-2007 section 19.4.2
   */
  #define ieee80211_erp_chan_to_freq(chan) ieee80211_hr_chan_to_freq(chan)
  #define ieee80211_freq_to_erp_chan(freq) ieee80211_freq_to_hr_chan(freq)
  
  /**
   * ieee80211_ofdm_chan_to_freq - get channel center frequency
   * @s_freq: starting frequency == (dotChannelStartingFactor/2) MHz
   * @channel: the OFDM channel
   *
   * Convert IEEE802.11 OFDM channel to center frequency (MHz)
   * Ref IEEE 802.11-2007 section 17.3.8.3.2
   */
  static inline int ieee80211_ofdm_chan_to_freq(int s_freq, int channel)
  {
  	if ((channel > 0) && (channel <= 200) &&
  	    (s_freq >= 4000))
  		return s_freq + (channel * 5);
  	else
  		return -1;
  }
  
  /**
   * ieee80211_freq_to_ofdm_channel - get channel
   * @s_freq: starting frequency == (dotChannelStartingFactor/2) MHz
   * @freq: the frequency
   *
   * Convert frequency (MHz) to IEEE802.11 OFDM channel
   * Ref IEEE 802.11-2007 section 17.3.8.3.2
   *
   * This routine selects the channel with the closest center frequency.
   */
  static inline int ieee80211_freq_to_ofdm_chan(int s_freq, int freq)
  {
  	if ((freq > (s_freq + 2)) && (freq <= (s_freq + 1202)) &&
  	    (s_freq >= 4000))
  		return (freq + 2 - s_freq) / 5;
  	else
  		return -1;
  }
10f644a47   Johannes Berg   mac80211: disable...
1776
1777
1778
1779
1780
1781
1782
1783
  /**
   * ieee80211_tu_to_usec - convert time units (TU) to microseconds
   * @tu: the TUs
   */
  static inline unsigned long ieee80211_tu_to_usec(unsigned long tu)
  {
  	return 1024 * tu;
  }
e7ec86f54   Johannes Berg   mac80211: validat...
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
  /**
   * ieee80211_check_tim - check if AID bit is set in TIM
   * @tim: the TIM IE
   * @tim_len: length of the TIM IE
   * @aid: the AID to look for
   */
  static inline bool ieee80211_check_tim(struct ieee80211_tim_ie *tim,
  				       u8 tim_len, u16 aid)
  {
  	u8 mask;
  	u8 index, indexn1, indexn2;
  
  	if (unlikely(!tim || tim_len < sizeof(*tim)))
  		return false;
  
  	aid &= 0x3fff;
  	index = aid / 8;
  	mask  = 1 << (aid & 7);
  
  	indexn1 = tim->bitmap_ctrl & 0xfe;
  	indexn2 = tim_len + indexn1 - 4;
  
  	if (index < indexn1 || index > indexn2)
  		return false;
  
  	index -= indexn1;
  
  	return !!(tim->virtual_map[index] & mask);
  }
9387b7caf   John W. Linville   wireless: use ind...
1813
  #endif /* LINUX_IEEE80211_H */