0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef LINUX_IEEE80211_H
0016 #define LINUX_IEEE80211_H
0017
0018 #include <linux/types.h>
0019 #include <linux/if_ether.h>
0020 #include <linux/etherdevice.h>
0021 #include <linux/bitfield.h>
0022 #include <asm/byteorder.h>
0023 #include <asm/unaligned.h>
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #define FCS_LEN 4
0042
0043 #define IEEE80211_FCTL_VERS 0x0003
0044 #define IEEE80211_FCTL_FTYPE 0x000c
0045 #define IEEE80211_FCTL_STYPE 0x00f0
0046 #define IEEE80211_FCTL_TODS 0x0100
0047 #define IEEE80211_FCTL_FROMDS 0x0200
0048 #define IEEE80211_FCTL_MOREFRAGS 0x0400
0049 #define IEEE80211_FCTL_RETRY 0x0800
0050 #define IEEE80211_FCTL_PM 0x1000
0051 #define IEEE80211_FCTL_MOREDATA 0x2000
0052 #define IEEE80211_FCTL_PROTECTED 0x4000
0053 #define IEEE80211_FCTL_ORDER 0x8000
0054 #define IEEE80211_FCTL_CTL_EXT 0x0f00
0055
0056 #define IEEE80211_SCTL_FRAG 0x000F
0057 #define IEEE80211_SCTL_SEQ 0xFFF0
0058
0059 #define IEEE80211_FTYPE_MGMT 0x0000
0060 #define IEEE80211_FTYPE_CTL 0x0004
0061 #define IEEE80211_FTYPE_DATA 0x0008
0062 #define IEEE80211_FTYPE_EXT 0x000c
0063
0064
0065 #define IEEE80211_STYPE_ASSOC_REQ 0x0000
0066 #define IEEE80211_STYPE_ASSOC_RESP 0x0010
0067 #define IEEE80211_STYPE_REASSOC_REQ 0x0020
0068 #define IEEE80211_STYPE_REASSOC_RESP 0x0030
0069 #define IEEE80211_STYPE_PROBE_REQ 0x0040
0070 #define IEEE80211_STYPE_PROBE_RESP 0x0050
0071 #define IEEE80211_STYPE_BEACON 0x0080
0072 #define IEEE80211_STYPE_ATIM 0x0090
0073 #define IEEE80211_STYPE_DISASSOC 0x00A0
0074 #define IEEE80211_STYPE_AUTH 0x00B0
0075 #define IEEE80211_STYPE_DEAUTH 0x00C0
0076 #define IEEE80211_STYPE_ACTION 0x00D0
0077
0078
0079 #define IEEE80211_STYPE_TRIGGER 0x0020
0080 #define IEEE80211_STYPE_CTL_EXT 0x0060
0081 #define IEEE80211_STYPE_BACK_REQ 0x0080
0082 #define IEEE80211_STYPE_BACK 0x0090
0083 #define IEEE80211_STYPE_PSPOLL 0x00A0
0084 #define IEEE80211_STYPE_RTS 0x00B0
0085 #define IEEE80211_STYPE_CTS 0x00C0
0086 #define IEEE80211_STYPE_ACK 0x00D0
0087 #define IEEE80211_STYPE_CFEND 0x00E0
0088 #define IEEE80211_STYPE_CFENDACK 0x00F0
0089
0090
0091 #define IEEE80211_STYPE_DATA 0x0000
0092 #define IEEE80211_STYPE_DATA_CFACK 0x0010
0093 #define IEEE80211_STYPE_DATA_CFPOLL 0x0020
0094 #define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
0095 #define IEEE80211_STYPE_NULLFUNC 0x0040
0096 #define IEEE80211_STYPE_CFACK 0x0050
0097 #define IEEE80211_STYPE_CFPOLL 0x0060
0098 #define IEEE80211_STYPE_CFACKPOLL 0x0070
0099 #define IEEE80211_STYPE_QOS_DATA 0x0080
0100 #define IEEE80211_STYPE_QOS_DATA_CFACK 0x0090
0101 #define IEEE80211_STYPE_QOS_DATA_CFPOLL 0x00A0
0102 #define IEEE80211_STYPE_QOS_DATA_CFACKPOLL 0x00B0
0103 #define IEEE80211_STYPE_QOS_NULLFUNC 0x00C0
0104 #define IEEE80211_STYPE_QOS_CFACK 0x00D0
0105 #define IEEE80211_STYPE_QOS_CFPOLL 0x00E0
0106 #define IEEE80211_STYPE_QOS_CFACKPOLL 0x00F0
0107
0108
0109 #define IEEE80211_STYPE_DMG_BEACON 0x0000
0110 #define IEEE80211_STYPE_S1G_BEACON 0x0010
0111
0112
0113 #define IEEE80211_S1G_BCN_NEXT_TBTT 0x100
0114
0115
0116 #define IEEE80211_S1G_1MHZ_NDP_BITS 25
0117 #define IEEE80211_S1G_1MHZ_NDP_BYTES 4
0118 #define IEEE80211_S1G_2MHZ_NDP_BITS 37
0119 #define IEEE80211_S1G_2MHZ_NDP_BYTES 5
0120
0121 #define IEEE80211_NDP_FTYPE_CTS 0
0122 #define IEEE80211_NDP_FTYPE_CF_END 0
0123 #define IEEE80211_NDP_FTYPE_PS_POLL 1
0124 #define IEEE80211_NDP_FTYPE_ACK 2
0125 #define IEEE80211_NDP_FTYPE_PS_POLL_ACK 3
0126 #define IEEE80211_NDP_FTYPE_BA 4
0127 #define IEEE80211_NDP_FTYPE_BF_REPORT_POLL 5
0128 #define IEEE80211_NDP_FTYPE_PAGING 6
0129 #define IEEE80211_NDP_FTYPE_PREQ 7
0130
0131 #define SM64(f, v) ((((u64)v) << f##_S) & f)
0132
0133
0134 #define IEEE80211_NDP_FTYPE 0x0000000000000007
0135 #define IEEE80211_NDP_FTYPE_S 0x0000000000000000
0136
0137
0138 #define IEEE80211_NDP_1M_PREQ_ANO 0x0000000000000008
0139 #define IEEE80211_NDP_1M_PREQ_ANO_S 3
0140 #define IEEE80211_NDP_1M_PREQ_CSSID 0x00000000000FFFF0
0141 #define IEEE80211_NDP_1M_PREQ_CSSID_S 4
0142 #define IEEE80211_NDP_1M_PREQ_RTYPE 0x0000000000100000
0143 #define IEEE80211_NDP_1M_PREQ_RTYPE_S 20
0144 #define IEEE80211_NDP_1M_PREQ_RSV 0x0000000001E00000
0145 #define IEEE80211_NDP_1M_PREQ_RSV 0x0000000001E00000
0146
0147 #define IEEE80211_NDP_2M_PREQ_ANO 0x0000000000000008
0148 #define IEEE80211_NDP_2M_PREQ_ANO_S 3
0149 #define IEEE80211_NDP_2M_PREQ_CSSID 0x0000000FFFFFFFF0
0150 #define IEEE80211_NDP_2M_PREQ_CSSID_S 4
0151 #define IEEE80211_NDP_2M_PREQ_RTYPE 0x0000001000000000
0152 #define IEEE80211_NDP_2M_PREQ_RTYPE_S 36
0153
0154 #define IEEE80211_ANO_NETTYPE_WILD 15
0155
0156
0157 #define IEEE80211_S1G_BCN_NEXT_TBTT 0x100
0158
0159
0160 #define IEEE80211_CTL_EXT_POLL 0x2000
0161 #define IEEE80211_CTL_EXT_SPR 0x3000
0162 #define IEEE80211_CTL_EXT_GRANT 0x4000
0163 #define IEEE80211_CTL_EXT_DMG_CTS 0x5000
0164 #define IEEE80211_CTL_EXT_DMG_DTS 0x6000
0165 #define IEEE80211_CTL_EXT_SSW 0x8000
0166 #define IEEE80211_CTL_EXT_SSW_FBACK 0x9000
0167 #define IEEE80211_CTL_EXT_SSW_ACK 0xa000
0168
0169
0170 #define IEEE80211_SN_MASK ((IEEE80211_SCTL_SEQ) >> 4)
0171 #define IEEE80211_MAX_SN IEEE80211_SN_MASK
0172 #define IEEE80211_SN_MODULO (IEEE80211_MAX_SN + 1)
0173
0174
0175
0176 #define IEEE80211_PV1_FCTL_VERS 0x0003
0177 #define IEEE80211_PV1_FCTL_FTYPE 0x001c
0178 #define IEEE80211_PV1_FCTL_STYPE 0x00e0
0179 #define IEEE80211_PV1_FCTL_TODS 0x0100
0180 #define IEEE80211_PV1_FCTL_MOREFRAGS 0x0200
0181 #define IEEE80211_PV1_FCTL_PM 0x0400
0182 #define IEEE80211_PV1_FCTL_MOREDATA 0x0800
0183 #define IEEE80211_PV1_FCTL_PROTECTED 0x1000
0184 #define IEEE80211_PV1_FCTL_END_SP 0x2000
0185 #define IEEE80211_PV1_FCTL_RELAYED 0x4000
0186 #define IEEE80211_PV1_FCTL_ACK_POLICY 0x8000
0187 #define IEEE80211_PV1_FCTL_CTL_EXT 0x0f00
0188
0189 static inline bool ieee80211_sn_less(u16 sn1, u16 sn2)
0190 {
0191 return ((sn1 - sn2) & IEEE80211_SN_MASK) > (IEEE80211_SN_MODULO >> 1);
0192 }
0193
0194 static inline u16 ieee80211_sn_add(u16 sn1, u16 sn2)
0195 {
0196 return (sn1 + sn2) & IEEE80211_SN_MASK;
0197 }
0198
0199 static inline u16 ieee80211_sn_inc(u16 sn)
0200 {
0201 return ieee80211_sn_add(sn, 1);
0202 }
0203
0204 static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
0205 {
0206 return (sn1 - sn2) & IEEE80211_SN_MASK;
0207 }
0208
0209 #define IEEE80211_SEQ_TO_SN(seq) (((seq) & IEEE80211_SCTL_SEQ) >> 4)
0210 #define IEEE80211_SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ)
0211
0212
0213 #define IEEE80211_MAX_FRAG_THRESHOLD 2352
0214 #define IEEE80211_MAX_RTS_THRESHOLD 2353
0215 #define IEEE80211_MAX_AID 2007
0216 #define IEEE80211_MAX_AID_S1G 8191
0217 #define IEEE80211_MAX_TIM_LEN 251
0218 #define IEEE80211_MAX_MESH_PEERINGS 63
0219
0220
0221
0222
0223
0224 #define IEEE80211_MAX_DATA_LEN 2304
0225
0226
0227
0228 #define IEEE80211_MAX_DATA_LEN_DMG 7920
0229
0230 #define IEEE80211_MAX_FRAME_LEN 2352
0231
0232
0233 #define IEEE80211_MAX_MPDU_LEN_HT_BA 4095
0234
0235
0236 #define IEEE80211_MAX_MPDU_LEN_HT_3839 3839
0237 #define IEEE80211_MAX_MPDU_LEN_HT_7935 7935
0238
0239 #define IEEE80211_MAX_MPDU_LEN_VHT_3895 3895
0240 #define IEEE80211_MAX_MPDU_LEN_VHT_7991 7991
0241 #define IEEE80211_MAX_MPDU_LEN_VHT_11454 11454
0242
0243 #define IEEE80211_MAX_SSID_LEN 32
0244
0245 #define IEEE80211_MAX_MESH_ID_LEN 32
0246
0247 #define IEEE80211_FIRST_TSPEC_TSID 8
0248 #define IEEE80211_NUM_TIDS 16
0249
0250
0251 #define IEEE80211_NUM_UPS 8
0252
0253 #define IEEE80211_NUM_ACS 4
0254
0255 #define IEEE80211_QOS_CTL_LEN 2
0256
0257 #define IEEE80211_QOS_CTL_TAG1D_MASK 0x0007
0258
0259 #define IEEE80211_QOS_CTL_TID_MASK 0x000f
0260
0261 #define IEEE80211_QOS_CTL_EOSP 0x0010
0262
0263 #define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL 0x0000
0264 #define IEEE80211_QOS_CTL_ACK_POLICY_NOACK 0x0020
0265 #define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL 0x0040
0266 #define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK 0x0060
0267 #define IEEE80211_QOS_CTL_ACK_POLICY_MASK 0x0060
0268
0269 #define IEEE80211_QOS_CTL_A_MSDU_PRESENT 0x0080
0270
0271 #define IEEE80211_QOS_CTL_MESH_CONTROL_PRESENT 0x0100
0272
0273
0274 #define IEEE80211_QOS_CTL_MESH_PS_LEVEL 0x0200
0275
0276 #define IEEE80211_QOS_CTL_RSPI 0x0400
0277
0278
0279 #define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD (1<<7)
0280 #define IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK 0x0f
0281
0282
0283 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VO (1<<0)
0284 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_VI (1<<1)
0285 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BK (1<<2)
0286 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_BE (1<<3)
0287 #define IEEE80211_WMM_IE_STA_QOSINFO_AC_MASK 0x0f
0288
0289
0290 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL 0x00
0291 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_2 0x01
0292 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_4 0x02
0293 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_6 0x03
0294 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK 0x03
0295 #define IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT 5
0296
0297 #define IEEE80211_HT_CTL_LEN 4
0298
0299
0300 #define IEEE80211_TRIGGER_TYPE_MASK 0xf
0301 #define IEEE80211_TRIGGER_TYPE_BASIC 0x0
0302 #define IEEE80211_TRIGGER_TYPE_BFRP 0x1
0303 #define IEEE80211_TRIGGER_TYPE_MU_BAR 0x2
0304 #define IEEE80211_TRIGGER_TYPE_MU_RTS 0x3
0305 #define IEEE80211_TRIGGER_TYPE_BSRP 0x4
0306 #define IEEE80211_TRIGGER_TYPE_GCR_MU_BAR 0x5
0307 #define IEEE80211_TRIGGER_TYPE_BQRP 0x6
0308 #define IEEE80211_TRIGGER_TYPE_NFRP 0x7
0309
0310 struct ieee80211_hdr {
0311 __le16 frame_control;
0312 __le16 duration_id;
0313 struct_group(addrs,
0314 u8 addr1[ETH_ALEN];
0315 u8 addr2[ETH_ALEN];
0316 u8 addr3[ETH_ALEN];
0317 );
0318 __le16 seq_ctrl;
0319 u8 addr4[ETH_ALEN];
0320 } __packed __aligned(2);
0321
0322 struct ieee80211_hdr_3addr {
0323 __le16 frame_control;
0324 __le16 duration_id;
0325 u8 addr1[ETH_ALEN];
0326 u8 addr2[ETH_ALEN];
0327 u8 addr3[ETH_ALEN];
0328 __le16 seq_ctrl;
0329 } __packed __aligned(2);
0330
0331 struct ieee80211_qos_hdr {
0332 __le16 frame_control;
0333 __le16 duration_id;
0334 u8 addr1[ETH_ALEN];
0335 u8 addr2[ETH_ALEN];
0336 u8 addr3[ETH_ALEN];
0337 __le16 seq_ctrl;
0338 __le16 qos_ctrl;
0339 } __packed __aligned(2);
0340
0341 struct ieee80211_trigger {
0342 __le16 frame_control;
0343 __le16 duration;
0344 u8 ra[ETH_ALEN];
0345 u8 ta[ETH_ALEN];
0346 __le64 common_info;
0347 u8 variable[];
0348 } __packed __aligned(2);
0349
0350
0351
0352
0353
0354 static inline bool ieee80211_has_tods(__le16 fc)
0355 {
0356 return (fc & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0;
0357 }
0358
0359
0360
0361
0362
0363 static inline bool ieee80211_has_fromds(__le16 fc)
0364 {
0365 return (fc & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0;
0366 }
0367
0368
0369
0370
0371
0372 static inline bool ieee80211_has_a4(__le16 fc)
0373 {
0374 __le16 tmp = cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
0375 return (fc & tmp) == tmp;
0376 }
0377
0378
0379
0380
0381
0382 static inline bool ieee80211_has_morefrags(__le16 fc)
0383 {
0384 return (fc & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0;
0385 }
0386
0387
0388
0389
0390
0391 static inline bool ieee80211_has_retry(__le16 fc)
0392 {
0393 return (fc & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0;
0394 }
0395
0396
0397
0398
0399
0400 static inline bool ieee80211_has_pm(__le16 fc)
0401 {
0402 return (fc & cpu_to_le16(IEEE80211_FCTL_PM)) != 0;
0403 }
0404
0405
0406
0407
0408
0409 static inline bool ieee80211_has_moredata(__le16 fc)
0410 {
0411 return (fc & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0;
0412 }
0413
0414
0415
0416
0417
0418 static inline bool ieee80211_has_protected(__le16 fc)
0419 {
0420 return (fc & cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0;
0421 }
0422
0423
0424
0425
0426
0427 static inline bool ieee80211_has_order(__le16 fc)
0428 {
0429 return (fc & cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0;
0430 }
0431
0432
0433
0434
0435
0436 static inline bool ieee80211_is_mgmt(__le16 fc)
0437 {
0438 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
0439 cpu_to_le16(IEEE80211_FTYPE_MGMT);
0440 }
0441
0442
0443
0444
0445
0446 static inline bool ieee80211_is_ctl(__le16 fc)
0447 {
0448 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
0449 cpu_to_le16(IEEE80211_FTYPE_CTL);
0450 }
0451
0452
0453
0454
0455
0456 static inline bool ieee80211_is_data(__le16 fc)
0457 {
0458 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
0459 cpu_to_le16(IEEE80211_FTYPE_DATA);
0460 }
0461
0462
0463
0464
0465
0466 static inline bool ieee80211_is_ext(__le16 fc)
0467 {
0468 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
0469 cpu_to_le16(IEEE80211_FTYPE_EXT);
0470 }
0471
0472
0473
0474
0475
0476
0477 static inline bool ieee80211_is_data_qos(__le16 fc)
0478 {
0479
0480
0481
0482
0483 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_STYPE_QOS_DATA)) ==
0484 cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_DATA);
0485 }
0486
0487
0488
0489
0490
0491 static inline bool ieee80211_is_data_present(__le16 fc)
0492 {
0493
0494
0495
0496
0497 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | 0x40)) ==
0498 cpu_to_le16(IEEE80211_FTYPE_DATA);
0499 }
0500
0501
0502
0503
0504
0505 static inline bool ieee80211_is_assoc_req(__le16 fc)
0506 {
0507 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0508 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
0509 }
0510
0511
0512
0513
0514
0515 static inline bool ieee80211_is_assoc_resp(__le16 fc)
0516 {
0517 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0518 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_RESP);
0519 }
0520
0521
0522
0523
0524
0525 static inline bool ieee80211_is_reassoc_req(__le16 fc)
0526 {
0527 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0528 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_REQ);
0529 }
0530
0531
0532
0533
0534
0535 static inline bool ieee80211_is_reassoc_resp(__le16 fc)
0536 {
0537 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0538 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_REASSOC_RESP);
0539 }
0540
0541
0542
0543
0544
0545 static inline bool ieee80211_is_probe_req(__le16 fc)
0546 {
0547 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0548 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ);
0549 }
0550
0551
0552
0553
0554
0555 static inline bool ieee80211_is_probe_resp(__le16 fc)
0556 {
0557 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0558 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
0559 }
0560
0561
0562
0563
0564
0565 static inline bool ieee80211_is_beacon(__le16 fc)
0566 {
0567 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0568 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
0569 }
0570
0571
0572
0573
0574
0575
0576 static inline bool ieee80211_is_s1g_beacon(__le16 fc)
0577 {
0578 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE |
0579 IEEE80211_FCTL_STYPE)) ==
0580 cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON);
0581 }
0582
0583
0584
0585
0586
0587
0588 static inline bool ieee80211_next_tbtt_present(__le16 fc)
0589 {
0590 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0591 cpu_to_le16(IEEE80211_FTYPE_EXT | IEEE80211_STYPE_S1G_BEACON) &&
0592 fc & cpu_to_le16(IEEE80211_S1G_BCN_NEXT_TBTT);
0593 }
0594
0595
0596
0597
0598
0599
0600 static inline bool ieee80211_is_s1g_short_beacon(__le16 fc)
0601 {
0602 return ieee80211_is_s1g_beacon(fc) && ieee80211_next_tbtt_present(fc);
0603 }
0604
0605
0606
0607
0608
0609 static inline bool ieee80211_is_atim(__le16 fc)
0610 {
0611 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0612 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ATIM);
0613 }
0614
0615
0616
0617
0618
0619 static inline bool ieee80211_is_disassoc(__le16 fc)
0620 {
0621 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0622 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DISASSOC);
0623 }
0624
0625
0626
0627
0628
0629 static inline bool ieee80211_is_auth(__le16 fc)
0630 {
0631 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0632 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
0633 }
0634
0635
0636
0637
0638
0639 static inline bool ieee80211_is_deauth(__le16 fc)
0640 {
0641 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0642 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
0643 }
0644
0645
0646
0647
0648
0649 static inline bool ieee80211_is_action(__le16 fc)
0650 {
0651 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0652 cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
0653 }
0654
0655
0656
0657
0658
0659 static inline bool ieee80211_is_back_req(__le16 fc)
0660 {
0661 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0662 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK_REQ);
0663 }
0664
0665
0666
0667
0668
0669 static inline bool ieee80211_is_back(__le16 fc)
0670 {
0671 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0672 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_BACK);
0673 }
0674
0675
0676
0677
0678
0679 static inline bool ieee80211_is_pspoll(__le16 fc)
0680 {
0681 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0682 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL);
0683 }
0684
0685
0686
0687
0688
0689 static inline bool ieee80211_is_rts(__le16 fc)
0690 {
0691 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0692 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
0693 }
0694
0695
0696
0697
0698
0699 static inline bool ieee80211_is_cts(__le16 fc)
0700 {
0701 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0702 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS);
0703 }
0704
0705
0706
0707
0708
0709 static inline bool ieee80211_is_ack(__le16 fc)
0710 {
0711 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0712 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_ACK);
0713 }
0714
0715
0716
0717
0718
0719 static inline bool ieee80211_is_cfend(__le16 fc)
0720 {
0721 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0722 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFEND);
0723 }
0724
0725
0726
0727
0728
0729 static inline bool ieee80211_is_cfendack(__le16 fc)
0730 {
0731 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0732 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CFENDACK);
0733 }
0734
0735
0736
0737
0738
0739 static inline bool ieee80211_is_nullfunc(__le16 fc)
0740 {
0741 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0742 cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC);
0743 }
0744
0745
0746
0747
0748
0749 static inline bool ieee80211_is_qos_nullfunc(__le16 fc)
0750 {
0751 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0752 cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_QOS_NULLFUNC);
0753 }
0754
0755
0756
0757
0758
0759 static inline bool ieee80211_is_trigger(__le16 fc)
0760 {
0761 return (fc & cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE)) ==
0762 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_TRIGGER);
0763 }
0764
0765
0766
0767
0768
0769 static inline bool ieee80211_is_any_nullfunc(__le16 fc)
0770 {
0771 return (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc));
0772 }
0773
0774
0775
0776
0777
0778 static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
0779 {
0780
0781
0782 return ieee80211_is_mgmt(fc) &&
0783 (ieee80211_is_action(fc) ||
0784 ieee80211_is_disassoc(fc) ||
0785 ieee80211_is_deauth(fc));
0786 }
0787
0788
0789
0790
0791
0792 static inline bool ieee80211_is_first_frag(__le16 seq_ctrl)
0793 {
0794 return (seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0;
0795 }
0796
0797
0798
0799
0800
0801 static inline bool ieee80211_is_frag(struct ieee80211_hdr *hdr)
0802 {
0803 return ieee80211_has_morefrags(hdr->frame_control) ||
0804 hdr->seq_ctrl & cpu_to_le16(IEEE80211_SCTL_FRAG);
0805 }
0806
0807 struct ieee80211s_hdr {
0808 u8 flags;
0809 u8 ttl;
0810 __le32 seqnum;
0811 u8 eaddr1[ETH_ALEN];
0812 u8 eaddr2[ETH_ALEN];
0813 } __packed __aligned(2);
0814
0815
0816 #define MESH_FLAGS_AE_A4 0x1
0817 #define MESH_FLAGS_AE_A5_A6 0x2
0818 #define MESH_FLAGS_AE 0x3
0819 #define MESH_FLAGS_PS_DEEP 0x4
0820
0821
0822
0823
0824
0825
0826 enum ieee80211_preq_flags {
0827 IEEE80211_PREQ_PROACTIVE_PREP_FLAG = 1<<2,
0828 };
0829
0830
0831
0832
0833
0834
0835
0836 enum ieee80211_preq_target_flags {
0837 IEEE80211_PREQ_TO_FLAG = 1<<0,
0838 IEEE80211_PREQ_USN_FLAG = 1<<2,
0839 };
0840
0841
0842
0843
0844
0845
0846 struct ieee80211_quiet_ie {
0847 u8 count;
0848 u8 period;
0849 __le16 duration;
0850 __le16 offset;
0851 } __packed;
0852
0853
0854
0855
0856
0857
0858 struct ieee80211_msrment_ie {
0859 u8 token;
0860 u8 mode;
0861 u8 type;
0862 u8 request[];
0863 } __packed;
0864
0865
0866
0867
0868
0869
0870 struct ieee80211_channel_sw_ie {
0871 u8 mode;
0872 u8 new_ch_num;
0873 u8 count;
0874 } __packed;
0875
0876
0877
0878
0879
0880
0881 struct ieee80211_ext_chansw_ie {
0882 u8 mode;
0883 u8 new_operating_class;
0884 u8 new_ch_num;
0885 u8 count;
0886 } __packed;
0887
0888
0889
0890
0891
0892
0893
0894 struct ieee80211_sec_chan_offs_ie {
0895 u8 sec_chan_offs;
0896 } __packed;
0897
0898
0899
0900
0901
0902
0903 struct ieee80211_mesh_chansw_params_ie {
0904 u8 mesh_ttl;
0905 u8 mesh_flags;
0906 __le16 mesh_reason;
0907 __le16 mesh_pre_value;
0908 } __packed;
0909
0910
0911
0912
0913 struct ieee80211_wide_bw_chansw_ie {
0914 u8 new_channel_width;
0915 u8 new_center_freq_seg0, new_center_freq_seg1;
0916 } __packed;
0917
0918
0919
0920
0921
0922
0923 struct ieee80211_tim_ie {
0924 u8 dtim_count;
0925 u8 dtim_period;
0926 u8 bitmap_ctrl;
0927
0928 u8 virtual_map[1];
0929 } __packed;
0930
0931
0932
0933
0934
0935
0936 struct ieee80211_meshconf_ie {
0937 u8 meshconf_psel;
0938 u8 meshconf_pmetric;
0939 u8 meshconf_congest;
0940 u8 meshconf_synch;
0941 u8 meshconf_auth;
0942 u8 meshconf_form;
0943 u8 meshconf_cap;
0944 } __packed;
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957 enum mesh_config_capab_flags {
0958 IEEE80211_MESHCONF_CAPAB_ACCEPT_PLINKS = 0x01,
0959 IEEE80211_MESHCONF_CAPAB_FORWARDING = 0x08,
0960 IEEE80211_MESHCONF_CAPAB_TBTT_ADJUSTING = 0x20,
0961 IEEE80211_MESHCONF_CAPAB_POWER_SAVE_LEVEL = 0x40,
0962 };
0963
0964 #define IEEE80211_MESHCONF_FORM_CONNECTED_TO_GATE 0x1
0965
0966
0967
0968
0969
0970 #define WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT BIT(0)
0971 #define WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR BIT(1)
0972 #define WLAN_EID_CHAN_SWITCH_PARAM_REASON BIT(2)
0973
0974
0975
0976
0977
0978
0979 struct ieee80211_rann_ie {
0980 u8 rann_flags;
0981 u8 rann_hopcount;
0982 u8 rann_ttl;
0983 u8 rann_addr[ETH_ALEN];
0984 __le32 rann_seq;
0985 __le32 rann_interval;
0986 __le32 rann_metric;
0987 } __packed;
0988
0989 enum ieee80211_rann_flags {
0990 RANN_FLAG_IS_GATE = 1 << 0,
0991 };
0992
0993 enum ieee80211_ht_chanwidth_values {
0994 IEEE80211_HT_CHANWIDTH_20MHZ = 0,
0995 IEEE80211_HT_CHANWIDTH_ANY = 1,
0996 };
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012 enum ieee80211_vht_opmode_bits {
1013 IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK = 0x03,
1014 IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ = 0,
1015 IEEE80211_OPMODE_NOTIF_CHANWIDTH_40MHZ = 1,
1016 IEEE80211_OPMODE_NOTIF_CHANWIDTH_80MHZ = 2,
1017 IEEE80211_OPMODE_NOTIF_CHANWIDTH_160MHZ = 3,
1018 IEEE80211_OPMODE_NOTIF_BW_160_80P80 = 0x04,
1019 IEEE80211_OPMODE_NOTIF_RX_NSS_MASK = 0x70,
1020 IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT = 4,
1021 IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF = 0x80,
1022 };
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 enum ieee80211_s1g_chanwidth {
1036 IEEE80211_S1G_CHANWIDTH_1MHZ = 0,
1037 IEEE80211_S1G_CHANWIDTH_2MHZ = 1,
1038 IEEE80211_S1G_CHANWIDTH_4MHZ = 3,
1039 IEEE80211_S1G_CHANWIDTH_8MHZ = 7,
1040 IEEE80211_S1G_CHANWIDTH_16MHZ = 15,
1041 };
1042
1043 #define WLAN_SA_QUERY_TR_ID_LEN 2
1044 #define WLAN_MEMBERSHIP_LEN 8
1045 #define WLAN_USER_POSITION_LEN 16
1046
1047
1048
1049
1050
1051
1052 struct ieee80211_tpc_report_ie {
1053 u8 tx_power;
1054 u8 link_margin;
1055 } __packed;
1056
1057 #define IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK GENMASK(2, 1)
1058 #define IEEE80211_ADDBA_EXT_FRAG_LEVEL_SHIFT 1
1059 #define IEEE80211_ADDBA_EXT_NO_FRAG BIT(0)
1060 #define IEEE80211_ADDBA_EXT_BUF_SIZE_MASK GENMASK(7, 5)
1061 #define IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT 10
1062
1063 struct ieee80211_addba_ext_ie {
1064 u8 data;
1065 } __packed;
1066
1067
1068
1069
1070
1071
1072 struct ieee80211_s1g_bcn_compat_ie {
1073 __le16 compat_info;
1074 __le16 beacon_int;
1075 __le32 tsf_completion;
1076 } __packed;
1077
1078
1079
1080
1081
1082
1083 struct ieee80211_s1g_oper_ie {
1084 u8 ch_width;
1085 u8 oper_class;
1086 u8 primary_ch;
1087 u8 oper_ch;
1088 __le16 basic_mcs_nss;
1089 } __packed;
1090
1091
1092
1093
1094
1095
1096 struct ieee80211_aid_response_ie {
1097 __le16 aid;
1098 u8 switch_count;
1099 __le16 response_int;
1100 } __packed;
1101
1102 struct ieee80211_s1g_cap {
1103 u8 capab_info[10];
1104 u8 supp_mcs_nss[5];
1105 } __packed;
1106
1107 struct ieee80211_ext {
1108 __le16 frame_control;
1109 __le16 duration;
1110 union {
1111 struct {
1112 u8 sa[ETH_ALEN];
1113 __le32 timestamp;
1114 u8 change_seq;
1115 u8 variable[0];
1116 } __packed s1g_beacon;
1117 struct {
1118 u8 sa[ETH_ALEN];
1119 __le32 timestamp;
1120 u8 change_seq;
1121 u8 next_tbtt[3];
1122 u8 variable[0];
1123 } __packed s1g_short_beacon;
1124 } u;
1125 } __packed __aligned(2);
1126
1127 #define IEEE80211_TWT_CONTROL_NDP BIT(0)
1128 #define IEEE80211_TWT_CONTROL_RESP_MODE BIT(1)
1129 #define IEEE80211_TWT_CONTROL_NEG_TYPE_BROADCAST BIT(3)
1130 #define IEEE80211_TWT_CONTROL_RX_DISABLED BIT(4)
1131 #define IEEE80211_TWT_CONTROL_WAKE_DUR_UNIT BIT(5)
1132
1133 #define IEEE80211_TWT_REQTYPE_REQUEST BIT(0)
1134 #define IEEE80211_TWT_REQTYPE_SETUP_CMD GENMASK(3, 1)
1135 #define IEEE80211_TWT_REQTYPE_TRIGGER BIT(4)
1136 #define IEEE80211_TWT_REQTYPE_IMPLICIT BIT(5)
1137 #define IEEE80211_TWT_REQTYPE_FLOWTYPE BIT(6)
1138 #define IEEE80211_TWT_REQTYPE_FLOWID GENMASK(9, 7)
1139 #define IEEE80211_TWT_REQTYPE_WAKE_INT_EXP GENMASK(14, 10)
1140 #define IEEE80211_TWT_REQTYPE_PROTECTION BIT(15)
1141
1142 enum ieee80211_twt_setup_cmd {
1143 TWT_SETUP_CMD_REQUEST,
1144 TWT_SETUP_CMD_SUGGEST,
1145 TWT_SETUP_CMD_DEMAND,
1146 TWT_SETUP_CMD_GROUPING,
1147 TWT_SETUP_CMD_ACCEPT,
1148 TWT_SETUP_CMD_ALTERNATE,
1149 TWT_SETUP_CMD_DICTATE,
1150 TWT_SETUP_CMD_REJECT,
1151 };
1152
1153 struct ieee80211_twt_params {
1154 __le16 req_type;
1155 __le64 twt;
1156 u8 min_twt_dur;
1157 __le16 mantissa;
1158 u8 channel;
1159 } __packed;
1160
1161 struct ieee80211_twt_setup {
1162 u8 dialog_token;
1163 u8 element_id;
1164 u8 length;
1165 u8 control;
1166 u8 params[];
1167 } __packed;
1168
1169 struct ieee80211_mgmt {
1170 __le16 frame_control;
1171 __le16 duration;
1172 u8 da[ETH_ALEN];
1173 u8 sa[ETH_ALEN];
1174 u8 bssid[ETH_ALEN];
1175 __le16 seq_ctrl;
1176 union {
1177 struct {
1178 __le16 auth_alg;
1179 __le16 auth_transaction;
1180 __le16 status_code;
1181
1182 u8 variable[];
1183 } __packed auth;
1184 struct {
1185 __le16 reason_code;
1186 } __packed deauth;
1187 struct {
1188 __le16 capab_info;
1189 __le16 listen_interval;
1190
1191 u8 variable[];
1192 } __packed assoc_req;
1193 struct {
1194 __le16 capab_info;
1195 __le16 status_code;
1196 __le16 aid;
1197
1198 u8 variable[];
1199 } __packed assoc_resp, reassoc_resp;
1200 struct {
1201 __le16 capab_info;
1202 __le16 status_code;
1203 u8 variable[];
1204 } __packed s1g_assoc_resp, s1g_reassoc_resp;
1205 struct {
1206 __le16 capab_info;
1207 __le16 listen_interval;
1208 u8 current_ap[ETH_ALEN];
1209
1210 u8 variable[];
1211 } __packed reassoc_req;
1212 struct {
1213 __le16 reason_code;
1214 } __packed disassoc;
1215 struct {
1216 __le64 timestamp;
1217 __le16 beacon_int;
1218 __le16 capab_info;
1219
1220
1221 u8 variable[];
1222 } __packed beacon;
1223 struct {
1224
1225 DECLARE_FLEX_ARRAY(u8, variable);
1226 } __packed probe_req;
1227 struct {
1228 __le64 timestamp;
1229 __le16 beacon_int;
1230 __le16 capab_info;
1231
1232
1233 u8 variable[];
1234 } __packed probe_resp;
1235 struct {
1236 u8 category;
1237 union {
1238 struct {
1239 u8 action_code;
1240 u8 dialog_token;
1241 u8 status_code;
1242 u8 variable[];
1243 } __packed wme_action;
1244 struct{
1245 u8 action_code;
1246 u8 variable[];
1247 } __packed chan_switch;
1248 struct{
1249 u8 action_code;
1250 struct ieee80211_ext_chansw_ie data;
1251 u8 variable[];
1252 } __packed ext_chan_switch;
1253 struct{
1254 u8 action_code;
1255 u8 dialog_token;
1256 u8 element_id;
1257 u8 length;
1258 struct ieee80211_msrment_ie msr_elem;
1259 } __packed measurement;
1260 struct{
1261 u8 action_code;
1262 u8 dialog_token;
1263 __le16 capab;
1264 __le16 timeout;
1265 __le16 start_seq_num;
1266
1267 u8 variable[];
1268 } __packed addba_req;
1269 struct{
1270 u8 action_code;
1271 u8 dialog_token;
1272 __le16 status;
1273 __le16 capab;
1274 __le16 timeout;
1275 } __packed addba_resp;
1276 struct{
1277 u8 action_code;
1278 __le16 params;
1279 __le16 reason_code;
1280 } __packed delba;
1281 struct {
1282 u8 action_code;
1283 u8 variable[];
1284 } __packed self_prot;
1285 struct{
1286 u8 action_code;
1287 u8 variable[];
1288 } __packed mesh_action;
1289 struct {
1290 u8 action;
1291 u8 trans_id[WLAN_SA_QUERY_TR_ID_LEN];
1292 } __packed sa_query;
1293 struct {
1294 u8 action;
1295 u8 smps_control;
1296 } __packed ht_smps;
1297 struct {
1298 u8 action_code;
1299 u8 chanwidth;
1300 } __packed ht_notify_cw;
1301 struct {
1302 u8 action_code;
1303 u8 dialog_token;
1304 __le16 capability;
1305 u8 variable[0];
1306 } __packed tdls_discover_resp;
1307 struct {
1308 u8 action_code;
1309 u8 operating_mode;
1310 } __packed vht_opmode_notif;
1311 struct {
1312 u8 action_code;
1313 u8 membership[WLAN_MEMBERSHIP_LEN];
1314 u8 position[WLAN_USER_POSITION_LEN];
1315 } __packed vht_group_notif;
1316 struct {
1317 u8 action_code;
1318 u8 dialog_token;
1319 u8 tpc_elem_id;
1320 u8 tpc_elem_length;
1321 struct ieee80211_tpc_report_ie tpc;
1322 } __packed tpc_report;
1323 struct {
1324 u8 action_code;
1325 u8 dialog_token;
1326 u8 follow_up;
1327 u8 tod[6];
1328 u8 toa[6];
1329 __le16 tod_error;
1330 __le16 toa_error;
1331 u8 variable[];
1332 } __packed ftm;
1333 struct {
1334 u8 action_code;
1335 u8 variable[];
1336 } __packed s1g;
1337 struct {
1338 u8 action_code;
1339 u8 dialog_token;
1340 u8 follow_up;
1341 u32 tod;
1342 u32 toa;
1343 u8 max_tod_error;
1344 u8 max_toa_error;
1345 } __packed wnm_timing_msr;
1346 } u;
1347 } __packed action;
1348 } u;
1349 } __packed __aligned(2);
1350
1351
1352 #define BSS_MEMBERSHIP_SELECTOR_HT_PHY 127
1353 #define BSS_MEMBERSHIP_SELECTOR_VHT_PHY 126
1354 #define BSS_MEMBERSHIP_SELECTOR_HE_PHY 122
1355 #define BSS_MEMBERSHIP_SELECTOR_SAE_H2E 123
1356
1357
1358 #define IEEE80211_MIN_ACTION_SIZE offsetof(struct ieee80211_mgmt, u.action.u)
1359
1360
1361
1362 struct ieee80211_mmie {
1363 u8 element_id;
1364 u8 length;
1365 __le16 key_id;
1366 u8 sequence_number[6];
1367 u8 mic[8];
1368 } __packed;
1369
1370
1371 struct ieee80211_mmie_16 {
1372 u8 element_id;
1373 u8 length;
1374 __le16 key_id;
1375 u8 sequence_number[6];
1376 u8 mic[16];
1377 } __packed;
1378
1379 struct ieee80211_vendor_ie {
1380 u8 element_id;
1381 u8 len;
1382 u8 oui[3];
1383 u8 oui_type;
1384 } __packed;
1385
1386 struct ieee80211_wmm_ac_param {
1387 u8 aci_aifsn;
1388 u8 cw;
1389 __le16 txop_limit;
1390 } __packed;
1391
1392 struct ieee80211_wmm_param_ie {
1393 u8 element_id;
1394 u8 len;
1395
1396 u8 oui[3];
1397 u8 oui_type;
1398 u8 oui_subtype;
1399 u8 version;
1400 u8 qos_info;
1401 u8 reserved;
1402
1403 struct ieee80211_wmm_ac_param ac[4];
1404 } __packed;
1405
1406
1407 struct ieee80211_rts {
1408 __le16 frame_control;
1409 __le16 duration;
1410 u8 ra[ETH_ALEN];
1411 u8 ta[ETH_ALEN];
1412 } __packed __aligned(2);
1413
1414 struct ieee80211_cts {
1415 __le16 frame_control;
1416 __le16 duration;
1417 u8 ra[ETH_ALEN];
1418 } __packed __aligned(2);
1419
1420 struct ieee80211_pspoll {
1421 __le16 frame_control;
1422 __le16 aid;
1423 u8 bssid[ETH_ALEN];
1424 u8 ta[ETH_ALEN];
1425 } __packed __aligned(2);
1426
1427
1428
1429
1430 struct ieee80211_ch_switch_timing {
1431 __le16 switch_time;
1432 __le16 switch_timeout;
1433 } __packed;
1434
1435
1436 struct ieee80211_tdls_lnkie {
1437 u8 ie_type;
1438 u8 ie_len;
1439 u8 bssid[ETH_ALEN];
1440 u8 init_sta[ETH_ALEN];
1441 u8 resp_sta[ETH_ALEN];
1442 } __packed;
1443
1444 struct ieee80211_tdls_data {
1445 u8 da[ETH_ALEN];
1446 u8 sa[ETH_ALEN];
1447 __be16 ether_type;
1448 u8 payload_type;
1449 u8 category;
1450 u8 action_code;
1451 union {
1452 struct {
1453 u8 dialog_token;
1454 __le16 capability;
1455 u8 variable[0];
1456 } __packed setup_req;
1457 struct {
1458 __le16 status_code;
1459 u8 dialog_token;
1460 __le16 capability;
1461 u8 variable[0];
1462 } __packed setup_resp;
1463 struct {
1464 __le16 status_code;
1465 u8 dialog_token;
1466 u8 variable[0];
1467 } __packed setup_cfm;
1468 struct {
1469 __le16 reason_code;
1470 u8 variable[0];
1471 } __packed teardown;
1472 struct {
1473 u8 dialog_token;
1474 u8 variable[0];
1475 } __packed discover_req;
1476 struct {
1477 u8 target_channel;
1478 u8 oper_class;
1479 u8 variable[0];
1480 } __packed chan_switch_req;
1481 struct {
1482 __le16 status_code;
1483 u8 variable[0];
1484 } __packed chan_switch_resp;
1485 } u;
1486 } __packed;
1487
1488
1489
1490
1491
1492
1493
1494 enum ieee80211_p2p_attr_id {
1495 IEEE80211_P2P_ATTR_STATUS = 0,
1496 IEEE80211_P2P_ATTR_MINOR_REASON,
1497 IEEE80211_P2P_ATTR_CAPABILITY,
1498 IEEE80211_P2P_ATTR_DEVICE_ID,
1499 IEEE80211_P2P_ATTR_GO_INTENT,
1500 IEEE80211_P2P_ATTR_GO_CONFIG_TIMEOUT,
1501 IEEE80211_P2P_ATTR_LISTEN_CHANNEL,
1502 IEEE80211_P2P_ATTR_GROUP_BSSID,
1503 IEEE80211_P2P_ATTR_EXT_LISTEN_TIMING,
1504 IEEE80211_P2P_ATTR_INTENDED_IFACE_ADDR,
1505 IEEE80211_P2P_ATTR_MANAGABILITY,
1506 IEEE80211_P2P_ATTR_CHANNEL_LIST,
1507 IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
1508 IEEE80211_P2P_ATTR_DEVICE_INFO,
1509 IEEE80211_P2P_ATTR_GROUP_INFO,
1510 IEEE80211_P2P_ATTR_GROUP_ID,
1511 IEEE80211_P2P_ATTR_INTERFACE,
1512 IEEE80211_P2P_ATTR_OPER_CHANNEL,
1513 IEEE80211_P2P_ATTR_INVITE_FLAGS,
1514
1515 IEEE80211_P2P_ATTR_VENDOR_SPECIFIC = 221,
1516
1517 IEEE80211_P2P_ATTR_MAX
1518 };
1519
1520
1521
1522 #define IEEE80211_P2P_NOA_DESC_MAX 4
1523
1524 struct ieee80211_p2p_noa_desc {
1525 u8 count;
1526 __le32 duration;
1527 __le32 interval;
1528 __le32 start_time;
1529 } __packed;
1530
1531 struct ieee80211_p2p_noa_attr {
1532 u8 index;
1533 u8 oppps_ctwindow;
1534 struct ieee80211_p2p_noa_desc desc[IEEE80211_P2P_NOA_DESC_MAX];
1535 } __packed;
1536
1537 #define IEEE80211_P2P_OPPPS_ENABLE_BIT BIT(7)
1538 #define IEEE80211_P2P_OPPPS_CTWINDOW_MASK 0x7F
1539
1540
1541
1542
1543
1544
1545
1546 struct ieee80211_bar {
1547 __le16 frame_control;
1548 __le16 duration;
1549 __u8 ra[ETH_ALEN];
1550 __u8 ta[ETH_ALEN];
1551 __le16 control;
1552 __le16 start_seq_num;
1553 } __packed;
1554
1555
1556 #define IEEE80211_BAR_CTRL_ACK_POLICY_NORMAL 0x0000
1557 #define IEEE80211_BAR_CTRL_MULTI_TID 0x0002
1558 #define IEEE80211_BAR_CTRL_CBMTID_COMPRESSED_BA 0x0004
1559 #define IEEE80211_BAR_CTRL_TID_INFO_MASK 0xf000
1560 #define IEEE80211_BAR_CTRL_TID_INFO_SHIFT 12
1561
1562 #define IEEE80211_HT_MCS_MASK_LEN 10
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573 struct ieee80211_mcs_info {
1574 u8 rx_mask[IEEE80211_HT_MCS_MASK_LEN];
1575 __le16 rx_highest;
1576 u8 tx_params;
1577 u8 reserved[3];
1578 } __packed;
1579
1580
1581 #define IEEE80211_HT_MCS_RX_HIGHEST_MASK 0x3ff
1582 #define IEEE80211_HT_MCS_TX_DEFINED 0x01
1583 #define IEEE80211_HT_MCS_TX_RX_DIFF 0x02
1584
1585 #define IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK 0x0C
1586 #define IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT 2
1587 #define IEEE80211_HT_MCS_TX_MAX_STREAMS 4
1588 #define IEEE80211_HT_MCS_TX_UNEQUAL_MODULATION 0x10
1589
1590
1591
1592
1593
1594
1595
1596
1597 #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START 33
1598 #define IEEE80211_HT_MCS_UNEQUAL_MODULATION_START_BYTE \
1599 (IEEE80211_HT_MCS_UNEQUAL_MODULATION_START / 8)
1600
1601
1602
1603
1604
1605
1606
1607 struct ieee80211_ht_cap {
1608 __le16 cap_info;
1609 u8 ampdu_params_info;
1610
1611
1612 struct ieee80211_mcs_info mcs;
1613
1614 __le16 extended_ht_cap_info;
1615 __le32 tx_BF_cap_info;
1616 u8 antenna_selection_info;
1617 } __packed;
1618
1619
1620 #define IEEE80211_HT_CAP_LDPC_CODING 0x0001
1621 #define IEEE80211_HT_CAP_SUP_WIDTH_20_40 0x0002
1622 #define IEEE80211_HT_CAP_SM_PS 0x000C
1623 #define IEEE80211_HT_CAP_SM_PS_SHIFT 2
1624 #define IEEE80211_HT_CAP_GRN_FLD 0x0010
1625 #define IEEE80211_HT_CAP_SGI_20 0x0020
1626 #define IEEE80211_HT_CAP_SGI_40 0x0040
1627 #define IEEE80211_HT_CAP_TX_STBC 0x0080
1628 #define IEEE80211_HT_CAP_RX_STBC 0x0300
1629 #define IEEE80211_HT_CAP_RX_STBC_SHIFT 8
1630 #define IEEE80211_HT_CAP_DELAY_BA 0x0400
1631 #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
1632 #define IEEE80211_HT_CAP_DSSSCCK40 0x1000
1633 #define IEEE80211_HT_CAP_RESERVED 0x2000
1634 #define IEEE80211_HT_CAP_40MHZ_INTOLERANT 0x4000
1635 #define IEEE80211_HT_CAP_LSIG_TXOP_PROT 0x8000
1636
1637
1638 #define IEEE80211_HT_EXT_CAP_PCO 0x0001
1639 #define IEEE80211_HT_EXT_CAP_PCO_TIME 0x0006
1640 #define IEEE80211_HT_EXT_CAP_PCO_TIME_SHIFT 1
1641 #define IEEE80211_HT_EXT_CAP_MCS_FB 0x0300
1642 #define IEEE80211_HT_EXT_CAP_MCS_FB_SHIFT 8
1643 #define IEEE80211_HT_EXT_CAP_HTC_SUP 0x0400
1644 #define IEEE80211_HT_EXT_CAP_RD_RESPONDER 0x0800
1645
1646
1647 #define IEEE80211_HT_AMPDU_PARM_FACTOR 0x03
1648 #define IEEE80211_HT_AMPDU_PARM_DENSITY 0x1C
1649 #define IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT 2
1650
1651
1652
1653
1654
1655 enum ieee80211_max_ampdu_length_exp {
1656 IEEE80211_HT_MAX_AMPDU_8K = 0,
1657 IEEE80211_HT_MAX_AMPDU_16K = 1,
1658 IEEE80211_HT_MAX_AMPDU_32K = 2,
1659 IEEE80211_HT_MAX_AMPDU_64K = 3
1660 };
1661
1662
1663
1664
1665
1666 enum ieee80211_vht_max_ampdu_length_exp {
1667 IEEE80211_VHT_MAX_AMPDU_8K = 0,
1668 IEEE80211_VHT_MAX_AMPDU_16K = 1,
1669 IEEE80211_VHT_MAX_AMPDU_32K = 2,
1670 IEEE80211_VHT_MAX_AMPDU_64K = 3,
1671 IEEE80211_VHT_MAX_AMPDU_128K = 4,
1672 IEEE80211_VHT_MAX_AMPDU_256K = 5,
1673 IEEE80211_VHT_MAX_AMPDU_512K = 6,
1674 IEEE80211_VHT_MAX_AMPDU_1024K = 7
1675 };
1676
1677 #define IEEE80211_HT_MAX_AMPDU_FACTOR 13
1678
1679
1680 enum ieee80211_min_mpdu_spacing {
1681 IEEE80211_HT_MPDU_DENSITY_NONE = 0,
1682 IEEE80211_HT_MPDU_DENSITY_0_25 = 1,
1683 IEEE80211_HT_MPDU_DENSITY_0_5 = 2,
1684 IEEE80211_HT_MPDU_DENSITY_1 = 3,
1685 IEEE80211_HT_MPDU_DENSITY_2 = 4,
1686 IEEE80211_HT_MPDU_DENSITY_4 = 5,
1687 IEEE80211_HT_MPDU_DENSITY_8 = 6,
1688 IEEE80211_HT_MPDU_DENSITY_16 = 7
1689 };
1690
1691
1692
1693
1694
1695
1696
1697 struct ieee80211_ht_operation {
1698 u8 primary_chan;
1699 u8 ht_param;
1700 __le16 operation_mode;
1701 __le16 stbc_param;
1702 u8 basic_set[16];
1703 } __packed;
1704
1705
1706 #define IEEE80211_HT_PARAM_CHA_SEC_OFFSET 0x03
1707 #define IEEE80211_HT_PARAM_CHA_SEC_NONE 0x00
1708 #define IEEE80211_HT_PARAM_CHA_SEC_ABOVE 0x01
1709 #define IEEE80211_HT_PARAM_CHA_SEC_BELOW 0x03
1710 #define IEEE80211_HT_PARAM_CHAN_WIDTH_ANY 0x04
1711 #define IEEE80211_HT_PARAM_RIFS_MODE 0x08
1712
1713
1714 #define IEEE80211_HT_OP_MODE_PROTECTION 0x0003
1715 #define IEEE80211_HT_OP_MODE_PROTECTION_NONE 0
1716 #define IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER 1
1717 #define IEEE80211_HT_OP_MODE_PROTECTION_20MHZ 2
1718 #define IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED 3
1719 #define IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT 0x0004
1720 #define IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT 0x0010
1721 #define IEEE80211_HT_OP_MODE_CCFS2_SHIFT 5
1722 #define IEEE80211_HT_OP_MODE_CCFS2_MASK 0x1fe0
1723
1724
1725 #define IEEE80211_HT_STBC_PARAM_DUAL_BEACON 0x0040
1726 #define IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT 0x0080
1727 #define IEEE80211_HT_STBC_PARAM_STBC_BEACON 0x0100
1728 #define IEEE80211_HT_STBC_PARAM_LSIG_TXOP_FULLPROT 0x0200
1729 #define IEEE80211_HT_STBC_PARAM_PCO_ACTIVE 0x0400
1730 #define IEEE80211_HT_STBC_PARAM_PCO_PHASE 0x0800
1731
1732
1733
1734 #define IEEE80211_ADDBA_PARAM_AMSDU_MASK 0x0001
1735 #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002
1736 #define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C
1737 #define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0
1738 #define IEEE80211_DELBA_PARAM_TID_MASK 0xF000
1739 #define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
1740
1741
1742
1743
1744
1745
1746
1747 #define IEEE80211_MIN_AMPDU_BUF 0x8
1748 #define IEEE80211_MAX_AMPDU_BUF_HT 0x40
1749 #define IEEE80211_MAX_AMPDU_BUF_HE 0x100
1750 #define IEEE80211_MAX_AMPDU_BUF_EHT 0x400
1751
1752
1753
1754 #define WLAN_HT_CAP_SM_PS_STATIC 0
1755 #define WLAN_HT_CAP_SM_PS_DYNAMIC 1
1756 #define WLAN_HT_CAP_SM_PS_INVALID 2
1757 #define WLAN_HT_CAP_SM_PS_DISABLED 3
1758
1759
1760 #define WLAN_HT_SMPS_CONTROL_DISABLED 0
1761 #define WLAN_HT_SMPS_CONTROL_STATIC 1
1762 #define WLAN_HT_SMPS_CONTROL_DYNAMIC 3
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782 struct ieee80211_vht_mcs_info {
1783 __le16 rx_mcs_map;
1784 __le16 rx_highest;
1785 __le16 tx_mcs_map;
1786 __le16 tx_highest;
1787 } __packed;
1788
1789
1790 #define IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT 13
1791 #define IEEE80211_VHT_MAX_NSTS_TOTAL_MASK (7 << IEEE80211_VHT_MAX_NSTS_TOTAL_SHIFT)
1792
1793
1794 #define IEEE80211_VHT_EXT_NSS_BW_CAPABLE (1 << 13)
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810 enum ieee80211_vht_mcs_support {
1811 IEEE80211_VHT_MCS_SUPPORT_0_7 = 0,
1812 IEEE80211_VHT_MCS_SUPPORT_0_8 = 1,
1813 IEEE80211_VHT_MCS_SUPPORT_0_9 = 2,
1814 IEEE80211_VHT_MCS_NOT_SUPPORTED = 3,
1815 };
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825 struct ieee80211_vht_cap {
1826 __le32 vht_cap_info;
1827 struct ieee80211_vht_mcs_info supp_mcs;
1828 } __packed;
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838 enum ieee80211_vht_chanwidth {
1839 IEEE80211_VHT_CHANWIDTH_USE_HT = 0,
1840 IEEE80211_VHT_CHANWIDTH_80MHZ = 1,
1841 IEEE80211_VHT_CHANWIDTH_160MHZ = 2,
1842 IEEE80211_VHT_CHANWIDTH_80P80MHZ = 3,
1843 };
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855 struct ieee80211_vht_operation {
1856 u8 chan_width;
1857 u8 center_freq_seg0_idx;
1858 u8 center_freq_seg1_idx;
1859 __le16 basic_mcs_set;
1860 } __packed;
1861
1862
1863
1864
1865
1866
1867
1868 struct ieee80211_he_cap_elem {
1869 u8 mac_cap_info[6];
1870 u8 phy_cap_info[11];
1871 } __packed;
1872
1873 #define IEEE80211_TX_RX_MCS_NSS_DESC_MAX_LEN 5
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889 enum ieee80211_he_mcs_support {
1890 IEEE80211_HE_MCS_SUPPORT_0_7 = 0,
1891 IEEE80211_HE_MCS_SUPPORT_0_9 = 1,
1892 IEEE80211_HE_MCS_SUPPORT_0_11 = 2,
1893 IEEE80211_HE_MCS_NOT_SUPPORTED = 3,
1894 };
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915 struct ieee80211_he_mcs_nss_supp {
1916 __le16 rx_mcs_80;
1917 __le16 tx_mcs_80;
1918 __le16 rx_mcs_160;
1919 __le16 tx_mcs_160;
1920 __le16 rx_mcs_80p80;
1921 __le16 tx_mcs_80p80;
1922 } __packed;
1923
1924
1925
1926
1927
1928
1929
1930 struct ieee80211_he_operation {
1931 __le32 he_oper_params;
1932 __le16 he_mcs_nss_set;
1933
1934 u8 optional[];
1935 } __packed;
1936
1937
1938
1939
1940
1941
1942
1943 struct ieee80211_he_spr {
1944 u8 he_sr_control;
1945
1946 u8 optional[];
1947 } __packed;
1948
1949
1950
1951
1952
1953
1954
1955 struct ieee80211_he_mu_edca_param_ac_rec {
1956 u8 aifsn;
1957 u8 ecw_min_max;
1958 u8 mu_edca_timer;
1959 } __packed;
1960
1961
1962
1963
1964
1965
1966
1967 struct ieee80211_mu_edca_param_set {
1968 u8 mu_qos_info;
1969 struct ieee80211_he_mu_edca_param_ac_rec ac_be;
1970 struct ieee80211_he_mu_edca_param_ac_rec ac_bk;
1971 struct ieee80211_he_mu_edca_param_ac_rec ac_vi;
1972 struct ieee80211_he_mu_edca_param_ac_rec ac_vo;
1973 } __packed;
1974
1975 #define IEEE80211_EHT_MCS_NSS_RX 0x0f
1976 #define IEEE80211_EHT_MCS_NSS_TX 0xf0
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999 struct ieee80211_eht_mcs_nss_supp_20mhz_only {
2000 u8 rx_tx_mcs7_max_nss;
2001 u8 rx_tx_mcs9_max_nss;
2002 u8 rx_tx_mcs11_max_nss;
2003 u8 rx_tx_mcs13_max_nss;
2004 };
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024 struct ieee80211_eht_mcs_nss_supp_bw {
2025 u8 rx_tx_mcs9_max_nss;
2026 u8 rx_tx_mcs11_max_nss;
2027 u8 rx_tx_mcs13_max_nss;
2028 };
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039 struct ieee80211_eht_cap_elem_fixed {
2040 u8 mac_cap_info[2];
2041 u8 phy_cap_info[9];
2042 } __packed;
2043
2044
2045
2046
2047
2048
2049 struct ieee80211_eht_cap_elem {
2050 struct ieee80211_eht_cap_elem_fixed fixed;
2051
2052
2053
2054
2055
2056
2057 u8 optional[];
2058 } __packed;
2059
2060 #define IEEE80211_EHT_OPER_INFO_PRESENT 0x01
2061 #define IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT 0x02
2062 #define IEEE80211_EHT_OPER_EHT_DEF_PE_DURATION 0x04
2063 #define IEEE80211_EHT_OPER_GROUP_ADDRESSED_BU_IND_LIMIT 0x08
2064 #define IEEE80211_EHT_OPER_GROUP_ADDRESSED_BU_IND_EXP_MASK 0x30
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078 struct ieee80211_eht_operation {
2079 u8 params;
2080 __le32 basic_mcs_nss;
2081 u8 optional[];
2082 } __packed;
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093 struct ieee80211_eht_operation_info {
2094 u8 control;
2095 u8 ccfs0;
2096 u8 ccfs1;
2097 u8 optional[];
2098 } __packed;
2099
2100
2101 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 0x00000000
2102 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 0x00000001
2103 #define IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 0x00000002
2104 #define IEEE80211_VHT_CAP_MAX_MPDU_MASK 0x00000003
2105 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ 0x00000004
2106 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ 0x00000008
2107 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK 0x0000000C
2108 #define IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_SHIFT 2
2109 #define IEEE80211_VHT_CAP_RXLDPC 0x00000010
2110 #define IEEE80211_VHT_CAP_SHORT_GI_80 0x00000020
2111 #define IEEE80211_VHT_CAP_SHORT_GI_160 0x00000040
2112 #define IEEE80211_VHT_CAP_TXSTBC 0x00000080
2113 #define IEEE80211_VHT_CAP_RXSTBC_1 0x00000100
2114 #define IEEE80211_VHT_CAP_RXSTBC_2 0x00000200
2115 #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300
2116 #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400
2117 #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700
2118 #define IEEE80211_VHT_CAP_RXSTBC_SHIFT 8
2119 #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800
2120 #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000
2121 #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13
2122 #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK \
2123 (7 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT)
2124 #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT 16
2125 #define IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK \
2126 (7 << IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT)
2127 #define IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE 0x00080000
2128 #define IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE 0x00100000
2129 #define IEEE80211_VHT_CAP_VHT_TXOP_PS 0x00200000
2130 #define IEEE80211_VHT_CAP_HTC_VHT 0x00400000
2131 #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT 23
2132 #define IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK \
2133 (7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT)
2134 #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_UNSOL_MFB 0x08000000
2135 #define IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB 0x0c000000
2136 #define IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN 0x10000000
2137 #define IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN 0x20000000
2138 #define IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT 30
2139 #define IEEE80211_VHT_CAP_EXT_NSS_BW_MASK 0xc0000000
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158 int ieee80211_get_vht_max_nss(struct ieee80211_vht_cap *cap,
2159 enum ieee80211_vht_chanwidth bw,
2160 int mcs, bool ext_nss_bw_capable,
2161 unsigned int max_vht_nss);
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173 enum ieee80211_ap_reg_power {
2174 IEEE80211_REG_UNSET_AP,
2175 IEEE80211_REG_LPI_AP,
2176 IEEE80211_REG_SP_AP,
2177 IEEE80211_REG_VLP_AP,
2178 IEEE80211_REG_AP_POWER_AFTER_LAST,
2179 IEEE80211_REG_AP_POWER_MAX =
2180 IEEE80211_REG_AP_POWER_AFTER_LAST - 1,
2181 };
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192 enum ieee80211_client_reg_power {
2193 IEEE80211_REG_UNSET_CLIENT,
2194 IEEE80211_REG_DEFAULT_CLIENT,
2195 IEEE80211_REG_SUBORDINATE_CLIENT,
2196 IEEE80211_REG_CLIENT_POWER_AFTER_LAST,
2197 IEEE80211_REG_CLIENT_POWER_MAX =
2198 IEEE80211_REG_CLIENT_POWER_AFTER_LAST - 1,
2199 };
2200
2201
2202 #define IEEE80211_HE_MAC_CAP0_HTC_HE 0x01
2203 #define IEEE80211_HE_MAC_CAP0_TWT_REQ 0x02
2204 #define IEEE80211_HE_MAC_CAP0_TWT_RES 0x04
2205 #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_NOT_SUPP 0x00
2206 #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_1 0x08
2207 #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_2 0x10
2208 #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_LEVEL_3 0x18
2209 #define IEEE80211_HE_MAC_CAP0_DYNAMIC_FRAG_MASK 0x18
2210 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_1 0x00
2211 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_2 0x20
2212 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_4 0x40
2213 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_8 0x60
2214 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_16 0x80
2215 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_32 0xa0
2216 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_64 0xc0
2217 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_UNLIMITED 0xe0
2218 #define IEEE80211_HE_MAC_CAP0_MAX_NUM_FRAG_MSDU_MASK 0xe0
2219
2220 #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_UNLIMITED 0x00
2221 #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_128 0x01
2222 #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_256 0x02
2223 #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_512 0x03
2224 #define IEEE80211_HE_MAC_CAP1_MIN_FRAG_SIZE_MASK 0x03
2225 #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_0US 0x00
2226 #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_8US 0x04
2227 #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US 0x08
2228 #define IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_MASK 0x0c
2229 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_1 0x00
2230 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_2 0x10
2231 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_3 0x20
2232 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_4 0x30
2233 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_5 0x40
2234 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_6 0x50
2235 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_7 0x60
2236 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8 0x70
2237 #define IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_MASK 0x70
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247 #define IEEE80211_HE_MAC_CAP1_LINK_ADAPTATION 0x80
2248
2249 #define IEEE80211_HE_MAC_CAP2_LINK_ADAPTATION 0x01
2250 #define IEEE80211_HE_MAC_CAP2_ALL_ACK 0x02
2251 #define IEEE80211_HE_MAC_CAP2_TRS 0x04
2252 #define IEEE80211_HE_MAC_CAP2_BSR 0x08
2253 #define IEEE80211_HE_MAC_CAP2_BCAST_TWT 0x10
2254 #define IEEE80211_HE_MAC_CAP2_32BIT_BA_BITMAP 0x20
2255 #define IEEE80211_HE_MAC_CAP2_MU_CASCADING 0x40
2256 #define IEEE80211_HE_MAC_CAP2_ACK_EN 0x80
2257
2258 #define IEEE80211_HE_MAC_CAP3_OMI_CONTROL 0x02
2259 #define IEEE80211_HE_MAC_CAP3_OFDMA_RA 0x04
2260
2261
2262
2263
2264
2265 #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_0 0x00
2266 #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_1 0x08
2267 #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_2 0x10
2268 #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3 0x18
2269 #define IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_MASK 0x18
2270 #define IEEE80211_HE_MAC_CAP3_AMSDU_FRAG 0x20
2271 #define IEEE80211_HE_MAC_CAP3_FLEX_TWT_SCHED 0x40
2272 #define IEEE80211_HE_MAC_CAP3_RX_CTRL_FRAME_TO_MULTIBSS 0x80
2273
2274 #define IEEE80211_HE_MAC_CAP4_BSRP_BQRP_A_MPDU_AGG 0x01
2275 #define IEEE80211_HE_MAC_CAP4_QTP 0x02
2276 #define IEEE80211_HE_MAC_CAP4_BQR 0x04
2277 #define IEEE80211_HE_MAC_CAP4_PSR_RESP 0x08
2278 #define IEEE80211_HE_MAC_CAP4_NDP_FB_REP 0x10
2279 #define IEEE80211_HE_MAC_CAP4_OPS 0x20
2280 #define IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU 0x40
2281
2282
2283
2284 #define IEEE80211_HE_MAC_CAP4_MULTI_TID_AGG_TX_QOS_B39 0x80
2285
2286 #define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B40 0x01
2287 #define IEEE80211_HE_MAC_CAP5_MULTI_TID_AGG_TX_QOS_B41 0x02
2288 #define IEEE80211_HE_MAC_CAP5_SUBCHAN_SELECTIVE_TRANSMISSION 0x04
2289 #define IEEE80211_HE_MAC_CAP5_UL_2x996_TONE_RU 0x08
2290 #define IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX 0x10
2291 #define IEEE80211_HE_MAC_CAP5_HE_DYNAMIC_SM_PS 0x20
2292 #define IEEE80211_HE_MAC_CAP5_PUNCTURED_SOUNDING 0x40
2293 #define IEEE80211_HE_MAC_CAP5_HT_VHT_TRIG_FRAME_RX 0x80
2294
2295 #define IEEE80211_HE_VHT_MAX_AMPDU_FACTOR 20
2296 #define IEEE80211_HE_HT_MAX_AMPDU_FACTOR 16
2297 #define IEEE80211_HE_6GHZ_MAX_AMPDU_FACTOR 13
2298
2299
2300 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G 0x02
2301 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G 0x04
2302 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G 0x08
2303 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G 0x10
2304 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK_ALL 0x1e
2305
2306 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G 0x20
2307 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G 0x40
2308 #define IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_MASK 0xfe
2309
2310 #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_20MHZ 0x01
2311 #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_80MHZ_ONLY_SECOND_40MHZ 0x02
2312 #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_20MHZ 0x04
2313 #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_160MHZ_ONLY_SECOND_40MHZ 0x08
2314 #define IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK 0x0f
2315 #define IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A 0x10
2316 #define IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD 0x20
2317 #define IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US 0x40
2318
2319 #define IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS 0x80
2320
2321 #define IEEE80211_HE_PHY_CAP2_MIDAMBLE_RX_TX_MAX_NSTS 0x01
2322 #define IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US 0x02
2323 #define IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ 0x04
2324 #define IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ 0x08
2325 #define IEEE80211_HE_PHY_CAP2_DOPPLER_TX 0x10
2326 #define IEEE80211_HE_PHY_CAP2_DOPPLER_RX 0x20
2327
2328
2329
2330
2331
2332 #define IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO 0x40
2333 #define IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO 0x80
2334
2335 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_NO_DCM 0x00
2336 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_BPSK 0x01
2337 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK 0x02
2338 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_16_QAM 0x03
2339 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_MASK 0x03
2340 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_1 0x00
2341 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_TX_NSS_2 0x04
2342 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_NO_DCM 0x00
2343 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_BPSK 0x08
2344 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK 0x10
2345 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_16_QAM 0x18
2346 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_MASK 0x18
2347 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_1 0x00
2348 #define IEEE80211_HE_PHY_CAP3_DCM_MAX_RX_NSS_2 0x20
2349 #define IEEE80211_HE_PHY_CAP3_RX_PARTIAL_BW_SU_IN_20MHZ_MU 0x40
2350 #define IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER 0x80
2351
2352 #define IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE 0x01
2353 #define IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER 0x02
2354
2355
2356 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 0x0c
2357 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5 0x10
2358 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_6 0x14
2359 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_7 0x18
2360 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_8 0x1c
2361 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_MASK 0x1c
2362
2363
2364 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4 0x60
2365 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5 0x80
2366 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_6 0xa0
2367 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_7 0xc0
2368 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_8 0xe0
2369 #define IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_MASK 0xe0
2370
2371 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_1 0x00
2372 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_2 0x01
2373 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_3 0x02
2374 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_4 0x03
2375 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_5 0x04
2376 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_6 0x05
2377 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_7 0x06
2378 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_8 0x07
2379 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK 0x07
2380
2381 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_1 0x00
2382 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_2 0x08
2383 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_3 0x10
2384 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_4 0x18
2385 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_5 0x20
2386 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_6 0x28
2387 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_7 0x30
2388 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_8 0x38
2389 #define IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK 0x38
2390
2391 #define IEEE80211_HE_PHY_CAP5_NG16_SU_FEEDBACK 0x40
2392 #define IEEE80211_HE_PHY_CAP5_NG16_MU_FEEDBACK 0x80
2393
2394 #define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_42_SU 0x01
2395 #define IEEE80211_HE_PHY_CAP6_CODEBOOK_SIZE_75_MU 0x02
2396 #define IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB 0x04
2397 #define IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB 0x08
2398 #define IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB 0x10
2399 #define IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE 0x20
2400 #define IEEE80211_HE_PHY_CAP6_PARTIAL_BANDWIDTH_DL_MUMIMO 0x40
2401 #define IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT 0x80
2402
2403 #define IEEE80211_HE_PHY_CAP7_PSR_BASED_SR 0x01
2404 #define IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP 0x02
2405 #define IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI 0x04
2406 #define IEEE80211_HE_PHY_CAP7_MAX_NC_1 0x08
2407 #define IEEE80211_HE_PHY_CAP7_MAX_NC_2 0x10
2408 #define IEEE80211_HE_PHY_CAP7_MAX_NC_3 0x18
2409 #define IEEE80211_HE_PHY_CAP7_MAX_NC_4 0x20
2410 #define IEEE80211_HE_PHY_CAP7_MAX_NC_5 0x28
2411 #define IEEE80211_HE_PHY_CAP7_MAX_NC_6 0x30
2412 #define IEEE80211_HE_PHY_CAP7_MAX_NC_7 0x38
2413 #define IEEE80211_HE_PHY_CAP7_MAX_NC_MASK 0x38
2414 #define IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ 0x40
2415 #define IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ 0x80
2416
2417 #define IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI 0x01
2418 #define IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G 0x02
2419 #define IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU 0x04
2420 #define IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU 0x08
2421 #define IEEE80211_HE_PHY_CAP8_HE_ER_SU_1XLTF_AND_08_US_GI 0x10
2422 #define IEEE80211_HE_PHY_CAP8_MIDAMBLE_RX_TX_2X_AND_1XLTF 0x20
2423 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242 0x00
2424 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484 0x40
2425 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996 0x80
2426 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996 0xc0
2427 #define IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK 0xc0
2428
2429 #define IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM 0x01
2430 #define IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK 0x02
2431 #define IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU 0x04
2432 #define IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU 0x08
2433 #define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB 0x10
2434 #define IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB 0x20
2435 #define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_0US 0x0
2436 #define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_8US 0x1
2437 #define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US 0x2
2438 #define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED 0x3
2439 #define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS 6
2440 #define IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK 0xc0
2441
2442 #define IEEE80211_HE_PHY_CAP10_HE_MU_M1RU_MAX_LTF 0x01
2443
2444
2445 #define IEEE80211_TX_RX_MCS_NSS_SUPP_HIGHEST_MCS_POS (3)
2446 #define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_POS (6)
2447 #define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_POS (11)
2448 #define IEEE80211_TX_RX_MCS_NSS_SUPP_TX_BITMAP_MASK 0x07c0
2449 #define IEEE80211_TX_RX_MCS_NSS_SUPP_RX_BITMAP_MASK 0xf800
2450
2451
2452 enum ieee80211_he_highest_mcs_supported_subfield_enc {
2453 HIGHEST_MCS_SUPPORTED_MCS7 = 0,
2454 HIGHEST_MCS_SUPPORTED_MCS8,
2455 HIGHEST_MCS_SUPPORTED_MCS9,
2456 HIGHEST_MCS_SUPPORTED_MCS10,
2457 HIGHEST_MCS_SUPPORTED_MCS11,
2458 };
2459
2460
2461 static inline u8
2462 ieee80211_he_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap)
2463 {
2464 u8 count = 4;
2465
2466 if (he_cap->phy_cap_info[0] &
2467 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2468 count += 4;
2469
2470 if (he_cap->phy_cap_info[0] &
2471 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G)
2472 count += 4;
2473
2474 return count;
2475 }
2476
2477
2478 #define IEEE80211_PPE_THRES_NSS_SUPPORT_2NSS (1)
2479 #define IEEE80211_PPE_THRES_NSS_POS (0)
2480 #define IEEE80211_PPE_THRES_NSS_MASK (7)
2481 #define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_2x966_AND_966_RU \
2482 (BIT(5) | BIT(6))
2483 #define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK 0x78
2484 #define IEEE80211_PPE_THRES_RU_INDEX_BITMASK_POS (3)
2485 #define IEEE80211_PPE_THRES_INFO_PPET_SIZE (3)
2486 #define IEEE80211_HE_PPE_THRES_INFO_HEADER_SIZE (7)
2487
2488
2489
2490
2491
2492 static inline u8
2493 ieee80211_he_ppe_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
2494 {
2495 u8 n;
2496
2497 if ((phy_cap_info[6] &
2498 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0)
2499 return 0;
2500
2501 n = hweight8(ppe_thres_hdr &
2502 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
2503 n *= (1 + ((ppe_thres_hdr & IEEE80211_PPE_THRES_NSS_MASK) >>
2504 IEEE80211_PPE_THRES_NSS_POS));
2505
2506
2507
2508
2509
2510 n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7;
2511 n = DIV_ROUND_UP(n, 8);
2512
2513 return n;
2514 }
2515
2516 static inline bool ieee80211_he_capa_size_ok(const u8 *data, u8 len)
2517 {
2518 const struct ieee80211_he_cap_elem *he_cap_ie_elem = (const void *)data;
2519 u8 needed = sizeof(*he_cap_ie_elem);
2520
2521 if (len < needed)
2522 return false;
2523
2524 needed += ieee80211_he_mcs_nss_size(he_cap_ie_elem);
2525 if (len < needed)
2526 return false;
2527
2528 if (he_cap_ie_elem->phy_cap_info[6] &
2529 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
2530 if (len < needed + 1)
2531 return false;
2532 needed += ieee80211_he_ppe_size(data[needed],
2533 he_cap_ie_elem->phy_cap_info);
2534 }
2535
2536 return len >= needed;
2537 }
2538
2539
2540 #define IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK 0x00000007
2541 #define IEEE80211_HE_OPERATION_TWT_REQUIRED 0x00000008
2542 #define IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK 0x00003ff0
2543 #define IEEE80211_HE_OPERATION_RTS_THRESHOLD_OFFSET 4
2544 #define IEEE80211_HE_OPERATION_VHT_OPER_INFO 0x00004000
2545 #define IEEE80211_HE_OPERATION_CO_HOSTED_BSS 0x00008000
2546 #define IEEE80211_HE_OPERATION_ER_SU_DISABLE 0x00010000
2547 #define IEEE80211_HE_OPERATION_6GHZ_OP_INFO 0x00020000
2548 #define IEEE80211_HE_OPERATION_BSS_COLOR_MASK 0x3f000000
2549 #define IEEE80211_HE_OPERATION_BSS_COLOR_OFFSET 24
2550 #define IEEE80211_HE_OPERATION_PARTIAL_BSS_COLOR 0x40000000
2551 #define IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED 0x80000000
2552
2553 #define IEEE80211_6GHZ_CTRL_REG_LPI_AP 0
2554 #define IEEE80211_6GHZ_CTRL_REG_SP_AP 1
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564 struct ieee80211_he_6ghz_oper {
2565 u8 primary;
2566 #define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH 0x3
2567 #define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ 0
2568 #define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ 1
2569 #define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ 2
2570 #define IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ 3
2571 #define IEEE80211_HE_6GHZ_OPER_CTRL_DUP_BEACON 0x4
2572 #define IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO 0x38
2573 u8 control;
2574 u8 ccfs0;
2575 u8 ccfs1;
2576 u8 minrate;
2577 } __packed;
2578
2579
2580
2581
2582
2583
2584
2585
2586 #define IEEE80211_TPE_MAX_IE_COUNT 8
2587
2588
2589
2590
2591 #define IEEE80211_MAX_NUM_PWR_LEVEL 8
2592
2593 #define IEEE80211_TPE_MAX_POWER_COUNT 8
2594
2595
2596 enum ieee80211_tx_power_intrpt_type {
2597 IEEE80211_TPE_LOCAL_EIRP,
2598 IEEE80211_TPE_LOCAL_EIRP_PSD,
2599 IEEE80211_TPE_REG_CLIENT_EIRP,
2600 IEEE80211_TPE_REG_CLIENT_EIRP_PSD,
2601 };
2602
2603
2604
2605
2606
2607
2608 struct ieee80211_tx_pwr_env {
2609 u8 tx_power_info;
2610 s8 tx_power[IEEE80211_TPE_MAX_POWER_COUNT];
2611 } __packed;
2612
2613 #define IEEE80211_TX_PWR_ENV_INFO_COUNT 0x7
2614 #define IEEE80211_TX_PWR_ENV_INFO_INTERPRET 0x38
2615 #define IEEE80211_TX_PWR_ENV_INFO_CATEGORY 0xC0
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625 static inline u8
2626 ieee80211_he_oper_size(const u8 *he_oper_ie)
2627 {
2628 const struct ieee80211_he_operation *he_oper = (const void *)he_oper_ie;
2629 u8 oper_len = sizeof(struct ieee80211_he_operation);
2630 u32 he_oper_params;
2631
2632
2633 if (!he_oper_ie)
2634 return 0;
2635
2636
2637 he_oper_params = le32_to_cpu(he_oper->he_oper_params);
2638 if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO)
2639 oper_len += 3;
2640 if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
2641 oper_len++;
2642 if (he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO)
2643 oper_len += sizeof(struct ieee80211_he_6ghz_oper);
2644
2645
2646 oper_len++;
2647
2648 return oper_len;
2649 }
2650
2651
2652
2653
2654
2655
2656
2657
2658 static inline const struct ieee80211_he_6ghz_oper *
2659 ieee80211_he_6ghz_oper(const struct ieee80211_he_operation *he_oper)
2660 {
2661 const u8 *ret = (const void *)&he_oper->optional;
2662 u32 he_oper_params;
2663
2664 if (!he_oper)
2665 return NULL;
2666
2667 he_oper_params = le32_to_cpu(he_oper->he_oper_params);
2668
2669 if (!(he_oper_params & IEEE80211_HE_OPERATION_6GHZ_OP_INFO))
2670 return NULL;
2671 if (he_oper_params & IEEE80211_HE_OPERATION_VHT_OPER_INFO)
2672 ret += 3;
2673 if (he_oper_params & IEEE80211_HE_OPERATION_CO_HOSTED_BSS)
2674 ret++;
2675
2676 return (const void *)ret;
2677 }
2678
2679
2680 #define IEEE80211_HE_SPR_PSR_DISALLOWED BIT(0)
2681 #define IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED BIT(1)
2682 #define IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT BIT(2)
2683 #define IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT BIT(3)
2684 #define IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED BIT(4)
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694 static inline u8
2695 ieee80211_he_spr_size(const u8 *he_spr_ie)
2696 {
2697 const struct ieee80211_he_spr *he_spr = (const void *)he_spr_ie;
2698 u8 spr_len = sizeof(struct ieee80211_he_spr);
2699 u8 he_spr_params;
2700
2701
2702 if (!he_spr_ie)
2703 return 0;
2704
2705
2706 he_spr_params = he_spr->he_sr_control;
2707 if (he_spr_params & IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
2708 spr_len++;
2709 if (he_spr_params & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT)
2710 spr_len += 18;
2711
2712
2713 spr_len++;
2714
2715 return spr_len;
2716 }
2717
2718
2719 #define IEEE80211_S1G_CAPABILITY_LEN 15
2720
2721 #define S1G_CAP0_S1G_LONG BIT(0)
2722 #define S1G_CAP0_SGI_1MHZ BIT(1)
2723 #define S1G_CAP0_SGI_2MHZ BIT(2)
2724 #define S1G_CAP0_SGI_4MHZ BIT(3)
2725 #define S1G_CAP0_SGI_8MHZ BIT(4)
2726 #define S1G_CAP0_SGI_16MHZ BIT(5)
2727 #define S1G_CAP0_SUPP_CH_WIDTH GENMASK(7, 6)
2728
2729 #define S1G_SUPP_CH_WIDTH_2 0
2730 #define S1G_SUPP_CH_WIDTH_4 1
2731 #define S1G_SUPP_CH_WIDTH_8 2
2732 #define S1G_SUPP_CH_WIDTH_16 3
2733 #define S1G_SUPP_CH_WIDTH_MAX(cap) ((1 << FIELD_GET(S1G_CAP0_SUPP_CH_WIDTH, \
2734 cap[0])) << 1)
2735
2736 #define S1G_CAP1_RX_LDPC BIT(0)
2737 #define S1G_CAP1_TX_STBC BIT(1)
2738 #define S1G_CAP1_RX_STBC BIT(2)
2739 #define S1G_CAP1_SU_BFER BIT(3)
2740 #define S1G_CAP1_SU_BFEE BIT(4)
2741 #define S1G_CAP1_BFEE_STS GENMASK(7, 5)
2742
2743 #define S1G_CAP2_SOUNDING_DIMENSIONS GENMASK(2, 0)
2744 #define S1G_CAP2_MU_BFER BIT(3)
2745 #define S1G_CAP2_MU_BFEE BIT(4)
2746 #define S1G_CAP2_PLUS_HTC_VHT BIT(5)
2747 #define S1G_CAP2_TRAVELING_PILOT GENMASK(7, 6)
2748
2749 #define S1G_CAP3_RD_RESPONDER BIT(0)
2750 #define S1G_CAP3_HT_DELAYED_BA BIT(1)
2751 #define S1G_CAP3_MAX_MPDU_LEN BIT(2)
2752 #define S1G_CAP3_MAX_AMPDU_LEN_EXP GENMASK(4, 3)
2753 #define S1G_CAP3_MIN_MPDU_START GENMASK(7, 5)
2754
2755 #define S1G_CAP4_UPLINK_SYNC BIT(0)
2756 #define S1G_CAP4_DYNAMIC_AID BIT(1)
2757 #define S1G_CAP4_BAT BIT(2)
2758 #define S1G_CAP4_TIME_ADE BIT(3)
2759 #define S1G_CAP4_NON_TIM BIT(4)
2760 #define S1G_CAP4_GROUP_AID BIT(5)
2761 #define S1G_CAP4_STA_TYPE GENMASK(7, 6)
2762
2763 #define S1G_CAP5_CENT_AUTH_CONTROL BIT(0)
2764 #define S1G_CAP5_DIST_AUTH_CONTROL BIT(1)
2765 #define S1G_CAP5_AMSDU BIT(2)
2766 #define S1G_CAP5_AMPDU BIT(3)
2767 #define S1G_CAP5_ASYMMETRIC_BA BIT(4)
2768 #define S1G_CAP5_FLOW_CONTROL BIT(5)
2769 #define S1G_CAP5_SECTORIZED_BEAM GENMASK(7, 6)
2770
2771 #define S1G_CAP6_OBSS_MITIGATION BIT(0)
2772 #define S1G_CAP6_FRAGMENT_BA BIT(1)
2773 #define S1G_CAP6_NDP_PS_POLL BIT(2)
2774 #define S1G_CAP6_RAW_OPERATION BIT(3)
2775 #define S1G_CAP6_PAGE_SLICING BIT(4)
2776 #define S1G_CAP6_TXOP_SHARING_IMP_ACK BIT(5)
2777 #define S1G_CAP6_VHT_LINK_ADAPT GENMASK(7, 6)
2778
2779 #define S1G_CAP7_TACK_AS_PS_POLL BIT(0)
2780 #define S1G_CAP7_DUP_1MHZ BIT(1)
2781 #define S1G_CAP7_MCS_NEGOTIATION BIT(2)
2782 #define S1G_CAP7_1MHZ_CTL_RESPONSE_PREAMBLE BIT(3)
2783 #define S1G_CAP7_NDP_BFING_REPORT_POLL BIT(4)
2784 #define S1G_CAP7_UNSOLICITED_DYN_AID BIT(5)
2785 #define S1G_CAP7_SECTOR_TRAINING_OPERATION BIT(6)
2786 #define S1G_CAP7_TEMP_PS_MODE_SWITCH BIT(7)
2787
2788 #define S1G_CAP8_TWT_GROUPING BIT(0)
2789 #define S1G_CAP8_BDT BIT(1)
2790 #define S1G_CAP8_COLOR GENMASK(4, 2)
2791 #define S1G_CAP8_TWT_REQUEST BIT(5)
2792 #define S1G_CAP8_TWT_RESPOND BIT(6)
2793 #define S1G_CAP8_PV1_FRAME BIT(7)
2794
2795 #define S1G_CAP9_LINK_ADAPT_PER_CONTROL_RESPONSE BIT(0)
2796
2797 #define S1G_OPER_CH_WIDTH_PRIMARY_1MHZ BIT(0)
2798 #define S1G_OPER_CH_WIDTH_OPER GENMASK(4, 1)
2799
2800
2801 #define IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS 0x01
2802 #define IEEE80211_EHT_MAC_CAP0_OM_CONTROL 0x02
2803 #define IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 0x04
2804 #define IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 0x08
2805 #define IEEE80211_EHT_MAC_CAP0_RESTRICTED_TWT 0x10
2806 #define IEEE80211_EHT_MAC_CAP0_SCS_TRAFFIC_DESC 0x20
2807 #define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_MASK 0xc0
2808 #define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_3895 0
2809 #define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_7991 1
2810 #define IEEE80211_EHT_MAC_CAP0_MAX_MPDU_LEN_11454 2
2811
2812 #define IEEE80211_EHT_MAC_CAP1_MAX_AMPDU_LEN_MASK 0x01
2813
2814
2815 #define IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ 0x02
2816 #define IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ 0x04
2817 #define IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI 0x08
2818 #define IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO 0x10
2819 #define IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER 0x20
2820 #define IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE 0x40
2821
2822
2823 #define IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK 0x80
2824 #define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK 0x03
2825
2826 #define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK 0x1c
2827 #define IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK 0xe0
2828
2829 #define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK 0x07
2830 #define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK 0x38
2831
2832
2833 #define IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK 0xc0
2834 #define IEEE80211_EHT_PHY_CAP3_SOUNDING_DIM_320MHZ_MASK 0x01
2835 #define IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK 0x02
2836 #define IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK 0x04
2837 #define IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK 0x08
2838 #define IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK 0x10
2839 #define IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK 0x20
2840 #define IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK 0x40
2841 #define IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK 0x80
2842
2843 #define IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO 0x01
2844 #define IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP 0x02
2845 #define IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP 0x04
2846 #define IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI 0x08
2847 #define IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK 0xf0
2848
2849 #define IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK 0x01
2850 #define IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP 0x02
2851 #define IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP 0x04
2852 #define IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT 0x08
2853 #define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK 0x30
2854 #define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_0US 0
2855 #define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_8US 1
2856 #define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US 2
2857 #define IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_20US 3
2858
2859
2860 #define IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK 0xc0
2861 #define IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK 0x07
2862
2863 #define IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK 0x78
2864 #define IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP 0x80
2865
2866 #define IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW 0x01
2867 #define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ 0x02
2868 #define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ 0x04
2869 #define IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ 0x08
2870 #define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ 0x10
2871 #define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ 0x20
2872 #define IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ 0x40
2873 #define IEEE80211_EHT_PHY_CAP7_TB_SOUNDING_FDBK_RATE_LIMIT 0x80
2874
2875 #define IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA 0x01
2876 #define IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA 0x02
2877
2878
2879
2880
2881 #define IEEE80211_EHT_OPER_CHAN_WIDTH 0x7
2882 #define IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ 0
2883 #define IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ 1
2884 #define IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ 2
2885 #define IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ 3
2886 #define IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ 4
2887
2888
2889 static inline u8
2890 ieee80211_eht_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap,
2891 const struct ieee80211_eht_cap_elem_fixed *eht_cap)
2892 {
2893 u8 count = 0;
2894
2895
2896 if (he_cap->phy_cap_info[0] &
2897 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G)
2898 return 3;
2899
2900
2901 if (he_cap->phy_cap_info[0] &
2902 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G)
2903 count += 3;
2904
2905 if (he_cap->phy_cap_info[0] &
2906 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G)
2907 count += 3;
2908
2909 if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
2910 count += 3;
2911
2912 return count ? count : 4;
2913 }
2914
2915
2916 #define IEEE80211_EHT_PPE_THRES_NSS_POS 0
2917 #define IEEE80211_EHT_PPE_THRES_NSS_MASK 0xf
2918 #define IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK 0x1f0
2919 #define IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE 3
2920 #define IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE 9
2921
2922
2923
2924
2925 static inline u8
2926 ieee80211_eht_ppe_size(u16 ppe_thres_hdr, const u8 *phy_cap_info)
2927 {
2928 u32 n;
2929
2930 if (!(phy_cap_info[5] &
2931 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT))
2932 return 0;
2933
2934 n = hweight16(ppe_thres_hdr &
2935 IEEE80211_EHT_PPE_THRES_RU_INDEX_BITMASK_MASK);
2936 n *= 1 + u16_get_bits(ppe_thres_hdr, IEEE80211_EHT_PPE_THRES_NSS_MASK);
2937
2938
2939
2940
2941
2942 n = n * IEEE80211_EHT_PPE_THRES_INFO_PPET_SIZE * 2 +
2943 IEEE80211_EHT_PPE_THRES_INFO_HEADER_SIZE;
2944 return DIV_ROUND_UP(n, 8);
2945 }
2946
2947 static inline bool
2948 ieee80211_eht_capa_size_ok(const u8 *he_capa, const u8 *data, u8 len)
2949 {
2950 const struct ieee80211_eht_cap_elem_fixed *elem = (const void *)data;
2951 u8 needed = sizeof(struct ieee80211_eht_cap_elem_fixed);
2952
2953 if (len < needed || !he_capa)
2954 return false;
2955
2956 needed += ieee80211_eht_mcs_nss_size((const void *)he_capa,
2957 (const void *)data);
2958 if (len < needed)
2959 return false;
2960
2961 if (elem->phy_cap_info[5] &
2962 IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT) {
2963 u16 ppe_thres_hdr;
2964
2965 if (len < needed + sizeof(ppe_thres_hdr))
2966 return false;
2967
2968 ppe_thres_hdr = get_unaligned_le16(data + needed);
2969 needed += ieee80211_eht_ppe_size(ppe_thres_hdr,
2970 elem->phy_cap_info);
2971 }
2972
2973 return len >= needed;
2974 }
2975
2976 static inline bool
2977 ieee80211_eht_oper_size_ok(const u8 *data, u8 len)
2978 {
2979 const struct ieee80211_eht_operation *elem = (const void *)data;
2980 u8 needed = sizeof(*elem);
2981
2982 if (len < needed)
2983 return false;
2984
2985 if (elem->params & IEEE80211_EHT_OPER_INFO_PRESENT) {
2986 needed += 3;
2987
2988 if (elem->params &
2989 IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT)
2990 needed += 2;
2991 }
2992
2993 return len >= needed;
2994 }
2995
2996 #define LISTEN_INT_USF GENMASK(15, 14)
2997 #define LISTEN_INT_UI GENMASK(13, 0)
2998
2999 #define IEEE80211_MAX_USF FIELD_MAX(LISTEN_INT_USF)
3000 #define IEEE80211_MAX_UI FIELD_MAX(LISTEN_INT_UI)
3001
3002
3003 #define WLAN_AUTH_OPEN 0
3004 #define WLAN_AUTH_SHARED_KEY 1
3005 #define WLAN_AUTH_FT 2
3006 #define WLAN_AUTH_SAE 3
3007 #define WLAN_AUTH_FILS_SK 4
3008 #define WLAN_AUTH_FILS_SK_PFS 5
3009 #define WLAN_AUTH_FILS_PK 6
3010 #define WLAN_AUTH_LEAP 128
3011
3012 #define WLAN_AUTH_CHALLENGE_LEN 128
3013
3014 #define WLAN_CAPABILITY_ESS (1<<0)
3015 #define WLAN_CAPABILITY_IBSS (1<<1)
3016
3017
3018
3019
3020
3021
3022 #define WLAN_CAPABILITY_IS_STA_BSS(cap) \
3023 (!((cap) & (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)))
3024
3025 #define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
3026 #define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
3027 #define WLAN_CAPABILITY_PRIVACY (1<<4)
3028 #define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
3029 #define WLAN_CAPABILITY_PBCC (1<<6)
3030 #define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
3031
3032
3033 #define WLAN_CAPABILITY_SPECTRUM_MGMT (1<<8)
3034 #define WLAN_CAPABILITY_QOS (1<<9)
3035 #define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10)
3036 #define WLAN_CAPABILITY_APSD (1<<11)
3037 #define WLAN_CAPABILITY_RADIO_MEASURE (1<<12)
3038 #define WLAN_CAPABILITY_DSSS_OFDM (1<<13)
3039 #define WLAN_CAPABILITY_DEL_BACK (1<<14)
3040 #define WLAN_CAPABILITY_IMM_BACK (1<<15)
3041
3042
3043
3044 #define WLAN_CAPABILITY_DMG_TYPE_MASK (3<<0)
3045 #define WLAN_CAPABILITY_DMG_TYPE_IBSS (1<<0)
3046 #define WLAN_CAPABILITY_DMG_TYPE_PBSS (2<<0)
3047 #define WLAN_CAPABILITY_DMG_TYPE_AP (3<<0)
3048
3049 #define WLAN_CAPABILITY_DMG_CBAP_ONLY (1<<2)
3050 #define WLAN_CAPABILITY_DMG_CBAP_SOURCE (1<<3)
3051 #define WLAN_CAPABILITY_DMG_PRIVACY (1<<4)
3052 #define WLAN_CAPABILITY_DMG_ECPAC (1<<5)
3053
3054 #define WLAN_CAPABILITY_DMG_SPECTRUM_MGMT (1<<8)
3055 #define WLAN_CAPABILITY_DMG_RADIO_MEASURE (1<<12)
3056
3057
3058 #define IEEE80211_SPCT_MSR_RPRT_MODE_LATE (1<<0)
3059 #define IEEE80211_SPCT_MSR_RPRT_MODE_INCAPABLE (1<<1)
3060 #define IEEE80211_SPCT_MSR_RPRT_MODE_REFUSED (1<<2)
3061
3062 #define IEEE80211_SPCT_MSR_RPRT_TYPE_BASIC 0
3063 #define IEEE80211_SPCT_MSR_RPRT_TYPE_CCA 1
3064 #define IEEE80211_SPCT_MSR_RPRT_TYPE_RPI 2
3065 #define IEEE80211_SPCT_MSR_RPRT_TYPE_LCI 8
3066 #define IEEE80211_SPCT_MSR_RPRT_TYPE_CIVIC 11
3067
3068
3069 #define WLAN_ERP_NON_ERP_PRESENT (1<<0)
3070 #define WLAN_ERP_USE_PROTECTION (1<<1)
3071 #define WLAN_ERP_BARKER_PREAMBLE (1<<2)
3072
3073
3074 enum {
3075 WLAN_ERP_PREAMBLE_SHORT = 0,
3076 WLAN_ERP_PREAMBLE_LONG = 1,
3077 };
3078
3079
3080 enum {
3081 IEEE80211_BANDID_TV_WS = 0,
3082 IEEE80211_BANDID_SUB1 = 1,
3083 IEEE80211_BANDID_2G = 2,
3084 IEEE80211_BANDID_3G = 3,
3085 IEEE80211_BANDID_5G = 4,
3086 IEEE80211_BANDID_60G = 5,
3087 };
3088
3089
3090 enum ieee80211_statuscode {
3091 WLAN_STATUS_SUCCESS = 0,
3092 WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
3093 WLAN_STATUS_CAPS_UNSUPPORTED = 10,
3094 WLAN_STATUS_REASSOC_NO_ASSOC = 11,
3095 WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
3096 WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
3097 WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
3098 WLAN_STATUS_CHALLENGE_FAIL = 15,
3099 WLAN_STATUS_AUTH_TIMEOUT = 16,
3100 WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
3101 WLAN_STATUS_ASSOC_DENIED_RATES = 18,
3102
3103 WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
3104 WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
3105 WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
3106
3107 WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
3108 WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
3109 WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
3110
3111 WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
3112 WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
3113
3114 WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY = 30,
3115 WLAN_STATUS_ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31,
3116
3117 WLAN_STATUS_INVALID_IE = 40,
3118 WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
3119 WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
3120 WLAN_STATUS_INVALID_AKMP = 43,
3121 WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
3122 WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
3123 WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
3124
3125 WLAN_STATUS_UNSPECIFIED_QOS = 32,
3126 WLAN_STATUS_ASSOC_DENIED_NOBANDWIDTH = 33,
3127 WLAN_STATUS_ASSOC_DENIED_LOWACK = 34,
3128 WLAN_STATUS_ASSOC_DENIED_UNSUPP_QOS = 35,
3129 WLAN_STATUS_REQUEST_DECLINED = 37,
3130 WLAN_STATUS_INVALID_QOS_PARAM = 38,
3131 WLAN_STATUS_CHANGE_TSPEC = 39,
3132 WLAN_STATUS_WAIT_TS_DELAY = 47,
3133 WLAN_STATUS_NO_DIRECT_LINK = 48,
3134 WLAN_STATUS_STA_NOT_PRESENT = 49,
3135 WLAN_STATUS_STA_NOT_QSTA = 50,
3136
3137 WLAN_STATUS_ANTI_CLOG_REQUIRED = 76,
3138 WLAN_STATUS_FCG_NOT_SUPP = 78,
3139 WLAN_STATUS_STA_NO_TBTT = 78,
3140
3141 WLAN_STATUS_REJECTED_WITH_SUGGESTED_CHANGES = 39,
3142 WLAN_STATUS_REJECTED_FOR_DELAY_PERIOD = 47,
3143 WLAN_STATUS_REJECT_WITH_SCHEDULE = 83,
3144 WLAN_STATUS_PENDING_ADMITTING_FST_SESSION = 86,
3145 WLAN_STATUS_PERFORMING_FST_NOW = 87,
3146 WLAN_STATUS_PENDING_GAP_IN_BA_WINDOW = 88,
3147 WLAN_STATUS_REJECT_U_PID_SETTING = 89,
3148 WLAN_STATUS_REJECT_DSE_BAND = 96,
3149 WLAN_STATUS_DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL = 99,
3150 WLAN_STATUS_DENIED_DUE_TO_SPECTRUM_MANAGEMENT = 103,
3151
3152 WLAN_STATUS_FILS_AUTHENTICATION_FAILURE = 108,
3153 WLAN_STATUS_UNKNOWN_AUTHENTICATION_SERVER = 109,
3154 WLAN_STATUS_SAE_HASH_TO_ELEMENT = 126,
3155 WLAN_STATUS_SAE_PK = 127,
3156 };
3157
3158
3159
3160 enum ieee80211_reasoncode {
3161 WLAN_REASON_UNSPECIFIED = 1,
3162 WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
3163 WLAN_REASON_DEAUTH_LEAVING = 3,
3164 WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
3165 WLAN_REASON_DISASSOC_AP_BUSY = 5,
3166 WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
3167 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
3168 WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
3169 WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
3170
3171 WLAN_REASON_DISASSOC_BAD_POWER = 10,
3172 WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
3173
3174 WLAN_REASON_INVALID_IE = 13,
3175 WLAN_REASON_MIC_FAILURE = 14,
3176 WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
3177 WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
3178 WLAN_REASON_IE_DIFFERENT = 17,
3179 WLAN_REASON_INVALID_GROUP_CIPHER = 18,
3180 WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
3181 WLAN_REASON_INVALID_AKMP = 20,
3182 WLAN_REASON_UNSUPP_RSN_VERSION = 21,
3183 WLAN_REASON_INVALID_RSN_IE_CAP = 22,
3184 WLAN_REASON_IEEE8021X_FAILED = 23,
3185 WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
3186
3187 WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE = 25,
3188 WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED = 26,
3189
3190 WLAN_REASON_DISASSOC_UNSPECIFIED_QOS = 32,
3191 WLAN_REASON_DISASSOC_QAP_NO_BANDWIDTH = 33,
3192 WLAN_REASON_DISASSOC_LOW_ACK = 34,
3193 WLAN_REASON_DISASSOC_QAP_EXCEED_TXOP = 35,
3194 WLAN_REASON_QSTA_LEAVE_QBSS = 36,
3195 WLAN_REASON_QSTA_NOT_USE = 37,
3196 WLAN_REASON_QSTA_REQUIRE_SETUP = 38,
3197 WLAN_REASON_QSTA_TIMEOUT = 39,
3198 WLAN_REASON_QSTA_CIPHER_NOT_SUPP = 45,
3199
3200 WLAN_REASON_MESH_PEER_CANCELED = 52,
3201 WLAN_REASON_MESH_MAX_PEERS = 53,
3202 WLAN_REASON_MESH_CONFIG = 54,
3203 WLAN_REASON_MESH_CLOSE = 55,
3204 WLAN_REASON_MESH_MAX_RETRIES = 56,
3205 WLAN_REASON_MESH_CONFIRM_TIMEOUT = 57,
3206 WLAN_REASON_MESH_INVALID_GTK = 58,
3207 WLAN_REASON_MESH_INCONSISTENT_PARAM = 59,
3208 WLAN_REASON_MESH_INVALID_SECURITY = 60,
3209 WLAN_REASON_MESH_PATH_ERROR = 61,
3210 WLAN_REASON_MESH_PATH_NOFORWARD = 62,
3211 WLAN_REASON_MESH_PATH_DEST_UNREACHABLE = 63,
3212 WLAN_REASON_MAC_EXISTS_IN_MBSS = 64,
3213 WLAN_REASON_MESH_CHAN_REGULATORY = 65,
3214 WLAN_REASON_MESH_CHAN = 66,
3215 };
3216
3217
3218
3219 enum ieee80211_eid {
3220 WLAN_EID_SSID = 0,
3221 WLAN_EID_SUPP_RATES = 1,
3222 WLAN_EID_FH_PARAMS = 2,
3223 WLAN_EID_DS_PARAMS = 3,
3224 WLAN_EID_CF_PARAMS = 4,
3225 WLAN_EID_TIM = 5,
3226 WLAN_EID_IBSS_PARAMS = 6,
3227 WLAN_EID_COUNTRY = 7,
3228
3229 WLAN_EID_REQUEST = 10,
3230 WLAN_EID_QBSS_LOAD = 11,
3231 WLAN_EID_EDCA_PARAM_SET = 12,
3232 WLAN_EID_TSPEC = 13,
3233 WLAN_EID_TCLAS = 14,
3234 WLAN_EID_SCHEDULE = 15,
3235 WLAN_EID_CHALLENGE = 16,
3236
3237 WLAN_EID_PWR_CONSTRAINT = 32,
3238 WLAN_EID_PWR_CAPABILITY = 33,
3239 WLAN_EID_TPC_REQUEST = 34,
3240 WLAN_EID_TPC_REPORT = 35,
3241 WLAN_EID_SUPPORTED_CHANNELS = 36,
3242 WLAN_EID_CHANNEL_SWITCH = 37,
3243 WLAN_EID_MEASURE_REQUEST = 38,
3244 WLAN_EID_MEASURE_REPORT = 39,
3245 WLAN_EID_QUIET = 40,
3246 WLAN_EID_IBSS_DFS = 41,
3247 WLAN_EID_ERP_INFO = 42,
3248 WLAN_EID_TS_DELAY = 43,
3249 WLAN_EID_TCLAS_PROCESSING = 44,
3250 WLAN_EID_HT_CAPABILITY = 45,
3251 WLAN_EID_QOS_CAPA = 46,
3252
3253 WLAN_EID_RSN = 48,
3254 WLAN_EID_802_15_COEX = 49,
3255 WLAN_EID_EXT_SUPP_RATES = 50,
3256 WLAN_EID_AP_CHAN_REPORT = 51,
3257 WLAN_EID_NEIGHBOR_REPORT = 52,
3258 WLAN_EID_RCPI = 53,
3259 WLAN_EID_MOBILITY_DOMAIN = 54,
3260 WLAN_EID_FAST_BSS_TRANSITION = 55,
3261 WLAN_EID_TIMEOUT_INTERVAL = 56,
3262 WLAN_EID_RIC_DATA = 57,
3263 WLAN_EID_DSE_REGISTERED_LOCATION = 58,
3264 WLAN_EID_SUPPORTED_REGULATORY_CLASSES = 59,
3265 WLAN_EID_EXT_CHANSWITCH_ANN = 60,
3266 WLAN_EID_HT_OPERATION = 61,
3267 WLAN_EID_SECONDARY_CHANNEL_OFFSET = 62,
3268 WLAN_EID_BSS_AVG_ACCESS_DELAY = 63,
3269 WLAN_EID_ANTENNA_INFO = 64,
3270 WLAN_EID_RSNI = 65,
3271 WLAN_EID_MEASUREMENT_PILOT_TX_INFO = 66,
3272 WLAN_EID_BSS_AVAILABLE_CAPACITY = 67,
3273 WLAN_EID_BSS_AC_ACCESS_DELAY = 68,
3274 WLAN_EID_TIME_ADVERTISEMENT = 69,
3275 WLAN_EID_RRM_ENABLED_CAPABILITIES = 70,
3276 WLAN_EID_MULTIPLE_BSSID = 71,
3277 WLAN_EID_BSS_COEX_2040 = 72,
3278 WLAN_EID_BSS_INTOLERANT_CHL_REPORT = 73,
3279 WLAN_EID_OVERLAP_BSS_SCAN_PARAM = 74,
3280 WLAN_EID_RIC_DESCRIPTOR = 75,
3281 WLAN_EID_MMIE = 76,
3282 WLAN_EID_ASSOC_COMEBACK_TIME = 77,
3283 WLAN_EID_EVENT_REQUEST = 78,
3284 WLAN_EID_EVENT_REPORT = 79,
3285 WLAN_EID_DIAGNOSTIC_REQUEST = 80,
3286 WLAN_EID_DIAGNOSTIC_REPORT = 81,
3287 WLAN_EID_LOCATION_PARAMS = 82,
3288 WLAN_EID_NON_TX_BSSID_CAP = 83,
3289 WLAN_EID_SSID_LIST = 84,
3290 WLAN_EID_MULTI_BSSID_IDX = 85,
3291 WLAN_EID_FMS_DESCRIPTOR = 86,
3292 WLAN_EID_FMS_REQUEST = 87,
3293 WLAN_EID_FMS_RESPONSE = 88,
3294 WLAN_EID_QOS_TRAFFIC_CAPA = 89,
3295 WLAN_EID_BSS_MAX_IDLE_PERIOD = 90,
3296 WLAN_EID_TSF_REQUEST = 91,
3297 WLAN_EID_TSF_RESPOSNE = 92,
3298 WLAN_EID_WNM_SLEEP_MODE = 93,
3299 WLAN_EID_TIM_BCAST_REQ = 94,
3300 WLAN_EID_TIM_BCAST_RESP = 95,
3301 WLAN_EID_COLL_IF_REPORT = 96,
3302 WLAN_EID_CHANNEL_USAGE = 97,
3303 WLAN_EID_TIME_ZONE = 98,
3304 WLAN_EID_DMS_REQUEST = 99,
3305 WLAN_EID_DMS_RESPONSE = 100,
3306 WLAN_EID_LINK_ID = 101,
3307 WLAN_EID_WAKEUP_SCHEDUL = 102,
3308
3309 WLAN_EID_CHAN_SWITCH_TIMING = 104,
3310 WLAN_EID_PTI_CONTROL = 105,
3311 WLAN_EID_PU_BUFFER_STATUS = 106,
3312 WLAN_EID_INTERWORKING = 107,
3313 WLAN_EID_ADVERTISEMENT_PROTOCOL = 108,
3314 WLAN_EID_EXPEDITED_BW_REQ = 109,
3315 WLAN_EID_QOS_MAP_SET = 110,
3316 WLAN_EID_ROAMING_CONSORTIUM = 111,
3317 WLAN_EID_EMERGENCY_ALERT = 112,
3318 WLAN_EID_MESH_CONFIG = 113,
3319 WLAN_EID_MESH_ID = 114,
3320 WLAN_EID_LINK_METRIC_REPORT = 115,
3321 WLAN_EID_CONGESTION_NOTIFICATION = 116,
3322 WLAN_EID_PEER_MGMT = 117,
3323 WLAN_EID_CHAN_SWITCH_PARAM = 118,
3324 WLAN_EID_MESH_AWAKE_WINDOW = 119,
3325 WLAN_EID_BEACON_TIMING = 120,
3326 WLAN_EID_MCCAOP_SETUP_REQ = 121,
3327 WLAN_EID_MCCAOP_SETUP_RESP = 122,
3328 WLAN_EID_MCCAOP_ADVERT = 123,
3329 WLAN_EID_MCCAOP_TEARDOWN = 124,
3330 WLAN_EID_GANN = 125,
3331 WLAN_EID_RANN = 126,
3332 WLAN_EID_EXT_CAPABILITY = 127,
3333
3334 WLAN_EID_PREQ = 130,
3335 WLAN_EID_PREP = 131,
3336 WLAN_EID_PERR = 132,
3337
3338 WLAN_EID_PXU = 137,
3339 WLAN_EID_PXUC = 138,
3340 WLAN_EID_AUTH_MESH_PEER_EXCH = 139,
3341 WLAN_EID_MIC = 140,
3342 WLAN_EID_DESTINATION_URI = 141,
3343 WLAN_EID_UAPSD_COEX = 142,
3344 WLAN_EID_WAKEUP_SCHEDULE = 143,
3345 WLAN_EID_EXT_SCHEDULE = 144,
3346 WLAN_EID_STA_AVAILABILITY = 145,
3347 WLAN_EID_DMG_TSPEC = 146,
3348 WLAN_EID_DMG_AT = 147,
3349 WLAN_EID_DMG_CAP = 148,
3350
3351 WLAN_EID_CISCO_VENDOR_SPECIFIC = 150,
3352 WLAN_EID_DMG_OPERATION = 151,
3353 WLAN_EID_DMG_BSS_PARAM_CHANGE = 152,
3354 WLAN_EID_DMG_BEAM_REFINEMENT = 153,
3355 WLAN_EID_CHANNEL_MEASURE_FEEDBACK = 154,
3356
3357 WLAN_EID_AWAKE_WINDOW = 157,
3358 WLAN_EID_MULTI_BAND = 158,
3359 WLAN_EID_ADDBA_EXT = 159,
3360 WLAN_EID_NEXT_PCP_LIST = 160,
3361 WLAN_EID_PCP_HANDOVER = 161,
3362 WLAN_EID_DMG_LINK_MARGIN = 162,
3363 WLAN_EID_SWITCHING_STREAM = 163,
3364 WLAN_EID_SESSION_TRANSITION = 164,
3365 WLAN_EID_DYN_TONE_PAIRING_REPORT = 165,
3366 WLAN_EID_CLUSTER_REPORT = 166,
3367 WLAN_EID_RELAY_CAP = 167,
3368 WLAN_EID_RELAY_XFER_PARAM_SET = 168,
3369 WLAN_EID_BEAM_LINK_MAINT = 169,
3370 WLAN_EID_MULTIPLE_MAC_ADDR = 170,
3371 WLAN_EID_U_PID = 171,
3372 WLAN_EID_DMG_LINK_ADAPT_ACK = 172,
3373
3374 WLAN_EID_MCCAOP_ADV_OVERVIEW = 174,
3375 WLAN_EID_QUIET_PERIOD_REQ = 175,
3376
3377 WLAN_EID_QUIET_PERIOD_RESP = 177,
3378
3379
3380 WLAN_EID_EPAC_POLICY = 182,
3381 WLAN_EID_CLISTER_TIME_OFF = 183,
3382 WLAN_EID_INTER_AC_PRIO = 184,
3383 WLAN_EID_SCS_DESCRIPTOR = 185,
3384 WLAN_EID_QLOAD_REPORT = 186,
3385 WLAN_EID_HCCA_TXOP_UPDATE_COUNT = 187,
3386 WLAN_EID_HL_STREAM_ID = 188,
3387 WLAN_EID_GCR_GROUP_ADDR = 189,
3388 WLAN_EID_ANTENNA_SECTOR_ID_PATTERN = 190,
3389 WLAN_EID_VHT_CAPABILITY = 191,
3390 WLAN_EID_VHT_OPERATION = 192,
3391 WLAN_EID_EXTENDED_BSS_LOAD = 193,
3392 WLAN_EID_WIDE_BW_CHANNEL_SWITCH = 194,
3393 WLAN_EID_TX_POWER_ENVELOPE = 195,
3394 WLAN_EID_CHANNEL_SWITCH_WRAPPER = 196,
3395 WLAN_EID_AID = 197,
3396 WLAN_EID_QUIET_CHANNEL = 198,
3397 WLAN_EID_OPMODE_NOTIF = 199,
3398
3399 WLAN_EID_REDUCED_NEIGHBOR_REPORT = 201,
3400
3401 WLAN_EID_AID_REQUEST = 210,
3402 WLAN_EID_AID_RESPONSE = 211,
3403 WLAN_EID_S1G_BCN_COMPAT = 213,
3404 WLAN_EID_S1G_SHORT_BCN_INTERVAL = 214,
3405 WLAN_EID_S1G_TWT = 216,
3406 WLAN_EID_S1G_CAPABILITIES = 217,
3407 WLAN_EID_VENDOR_SPECIFIC = 221,
3408 WLAN_EID_QOS_PARAMETER = 222,
3409 WLAN_EID_S1G_OPERATION = 232,
3410 WLAN_EID_CAG_NUMBER = 237,
3411 WLAN_EID_AP_CSN = 239,
3412 WLAN_EID_FILS_INDICATION = 240,
3413 WLAN_EID_DILS = 241,
3414 WLAN_EID_FRAGMENT = 242,
3415 WLAN_EID_RSNX = 244,
3416 WLAN_EID_EXTENSION = 255
3417 };
3418
3419
3420 enum ieee80211_eid_ext {
3421 WLAN_EID_EXT_ASSOC_DELAY_INFO = 1,
3422 WLAN_EID_EXT_FILS_REQ_PARAMS = 2,
3423 WLAN_EID_EXT_FILS_KEY_CONFIRM = 3,
3424 WLAN_EID_EXT_FILS_SESSION = 4,
3425 WLAN_EID_EXT_FILS_HLP_CONTAINER = 5,
3426 WLAN_EID_EXT_FILS_IP_ADDR_ASSIGN = 6,
3427 WLAN_EID_EXT_KEY_DELIVERY = 7,
3428 WLAN_EID_EXT_FILS_WRAPPED_DATA = 8,
3429 WLAN_EID_EXT_FILS_PUBLIC_KEY = 12,
3430 WLAN_EID_EXT_FILS_NONCE = 13,
3431 WLAN_EID_EXT_FUTURE_CHAN_GUIDANCE = 14,
3432 WLAN_EID_EXT_HE_CAPABILITY = 35,
3433 WLAN_EID_EXT_HE_OPERATION = 36,
3434 WLAN_EID_EXT_UORA = 37,
3435 WLAN_EID_EXT_HE_MU_EDCA = 38,
3436 WLAN_EID_EXT_HE_SPR = 39,
3437 WLAN_EID_EXT_NDP_FEEDBACK_REPORT_PARAMSET = 41,
3438 WLAN_EID_EXT_BSS_COLOR_CHG_ANN = 42,
3439 WLAN_EID_EXT_QUIET_TIME_PERIOD_SETUP = 43,
3440 WLAN_EID_EXT_ESS_REPORT = 45,
3441 WLAN_EID_EXT_OPS = 46,
3442 WLAN_EID_EXT_HE_BSS_LOAD = 47,
3443 WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME = 52,
3444 WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55,
3445 WLAN_EID_EXT_NON_INHERITANCE = 56,
3446 WLAN_EID_EXT_KNOWN_BSSID = 57,
3447 WLAN_EID_EXT_SHORT_SSID_LIST = 58,
3448 WLAN_EID_EXT_HE_6GHZ_CAPA = 59,
3449 WLAN_EID_EXT_UL_MU_POWER_CAPA = 60,
3450 WLAN_EID_EXT_EHT_OPERATION = 106,
3451 WLAN_EID_EXT_EHT_MULTI_LINK = 107,
3452 WLAN_EID_EXT_EHT_CAPABILITY = 108,
3453 };
3454
3455
3456 enum ieee80211_category {
3457 WLAN_CATEGORY_SPECTRUM_MGMT = 0,
3458 WLAN_CATEGORY_QOS = 1,
3459 WLAN_CATEGORY_DLS = 2,
3460 WLAN_CATEGORY_BACK = 3,
3461 WLAN_CATEGORY_PUBLIC = 4,
3462 WLAN_CATEGORY_RADIO_MEASUREMENT = 5,
3463 WLAN_CATEGORY_FAST_BBS_TRANSITION = 6,
3464 WLAN_CATEGORY_HT = 7,
3465 WLAN_CATEGORY_SA_QUERY = 8,
3466 WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9,
3467 WLAN_CATEGORY_WNM = 10,
3468 WLAN_CATEGORY_WNM_UNPROTECTED = 11,
3469 WLAN_CATEGORY_TDLS = 12,
3470 WLAN_CATEGORY_MESH_ACTION = 13,
3471 WLAN_CATEGORY_MULTIHOP_ACTION = 14,
3472 WLAN_CATEGORY_SELF_PROTECTED = 15,
3473 WLAN_CATEGORY_DMG = 16,
3474 WLAN_CATEGORY_WMM = 17,
3475 WLAN_CATEGORY_FST = 18,
3476 WLAN_CATEGORY_UNPROT_DMG = 20,
3477 WLAN_CATEGORY_VHT = 21,
3478 WLAN_CATEGORY_S1G = 22,
3479 WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126,
3480 WLAN_CATEGORY_VENDOR_SPECIFIC = 127,
3481 };
3482
3483
3484 enum ieee80211_spectrum_mgmt_actioncode {
3485 WLAN_ACTION_SPCT_MSR_REQ = 0,
3486 WLAN_ACTION_SPCT_MSR_RPRT = 1,
3487 WLAN_ACTION_SPCT_TPC_REQ = 2,
3488 WLAN_ACTION_SPCT_TPC_RPRT = 3,
3489 WLAN_ACTION_SPCT_CHL_SWITCH = 4,
3490 };
3491
3492
3493 enum ieee80211_ht_actioncode {
3494 WLAN_HT_ACTION_NOTIFY_CHANWIDTH = 0,
3495 WLAN_HT_ACTION_SMPS = 1,
3496 WLAN_HT_ACTION_PSMP = 2,
3497 WLAN_HT_ACTION_PCO_PHASE = 3,
3498 WLAN_HT_ACTION_CSI = 4,
3499 WLAN_HT_ACTION_NONCOMPRESSED_BF = 5,
3500 WLAN_HT_ACTION_COMPRESSED_BF = 6,
3501 WLAN_HT_ACTION_ASEL_IDX_FEEDBACK = 7,
3502 };
3503
3504
3505 enum ieee80211_vht_actioncode {
3506 WLAN_VHT_ACTION_COMPRESSED_BF = 0,
3507 WLAN_VHT_ACTION_GROUPID_MGMT = 1,
3508 WLAN_VHT_ACTION_OPMODE_NOTIF = 2,
3509 };
3510
3511
3512 enum ieee80211_self_protected_actioncode {
3513 WLAN_SP_RESERVED = 0,
3514 WLAN_SP_MESH_PEERING_OPEN = 1,
3515 WLAN_SP_MESH_PEERING_CONFIRM = 2,
3516 WLAN_SP_MESH_PEERING_CLOSE = 3,
3517 WLAN_SP_MGK_INFORM = 4,
3518 WLAN_SP_MGK_ACK = 5,
3519 };
3520
3521
3522 enum ieee80211_mesh_actioncode {
3523 WLAN_MESH_ACTION_LINK_METRIC_REPORT,
3524 WLAN_MESH_ACTION_HWMP_PATH_SELECTION,
3525 WLAN_MESH_ACTION_GATE_ANNOUNCEMENT,
3526 WLAN_MESH_ACTION_CONGESTION_CONTROL_NOTIFICATION,
3527 WLAN_MESH_ACTION_MCCA_SETUP_REQUEST,
3528 WLAN_MESH_ACTION_MCCA_SETUP_REPLY,
3529 WLAN_MESH_ACTION_MCCA_ADVERTISEMENT_REQUEST,
3530 WLAN_MESH_ACTION_MCCA_ADVERTISEMENT,
3531 WLAN_MESH_ACTION_MCCA_TEARDOWN,
3532 WLAN_MESH_ACTION_TBTT_ADJUSTMENT_REQUEST,
3533 WLAN_MESH_ACTION_TBTT_ADJUSTMENT_RESPONSE,
3534 };
3535
3536
3537 enum ieee80211_unprotected_wnm_actioncode {
3538 WLAN_UNPROTECTED_WNM_ACTION_TIM = 0,
3539 WLAN_UNPROTECTED_WNM_ACTION_TIMING_MEASUREMENT_RESPONSE = 1,
3540 };
3541
3542
3543 enum ieee80211_public_actioncode {
3544 WLAN_PUBLIC_ACTION_FTM_RESPONSE = 33,
3545 };
3546
3547
3548 enum ieee80211_key_len {
3549 WLAN_KEY_LEN_WEP40 = 5,
3550 WLAN_KEY_LEN_WEP104 = 13,
3551 WLAN_KEY_LEN_CCMP = 16,
3552 WLAN_KEY_LEN_CCMP_256 = 32,
3553 WLAN_KEY_LEN_TKIP = 32,
3554 WLAN_KEY_LEN_AES_CMAC = 16,
3555 WLAN_KEY_LEN_SMS4 = 32,
3556 WLAN_KEY_LEN_GCMP = 16,
3557 WLAN_KEY_LEN_GCMP_256 = 32,
3558 WLAN_KEY_LEN_BIP_CMAC_256 = 32,
3559 WLAN_KEY_LEN_BIP_GMAC_128 = 16,
3560 WLAN_KEY_LEN_BIP_GMAC_256 = 32,
3561 };
3562
3563 enum ieee80211_s1g_actioncode {
3564 WLAN_S1G_AID_SWITCH_REQUEST,
3565 WLAN_S1G_AID_SWITCH_RESPONSE,
3566 WLAN_S1G_SYNC_CONTROL,
3567 WLAN_S1G_STA_INFO_ANNOUNCE,
3568 WLAN_S1G_EDCA_PARAM_SET,
3569 WLAN_S1G_EL_OPERATION,
3570 WLAN_S1G_TWT_SETUP,
3571 WLAN_S1G_TWT_TEARDOWN,
3572 WLAN_S1G_SECT_GROUP_ID_LIST,
3573 WLAN_S1G_SECT_ID_FEEDBACK,
3574 WLAN_S1G_TWT_INFORMATION = 11,
3575 };
3576
3577 #define IEEE80211_WEP_IV_LEN 4
3578 #define IEEE80211_WEP_ICV_LEN 4
3579 #define IEEE80211_CCMP_HDR_LEN 8
3580 #define IEEE80211_CCMP_MIC_LEN 8
3581 #define IEEE80211_CCMP_PN_LEN 6
3582 #define IEEE80211_CCMP_256_HDR_LEN 8
3583 #define IEEE80211_CCMP_256_MIC_LEN 16
3584 #define IEEE80211_CCMP_256_PN_LEN 6
3585 #define IEEE80211_TKIP_IV_LEN 8
3586 #define IEEE80211_TKIP_ICV_LEN 4
3587 #define IEEE80211_CMAC_PN_LEN 6
3588 #define IEEE80211_GMAC_PN_LEN 6
3589 #define IEEE80211_GCMP_HDR_LEN 8
3590 #define IEEE80211_GCMP_MIC_LEN 16
3591 #define IEEE80211_GCMP_PN_LEN 6
3592
3593 #define FILS_NONCE_LEN 16
3594 #define FILS_MAX_KEK_LEN 64
3595
3596 #define FILS_ERP_MAX_USERNAME_LEN 16
3597 #define FILS_ERP_MAX_REALM_LEN 253
3598 #define FILS_ERP_MAX_RRK_LEN 64
3599
3600 #define PMK_MAX_LEN 64
3601 #define SAE_PASSWORD_MAX_LEN 128
3602
3603
3604 enum ieee80211_pub_actioncode {
3605 WLAN_PUB_ACTION_20_40_BSS_COEX = 0,
3606 WLAN_PUB_ACTION_DSE_ENABLEMENT = 1,
3607 WLAN_PUB_ACTION_DSE_DEENABLEMENT = 2,
3608 WLAN_PUB_ACTION_DSE_REG_LOC_ANN = 3,
3609 WLAN_PUB_ACTION_EXT_CHANSW_ANN = 4,
3610 WLAN_PUB_ACTION_DSE_MSMT_REQ = 5,
3611 WLAN_PUB_ACTION_DSE_MSMT_RESP = 6,
3612 WLAN_PUB_ACTION_MSMT_PILOT = 7,
3613 WLAN_PUB_ACTION_DSE_PC = 8,
3614 WLAN_PUB_ACTION_VENDOR_SPECIFIC = 9,
3615 WLAN_PUB_ACTION_GAS_INITIAL_REQ = 10,
3616 WLAN_PUB_ACTION_GAS_INITIAL_RESP = 11,
3617 WLAN_PUB_ACTION_GAS_COMEBACK_REQ = 12,
3618 WLAN_PUB_ACTION_GAS_COMEBACK_RESP = 13,
3619 WLAN_PUB_ACTION_TDLS_DISCOVER_RES = 14,
3620 WLAN_PUB_ACTION_LOC_TRACK_NOTI = 15,
3621 WLAN_PUB_ACTION_QAB_REQUEST_FRAME = 16,
3622 WLAN_PUB_ACTION_QAB_RESPONSE_FRAME = 17,
3623 WLAN_PUB_ACTION_QMF_POLICY = 18,
3624 WLAN_PUB_ACTION_QMF_POLICY_CHANGE = 19,
3625 WLAN_PUB_ACTION_QLOAD_REQUEST = 20,
3626 WLAN_PUB_ACTION_QLOAD_REPORT = 21,
3627 WLAN_PUB_ACTION_HCCA_TXOP_ADVERT = 22,
3628 WLAN_PUB_ACTION_HCCA_TXOP_RESPONSE = 23,
3629 WLAN_PUB_ACTION_PUBLIC_KEY = 24,
3630 WLAN_PUB_ACTION_CHANNEL_AVAIL_QUERY = 25,
3631 WLAN_PUB_ACTION_CHANNEL_SCHEDULE_MGMT = 26,
3632 WLAN_PUB_ACTION_CONTACT_VERI_SIGNAL = 27,
3633 WLAN_PUB_ACTION_GDD_ENABLEMENT_REQ = 28,
3634 WLAN_PUB_ACTION_GDD_ENABLEMENT_RESP = 29,
3635 WLAN_PUB_ACTION_NETWORK_CHANNEL_CONTROL = 30,
3636 WLAN_PUB_ACTION_WHITE_SPACE_MAP_ANN = 31,
3637 WLAN_PUB_ACTION_FTM_REQUEST = 32,
3638 WLAN_PUB_ACTION_FTM = 33,
3639 WLAN_PUB_ACTION_FILS_DISCOVERY = 34,
3640 };
3641
3642
3643 enum ieee80211_tdls_actioncode {
3644 WLAN_TDLS_SETUP_REQUEST = 0,
3645 WLAN_TDLS_SETUP_RESPONSE = 1,
3646 WLAN_TDLS_SETUP_CONFIRM = 2,
3647 WLAN_TDLS_TEARDOWN = 3,
3648 WLAN_TDLS_PEER_TRAFFIC_INDICATION = 4,
3649 WLAN_TDLS_CHANNEL_SWITCH_REQUEST = 5,
3650 WLAN_TDLS_CHANNEL_SWITCH_RESPONSE = 6,
3651 WLAN_TDLS_PEER_PSM_REQUEST = 7,
3652 WLAN_TDLS_PEER_PSM_RESPONSE = 8,
3653 WLAN_TDLS_PEER_TRAFFIC_RESPONSE = 9,
3654 WLAN_TDLS_DISCOVERY_REQUEST = 10,
3655 };
3656
3657
3658
3659
3660 #define WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING BIT(2)
3661
3662
3663
3664
3665 #define WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT BIT(6)
3666
3667
3668
3669
3670 #define WLAN_EXT_CAPA3_TIMING_MEASUREMENT_SUPPORT BIT(7)
3671
3672
3673 #define WLAN_EXT_CAPA4_TDLS_BUFFER_STA BIT(4)
3674 #define WLAN_EXT_CAPA4_TDLS_PEER_PSM BIT(5)
3675 #define WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH BIT(6)
3676
3677
3678
3679
3680 #define WLAN_EXT_CAPA4_INTERWORKING_ENABLED BIT(7)
3681
3682
3683
3684
3685
3686 #define WLAN_EXT_CAPA5_TDLS_ENABLED BIT(5)
3687 #define WLAN_EXT_CAPA5_TDLS_PROHIBITED BIT(6)
3688 #define WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED BIT(7)
3689
3690 #define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED BIT(5)
3691 #define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(6)
3692
3693
3694 #define WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB BIT(7)
3695 #define WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB BIT(0)
3696
3697
3698
3699
3700
3701 #define WLAN_EXT_CAPA9_FTM_INITIATOR BIT(7)
3702
3703
3704 #define WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT BIT(5)
3705 #define WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT BIT(6)
3706
3707
3708
3709
3710
3711
3712 #define WLAN_EXT_CAPA10_OBSS_NARROW_BW_RU_TOLERANCE_SUPPORT BIT(7)
3713
3714
3715 #define WLAN_EXT_CAPA11_EMA_SUPPORT BIT(3)
3716
3717
3718 #define WLAN_TDLS_SNAP_RFTYPE 0x2
3719
3720
3721 #define WLAN_BSS_COEX_INFORMATION_REQUEST BIT(0)
3722
3723
3724
3725
3726
3727
3728
3729
3730 enum ieee80211_mesh_sync_method {
3731 IEEE80211_SYNC_METHOD_NEIGHBOR_OFFSET = 1,
3732 IEEE80211_SYNC_METHOD_VENDOR = 255,
3733 };
3734
3735
3736
3737
3738
3739
3740
3741
3742 enum ieee80211_mesh_path_protocol {
3743 IEEE80211_PATH_PROTOCOL_HWMP = 1,
3744 IEEE80211_PATH_PROTOCOL_VENDOR = 255,
3745 };
3746
3747
3748
3749
3750
3751
3752
3753
3754 enum ieee80211_mesh_path_metric {
3755 IEEE80211_PATH_METRIC_AIRTIME = 1,
3756 IEEE80211_PATH_METRIC_VENDOR = 255,
3757 };
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774 enum ieee80211_root_mode_identifier {
3775 IEEE80211_ROOTMODE_NO_ROOT = 0,
3776 IEEE80211_ROOTMODE_ROOT = 1,
3777 IEEE80211_PROACTIVE_PREQ_NO_PREP = 2,
3778 IEEE80211_PROACTIVE_PREQ_WITH_PREP = 3,
3779 IEEE80211_PROACTIVE_RANN = 4,
3780 };
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790 #define IEEE80211_COUNTRY_IE_MIN_LEN 6
3791
3792
3793 #define IEEE80211_COUNTRY_STRING_LEN 3
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818 #define IEEE80211_COUNTRY_EXTENSION_ID 201
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832 struct ieee80211_country_ie_triplet {
3833 union {
3834 struct {
3835 u8 first_channel;
3836 u8 num_channels;
3837 s8 max_power;
3838 } __packed chans;
3839 struct {
3840 u8 reg_extension_id;
3841 u8 reg_class;
3842 u8 coverage_class;
3843 } __packed ext;
3844 };
3845 } __packed;
3846
3847 enum ieee80211_timeout_interval_type {
3848 WLAN_TIMEOUT_REASSOC_DEADLINE = 1 ,
3849 WLAN_TIMEOUT_KEY_LIFETIME = 2 ,
3850 WLAN_TIMEOUT_ASSOC_COMEBACK = 3 ,
3851 };
3852
3853
3854
3855
3856
3857
3858 struct ieee80211_timeout_interval_ie {
3859 u8 type;
3860 __le32 value;
3861 } __packed;
3862
3863
3864
3865
3866
3867
3868
3869 enum ieee80211_idle_options {
3870 WLAN_IDLE_OPTIONS_PROTECTED_KEEP_ALIVE = BIT(0),
3871 };
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884 struct ieee80211_bss_max_idle_period_ie {
3885 __le16 max_idle_period;
3886 u8 idle_options;
3887 } __packed;
3888
3889
3890 enum ieee80211_back_actioncode {
3891 WLAN_ACTION_ADDBA_REQ = 0,
3892 WLAN_ACTION_ADDBA_RESP = 1,
3893 WLAN_ACTION_DELBA = 2,
3894 };
3895
3896
3897 enum ieee80211_back_parties {
3898 WLAN_BACK_RECIPIENT = 0,
3899 WLAN_BACK_INITIATOR = 1,
3900 };
3901
3902
3903 enum ieee80211_sa_query_action {
3904 WLAN_ACTION_SA_QUERY_REQUEST = 0,
3905 WLAN_ACTION_SA_QUERY_RESPONSE = 1,
3906 };
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917 struct ieee80211_bssid_index {
3918 u8 bssid_index;
3919 u8 dtim_period;
3920 u8 dtim_count;
3921 };
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932 struct ieee80211_multiple_bssid_configuration {
3933 u8 bssid_count;
3934 u8 profile_periodicity;
3935 };
3936
3937 #define SUITE(oui, id) (((oui) << 8) | (id))
3938
3939
3940 #define WLAN_CIPHER_SUITE_USE_GROUP SUITE(0x000FAC, 0)
3941 #define WLAN_CIPHER_SUITE_WEP40 SUITE(0x000FAC, 1)
3942 #define WLAN_CIPHER_SUITE_TKIP SUITE(0x000FAC, 2)
3943
3944 #define WLAN_CIPHER_SUITE_CCMP SUITE(0x000FAC, 4)
3945 #define WLAN_CIPHER_SUITE_WEP104 SUITE(0x000FAC, 5)
3946 #define WLAN_CIPHER_SUITE_AES_CMAC SUITE(0x000FAC, 6)
3947 #define WLAN_CIPHER_SUITE_GCMP SUITE(0x000FAC, 8)
3948 #define WLAN_CIPHER_SUITE_GCMP_256 SUITE(0x000FAC, 9)
3949 #define WLAN_CIPHER_SUITE_CCMP_256 SUITE(0x000FAC, 10)
3950 #define WLAN_CIPHER_SUITE_BIP_GMAC_128 SUITE(0x000FAC, 11)
3951 #define WLAN_CIPHER_SUITE_BIP_GMAC_256 SUITE(0x000FAC, 12)
3952 #define WLAN_CIPHER_SUITE_BIP_CMAC_256 SUITE(0x000FAC, 13)
3953
3954 #define WLAN_CIPHER_SUITE_SMS4 SUITE(0x001472, 1)
3955
3956
3957 #define WLAN_AKM_SUITE_8021X SUITE(0x000FAC, 1)
3958 #define WLAN_AKM_SUITE_PSK SUITE(0x000FAC, 2)
3959 #define WLAN_AKM_SUITE_FT_8021X SUITE(0x000FAC, 3)
3960 #define WLAN_AKM_SUITE_FT_PSK SUITE(0x000FAC, 4)
3961 #define WLAN_AKM_SUITE_8021X_SHA256 SUITE(0x000FAC, 5)
3962 #define WLAN_AKM_SUITE_PSK_SHA256 SUITE(0x000FAC, 6)
3963 #define WLAN_AKM_SUITE_TDLS SUITE(0x000FAC, 7)
3964 #define WLAN_AKM_SUITE_SAE SUITE(0x000FAC, 8)
3965 #define WLAN_AKM_SUITE_FT_OVER_SAE SUITE(0x000FAC, 9)
3966 #define WLAN_AKM_SUITE_AP_PEER_KEY SUITE(0x000FAC, 10)
3967 #define WLAN_AKM_SUITE_8021X_SUITE_B SUITE(0x000FAC, 11)
3968 #define WLAN_AKM_SUITE_8021X_SUITE_B_192 SUITE(0x000FAC, 12)
3969 #define WLAN_AKM_SUITE_FT_8021X_SHA384 SUITE(0x000FAC, 13)
3970 #define WLAN_AKM_SUITE_FILS_SHA256 SUITE(0x000FAC, 14)
3971 #define WLAN_AKM_SUITE_FILS_SHA384 SUITE(0x000FAC, 15)
3972 #define WLAN_AKM_SUITE_FT_FILS_SHA256 SUITE(0x000FAC, 16)
3973 #define WLAN_AKM_SUITE_FT_FILS_SHA384 SUITE(0x000FAC, 17)
3974 #define WLAN_AKM_SUITE_OWE SUITE(0x000FAC, 18)
3975 #define WLAN_AKM_SUITE_FT_PSK_SHA384 SUITE(0x000FAC, 19)
3976 #define WLAN_AKM_SUITE_PSK_SHA384 SUITE(0x000FAC, 20)
3977
3978 #define WLAN_AKM_SUITE_WFA_DPP SUITE(WLAN_OUI_WFA, 2)
3979
3980 #define WLAN_MAX_KEY_LEN 32
3981
3982 #define WLAN_PMK_NAME_LEN 16
3983 #define WLAN_PMKID_LEN 16
3984 #define WLAN_PMK_LEN_EAP_LEAP 16
3985 #define WLAN_PMK_LEN 32
3986 #define WLAN_PMK_LEN_SUITE_B_192 48
3987
3988 #define WLAN_OUI_WFA 0x506f9a
3989 #define WLAN_OUI_TYPE_WFA_P2P 9
3990 #define WLAN_OUI_TYPE_WFA_DPP 0x1A
3991 #define WLAN_OUI_MICROSOFT 0x0050f2
3992 #define WLAN_OUI_TYPE_MICROSOFT_WPA 1
3993 #define WLAN_OUI_TYPE_MICROSOFT_WMM 2
3994 #define WLAN_OUI_TYPE_MICROSOFT_WPS 4
3995 #define WLAN_OUI_TYPE_MICROSOFT_TPC 8
3996
3997
3998
3999
4000 #define IEEE80211_WMM_IE_TSPEC_TID_MASK 0x0F
4001 #define IEEE80211_WMM_IE_TSPEC_TID_SHIFT 1
4002
4003 enum ieee80211_tspec_status_code {
4004 IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED = 0,
4005 IEEE80211_TSPEC_STATUS_ADDTS_INVAL_PARAMS = 0x1,
4006 };
4007
4008 struct ieee80211_tspec_ie {
4009 u8 element_id;
4010 u8 len;
4011 u8 oui[3];
4012 u8 oui_type;
4013 u8 oui_subtype;
4014 u8 version;
4015 __le16 tsinfo;
4016 u8 tsinfo_resvd;
4017 __le16 nominal_msdu;
4018 __le16 max_msdu;
4019 __le32 min_service_int;
4020 __le32 max_service_int;
4021 __le32 inactivity_int;
4022 __le32 suspension_int;
4023 __le32 service_start_time;
4024 __le32 min_data_rate;
4025 __le32 mean_data_rate;
4026 __le32 peak_data_rate;
4027 __le32 max_burst_size;
4028 __le32 delay_bound;
4029 __le32 min_phy_rate;
4030 __le16 sba;
4031 __le16 medium_time;
4032 } __packed;
4033
4034 struct ieee80211_he_6ghz_capa {
4035
4036 __le16 capa;
4037 } __packed;
4038
4039
4040
4041 #define IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START 0x0007
4042
4043 #define IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP 0x0038
4044
4045 #define IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN 0x00c0
4046
4047 #define IEEE80211_HE_6GHZ_CAP_SM_PS 0x0600
4048 #define IEEE80211_HE_6GHZ_CAP_RD_RESPONDER 0x0800
4049 #define IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS 0x1000
4050 #define IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS 0x2000
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061 static inline u8 *ieee80211_get_qos_ctl(struct ieee80211_hdr *hdr)
4062 {
4063 if (ieee80211_has_a4(hdr->frame_control))
4064 return (u8 *)hdr + 30;
4065 else
4066 return (u8 *)hdr + 24;
4067 }
4068
4069
4070
4071
4072
4073 static inline u8 ieee80211_get_tid(struct ieee80211_hdr *hdr)
4074 {
4075 u8 *qc = ieee80211_get_qos_ctl(hdr);
4076
4077 return qc[0] & IEEE80211_QOS_CTL_TID_MASK;
4078 }
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090 static inline u8 *ieee80211_get_SA(struct ieee80211_hdr *hdr)
4091 {
4092 if (ieee80211_has_a4(hdr->frame_control))
4093 return hdr->addr4;
4094 if (ieee80211_has_fromds(hdr->frame_control))
4095 return hdr->addr3;
4096 return hdr->addr2;
4097 }
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109 static inline u8 *ieee80211_get_DA(struct ieee80211_hdr *hdr)
4110 {
4111 if (ieee80211_has_tods(hdr->frame_control))
4112 return hdr->addr3;
4113 else
4114 return hdr->addr1;
4115 }
4116
4117
4118
4119
4120
4121 static inline bool _ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
4122 {
4123 if (ieee80211_is_disassoc(hdr->frame_control) ||
4124 ieee80211_is_deauth(hdr->frame_control))
4125 return true;
4126
4127 if (ieee80211_is_action(hdr->frame_control)) {
4128 u8 *category;
4129
4130
4131
4132
4133
4134
4135
4136
4137 if (ieee80211_has_protected(hdr->frame_control))
4138 return true;
4139 category = ((u8 *) hdr) + 24;
4140 return *category != WLAN_CATEGORY_PUBLIC &&
4141 *category != WLAN_CATEGORY_HT &&
4142 *category != WLAN_CATEGORY_WNM_UNPROTECTED &&
4143 *category != WLAN_CATEGORY_SELF_PROTECTED &&
4144 *category != WLAN_CATEGORY_UNPROT_DMG &&
4145 *category != WLAN_CATEGORY_VHT &&
4146 *category != WLAN_CATEGORY_S1G &&
4147 *category != WLAN_CATEGORY_VENDOR_SPECIFIC;
4148 }
4149
4150 return false;
4151 }
4152
4153
4154
4155
4156
4157 static inline bool ieee80211_is_robust_mgmt_frame(struct sk_buff *skb)
4158 {
4159 if (skb->len < IEEE80211_MIN_ACTION_SIZE)
4160 return false;
4161 return _ieee80211_is_robust_mgmt_frame((void *)skb->data);
4162 }
4163
4164
4165
4166
4167
4168
4169 static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
4170 size_t len)
4171 {
4172 struct ieee80211_mgmt *mgmt = (void *)hdr;
4173
4174 if (len < IEEE80211_MIN_ACTION_SIZE)
4175 return false;
4176 if (!ieee80211_is_action(hdr->frame_control))
4177 return false;
4178 return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
4179 }
4180
4181
4182
4183
4184
4185
4186 static inline bool _ieee80211_is_group_privacy_action(struct ieee80211_hdr *hdr)
4187 {
4188 struct ieee80211_mgmt *mgmt = (void *)hdr;
4189
4190 if (!ieee80211_is_action(hdr->frame_control) ||
4191 !is_multicast_ether_addr(hdr->addr1))
4192 return false;
4193
4194 return mgmt->u.action.category == WLAN_CATEGORY_MESH_ACTION ||
4195 mgmt->u.action.category == WLAN_CATEGORY_MULTIHOP_ACTION;
4196 }
4197
4198
4199
4200
4201
4202
4203 static inline bool ieee80211_is_group_privacy_action(struct sk_buff *skb)
4204 {
4205 if (skb->len < IEEE80211_MIN_ACTION_SIZE)
4206 return false;
4207 return _ieee80211_is_group_privacy_action((void *)skb->data);
4208 }
4209
4210
4211
4212
4213
4214 static inline unsigned long ieee80211_tu_to_usec(unsigned long tu)
4215 {
4216 return 1024 * tu;
4217 }
4218
4219
4220
4221
4222
4223
4224
4225 static inline bool ieee80211_check_tim(const struct ieee80211_tim_ie *tim,
4226 u8 tim_len, u16 aid)
4227 {
4228 u8 mask;
4229 u8 index, indexn1, indexn2;
4230
4231 if (unlikely(!tim || tim_len < sizeof(*tim)))
4232 return false;
4233
4234 aid &= 0x3fff;
4235 index = aid / 8;
4236 mask = 1 << (aid & 7);
4237
4238 indexn1 = tim->bitmap_ctrl & 0xfe;
4239 indexn2 = tim_len + indexn1 - 4;
4240
4241 if (index < indexn1 || index > indexn2)
4242 return false;
4243
4244 index -= indexn1;
4245
4246 return !!(tim->virtual_map[index] & mask);
4247 }
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257 static inline int ieee80211_get_tdls_action(struct sk_buff *skb, u32 hdr_size)
4258 {
4259 if (!skb_is_nonlinear(skb) &&
4260 skb->len > (skb_network_offset(skb) + 2)) {
4261
4262 const u8 *tdls_data = skb_network_header(skb) - 2;
4263
4264 if (get_unaligned_be16(tdls_data) == ETH_P_TDLS &&
4265 tdls_data[2] == WLAN_TDLS_SNAP_RFTYPE &&
4266 tdls_data[3] == WLAN_CATEGORY_TDLS)
4267 return tdls_data[4];
4268 }
4269
4270 return -1;
4271 }
4272
4273
4274 #define TU_TO_JIFFIES(x) (usecs_to_jiffies((x) * 1024))
4275 #define TU_TO_EXP_TIME(x) (jiffies + TU_TO_JIFFIES(x))
4276
4277
4278 #define MHZ_TO_KHZ(freq) ((freq) * 1000)
4279 #define KHZ_TO_MHZ(freq) ((freq) / 1000)
4280 #define PR_KHZ(f) KHZ_TO_MHZ(f), f % 1000
4281 #define KHZ_F "%d.%03d"
4282
4283
4284 #define DBI_TO_MBI(gain) ((gain) * 100)
4285 #define MBI_TO_DBI(gain) ((gain) / 100)
4286 #define DBM_TO_MBM(gain) ((gain) * 100)
4287 #define MBM_TO_DBM(gain) ((gain) / 100)
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297 static inline bool ieee80211_action_contains_tpc(struct sk_buff *skb)
4298 {
4299 struct ieee80211_mgmt *mgmt = (void *)skb->data;
4300
4301 if (!ieee80211_is_action(mgmt->frame_control))
4302 return false;
4303
4304 if (skb->len < IEEE80211_MIN_ACTION_SIZE +
4305 sizeof(mgmt->u.action.u.tpc_report))
4306 return false;
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319 if (mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT &&
4320 mgmt->u.action.category != WLAN_CATEGORY_RADIO_MEASUREMENT)
4321 return false;
4322
4323
4324 if (mgmt->u.action.u.tpc_report.action_code !=
4325 WLAN_ACTION_SPCT_TPC_RPRT)
4326 return false;
4327
4328 if (mgmt->u.action.u.tpc_report.tpc_elem_id != WLAN_EID_TPC_REPORT ||
4329 mgmt->u.action.u.tpc_report.tpc_elem_length !=
4330 sizeof(struct ieee80211_tpc_report_ie))
4331 return false;
4332
4333 return true;
4334 }
4335
4336 static inline bool ieee80211_is_timing_measurement(struct sk_buff *skb)
4337 {
4338 struct ieee80211_mgmt *mgmt = (void *)skb->data;
4339
4340 if (skb->len < IEEE80211_MIN_ACTION_SIZE)
4341 return false;
4342
4343 if (!ieee80211_is_action(mgmt->frame_control))
4344 return false;
4345
4346 if (mgmt->u.action.category == WLAN_CATEGORY_WNM_UNPROTECTED &&
4347 mgmt->u.action.u.wnm_timing_msr.action_code ==
4348 WLAN_UNPROTECTED_WNM_ACTION_TIMING_MEASUREMENT_RESPONSE &&
4349 skb->len >= offsetofend(typeof(*mgmt), u.action.u.wnm_timing_msr))
4350 return true;
4351
4352 return false;
4353 }
4354
4355 static inline bool ieee80211_is_ftm(struct sk_buff *skb)
4356 {
4357 struct ieee80211_mgmt *mgmt = (void *)skb->data;
4358
4359 if (!ieee80211_is_public_action((void *)mgmt, skb->len))
4360 return false;
4361
4362 if (mgmt->u.action.u.ftm.action_code ==
4363 WLAN_PUBLIC_ACTION_FTM_RESPONSE &&
4364 skb->len >= offsetofend(typeof(*mgmt), u.action.u.ftm))
4365 return true;
4366
4367 return false;
4368 }
4369
4370 struct element {
4371 u8 id;
4372 u8 datalen;
4373 u8 data[];
4374 } __packed;
4375
4376
4377 #define for_each_element(_elem, _data, _datalen) \
4378 for (_elem = (const struct element *)(_data); \
4379 (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >= \
4380 (int)sizeof(*_elem) && \
4381 (const u8 *)(_data) + (_datalen) - (const u8 *)_elem >= \
4382 (int)sizeof(*_elem) + _elem->datalen; \
4383 _elem = (const struct element *)(_elem->data + _elem->datalen))
4384
4385 #define for_each_element_id(element, _id, data, datalen) \
4386 for_each_element(element, data, datalen) \
4387 if (element->id == (_id))
4388
4389 #define for_each_element_extid(element, extid, _data, _datalen) \
4390 for_each_element(element, _data, _datalen) \
4391 if (element->id == WLAN_EID_EXTENSION && \
4392 element->datalen > 0 && \
4393 element->data[0] == (extid))
4394
4395 #define for_each_subelement(sub, element) \
4396 for_each_element(sub, (element)->data, (element)->datalen)
4397
4398 #define for_each_subelement_id(sub, id, element) \
4399 for_each_element_id(sub, id, (element)->data, (element)->datalen)
4400
4401 #define for_each_subelement_extid(sub, extid, element) \
4402 for_each_element_extid(sub, extid, (element)->data, (element)->datalen)
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417 static inline bool for_each_element_completed(const struct element *element,
4418 const void *data, size_t datalen)
4419 {
4420 return (const u8 *)element == (const u8 *)data + datalen;
4421 }
4422
4423
4424
4425
4426
4427 #define WLAN_RSNX_CAPA_PROTECTED_TWT BIT(4)
4428 #define WLAN_RSNX_CAPA_SAE_H2E BIT(5)
4429
4430
4431
4432
4433
4434 #define IEEE80211_AP_INFO_TBTT_HDR_TYPE 0x03
4435 #define IEEE80211_AP_INFO_TBTT_HDR_FILTERED 0x04
4436 #define IEEE80211_AP_INFO_TBTT_HDR_COLOC 0x08
4437 #define IEEE80211_AP_INFO_TBTT_HDR_COUNT 0xF0
4438 #define IEEE80211_TBTT_INFO_OFFSET_BSSID_BSS_PARAM 9
4439 #define IEEE80211_TBTT_INFO_OFFSET_BSSID_SSSID_BSS_PARAM 13
4440
4441 #define IEEE80211_RNR_TBTT_PARAMS_OCT_RECOMMENDED 0x01
4442 #define IEEE80211_RNR_TBTT_PARAMS_SAME_SSID 0x02
4443 #define IEEE80211_RNR_TBTT_PARAMS_MULTI_BSSID 0x04
4444 #define IEEE80211_RNR_TBTT_PARAMS_TRANSMITTED_BSSID 0x08
4445 #define IEEE80211_RNR_TBTT_PARAMS_COLOC_ESS 0x10
4446 #define IEEE80211_RNR_TBTT_PARAMS_PROBE_ACTIVE 0x20
4447 #define IEEE80211_RNR_TBTT_PARAMS_COLOC_AP 0x40
4448
4449 struct ieee80211_neighbor_ap_info {
4450 u8 tbtt_info_hdr;
4451 u8 tbtt_info_len;
4452 u8 op_class;
4453 u8 channel;
4454 } __packed;
4455
4456 enum ieee80211_range_params_max_total_ltf {
4457 IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_4 = 0,
4458 IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_8,
4459 IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_16,
4460 IEEE80211_RANGE_PARAMS_MAX_TOTAL_LTF_UNSPECIFIED,
4461 };
4462
4463
4464 #define IEEE80211_MLD_MAX_NUM_LINKS 15
4465
4466 #define IEEE80211_ML_CONTROL_TYPE 0x0007
4467 #define IEEE80211_ML_CONTROL_TYPE_BASIC 0
4468 #define IEEE80211_ML_CONTROL_TYPE_PREQ 1
4469 #define IEEE80211_ML_CONTROL_TYPE_RECONF 2
4470 #define IEEE80211_ML_CONTROL_TYPE_TDLS 3
4471 #define IEEE80211_ML_CONTROL_TYPE_PRIO_ACCESS 4
4472 #define IEEE80211_ML_CONTROL_PRESENCE_MASK 0xfff0
4473
4474 struct ieee80211_multi_link_elem {
4475 __le16 control;
4476 u8 variable[];
4477 } __packed;
4478
4479 #define IEEE80211_MLC_BASIC_PRES_LINK_ID 0x0010
4480 #define IEEE80211_MLC_BASIC_PRES_BSS_PARAM_CH_CNT 0x0020
4481 #define IEEE80211_MLC_BASIC_PRES_MED_SYNC_DELAY 0x0040
4482 #define IEEE80211_MLC_BASIC_PRES_EML_CAPA 0x0080
4483 #define IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP 0x0100
4484 #define IEEE80211_MLC_BASIC_PRES_MLD_ID 0x0200
4485
4486 #define IEEE80211_MED_SYNC_DELAY_DURATION 0x00ff
4487 #define IEEE80211_MED_SYNC_DELAY_SYNC_OFDM_ED_THRESH 0x0f00
4488 #define IEEE80211_MED_SYNC_DELAY_SYNC_MAX_NUM_TXOPS 0xf000
4489
4490 #define IEEE80211_EML_CAP_EMLSR_SUPP 0x0001
4491 #define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY 0x000e
4492 #define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_0US 0
4493 #define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_32US 1
4494 #define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_64US 2
4495 #define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_128US 3
4496 #define IEEE80211_EML_CAP_EMLSR_PADDING_DELAY_256US 4
4497 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY 0x0070
4498 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_0US 0
4499 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_16US 1
4500 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_32US 2
4501 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_64US 3
4502 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_128US 4
4503 #define IEEE80211_EML_CAP_EMLSR_TRANSITION_DELAY_256US 5
4504 #define IEEE80211_EML_CAP_EMLMR_SUPPORT 0x0080
4505 #define IEEE80211_EML_CAP_EMLMR_DELAY 0x0700
4506 #define IEEE80211_EML_CAP_EMLMR_DELAY_0US 0
4507 #define IEEE80211_EML_CAP_EMLMR_DELAY_32US 1
4508 #define IEEE80211_EML_CAP_EMLMR_DELAY_64US 2
4509 #define IEEE80211_EML_CAP_EMLMR_DELAY_128US 3
4510 #define IEEE80211_EML_CAP_EMLMR_DELAY_256US 4
4511 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT 0x7800
4512 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_0 0
4513 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_128US 1
4514 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_256US 2
4515 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_512US 3
4516 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_1TU 4
4517 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_2TU 5
4518 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_4TU 6
4519 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_8TU 7
4520 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_16TU 8
4521 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_32TU 9
4522 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_64TU 10
4523 #define IEEE80211_EML_CAP_TRANSITION_TIMEOUT_128TU 11
4524
4525 #define IEEE80211_MLD_CAP_OP_MAX_SIMUL_LINKS 0x000f
4526 #define IEEE80211_MLD_CAP_OP_SRS_SUPPORT 0x0010
4527 #define IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP 0x0060
4528 #define IEEE80211_MLD_CAP_OP_FREQ_SEP_TYPE_IND 0x0f80
4529 #define IEEE80211_MLD_CAP_OP_AAR_SUPPORT 0x1000
4530
4531 struct ieee80211_mle_basic_common_info {
4532 u8 len;
4533 u8 mld_mac_addr[ETH_ALEN];
4534 u8 variable[];
4535 } __packed;
4536
4537 #define IEEE80211_MLC_PREQ_PRES_MLD_ID 0x0010
4538
4539 struct ieee80211_mle_preq_common_info {
4540 u8 len;
4541 u8 variable[];
4542 } __packed;
4543
4544 #define IEEE80211_MLC_RECONF_PRES_MLD_MAC_ADDR 0x0010
4545
4546
4547
4548 struct ieee80211_mle_tdls_common_info {
4549 u8 len;
4550 u8 ap_mld_mac_addr[ETH_ALEN];
4551 } __packed;
4552
4553 #define IEEE80211_MLC_PRIO_ACCESS_PRES_AP_MLD_MAC_ADDR 0x0010
4554
4555
4556
4557
4558
4559
4560
4561
4562 static inline u8 ieee80211_mle_common_size(const u8 *data)
4563 {
4564 const struct ieee80211_multi_link_elem *mle = (const void *)data;
4565 u16 control = le16_to_cpu(mle->control);
4566 u8 common = 0;
4567
4568 switch (u16_get_bits(control, IEEE80211_ML_CONTROL_TYPE)) {
4569 case IEEE80211_ML_CONTROL_TYPE_BASIC:
4570 common += sizeof(struct ieee80211_mle_basic_common_info);
4571 break;
4572 case IEEE80211_ML_CONTROL_TYPE_PREQ:
4573 common += sizeof(struct ieee80211_mle_preq_common_info);
4574 break;
4575 case IEEE80211_ML_CONTROL_TYPE_RECONF:
4576 if (control & IEEE80211_MLC_RECONF_PRES_MLD_MAC_ADDR)
4577 common += ETH_ALEN;
4578 return common;
4579 case IEEE80211_ML_CONTROL_TYPE_TDLS:
4580 common += sizeof(struct ieee80211_mle_tdls_common_info);
4581 break;
4582 case IEEE80211_ML_CONTROL_TYPE_PRIO_ACCESS:
4583 if (control & IEEE80211_MLC_PRIO_ACCESS_PRES_AP_MLD_MAC_ADDR)
4584 common += ETH_ALEN;
4585 return common;
4586 default:
4587 WARN_ON(1);
4588 return 0;
4589 }
4590
4591 return common + mle->variable[0];
4592 }
4593
4594
4595
4596
4597
4598
4599 static inline bool ieee80211_mle_size_ok(const u8 *data, u8 len)
4600 {
4601 const struct ieee80211_multi_link_elem *mle = (const void *)data;
4602 u8 fixed = sizeof(*mle);
4603 u8 common = 0;
4604 bool check_common_len = false;
4605 u16 control;
4606
4607 if (len < fixed)
4608 return false;
4609
4610 control = le16_to_cpu(mle->control);
4611
4612 switch (u16_get_bits(control, IEEE80211_ML_CONTROL_TYPE)) {
4613 case IEEE80211_ML_CONTROL_TYPE_BASIC:
4614 common += sizeof(struct ieee80211_mle_basic_common_info);
4615 check_common_len = true;
4616 if (control & IEEE80211_MLC_BASIC_PRES_LINK_ID)
4617 common += 1;
4618 if (control & IEEE80211_MLC_BASIC_PRES_BSS_PARAM_CH_CNT)
4619 common += 1;
4620 if (control & IEEE80211_MLC_BASIC_PRES_MED_SYNC_DELAY)
4621 common += 2;
4622 if (control & IEEE80211_MLC_BASIC_PRES_EML_CAPA)
4623 common += 2;
4624 if (control & IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP)
4625 common += 2;
4626 if (control & IEEE80211_MLC_BASIC_PRES_MLD_ID)
4627 common += 1;
4628 break;
4629 case IEEE80211_ML_CONTROL_TYPE_PREQ:
4630 common += sizeof(struct ieee80211_mle_preq_common_info);
4631 if (control & IEEE80211_MLC_PREQ_PRES_MLD_ID)
4632 common += 1;
4633 check_common_len = true;
4634 break;
4635 case IEEE80211_ML_CONTROL_TYPE_RECONF:
4636 if (control & IEEE80211_MLC_RECONF_PRES_MLD_MAC_ADDR)
4637 common += ETH_ALEN;
4638 break;
4639 case IEEE80211_ML_CONTROL_TYPE_TDLS:
4640 common += sizeof(struct ieee80211_mle_tdls_common_info);
4641 check_common_len = true;
4642 break;
4643 case IEEE80211_ML_CONTROL_TYPE_PRIO_ACCESS:
4644 if (control & IEEE80211_MLC_PRIO_ACCESS_PRES_AP_MLD_MAC_ADDR)
4645 common += ETH_ALEN;
4646 break;
4647 default:
4648
4649 return true;
4650 }
4651
4652 if (len < fixed + common)
4653 return false;
4654
4655 if (!check_common_len)
4656 return true;
4657
4658
4659 return mle->variable[0] >= common;
4660 }
4661
4662 enum ieee80211_mle_subelems {
4663 IEEE80211_MLE_SUBELEM_PER_STA_PROFILE = 0,
4664 };
4665
4666 #define IEEE80211_MLE_STA_CONTROL_LINK_ID 0x000f
4667 #define IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE 0x0010
4668 #define IEEE80211_MLE_STA_CONTROL_STA_MAC_ADDR_PRESENT 0x0020
4669 #define IEEE80211_MLE_STA_CONTROL_BEACON_INT_PRESENT 0x0040
4670 #define IEEE80211_MLE_STA_CONTROL_TSF_OFFS_PRESENT 0x0080
4671 #define IEEE80211_MLE_STA_CONTROL_DTIM_INFO_PRESENT 0x0100
4672 #define IEEE80211_MLE_STA_CONTROL_NSTR_LINK_PAIR_PRESENT 0x0200
4673 #define IEEE80211_MLE_STA_CONTROL_NSTR_BITMAP_SIZE 0x0400
4674 #define IEEE80211_MLE_STA_CONTROL_BSS_PARAM_CHANGE_CNT_PRESENT 0x0800
4675
4676 struct ieee80211_mle_per_sta_profile {
4677 __le16 control;
4678 u8 sta_info_len;
4679 u8 variable[];
4680 } __packed;
4681
4682 #define for_each_mle_subelement(_elem, _data, _len) \
4683 if (ieee80211_mle_size_ok(_data, _len)) \
4684 for_each_element(_elem, \
4685 _data + ieee80211_mle_common_size(_data),\
4686 _len - ieee80211_mle_common_size(_data))
4687
4688 #endif