.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright 2002-2005, Instant802 Networks, Inc. |
---|
3 | 4 | * Copyright 2005, Devicescape Software, Inc. |
---|
4 | 5 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
---|
5 | 6 | * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> |
---|
6 | 7 | * Copyright 2013-2015 Intel Mobile Communications GmbH |
---|
7 | | - * Copyright (C) 2018 Intel Corporation |
---|
8 | | - * |
---|
9 | | - * This program is free software; you can redistribute it and/or modify |
---|
10 | | - * it under the terms of the GNU General Public License version 2 as |
---|
11 | | - * published by the Free Software Foundation. |
---|
| 8 | + * Copyright (C) 2018-2020 Intel Corporation |
---|
12 | 9 | */ |
---|
13 | 10 | |
---|
14 | 11 | #ifndef IEEE80211_I_H |
---|
.. | .. |
---|
96 | 93 | size_t supp_rates_len; |
---|
97 | 94 | struct ieee80211_rate *beacon_rate; |
---|
98 | 95 | |
---|
| 96 | + u32 vht_cap_info; |
---|
| 97 | + |
---|
99 | 98 | /* |
---|
100 | 99 | * During association, we save an ERP value from a probe response so |
---|
101 | 100 | * that we can feed ERP info to the driver when handling the |
---|
.. | .. |
---|
147 | 146 | #define TX_DROP ((__force ieee80211_tx_result) 1u) |
---|
148 | 147 | #define TX_QUEUED ((__force ieee80211_tx_result) 2u) |
---|
149 | 148 | |
---|
150 | | -#define IEEE80211_TX_NO_SEQNO BIT(0) |
---|
151 | 149 | #define IEEE80211_TX_UNICAST BIT(1) |
---|
152 | 150 | #define IEEE80211_TX_PS_BUFFERED BIT(2) |
---|
153 | 151 | |
---|
.. | .. |
---|
201 | 199 | }; |
---|
202 | 200 | |
---|
203 | 201 | struct ieee80211_rx_data { |
---|
204 | | - struct napi_struct *napi; |
---|
| 202 | + struct list_head *list; |
---|
205 | 203 | struct sk_buff *skb; |
---|
206 | 204 | struct ieee80211_local *local; |
---|
207 | 205 | struct ieee80211_sub_if_data *sdata; |
---|
.. | .. |
---|
250 | 248 | u8 *head, *tail; |
---|
251 | 249 | int head_len, tail_len; |
---|
252 | 250 | struct ieee80211_meshconf_ie *meshconf; |
---|
253 | | - u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM]; |
---|
254 | | - u8 csa_current_counter; |
---|
| 251 | + u16 cntdwn_counter_offsets[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; |
---|
| 252 | + u8 cntdwn_current_counter; |
---|
255 | 253 | struct rcu_head rcu_head; |
---|
256 | 254 | }; |
---|
257 | 255 | |
---|
258 | 256 | struct probe_resp { |
---|
259 | 257 | struct rcu_head rcu_head; |
---|
260 | 258 | int len; |
---|
261 | | - u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM]; |
---|
262 | | - u8 data[0]; |
---|
| 259 | + u16 cntdwn_counter_offsets[IEEE80211_MAX_CNTDWN_COUNTERS_NUM]; |
---|
| 260 | + u8 data[]; |
---|
| 261 | +}; |
---|
| 262 | + |
---|
| 263 | +struct fils_discovery_data { |
---|
| 264 | + struct rcu_head rcu_head; |
---|
| 265 | + int len; |
---|
| 266 | + u8 data[]; |
---|
| 267 | +}; |
---|
| 268 | + |
---|
| 269 | +struct unsol_bcast_probe_resp_data { |
---|
| 270 | + struct rcu_head rcu_head; |
---|
| 271 | + int len; |
---|
| 272 | + u8 data[]; |
---|
263 | 273 | }; |
---|
264 | 274 | |
---|
265 | 275 | struct ps_data { |
---|
.. | .. |
---|
277 | 287 | struct ieee80211_if_ap { |
---|
278 | 288 | struct beacon_data __rcu *beacon; |
---|
279 | 289 | struct probe_resp __rcu *probe_resp; |
---|
| 290 | + struct fils_discovery_data __rcu *fils_discovery; |
---|
| 291 | + struct unsol_bcast_probe_resp_data __rcu *unsol_bcast_probe_resp; |
---|
280 | 292 | |
---|
281 | 293 | /* to be used after channel switch. */ |
---|
282 | 294 | struct cfg80211_beacon_data *next_beacon; |
---|
.. | .. |
---|
284 | 296 | |
---|
285 | 297 | struct ps_data ps; |
---|
286 | 298 | atomic_t num_mcast_sta; /* number of stations receiving multicast */ |
---|
287 | | - enum ieee80211_smps_mode req_smps, /* requested smps mode */ |
---|
288 | | - driver_smps_mode; /* smps mode request */ |
---|
289 | 299 | |
---|
290 | | - struct work_struct request_smps_work; |
---|
291 | 300 | bool multicast_to_unicast; |
---|
292 | 301 | }; |
---|
293 | 302 | |
---|
.. | .. |
---|
365 | 374 | |
---|
366 | 375 | u8 key[WLAN_KEY_LEN_WEP104]; |
---|
367 | 376 | u8 key_len, key_idx; |
---|
368 | | - bool done; |
---|
| 377 | + bool done, waiting; |
---|
| 378 | + bool peer_confirmed; |
---|
369 | 379 | bool timeout_started; |
---|
370 | 380 | |
---|
371 | 381 | u16 sae_trans, sae_status; |
---|
.. | .. |
---|
444 | 454 | |
---|
445 | 455 | u8 bssid[ETH_ALEN] __aligned(2); |
---|
446 | 456 | |
---|
447 | | - u16 aid; |
---|
448 | | - |
---|
449 | 457 | bool powersave; /* powersave requested for this iface */ |
---|
450 | 458 | bool broken_ap; /* AP is broken -- turn off powersave */ |
---|
451 | 459 | bool have_beacon; |
---|
.. | .. |
---|
488 | 496 | unsigned int uapsd_max_sp_len; |
---|
489 | 497 | |
---|
490 | 498 | int wmm_last_param_set; |
---|
| 499 | + int mu_edca_last_param_set; |
---|
491 | 500 | |
---|
492 | 501 | u8 use_4addr; |
---|
493 | 502 | |
---|
.. | .. |
---|
524 | 533 | struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */ |
---|
525 | 534 | struct ieee80211_vht_cap vht_capa; /* configured VHT overrides */ |
---|
526 | 535 | struct ieee80211_vht_cap vht_capa_mask; /* Valid parts of vht_capa */ |
---|
| 536 | + struct ieee80211_s1g_cap s1g_capa; /* configured S1G overrides */ |
---|
| 537 | + struct ieee80211_s1g_cap s1g_capa_mask; /* valid s1g_capa bits */ |
---|
527 | 538 | |
---|
528 | 539 | /* TDLS support */ |
---|
529 | 540 | u8 tdls_peer[ETH_ALEN] __aligned(2); |
---|
.. | .. |
---|
543 | 554 | * get stuck in a downgraded situation and flush takes forever. |
---|
544 | 555 | */ |
---|
545 | 556 | struct delayed_work tx_tspec_wk; |
---|
| 557 | + |
---|
| 558 | + /* Information elements from the last transmitted (Re)Association |
---|
| 559 | + * Request frame. |
---|
| 560 | + */ |
---|
| 561 | + u8 *assoc_req_ies; |
---|
| 562 | + size_t assoc_req_ies_len; |
---|
546 | 563 | }; |
---|
547 | 564 | |
---|
548 | 565 | struct ieee80211_if_ibss { |
---|
.. | .. |
---|
627 | 644 | struct cfg80211_csa_settings settings; |
---|
628 | 645 | }; |
---|
629 | 646 | |
---|
| 647 | +/** |
---|
| 648 | + * struct mesh_table |
---|
| 649 | + * |
---|
| 650 | + * @known_gates: list of known mesh gates and their mpaths by the station. The |
---|
| 651 | + * gate's mpath may or may not be resolved and active. |
---|
| 652 | + * @gates_lock: protects updates to known_gates |
---|
| 653 | + * @rhead: the rhashtable containing struct mesh_paths, keyed by dest addr |
---|
| 654 | + * @walk_head: linked list containing all mesh_path objects |
---|
| 655 | + * @walk_lock: lock protecting walk_head |
---|
| 656 | + * @entries: number of entries in the table |
---|
| 657 | + */ |
---|
| 658 | +struct mesh_table { |
---|
| 659 | + struct hlist_head known_gates; |
---|
| 660 | + spinlock_t gates_lock; |
---|
| 661 | + struct rhashtable rhead; |
---|
| 662 | + struct hlist_head walk_head; |
---|
| 663 | + spinlock_t walk_lock; |
---|
| 664 | + atomic_t entries; /* Up to MAX_MESH_NEIGHBOURS */ |
---|
| 665 | +}; |
---|
| 666 | + |
---|
630 | 667 | struct ieee80211_if_mesh { |
---|
631 | 668 | struct timer_list housekeeping_timer; |
---|
632 | 669 | struct timer_list mesh_path_timer; |
---|
.. | .. |
---|
701 | 738 | /* offset from skb->data while building IE */ |
---|
702 | 739 | int meshconf_offset; |
---|
703 | 740 | |
---|
704 | | - struct mesh_table *mesh_paths; |
---|
705 | | - struct mesh_table *mpp_paths; /* Store paths for MPP&MAP */ |
---|
| 741 | + struct mesh_table mesh_paths; |
---|
| 742 | + struct mesh_table mpp_paths; /* Store paths for MPP&MAP */ |
---|
706 | 743 | int mesh_paths_generation; |
---|
707 | 744 | int mpp_paths_generation; |
---|
708 | 745 | }; |
---|
.. | .. |
---|
807 | 844 | IEEE80211_TXQ_STOP, |
---|
808 | 845 | IEEE80211_TXQ_AMPDU, |
---|
809 | 846 | IEEE80211_TXQ_NO_AMSDU, |
---|
| 847 | + IEEE80211_TXQ_STOP_NETIF_TX, |
---|
810 | 848 | }; |
---|
811 | 849 | |
---|
812 | 850 | /** |
---|
.. | .. |
---|
817 | 855 | * a fq_flow which is already owned by a different tin |
---|
818 | 856 | * @def_cvars: codel vars for @def_flow |
---|
819 | 857 | * @frags: used to keep fragments created after dequeue |
---|
| 858 | + * @schedule_order: used with ieee80211_local->active_txqs |
---|
| 859 | + * @schedule_round: counter to prevent infinite loops on TXQ scheduling |
---|
820 | 860 | */ |
---|
821 | 861 | struct txq_info { |
---|
822 | 862 | struct fq_tin tin; |
---|
.. | .. |
---|
824 | 864 | struct codel_vars def_cvars; |
---|
825 | 865 | struct codel_stats cstats; |
---|
826 | 866 | struct sk_buff_head frags; |
---|
| 867 | + struct list_head schedule_order; |
---|
| 868 | + u16 schedule_round; |
---|
827 | 869 | unsigned long flags; |
---|
828 | 870 | |
---|
829 | 871 | /* keep last! */ |
---|
.. | .. |
---|
881 | 923 | /* bit field of ACM bits (BIT(802.1D tag)) */ |
---|
882 | 924 | u8 wmm_acm; |
---|
883 | 925 | |
---|
884 | | - struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; |
---|
| 926 | + struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + |
---|
| 927 | + NUM_DEFAULT_MGMT_KEYS + |
---|
| 928 | + NUM_DEFAULT_BEACON_KEYS]; |
---|
885 | 929 | struct ieee80211_key __rcu *default_unicast_key; |
---|
886 | 930 | struct ieee80211_key __rcu *default_multicast_key; |
---|
887 | 931 | struct ieee80211_key __rcu *default_mgmt_key; |
---|
| 932 | + struct ieee80211_key __rcu *default_beacon_key; |
---|
888 | 933 | |
---|
889 | 934 | u16 sequence_number; |
---|
890 | 935 | __be16 control_port_protocol; |
---|
891 | 936 | bool control_port_no_encrypt; |
---|
| 937 | + bool control_port_no_preauth; |
---|
892 | 938 | bool control_port_over_nl80211; |
---|
893 | 939 | int encrypt_headroom; |
---|
894 | 940 | |
---|
.. | .. |
---|
940 | 986 | bool rc_has_vht_mcs_mask[NUM_NL80211_BANDS]; |
---|
941 | 987 | u16 rc_rateidx_vht_mcs_mask[NUM_NL80211_BANDS][NL80211_VHT_NSS_MAX]; |
---|
942 | 988 | |
---|
| 989 | + /* Beacon frame (non-MCS) rate (as a bitmap) */ |
---|
| 990 | + u32 beacon_rateidx_mask[NUM_NL80211_BANDS]; |
---|
| 991 | + bool beacon_rate_set; |
---|
| 992 | + |
---|
943 | 993 | union { |
---|
944 | 994 | struct ieee80211_if_ap ap; |
---|
945 | 995 | struct ieee80211_if_wds wds; |
---|
.. | .. |
---|
958 | 1008 | struct dentry *default_unicast_key; |
---|
959 | 1009 | struct dentry *default_multicast_key; |
---|
960 | 1010 | struct dentry *default_mgmt_key; |
---|
| 1011 | + struct dentry *default_beacon_key; |
---|
961 | 1012 | } debugfs; |
---|
962 | 1013 | #endif |
---|
963 | 1014 | |
---|
.. | .. |
---|
1072 | 1123 | * a scan complete for an aborted scan. |
---|
1073 | 1124 | * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being |
---|
1074 | 1125 | * cancelled. |
---|
| 1126 | + * @SCAN_BEACON_WAIT: Set whenever we're passive scanning because of radar/no-IR |
---|
| 1127 | + * and could send a probe request after receiving a beacon. |
---|
| 1128 | + * @SCAN_BEACON_DONE: Beacon received, we can now send a probe request |
---|
1075 | 1129 | */ |
---|
1076 | 1130 | enum { |
---|
1077 | 1131 | SCAN_SW_SCANNING, |
---|
.. | .. |
---|
1080 | 1134 | SCAN_COMPLETED, |
---|
1081 | 1135 | SCAN_ABORTED, |
---|
1082 | 1136 | SCAN_HW_CANCELLED, |
---|
| 1137 | + SCAN_BEACON_WAIT, |
---|
| 1138 | + SCAN_BEACON_DONE, |
---|
1083 | 1139 | }; |
---|
1084 | 1140 | |
---|
1085 | 1141 | /** |
---|
.. | .. |
---|
1114 | 1170 | struct codel_vars *cvars; |
---|
1115 | 1171 | struct codel_params cparams; |
---|
1116 | 1172 | |
---|
| 1173 | + /* protects active_txqs and txqi->schedule_order */ |
---|
| 1174 | + spinlock_t active_txq_lock[IEEE80211_NUM_ACS]; |
---|
| 1175 | + struct list_head active_txqs[IEEE80211_NUM_ACS]; |
---|
| 1176 | + u16 schedule_round[IEEE80211_NUM_ACS]; |
---|
| 1177 | + |
---|
| 1178 | + u16 airtime_flags; |
---|
| 1179 | + u32 aql_txq_limit_low[IEEE80211_NUM_ACS]; |
---|
| 1180 | + u32 aql_txq_limit_high[IEEE80211_NUM_ACS]; |
---|
| 1181 | + u32 aql_threshold; |
---|
| 1182 | + atomic_t aql_total_pending_airtime; |
---|
| 1183 | + |
---|
1117 | 1184 | const struct ieee80211_ops *ops; |
---|
1118 | 1185 | |
---|
1119 | 1186 | /* |
---|
.. | .. |
---|
1132 | 1199 | /* number of interfaces with corresponding FIF_ flags */ |
---|
1133 | 1200 | int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll, |
---|
1134 | 1201 | fif_probe_req; |
---|
1135 | | - int probe_req_reg; |
---|
| 1202 | + bool probe_req_reg; |
---|
| 1203 | + bool rx_mcast_action_reg; |
---|
1136 | 1204 | unsigned int filter_flags; /* FIF_* */ |
---|
1137 | 1205 | |
---|
1138 | 1206 | bool wiphy_ciphers_allocated; |
---|
.. | .. |
---|
1186 | 1254 | /* number of RX chains the hardware has */ |
---|
1187 | 1255 | u8 rx_chains; |
---|
1188 | 1256 | |
---|
| 1257 | + /* bitmap of which sbands were copied */ |
---|
| 1258 | + u8 sband_allocated; |
---|
| 1259 | + |
---|
1189 | 1260 | int tx_headroom; /* required headroom for hardware/radiotap */ |
---|
1190 | 1261 | |
---|
1191 | 1262 | /* Tasklet and skb queue to process calls from IRQ mode. All frames |
---|
.. | .. |
---|
1214 | 1285 | |
---|
1215 | 1286 | struct sk_buff_head pending[IEEE80211_MAX_QUEUES]; |
---|
1216 | 1287 | struct tasklet_struct tx_pending_tasklet; |
---|
| 1288 | + struct tasklet_struct wake_txqs_tasklet; |
---|
1217 | 1289 | |
---|
1218 | 1290 | atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES]; |
---|
1219 | 1291 | |
---|
.. | .. |
---|
1222 | 1294 | |
---|
1223 | 1295 | struct rate_control_ref *rate_ctrl; |
---|
1224 | 1296 | |
---|
1225 | | - struct crypto_cipher *wep_tx_tfm; |
---|
1226 | | - struct crypto_cipher *wep_rx_tfm; |
---|
| 1297 | + struct arc4_ctx wep_tx_ctx; |
---|
| 1298 | + struct arc4_ctx wep_rx_ctx; |
---|
1227 | 1299 | u32 wep_iv; |
---|
1228 | 1300 | |
---|
1229 | 1301 | /* see iface.c */ |
---|
.. | .. |
---|
1233 | 1305 | |
---|
1234 | 1306 | /* |
---|
1235 | 1307 | * Key mutex, protects sdata's key_list and sta_info's |
---|
1236 | | - * key pointers (write access, they're RCU.) |
---|
| 1308 | + * key pointers and ptk_idx (write access, they're RCU.) |
---|
1237 | 1309 | */ |
---|
1238 | 1310 | struct mutex key_mtx; |
---|
1239 | 1311 | |
---|
.. | .. |
---|
1319 | 1391 | */ |
---|
1320 | 1392 | |
---|
1321 | 1393 | bool pspolling; |
---|
1322 | | - bool offchannel_ps_enabled; |
---|
1323 | 1394 | /* |
---|
1324 | 1395 | * PS can only be enabled when we have exactly one managed |
---|
1325 | 1396 | * interface (and monitors) in PS, this then points there. |
---|
.. | .. |
---|
1348 | 1419 | struct dentry *rcdir; |
---|
1349 | 1420 | struct dentry *keys; |
---|
1350 | 1421 | } debugfs; |
---|
| 1422 | + bool force_tx_status; |
---|
1351 | 1423 | #endif |
---|
1352 | 1424 | |
---|
1353 | 1425 | /* |
---|
.. | .. |
---|
1417 | 1489 | u8 ttl; |
---|
1418 | 1490 | u16 pre_value; |
---|
1419 | 1491 | u16 reason_code; |
---|
| 1492 | + u32 max_switch_time; |
---|
1420 | 1493 | }; |
---|
1421 | 1494 | |
---|
1422 | 1495 | /* Parsed Information Elements */ |
---|
.. | .. |
---|
1432 | 1505 | const u8 *supp_rates; |
---|
1433 | 1506 | const u8 *ds_params; |
---|
1434 | 1507 | const struct ieee80211_tim_ie *tim; |
---|
1435 | | - const u8 *challenge; |
---|
1436 | 1508 | const u8 *rsn; |
---|
| 1509 | + const u8 *rsnx; |
---|
1437 | 1510 | const u8 *erp_info; |
---|
1438 | 1511 | const u8 *ext_supp_rates; |
---|
1439 | 1512 | const u8 *wmm_info; |
---|
.. | .. |
---|
1445 | 1518 | const struct ieee80211_meshconf_ie *mesh_config; |
---|
1446 | 1519 | const u8 *he_cap; |
---|
1447 | 1520 | const struct ieee80211_he_operation *he_operation; |
---|
| 1521 | + const struct ieee80211_he_spr *he_spr; |
---|
1448 | 1522 | const struct ieee80211_mu_edca_param_set *mu_edca_param_set; |
---|
| 1523 | + const struct ieee80211_he_6ghz_capa *he_6ghz_capa; |
---|
1449 | 1524 | const u8 *uora_element; |
---|
1450 | 1525 | const u8 *mesh_id; |
---|
1451 | 1526 | const u8 *peering; |
---|
.. | .. |
---|
1457 | 1532 | const struct ieee80211_channel_sw_ie *ch_switch_ie; |
---|
1458 | 1533 | const struct ieee80211_ext_chansw_ie *ext_chansw_ie; |
---|
1459 | 1534 | const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie; |
---|
| 1535 | + const u8 *max_channel_switch_time; |
---|
1460 | 1536 | const u8 *country_elem; |
---|
1461 | 1537 | const u8 *pwr_constr_elem; |
---|
1462 | 1538 | const u8 *cisco_dtpc_elem; |
---|
.. | .. |
---|
1465 | 1541 | const struct ieee80211_sec_chan_offs_ie *sec_chan_offs; |
---|
1466 | 1542 | struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie; |
---|
1467 | 1543 | const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie; |
---|
| 1544 | + const struct ieee80211_multiple_bssid_configuration *mbssid_config_ie; |
---|
| 1545 | + const struct ieee80211_bssid_index *bssid_index; |
---|
| 1546 | + u8 max_bssid_indicator; |
---|
| 1547 | + u8 dtim_count; |
---|
| 1548 | + u8 dtim_period; |
---|
| 1549 | + const struct ieee80211_addba_ext_ie *addba_ext_ie; |
---|
| 1550 | + const struct ieee80211_s1g_cap *s1g_capab; |
---|
| 1551 | + const struct ieee80211_s1g_oper_ie *s1g_oper; |
---|
| 1552 | + const struct ieee80211_s1g_bcn_compat_ie *s1g_bcn_compat; |
---|
| 1553 | + const struct ieee80211_aid_response_ie *aid_resp; |
---|
1468 | 1554 | |
---|
1469 | 1555 | /* length of them, respectively */ |
---|
1470 | 1556 | u8 ext_capab_len; |
---|
1471 | 1557 | u8 ssid_len; |
---|
1472 | 1558 | u8 supp_rates_len; |
---|
1473 | 1559 | u8 tim_len; |
---|
1474 | | - u8 challenge_len; |
---|
1475 | 1560 | u8 rsn_len; |
---|
| 1561 | + u8 rsnx_len; |
---|
1476 | 1562 | u8 ext_supp_rates_len; |
---|
1477 | 1563 | u8 wmm_info_len; |
---|
1478 | 1564 | u8 wmm_param_len; |
---|
.. | .. |
---|
1483 | 1569 | u8 prep_len; |
---|
1484 | 1570 | u8 perr_len; |
---|
1485 | 1571 | u8 country_elem_len; |
---|
| 1572 | + u8 bssid_index_len; |
---|
| 1573 | + |
---|
| 1574 | + void *nontx_profile; |
---|
1486 | 1575 | |
---|
1487 | 1576 | /* whether a parse error occurred while retrieving these elements */ |
---|
1488 | 1577 | bool parse_error; |
---|
.. | .. |
---|
1581 | 1670 | void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata); |
---|
1582 | 1671 | void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, |
---|
1583 | 1672 | struct sk_buff *skb); |
---|
| 1673 | +void ieee80211_sta_rx_queued_ext(struct ieee80211_sub_if_data *sdata, |
---|
| 1674 | + struct sk_buff *skb); |
---|
1584 | 1675 | void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata); |
---|
1585 | 1676 | void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata); |
---|
1586 | 1677 | void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata); |
---|
.. | .. |
---|
1642 | 1733 | struct ieee80211_rx_status *rx_status, |
---|
1643 | 1734 | struct ieee80211_mgmt *mgmt, |
---|
1644 | 1735 | size_t len, |
---|
1645 | | - struct ieee802_11_elems *elems, |
---|
1646 | 1736 | struct ieee80211_channel *channel); |
---|
1647 | 1737 | void ieee80211_rx_bss_put(struct ieee80211_local *local, |
---|
1648 | 1738 | struct ieee80211_bss *bss); |
---|
.. | .. |
---|
1680 | 1770 | struct cfg80211_csa_settings *params); |
---|
1681 | 1771 | |
---|
1682 | 1772 | /* interface handling */ |
---|
| 1773 | +#define MAC80211_SUPPORTED_FEATURES_TX (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | \ |
---|
| 1774 | + NETIF_F_HW_CSUM | NETIF_F_SG | \ |
---|
| 1775 | + NETIF_F_HIGHDMA | NETIF_F_GSO_SOFTWARE) |
---|
| 1776 | +#define MAC80211_SUPPORTED_FEATURES_RX (NETIF_F_RXCSUM) |
---|
| 1777 | +#define MAC80211_SUPPORTED_FEATURES (MAC80211_SUPPORTED_FEATURES_TX | \ |
---|
| 1778 | + MAC80211_SUPPORTED_FEATURES_RX) |
---|
| 1779 | + |
---|
1683 | 1780 | int ieee80211_iface_init(void); |
---|
1684 | 1781 | void ieee80211_iface_exit(void); |
---|
1685 | 1782 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
---|
.. | .. |
---|
1702 | 1799 | bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata); |
---|
1703 | 1800 | void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, |
---|
1704 | 1801 | bool update_bss); |
---|
| 1802 | +void ieee80211_recalc_offload(struct ieee80211_local *local); |
---|
1705 | 1803 | |
---|
1706 | 1804 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) |
---|
1707 | 1805 | { |
---|
.. | .. |
---|
1715 | 1813 | struct net_device *dev); |
---|
1716 | 1814 | netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, |
---|
1717 | 1815 | struct net_device *dev); |
---|
| 1816 | +netdev_tx_t ieee80211_subif_start_xmit_8023(struct sk_buff *skb, |
---|
| 1817 | + struct net_device *dev); |
---|
1718 | 1818 | void __ieee80211_subif_start_xmit(struct sk_buff *skb, |
---|
1719 | 1819 | struct net_device *dev, |
---|
1720 | 1820 | u32 info_flags, |
---|
1721 | | - u32 ctrl_flags); |
---|
| 1821 | + u32 ctrl_flags, |
---|
| 1822 | + u64 *cookie); |
---|
1722 | 1823 | void ieee80211_purge_tx_queue(struct ieee80211_hw *hw, |
---|
1723 | 1824 | struct sk_buff_head *skbs); |
---|
1724 | 1825 | struct sk_buff * |
---|
.. | .. |
---|
1726 | 1827 | struct sk_buff *skb, u32 info_flags); |
---|
1727 | 1828 | void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb, |
---|
1728 | 1829 | struct ieee80211_supported_band *sband, |
---|
1729 | | - int retry_count, int shift, bool send_to_cooked); |
---|
| 1830 | + int retry_count, int shift, bool send_to_cooked, |
---|
| 1831 | + struct ieee80211_tx_status *status); |
---|
1730 | 1832 | |
---|
1731 | 1833 | void ieee80211_check_fast_xmit(struct sta_info *sta); |
---|
1732 | 1834 | void ieee80211_check_fast_xmit_all(struct ieee80211_local *local); |
---|
.. | .. |
---|
1734 | 1836 | void ieee80211_clear_fast_xmit(struct sta_info *sta); |
---|
1735 | 1837 | int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev, |
---|
1736 | 1838 | const u8 *buf, size_t len, |
---|
1737 | | - const u8 *dest, __be16 proto, bool unencrypted); |
---|
| 1839 | + const u8 *dest, __be16 proto, bool unencrypted, |
---|
| 1840 | + u64 *cookie); |
---|
| 1841 | +int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev, |
---|
| 1842 | + const u8 *buf, size_t len); |
---|
1738 | 1843 | |
---|
1739 | 1844 | /* HT */ |
---|
1740 | 1845 | void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, |
---|
.. | .. |
---|
1761 | 1866 | void ___ieee80211_start_rx_ba_session(struct sta_info *sta, |
---|
1762 | 1867 | u8 dialog_token, u16 timeout, |
---|
1763 | 1868 | u16 start_seq_num, u16 ba_policy, u16 tid, |
---|
1764 | | - u16 buf_size, bool tx, bool auto_seq); |
---|
| 1869 | + u16 buf_size, bool tx, bool auto_seq, |
---|
| 1870 | + const struct ieee80211_addba_ext_ie *addbaext); |
---|
1765 | 1871 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, |
---|
1766 | 1872 | enum ieee80211_agg_stop_reason reason); |
---|
1767 | 1873 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, |
---|
.. | .. |
---|
1825 | 1931 | ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata, |
---|
1826 | 1932 | struct ieee80211_supported_band *sband, |
---|
1827 | 1933 | const u8 *he_cap_ie, u8 he_cap_len, |
---|
| 1934 | + const struct ieee80211_he_6ghz_capa *he_6ghz_capa, |
---|
1828 | 1935 | struct sta_info *sta); |
---|
| 1936 | +void |
---|
| 1937 | +ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif, |
---|
| 1938 | + const struct ieee80211_he_spr *he_spr_ie_elem); |
---|
| 1939 | + |
---|
| 1940 | +void |
---|
| 1941 | +ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif, |
---|
| 1942 | + const struct ieee80211_he_operation *he_op_ie_elem); |
---|
| 1943 | + |
---|
| 1944 | +/* S1G */ |
---|
| 1945 | +void ieee80211_s1g_sta_rate_init(struct sta_info *sta); |
---|
1829 | 1946 | |
---|
1830 | 1947 | /* Spectrum management */ |
---|
1831 | 1948 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, |
---|
.. | .. |
---|
1836 | 1953 | * @sdata: the sdata of the interface which has received the frame |
---|
1837 | 1954 | * @elems: parsed 802.11 elements received with the frame |
---|
1838 | 1955 | * @current_band: indicates the current band |
---|
| 1956 | + * @vht_cap_info: VHT capabilities of the transmitter |
---|
1839 | 1957 | * @sta_flags: contains information about own capabilities and restrictions |
---|
1840 | 1958 | * to decide which channel switch announcements can be accepted. Only the |
---|
1841 | 1959 | * following subset of &enum ieee80211_sta_flags are evaluated: |
---|
.. | .. |
---|
1850 | 1968 | int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata, |
---|
1851 | 1969 | struct ieee802_11_elems *elems, |
---|
1852 | 1970 | enum nl80211_band current_band, |
---|
| 1971 | + u32 vht_cap_info, |
---|
1853 | 1972 | u32 sta_flags, u8 *bssid, |
---|
1854 | 1973 | struct ieee80211_csa_ie *csa_ie); |
---|
1855 | 1974 | |
---|
.. | .. |
---|
1883 | 2002 | void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata, |
---|
1884 | 2003 | bool bss_notify, bool enable_qos); |
---|
1885 | 2004 | void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, |
---|
1886 | | - struct sta_info *sta, struct sk_buff *skb, |
---|
1887 | | - u32 txdata_flags); |
---|
| 2005 | + struct sta_info *sta, struct sk_buff *skb); |
---|
1888 | 2006 | |
---|
1889 | 2007 | void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata, |
---|
1890 | 2008 | struct sk_buff *skb, int tid, |
---|
1891 | | - enum nl80211_band band, u32 txdata_flags); |
---|
| 2009 | + enum nl80211_band band); |
---|
| 2010 | + |
---|
| 2011 | +/* sta_out needs to be checked for ERR_PTR() before using */ |
---|
| 2012 | +int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata, |
---|
| 2013 | + struct sk_buff *skb, |
---|
| 2014 | + struct sta_info **sta_out); |
---|
1892 | 2015 | |
---|
1893 | 2016 | static inline void |
---|
1894 | 2017 | ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata, |
---|
1895 | 2018 | struct sk_buff *skb, int tid, |
---|
1896 | | - enum nl80211_band band, u32 txdata_flags) |
---|
| 2019 | + enum nl80211_band band) |
---|
1897 | 2020 | { |
---|
1898 | 2021 | rcu_read_lock(); |
---|
1899 | | - __ieee80211_tx_skb_tid_band(sdata, skb, tid, band, txdata_flags); |
---|
| 2022 | + __ieee80211_tx_skb_tid_band(sdata, skb, tid, band); |
---|
1900 | 2023 | rcu_read_unlock(); |
---|
1901 | 2024 | } |
---|
1902 | 2025 | |
---|
.. | .. |
---|
1914 | 2037 | } |
---|
1915 | 2038 | |
---|
1916 | 2039 | __ieee80211_tx_skb_tid_band(sdata, skb, tid, |
---|
1917 | | - chanctx_conf->def.chan->band, 0); |
---|
| 2040 | + chanctx_conf->def.chan->band); |
---|
1918 | 2041 | rcu_read_unlock(); |
---|
1919 | 2042 | } |
---|
1920 | 2043 | |
---|
.. | .. |
---|
1927 | 2050 | |
---|
1928 | 2051 | u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, |
---|
1929 | 2052 | struct ieee802_11_elems *elems, |
---|
1930 | | - u64 filter, u32 crc); |
---|
| 2053 | + u64 filter, u32 crc, u8 *transmitter_bssid, |
---|
| 2054 | + u8 *bss_bssid); |
---|
1931 | 2055 | static inline void ieee802_11_parse_elems(const u8 *start, size_t len, |
---|
1932 | 2056 | bool action, |
---|
1933 | | - struct ieee802_11_elems *elems) |
---|
| 2057 | + struct ieee802_11_elems *elems, |
---|
| 2058 | + u8 *transmitter_bssid, |
---|
| 2059 | + u8 *bss_bssid) |
---|
1934 | 2060 | { |
---|
1935 | | - ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0); |
---|
| 2061 | + ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0, |
---|
| 2062 | + transmitter_bssid, bss_bssid); |
---|
1936 | 2063 | } |
---|
1937 | 2064 | |
---|
1938 | 2065 | |
---|
.. | .. |
---|
1949 | 2076 | void ieee80211_send_nullfunc(struct ieee80211_local *local, |
---|
1950 | 2077 | struct ieee80211_sub_if_data *sdata, |
---|
1951 | 2078 | bool powersave); |
---|
1952 | | -void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata, |
---|
1953 | | - struct ieee80211_hdr *hdr); |
---|
| 2079 | +void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local, |
---|
| 2080 | + struct ieee80211_sub_if_data *sdata); |
---|
1954 | 2081 | void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata, |
---|
1955 | 2082 | struct ieee80211_hdr *hdr, bool ack, u16 tx_time); |
---|
1956 | 2083 | |
---|
.. | .. |
---|
2034 | 2161 | struct ieee80211_sub_if_data *sdata); |
---|
2035 | 2162 | void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats, |
---|
2036 | 2163 | struct txq_info *txqi); |
---|
| 2164 | +void ieee80211_wake_txqs(unsigned long data); |
---|
2037 | 2165 | void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, |
---|
2038 | 2166 | u16 transaction, u16 auth_alg, u16 status, |
---|
2039 | 2167 | const u8 *extra, size_t extra_len, const u8 *bssid, |
---|
2040 | 2168 | const u8 *da, const u8 *key, u8 key_len, u8 key_idx, |
---|
2041 | 2169 | u32 tx_flags); |
---|
2042 | 2170 | void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata, |
---|
2043 | | - const u8 *bssid, u16 stype, u16 reason, |
---|
| 2171 | + const u8 *da, const u8 *bssid, |
---|
| 2172 | + u16 stype, u16 reason, |
---|
2044 | 2173 | bool send_frame, u8 *frame_buf); |
---|
2045 | 2174 | |
---|
2046 | 2175 | enum { |
---|
.. | .. |
---|
2049 | 2178 | IEEE80211_PROBE_FLAG_RANDOM_SN = BIT(2), |
---|
2050 | 2179 | }; |
---|
2051 | 2180 | |
---|
2052 | | -int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, |
---|
| 2181 | +int ieee80211_build_preq_ies(struct ieee80211_sub_if_data *sdata, u8 *buffer, |
---|
2053 | 2182 | size_t buffer_len, |
---|
2054 | 2183 | struct ieee80211_scan_ies *ie_desc, |
---|
2055 | 2184 | const u8 *ie, size_t ie_len, |
---|
.. | .. |
---|
2068 | 2197 | enum nl80211_band band, u32 *basic_rates); |
---|
2069 | 2198 | int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata, |
---|
2070 | 2199 | enum ieee80211_smps_mode smps_mode); |
---|
2071 | | -int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata, |
---|
2072 | | - enum ieee80211_smps_mode smps_mode); |
---|
2073 | 2200 | void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata); |
---|
2074 | 2201 | void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata); |
---|
2075 | 2202 | |
---|
.. | .. |
---|
2085 | 2212 | u32 cap); |
---|
2086 | 2213 | u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap, |
---|
2087 | 2214 | const struct cfg80211_chan_def *chandef); |
---|
| 2215 | +u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype); |
---|
2088 | 2216 | u8 *ieee80211_ie_build_he_cap(u8 *pos, |
---|
2089 | 2217 | const struct ieee80211_sta_he_cap *he_cap, |
---|
2090 | 2218 | u8 *end); |
---|
| 2219 | +void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata, |
---|
| 2220 | + struct sk_buff *skb); |
---|
| 2221 | +u8 *ieee80211_ie_build_he_oper(u8 *pos, struct cfg80211_chan_def *chandef); |
---|
2091 | 2222 | int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef, |
---|
2092 | 2223 | const struct ieee80211_supported_band *sband, |
---|
2093 | 2224 | const u8 *srates, int srates_len, u32 *rates); |
---|
.. | .. |
---|
2098 | 2229 | struct sk_buff *skb, bool need_basic, |
---|
2099 | 2230 | enum nl80211_band band); |
---|
2100 | 2231 | u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo); |
---|
| 2232 | +void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata, |
---|
| 2233 | + struct ieee80211_sta_s1g_cap *caps, |
---|
| 2234 | + struct sk_buff *skb); |
---|
| 2235 | +void ieee80211_add_aid_request_ie(struct ieee80211_sub_if_data *sdata, |
---|
| 2236 | + struct sk_buff *skb); |
---|
2101 | 2237 | |
---|
2102 | 2238 | /* channel management */ |
---|
2103 | 2239 | bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper, |
---|
2104 | 2240 | struct cfg80211_chan_def *chandef); |
---|
2105 | | -bool ieee80211_chandef_vht_oper(const struct ieee80211_vht_operation *oper, |
---|
| 2241 | +bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, u32 vht_cap_info, |
---|
| 2242 | + const struct ieee80211_vht_operation *oper, |
---|
| 2243 | + const struct ieee80211_ht_operation *htop, |
---|
| 2244 | + struct cfg80211_chan_def *chandef); |
---|
| 2245 | +bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_sub_if_data *sdata, |
---|
| 2246 | + const struct ieee80211_he_operation *he_oper, |
---|
| 2247 | + struct cfg80211_chan_def *chandef); |
---|
| 2248 | +bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie *oper, |
---|
2106 | 2249 | struct cfg80211_chan_def *chandef); |
---|
2107 | 2250 | u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c); |
---|
2108 | 2251 | |
---|
.. | .. |
---|
2182 | 2325 | void ieee80211_tdls_handle_disconnect(struct ieee80211_sub_if_data *sdata, |
---|
2183 | 2326 | const u8 *peer, u16 reason); |
---|
2184 | 2327 | const char *ieee80211_get_reason_code_string(u16 reason_code); |
---|
| 2328 | +u16 ieee80211_encode_usf(int val); |
---|
| 2329 | +u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len, |
---|
| 2330 | + enum nl80211_iftype type); |
---|
2185 | 2331 | |
---|
2186 | 2332 | extern const struct ethtool_ops ieee80211_ethtool_ops; |
---|
2187 | 2333 | |
---|
| 2334 | +u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw, |
---|
| 2335 | + struct ieee80211_vif *vif, |
---|
| 2336 | + struct ieee80211_sta *pubsta, |
---|
| 2337 | + int len, bool ampdu); |
---|
2188 | 2338 | #ifdef CONFIG_MAC80211_NOINLINE |
---|
2189 | 2339 | #define debug_noinline noinline |
---|
2190 | 2340 | #else |
---|