Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0-only */
2 : : /*
3 : : * Copyright 2002-2005, Instant802 Networks, Inc.
4 : : * Copyright 2005, Devicescape Software, Inc.
5 : : * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
6 : : * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net>
7 : : * Copyright 2013-2015 Intel Mobile Communications GmbH
8 : : * Copyright (C) 2018-2019 Intel Corporation
9 : : */
10 : :
11 : : #ifndef IEEE80211_I_H
12 : : #define IEEE80211_I_H
13 : :
14 : : #include <linux/kernel.h>
15 : : #include <linux/device.h>
16 : : #include <linux/if_ether.h>
17 : : #include <linux/interrupt.h>
18 : : #include <linux/list.h>
19 : : #include <linux/netdevice.h>
20 : : #include <linux/skbuff.h>
21 : : #include <linux/workqueue.h>
22 : : #include <linux/types.h>
23 : : #include <linux/spinlock.h>
24 : : #include <linux/etherdevice.h>
25 : : #include <linux/leds.h>
26 : : #include <linux/idr.h>
27 : : #include <linux/rhashtable.h>
28 : : #include <net/ieee80211_radiotap.h>
29 : : #include <net/cfg80211.h>
30 : : #include <net/mac80211.h>
31 : : #include <net/fq.h>
32 : : #include "key.h"
33 : : #include "sta_info.h"
34 : : #include "debug.h"
35 : :
36 : : extern const struct cfg80211_ops mac80211_config_ops;
37 : :
38 : : struct ieee80211_local;
39 : :
40 : : /* Maximum number of broadcast/multicast frames to buffer when some of the
41 : : * associated stations are using power saving. */
42 : : #define AP_MAX_BC_BUFFER 128
43 : :
44 : : /* Maximum number of frames buffered to all STAs, including multicast frames.
45 : : * Note: increasing this limit increases the potential memory requirement. Each
46 : : * frame can be up to about 2 kB long. */
47 : : #define TOTAL_MAX_TX_BUFFER 512
48 : :
49 : : /* Required encryption head and tailroom */
50 : : #define IEEE80211_ENCRYPT_HEADROOM 8
51 : : #define IEEE80211_ENCRYPT_TAILROOM 18
52 : :
53 : : /* IEEE 802.11 (Ch. 9.5 Defragmentation) requires support for concurrent
54 : : * reception of at least three fragmented frames. This limit can be increased
55 : : * by changing this define, at the cost of slower frame reassembly and
56 : : * increased memory use (about 2 kB of RAM per entry). */
57 : : #define IEEE80211_FRAGMENT_MAX 4
58 : :
59 : : /* power level hasn't been configured (or set to automatic) */
60 : : #define IEEE80211_UNSET_POWER_LEVEL INT_MIN
61 : :
62 : : /*
63 : : * Some APs experience problems when working with U-APSD. Decreasing the
64 : : * probability of that happening by using legacy mode for all ACs but VO isn't
65 : : * enough.
66 : : *
67 : : * Cisco 4410N originally forced us to enable VO by default only because it
68 : : * treated non-VO ACs as legacy.
69 : : *
70 : : * However some APs (notably Netgear R7000) silently reclassify packets to
71 : : * different ACs. Since u-APSD ACs require trigger frames for frame retrieval
72 : : * clients would never see some frames (e.g. ARP responses) or would fetch them
73 : : * accidentally after a long time.
74 : : *
75 : : * It makes little sense to enable u-APSD queues by default because it needs
76 : : * userspace applications to be aware of it to actually take advantage of the
77 : : * possible additional powersavings. Implicitly depending on driver autotrigger
78 : : * frame support doesn't make much sense.
79 : : */
80 : : #define IEEE80211_DEFAULT_UAPSD_QUEUES 0
81 : :
82 : : #define IEEE80211_DEFAULT_MAX_SP_LEN \
83 : : IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
84 : :
85 : : extern const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS];
86 : :
87 : : #define IEEE80211_DEAUTH_FRAME_LEN (24 /* hdr */ + 2 /* reason */)
88 : :
89 : : #define IEEE80211_MAX_NAN_INSTANCE_ID 255
90 : :
91 : : struct ieee80211_fragment_entry {
92 : : struct sk_buff_head skb_list;
93 : : unsigned long first_frag_time;
94 : : u16 seq;
95 : : u16 extra_len;
96 : : u16 last_frag;
97 : : u8 rx_queue;
98 : : bool check_sequential_pn; /* needed for CCMP/GCMP */
99 : : u8 last_pn[6]; /* PN of the last fragment if CCMP was used */
100 : : };
101 : :
102 : :
103 : : struct ieee80211_bss {
104 : : u32 device_ts_beacon, device_ts_presp;
105 : :
106 : : bool wmm_used;
107 : : bool uapsd_supported;
108 : :
109 : : #define IEEE80211_MAX_SUPP_RATES 32
110 : : u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
111 : : size_t supp_rates_len;
112 : : struct ieee80211_rate *beacon_rate;
113 : :
114 : : /*
115 : : * During association, we save an ERP value from a probe response so
116 : : * that we can feed ERP info to the driver when handling the
117 : : * association completes. these fields probably won't be up-to-date
118 : : * otherwise, you probably don't want to use them.
119 : : */
120 : : bool has_erp_value;
121 : : u8 erp_value;
122 : :
123 : : /* Keep track of the corruption of the last beacon/probe response. */
124 : : u8 corrupt_data;
125 : :
126 : : /* Keep track of what bits of information we have valid info for. */
127 : : u8 valid_data;
128 : : };
129 : :
130 : : /**
131 : : * enum ieee80211_corrupt_data_flags - BSS data corruption flags
132 : : * @IEEE80211_BSS_CORRUPT_BEACON: last beacon frame received was corrupted
133 : : * @IEEE80211_BSS_CORRUPT_PROBE_RESP: last probe response received was corrupted
134 : : *
135 : : * These are bss flags that are attached to a bss in the
136 : : * @corrupt_data field of &struct ieee80211_bss.
137 : : */
138 : : enum ieee80211_bss_corrupt_data_flags {
139 : : IEEE80211_BSS_CORRUPT_BEACON = BIT(0),
140 : : IEEE80211_BSS_CORRUPT_PROBE_RESP = BIT(1)
141 : : };
142 : :
143 : : /**
144 : : * enum ieee80211_valid_data_flags - BSS valid data flags
145 : : * @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
146 : : * @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
147 : : * @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
148 : : *
149 : : * These are bss flags that are attached to a bss in the
150 : : * @valid_data field of &struct ieee80211_bss. They show which parts
151 : : * of the data structure were received as a result of an un-corrupted
152 : : * beacon/probe response.
153 : : */
154 : : enum ieee80211_bss_valid_data_flags {
155 : : IEEE80211_BSS_VALID_WMM = BIT(1),
156 : : IEEE80211_BSS_VALID_RATES = BIT(2),
157 : : IEEE80211_BSS_VALID_ERP = BIT(3)
158 : : };
159 : :
160 : : typedef unsigned __bitwise ieee80211_tx_result;
161 : : #define TX_CONTINUE ((__force ieee80211_tx_result) 0u)
162 : : #define TX_DROP ((__force ieee80211_tx_result) 1u)
163 : : #define TX_QUEUED ((__force ieee80211_tx_result) 2u)
164 : :
165 : : #define IEEE80211_TX_NO_SEQNO BIT(0)
166 : : #define IEEE80211_TX_UNICAST BIT(1)
167 : : #define IEEE80211_TX_PS_BUFFERED BIT(2)
168 : :
169 : : struct ieee80211_tx_data {
170 : : struct sk_buff *skb;
171 : : struct sk_buff_head skbs;
172 : : struct ieee80211_local *local;
173 : : struct ieee80211_sub_if_data *sdata;
174 : : struct sta_info *sta;
175 : : struct ieee80211_key *key;
176 : : struct ieee80211_tx_rate rate;
177 : :
178 : : unsigned int flags;
179 : : };
180 : :
181 : :
182 : : typedef unsigned __bitwise ieee80211_rx_result;
183 : : #define RX_CONTINUE ((__force ieee80211_rx_result) 0u)
184 : : #define RX_DROP_UNUSABLE ((__force ieee80211_rx_result) 1u)
185 : : #define RX_DROP_MONITOR ((__force ieee80211_rx_result) 2u)
186 : : #define RX_QUEUED ((__force ieee80211_rx_result) 3u)
187 : :
188 : : /**
189 : : * enum ieee80211_packet_rx_flags - packet RX flags
190 : : * @IEEE80211_RX_AMSDU: a-MSDU packet
191 : : * @IEEE80211_RX_MALFORMED_ACTION_FRM: action frame is malformed
192 : : * @IEEE80211_RX_DEFERRED_RELEASE: frame was subjected to receive reordering
193 : : *
194 : : * These are per-frame flags that are attached to a frame in the
195 : : * @rx_flags field of &struct ieee80211_rx_status.
196 : : */
197 : : enum ieee80211_packet_rx_flags {
198 : : IEEE80211_RX_AMSDU = BIT(3),
199 : : IEEE80211_RX_MALFORMED_ACTION_FRM = BIT(4),
200 : : IEEE80211_RX_DEFERRED_RELEASE = BIT(5),
201 : : };
202 : :
203 : : /**
204 : : * enum ieee80211_rx_flags - RX data flags
205 : : *
206 : : * @IEEE80211_RX_CMNTR: received on cooked monitor already
207 : : * @IEEE80211_RX_BEACON_REPORTED: This frame was already reported
208 : : * to cfg80211_report_obss_beacon().
209 : : *
210 : : * These flags are used across handling multiple interfaces
211 : : * for a single frame.
212 : : */
213 : : enum ieee80211_rx_flags {
214 : : IEEE80211_RX_CMNTR = BIT(0),
215 : : IEEE80211_RX_BEACON_REPORTED = BIT(1),
216 : : };
217 : :
218 : : struct ieee80211_rx_data {
219 : : struct napi_struct *napi;
220 : : struct sk_buff *skb;
221 : : struct ieee80211_local *local;
222 : : struct ieee80211_sub_if_data *sdata;
223 : : struct sta_info *sta;
224 : : struct ieee80211_key *key;
225 : :
226 : : unsigned int flags;
227 : :
228 : : /*
229 : : * Index into sequence numbers array, 0..16
230 : : * since the last (16) is used for non-QoS,
231 : : * will be 16 on non-QoS frames.
232 : : */
233 : : int seqno_idx;
234 : :
235 : : /*
236 : : * Index into the security IV/PN arrays, 0..16
237 : : * since the last (16) is used for CCMP-encrypted
238 : : * management frames, will be set to 16 on mgmt
239 : : * frames and 0 on non-QoS frames.
240 : : */
241 : : int security_idx;
242 : :
243 : : u32 tkip_iv32;
244 : : u16 tkip_iv16;
245 : : };
246 : :
247 : : struct ieee80211_csa_settings {
248 : : const u16 *counter_offsets_beacon;
249 : : const u16 *counter_offsets_presp;
250 : :
251 : : int n_counter_offsets_beacon;
252 : : int n_counter_offsets_presp;
253 : :
254 : : u8 count;
255 : : };
256 : :
257 : : struct beacon_data {
258 : : u8 *head, *tail;
259 : : int head_len, tail_len;
260 : : struct ieee80211_meshconf_ie *meshconf;
261 : : u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM];
262 : : u8 csa_current_counter;
263 : : struct rcu_head rcu_head;
264 : : };
265 : :
266 : : struct probe_resp {
267 : : struct rcu_head rcu_head;
268 : : int len;
269 : : u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM];
270 : : u8 data[0];
271 : : };
272 : :
273 : : struct ps_data {
274 : : /* yes, this looks ugly, but guarantees that we can later use
275 : : * bitmap_empty :)
276 : : * NB: don't touch this bitmap, use sta_info_{set,clear}_tim_bit */
277 : : u8 tim[sizeof(unsigned long) * BITS_TO_LONGS(IEEE80211_MAX_AID + 1)]
278 : : __aligned(__alignof__(unsigned long));
279 : : struct sk_buff_head bc_buf;
280 : : atomic_t num_sta_ps; /* number of stations in PS mode */
281 : : int dtim_count;
282 : : bool dtim_bc_mc;
283 : : };
284 : :
285 : : struct ieee80211_if_ap {
286 : : struct beacon_data __rcu *beacon;
287 : : struct probe_resp __rcu *probe_resp;
288 : :
289 : : /* to be used after channel switch. */
290 : : struct cfg80211_beacon_data *next_beacon;
291 : : struct list_head vlans; /* write-protected with RTNL and local->mtx */
292 : :
293 : : struct ps_data ps;
294 : : atomic_t num_mcast_sta; /* number of stations receiving multicast */
295 : : enum ieee80211_smps_mode req_smps, /* requested smps mode */
296 : : driver_smps_mode; /* smps mode request */
297 : :
298 : : struct work_struct request_smps_work;
299 : : bool multicast_to_unicast;
300 : : };
301 : :
302 : : struct ieee80211_if_wds {
303 : : struct sta_info *sta;
304 : : u8 remote_addr[ETH_ALEN];
305 : : };
306 : :
307 : : struct ieee80211_if_vlan {
308 : : struct list_head list; /* write-protected with RTNL and local->mtx */
309 : :
310 : : /* used for all tx if the VLAN is configured to 4-addr mode */
311 : : struct sta_info __rcu *sta;
312 : : atomic_t num_mcast_sta; /* number of stations receiving multicast */
313 : : };
314 : :
315 : : struct mesh_stats {
316 : : __u32 fwded_mcast; /* Mesh forwarded multicast frames */
317 : : __u32 fwded_unicast; /* Mesh forwarded unicast frames */
318 : : __u32 fwded_frames; /* Mesh total forwarded frames */
319 : : __u32 dropped_frames_ttl; /* Not transmitted since mesh_ttl == 0*/
320 : : __u32 dropped_frames_no_route; /* Not transmitted, no route found */
321 : : __u32 dropped_frames_congestion;/* Not forwarded due to congestion */
322 : : };
323 : :
324 : : #define PREQ_Q_F_START 0x1
325 : : #define PREQ_Q_F_REFRESH 0x2
326 : : struct mesh_preq_queue {
327 : : struct list_head list;
328 : : u8 dst[ETH_ALEN];
329 : : u8 flags;
330 : : };
331 : :
332 : : struct ieee80211_roc_work {
333 : : struct list_head list;
334 : :
335 : : struct ieee80211_sub_if_data *sdata;
336 : :
337 : : struct ieee80211_channel *chan;
338 : :
339 : : bool started, abort, hw_begun, notified;
340 : : bool on_channel;
341 : :
342 : : unsigned long start_time;
343 : :
344 : : u32 duration, req_duration;
345 : : struct sk_buff *frame;
346 : : u64 cookie, mgmt_tx_cookie;
347 : : enum ieee80211_roc_type type;
348 : : };
349 : :
350 : : /* flags used in struct ieee80211_if_managed.flags */
351 : : enum ieee80211_sta_flags {
352 : : IEEE80211_STA_CONNECTION_POLL = BIT(1),
353 : : IEEE80211_STA_CONTROL_PORT = BIT(2),
354 : : IEEE80211_STA_DISABLE_HT = BIT(4),
355 : : IEEE80211_STA_MFP_ENABLED = BIT(6),
356 : : IEEE80211_STA_UAPSD_ENABLED = BIT(7),
357 : : IEEE80211_STA_NULLFUNC_ACKED = BIT(8),
358 : : IEEE80211_STA_RESET_SIGNAL_AVE = BIT(9),
359 : : IEEE80211_STA_DISABLE_40MHZ = BIT(10),
360 : : IEEE80211_STA_DISABLE_VHT = BIT(11),
361 : : IEEE80211_STA_DISABLE_80P80MHZ = BIT(12),
362 : : IEEE80211_STA_DISABLE_160MHZ = BIT(13),
363 : : IEEE80211_STA_DISABLE_WMM = BIT(14),
364 : : IEEE80211_STA_ENABLE_RRM = BIT(15),
365 : : IEEE80211_STA_DISABLE_HE = BIT(16),
366 : : };
367 : :
368 : : struct ieee80211_mgd_auth_data {
369 : : struct cfg80211_bss *bss;
370 : : unsigned long timeout;
371 : : int tries;
372 : : u16 algorithm, expected_transaction;
373 : :
374 : : u8 key[WLAN_KEY_LEN_WEP104];
375 : : u8 key_len, key_idx;
376 : : bool done;
377 : : bool peer_confirmed;
378 : : bool timeout_started;
379 : :
380 : : u16 sae_trans, sae_status;
381 : : size_t data_len;
382 : : u8 data[];
383 : : };
384 : :
385 : : struct ieee80211_mgd_assoc_data {
386 : : struct cfg80211_bss *bss;
387 : : const u8 *supp_rates;
388 : :
389 : : unsigned long timeout;
390 : : int tries;
391 : :
392 : : u16 capability;
393 : : u8 prev_bssid[ETH_ALEN];
394 : : u8 ssid[IEEE80211_MAX_SSID_LEN];
395 : : u8 ssid_len;
396 : : u8 supp_rates_len;
397 : : bool wmm, uapsd;
398 : : bool need_beacon;
399 : : bool synced;
400 : : bool timeout_started;
401 : :
402 : : u8 ap_ht_param;
403 : :
404 : : struct ieee80211_vht_cap ap_vht_cap;
405 : :
406 : : u8 fils_nonces[2 * FILS_NONCE_LEN];
407 : : u8 fils_kek[FILS_MAX_KEK_LEN];
408 : : size_t fils_kek_len;
409 : :
410 : : size_t ie_len;
411 : : u8 ie[];
412 : : };
413 : :
414 : : struct ieee80211_sta_tx_tspec {
415 : : /* timestamp of the first packet in the time slice */
416 : : unsigned long time_slice_start;
417 : :
418 : : u32 admitted_time; /* in usecs, unlike over the air */
419 : : u8 tsid;
420 : : s8 up; /* signed to be able to invalidate with -1 during teardown */
421 : :
422 : : /* consumed TX time in microseconds in the time slice */
423 : : u32 consumed_tx_time;
424 : : enum {
425 : : TX_TSPEC_ACTION_NONE = 0,
426 : : TX_TSPEC_ACTION_DOWNGRADE,
427 : : TX_TSPEC_ACTION_STOP_DOWNGRADE,
428 : : } action;
429 : : bool downgraded;
430 : : };
431 : :
432 : 0 : DECLARE_EWMA(beacon_signal, 4, 4)
433 : :
434 : : struct ieee80211_if_managed {
435 : : struct timer_list timer;
436 : : struct timer_list conn_mon_timer;
437 : : struct timer_list bcn_mon_timer;
438 : : struct timer_list chswitch_timer;
439 : : struct work_struct monitor_work;
440 : : struct work_struct chswitch_work;
441 : : struct work_struct beacon_connection_loss_work;
442 : : struct work_struct csa_connection_drop_work;
443 : :
444 : : unsigned long beacon_timeout;
445 : : unsigned long probe_timeout;
446 : : int probe_send_count;
447 : : bool nullfunc_failed;
448 : : bool connection_loss;
449 : :
450 : : struct cfg80211_bss *associated;
451 : : struct ieee80211_mgd_auth_data *auth_data;
452 : : struct ieee80211_mgd_assoc_data *assoc_data;
453 : :
454 : : u8 bssid[ETH_ALEN] __aligned(2);
455 : :
456 : : u16 aid;
457 : :
458 : : bool powersave; /* powersave requested for this iface */
459 : : bool broken_ap; /* AP is broken -- turn off powersave */
460 : : bool have_beacon;
461 : : u8 dtim_period;
462 : : enum ieee80211_smps_mode req_smps, /* requested smps mode */
463 : : driver_smps_mode; /* smps mode request */
464 : :
465 : : struct work_struct request_smps_work;
466 : :
467 : : unsigned int flags;
468 : :
469 : : bool csa_waiting_bcn;
470 : : bool csa_ignored_same_chan;
471 : :
472 : : bool beacon_crc_valid;
473 : : u32 beacon_crc;
474 : :
475 : : bool status_acked;
476 : : bool status_received;
477 : : __le16 status_fc;
478 : :
479 : : enum {
480 : : IEEE80211_MFP_DISABLED,
481 : : IEEE80211_MFP_OPTIONAL,
482 : : IEEE80211_MFP_REQUIRED
483 : : } mfp; /* management frame protection */
484 : :
485 : : /*
486 : : * Bitmask of enabled u-apsd queues,
487 : : * IEEE80211_WMM_IE_STA_QOSINFO_AC_BE & co. Needs a new association
488 : : * to take effect.
489 : : */
490 : : unsigned int uapsd_queues;
491 : :
492 : : /*
493 : : * Maximum number of buffered frames AP can deliver during a
494 : : * service period, IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL or similar.
495 : : * Needs a new association to take effect.
496 : : */
497 : : unsigned int uapsd_max_sp_len;
498 : :
499 : : int wmm_last_param_set;
500 : : int mu_edca_last_param_set;
501 : :
502 : : u8 use_4addr;
503 : :
504 : : s16 p2p_noa_index;
505 : :
506 : : struct ewma_beacon_signal ave_beacon_signal;
507 : :
508 : : /*
509 : : * Number of Beacon frames used in ave_beacon_signal. This can be used
510 : : * to avoid generating less reliable cqm events that would be based
511 : : * only on couple of received frames.
512 : : */
513 : : unsigned int count_beacon_signal;
514 : :
515 : : /* Number of times beacon loss was invoked. */
516 : : unsigned int beacon_loss_count;
517 : :
518 : : /*
519 : : * Last Beacon frame signal strength average (ave_beacon_signal / 16)
520 : : * that triggered a cqm event. 0 indicates that no event has been
521 : : * generated for the current association.
522 : : */
523 : : int last_cqm_event_signal;
524 : :
525 : : /*
526 : : * State variables for keeping track of RSSI of the AP currently
527 : : * connected to and informing driver when RSSI has gone
528 : : * below/above a certain threshold.
529 : : */
530 : : int rssi_min_thold, rssi_max_thold;
531 : : int last_ave_beacon_signal;
532 : :
533 : : struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */
534 : : struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */
535 : : struct ieee80211_vht_cap vht_capa; /* configured VHT overrides */
536 : : struct ieee80211_vht_cap vht_capa_mask; /* Valid parts of vht_capa */
537 : :
538 : : /* TDLS support */
539 : : u8 tdls_peer[ETH_ALEN] __aligned(2);
540 : : struct delayed_work tdls_peer_del_work;
541 : : struct sk_buff *orig_teardown_skb; /* The original teardown skb */
542 : : struct sk_buff *teardown_skb; /* A copy to send through the AP */
543 : : spinlock_t teardown_lock; /* To lock changing teardown_skb */
544 : : bool tdls_chan_switch_prohibited;
545 : : bool tdls_wider_bw_prohibited;
546 : :
547 : : /* WMM-AC TSPEC support */
548 : : struct ieee80211_sta_tx_tspec tx_tspec[IEEE80211_NUM_ACS];
549 : : /* Use a separate work struct so that we can do something here
550 : : * while the sdata->work is flushing the queues, for example.
551 : : * otherwise, in scenarios where we hardly get any traffic out
552 : : * on the BE queue, but there's a lot of VO traffic, we might
553 : : * get stuck in a downgraded situation and flush takes forever.
554 : : */
555 : : struct delayed_work tx_tspec_wk;
556 : :
557 : : /* Information elements from the last transmitted (Re)Association
558 : : * Request frame.
559 : : */
560 : : u8 *assoc_req_ies;
561 : : size_t assoc_req_ies_len;
562 : : };
563 : :
564 : : struct ieee80211_if_ibss {
565 : : struct timer_list timer;
566 : : struct work_struct csa_connection_drop_work;
567 : :
568 : : unsigned long last_scan_completed;
569 : :
570 : : u32 basic_rates;
571 : :
572 : : bool fixed_bssid;
573 : : bool fixed_channel;
574 : : bool privacy;
575 : :
576 : : bool control_port;
577 : : bool userspace_handles_dfs;
578 : :
579 : : u8 bssid[ETH_ALEN] __aligned(2);
580 : : u8 ssid[IEEE80211_MAX_SSID_LEN];
581 : : u8 ssid_len, ie_len;
582 : : u8 *ie;
583 : : struct cfg80211_chan_def chandef;
584 : :
585 : : unsigned long ibss_join_req;
586 : : /* probe response/beacon for IBSS */
587 : : struct beacon_data __rcu *presp;
588 : :
589 : : struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */
590 : : struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */
591 : :
592 : : spinlock_t incomplete_lock;
593 : : struct list_head incomplete_stations;
594 : :
595 : : enum {
596 : : IEEE80211_IBSS_MLME_SEARCH,
597 : : IEEE80211_IBSS_MLME_JOINED,
598 : : } state;
599 : : };
600 : :
601 : : /**
602 : : * struct ieee80211_if_ocb - OCB mode state
603 : : *
604 : : * @housekeeping_timer: timer for periodic invocation of a housekeeping task
605 : : * @wrkq_flags: OCB deferred task action
606 : : * @incomplete_lock: delayed STA insertion lock
607 : : * @incomplete_stations: list of STAs waiting for delayed insertion
608 : : * @joined: indication if the interface is connected to an OCB network
609 : : */
610 : : struct ieee80211_if_ocb {
611 : : struct timer_list housekeeping_timer;
612 : : unsigned long wrkq_flags;
613 : :
614 : : spinlock_t incomplete_lock;
615 : : struct list_head incomplete_stations;
616 : :
617 : : bool joined;
618 : : };
619 : :
620 : : /**
621 : : * struct ieee80211_mesh_sync_ops - Extensible synchronization framework interface
622 : : *
623 : : * these declarations define the interface, which enables
624 : : * vendor-specific mesh synchronization
625 : : *
626 : : */
627 : : struct ieee802_11_elems;
628 : : struct ieee80211_mesh_sync_ops {
629 : : void (*rx_bcn_presp)(struct ieee80211_sub_if_data *sdata,
630 : : u16 stype,
631 : : struct ieee80211_mgmt *mgmt,
632 : : struct ieee802_11_elems *elems,
633 : : struct ieee80211_rx_status *rx_status);
634 : :
635 : : /* should be called with beacon_data under RCU read lock */
636 : : void (*adjust_tsf)(struct ieee80211_sub_if_data *sdata,
637 : : struct beacon_data *beacon);
638 : : /* add other framework functions here */
639 : : };
640 : :
641 : : struct mesh_csa_settings {
642 : : struct rcu_head rcu_head;
643 : : struct cfg80211_csa_settings settings;
644 : : };
645 : :
646 : : struct ieee80211_if_mesh {
647 : : struct timer_list housekeeping_timer;
648 : : struct timer_list mesh_path_timer;
649 : : struct timer_list mesh_path_root_timer;
650 : :
651 : : unsigned long wrkq_flags;
652 : : unsigned long mbss_changed;
653 : :
654 : : bool userspace_handles_dfs;
655 : :
656 : : u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN];
657 : : size_t mesh_id_len;
658 : : /* Active Path Selection Protocol Identifier */
659 : : u8 mesh_pp_id;
660 : : /* Active Path Selection Metric Identifier */
661 : : u8 mesh_pm_id;
662 : : /* Congestion Control Mode Identifier */
663 : : u8 mesh_cc_id;
664 : : /* Synchronization Protocol Identifier */
665 : : u8 mesh_sp_id;
666 : : /* Authentication Protocol Identifier */
667 : : u8 mesh_auth_id;
668 : : /* Local mesh Sequence Number */
669 : : u32 sn;
670 : : /* Last used PREQ ID */
671 : : u32 preq_id;
672 : : atomic_t mpaths;
673 : : /* Timestamp of last SN update */
674 : : unsigned long last_sn_update;
675 : : /* Time when it's ok to send next PERR */
676 : : unsigned long next_perr;
677 : : /* Timestamp of last PREQ sent */
678 : : unsigned long last_preq;
679 : : struct mesh_rmc *rmc;
680 : : spinlock_t mesh_preq_queue_lock;
681 : : struct mesh_preq_queue preq_queue;
682 : : int preq_queue_len;
683 : : struct mesh_stats mshstats;
684 : : struct mesh_config mshcfg;
685 : : atomic_t estab_plinks;
686 : : u32 mesh_seqnum;
687 : : bool accepting_plinks;
688 : : int num_gates;
689 : : struct beacon_data __rcu *beacon;
690 : : const u8 *ie;
691 : : u8 ie_len;
692 : : enum {
693 : : IEEE80211_MESH_SEC_NONE = 0x0,
694 : : IEEE80211_MESH_SEC_AUTHED = 0x1,
695 : : IEEE80211_MESH_SEC_SECURED = 0x2,
696 : : } security;
697 : : bool user_mpm;
698 : : /* Extensible Synchronization Framework */
699 : : const struct ieee80211_mesh_sync_ops *sync_ops;
700 : : s64 sync_offset_clockdrift_max;
701 : : spinlock_t sync_offset_lock;
702 : : /* mesh power save */
703 : : enum nl80211_mesh_power_mode nonpeer_pm;
704 : : int ps_peers_light_sleep;
705 : : int ps_peers_deep_sleep;
706 : : struct ps_data ps;
707 : : /* Channel Switching Support */
708 : : struct mesh_csa_settings __rcu *csa;
709 : : enum {
710 : : IEEE80211_MESH_CSA_ROLE_NONE,
711 : : IEEE80211_MESH_CSA_ROLE_INIT,
712 : : IEEE80211_MESH_CSA_ROLE_REPEATER,
713 : : } csa_role;
714 : : u8 chsw_ttl;
715 : : u16 pre_value;
716 : :
717 : : /* offset from skb->data while building IE */
718 : : int meshconf_offset;
719 : :
720 : : struct mesh_table *mesh_paths;
721 : : struct mesh_table *mpp_paths; /* Store paths for MPP&MAP */
722 : : int mesh_paths_generation;
723 : : int mpp_paths_generation;
724 : : };
725 : :
726 : : #ifdef CONFIG_MAC80211_MESH
727 : : #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \
728 : : do { (msh)->mshstats.name++; } while (0)
729 : : #else
730 : : #define IEEE80211_IFSTA_MESH_CTR_INC(msh, name) \
731 : : do { } while (0)
732 : : #endif
733 : :
734 : : /**
735 : : * enum ieee80211_sub_if_data_flags - virtual interface flags
736 : : *
737 : : * @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets
738 : : * @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode
739 : : * @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between
740 : : * associated stations and deliver multicast frames both
741 : : * back to wireless media and to the local net stack.
742 : : * @IEEE80211_SDATA_DISCONNECT_RESUME: Disconnect after resume.
743 : : * @IEEE80211_SDATA_IN_DRIVER: indicates interface was added to driver
744 : : */
745 : : enum ieee80211_sub_if_data_flags {
746 : : IEEE80211_SDATA_ALLMULTI = BIT(0),
747 : : IEEE80211_SDATA_OPERATING_GMODE = BIT(2),
748 : : IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3),
749 : : IEEE80211_SDATA_DISCONNECT_RESUME = BIT(4),
750 : : IEEE80211_SDATA_IN_DRIVER = BIT(5),
751 : : };
752 : :
753 : : /**
754 : : * enum ieee80211_sdata_state_bits - virtual interface state bits
755 : : * @SDATA_STATE_RUNNING: virtual interface is up & running; this
756 : : * mirrors netif_running() but is separate for interface type
757 : : * change handling while the interface is up
758 : : * @SDATA_STATE_OFFCHANNEL: This interface is currently in offchannel
759 : : * mode, so queues are stopped
760 : : * @SDATA_STATE_OFFCHANNEL_BEACON_STOPPED: Beaconing was stopped due
761 : : * to offchannel, reset when offchannel returns
762 : : */
763 : : enum ieee80211_sdata_state_bits {
764 : : SDATA_STATE_RUNNING,
765 : : SDATA_STATE_OFFCHANNEL,
766 : : SDATA_STATE_OFFCHANNEL_BEACON_STOPPED,
767 : : };
768 : :
769 : : /**
770 : : * enum ieee80211_chanctx_mode - channel context configuration mode
771 : : *
772 : : * @IEEE80211_CHANCTX_SHARED: channel context may be used by
773 : : * multiple interfaces
774 : : * @IEEE80211_CHANCTX_EXCLUSIVE: channel context can be used
775 : : * only by a single interface. This can be used for example for
776 : : * non-fixed channel IBSS.
777 : : */
778 : : enum ieee80211_chanctx_mode {
779 : : IEEE80211_CHANCTX_SHARED,
780 : : IEEE80211_CHANCTX_EXCLUSIVE
781 : : };
782 : :
783 : : /**
784 : : * enum ieee80211_chanctx_replace_state - channel context replacement state
785 : : *
786 : : * This is used for channel context in-place reservations that require channel
787 : : * context switch/swap.
788 : : *
789 : : * @IEEE80211_CHANCTX_REPLACE_NONE: no replacement is taking place
790 : : * @IEEE80211_CHANCTX_WILL_BE_REPLACED: this channel context will be replaced
791 : : * by a (not yet registered) channel context pointed by %replace_ctx.
792 : : * @IEEE80211_CHANCTX_REPLACES_OTHER: this (not yet registered) channel context
793 : : * replaces an existing channel context pointed to by %replace_ctx.
794 : : */
795 : : enum ieee80211_chanctx_replace_state {
796 : : IEEE80211_CHANCTX_REPLACE_NONE,
797 : : IEEE80211_CHANCTX_WILL_BE_REPLACED,
798 : : IEEE80211_CHANCTX_REPLACES_OTHER,
799 : : };
800 : :
801 : : struct ieee80211_chanctx {
802 : : struct list_head list;
803 : : struct rcu_head rcu_head;
804 : :
805 : : struct list_head assigned_vifs;
806 : : struct list_head reserved_vifs;
807 : :
808 : : enum ieee80211_chanctx_replace_state replace_state;
809 : : struct ieee80211_chanctx *replace_ctx;
810 : :
811 : : enum ieee80211_chanctx_mode mode;
812 : : bool driver_present;
813 : :
814 : : struct ieee80211_chanctx_conf conf;
815 : : };
816 : :
817 : : struct mac80211_qos_map {
818 : : struct cfg80211_qos_map qos_map;
819 : : struct rcu_head rcu_head;
820 : : };
821 : :
822 : : enum txq_info_flags {
823 : : IEEE80211_TXQ_STOP,
824 : : IEEE80211_TXQ_AMPDU,
825 : : IEEE80211_TXQ_NO_AMSDU,
826 : : IEEE80211_TXQ_STOP_NETIF_TX,
827 : : };
828 : :
829 : : /**
830 : : * struct txq_info - per tid queue
831 : : *
832 : : * @tin: contains packets split into multiple flows
833 : : * @def_flow: used as a fallback flow when a packet destined to @tin hashes to
834 : : * a fq_flow which is already owned by a different tin
835 : : * @def_cvars: codel vars for @def_flow
836 : : * @frags: used to keep fragments created after dequeue
837 : : * @schedule_order: used with ieee80211_local->active_txqs
838 : : * @schedule_round: counter to prevent infinite loops on TXQ scheduling
839 : : */
840 : : struct txq_info {
841 : : struct fq_tin tin;
842 : : struct fq_flow def_flow;
843 : : struct codel_vars def_cvars;
844 : : struct codel_stats cstats;
845 : : struct sk_buff_head frags;
846 : : struct list_head schedule_order;
847 : : u16 schedule_round;
848 : : unsigned long flags;
849 : :
850 : : /* keep last! */
851 : : struct ieee80211_txq txq;
852 : : };
853 : :
854 : : struct ieee80211_if_mntr {
855 : : u32 flags;
856 : : u8 mu_follow_addr[ETH_ALEN] __aligned(2);
857 : :
858 : : struct list_head list;
859 : : };
860 : :
861 : : /**
862 : : * struct ieee80211_if_nan - NAN state
863 : : *
864 : : * @conf: current NAN configuration
865 : : * @func_ids: a bitmap of available instance_id's
866 : : */
867 : : struct ieee80211_if_nan {
868 : : struct cfg80211_nan_conf conf;
869 : :
870 : : /* protects function_inst_ids */
871 : : spinlock_t func_lock;
872 : : struct idr function_inst_ids;
873 : : };
874 : :
875 : : struct ieee80211_sub_if_data {
876 : : struct list_head list;
877 : :
878 : : struct wireless_dev wdev;
879 : :
880 : : /* keys */
881 : : struct list_head key_list;
882 : :
883 : : /* count for keys needing tailroom space allocation */
884 : : int crypto_tx_tailroom_needed_cnt;
885 : : int crypto_tx_tailroom_pending_dec;
886 : : struct delayed_work dec_tailroom_needed_wk;
887 : :
888 : : struct net_device *dev;
889 : : struct ieee80211_local *local;
890 : :
891 : : unsigned int flags;
892 : :
893 : : unsigned long state;
894 : :
895 : : char name[IFNAMSIZ];
896 : :
897 : : /* Fragment table for host-based reassembly */
898 : : struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX];
899 : : unsigned int fragment_next;
900 : :
901 : : /* TID bitmap for NoAck policy */
902 : : u16 noack_map;
903 : :
904 : : /* bit field of ACM bits (BIT(802.1D tag)) */
905 : : u8 wmm_acm;
906 : :
907 : : struct ieee80211_key __rcu *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS];
908 : : struct ieee80211_key __rcu *default_unicast_key;
909 : : struct ieee80211_key __rcu *default_multicast_key;
910 : : struct ieee80211_key __rcu *default_mgmt_key;
911 : :
912 : : u16 sequence_number;
913 : : __be16 control_port_protocol;
914 : : bool control_port_no_encrypt;
915 : : bool control_port_over_nl80211;
916 : : int encrypt_headroom;
917 : :
918 : : atomic_t num_tx_queued;
919 : : struct ieee80211_tx_queue_params tx_conf[IEEE80211_NUM_ACS];
920 : : struct mac80211_qos_map __rcu *qos_map;
921 : :
922 : : struct work_struct csa_finalize_work;
923 : : bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
924 : : struct cfg80211_chan_def csa_chandef;
925 : :
926 : : struct list_head assigned_chanctx_list; /* protected by chanctx_mtx */
927 : : struct list_head reserved_chanctx_list; /* protected by chanctx_mtx */
928 : :
929 : : /* context reservation -- protected with chanctx_mtx */
930 : : struct ieee80211_chanctx *reserved_chanctx;
931 : : struct cfg80211_chan_def reserved_chandef;
932 : : bool reserved_radar_required;
933 : : bool reserved_ready;
934 : :
935 : : /* used to reconfigure hardware SM PS */
936 : : struct work_struct recalc_smps;
937 : :
938 : : struct work_struct work;
939 : : struct sk_buff_head skb_queue;
940 : :
941 : : u8 needed_rx_chains;
942 : : enum ieee80211_smps_mode smps_mode;
943 : :
944 : : int user_power_level; /* in dBm */
945 : : int ap_power_level; /* in dBm */
946 : :
947 : : bool radar_required;
948 : : struct delayed_work dfs_cac_timer_work;
949 : :
950 : : /*
951 : : * AP this belongs to: self in AP mode and
952 : : * corresponding AP in VLAN mode, NULL for
953 : : * all others (might be needed later in IBSS)
954 : : */
955 : : struct ieee80211_if_ap *bss;
956 : :
957 : : /* bitmap of allowed (non-MCS) rate indexes for rate control */
958 : : u32 rc_rateidx_mask[NUM_NL80211_BANDS];
959 : :
960 : : bool rc_has_mcs_mask[NUM_NL80211_BANDS];
961 : : u8 rc_rateidx_mcs_mask[NUM_NL80211_BANDS][IEEE80211_HT_MCS_MASK_LEN];
962 : :
963 : : bool rc_has_vht_mcs_mask[NUM_NL80211_BANDS];
964 : : u16 rc_rateidx_vht_mcs_mask[NUM_NL80211_BANDS][NL80211_VHT_NSS_MAX];
965 : :
966 : : union {
967 : : struct ieee80211_if_ap ap;
968 : : struct ieee80211_if_wds wds;
969 : : struct ieee80211_if_vlan vlan;
970 : : struct ieee80211_if_managed mgd;
971 : : struct ieee80211_if_ibss ibss;
972 : : struct ieee80211_if_mesh mesh;
973 : : struct ieee80211_if_ocb ocb;
974 : : struct ieee80211_if_mntr mntr;
975 : : struct ieee80211_if_nan nan;
976 : : } u;
977 : :
978 : : #ifdef CONFIG_MAC80211_DEBUGFS
979 : : struct {
980 : : struct dentry *subdir_stations;
981 : : struct dentry *default_unicast_key;
982 : : struct dentry *default_multicast_key;
983 : : struct dentry *default_mgmt_key;
984 : : } debugfs;
985 : : #endif
986 : :
987 : : /* must be last, dynamically sized area in this! */
988 : : struct ieee80211_vif vif;
989 : : };
990 : :
991 : : static inline
992 : 0 : struct ieee80211_sub_if_data *vif_to_sdata(struct ieee80211_vif *p)
993 : : {
994 [ # # # # : 0 : return container_of(p, struct ieee80211_sub_if_data, vif);
# # # # #
# # # #
# ]
995 : : }
996 : :
997 : 0 : static inline void sdata_lock(struct ieee80211_sub_if_data *sdata)
998 : : __acquires(&sdata->wdev.mtx)
999 : : {
1000 : 0 : mutex_lock(&sdata->wdev.mtx);
1001 [ # # # # : 0 : __acquire(&sdata->wdev.mtx);
# # # # #
# # # # #
# # # # #
# ]
1002 : : }
1003 : :
1004 : 0 : static inline void sdata_unlock(struct ieee80211_sub_if_data *sdata)
1005 : : __releases(&sdata->wdev.mtx)
1006 : : {
1007 : 0 : mutex_unlock(&sdata->wdev.mtx);
1008 : 0 : __release(&sdata->wdev.mtx);
1009 : 0 : }
1010 : :
1011 : : #define sdata_dereference(p, sdata) \
1012 : : rcu_dereference_protected(p, lockdep_is_held(&sdata->wdev.mtx))
1013 : :
1014 : : static inline void
1015 : 0 : sdata_assert_lock(struct ieee80211_sub_if_data *sdata)
1016 : : {
1017 [ # # # # : 0 : lockdep_assert_held(&sdata->wdev.mtx);
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # #
# ]
1018 : : }
1019 : :
1020 : : static inline int
1021 : 0 : ieee80211_chandef_get_shift(struct cfg80211_chan_def *chandef)
1022 : : {
1023 [ # # # # : 0 : switch (chandef->width) {
# # ]
1024 : : case NL80211_CHAN_WIDTH_5:
1025 : : return 2;
1026 : 0 : case NL80211_CHAN_WIDTH_10:
1027 : 0 : return 1;
1028 : 0 : default:
1029 : 0 : return 0;
1030 : : }
1031 : : }
1032 : :
1033 : : static inline int
1034 : 0 : ieee80211_vif_get_shift(struct ieee80211_vif *vif)
1035 : : {
1036 : 0 : struct ieee80211_chanctx_conf *chanctx_conf;
1037 : 0 : int shift = 0;
1038 : :
1039 : 0 : rcu_read_lock();
1040 [ # # # # : 0 : chanctx_conf = rcu_dereference(vif->chanctx_conf);
# # # # #
# # # ]
1041 [ # # # # : 0 : if (chanctx_conf)
# # # # #
# # # ]
1042 [ # # # # : 0 : shift = ieee80211_chandef_get_shift(&chanctx_conf->def);
# # # # #
# # # # #
# # # # ]
1043 : 0 : rcu_read_unlock();
1044 : :
1045 [ # # # ]: 0 : return shift;
1046 : : }
1047 : :
1048 : : enum {
1049 : : IEEE80211_RX_MSG = 1,
1050 : : IEEE80211_TX_STATUS_MSG = 2,
1051 : : };
1052 : :
1053 : : enum queue_stop_reason {
1054 : : IEEE80211_QUEUE_STOP_REASON_DRIVER,
1055 : : IEEE80211_QUEUE_STOP_REASON_PS,
1056 : : IEEE80211_QUEUE_STOP_REASON_CSA,
1057 : : IEEE80211_QUEUE_STOP_REASON_AGGREGATION,
1058 : : IEEE80211_QUEUE_STOP_REASON_SUSPEND,
1059 : : IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
1060 : : IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL,
1061 : : IEEE80211_QUEUE_STOP_REASON_FLUSH,
1062 : : IEEE80211_QUEUE_STOP_REASON_TDLS_TEARDOWN,
1063 : : IEEE80211_QUEUE_STOP_REASON_RESERVE_TID,
1064 : :
1065 : : IEEE80211_QUEUE_STOP_REASONS,
1066 : : };
1067 : :
1068 : : #ifdef CONFIG_MAC80211_LEDS
1069 : : struct tpt_led_trigger {
1070 : : char name[32];
1071 : : const struct ieee80211_tpt_blink *blink_table;
1072 : : unsigned int blink_table_len;
1073 : : struct timer_list timer;
1074 : : struct ieee80211_local *local;
1075 : : unsigned long prev_traffic;
1076 : : unsigned long tx_bytes, rx_bytes;
1077 : : unsigned int active, want;
1078 : : bool running;
1079 : : };
1080 : : #endif
1081 : :
1082 : : /**
1083 : : * mac80211 scan flags - currently active scan mode
1084 : : *
1085 : : * @SCAN_SW_SCANNING: We're currently in the process of scanning but may as
1086 : : * well be on the operating channel
1087 : : * @SCAN_HW_SCANNING: The hardware is scanning for us, we have no way to
1088 : : * determine if we are on the operating channel or not
1089 : : * @SCAN_ONCHANNEL_SCANNING: Do a software scan on only the current operating
1090 : : * channel. This should not interrupt normal traffic.
1091 : : * @SCAN_COMPLETED: Set for our scan work function when the driver reported
1092 : : * that the scan completed.
1093 : : * @SCAN_ABORTED: Set for our scan work function when the driver reported
1094 : : * a scan complete for an aborted scan.
1095 : : * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being
1096 : : * cancelled.
1097 : : */
1098 : : enum {
1099 : : SCAN_SW_SCANNING,
1100 : : SCAN_HW_SCANNING,
1101 : : SCAN_ONCHANNEL_SCANNING,
1102 : : SCAN_COMPLETED,
1103 : : SCAN_ABORTED,
1104 : : SCAN_HW_CANCELLED,
1105 : : };
1106 : :
1107 : : /**
1108 : : * enum mac80211_scan_state - scan state machine states
1109 : : *
1110 : : * @SCAN_DECISION: Main entry point to the scan state machine, this state
1111 : : * determines if we should keep on scanning or switch back to the
1112 : : * operating channel
1113 : : * @SCAN_SET_CHANNEL: Set the next channel to be scanned
1114 : : * @SCAN_SEND_PROBE: Send probe requests and wait for probe responses
1115 : : * @SCAN_SUSPEND: Suspend the scan and go back to operating channel to
1116 : : * send out data
1117 : : * @SCAN_RESUME: Resume the scan and scan the next channel
1118 : : * @SCAN_ABORT: Abort the scan and go back to operating channel
1119 : : */
1120 : : enum mac80211_scan_state {
1121 : : SCAN_DECISION,
1122 : : SCAN_SET_CHANNEL,
1123 : : SCAN_SEND_PROBE,
1124 : : SCAN_SUSPEND,
1125 : : SCAN_RESUME,
1126 : : SCAN_ABORT,
1127 : : };
1128 : :
1129 : : struct ieee80211_local {
1130 : : /* embed the driver visible part.
1131 : : * don't cast (use the static inlines below), but we keep
1132 : : * it first anyway so they become a no-op */
1133 : : struct ieee80211_hw hw;
1134 : :
1135 : : struct fq fq;
1136 : : struct codel_vars *cvars;
1137 : : struct codel_params cparams;
1138 : :
1139 : : /* protects active_txqs and txqi->schedule_order */
1140 : : spinlock_t active_txq_lock[IEEE80211_NUM_ACS];
1141 : : struct list_head active_txqs[IEEE80211_NUM_ACS];
1142 : : u16 schedule_round[IEEE80211_NUM_ACS];
1143 : :
1144 : : u16 airtime_flags;
1145 : : u32 aql_txq_limit_low[IEEE80211_NUM_ACS];
1146 : : u32 aql_txq_limit_high[IEEE80211_NUM_ACS];
1147 : : u32 aql_threshold;
1148 : : atomic_t aql_total_pending_airtime;
1149 : :
1150 : : const struct ieee80211_ops *ops;
1151 : :
1152 : : /*
1153 : : * private workqueue to mac80211. mac80211 makes this accessible
1154 : : * via ieee80211_queue_work()
1155 : : */
1156 : : struct workqueue_struct *workqueue;
1157 : :
1158 : : unsigned long queue_stop_reasons[IEEE80211_MAX_QUEUES];
1159 : : int q_stop_reasons[IEEE80211_MAX_QUEUES][IEEE80211_QUEUE_STOP_REASONS];
1160 : : /* also used to protect ampdu_ac_queue and amdpu_ac_stop_refcnt */
1161 : : spinlock_t queue_stop_reason_lock;
1162 : :
1163 : : int open_count;
1164 : : int monitors, cooked_mntrs;
1165 : : /* number of interfaces with corresponding FIF_ flags */
1166 : : int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll,
1167 : : fif_probe_req;
1168 : : int probe_req_reg;
1169 : : unsigned int filter_flags; /* FIF_* */
1170 : :
1171 : : bool wiphy_ciphers_allocated;
1172 : :
1173 : : bool use_chanctx;
1174 : :
1175 : : /* protects the aggregated multicast list and filter calls */
1176 : : spinlock_t filter_lock;
1177 : :
1178 : : /* used for uploading changed mc list */
1179 : : struct work_struct reconfig_filter;
1180 : :
1181 : : /* aggregated multicast list */
1182 : : struct netdev_hw_addr_list mc_list;
1183 : :
1184 : : bool tim_in_locked_section; /* see ieee80211_beacon_get() */
1185 : :
1186 : : /*
1187 : : * suspended is true if we finished all the suspend _and_ we have
1188 : : * not yet come up from resume. This is to be used by mac80211
1189 : : * to ensure driver sanity during suspend and mac80211's own
1190 : : * sanity. It can eventually be used for WoW as well.
1191 : : */
1192 : : bool suspended;
1193 : :
1194 : : /*
1195 : : * Resuming is true while suspended, but when we're reprogramming the
1196 : : * hardware -- at that time it's allowed to use ieee80211_queue_work()
1197 : : * again even though some other parts of the stack are still suspended
1198 : : * and we still drop received frames to avoid waking the stack.
1199 : : */
1200 : : bool resuming;
1201 : :
1202 : : /*
1203 : : * quiescing is true during the suspend process _only_ to
1204 : : * ease timer cancelling etc.
1205 : : */
1206 : : bool quiescing;
1207 : :
1208 : : /* device is started */
1209 : : bool started;
1210 : :
1211 : : /* device is during a HW reconfig */
1212 : : bool in_reconfig;
1213 : :
1214 : : /* wowlan is enabled -- don't reconfig on resume */
1215 : : bool wowlan;
1216 : :
1217 : : struct work_struct radar_detected_work;
1218 : :
1219 : : /* number of RX chains the hardware has */
1220 : : u8 rx_chains;
1221 : :
1222 : : /* bitmap of which sbands were copied */
1223 : : u8 sband_allocated;
1224 : :
1225 : : int tx_headroom; /* required headroom for hardware/radiotap */
1226 : :
1227 : : /* Tasklet and skb queue to process calls from IRQ mode. All frames
1228 : : * added to skb_queue will be processed, but frames in
1229 : : * skb_queue_unreliable may be dropped if the total length of these
1230 : : * queues increases over the limit. */
1231 : : #define IEEE80211_IRQSAFE_QUEUE_LIMIT 128
1232 : : struct tasklet_struct tasklet;
1233 : : struct sk_buff_head skb_queue;
1234 : : struct sk_buff_head skb_queue_unreliable;
1235 : :
1236 : : spinlock_t rx_path_lock;
1237 : :
1238 : : /* Station data */
1239 : : /*
1240 : : * The mutex only protects the list, hash table and
1241 : : * counter, reads are done with RCU.
1242 : : */
1243 : : struct mutex sta_mtx;
1244 : : spinlock_t tim_lock;
1245 : : unsigned long num_sta;
1246 : : struct list_head sta_list;
1247 : : struct rhltable sta_hash;
1248 : : struct timer_list sta_cleanup;
1249 : : int sta_generation;
1250 : :
1251 : : struct sk_buff_head pending[IEEE80211_MAX_QUEUES];
1252 : : struct tasklet_struct tx_pending_tasklet;
1253 : : struct tasklet_struct wake_txqs_tasklet;
1254 : :
1255 : : atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES];
1256 : :
1257 : : /* number of interfaces with allmulti RX */
1258 : : atomic_t iff_allmultis;
1259 : :
1260 : : struct rate_control_ref *rate_ctrl;
1261 : :
1262 : : struct arc4_ctx wep_tx_ctx;
1263 : : struct arc4_ctx wep_rx_ctx;
1264 : : u32 wep_iv;
1265 : :
1266 : : /* see iface.c */
1267 : : struct list_head interfaces;
1268 : : struct list_head mon_list; /* only that are IFF_UP && !cooked */
1269 : : struct mutex iflist_mtx;
1270 : :
1271 : : /*
1272 : : * Key mutex, protects sdata's key_list and sta_info's
1273 : : * key pointers and ptk_idx (write access, they're RCU.)
1274 : : */
1275 : : struct mutex key_mtx;
1276 : :
1277 : : /* mutex for scan and work locking */
1278 : : struct mutex mtx;
1279 : :
1280 : : /* Scanning and BSS list */
1281 : : unsigned long scanning;
1282 : : struct cfg80211_ssid scan_ssid;
1283 : : struct cfg80211_scan_request *int_scan_req;
1284 : : struct cfg80211_scan_request __rcu *scan_req;
1285 : : struct ieee80211_scan_request *hw_scan_req;
1286 : : struct cfg80211_chan_def scan_chandef;
1287 : : enum nl80211_band hw_scan_band;
1288 : : int scan_channel_idx;
1289 : : int scan_ies_len;
1290 : : int hw_scan_ies_bufsize;
1291 : : struct cfg80211_scan_info scan_info;
1292 : :
1293 : : struct work_struct sched_scan_stopped_work;
1294 : : struct ieee80211_sub_if_data __rcu *sched_scan_sdata;
1295 : : struct cfg80211_sched_scan_request __rcu *sched_scan_req;
1296 : : u8 scan_addr[ETH_ALEN];
1297 : :
1298 : : unsigned long leave_oper_channel_time;
1299 : : enum mac80211_scan_state next_scan_state;
1300 : : struct delayed_work scan_work;
1301 : : struct ieee80211_sub_if_data __rcu *scan_sdata;
1302 : : /* For backward compatibility only -- do not use */
1303 : : struct cfg80211_chan_def _oper_chandef;
1304 : :
1305 : : /* Temporary remain-on-channel for off-channel operations */
1306 : : struct ieee80211_channel *tmp_channel;
1307 : :
1308 : : /* channel contexts */
1309 : : struct list_head chanctx_list;
1310 : : struct mutex chanctx_mtx;
1311 : :
1312 : : #ifdef CONFIG_MAC80211_LEDS
1313 : : struct led_trigger tx_led, rx_led, assoc_led, radio_led;
1314 : : struct led_trigger tpt_led;
1315 : : atomic_t tx_led_active, rx_led_active, assoc_led_active;
1316 : : atomic_t radio_led_active, tpt_led_active;
1317 : : struct tpt_led_trigger *tpt_led_trigger;
1318 : : #endif
1319 : :
1320 : : #ifdef CONFIG_MAC80211_DEBUG_COUNTERS
1321 : : /* SNMP counters */
1322 : : /* dot11CountersTable */
1323 : : u32 dot11TransmittedFragmentCount;
1324 : : u32 dot11MulticastTransmittedFrameCount;
1325 : : u32 dot11FailedCount;
1326 : : u32 dot11RetryCount;
1327 : : u32 dot11MultipleRetryCount;
1328 : : u32 dot11FrameDuplicateCount;
1329 : : u32 dot11ReceivedFragmentCount;
1330 : : u32 dot11MulticastReceivedFrameCount;
1331 : : u32 dot11TransmittedFrameCount;
1332 : :
1333 : : /* TX/RX handler statistics */
1334 : : unsigned int tx_handlers_drop;
1335 : : unsigned int tx_handlers_queued;
1336 : : unsigned int tx_handlers_drop_wep;
1337 : : unsigned int tx_handlers_drop_not_assoc;
1338 : : unsigned int tx_handlers_drop_unauth_port;
1339 : : unsigned int rx_handlers_drop;
1340 : : unsigned int rx_handlers_queued;
1341 : : unsigned int rx_handlers_drop_nullfunc;
1342 : : unsigned int rx_handlers_drop_defrag;
1343 : : unsigned int tx_expand_skb_head;
1344 : : unsigned int tx_expand_skb_head_cloned;
1345 : : unsigned int rx_expand_skb_head_defrag;
1346 : : unsigned int rx_handlers_fragments;
1347 : : unsigned int tx_status_drop;
1348 : : #define I802_DEBUG_INC(c) (c)++
1349 : : #else /* CONFIG_MAC80211_DEBUG_COUNTERS */
1350 : : #define I802_DEBUG_INC(c) do { } while (0)
1351 : : #endif /* CONFIG_MAC80211_DEBUG_COUNTERS */
1352 : :
1353 : :
1354 : : int total_ps_buffered; /* total number of all buffered unicast and
1355 : : * multicast packets for power saving stations
1356 : : */
1357 : :
1358 : : bool pspolling;
1359 : : bool offchannel_ps_enabled;
1360 : : /*
1361 : : * PS can only be enabled when we have exactly one managed
1362 : : * interface (and monitors) in PS, this then points there.
1363 : : */
1364 : : struct ieee80211_sub_if_data *ps_sdata;
1365 : : struct work_struct dynamic_ps_enable_work;
1366 : : struct work_struct dynamic_ps_disable_work;
1367 : : struct timer_list dynamic_ps_timer;
1368 : : struct notifier_block ifa_notifier;
1369 : : struct notifier_block ifa6_notifier;
1370 : :
1371 : : /*
1372 : : * The dynamic ps timeout configured from user space via WEXT -
1373 : : * this will override whatever chosen by mac80211 internally.
1374 : : */
1375 : : int dynamic_ps_forced_timeout;
1376 : :
1377 : : int user_power_level; /* in dBm, for all interfaces */
1378 : :
1379 : : enum ieee80211_smps_mode smps_mode;
1380 : :
1381 : : struct work_struct restart_work;
1382 : :
1383 : : #ifdef CONFIG_MAC80211_DEBUGFS
1384 : : struct local_debugfsdentries {
1385 : : struct dentry *rcdir;
1386 : : struct dentry *keys;
1387 : : } debugfs;
1388 : : bool force_tx_status;
1389 : : #endif
1390 : :
1391 : : /*
1392 : : * Remain-on-channel support
1393 : : */
1394 : : struct delayed_work roc_work;
1395 : : struct list_head roc_list;
1396 : : struct work_struct hw_roc_start, hw_roc_done;
1397 : : unsigned long hw_roc_start_time;
1398 : : u64 roc_cookie_counter;
1399 : :
1400 : : struct idr ack_status_frames;
1401 : : spinlock_t ack_status_lock;
1402 : :
1403 : : struct ieee80211_sub_if_data __rcu *p2p_sdata;
1404 : :
1405 : : /* virtual monitor interface */
1406 : : struct ieee80211_sub_if_data __rcu *monitor_sdata;
1407 : : struct cfg80211_chan_def monitor_chandef;
1408 : :
1409 : : /* extended capabilities provided by mac80211 */
1410 : : u8 ext_capa[8];
1411 : :
1412 : : /* TDLS channel switch */
1413 : : struct work_struct tdls_chsw_work;
1414 : : struct sk_buff_head skb_queue_tdls_chsw;
1415 : : };
1416 : :
1417 : : static inline struct ieee80211_sub_if_data *
1418 : 0 : IEEE80211_DEV_TO_SUB_IF(struct net_device *dev)
1419 : : {
1420 [ # # # # : 0 : return netdev_priv(dev);
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
1421 : : }
1422 : :
1423 : : static inline struct ieee80211_sub_if_data *
1424 : 0 : IEEE80211_WDEV_TO_SUB_IF(struct wireless_dev *wdev)
1425 : : {
1426 [ # # # # : 0 : return container_of(wdev, struct ieee80211_sub_if_data, wdev);
# # # # #
# # # # #
# # # # #
# ]
1427 : : }
1428 : :
1429 : : static inline struct ieee80211_supported_band *
1430 : 0 : ieee80211_get_sband(struct ieee80211_sub_if_data *sdata)
1431 : : {
1432 : 0 : struct ieee80211_local *local = sdata->local;
1433 : 0 : struct ieee80211_chanctx_conf *chanctx_conf;
1434 : 0 : enum nl80211_band band;
1435 : :
1436 : 0 : rcu_read_lock();
1437 [ # # ]: 0 : chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1438 : :
1439 [ # # # # ]: 0 : if (WARN_ON_ONCE(!chanctx_conf)) {
1440 : 0 : rcu_read_unlock();
1441 : 0 : return NULL;
1442 : : }
1443 : :
1444 : 0 : band = chanctx_conf->def.chan->band;
1445 : 0 : rcu_read_unlock();
1446 : :
1447 : 0 : return local->hw.wiphy->bands[band];
1448 : : }
1449 : :
1450 : : /* this struct holds the value parsing from channel switch IE */
1451 : : struct ieee80211_csa_ie {
1452 : : struct cfg80211_chan_def chandef;
1453 : : u8 mode;
1454 : : u8 count;
1455 : : u8 ttl;
1456 : : u16 pre_value;
1457 : : u16 reason_code;
1458 : : u32 max_switch_time;
1459 : : };
1460 : :
1461 : : /* Parsed Information Elements */
1462 : : struct ieee802_11_elems {
1463 : : const u8 *ie_start;
1464 : : size_t total_len;
1465 : :
1466 : : /* pointers to IEs */
1467 : : const struct ieee80211_tdls_lnkie *lnk_id;
1468 : : const struct ieee80211_ch_switch_timing *ch_sw_timing;
1469 : : const u8 *ext_capab;
1470 : : const u8 *ssid;
1471 : : const u8 *supp_rates;
1472 : : const u8 *ds_params;
1473 : : const struct ieee80211_tim_ie *tim;
1474 : : const u8 *challenge;
1475 : : const u8 *rsn;
1476 : : const u8 *erp_info;
1477 : : const u8 *ext_supp_rates;
1478 : : const u8 *wmm_info;
1479 : : const u8 *wmm_param;
1480 : : const struct ieee80211_ht_cap *ht_cap_elem;
1481 : : const struct ieee80211_ht_operation *ht_operation;
1482 : : const struct ieee80211_vht_cap *vht_cap_elem;
1483 : : const struct ieee80211_vht_operation *vht_operation;
1484 : : const struct ieee80211_meshconf_ie *mesh_config;
1485 : : const u8 *he_cap;
1486 : : const struct ieee80211_he_operation *he_operation;
1487 : : const struct ieee80211_he_spr *he_spr;
1488 : : const struct ieee80211_mu_edca_param_set *mu_edca_param_set;
1489 : : const u8 *uora_element;
1490 : : const u8 *mesh_id;
1491 : : const u8 *peering;
1492 : : const __le16 *awake_window;
1493 : : const u8 *preq;
1494 : : const u8 *prep;
1495 : : const u8 *perr;
1496 : : const struct ieee80211_rann_ie *rann;
1497 : : const struct ieee80211_channel_sw_ie *ch_switch_ie;
1498 : : const struct ieee80211_ext_chansw_ie *ext_chansw_ie;
1499 : : const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie;
1500 : : const u8 *max_channel_switch_time;
1501 : : const u8 *country_elem;
1502 : : const u8 *pwr_constr_elem;
1503 : : const u8 *cisco_dtpc_elem;
1504 : : const struct ieee80211_timeout_interval_ie *timeout_int;
1505 : : const u8 *opmode_notif;
1506 : : const struct ieee80211_sec_chan_offs_ie *sec_chan_offs;
1507 : : struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie;
1508 : : const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie;
1509 : : const struct ieee80211_multiple_bssid_configuration *mbssid_config_ie;
1510 : : const struct ieee80211_bssid_index *bssid_index;
1511 : : u8 max_bssid_indicator;
1512 : : u8 dtim_count;
1513 : : u8 dtim_period;
1514 : : const struct ieee80211_addba_ext_ie *addba_ext_ie;
1515 : :
1516 : : /* length of them, respectively */
1517 : : u8 ext_capab_len;
1518 : : u8 ssid_len;
1519 : : u8 supp_rates_len;
1520 : : u8 tim_len;
1521 : : u8 challenge_len;
1522 : : u8 rsn_len;
1523 : : u8 ext_supp_rates_len;
1524 : : u8 wmm_info_len;
1525 : : u8 wmm_param_len;
1526 : : u8 he_cap_len;
1527 : : u8 mesh_id_len;
1528 : : u8 peering_len;
1529 : : u8 preq_len;
1530 : : u8 prep_len;
1531 : : u8 perr_len;
1532 : : u8 country_elem_len;
1533 : : u8 bssid_index_len;
1534 : :
1535 : : /* whether a parse error occurred while retrieving these elements */
1536 : : bool parse_error;
1537 : : };
1538 : :
1539 : 0 : static inline struct ieee80211_local *hw_to_local(
1540 : : struct ieee80211_hw *hw)
1541 : : {
1542 [ # # # # : 0 : return container_of(hw, struct ieee80211_local, hw);
# # # # #
# ]
1543 : : }
1544 : :
1545 : 0 : static inline struct txq_info *to_txq_info(struct ieee80211_txq *txq)
1546 : : {
1547 [ # # ]: 0 : return container_of(txq, struct txq_info, txq);
1548 : : }
1549 : :
1550 : 0 : static inline bool txq_has_queue(struct ieee80211_txq *txq)
1551 : : {
1552 : 0 : struct txq_info *txqi = to_txq_info(txq);
1553 : :
1554 [ # # # # : 0 : return !(skb_queue_empty(&txqi->frags) && !txqi->tin.backlog_packets);
# # # # #
# # # ]
1555 : : }
1556 : :
1557 : 0 : static inline int ieee80211_bssid_match(const u8 *raddr, const u8 *addr)
1558 : : {
1559 [ # # # # : 0 : return ether_addr_equal(raddr, addr) ||
# # # # ]
1560 : : is_broadcast_ether_addr(raddr);
1561 : : }
1562 : :
1563 : : static inline bool
1564 : 0 : ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status)
1565 : : {
1566 [ # # ]: 0 : WARN_ON_ONCE(status->flag & RX_FLAG_MACTIME_START &&
1567 : : status->flag & RX_FLAG_MACTIME_END);
1568 [ # # ]: 0 : if (status->flag & (RX_FLAG_MACTIME_START | RX_FLAG_MACTIME_END))
1569 : : return true;
1570 : : /* can't handle non-legacy preamble yet */
1571 [ # # ]: 0 : if (status->flag & RX_FLAG_MACTIME_PLCP_START &&
1572 : : status->encoding == RX_ENC_LEGACY)
1573 : 0 : return true;
1574 : : return false;
1575 : : }
1576 : :
1577 : : void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata);
1578 : : void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata);
1579 : :
1580 : : /* This function returns the number of multicast stations connected to this
1581 : : * interface. It returns -1 if that number is not tracked, that is for netdevs
1582 : : * not in AP or AP_VLAN mode or when using 4addr.
1583 : : */
1584 : : static inline int
1585 : 0 : ieee80211_vif_get_num_mcast_if(struct ieee80211_sub_if_data *sdata)
1586 : : {
1587 [ # # ]: 0 : if (sdata->vif.type == NL80211_IFTYPE_AP)
1588 : 0 : return atomic_read(&sdata->u.ap.num_mcast_sta);
1589 [ # # # # ]: 0 : if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta)
1590 : 0 : return atomic_read(&sdata->u.vlan.num_mcast_sta);
1591 : : return -1;
1592 : : }
1593 : :
1594 : : u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
1595 : : struct ieee80211_rx_status *status,
1596 : : unsigned int mpdu_len,
1597 : : unsigned int mpdu_offset);
1598 : : int ieee80211_hw_config(struct ieee80211_local *local, u32 changed);
1599 : : void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx);
1600 : : void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
1601 : : u32 changed);
1602 : : void ieee80211_configure_filter(struct ieee80211_local *local);
1603 : : u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata);
1604 : :
1605 : : u64 ieee80211_mgmt_tx_cookie(struct ieee80211_local *local);
1606 : : int ieee80211_attach_ack_skb(struct ieee80211_local *local, struct sk_buff *skb,
1607 : : u64 *cookie, gfp_t gfp);
1608 : :
1609 : : void ieee80211_check_fast_rx(struct sta_info *sta);
1610 : : void __ieee80211_check_fast_rx_iface(struct ieee80211_sub_if_data *sdata);
1611 : : void ieee80211_check_fast_rx_iface(struct ieee80211_sub_if_data *sdata);
1612 : : void ieee80211_clear_fast_rx(struct sta_info *sta);
1613 : :
1614 : : /* STA code */
1615 : : void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata);
1616 : : int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
1617 : : struct cfg80211_auth_request *req);
1618 : : int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
1619 : : struct cfg80211_assoc_request *req);
1620 : : int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
1621 : : struct cfg80211_deauth_request *req);
1622 : : int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
1623 : : struct cfg80211_disassoc_request *req);
1624 : : void ieee80211_send_pspoll(struct ieee80211_local *local,
1625 : : struct ieee80211_sub_if_data *sdata);
1626 : : void ieee80211_recalc_ps(struct ieee80211_local *local);
1627 : : void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata);
1628 : : int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata);
1629 : : void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata);
1630 : : void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1631 : : struct sk_buff *skb);
1632 : : void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata);
1633 : : void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata);
1634 : : void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata);
1635 : : void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
1636 : : __le16 fc, bool acked);
1637 : : void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata);
1638 : : void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
1639 : : void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata);
1640 : :
1641 : : /* IBSS code */
1642 : : void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
1643 : : void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata);
1644 : : void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
1645 : : const u8 *bssid, const u8 *addr, u32 supp_rates);
1646 : : int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
1647 : : struct cfg80211_ibss_params *params);
1648 : : int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata);
1649 : : void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata);
1650 : : void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1651 : : struct sk_buff *skb);
1652 : : int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
1653 : : struct cfg80211_csa_settings *csa_settings);
1654 : : int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata);
1655 : : void ieee80211_ibss_stop(struct ieee80211_sub_if_data *sdata);
1656 : :
1657 : : /* OCB code */
1658 : : void ieee80211_ocb_work(struct ieee80211_sub_if_data *sdata);
1659 : : void ieee80211_ocb_rx_no_sta(struct ieee80211_sub_if_data *sdata,
1660 : : const u8 *bssid, const u8 *addr, u32 supp_rates);
1661 : : void ieee80211_ocb_setup_sdata(struct ieee80211_sub_if_data *sdata);
1662 : : int ieee80211_ocb_join(struct ieee80211_sub_if_data *sdata,
1663 : : struct ocb_setup *setup);
1664 : : int ieee80211_ocb_leave(struct ieee80211_sub_if_data *sdata);
1665 : :
1666 : : /* mesh code */
1667 : : void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata);
1668 : : void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1669 : : struct sk_buff *skb);
1670 : : int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,
1671 : : struct cfg80211_csa_settings *csa_settings);
1672 : : int ieee80211_mesh_finish_csa(struct ieee80211_sub_if_data *sdata);
1673 : :
1674 : : /* scan/BSS handling */
1675 : : void ieee80211_scan_work(struct work_struct *work);
1676 : : int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
1677 : : const u8 *ssid, u8 ssid_len,
1678 : : struct ieee80211_channel **channels,
1679 : : unsigned int n_channels,
1680 : : enum nl80211_bss_scan_width scan_width);
1681 : : int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
1682 : : struct cfg80211_scan_request *req);
1683 : : void ieee80211_scan_cancel(struct ieee80211_local *local);
1684 : : void ieee80211_run_deferred_scan(struct ieee80211_local *local);
1685 : : void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb);
1686 : :
1687 : : void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local);
1688 : : struct ieee80211_bss *
1689 : : ieee80211_bss_info_update(struct ieee80211_local *local,
1690 : : struct ieee80211_rx_status *rx_status,
1691 : : struct ieee80211_mgmt *mgmt,
1692 : : size_t len,
1693 : : struct ieee80211_channel *channel);
1694 : : void ieee80211_rx_bss_put(struct ieee80211_local *local,
1695 : : struct ieee80211_bss *bss);
1696 : :
1697 : : /* scheduled scan handling */
1698 : : int
1699 : : __ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
1700 : : struct cfg80211_sched_scan_request *req);
1701 : : int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
1702 : : struct cfg80211_sched_scan_request *req);
1703 : : int ieee80211_request_sched_scan_stop(struct ieee80211_local *local);
1704 : : void ieee80211_sched_scan_end(struct ieee80211_local *local);
1705 : : void ieee80211_sched_scan_stopped_work(struct work_struct *work);
1706 : :
1707 : : /* off-channel/mgmt-tx */
1708 : : void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local);
1709 : : void ieee80211_offchannel_return(struct ieee80211_local *local);
1710 : : void ieee80211_roc_setup(struct ieee80211_local *local);
1711 : : void ieee80211_start_next_roc(struct ieee80211_local *local);
1712 : : void ieee80211_roc_purge(struct ieee80211_local *local,
1713 : : struct ieee80211_sub_if_data *sdata);
1714 : : int ieee80211_remain_on_channel(struct wiphy *wiphy, struct wireless_dev *wdev,
1715 : : struct ieee80211_channel *chan,
1716 : : unsigned int duration, u64 *cookie);
1717 : : int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
1718 : : struct wireless_dev *wdev, u64 cookie);
1719 : : int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
1720 : : struct cfg80211_mgmt_tx_params *params, u64 *cookie);
1721 : : int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
1722 : : struct wireless_dev *wdev, u64 cookie);
1723 : :
1724 : : /* channel switch handling */
1725 : : void ieee80211_csa_finalize_work(struct work_struct *work);
1726 : : int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
1727 : : struct cfg80211_csa_settings *params);
1728 : :
1729 : : /* interface handling */
1730 : : int ieee80211_iface_init(void);
1731 : : void ieee80211_iface_exit(void);
1732 : : int ieee80211_if_add(struct ieee80211_local *local, const char *name,
1733 : : unsigned char name_assign_type,
1734 : : struct wireless_dev **new_wdev, enum nl80211_iftype type,
1735 : : struct vif_params *params);
1736 : : int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
1737 : : enum nl80211_iftype type);
1738 : : void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata);
1739 : : void ieee80211_remove_interfaces(struct ieee80211_local *local);
1740 : : u32 ieee80211_idle_off(struct ieee80211_local *local);
1741 : : void ieee80211_recalc_idle(struct ieee80211_local *local);
1742 : : void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
1743 : : const int offset);
1744 : : int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up);
1745 : : void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata);
1746 : : int ieee80211_add_virtual_monitor(struct ieee80211_local *local);
1747 : : void ieee80211_del_virtual_monitor(struct ieee80211_local *local);
1748 : :
1749 : : bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata);
1750 : : void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata,
1751 : : bool update_bss);
1752 : :
1753 : 0 : static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata)
1754 : : {
1755 : 0 : return test_bit(SDATA_STATE_RUNNING, &sdata->state);
1756 : : }
1757 : :
1758 : : /* tx handling */
1759 : : void ieee80211_clear_tx_pending(struct ieee80211_local *local);
1760 : : void ieee80211_tx_pending(unsigned long data);
1761 : : netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
1762 : : struct net_device *dev);
1763 : : netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
1764 : : struct net_device *dev);
1765 : : void __ieee80211_subif_start_xmit(struct sk_buff *skb,
1766 : : struct net_device *dev,
1767 : : u32 info_flags,
1768 : : u32 ctrl_flags);
1769 : : void ieee80211_purge_tx_queue(struct ieee80211_hw *hw,
1770 : : struct sk_buff_head *skbs);
1771 : : struct sk_buff *
1772 : : ieee80211_build_data_template(struct ieee80211_sub_if_data *sdata,
1773 : : struct sk_buff *skb, u32 info_flags);
1774 : : void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
1775 : : struct ieee80211_supported_band *sband,
1776 : : int retry_count, int shift, bool send_to_cooked,
1777 : : struct ieee80211_tx_status *status);
1778 : :
1779 : : void ieee80211_check_fast_xmit(struct sta_info *sta);
1780 : : void ieee80211_check_fast_xmit_all(struct ieee80211_local *local);
1781 : : void ieee80211_check_fast_xmit_iface(struct ieee80211_sub_if_data *sdata);
1782 : : void ieee80211_clear_fast_xmit(struct sta_info *sta);
1783 : : int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev,
1784 : : const u8 *buf, size_t len,
1785 : : const u8 *dest, __be16 proto, bool unencrypted);
1786 : : int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
1787 : : const u8 *buf, size_t len);
1788 : :
1789 : : /* HT */
1790 : : void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
1791 : : struct ieee80211_sta_ht_cap *ht_cap);
1792 : : bool ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
1793 : : struct ieee80211_supported_band *sband,
1794 : : const struct ieee80211_ht_cap *ht_cap_ie,
1795 : : struct sta_info *sta);
1796 : : void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
1797 : : const u8 *da, u16 tid,
1798 : : u16 initiator, u16 reason_code);
1799 : : int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata,
1800 : : enum ieee80211_smps_mode smps, const u8 *da,
1801 : : const u8 *bssid);
1802 : : void ieee80211_request_smps_ap_work(struct work_struct *work);
1803 : : void ieee80211_request_smps_mgd_work(struct work_struct *work);
1804 : : bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old,
1805 : : enum ieee80211_smps_mode smps_mode_new);
1806 : :
1807 : : void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
1808 : : u16 initiator, u16 reason, bool stop);
1809 : : void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
1810 : : u16 initiator, u16 reason, bool stop);
1811 : : void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
1812 : : u8 dialog_token, u16 timeout,
1813 : : u16 start_seq_num, u16 ba_policy, u16 tid,
1814 : : u16 buf_size, bool tx, bool auto_seq,
1815 : : const struct ieee80211_addba_ext_ie *addbaext);
1816 : : void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta,
1817 : : enum ieee80211_agg_stop_reason reason);
1818 : : void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
1819 : : struct sta_info *sta,
1820 : : struct ieee80211_mgmt *mgmt, size_t len);
1821 : : void ieee80211_process_addba_resp(struct ieee80211_local *local,
1822 : : struct sta_info *sta,
1823 : : struct ieee80211_mgmt *mgmt,
1824 : : size_t len);
1825 : : void ieee80211_process_addba_request(struct ieee80211_local *local,
1826 : : struct sta_info *sta,
1827 : : struct ieee80211_mgmt *mgmt,
1828 : : size_t len);
1829 : :
1830 : : int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
1831 : : enum ieee80211_agg_stop_reason reason);
1832 : : int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid,
1833 : : enum ieee80211_agg_stop_reason reason);
1834 : : void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid,
1835 : : struct tid_ampdu_tx *tid_tx);
1836 : : void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid,
1837 : : struct tid_ampdu_tx *tid_tx);
1838 : : void ieee80211_ba_session_work(struct work_struct *work);
1839 : : void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid);
1840 : : void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid);
1841 : :
1842 : : u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs);
1843 : : enum nl80211_smps_mode
1844 : : ieee80211_smps_mode_to_smps_mode(enum ieee80211_smps_mode smps);
1845 : :
1846 : : /* VHT */
1847 : : void
1848 : : ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
1849 : : struct ieee80211_supported_band *sband,
1850 : : const struct ieee80211_vht_cap *vht_cap_ie,
1851 : : struct sta_info *sta);
1852 : : enum ieee80211_sta_rx_bandwidth ieee80211_sta_cap_rx_bw(struct sta_info *sta);
1853 : : enum ieee80211_sta_rx_bandwidth ieee80211_sta_cur_vht_bw(struct sta_info *sta);
1854 : : void ieee80211_sta_set_rx_nss(struct sta_info *sta);
1855 : : enum ieee80211_sta_rx_bandwidth
1856 : : ieee80211_chan_width_to_rx_bw(enum nl80211_chan_width width);
1857 : : enum nl80211_chan_width ieee80211_sta_cap_chan_bw(struct sta_info *sta);
1858 : : void ieee80211_sta_set_rx_nss(struct sta_info *sta);
1859 : : void ieee80211_process_mu_groups(struct ieee80211_sub_if_data *sdata,
1860 : : struct ieee80211_mgmt *mgmt);
1861 : : u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
1862 : : struct sta_info *sta, u8 opmode,
1863 : : enum nl80211_band band);
1864 : : void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
1865 : : struct sta_info *sta, u8 opmode,
1866 : : enum nl80211_band band);
1867 : : void ieee80211_apply_vhtcap_overrides(struct ieee80211_sub_if_data *sdata,
1868 : : struct ieee80211_sta_vht_cap *vht_cap);
1869 : : void ieee80211_get_vht_mask_from_cap(__le16 vht_cap,
1870 : : u16 vht_mask[NL80211_VHT_NSS_MAX]);
1871 : : enum nl80211_chan_width
1872 : : ieee80211_sta_rx_bw_to_chan_width(struct sta_info *sta);
1873 : :
1874 : : /* HE */
1875 : : void
1876 : : ieee80211_he_cap_ie_to_sta_he_cap(struct ieee80211_sub_if_data *sdata,
1877 : : struct ieee80211_supported_band *sband,
1878 : : const u8 *he_cap_ie, u8 he_cap_len,
1879 : : struct sta_info *sta);
1880 : : void
1881 : : ieee80211_he_spr_ie_to_bss_conf(struct ieee80211_vif *vif,
1882 : : const struct ieee80211_he_spr *he_spr_ie_elem);
1883 : :
1884 : : void
1885 : : ieee80211_he_op_ie_to_bss_conf(struct ieee80211_vif *vif,
1886 : : const struct ieee80211_he_operation *he_op_ie_elem);
1887 : :
1888 : : /* Spectrum management */
1889 : : void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata,
1890 : : struct ieee80211_mgmt *mgmt,
1891 : : size_t len);
1892 : : /**
1893 : : * ieee80211_parse_ch_switch_ie - parses channel switch IEs
1894 : : * @sdata: the sdata of the interface which has received the frame
1895 : : * @elems: parsed 802.11 elements received with the frame
1896 : : * @current_band: indicates the current band
1897 : : * @sta_flags: contains information about own capabilities and restrictions
1898 : : * to decide which channel switch announcements can be accepted. Only the
1899 : : * following subset of &enum ieee80211_sta_flags are evaluated:
1900 : : * %IEEE80211_STA_DISABLE_HT, %IEEE80211_STA_DISABLE_VHT,
1901 : : * %IEEE80211_STA_DISABLE_40MHZ, %IEEE80211_STA_DISABLE_80P80MHZ,
1902 : : * %IEEE80211_STA_DISABLE_160MHZ.
1903 : : * @bssid: the currently connected bssid (for reporting)
1904 : : * @csa_ie: parsed 802.11 csa elements on count, mode, chandef and mesh ttl.
1905 : : All of them will be filled with if success only.
1906 : : * Return: 0 on success, <0 on error and >0 if there is nothing to parse.
1907 : : */
1908 : : int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
1909 : : struct ieee802_11_elems *elems,
1910 : : enum nl80211_band current_band,
1911 : : u32 sta_flags, u8 *bssid,
1912 : : struct ieee80211_csa_ie *csa_ie);
1913 : :
1914 : : /* Suspend/resume and hw reconfiguration */
1915 : : int ieee80211_reconfig(struct ieee80211_local *local);
1916 : : void ieee80211_stop_device(struct ieee80211_local *local);
1917 : :
1918 : : int __ieee80211_suspend(struct ieee80211_hw *hw,
1919 : : struct cfg80211_wowlan *wowlan);
1920 : :
1921 : 0 : static inline int __ieee80211_resume(struct ieee80211_hw *hw)
1922 : : {
1923 : 0 : struct ieee80211_local *local = hw_to_local(hw);
1924 : :
1925 [ # # # # : 0 : WARN(test_bit(SCAN_HW_SCANNING, &local->scanning) &&
# # # # ]
1926 : : !test_bit(SCAN_COMPLETED, &local->scanning),
1927 : : "%s: resume with hardware scan still in progress\n",
1928 : : wiphy_name(hw->wiphy));
1929 : :
1930 : 0 : return ieee80211_reconfig(hw_to_local(hw));
1931 : : }
1932 : :
1933 : : /* utility functions/constants */
1934 : : extern const void *const mac80211_wiphy_privid; /* for wiphy privid */
1935 : : int ieee80211_frame_duration(enum nl80211_band band, size_t len,
1936 : : int rate, int erp, int short_preamble,
1937 : : int shift);
1938 : : void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
1939 : : struct ieee80211_tx_queue_params *qparam,
1940 : : int ac);
1941 : : void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
1942 : : bool bss_notify, bool enable_qos);
1943 : : void ieee80211_xmit(struct ieee80211_sub_if_data *sdata,
1944 : : struct sta_info *sta, struct sk_buff *skb,
1945 : : u32 txdata_flags);
1946 : :
1947 : : void __ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
1948 : : struct sk_buff *skb, int tid,
1949 : : enum nl80211_band band, u32 txdata_flags);
1950 : :
1951 : : static inline void
1952 : 0 : ieee80211_tx_skb_tid_band(struct ieee80211_sub_if_data *sdata,
1953 : : struct sk_buff *skb, int tid,
1954 : : enum nl80211_band band, u32 txdata_flags)
1955 : : {
1956 : 0 : rcu_read_lock();
1957 : 0 : __ieee80211_tx_skb_tid_band(sdata, skb, tid, band, txdata_flags);
1958 : 0 : rcu_read_unlock();
1959 : 0 : }
1960 : :
1961 : 0 : static inline void ieee80211_tx_skb_tid(struct ieee80211_sub_if_data *sdata,
1962 : : struct sk_buff *skb, int tid)
1963 : : {
1964 : 0 : struct ieee80211_chanctx_conf *chanctx_conf;
1965 : :
1966 : 0 : rcu_read_lock();
1967 [ # # ]: 0 : chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1968 [ # # # # ]: 0 : if (WARN_ON(!chanctx_conf)) {
1969 : 0 : rcu_read_unlock();
1970 : 0 : kfree_skb(skb);
1971 : 0 : return;
1972 : : }
1973 : :
1974 : 0 : __ieee80211_tx_skb_tid_band(sdata, skb, tid,
1975 : 0 : chanctx_conf->def.chan->band, 0);
1976 : 0 : rcu_read_unlock();
1977 : : }
1978 : :
1979 : 0 : static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
1980 : : struct sk_buff *skb)
1981 : : {
1982 : : /* Send all internal mgmt frames on VO. Accordingly set TID to 7. */
1983 : 0 : ieee80211_tx_skb_tid(sdata, skb, 7);
1984 : 0 : }
1985 : :
1986 : : u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
1987 : : struct ieee802_11_elems *elems,
1988 : : u64 filter, u32 crc, u8 *transmitter_bssid,
1989 : : u8 *bss_bssid);
1990 : 0 : static inline void ieee802_11_parse_elems(const u8 *start, size_t len,
1991 : : bool action,
1992 : : struct ieee802_11_elems *elems,
1993 : : u8 *transmitter_bssid,
1994 : : u8 *bss_bssid)
1995 : : {
1996 : 0 : ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0,
1997 : : transmitter_bssid, bss_bssid);
1998 : : }
1999 : :
2000 : :
2001 : : extern const int ieee802_1d_to_ac[8];
2002 : :
2003 : 0 : static inline int ieee80211_ac_from_tid(int tid)
2004 : : {
2005 [ # # ]: 0 : return ieee802_1d_to_ac[tid & 7];
2006 : : }
2007 : :
2008 : : void ieee80211_dynamic_ps_enable_work(struct work_struct *work);
2009 : : void ieee80211_dynamic_ps_disable_work(struct work_struct *work);
2010 : : void ieee80211_dynamic_ps_timer(struct timer_list *t);
2011 : : void ieee80211_send_nullfunc(struct ieee80211_local *local,
2012 : : struct ieee80211_sub_if_data *sdata,
2013 : : bool powersave);
2014 : : void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
2015 : : struct ieee80211_hdr *hdr);
2016 : : void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
2017 : : struct ieee80211_hdr *hdr, bool ack, u16 tx_time);
2018 : :
2019 : : void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
2020 : : unsigned long queues,
2021 : : enum queue_stop_reason reason,
2022 : : bool refcounted);
2023 : : void ieee80211_stop_vif_queues(struct ieee80211_local *local,
2024 : : struct ieee80211_sub_if_data *sdata,
2025 : : enum queue_stop_reason reason);
2026 : : void ieee80211_wake_vif_queues(struct ieee80211_local *local,
2027 : : struct ieee80211_sub_if_data *sdata,
2028 : : enum queue_stop_reason reason);
2029 : : void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
2030 : : unsigned long queues,
2031 : : enum queue_stop_reason reason,
2032 : : bool refcounted);
2033 : : void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
2034 : : enum queue_stop_reason reason,
2035 : : bool refcounted);
2036 : : void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
2037 : : enum queue_stop_reason reason,
2038 : : bool refcounted);
2039 : : void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
2040 : : void ieee80211_add_pending_skb(struct ieee80211_local *local,
2041 : : struct sk_buff *skb);
2042 : : void ieee80211_add_pending_skbs(struct ieee80211_local *local,
2043 : : struct sk_buff_head *skbs);
2044 : : void ieee80211_flush_queues(struct ieee80211_local *local,
2045 : : struct ieee80211_sub_if_data *sdata, bool drop);
2046 : : void __ieee80211_flush_queues(struct ieee80211_local *local,
2047 : : struct ieee80211_sub_if_data *sdata,
2048 : : unsigned int queues, bool drop);
2049 : :
2050 : 0 : static inline bool ieee80211_can_run_worker(struct ieee80211_local *local)
2051 : : {
2052 : : /*
2053 : : * It's unsafe to try to do any work during reconfigure flow.
2054 : : * When the flow ends the work will be requeued.
2055 : : */
2056 [ # # ]: 0 : if (local->in_reconfig)
2057 : : return false;
2058 : :
2059 : : /*
2060 : : * If quiescing is set, we are racing with __ieee80211_suspend.
2061 : : * __ieee80211_suspend flushes the workers after setting quiescing,
2062 : : * and we check quiescing / suspended before enqueing new workers.
2063 : : * We should abort the worker to avoid the races below.
2064 : : */
2065 [ # # ]: 0 : if (local->quiescing)
2066 : : return false;
2067 : :
2068 : : /*
2069 : : * We might already be suspended if the following scenario occurs:
2070 : : * __ieee80211_suspend Control path
2071 : : *
2072 : : * if (local->quiescing)
2073 : : * return;
2074 : : * local->quiescing = true;
2075 : : * flush_workqueue();
2076 : : * queue_work(...);
2077 : : * local->suspended = true;
2078 : : * local->quiescing = false;
2079 : : * worker starts running...
2080 : : */
2081 [ # # ]: 0 : if (local->suspended)
2082 : : return false;
2083 : :
2084 : : return true;
2085 : : }
2086 : :
2087 : : int ieee80211_txq_setup_flows(struct ieee80211_local *local);
2088 : : void ieee80211_txq_set_params(struct ieee80211_local *local);
2089 : : void ieee80211_txq_teardown_flows(struct ieee80211_local *local);
2090 : : void ieee80211_txq_init(struct ieee80211_sub_if_data *sdata,
2091 : : struct sta_info *sta,
2092 : : struct txq_info *txq, int tid);
2093 : : void ieee80211_txq_purge(struct ieee80211_local *local,
2094 : : struct txq_info *txqi);
2095 : : void ieee80211_txq_remove_vlan(struct ieee80211_local *local,
2096 : : struct ieee80211_sub_if_data *sdata);
2097 : : void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats,
2098 : : struct txq_info *txqi);
2099 : : void ieee80211_wake_txqs(unsigned long data);
2100 : : void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
2101 : : u16 transaction, u16 auth_alg, u16 status,
2102 : : const u8 *extra, size_t extra_len, const u8 *bssid,
2103 : : const u8 *da, const u8 *key, u8 key_len, u8 key_idx,
2104 : : u32 tx_flags);
2105 : : void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
2106 : : const u8 *da, const u8 *bssid,
2107 : : u16 stype, u16 reason,
2108 : : bool send_frame, u8 *frame_buf);
2109 : :
2110 : : enum {
2111 : : IEEE80211_PROBE_FLAG_DIRECTED = BIT(0),
2112 : : IEEE80211_PROBE_FLAG_MIN_CONTENT = BIT(1),
2113 : : IEEE80211_PROBE_FLAG_RANDOM_SN = BIT(2),
2114 : : };
2115 : :
2116 : : int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
2117 : : size_t buffer_len,
2118 : : struct ieee80211_scan_ies *ie_desc,
2119 : : const u8 *ie, size_t ie_len,
2120 : : u8 bands_used, u32 *rate_masks,
2121 : : struct cfg80211_chan_def *chandef,
2122 : : u32 flags);
2123 : : struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
2124 : : const u8 *src, const u8 *dst,
2125 : : u32 ratemask,
2126 : : struct ieee80211_channel *chan,
2127 : : const u8 *ssid, size_t ssid_len,
2128 : : const u8 *ie, size_t ie_len,
2129 : : u32 flags);
2130 : : u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
2131 : : struct ieee802_11_elems *elems,
2132 : : enum nl80211_band band, u32 *basic_rates);
2133 : : int __ieee80211_request_smps_mgd(struct ieee80211_sub_if_data *sdata,
2134 : : enum ieee80211_smps_mode smps_mode);
2135 : : int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
2136 : : enum ieee80211_smps_mode smps_mode);
2137 : : void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata);
2138 : : void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata);
2139 : :
2140 : : size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
2141 : : u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2142 : : u16 cap);
2143 : : u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2144 : : const struct cfg80211_chan_def *chandef,
2145 : : u16 prot_mode, bool rifs_mode);
2146 : : void ieee80211_ie_build_wide_bw_cs(u8 *pos,
2147 : : const struct cfg80211_chan_def *chandef);
2148 : : u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2149 : : u32 cap);
2150 : : u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2151 : : const struct cfg80211_chan_def *chandef);
2152 : : u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype);
2153 : : u8 *ieee80211_ie_build_he_cap(u8 *pos,
2154 : : const struct ieee80211_sta_he_cap *he_cap,
2155 : : u8 *end);
2156 : : u8 *ieee80211_ie_build_he_oper(u8 *pos);
2157 : : int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef,
2158 : : const struct ieee80211_supported_band *sband,
2159 : : const u8 *srates, int srates_len, u32 *rates);
2160 : : int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
2161 : : struct sk_buff *skb, bool need_basic,
2162 : : enum nl80211_band band);
2163 : : int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
2164 : : struct sk_buff *skb, bool need_basic,
2165 : : enum nl80211_band band);
2166 : : u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo);
2167 : :
2168 : : /* channel management */
2169 : : bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
2170 : : struct cfg80211_chan_def *chandef);
2171 : : bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
2172 : : const struct ieee80211_vht_operation *oper,
2173 : : const struct ieee80211_ht_operation *htop,
2174 : : struct cfg80211_chan_def *chandef);
2175 : : u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c);
2176 : :
2177 : : int __must_check
2178 : : ieee80211_vif_use_channel(struct ieee80211_sub_if_data *sdata,
2179 : : const struct cfg80211_chan_def *chandef,
2180 : : enum ieee80211_chanctx_mode mode);
2181 : : int __must_check
2182 : : ieee80211_vif_reserve_chanctx(struct ieee80211_sub_if_data *sdata,
2183 : : const struct cfg80211_chan_def *chandef,
2184 : : enum ieee80211_chanctx_mode mode,
2185 : : bool radar_required);
2186 : : int __must_check
2187 : : ieee80211_vif_use_reserved_context(struct ieee80211_sub_if_data *sdata);
2188 : : int ieee80211_vif_unreserve_chanctx(struct ieee80211_sub_if_data *sdata);
2189 : :
2190 : : int __must_check
2191 : : ieee80211_vif_change_bandwidth(struct ieee80211_sub_if_data *sdata,
2192 : : const struct cfg80211_chan_def *chandef,
2193 : : u32 *changed);
2194 : : void ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata);
2195 : : void ieee80211_vif_vlan_copy_chanctx(struct ieee80211_sub_if_data *sdata);
2196 : : void ieee80211_vif_copy_chanctx_to_vlans(struct ieee80211_sub_if_data *sdata,
2197 : : bool clear);
2198 : : int ieee80211_chanctx_refcount(struct ieee80211_local *local,
2199 : : struct ieee80211_chanctx *ctx);
2200 : :
2201 : : void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
2202 : : struct ieee80211_chanctx *chanctx);
2203 : : void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
2204 : : struct ieee80211_chanctx *ctx);
2205 : : bool ieee80211_is_radar_required(struct ieee80211_local *local);
2206 : :
2207 : : void ieee80211_dfs_cac_timer(unsigned long data);
2208 : : void ieee80211_dfs_cac_timer_work(struct work_struct *work);
2209 : : void ieee80211_dfs_cac_cancel(struct ieee80211_local *local);
2210 : : void ieee80211_dfs_radar_detected_work(struct work_struct *work);
2211 : : int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata,
2212 : : struct cfg80211_csa_settings *csa_settings);
2213 : :
2214 : : bool ieee80211_cs_valid(const struct ieee80211_cipher_scheme *cs);
2215 : : bool ieee80211_cs_list_valid(const struct ieee80211_cipher_scheme *cs, int n);
2216 : : const struct ieee80211_cipher_scheme *
2217 : : ieee80211_cs_get(struct ieee80211_local *local, u32 cipher,
2218 : : enum nl80211_iftype iftype);
2219 : : int ieee80211_cs_headroom(struct ieee80211_local *local,
2220 : : struct cfg80211_crypto_settings *crypto,
2221 : : enum nl80211_iftype iftype);
2222 : : void ieee80211_recalc_dtim(struct ieee80211_local *local,
2223 : : struct ieee80211_sub_if_data *sdata);
2224 : : int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
2225 : : const struct cfg80211_chan_def *chandef,
2226 : : enum ieee80211_chanctx_mode chanmode,
2227 : : u8 radar_detect);
2228 : : int ieee80211_max_num_channels(struct ieee80211_local *local);
2229 : : enum nl80211_chan_width ieee80211_get_sta_bw(struct ieee80211_sta *sta);
2230 : : void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
2231 : : struct ieee80211_chanctx *ctx);
2232 : :
2233 : : /* TDLS */
2234 : : int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
2235 : : const u8 *peer, u8 action_code, u8 dialog_token,
2236 : : u16 status_code, u32 peer_capability,
2237 : : bool initiator, const u8 *extra_ies,
2238 : : size_t extra_ies_len);
2239 : : int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
2240 : : const u8 *peer, enum nl80211_tdls_operation oper);
2241 : : void ieee80211_tdls_peer_del_work(struct work_struct *wk);
2242 : : int ieee80211_tdls_channel_switch(struct wiphy *wiphy, struct net_device *dev,
2243 : : const u8 *addr, u8 oper_class,
2244 : : struct cfg80211_chan_def *chandef);
2245 : : void ieee80211_tdls_cancel_channel_switch(struct wiphy *wiphy,
2246 : : struct net_device *dev,
2247 : : const u8 *addr);
2248 : : void ieee80211_teardown_tdls_peers(struct ieee80211_sub_if_data *sdata);
2249 : : void ieee80211_tdls_chsw_work(struct work_struct *wk);
2250 : : void ieee80211_tdls_handle_disconnect(struct ieee80211_sub_if_data *sdata,
2251 : : const u8 *peer, u16 reason);
2252 : : const char *ieee80211_get_reason_code_string(u16 reason_code);
2253 : :
2254 : : extern const struct ethtool_ops ieee80211_ethtool_ops;
2255 : :
2256 : : u32 ieee80211_calc_expected_tx_airtime(struct ieee80211_hw *hw,
2257 : : struct ieee80211_vif *vif,
2258 : : struct ieee80211_sta *pubsta,
2259 : : int len);
2260 : : #ifdef CONFIG_MAC80211_NOINLINE
2261 : : #define debug_noinline noinline
2262 : : #else
2263 : : #define debug_noinline
2264 : : #endif
2265 : :
2266 : : #endif /* IEEE80211_I_H */
|