hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/mac80211/cfg.c
....@@ -1,12 +1,11 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * mac80211 configuration hooks for cfg80211
34 *
45 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
56 * Copyright 2013-2015 Intel Mobile Communications GmbH
67 * Copyright (C) 2015-2017 Intel Deutschland GmbH
7
- * Copyright (C) 2018 Intel Corporation
8
- *
9
- * This file is GPLv2 as found in COPYING.
8
+ * Copyright (C) 2018-2020 Intel Corporation
109 */
1110
1211 #include <linux/ieee80211.h>
....@@ -15,6 +14,7 @@
1514 #include <linux/slab.h>
1615 #include <net/net_namespace.h>
1716 #include <linux/rcupdate.h>
17
+#include <linux/fips.h>
1818 #include <linux/if_ether.h>
1919 #include <net/cfg80211.h>
2020 #include "ieee80211_i.h"
....@@ -152,19 +152,36 @@
152152 struct vif_params *params)
153153 {
154154 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
155
+ struct ieee80211_local *local = sdata->local;
156
+ struct sta_info *sta;
155157 int ret;
156158
157159 ret = ieee80211_if_change_type(sdata, type);
158160 if (ret)
159161 return ret;
160162
161
- if (type == NL80211_IFTYPE_AP_VLAN &&
162
- params && params->use_4addr == 0) {
163
+ if (type == NL80211_IFTYPE_AP_VLAN && params->use_4addr == 0) {
163164 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL);
164165 ieee80211_check_fast_rx_iface(sdata);
165
- } else if (type == NL80211_IFTYPE_STATION &&
166
- params && params->use_4addr >= 0) {
166
+ } else if (type == NL80211_IFTYPE_STATION && params->use_4addr >= 0) {
167
+ struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
168
+
169
+ if (params->use_4addr == ifmgd->use_4addr)
170
+ return 0;
171
+
167172 sdata->u.mgd.use_4addr = params->use_4addr;
173
+ if (!ifmgd->associated)
174
+ return 0;
175
+
176
+ mutex_lock(&local->sta_mtx);
177
+ sta = sta_info_get(sdata, ifmgd->bssid);
178
+ if (sta)
179
+ drv_sta_set_4addr(local, sdata, &sta->sta,
180
+ params->use_4addr);
181
+ mutex_unlock(&local->sta_mtx);
182
+
183
+ if (params->use_4addr)
184
+ ieee80211_send_4addr_nullfunc(local, sdata);
168185 }
169186
170187 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
....@@ -353,6 +370,36 @@
353370 return 0;
354371 }
355372
373
+static int ieee80211_set_tx(struct ieee80211_sub_if_data *sdata,
374
+ const u8 *mac_addr, u8 key_idx)
375
+{
376
+ struct ieee80211_local *local = sdata->local;
377
+ struct ieee80211_key *key;
378
+ struct sta_info *sta;
379
+ int ret = -EINVAL;
380
+
381
+ if (!wiphy_ext_feature_isset(local->hw.wiphy,
382
+ NL80211_EXT_FEATURE_EXT_KEY_ID))
383
+ return -EINVAL;
384
+
385
+ sta = sta_info_get_bss(sdata, mac_addr);
386
+
387
+ if (!sta)
388
+ return -EINVAL;
389
+
390
+ if (sta->ptk_idx == key_idx)
391
+ return 0;
392
+
393
+ mutex_lock(&local->key_mtx);
394
+ key = key_mtx_dereference(local, sta->ptk[key_idx]);
395
+
396
+ if (key && key->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX)
397
+ ret = ieee80211_set_tx_key(key);
398
+
399
+ mutex_unlock(&local->key_mtx);
400
+ return ret;
401
+}
402
+
356403 static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
357404 u8 key_idx, bool pairwise, const u8 *mac_addr,
358405 struct key_params *params)
....@@ -367,14 +414,16 @@
367414 if (!ieee80211_sdata_running(sdata))
368415 return -ENETDOWN;
369416
417
+ if (pairwise && params->mode == NL80211_KEY_SET_TX)
418
+ return ieee80211_set_tx(sdata, mac_addr, key_idx);
419
+
370420 /* reject WEP and TKIP keys if WEP failed to initialize */
371421 switch (params->cipher) {
372422 case WLAN_CIPHER_SUITE_WEP40:
373423 case WLAN_CIPHER_SUITE_TKIP:
374424 case WLAN_CIPHER_SUITE_WEP104:
375
- if (IS_ERR(local->wep_tx_tfm))
425
+ if (WARN_ON_ONCE(fips_enabled))
376426 return -EINVAL;
377
- break;
378427 case WLAN_CIPHER_SUITE_CCMP:
379428 case WLAN_CIPHER_SUITE_CCMP_256:
380429 case WLAN_CIPHER_SUITE_AES_CMAC:
....@@ -397,6 +446,9 @@
397446
398447 if (pairwise)
399448 key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
449
+
450
+ if (params->mode == NL80211_KEY_NO_TX)
451
+ key->conf.flags |= IEEE80211_KEY_FLAG_NO_AUTO_TX;
400452
401453 mutex_lock(&local->sta_mtx);
402454
....@@ -534,7 +586,8 @@
534586 if (pairwise && key_idx < NUM_DEFAULT_KEYS)
535587 key = rcu_dereference(sta->ptk[key_idx]);
536588 else if (!pairwise &&
537
- key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
589
+ key_idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
590
+ NUM_DEFAULT_BEACON_KEYS)
538591 key = rcu_dereference(sta->gtk[key_idx]);
539592 } else
540593 key = rcu_dereference(sdata->keys[key_idx]);
....@@ -574,12 +627,12 @@
574627 case WLAN_CIPHER_SUITE_BIP_CMAC_256:
575628 BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
576629 offsetof(typeof(kseq), aes_cmac));
577
- /* fall through */
630
+ fallthrough;
578631 case WLAN_CIPHER_SUITE_BIP_GMAC_128:
579632 case WLAN_CIPHER_SUITE_BIP_GMAC_256:
580633 BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
581634 offsetof(typeof(kseq), aes_gmac));
582
- /* fall through */
635
+ fallthrough;
583636 case WLAN_CIPHER_SUITE_GCMP:
584637 case WLAN_CIPHER_SUITE_GCMP_256:
585638 BUILD_BUG_ON(offsetof(typeof(kseq), ccmp) !=
....@@ -642,6 +695,17 @@
642695 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
643696
644697 ieee80211_set_default_mgmt_key(sdata, key_idx);
698
+
699
+ return 0;
700
+}
701
+
702
+static int ieee80211_config_default_beacon_key(struct wiphy *wiphy,
703
+ struct net_device *dev,
704
+ u8 key_idx)
705
+{
706
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
707
+
708
+ ieee80211_set_default_beacon_key(sdata, key_idx);
645709
646710 return 0;
647711 }
....@@ -782,13 +846,108 @@
782846 memcpy(new->data, resp, resp_len);
783847
784848 if (csa)
785
- memcpy(new->csa_counter_offsets, csa->counter_offsets_presp,
849
+ memcpy(new->cntdwn_counter_offsets, csa->counter_offsets_presp,
786850 csa->n_counter_offsets_presp *
787
- sizeof(new->csa_counter_offsets[0]));
851
+ sizeof(new->cntdwn_counter_offsets[0]));
788852
789853 rcu_assign_pointer(sdata->u.ap.probe_resp, new);
790854 if (old)
791855 kfree_rcu(old, rcu_head);
856
+
857
+ return 0;
858
+}
859
+
860
+static int ieee80211_set_fils_discovery(struct ieee80211_sub_if_data *sdata,
861
+ struct cfg80211_fils_discovery *params)
862
+{
863
+ struct fils_discovery_data *new, *old = NULL;
864
+ struct ieee80211_fils_discovery *fd;
865
+
866
+ if (!params->tmpl || !params->tmpl_len)
867
+ return -EINVAL;
868
+
869
+ fd = &sdata->vif.bss_conf.fils_discovery;
870
+ fd->min_interval = params->min_interval;
871
+ fd->max_interval = params->max_interval;
872
+
873
+ old = sdata_dereference(sdata->u.ap.fils_discovery, sdata);
874
+ new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
875
+ if (!new)
876
+ return -ENOMEM;
877
+ new->len = params->tmpl_len;
878
+ memcpy(new->data, params->tmpl, params->tmpl_len);
879
+ rcu_assign_pointer(sdata->u.ap.fils_discovery, new);
880
+
881
+ if (old)
882
+ kfree_rcu(old, rcu_head);
883
+
884
+ return 0;
885
+}
886
+
887
+static int
888
+ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,
889
+ struct cfg80211_unsol_bcast_probe_resp *params)
890
+{
891
+ struct unsol_bcast_probe_resp_data *new, *old = NULL;
892
+
893
+ if (!params->tmpl || !params->tmpl_len)
894
+ return -EINVAL;
895
+
896
+ old = sdata_dereference(sdata->u.ap.unsol_bcast_probe_resp, sdata);
897
+ new = kzalloc(sizeof(*new) + params->tmpl_len, GFP_KERNEL);
898
+ if (!new)
899
+ return -ENOMEM;
900
+ new->len = params->tmpl_len;
901
+ memcpy(new->data, params->tmpl, params->tmpl_len);
902
+ rcu_assign_pointer(sdata->u.ap.unsol_bcast_probe_resp, new);
903
+
904
+ if (old)
905
+ kfree_rcu(old, rcu_head);
906
+
907
+ sdata->vif.bss_conf.unsol_bcast_probe_resp_interval =
908
+ params->interval;
909
+
910
+ return 0;
911
+}
912
+
913
+static int ieee80211_set_ftm_responder_params(
914
+ struct ieee80211_sub_if_data *sdata,
915
+ const u8 *lci, size_t lci_len,
916
+ const u8 *civicloc, size_t civicloc_len)
917
+{
918
+ struct ieee80211_ftm_responder_params *new, *old;
919
+ struct ieee80211_bss_conf *bss_conf;
920
+ u8 *pos;
921
+ int len;
922
+
923
+ if (!lci_len && !civicloc_len)
924
+ return 0;
925
+
926
+ bss_conf = &sdata->vif.bss_conf;
927
+ old = bss_conf->ftmr_params;
928
+ len = lci_len + civicloc_len;
929
+
930
+ new = kzalloc(sizeof(*new) + len, GFP_KERNEL);
931
+ if (!new)
932
+ return -ENOMEM;
933
+
934
+ pos = (u8 *)(new + 1);
935
+ if (lci_len) {
936
+ new->lci_len = lci_len;
937
+ new->lci = pos;
938
+ memcpy(pos, lci, lci_len);
939
+ pos += lci_len;
940
+ }
941
+
942
+ if (civicloc_len) {
943
+ new->civicloc_len = civicloc_len;
944
+ new->civicloc = pos;
945
+ memcpy(pos, civicloc, civicloc_len);
946
+ pos += civicloc_len;
947
+ }
948
+
949
+ bss_conf->ftmr_params = new;
950
+ kfree(old);
792951
793952 return 0;
794953 }
....@@ -840,10 +999,10 @@
840999 new->tail_len = new_tail_len;
8411000
8421001 if (csa) {
843
- new->csa_current_counter = csa->count;
844
- memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon,
1002
+ new->cntdwn_current_counter = csa->count;
1003
+ memcpy(new->cntdwn_counter_offsets, csa->counter_offsets_beacon,
8451004 csa->n_counter_offsets_beacon *
846
- sizeof(new->csa_counter_offsets[0]));
1005
+ sizeof(new->cntdwn_counter_offsets[0]));
8471006 }
8481007
8491008 /* copy in head */
....@@ -861,10 +1020,28 @@
8611020
8621021 err = ieee80211_set_probe_resp(sdata, params->probe_resp,
8631022 params->probe_resp_len, csa);
864
- if (err < 0)
1023
+ if (err < 0) {
1024
+ kfree(new);
8651025 return err;
1026
+ }
8661027 if (err == 0)
8671028 changed |= BSS_CHANGED_AP_PROBE_RESP;
1029
+
1030
+ if (params->ftm_responder != -1) {
1031
+ sdata->vif.bss_conf.ftm_responder = params->ftm_responder;
1032
+ err = ieee80211_set_ftm_responder_params(sdata,
1033
+ params->lci,
1034
+ params->lci_len,
1035
+ params->civicloc,
1036
+ params->civicloc_len);
1037
+
1038
+ if (err < 0) {
1039
+ kfree(new);
1040
+ return err;
1041
+ }
1042
+
1043
+ changed |= BSS_CHANGED_FTM_RESPONDER;
1044
+ }
8681045
8691046 rcu_assign_pointer(sdata->u.ap.beacon, new);
8701047
....@@ -886,33 +1063,38 @@
8861063 BSS_CHANGED_BEACON |
8871064 BSS_CHANGED_SSID |
8881065 BSS_CHANGED_P2P_PS |
889
- BSS_CHANGED_TXPOWER;
890
- int err;
1066
+ BSS_CHANGED_TXPOWER |
1067
+ BSS_CHANGED_TWT;
1068
+ int i, err;
8911069 int prev_beacon_int;
8921070
8931071 old = sdata_dereference(sdata->u.ap.beacon, sdata);
8941072 if (old)
8951073 return -EALREADY;
8961074
897
- switch (params->smps_mode) {
898
- case NL80211_SMPS_OFF:
899
- sdata->smps_mode = IEEE80211_SMPS_OFF;
900
- break;
901
- case NL80211_SMPS_STATIC:
902
- sdata->smps_mode = IEEE80211_SMPS_STATIC;
903
- break;
904
- case NL80211_SMPS_DYNAMIC:
905
- sdata->smps_mode = IEEE80211_SMPS_DYNAMIC;
906
- break;
907
- default:
908
- return -EINVAL;
909
- }
910
- sdata->u.ap.req_smps = sdata->smps_mode;
1075
+ if (params->smps_mode != NL80211_SMPS_OFF)
1076
+ return -ENOTSUPP;
1077
+
1078
+ sdata->smps_mode = IEEE80211_SMPS_OFF;
9111079
9121080 sdata->needed_rx_chains = sdata->local->rx_chains;
9131081
9141082 prev_beacon_int = sdata->vif.bss_conf.beacon_int;
9151083 sdata->vif.bss_conf.beacon_int = params->beacon_interval;
1084
+
1085
+ if (params->he_cap && params->he_oper) {
1086
+ sdata->vif.bss_conf.he_support = true;
1087
+ sdata->vif.bss_conf.htc_trig_based_pkt_ext =
1088
+ le32_get_bits(params->he_oper->he_oper_params,
1089
+ IEEE80211_HE_OPERATION_DFLT_PE_DURATION_MASK);
1090
+ sdata->vif.bss_conf.frame_time_rts_th =
1091
+ le32_get_bits(params->he_oper->he_oper_params,
1092
+ IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
1093
+ changed |= BSS_CHANGED_HE_OBSS_PD;
1094
+
1095
+ if (params->he_bss_color.enabled)
1096
+ changed |= BSS_CHANGED_HE_BSS_COLOR;
1097
+ }
9161098
9171099 mutex_lock(&local->mtx);
9181100 err = ieee80211_vif_use_channel(sdata, &params->chandef,
....@@ -933,6 +1115,8 @@
9331115 sdata->control_port_no_encrypt = params->crypto.control_port_no_encrypt;
9341116 sdata->control_port_over_nl80211 =
9351117 params->crypto.control_port_over_nl80211;
1118
+ sdata->control_port_no_preauth =
1119
+ params->crypto.control_port_no_preauth;
9361120 sdata->encrypt_headroom = ieee80211_cs_headroom(sdata->local,
9371121 &params->crypto,
9381122 sdata->vif.type);
....@@ -944,6 +1128,8 @@
9441128 params->crypto.control_port_no_encrypt;
9451129 vlan->control_port_over_nl80211 =
9461130 params->crypto.control_port_over_nl80211;
1131
+ vlan->control_port_no_preauth =
1132
+ params->crypto.control_port_no_preauth;
9471133 vlan->encrypt_headroom =
9481134 ieee80211_cs_headroom(sdata->local,
9491135 &params->crypto,
....@@ -953,6 +1139,13 @@
9531139 sdata->vif.bss_conf.dtim_period = params->dtim_period;
9541140 sdata->vif.bss_conf.enable_beacon = true;
9551141 sdata->vif.bss_conf.allow_p2p_go_ps = sdata->vif.p2p;
1142
+ sdata->vif.bss_conf.twt_responder = params->twt_responder;
1143
+ memcpy(&sdata->vif.bss_conf.he_obss_pd, &params->he_obss_pd,
1144
+ sizeof(struct ieee80211_he_obss_pd));
1145
+ memcpy(&sdata->vif.bss_conf.he_bss_color, &params->he_bss_color,
1146
+ sizeof(struct ieee80211_he_bss_color));
1147
+ sdata->vif.bss_conf.s1g = params->chandef.chan->band ==
1148
+ NL80211_BAND_S1GHZ;
9561149
9571150 sdata->vif.bss_conf.ssid_len = params->ssid_len;
9581151 if (params->ssid_len)
....@@ -969,12 +1162,40 @@
9691162 sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
9701163 IEEE80211_P2P_OPPPS_ENABLE_BIT;
9711164
972
- err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
973
- if (err < 0) {
974
- ieee80211_vif_release_channel(sdata);
975
- return err;
1165
+ sdata->beacon_rate_set = false;
1166
+ if (wiphy_ext_feature_isset(local->hw.wiphy,
1167
+ NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) {
1168
+ for (i = 0; i < NUM_NL80211_BANDS; i++) {
1169
+ sdata->beacon_rateidx_mask[i] =
1170
+ params->beacon_rate.control[i].legacy;
1171
+ if (sdata->beacon_rateidx_mask[i])
1172
+ sdata->beacon_rate_set = true;
1173
+ }
9761174 }
1175
+
1176
+ if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
1177
+ sdata->vif.bss_conf.beacon_tx_rate = params->beacon_rate;
1178
+
1179
+ err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
1180
+ if (err < 0)
1181
+ goto error;
9771182 changed |= err;
1183
+
1184
+ if (params->fils_discovery.max_interval) {
1185
+ err = ieee80211_set_fils_discovery(sdata,
1186
+ &params->fils_discovery);
1187
+ if (err < 0)
1188
+ goto error;
1189
+ changed |= BSS_CHANGED_FILS_DISCOVERY;
1190
+ }
1191
+
1192
+ if (params->unsol_bcast_probe_resp.interval) {
1193
+ err = ieee80211_set_unsol_bcast_probe_resp(sdata,
1194
+ &params->unsol_bcast_probe_resp);
1195
+ if (err < 0)
1196
+ goto error;
1197
+ changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
1198
+ }
9781199
9791200 err = drv_start_ap(sdata->local, sdata);
9801201 if (err) {
....@@ -983,8 +1204,7 @@
9831204 if (old)
9841205 kfree_rcu(old, rcu_head);
9851206 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
986
- ieee80211_vif_release_channel(sdata);
987
- return err;
1207
+ goto error;
9881208 }
9891209
9901210 ieee80211_recalc_dtim(local, sdata);
....@@ -995,6 +1215,13 @@
9951215 netif_carrier_on(vlan->dev);
9961216
9971217 return 0;
1218
+
1219
+error:
1220
+ mutex_lock(&local->mtx);
1221
+ ieee80211_vif_release_channel(sdata);
1222
+ mutex_unlock(&local->mtx);
1223
+
1224
+ return err;
9981225 }
9991226
10001227 static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
....@@ -1031,6 +1258,8 @@
10311258 struct ieee80211_local *local = sdata->local;
10321259 struct beacon_data *old_beacon;
10331260 struct probe_resp *old_probe_resp;
1261
+ struct fils_discovery_data *old_fils_discovery;
1262
+ struct unsol_bcast_probe_resp_data *old_unsol_bcast_probe_resp;
10341263 struct cfg80211_chan_def chandef;
10351264
10361265 sdata_assert_lock(sdata);
....@@ -1039,6 +1268,11 @@
10391268 if (!old_beacon)
10401269 return -ENOENT;
10411270 old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata);
1271
+ old_fils_discovery = sdata_dereference(sdata->u.ap.fils_discovery,
1272
+ sdata);
1273
+ old_unsol_bcast_probe_resp =
1274
+ sdata_dereference(sdata->u.ap.unsol_bcast_probe_resp,
1275
+ sdata);
10421276
10431277 /* abort any running channel switch */
10441278 mutex_lock(&local->mtx);
....@@ -1062,15 +1296,24 @@
10621296 /* remove beacon and probe response */
10631297 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
10641298 RCU_INIT_POINTER(sdata->u.ap.probe_resp, NULL);
1299
+ RCU_INIT_POINTER(sdata->u.ap.fils_discovery, NULL);
1300
+ RCU_INIT_POINTER(sdata->u.ap.unsol_bcast_probe_resp, NULL);
10651301 kfree_rcu(old_beacon, rcu_head);
10661302 if (old_probe_resp)
10671303 kfree_rcu(old_probe_resp, rcu_head);
1068
- sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
1304
+ if (old_fils_discovery)
1305
+ kfree_rcu(old_fils_discovery, rcu_head);
1306
+ if (old_unsol_bcast_probe_resp)
1307
+ kfree_rcu(old_unsol_bcast_probe_resp, rcu_head);
1308
+
1309
+ kfree(sdata->vif.bss_conf.ftmr_params);
1310
+ sdata->vif.bss_conf.ftmr_params = NULL;
10691311
10701312 __sta_info_flush(sdata, true);
10711313 ieee80211_free_keys(sdata, true);
10721314
10731315 sdata->vif.bss_conf.enable_beacon = false;
1316
+ sdata->beacon_rate_set = false;
10741317 sdata->vif.bss_conf.ssid_len = 0;
10751318 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
10761319 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
....@@ -1176,6 +1419,11 @@
11761419 ieee80211_mps_sta_status_update(sta);
11771420 changed |= ieee80211_mps_set_sta_local_pm(sta,
11781421 sdata->u.mesh.mshcfg.power_mode);
1422
+
1423
+ ewma_mesh_tx_rate_avg_init(&sta->mesh->tx_rate_avg);
1424
+ /* init at low value */
1425
+ ewma_mesh_tx_rate_avg_add(&sta->mesh->tx_rate_avg, 10);
1426
+
11791427 break;
11801428 case NL80211_PLINK_LISTEN:
11811429 case NL80211_PLINK_BLOCKED:
....@@ -1357,7 +1605,16 @@
13571605 if (params->listen_interval >= 0)
13581606 sta->listen_interval = params->listen_interval;
13591607
1360
- if (params->supported_rates) {
1608
+ if (params->sta_modify_mask & STATION_PARAM_APPLY_STA_TXPOWER) {
1609
+ sta->sta.txpwr.type = params->txpwr.type;
1610
+ if (params->txpwr.type == NL80211_TX_POWER_LIMITED)
1611
+ sta->sta.txpwr.power = params->txpwr.power;
1612
+ ret = drv_sta_set_txpwr(local, sdata, sta);
1613
+ if (ret)
1614
+ return ret;
1615
+ }
1616
+
1617
+ if (params->supported_rates && params->supported_rates_len) {
13611618 ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
13621619 sband, params->supported_rates,
13631620 params->supported_rates_len,
....@@ -1376,7 +1633,9 @@
13761633 if (params->he_capa)
13771634 ieee80211_he_cap_ie_to_sta_he_cap(sdata, sband,
13781635 (void *)params->he_capa,
1379
- params->he_capa_len, sta);
1636
+ params->he_capa_len,
1637
+ (void *)params->he_6ghz_capa,
1638
+ sta);
13801639
13811640 if (params->opmode_notif_used) {
13821641 /* returned value is only needed for rc update, but the
....@@ -1391,6 +1650,9 @@
13911650
13921651 if (ieee80211_vif_is_mesh(&sdata->vif))
13931652 sta_apply_mesh_params(local, sta, params);
1653
+
1654
+ if (params->airtime_weight)
1655
+ sta->airtime_weight = params->airtime_weight;
13941656
13951657 /* set the STA state after all sta info from usermode has been set */
13961658 if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) ||
....@@ -1424,7 +1686,7 @@
14241686 if (ether_addr_equal(mac, sdata->vif.addr))
14251687 return -EINVAL;
14261688
1427
- if (is_multicast_ether_addr(mac))
1689
+ if (!is_valid_ether_addr(mac))
14281690 return -EINVAL;
14291691
14301692 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER) &&
....@@ -1545,6 +1807,7 @@
15451807
15461808 rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
15471809 __ieee80211_check_fast_rx_iface(vlansdata);
1810
+ drv_sta_set_4addr(local, sta->sdata, &sta->sta, true);
15481811 }
15491812
15501813 if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
....@@ -1571,20 +1834,6 @@
15711834 goto out_err;
15721835
15731836 mutex_unlock(&local->sta_mtx);
1574
-
1575
- if ((sdata->vif.type == NL80211_IFTYPE_AP ||
1576
- sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
1577
- sta->known_smps_mode != sta->sdata->bss->req_smps &&
1578
- test_sta_flag(sta, WLAN_STA_AUTHORIZED) &&
1579
- sta_info_tx_streams(sta) != 1) {
1580
- ht_dbg(sta->sdata,
1581
- "%pM just authorized and MIMO capable - update SMPS\n",
1582
- sta->sta.addr);
1583
- ieee80211_send_smps_action(sta->sdata,
1584
- sta->sdata->bss->req_smps,
1585
- sta->sta.addr,
1586
- sta->sdata->vif.bss_conf.bssid);
1587
- }
15881837
15891838 if (sdata->vif.type == NL80211_IFTYPE_STATION &&
15901839 params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
....@@ -1688,7 +1937,9 @@
16881937 MPATH_INFO_EXPTIME |
16891938 MPATH_INFO_DISCOVERY_TIMEOUT |
16901939 MPATH_INFO_DISCOVERY_RETRIES |
1691
- MPATH_INFO_FLAGS;
1940
+ MPATH_INFO_FLAGS |
1941
+ MPATH_INFO_HOP_COUNT |
1942
+ MPATH_INFO_PATH_CHANGE;
16921943
16931944 pinfo->frame_qlen = mpath->frame_queue.qlen;
16941945 pinfo->sn = mpath->sn;
....@@ -1708,6 +1959,8 @@
17081959 pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
17091960 if (mpath->flags & MESH_PATH_RESOLVED)
17101961 pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
1962
+ pinfo->hop_count = mpath->hop_count;
1963
+ pinfo->path_change_count = mpath->path_change_count;
17111964 }
17121965
17131966 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
....@@ -1823,13 +2076,12 @@
18232076 const struct mesh_setup *setup)
18242077 {
18252078 u8 *new_ie;
1826
- const u8 *old_ie;
18272079 struct ieee80211_sub_if_data *sdata = container_of(ifmsh,
18282080 struct ieee80211_sub_if_data, u.mesh);
2081
+ int i;
18292082
18302083 /* allocate information elements */
18312084 new_ie = NULL;
1832
- old_ie = ifmsh->ie;
18332085
18342086 if (setup->ie_len) {
18352087 new_ie = kmemdup(setup->ie, setup->ie_len,
....@@ -1839,7 +2091,6 @@
18392091 }
18402092 ifmsh->ie_len = setup->ie_len;
18412093 ifmsh->ie = new_ie;
1842
- kfree(old_ie);
18432094
18442095 /* now copy the rest of the setup parameters */
18452096 ifmsh->mesh_id_len = setup->mesh_id_len;
....@@ -1863,6 +2114,17 @@
18632114
18642115 sdata->vif.bss_conf.beacon_int = setup->beacon_interval;
18652116 sdata->vif.bss_conf.dtim_period = setup->dtim_period;
2117
+
2118
+ sdata->beacon_rate_set = false;
2119
+ if (wiphy_ext_feature_isset(sdata->local->hw.wiphy,
2120
+ NL80211_EXT_FEATURE_BEACON_RATE_LEGACY)) {
2121
+ for (i = 0; i < NUM_NL80211_BANDS; i++) {
2122
+ sdata->beacon_rateidx_mask[i] =
2123
+ setup->beacon_rate.control[i].legacy;
2124
+ if (sdata->beacon_rateidx_mask[i])
2125
+ sdata->beacon_rate_set = true;
2126
+ }
2127
+ }
18662128
18672129 return 0;
18682130 }
....@@ -1974,6 +2236,14 @@
19742236 nconf->dot11MeshAwakeWindowDuration;
19752237 if (_chg_mesh_attr(NL80211_MESHCONF_PLINK_TIMEOUT, mask))
19762238 conf->plink_timeout = nconf->plink_timeout;
2239
+ if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_GATE, mask))
2240
+ conf->dot11MeshConnectedToMeshGate =
2241
+ nconf->dot11MeshConnectedToMeshGate;
2242
+ if (_chg_mesh_attr(NL80211_MESHCONF_NOLEARN, mask))
2243
+ conf->dot11MeshNolearn = nconf->dot11MeshNolearn;
2244
+ if (_chg_mesh_attr(NL80211_MESHCONF_CONNECTED_TO_AS, mask))
2245
+ conf->dot11MeshConnectedToAuthServer =
2246
+ nconf->dot11MeshConnectedToAuthServer;
19772247 ieee80211_mbss_info_change_notify(sdata, BSS_CHANGED_BEACON);
19782248 return 0;
19792249 }
....@@ -2047,7 +2317,8 @@
20472317 }
20482318
20492319 if (!sdata->vif.bss_conf.use_short_slot &&
2050
- sband->band == NL80211_BAND_5GHZ) {
2320
+ (sband->band == NL80211_BAND_5GHZ ||
2321
+ sband->band == NL80211_BAND_6GHZ)) {
20512322 sdata->vif.bss_conf.use_short_slot = true;
20522323 changed |= BSS_CHANGED_ERP_SLOT;
20532324 }
....@@ -2184,7 +2455,7 @@
21842455 * for now fall through to allow scanning only when
21852456 * beaconing hasn't been configured yet
21862457 */
2187
- /* fall through */
2458
+ fallthrough;
21882459 case NL80211_IFTYPE_AP:
21892460 /*
21902461 * If the scan has been forced (and the driver supports
....@@ -2511,74 +2782,6 @@
25112782 }
25122783 #endif
25132784
2514
-int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
2515
- enum ieee80211_smps_mode smps_mode)
2516
-{
2517
- struct sta_info *sta;
2518
- enum ieee80211_smps_mode old_req;
2519
-
2520
- if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP))
2521
- return -EINVAL;
2522
-
2523
- if (sdata->vif.bss_conf.chandef.width == NL80211_CHAN_WIDTH_20_NOHT)
2524
- return 0;
2525
-
2526
- old_req = sdata->u.ap.req_smps;
2527
- sdata->u.ap.req_smps = smps_mode;
2528
-
2529
- /* AUTOMATIC doesn't mean much for AP - don't allow it */
2530
- if (old_req == smps_mode ||
2531
- smps_mode == IEEE80211_SMPS_AUTOMATIC)
2532
- return 0;
2533
-
2534
- ht_dbg(sdata,
2535
- "SMPS %d requested in AP mode, sending Action frame to %d stations\n",
2536
- smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta));
2537
-
2538
- mutex_lock(&sdata->local->sta_mtx);
2539
- list_for_each_entry(sta, &sdata->local->sta_list, list) {
2540
- /*
2541
- * Only stations associated to our AP and
2542
- * associated VLANs
2543
- */
2544
- if (sta->sdata->bss != &sdata->u.ap)
2545
- continue;
2546
-
2547
- /* This station doesn't support MIMO - skip it */
2548
- if (sta_info_tx_streams(sta) == 1)
2549
- continue;
2550
-
2551
- /*
2552
- * Don't wake up a STA just to send the action frame
2553
- * unless we are getting more restrictive.
2554
- */
2555
- if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
2556
- !ieee80211_smps_is_restrictive(sta->known_smps_mode,
2557
- smps_mode)) {
2558
- ht_dbg(sdata, "Won't send SMPS to sleeping STA %pM\n",
2559
- sta->sta.addr);
2560
- continue;
2561
- }
2562
-
2563
- /*
2564
- * If the STA is not authorized, wait until it gets
2565
- * authorized and the action frame will be sent then.
2566
- */
2567
- if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
2568
- continue;
2569
-
2570
- ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr);
2571
- ieee80211_send_smps_action(sdata, smps_mode, sta->sta.addr,
2572
- sdata->vif.bss_conf.bssid);
2573
- }
2574
- mutex_unlock(&sdata->local->sta_mtx);
2575
-
2576
- sdata->smps_mode = smps_mode;
2577
- ieee80211_queue_work(&sdata->local->hw, &sdata->recalc_smps);
2578
-
2579
- return 0;
2580
-}
2581
-
25822785 int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
25832786 enum ieee80211_smps_mode smps_mode)
25842787 {
....@@ -2860,7 +3063,7 @@
28603063
28613064 len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
28623065 beacon->proberesp_ies_len + beacon->assocresp_ies_len +
2863
- beacon->probe_resp_len;
3066
+ beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len;
28643067
28653068 new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
28663069 if (!new_beacon)
....@@ -2902,6 +3105,21 @@
29023105 new_beacon->probe_resp = pos;
29033106 memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
29043107 pos += beacon->probe_resp_len;
3108
+ }
3109
+
3110
+ /* might copy -1, meaning no changes requested */
3111
+ new_beacon->ftm_responder = beacon->ftm_responder;
3112
+ if (beacon->lci) {
3113
+ new_beacon->lci_len = beacon->lci_len;
3114
+ new_beacon->lci = pos;
3115
+ memcpy(pos, beacon->lci, beacon->lci_len);
3116
+ pos += beacon->lci_len;
3117
+ }
3118
+ if (beacon->civicloc) {
3119
+ new_beacon->civicloc_len = beacon->civicloc_len;
3120
+ new_beacon->civicloc = pos;
3121
+ memcpy(pos, beacon->civicloc, beacon->civicloc_len);
3122
+ pos += beacon->civicloc_len;
29053123 }
29063124
29073125 return new_beacon;
....@@ -3079,9 +3297,9 @@
30793297 break;
30803298
30813299 if ((params->n_counter_offsets_beacon >
3082
- IEEE80211_MAX_CSA_COUNTERS_NUM) ||
3300
+ IEEE80211_MAX_CNTDWN_COUNTERS_NUM) ||
30833301 (params->n_counter_offsets_presp >
3084
- IEEE80211_MAX_CSA_COUNTERS_NUM))
3302
+ IEEE80211_MAX_CNTDWN_COUNTERS_NUM))
30853303 return -EINVAL;
30863304
30873305 csa.counter_offsets_beacon = params->counter_offsets_beacon;
....@@ -3138,9 +3356,6 @@
31383356 #ifdef CONFIG_MAC80211_MESH
31393357 case NL80211_IFTYPE_MESH_POINT: {
31403358 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
3141
-
3142
- if (params->chandef.width != sdata->vif.bss_conf.chandef.width)
3143
- return -EINVAL;
31443359
31453360 /* changes into another band are not supported */
31463361 if (sdata->vif.bss_conf.chandef.chan->band !=
....@@ -3212,6 +3427,12 @@
32123427 lockdep_is_held(&local->chanctx_mtx));
32133428 if (!conf) {
32143429 err = -EBUSY;
3430
+ goto out;
3431
+ }
3432
+
3433
+ if (params->chandef.chan->freq_offset) {
3434
+ /* this may work, but is untested */
3435
+ err = -EOPNOTSUPP;
32153436 goto out;
32163437 }
32173438
....@@ -3310,7 +3531,7 @@
33103531
33113532 spin_lock_irqsave(&local->ack_status_lock, spin_flags);
33123533 id = idr_alloc(&local->ack_status_frames, ack_skb,
3313
- 1, 0x10000, GFP_ATOMIC);
3534
+ 1, 0x2000, GFP_ATOMIC);
33143535 spin_unlock_irqrestore(&local->ack_status_lock, spin_flags);
33153536
33163537 if (id < 0) {
....@@ -3326,41 +3547,43 @@
33263547 return 0;
33273548 }
33283549
3329
-static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
3550
+static void
3551
+ieee80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
33303552 struct wireless_dev *wdev,
3331
- u16 frame_type, bool reg)
3553
+ struct mgmt_frame_regs *upd)
33323554 {
33333555 struct ieee80211_local *local = wiphy_priv(wiphy);
33343556 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3557
+ u32 preq_mask = BIT(IEEE80211_STYPE_PROBE_REQ >> 4);
3558
+ u32 action_mask = BIT(IEEE80211_STYPE_ACTION >> 4);
3559
+ bool global_change, intf_change;
33353560
3336
- switch (frame_type) {
3337
- case IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ:
3338
- if (reg) {
3339
- local->probe_req_reg++;
3340
- sdata->vif.probe_req_reg++;
3341
- } else {
3342
- if (local->probe_req_reg)
3343
- local->probe_req_reg--;
3561
+ global_change =
3562
+ (local->probe_req_reg != !!(upd->global_stypes & preq_mask)) ||
3563
+ (local->rx_mcast_action_reg !=
3564
+ !!(upd->global_mcast_stypes & action_mask));
3565
+ local->probe_req_reg = upd->global_stypes & preq_mask;
3566
+ local->rx_mcast_action_reg = upd->global_mcast_stypes & action_mask;
33443567
3345
- if (sdata->vif.probe_req_reg)
3346
- sdata->vif.probe_req_reg--;
3347
- }
3568
+ intf_change = (sdata->vif.probe_req_reg !=
3569
+ !!(upd->interface_stypes & preq_mask)) ||
3570
+ (sdata->vif.rx_mcast_action_reg !=
3571
+ !!(upd->interface_mcast_stypes & action_mask));
3572
+ sdata->vif.probe_req_reg = upd->interface_stypes & preq_mask;
3573
+ sdata->vif.rx_mcast_action_reg =
3574
+ upd->interface_mcast_stypes & action_mask;
33483575
3349
- if (!local->open_count)
3350
- break;
3576
+ if (!local->open_count)
3577
+ return;
33513578
3352
- if (sdata->vif.probe_req_reg == 1)
3353
- drv_config_iface_filter(local, sdata, FIF_PROBE_REQ,
3354
- FIF_PROBE_REQ);
3355
- else if (sdata->vif.probe_req_reg == 0)
3356
- drv_config_iface_filter(local, sdata, 0,
3357
- FIF_PROBE_REQ);
3579
+ if (intf_change && ieee80211_sdata_running(sdata))
3580
+ drv_config_iface_filter(local, sdata,
3581
+ sdata->vif.probe_req_reg ?
3582
+ FIF_PROBE_REQ : 0,
3583
+ FIF_PROBE_REQ);
33583584
3585
+ if (global_change)
33593586 ieee80211_configure_filter(local);
3360
- break;
3361
- default:
3362
- break;
3363
- }
33643587 }
33653588
33663589 static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
....@@ -3476,7 +3699,7 @@
34763699 }
34773700
34783701 local_bh_disable();
3479
- ieee80211_xmit(sdata, sta, skb, 0);
3702
+ ieee80211_xmit(sdata, sta, skb);
34803703 local_bh_enable();
34813704
34823705 ret = 0;
....@@ -3793,6 +4016,91 @@
37934016 return ret;
37944017 }
37954018
4019
+static int
4020
+ieee80211_get_ftm_responder_stats(struct wiphy *wiphy,
4021
+ struct net_device *dev,
4022
+ struct cfg80211_ftm_responder_stats *ftm_stats)
4023
+{
4024
+ struct ieee80211_local *local = wiphy_priv(wiphy);
4025
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
4026
+
4027
+ return drv_get_ftm_responder_stats(local, sdata, ftm_stats);
4028
+}
4029
+
4030
+static int
4031
+ieee80211_start_pmsr(struct wiphy *wiphy, struct wireless_dev *dev,
4032
+ struct cfg80211_pmsr_request *request)
4033
+{
4034
+ struct ieee80211_local *local = wiphy_priv(wiphy);
4035
+ struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev);
4036
+
4037
+ return drv_start_pmsr(local, sdata, request);
4038
+}
4039
+
4040
+static void
4041
+ieee80211_abort_pmsr(struct wiphy *wiphy, struct wireless_dev *dev,
4042
+ struct cfg80211_pmsr_request *request)
4043
+{
4044
+ struct ieee80211_local *local = wiphy_priv(wiphy);
4045
+ struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(dev);
4046
+
4047
+ return drv_abort_pmsr(local, sdata, request);
4048
+}
4049
+
4050
+static int ieee80211_set_tid_config(struct wiphy *wiphy,
4051
+ struct net_device *dev,
4052
+ struct cfg80211_tid_config *tid_conf)
4053
+{
4054
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
4055
+ struct sta_info *sta;
4056
+ int ret;
4057
+
4058
+ if (!sdata->local->ops->set_tid_config)
4059
+ return -EOPNOTSUPP;
4060
+
4061
+ if (!tid_conf->peer)
4062
+ return drv_set_tid_config(sdata->local, sdata, NULL, tid_conf);
4063
+
4064
+ mutex_lock(&sdata->local->sta_mtx);
4065
+ sta = sta_info_get_bss(sdata, tid_conf->peer);
4066
+ if (!sta) {
4067
+ mutex_unlock(&sdata->local->sta_mtx);
4068
+ return -ENOENT;
4069
+ }
4070
+
4071
+ ret = drv_set_tid_config(sdata->local, sdata, &sta->sta, tid_conf);
4072
+ mutex_unlock(&sdata->local->sta_mtx);
4073
+
4074
+ return ret;
4075
+}
4076
+
4077
+static int ieee80211_reset_tid_config(struct wiphy *wiphy,
4078
+ struct net_device *dev,
4079
+ const u8 *peer, u8 tids)
4080
+{
4081
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
4082
+ struct sta_info *sta;
4083
+ int ret;
4084
+
4085
+ if (!sdata->local->ops->reset_tid_config)
4086
+ return -EOPNOTSUPP;
4087
+
4088
+ if (!peer)
4089
+ return drv_reset_tid_config(sdata->local, sdata, NULL, tids);
4090
+
4091
+ mutex_lock(&sdata->local->sta_mtx);
4092
+ sta = sta_info_get_bss(sdata, peer);
4093
+ if (!sta) {
4094
+ mutex_unlock(&sdata->local->sta_mtx);
4095
+ return -ENOENT;
4096
+ }
4097
+
4098
+ ret = drv_reset_tid_config(sdata->local, sdata, &sta->sta, tids);
4099
+ mutex_unlock(&sdata->local->sta_mtx);
4100
+
4101
+ return ret;
4102
+}
4103
+
37964104 const struct cfg80211_ops mac80211_config_ops = {
37974105 .add_virtual_intf = ieee80211_add_iface,
37984106 .del_virtual_intf = ieee80211_del_iface,
....@@ -3804,6 +4112,7 @@
38044112 .get_key = ieee80211_get_key,
38054113 .set_default_key = ieee80211_config_default_key,
38064114 .set_default_mgmt_key = ieee80211_config_default_mgmt_key,
4115
+ .set_default_beacon_key = ieee80211_config_default_beacon_key,
38074116 .start_ap = ieee80211_start_ap,
38084117 .change_beacon = ieee80211_change_beacon,
38094118 .stop_ap = ieee80211_stop_ap,
....@@ -3859,7 +4168,8 @@
38594168 .mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
38604169 .set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
38614170 .set_cqm_rssi_range_config = ieee80211_set_cqm_rssi_range_config,
3862
- .mgmt_frame_register = ieee80211_mgmt_frame_register,
4171
+ .update_mgmt_frame_registrations =
4172
+ ieee80211_update_mgmt_frame_registrations,
38634173 .set_antenna = ieee80211_set_antenna,
38644174 .get_antenna = ieee80211_get_antenna,
38654175 .set_rekey_data = ieee80211_set_rekey_data,
....@@ -3888,4 +4198,10 @@
38884198 .set_multicast_to_unicast = ieee80211_set_multicast_to_unicast,
38894199 .tx_control_port = ieee80211_tx_control_port,
38904200 .get_txq_stats = ieee80211_get_txq_stats,
4201
+ .get_ftm_responder_stats = ieee80211_get_ftm_responder_stats,
4202
+ .start_pmsr = ieee80211_start_pmsr,
4203
+ .abort_pmsr = ieee80211_abort_pmsr,
4204
+ .probe_mesh_link = ieee80211_probe_mesh_link,
4205
+ .set_tid_config = ieee80211_set_tid_config,
4206
+ .reset_tid_config = ieee80211_reset_tid_config,
38914207 };