1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright 2002-2005, Instant802 Networks, Inc.
4 * Copyright 2005-2006, Devicescape Software, Inc.
5 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
6 * Copyright 2007 Johannes Berg <johannes@sipsolutions.net>
7 * Copyright 2013-2014 Intel Mobile Communications GmbH
8 * Copyright (C) 2015-2017 Intel Deutschland GmbH
9 * Copyright (C) 2018-2024 Intel Corporation
11 * utilities for mac80211
14 #include <net/mac80211.h>
15 #include <linux/netdevice.h>
16 #include <linux/export.h>
17 #include <linux/types.h>
18 #include <linux/slab.h>
19 #include <linux/skbuff.h>
20 #include <linux/etherdevice.h>
21 #include <linux/if_arp.h>
22 #include <linux/bitmap.h>
23 #include <linux/crc32.h>
24 #include <net/net_namespace.h>
25 #include <net/cfg80211.h>
26 #include <net/rtnetlink.h>
27 #include <kunit/visibility.h>
29 #include "ieee80211_i.h"
30 #include "driver-ops.h"
37 /* privid for wiphys to determine whether they belong to us or not */
38 const void *const mac80211_wiphy_privid
= &mac80211_wiphy_privid
;
40 struct ieee80211_hw
*wiphy_to_ieee80211_hw(struct wiphy
*wiphy
)
42 struct ieee80211_local
*local
;
44 local
= wiphy_priv(wiphy
);
47 EXPORT_SYMBOL(wiphy_to_ieee80211_hw
);
49 const struct ieee80211_conn_settings ieee80211_conn_settings_unlimited
= {
50 .mode
= IEEE80211_CONN_MODE_EHT
,
51 .bw_limit
= IEEE80211_CONN_BW_LIMIT_320
,
54 u8
*ieee80211_get_bssid(struct ieee80211_hdr
*hdr
, size_t len
,
55 enum nl80211_iftype type
)
57 __le16 fc
= hdr
->frame_control
;
59 if (ieee80211_is_data(fc
)) {
60 if (len
< 24) /* drop incorrect hdr len (data) */
63 if (ieee80211_has_a4(fc
))
65 if (ieee80211_has_tods(fc
))
67 if (ieee80211_has_fromds(fc
))
73 if (ieee80211_is_s1g_beacon(fc
)) {
74 struct ieee80211_ext
*ext
= (void *) hdr
;
76 return ext
->u
.s1g_beacon
.sa
;
79 if (ieee80211_is_mgmt(fc
)) {
80 if (len
< 24) /* drop incorrect hdr len (mgmt) */
85 if (ieee80211_is_ctl(fc
)) {
86 if (ieee80211_is_pspoll(fc
))
89 if (ieee80211_is_back_req(fc
)) {
91 case NL80211_IFTYPE_STATION
:
93 case NL80211_IFTYPE_AP
:
94 case NL80211_IFTYPE_AP_VLAN
:
97 break; /* fall through to the return */
104 EXPORT_SYMBOL(ieee80211_get_bssid
);
106 void ieee80211_tx_set_protected(struct ieee80211_tx_data
*tx
)
109 struct ieee80211_hdr
*hdr
;
111 skb_queue_walk(&tx
->skbs
, skb
) {
112 hdr
= (struct ieee80211_hdr
*) skb
->data
;
113 hdr
->frame_control
|= cpu_to_le16(IEEE80211_FCTL_PROTECTED
);
117 int ieee80211_frame_duration(enum nl80211_band band
, size_t len
,
118 int rate
, int erp
, int short_preamble
)
122 /* calculate duration (in microseconds, rounded up to next higher
123 * integer if it includes a fractional microsecond) to send frame of
124 * len bytes (does not include FCS) at the given rate. Duration will
127 * rate is in 100 kbps, so divident is multiplied by 10 in the
128 * DIV_ROUND_UP() operations.
131 if (band
== NL80211_BAND_5GHZ
|| erp
) {
135 * N_DBPS = DATARATE x 4
136 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS)
137 * (16 = SIGNAL time, 6 = tail bits)
138 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext
141 * 802.11a - 18.5.2: aSIFSTime = 16 usec
142 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
143 * signal ext = 6 usec
145 dur
= 16; /* SIFS + signal ext */
146 dur
+= 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
147 dur
+= 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
149 /* rates should already consider the channel bandwidth,
150 * don't apply divisor again.
152 dur
+= 4 * DIV_ROUND_UP((16 + 8 * (len
+ 4) + 6) * 10,
153 4 * rate
); /* T_SYM x N_SYM */
156 * 802.11b or 802.11g with 802.11b compatibility:
157 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime +
158 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0.
160 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4
161 * aSIFSTime = 10 usec
162 * aPreambleLength = 144 usec or 72 usec with short preamble
163 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble
165 dur
= 10; /* aSIFSTime = 10 usec */
166 dur
+= short_preamble
? (72 + 24) : (144 + 48);
168 dur
+= DIV_ROUND_UP(8 * (len
+ 4) * 10, rate
);
174 /* Exported duration function for driver use */
175 __le16
ieee80211_generic_frame_duration(struct ieee80211_hw
*hw
,
176 struct ieee80211_vif
*vif
,
177 enum nl80211_band band
,
179 struct ieee80211_rate
*rate
)
181 struct ieee80211_sub_if_data
*sdata
;
184 bool short_preamble
= false;
188 sdata
= vif_to_sdata(vif
);
189 short_preamble
= sdata
->vif
.bss_conf
.use_short_preamble
;
190 if (sdata
->deflink
.operating_11g_mode
)
191 erp
= rate
->flags
& IEEE80211_RATE_ERP_G
;
194 dur
= ieee80211_frame_duration(band
, frame_len
, rate
->bitrate
, erp
,
197 return cpu_to_le16(dur
);
199 EXPORT_SYMBOL(ieee80211_generic_frame_duration
);
201 __le16
ieee80211_rts_duration(struct ieee80211_hw
*hw
,
202 struct ieee80211_vif
*vif
, size_t frame_len
,
203 const struct ieee80211_tx_info
*frame_txctl
)
205 struct ieee80211_local
*local
= hw_to_local(hw
);
206 struct ieee80211_rate
*rate
;
207 struct ieee80211_sub_if_data
*sdata
;
211 struct ieee80211_supported_band
*sband
;
213 sband
= local
->hw
.wiphy
->bands
[frame_txctl
->band
];
215 short_preamble
= false;
217 rate
= &sband
->bitrates
[frame_txctl
->control
.rts_cts_rate_idx
];
221 sdata
= vif_to_sdata(vif
);
222 short_preamble
= sdata
->vif
.bss_conf
.use_short_preamble
;
223 if (sdata
->deflink
.operating_11g_mode
)
224 erp
= rate
->flags
& IEEE80211_RATE_ERP_G
;
227 bitrate
= rate
->bitrate
;
230 dur
= ieee80211_frame_duration(sband
->band
, 10, bitrate
,
231 erp
, short_preamble
);
232 /* Data frame duration */
233 dur
+= ieee80211_frame_duration(sband
->band
, frame_len
, bitrate
,
234 erp
, short_preamble
);
236 dur
+= ieee80211_frame_duration(sband
->band
, 10, bitrate
,
237 erp
, short_preamble
);
239 return cpu_to_le16(dur
);
241 EXPORT_SYMBOL(ieee80211_rts_duration
);
243 __le16
ieee80211_ctstoself_duration(struct ieee80211_hw
*hw
,
244 struct ieee80211_vif
*vif
,
246 const struct ieee80211_tx_info
*frame_txctl
)
248 struct ieee80211_local
*local
= hw_to_local(hw
);
249 struct ieee80211_rate
*rate
;
250 struct ieee80211_sub_if_data
*sdata
;
254 struct ieee80211_supported_band
*sband
;
256 sband
= local
->hw
.wiphy
->bands
[frame_txctl
->band
];
258 short_preamble
= false;
260 rate
= &sband
->bitrates
[frame_txctl
->control
.rts_cts_rate_idx
];
263 sdata
= vif_to_sdata(vif
);
264 short_preamble
= sdata
->vif
.bss_conf
.use_short_preamble
;
265 if (sdata
->deflink
.operating_11g_mode
)
266 erp
= rate
->flags
& IEEE80211_RATE_ERP_G
;
269 bitrate
= rate
->bitrate
;
271 /* Data frame duration */
272 dur
= ieee80211_frame_duration(sband
->band
, frame_len
, bitrate
,
273 erp
, short_preamble
);
274 if (!(frame_txctl
->flags
& IEEE80211_TX_CTL_NO_ACK
)) {
276 dur
+= ieee80211_frame_duration(sband
->band
, 10, bitrate
,
277 erp
, short_preamble
);
280 return cpu_to_le16(dur
);
282 EXPORT_SYMBOL(ieee80211_ctstoself_duration
);
284 static void wake_tx_push_queue(struct ieee80211_local
*local
,
285 struct ieee80211_sub_if_data
*sdata
,
286 struct ieee80211_txq
*queue
)
288 struct ieee80211_tx_control control
= {
294 skb
= ieee80211_tx_dequeue(&local
->hw
, queue
);
298 drv_tx(local
, &control
, skb
);
302 /* wake_tx_queue handler for driver not implementing a custom one*/
303 void ieee80211_handle_wake_tx_queue(struct ieee80211_hw
*hw
,
304 struct ieee80211_txq
*txq
)
306 struct ieee80211_local
*local
= hw_to_local(hw
);
307 struct ieee80211_sub_if_data
*sdata
= vif_to_sdata(txq
->vif
);
308 struct ieee80211_txq
*queue
;
310 spin_lock(&local
->handle_wake_tx_queue_lock
);
312 /* Use ieee80211_next_txq() for airtime fairness accounting */
313 ieee80211_txq_schedule_start(hw
, txq
->ac
);
314 while ((queue
= ieee80211_next_txq(hw
, txq
->ac
))) {
315 wake_tx_push_queue(local
, sdata
, queue
);
316 ieee80211_return_txq(hw
, queue
, false);
318 ieee80211_txq_schedule_end(hw
, txq
->ac
);
319 spin_unlock(&local
->handle_wake_tx_queue_lock
);
321 EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue
);
323 static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data
*sdata
, int ac
)
325 struct ieee80211_local
*local
= sdata
->local
;
326 struct ieee80211_vif
*vif
= &sdata
->vif
;
327 struct fq
*fq
= &local
->fq
;
328 struct ps_data
*ps
= NULL
;
329 struct txq_info
*txqi
;
330 struct sta_info
*sta
;
334 spin_lock(&fq
->lock
);
336 if (!test_bit(SDATA_STATE_RUNNING
, &sdata
->state
))
339 if (sdata
->vif
.type
== NL80211_IFTYPE_AP
)
340 ps
= &sdata
->bss
->ps
;
342 list_for_each_entry_rcu(sta
, &local
->sta_list
, list
) {
343 if (sdata
!= sta
->sdata
)
346 for (i
= 0; i
< ARRAY_SIZE(sta
->sta
.txq
); i
++) {
347 struct ieee80211_txq
*txq
= sta
->sta
.txq
[i
];
352 txqi
= to_txq_info(txq
);
357 if (!test_and_clear_bit(IEEE80211_TXQ_DIRTY
,
361 spin_unlock(&fq
->lock
);
362 drv_wake_tx_queue(local
, txqi
);
363 spin_lock(&fq
->lock
);
370 txqi
= to_txq_info(vif
->txq
);
372 if (!test_and_clear_bit(IEEE80211_TXQ_DIRTY
, &txqi
->flags
) ||
373 (ps
&& atomic_read(&ps
->num_sta_ps
)) || ac
!= vif
->txq
->ac
)
376 spin_unlock(&fq
->lock
);
378 drv_wake_tx_queue(local
, txqi
);
382 spin_unlock(&fq
->lock
);
387 __releases(&local
->queue_stop_reason_lock
)
388 __acquires(&local
->queue_stop_reason_lock
)
389 _ieee80211_wake_txqs(struct ieee80211_local
*local
, unsigned long *flags
)
391 struct ieee80211_sub_if_data
*sdata
;
392 int n_acs
= IEEE80211_NUM_ACS
;
397 if (local
->hw
.queues
< IEEE80211_NUM_ACS
)
400 for (i
= 0; i
< local
->hw
.queues
; i
++) {
401 if (local
->queue_stop_reasons
[i
])
404 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, *flags
);
405 list_for_each_entry_rcu(sdata
, &local
->interfaces
, list
) {
408 for (ac
= 0; ac
< n_acs
; ac
++) {
409 int ac_queue
= sdata
->vif
.hw_queue
[ac
];
412 sdata
->vif
.cab_queue
== i
)
413 __ieee80211_wake_txqs(sdata
, ac
);
416 spin_lock_irqsave(&local
->queue_stop_reason_lock
, *flags
);
422 void ieee80211_wake_txqs(struct tasklet_struct
*t
)
424 struct ieee80211_local
*local
= from_tasklet(local
, t
,
428 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
429 _ieee80211_wake_txqs(local
, &flags
);
430 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
433 static void __ieee80211_wake_queue(struct ieee80211_hw
*hw
, int queue
,
434 enum queue_stop_reason reason
,
436 unsigned long *flags
)
438 struct ieee80211_local
*local
= hw_to_local(hw
);
440 trace_wake_queue(local
, queue
, reason
);
442 if (WARN_ON(queue
>= hw
->queues
))
445 if (!test_bit(reason
, &local
->queue_stop_reasons
[queue
]))
449 local
->q_stop_reasons
[queue
][reason
] = 0;
451 local
->q_stop_reasons
[queue
][reason
]--;
452 if (WARN_ON(local
->q_stop_reasons
[queue
][reason
] < 0))
453 local
->q_stop_reasons
[queue
][reason
] = 0;
456 if (local
->q_stop_reasons
[queue
][reason
] == 0)
457 __clear_bit(reason
, &local
->queue_stop_reasons
[queue
]);
459 if (local
->queue_stop_reasons
[queue
] != 0)
460 /* someone still has this queue stopped */
463 if (!skb_queue_empty(&local
->pending
[queue
]))
464 tasklet_schedule(&local
->tx_pending_tasklet
);
467 * Calling _ieee80211_wake_txqs here can be a problem because it may
468 * release queue_stop_reason_lock which has been taken by
469 * __ieee80211_wake_queue's caller. It is certainly not very nice to
470 * release someone's lock, but it is fine because all the callers of
471 * __ieee80211_wake_queue call it right before releasing the lock.
473 if (reason
== IEEE80211_QUEUE_STOP_REASON_DRIVER
)
474 tasklet_schedule(&local
->wake_txqs_tasklet
);
476 _ieee80211_wake_txqs(local
, flags
);
479 void ieee80211_wake_queue_by_reason(struct ieee80211_hw
*hw
, int queue
,
480 enum queue_stop_reason reason
,
483 struct ieee80211_local
*local
= hw_to_local(hw
);
486 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
487 __ieee80211_wake_queue(hw
, queue
, reason
, refcounted
, &flags
);
488 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
491 void ieee80211_wake_queue(struct ieee80211_hw
*hw
, int queue
)
493 ieee80211_wake_queue_by_reason(hw
, queue
,
494 IEEE80211_QUEUE_STOP_REASON_DRIVER
,
497 EXPORT_SYMBOL(ieee80211_wake_queue
);
499 static void __ieee80211_stop_queue(struct ieee80211_hw
*hw
, int queue
,
500 enum queue_stop_reason reason
,
503 struct ieee80211_local
*local
= hw_to_local(hw
);
505 trace_stop_queue(local
, queue
, reason
);
507 if (WARN_ON(queue
>= hw
->queues
))
511 local
->q_stop_reasons
[queue
][reason
] = 1;
513 local
->q_stop_reasons
[queue
][reason
]++;
515 set_bit(reason
, &local
->queue_stop_reasons
[queue
]);
518 void ieee80211_stop_queue_by_reason(struct ieee80211_hw
*hw
, int queue
,
519 enum queue_stop_reason reason
,
522 struct ieee80211_local
*local
= hw_to_local(hw
);
525 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
526 __ieee80211_stop_queue(hw
, queue
, reason
, refcounted
);
527 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
530 void ieee80211_stop_queue(struct ieee80211_hw
*hw
, int queue
)
532 ieee80211_stop_queue_by_reason(hw
, queue
,
533 IEEE80211_QUEUE_STOP_REASON_DRIVER
,
536 EXPORT_SYMBOL(ieee80211_stop_queue
);
538 void ieee80211_add_pending_skb(struct ieee80211_local
*local
,
541 struct ieee80211_hw
*hw
= &local
->hw
;
543 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
544 int queue
= info
->hw_queue
;
546 if (WARN_ON(!info
->control
.vif
)) {
547 ieee80211_free_txskb(&local
->hw
, skb
);
551 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
552 __ieee80211_stop_queue(hw
, queue
, IEEE80211_QUEUE_STOP_REASON_SKB_ADD
,
554 __skb_queue_tail(&local
->pending
[queue
], skb
);
555 __ieee80211_wake_queue(hw
, queue
, IEEE80211_QUEUE_STOP_REASON_SKB_ADD
,
557 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
560 void ieee80211_add_pending_skbs(struct ieee80211_local
*local
,
561 struct sk_buff_head
*skbs
)
563 struct ieee80211_hw
*hw
= &local
->hw
;
568 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
569 while ((skb
= skb_dequeue(skbs
))) {
570 struct ieee80211_tx_info
*info
= IEEE80211_SKB_CB(skb
);
572 if (WARN_ON(!info
->control
.vif
)) {
573 ieee80211_free_txskb(&local
->hw
, skb
);
577 queue
= info
->hw_queue
;
579 __ieee80211_stop_queue(hw
, queue
,
580 IEEE80211_QUEUE_STOP_REASON_SKB_ADD
,
583 __skb_queue_tail(&local
->pending
[queue
], skb
);
586 for (i
= 0; i
< hw
->queues
; i
++)
587 __ieee80211_wake_queue(hw
, i
,
588 IEEE80211_QUEUE_STOP_REASON_SKB_ADD
,
590 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
593 void ieee80211_stop_queues_by_reason(struct ieee80211_hw
*hw
,
594 unsigned long queues
,
595 enum queue_stop_reason reason
,
598 struct ieee80211_local
*local
= hw_to_local(hw
);
602 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
604 for_each_set_bit(i
, &queues
, hw
->queues
)
605 __ieee80211_stop_queue(hw
, i
, reason
, refcounted
);
607 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
610 void ieee80211_stop_queues(struct ieee80211_hw
*hw
)
612 ieee80211_stop_queues_by_reason(hw
, IEEE80211_MAX_QUEUE_MAP
,
613 IEEE80211_QUEUE_STOP_REASON_DRIVER
,
616 EXPORT_SYMBOL(ieee80211_stop_queues
);
618 int ieee80211_queue_stopped(struct ieee80211_hw
*hw
, int queue
)
620 struct ieee80211_local
*local
= hw_to_local(hw
);
624 if (WARN_ON(queue
>= hw
->queues
))
627 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
628 ret
= test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER
,
629 &local
->queue_stop_reasons
[queue
]);
630 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
633 EXPORT_SYMBOL(ieee80211_queue_stopped
);
635 void ieee80211_wake_queues_by_reason(struct ieee80211_hw
*hw
,
636 unsigned long queues
,
637 enum queue_stop_reason reason
,
640 struct ieee80211_local
*local
= hw_to_local(hw
);
644 spin_lock_irqsave(&local
->queue_stop_reason_lock
, flags
);
646 for_each_set_bit(i
, &queues
, hw
->queues
)
647 __ieee80211_wake_queue(hw
, i
, reason
, refcounted
, &flags
);
649 spin_unlock_irqrestore(&local
->queue_stop_reason_lock
, flags
);
652 void ieee80211_wake_queues(struct ieee80211_hw
*hw
)
654 ieee80211_wake_queues_by_reason(hw
, IEEE80211_MAX_QUEUE_MAP
,
655 IEEE80211_QUEUE_STOP_REASON_DRIVER
,
658 EXPORT_SYMBOL(ieee80211_wake_queues
);
661 ieee80211_get_vif_queues(struct ieee80211_local
*local
,
662 struct ieee80211_sub_if_data
*sdata
)
666 if (sdata
&& ieee80211_hw_check(&local
->hw
, QUEUE_CONTROL
)) {
671 for (ac
= 0; ac
< IEEE80211_NUM_ACS
; ac
++)
672 if (sdata
->vif
.hw_queue
[ac
] != IEEE80211_INVAL_HW_QUEUE
)
673 queues
|= BIT(sdata
->vif
.hw_queue
[ac
]);
674 if (sdata
->vif
.cab_queue
!= IEEE80211_INVAL_HW_QUEUE
)
675 queues
|= BIT(sdata
->vif
.cab_queue
);
678 queues
= BIT(local
->hw
.queues
) - 1;
684 void __ieee80211_flush_queues(struct ieee80211_local
*local
,
685 struct ieee80211_sub_if_data
*sdata
,
686 unsigned int queues
, bool drop
)
688 if (!local
->ops
->flush
)
692 * If no queue was set, or if the HW doesn't support
693 * IEEE80211_HW_QUEUE_CONTROL - flush all queues
695 if (!queues
|| !ieee80211_hw_check(&local
->hw
, QUEUE_CONTROL
))
696 queues
= ieee80211_get_vif_queues(local
, sdata
);
698 ieee80211_stop_queues_by_reason(&local
->hw
, queues
,
699 IEEE80211_QUEUE_STOP_REASON_FLUSH
,
703 struct sta_info
*sta
;
705 /* Purge the queues, so the frames on them won't be
706 * sent during __ieee80211_wake_queue()
708 list_for_each_entry(sta
, &local
->sta_list
, list
) {
709 if (sdata
!= sta
->sdata
)
711 ieee80211_purge_sta_txqs(sta
);
715 drv_flush(local
, sdata
, queues
, drop
);
717 ieee80211_wake_queues_by_reason(&local
->hw
, queues
,
718 IEEE80211_QUEUE_STOP_REASON_FLUSH
,
722 void ieee80211_flush_queues(struct ieee80211_local
*local
,
723 struct ieee80211_sub_if_data
*sdata
, bool drop
)
725 __ieee80211_flush_queues(local
, sdata
, 0, drop
);
728 static void __iterate_interfaces(struct ieee80211_local
*local
,
730 void (*iterator
)(void *data
, u8
*mac
,
731 struct ieee80211_vif
*vif
),
734 struct ieee80211_sub_if_data
*sdata
;
735 bool active_only
= iter_flags
& IEEE80211_IFACE_ITER_ACTIVE
;
737 list_for_each_entry_rcu(sdata
, &local
->interfaces
, list
,
738 lockdep_is_held(&local
->iflist_mtx
) ||
739 lockdep_is_held(&local
->hw
.wiphy
->mtx
)) {
740 switch (sdata
->vif
.type
) {
741 case NL80211_IFTYPE_MONITOR
:
742 if (!(sdata
->u
.mntr
.flags
& MONITOR_FLAG_ACTIVE
) &&
743 !ieee80211_hw_check(&local
->hw
, NO_VIRTUAL_MONITOR
))
746 case NL80211_IFTYPE_AP_VLAN
:
751 if (!(iter_flags
& IEEE80211_IFACE_ITER_RESUME_ALL
) &&
752 active_only
&& !(sdata
->flags
& IEEE80211_SDATA_IN_DRIVER
))
754 if ((iter_flags
& IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER
) &&
755 !(sdata
->flags
& IEEE80211_SDATA_IN_DRIVER
))
757 if (ieee80211_sdata_running(sdata
) || !active_only
)
758 iterator(data
, sdata
->vif
.addr
,
762 sdata
= rcu_dereference_check(local
->monitor_sdata
,
763 lockdep_is_held(&local
->iflist_mtx
) ||
764 lockdep_is_held(&local
->hw
.wiphy
->mtx
));
765 if (sdata
&& ieee80211_hw_check(&local
->hw
, WANT_MONITOR_VIF
) &&
766 (iter_flags
& IEEE80211_IFACE_ITER_RESUME_ALL
|| !active_only
||
767 sdata
->flags
& IEEE80211_SDATA_IN_DRIVER
))
768 iterator(data
, sdata
->vif
.addr
, &sdata
->vif
);
771 void ieee80211_iterate_interfaces(
772 struct ieee80211_hw
*hw
, u32 iter_flags
,
773 void (*iterator
)(void *data
, u8
*mac
,
774 struct ieee80211_vif
*vif
),
777 struct ieee80211_local
*local
= hw_to_local(hw
);
779 mutex_lock(&local
->iflist_mtx
);
780 __iterate_interfaces(local
, iter_flags
, iterator
, data
);
781 mutex_unlock(&local
->iflist_mtx
);
783 EXPORT_SYMBOL_GPL(ieee80211_iterate_interfaces
);
785 void ieee80211_iterate_active_interfaces_atomic(
786 struct ieee80211_hw
*hw
, u32 iter_flags
,
787 void (*iterator
)(void *data
, u8
*mac
,
788 struct ieee80211_vif
*vif
),
791 struct ieee80211_local
*local
= hw_to_local(hw
);
794 __iterate_interfaces(local
, iter_flags
| IEEE80211_IFACE_ITER_ACTIVE
,
798 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic
);
800 void ieee80211_iterate_active_interfaces_mtx(
801 struct ieee80211_hw
*hw
, u32 iter_flags
,
802 void (*iterator
)(void *data
, u8
*mac
,
803 struct ieee80211_vif
*vif
),
806 struct ieee80211_local
*local
= hw_to_local(hw
);
808 lockdep_assert_wiphy(hw
->wiphy
);
810 __iterate_interfaces(local
, iter_flags
| IEEE80211_IFACE_ITER_ACTIVE
,
813 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_mtx
);
815 static void __iterate_stations(struct ieee80211_local
*local
,
816 void (*iterator
)(void *data
,
817 struct ieee80211_sta
*sta
),
820 struct sta_info
*sta
;
822 list_for_each_entry_rcu(sta
, &local
->sta_list
, list
,
823 lockdep_is_held(&local
->hw
.wiphy
->mtx
)) {
827 iterator(data
, &sta
->sta
);
831 void ieee80211_iterate_stations_atomic(struct ieee80211_hw
*hw
,
832 void (*iterator
)(void *data
,
833 struct ieee80211_sta
*sta
),
836 struct ieee80211_local
*local
= hw_to_local(hw
);
839 __iterate_stations(local
, iterator
, data
);
842 EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic
);
844 void ieee80211_iterate_stations_mtx(struct ieee80211_hw
*hw
,
845 void (*iterator
)(void *data
,
846 struct ieee80211_sta
*sta
),
849 struct ieee80211_local
*local
= hw_to_local(hw
);
851 lockdep_assert_wiphy(local
->hw
.wiphy
);
853 __iterate_stations(local
, iterator
, data
);
855 EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_mtx
);
857 struct ieee80211_vif
*wdev_to_ieee80211_vif(struct wireless_dev
*wdev
)
859 struct ieee80211_sub_if_data
*sdata
= IEEE80211_WDEV_TO_SUB_IF(wdev
);
861 if (!ieee80211_sdata_running(sdata
) ||
862 !(sdata
->flags
& IEEE80211_SDATA_IN_DRIVER
))
866 EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif
);
868 struct wireless_dev
*ieee80211_vif_to_wdev(struct ieee80211_vif
*vif
)
873 return &vif_to_sdata(vif
)->wdev
;
875 EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev
);
878 * Nothing should have been stuffed into the workqueue during
879 * the suspend->resume cycle. Since we can't check each caller
880 * of this function if we are already quiescing / suspended,
881 * check here and don't WARN since this can actually happen when
882 * the rx path (for example) is racing against __ieee80211_suspend
883 * and suspending / quiescing was set after the rx path checked
886 static bool ieee80211_can_queue_work(struct ieee80211_local
*local
)
888 if (local
->quiescing
|| (local
->suspended
&& !local
->resuming
)) {
889 pr_warn("queueing ieee80211 work while going to suspend\n");
896 void ieee80211_queue_work(struct ieee80211_hw
*hw
, struct work_struct
*work
)
898 struct ieee80211_local
*local
= hw_to_local(hw
);
900 if (!ieee80211_can_queue_work(local
))
903 queue_work(local
->workqueue
, work
);
905 EXPORT_SYMBOL(ieee80211_queue_work
);
907 void ieee80211_queue_delayed_work(struct ieee80211_hw
*hw
,
908 struct delayed_work
*dwork
,
911 struct ieee80211_local
*local
= hw_to_local(hw
);
913 if (!ieee80211_can_queue_work(local
))
916 queue_delayed_work(local
->workqueue
, dwork
, delay
);
918 EXPORT_SYMBOL(ieee80211_queue_delayed_work
);
920 void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data
*sdata
,
921 struct ieee80211_tx_queue_params
924 struct ieee80211_chanctx_conf
*chanctx_conf
;
925 const struct ieee80211_reg_rule
*rrule
;
926 const struct ieee80211_wmm_ac
*wmm_ac
;
929 if (sdata
->vif
.type
!= NL80211_IFTYPE_AP
&&
930 sdata
->vif
.type
!= NL80211_IFTYPE_STATION
)
934 chanctx_conf
= rcu_dereference(sdata
->vif
.bss_conf
.chanctx_conf
);
936 center_freq
= chanctx_conf
->def
.chan
->center_freq
;
943 rrule
= freq_reg_info(sdata
->wdev
.wiphy
, MHZ_TO_KHZ(center_freq
));
945 if (IS_ERR_OR_NULL(rrule
) || !rrule
->has_wmm
) {
950 if (sdata
->vif
.type
== NL80211_IFTYPE_AP
)
951 wmm_ac
= &rrule
->wmm_rule
.ap
[ac
];
953 wmm_ac
= &rrule
->wmm_rule
.client
[ac
];
954 qparam
->cw_min
= max_t(u16
, qparam
->cw_min
, wmm_ac
->cw_min
);
955 qparam
->cw_max
= max_t(u16
, qparam
->cw_max
, wmm_ac
->cw_max
);
956 qparam
->aifs
= max_t(u8
, qparam
->aifs
, wmm_ac
->aifsn
);
957 qparam
->txop
= min_t(u16
, qparam
->txop
, wmm_ac
->cot
/ 32);
961 void ieee80211_set_wmm_default(struct ieee80211_link_data
*link
,
962 bool bss_notify
, bool enable_qos
)
964 struct ieee80211_sub_if_data
*sdata
= link
->sdata
;
965 struct ieee80211_local
*local
= sdata
->local
;
966 struct ieee80211_tx_queue_params qparam
;
967 struct ieee80211_chanctx_conf
*chanctx_conf
;
970 bool is_ocb
; /* Use another EDCA parameters if dot11OCBActivated=true */
973 if (!local
->ops
->conf_tx
)
976 if (local
->hw
.queues
< IEEE80211_NUM_ACS
)
979 memset(&qparam
, 0, sizeof(qparam
));
982 chanctx_conf
= rcu_dereference(link
->conf
->chanctx_conf
);
983 use_11b
= (chanctx_conf
&&
984 chanctx_conf
->def
.chan
->band
== NL80211_BAND_2GHZ
) &&
985 !link
->operating_11g_mode
;
988 is_ocb
= (sdata
->vif
.type
== NL80211_IFTYPE_OCB
);
990 /* Set defaults according to 802.11-2007 Table 7-37 */
997 /* Configure old 802.11b/g medium access rules. */
998 qparam
.cw_max
= aCWmax
;
999 qparam
.cw_min
= aCWmin
;
1003 for (ac
= 0; ac
< IEEE80211_NUM_ACS
; ac
++) {
1004 /* Update if QoS is enabled. */
1007 case IEEE80211_AC_BK
:
1008 qparam
.cw_max
= aCWmax
;
1009 qparam
.cw_min
= aCWmin
;
1016 /* never happens but let's not leave undefined */
1018 case IEEE80211_AC_BE
:
1019 qparam
.cw_max
= aCWmax
;
1020 qparam
.cw_min
= aCWmin
;
1027 case IEEE80211_AC_VI
:
1028 qparam
.cw_max
= aCWmin
;
1029 qparam
.cw_min
= (aCWmin
+ 1) / 2 - 1;
1033 qparam
.txop
= 6016/32;
1035 qparam
.txop
= 3008/32;
1042 case IEEE80211_AC_VO
:
1043 qparam
.cw_max
= (aCWmin
+ 1) / 2 - 1;
1044 qparam
.cw_min
= (aCWmin
+ 1) / 4 - 1;
1048 qparam
.txop
= 3264/32;
1050 qparam
.txop
= 1504/32;
1055 ieee80211_regulatory_limit_wmm_params(sdata
, &qparam
, ac
);
1057 qparam
.uapsd
= false;
1059 link
->tx_conf
[ac
] = qparam
;
1060 drv_conf_tx(local
, link
, ac
, &qparam
);
1063 if (sdata
->vif
.type
!= NL80211_IFTYPE_MONITOR
&&
1064 sdata
->vif
.type
!= NL80211_IFTYPE_P2P_DEVICE
&&
1065 sdata
->vif
.type
!= NL80211_IFTYPE_NAN
) {
1066 link
->conf
->qos
= enable_qos
;
1068 ieee80211_link_info_change_notify(sdata
, link
,
1073 void ieee80211_send_auth(struct ieee80211_sub_if_data
*sdata
,
1074 u16 transaction
, u16 auth_alg
, u16 status
,
1075 const u8
*extra
, size_t extra_len
, const u8
*da
,
1076 const u8
*bssid
, const u8
*key
, u8 key_len
, u8 key_idx
,
1079 struct ieee80211_local
*local
= sdata
->local
;
1080 struct sk_buff
*skb
;
1081 struct ieee80211_mgmt
*mgmt
;
1082 bool multi_link
= ieee80211_vif_is_mld(&sdata
->vif
);
1087 struct ieee80211_multi_link_elem ml
;
1088 struct ieee80211_mle_basic_common_info basic
;
1090 .id
= WLAN_EID_EXTENSION
,
1091 .len
= sizeof(mle
) - 2,
1092 .ext_id
= WLAN_EID_EXT_EHT_MULTI_LINK
,
1093 .ml
.control
= cpu_to_le16(IEEE80211_ML_CONTROL_TYPE_BASIC
),
1094 .basic
.len
= sizeof(mle
.basic
),
1098 memcpy(mle
.basic
.mld_mac_addr
, sdata
->vif
.addr
, ETH_ALEN
);
1100 /* 24 + 6 = header + auth_algo + auth_transaction + status_code */
1101 skb
= dev_alloc_skb(local
->hw
.extra_tx_headroom
+ IEEE80211_WEP_IV_LEN
+
1102 24 + 6 + extra_len
+ IEEE80211_WEP_ICV_LEN
+
1103 multi_link
* sizeof(mle
));
1107 skb_reserve(skb
, local
->hw
.extra_tx_headroom
+ IEEE80211_WEP_IV_LEN
);
1109 mgmt
= skb_put_zero(skb
, 24 + 6);
1110 mgmt
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
1111 IEEE80211_STYPE_AUTH
);
1112 memcpy(mgmt
->da
, da
, ETH_ALEN
);
1113 memcpy(mgmt
->sa
, sdata
->vif
.addr
, ETH_ALEN
);
1114 memcpy(mgmt
->bssid
, bssid
, ETH_ALEN
);
1115 mgmt
->u
.auth
.auth_alg
= cpu_to_le16(auth_alg
);
1116 mgmt
->u
.auth
.auth_transaction
= cpu_to_le16(transaction
);
1117 mgmt
->u
.auth
.status_code
= cpu_to_le16(status
);
1119 skb_put_data(skb
, extra
, extra_len
);
1121 skb_put_data(skb
, &mle
, sizeof(mle
));
1123 if (auth_alg
== WLAN_AUTH_SHARED_KEY
&& transaction
== 3) {
1124 mgmt
->frame_control
|= cpu_to_le16(IEEE80211_FCTL_PROTECTED
);
1125 err
= ieee80211_wep_encrypt(local
, skb
, key
, key_len
, key_idx
);
1132 IEEE80211_SKB_CB(skb
)->flags
|= IEEE80211_TX_INTFL_DONT_ENCRYPT
|
1134 ieee80211_tx_skb(sdata
, skb
);
1137 void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data
*sdata
,
1138 const u8
*da
, const u8
*bssid
,
1139 u16 stype
, u16 reason
,
1140 bool send_frame
, u8
*frame_buf
)
1142 struct ieee80211_local
*local
= sdata
->local
;
1143 struct sk_buff
*skb
;
1144 struct ieee80211_mgmt
*mgmt
= (void *)frame_buf
;
1147 mgmt
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
| stype
);
1148 mgmt
->duration
= 0; /* initialize only */
1149 mgmt
->seq_ctrl
= 0; /* initialize only */
1150 memcpy(mgmt
->da
, da
, ETH_ALEN
);
1151 memcpy(mgmt
->sa
, sdata
->vif
.addr
, ETH_ALEN
);
1152 memcpy(mgmt
->bssid
, bssid
, ETH_ALEN
);
1153 /* u.deauth.reason_code == u.disassoc.reason_code */
1154 mgmt
->u
.deauth
.reason_code
= cpu_to_le16(reason
);
1157 skb
= dev_alloc_skb(local
->hw
.extra_tx_headroom
+
1158 IEEE80211_DEAUTH_FRAME_LEN
);
1162 skb_reserve(skb
, local
->hw
.extra_tx_headroom
);
1165 skb_put_data(skb
, mgmt
, IEEE80211_DEAUTH_FRAME_LEN
);
1167 if (sdata
->vif
.type
!= NL80211_IFTYPE_STATION
||
1168 !(sdata
->u
.mgd
.flags
& IEEE80211_STA_MFP_ENABLED
))
1169 IEEE80211_SKB_CB(skb
)->flags
|=
1170 IEEE80211_TX_INTFL_DONT_ENCRYPT
;
1172 ieee80211_tx_skb(sdata
, skb
);
1176 static int ieee80211_put_s1g_cap(struct sk_buff
*skb
,
1177 struct ieee80211_sta_s1g_cap
*s1g_cap
)
1179 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_s1g_cap
))
1182 skb_put_u8(skb
, WLAN_EID_S1G_CAPABILITIES
);
1183 skb_put_u8(skb
, sizeof(struct ieee80211_s1g_cap
));
1185 skb_put_data(skb
, &s1g_cap
->cap
, sizeof(s1g_cap
->cap
));
1186 skb_put_data(skb
, &s1g_cap
->nss_mcs
, sizeof(s1g_cap
->nss_mcs
));
1191 static int ieee80211_put_preq_ies_band(struct sk_buff
*skb
,
1192 struct ieee80211_sub_if_data
*sdata
,
1193 const u8
*ie
, size_t ie_len
,
1195 enum nl80211_band band
,
1197 struct cfg80211_chan_def
*chandef
,
1200 struct ieee80211_local
*local
= sdata
->local
;
1201 struct ieee80211_supported_band
*sband
;
1205 bool have_80mhz
= false;
1209 sband
= local
->hw
.wiphy
->bands
[band
];
1210 if (WARN_ON_ONCE(!sband
))
1213 rate_flags
= ieee80211_chandef_rate_flags(chandef
);
1215 /* For direct scan add S1G IE and consider its override bits */
1216 if (band
== NL80211_BAND_S1GHZ
)
1217 return ieee80211_put_s1g_cap(skb
, &sband
->s1g_cap
);
1219 err
= ieee80211_put_srates_elem(skb
, sband
, 0, rate_flags
,
1220 ~rate_mask
, WLAN_EID_SUPP_RATES
);
1224 /* insert "request information" if in custom IEs */
1226 static const u8 before_extrates
[] = {
1228 WLAN_EID_SUPP_RATES
,
1231 noffset
= ieee80211_ie_split(ie
, ie_len
,
1233 ARRAY_SIZE(before_extrates
),
1235 if (skb_tailroom(skb
) < noffset
- *offset
)
1237 skb_put_data(skb
, ie
+ *offset
, noffset
- *offset
);
1241 err
= ieee80211_put_srates_elem(skb
, sband
, 0, rate_flags
,
1242 ~rate_mask
, WLAN_EID_EXT_SUPP_RATES
);
1246 if (chandef
->chan
&& sband
->band
== NL80211_BAND_2GHZ
) {
1247 if (skb_tailroom(skb
) < 3)
1249 skb_put_u8(skb
, WLAN_EID_DS_PARAMS
);
1252 ieee80211_frequency_to_channel(chandef
->chan
->center_freq
));
1255 if (flags
& IEEE80211_PROBE_FLAG_MIN_CONTENT
)
1258 /* insert custom IEs that go before HT */
1260 static const u8 before_ht
[] = {
1262 * no need to list the ones split off already
1263 * (or generated here)
1266 WLAN_EID_SUPPORTED_REGULATORY_CLASSES
,
1268 noffset
= ieee80211_ie_split(ie
, ie_len
,
1269 before_ht
, ARRAY_SIZE(before_ht
),
1271 if (skb_tailroom(skb
) < noffset
- *offset
)
1273 skb_put_data(skb
, ie
+ *offset
, noffset
- *offset
);
1277 if (sband
->ht_cap
.ht_supported
) {
1280 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_ht_cap
))
1283 pos
= skb_put(skb
, 2 + sizeof(struct ieee80211_ht_cap
));
1284 ieee80211_ie_build_ht_cap(pos
, &sband
->ht_cap
,
1288 /* insert custom IEs that go before VHT */
1290 static const u8 before_vht
[] = {
1292 * no need to list the ones split off already
1293 * (or generated here)
1295 WLAN_EID_BSS_COEX_2040
,
1296 WLAN_EID_EXT_CAPABILITY
,
1298 WLAN_EID_CHANNEL_USAGE
,
1299 WLAN_EID_INTERWORKING
,
1301 /* 60 GHz (Multi-band, DMG, MMS) can't happen */
1303 noffset
= ieee80211_ie_split(ie
, ie_len
,
1304 before_vht
, ARRAY_SIZE(before_vht
),
1306 if (skb_tailroom(skb
) < noffset
- *offset
)
1308 skb_put_data(skb
, ie
+ *offset
, noffset
- *offset
);
1312 /* Check if any channel in this sband supports at least 80 MHz */
1313 for (i
= 0; i
< sband
->n_channels
; i
++) {
1314 if (sband
->channels
[i
].flags
& (IEEE80211_CHAN_DISABLED
|
1315 IEEE80211_CHAN_NO_80MHZ
))
1322 if (sband
->vht_cap
.vht_supported
&& have_80mhz
) {
1325 if (skb_tailroom(skb
) < 2 + sizeof(struct ieee80211_vht_cap
))
1328 pos
= skb_put(skb
, 2 + sizeof(struct ieee80211_vht_cap
));
1329 ieee80211_ie_build_vht_cap(pos
, &sband
->vht_cap
,
1330 sband
->vht_cap
.cap
);
1333 /* insert custom IEs that go before HE */
1335 static const u8 before_he
[] = {
1337 * no need to list the ones split off before VHT
1340 WLAN_EID_EXTENSION
, WLAN_EID_EXT_FILS_REQ_PARAMS
,
1342 /* TODO: add 11ah/11aj/11ak elements */
1344 noffset
= ieee80211_ie_split(ie
, ie_len
,
1345 before_he
, ARRAY_SIZE(before_he
),
1347 if (skb_tailroom(skb
) < noffset
- *offset
)
1349 skb_put_data(skb
, ie
+ *offset
, noffset
- *offset
);
1353 if (cfg80211_any_usable_channels(local
->hw
.wiphy
, BIT(sband
->band
),
1354 IEEE80211_CHAN_NO_HE
)) {
1355 err
= ieee80211_put_he_cap(skb
, sdata
, sband
, NULL
);
1360 if (cfg80211_any_usable_channels(local
->hw
.wiphy
, BIT(sband
->band
),
1361 IEEE80211_CHAN_NO_HE
|
1362 IEEE80211_CHAN_NO_EHT
)) {
1363 err
= ieee80211_put_eht_cap(skb
, sdata
, sband
, NULL
);
1368 err
= ieee80211_put_he_6ghz_cap(skb
, sdata
, IEEE80211_SMPS_OFF
);
1373 * If adding more here, adjust code in main.c
1374 * that calculates local->scan_ies_len.
1380 static int ieee80211_put_preq_ies(struct sk_buff
*skb
,
1381 struct ieee80211_sub_if_data
*sdata
,
1382 struct ieee80211_scan_ies
*ie_desc
,
1383 const u8
*ie
, size_t ie_len
,
1384 u8 bands_used
, u32
*rate_masks
,
1385 struct cfg80211_chan_def
*chandef
,
1388 size_t custom_ie_offset
= 0;
1391 memset(ie_desc
, 0, sizeof(*ie_desc
));
1393 for (i
= 0; i
< NUM_NL80211_BANDS
; i
++) {
1394 if (bands_used
& BIT(i
)) {
1395 ie_desc
->ies
[i
] = skb_tail_pointer(skb
);
1396 err
= ieee80211_put_preq_ies_band(skb
, sdata
,
1403 ie_desc
->len
[i
] = skb_tail_pointer(skb
) -
1408 /* add any remaining custom IEs */
1410 if (WARN_ONCE(skb_tailroom(skb
) < ie_len
- custom_ie_offset
,
1411 "not enough space for preq custom IEs\n"))
1413 ie_desc
->common_ies
= skb_tail_pointer(skb
);
1414 skb_put_data(skb
, ie
+ custom_ie_offset
,
1415 ie_len
- custom_ie_offset
);
1416 ie_desc
->common_ie_len
= skb_tail_pointer(skb
) -
1417 ie_desc
->common_ies
;
1423 int ieee80211_build_preq_ies(struct ieee80211_sub_if_data
*sdata
, u8
*buffer
,
1425 struct ieee80211_scan_ies
*ie_desc
,
1426 const u8
*ie
, size_t ie_len
,
1427 u8 bands_used
, u32
*rate_masks
,
1428 struct cfg80211_chan_def
*chandef
,
1431 struct sk_buff
*skb
= alloc_skb(buffer_len
, GFP_KERNEL
);
1439 start
= skb_tail_pointer(skb
);
1440 memset(start
, 0, skb_tailroom(skb
));
1441 ret
= ieee80211_put_preq_ies(skb
, sdata
, ie_desc
, ie
, ie_len
,
1442 bands_used
, rate_masks
, chandef
,
1448 if (skb
->len
> buffer_len
) {
1453 memcpy(buffer
, start
, skb
->len
);
1455 /* adjust ie_desc for copy */
1456 for (i
= 0; i
< NUM_NL80211_BANDS
; i
++) {
1457 offs
= ie_desc
->ies
[i
] - start
;
1458 ie_desc
->ies
[i
] = buffer
+ offs
;
1460 offs
= ie_desc
->common_ies
- start
;
1461 ie_desc
->common_ies
= buffer
+ offs
;
1469 struct sk_buff
*ieee80211_build_probe_req(struct ieee80211_sub_if_data
*sdata
,
1470 const u8
*src
, const u8
*dst
,
1472 struct ieee80211_channel
*chan
,
1473 const u8
*ssid
, size_t ssid_len
,
1474 const u8
*ie
, size_t ie_len
,
1477 struct ieee80211_local
*local
= sdata
->local
;
1478 struct cfg80211_chan_def chandef
;
1479 struct sk_buff
*skb
;
1480 struct ieee80211_mgmt
*mgmt
;
1481 u32 rate_masks
[NUM_NL80211_BANDS
] = {};
1482 struct ieee80211_scan_ies dummy_ie_desc
;
1485 * Do not send DS Channel parameter for directed probe requests
1486 * in order to maximize the chance that we get a response. Some
1487 * badly-behaved APs don't respond when this parameter is included.
1489 chandef
.width
= sdata
->vif
.bss_conf
.chanreq
.oper
.width
;
1490 if (flags
& IEEE80211_PROBE_FLAG_DIRECTED
)
1491 chandef
.chan
= NULL
;
1493 chandef
.chan
= chan
;
1495 skb
= ieee80211_probereq_get(&local
->hw
, src
, ssid
, ssid_len
,
1496 local
->scan_ies_len
+ ie_len
);
1500 rate_masks
[chan
->band
] = ratemask
;
1501 ieee80211_put_preq_ies(skb
, sdata
, &dummy_ie_desc
,
1502 ie
, ie_len
, BIT(chan
->band
),
1503 rate_masks
, &chandef
, flags
);
1506 mgmt
= (struct ieee80211_mgmt
*) skb
->data
;
1507 memcpy(mgmt
->da
, dst
, ETH_ALEN
);
1508 memcpy(mgmt
->bssid
, dst
, ETH_ALEN
);
1511 IEEE80211_SKB_CB(skb
)->flags
|= IEEE80211_TX_INTFL_DONT_ENCRYPT
;
1516 u32
ieee80211_sta_get_rates(struct ieee80211_sub_if_data
*sdata
,
1517 struct ieee802_11_elems
*elems
,
1518 enum nl80211_band band
, u32
*basic_rates
)
1520 struct ieee80211_supported_band
*sband
;
1522 u32 supp_rates
, rate_flags
;
1525 sband
= sdata
->local
->hw
.wiphy
->bands
[band
];
1526 if (WARN_ON(!sband
))
1530 ieee80211_chandef_rate_flags(&sdata
->vif
.bss_conf
.chanreq
.oper
);
1532 num_rates
= sband
->n_bitrates
;
1534 for (i
= 0; i
< elems
->supp_rates_len
+
1535 elems
->ext_supp_rates_len
; i
++) {
1539 if (i
< elems
->supp_rates_len
)
1540 rate
= elems
->supp_rates
[i
];
1541 else if (elems
->ext_supp_rates
)
1542 rate
= elems
->ext_supp_rates
1543 [i
- elems
->supp_rates_len
];
1544 own_rate
= 5 * (rate
& 0x7f);
1545 is_basic
= !!(rate
& 0x80);
1547 if (is_basic
&& (rate
& 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY
)
1550 for (j
= 0; j
< num_rates
; j
++) {
1552 if ((rate_flags
& sband
->bitrates
[j
].flags
)
1556 brate
= sband
->bitrates
[j
].bitrate
;
1558 if (brate
== own_rate
) {
1559 supp_rates
|= BIT(j
);
1560 if (basic_rates
&& is_basic
)
1561 *basic_rates
|= BIT(j
);
1568 void ieee80211_stop_device(struct ieee80211_local
*local
, bool suspend
)
1571 ieee80211_handle_queued_frames(local
);
1574 ieee80211_led_radio(local
, false);
1575 ieee80211_mod_tpt_led_trig(local
, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO
);
1577 wiphy_work_cancel(local
->hw
.wiphy
, &local
->reconfig_filter
);
1579 flush_workqueue(local
->workqueue
);
1580 wiphy_work_flush(local
->hw
.wiphy
, NULL
);
1581 drv_stop(local
, suspend
);
1584 static void ieee80211_flush_completed_scan(struct ieee80211_local
*local
,
1587 /* It's possible that we don't handle the scan completion in
1588 * time during suspend, so if it's still marked as completed
1589 * here, queue the work and flush it to clean things up.
1590 * Instead of calling the worker function directly here, we
1591 * really queue it to avoid potential races with other flows
1592 * scheduling the same work.
1594 if (test_bit(SCAN_COMPLETED
, &local
->scanning
)) {
1595 /* If coming from reconfiguration failure, abort the scan so
1596 * we don't attempt to continue a partial HW scan - which is
1597 * possible otherwise if (e.g.) the 2.4 GHz portion was the
1598 * completed scan, and a 5 GHz portion is still pending.
1601 set_bit(SCAN_ABORTED
, &local
->scanning
);
1602 wiphy_delayed_work_queue(local
->hw
.wiphy
, &local
->scan_work
, 0);
1603 wiphy_delayed_work_flush(local
->hw
.wiphy
, &local
->scan_work
);
1607 static void ieee80211_handle_reconfig_failure(struct ieee80211_local
*local
)
1609 struct ieee80211_sub_if_data
*sdata
;
1610 struct ieee80211_chanctx
*ctx
;
1612 lockdep_assert_wiphy(local
->hw
.wiphy
);
1615 * We get here if during resume the device can't be restarted properly.
1616 * We might also get here if this happens during HW reset, which is a
1617 * slightly different situation and we need to drop all connections in
1620 * Ask cfg80211 to turn off all interfaces, this will result in more
1621 * warnings but at least we'll then get into a clean stopped state.
1624 local
->resuming
= false;
1625 local
->suspended
= false;
1626 local
->in_reconfig
= false;
1627 local
->reconfig_failure
= true;
1629 ieee80211_flush_completed_scan(local
, true);
1631 /* scheduled scan clearly can't be running any more, but tell
1632 * cfg80211 and clear local state
1634 ieee80211_sched_scan_end(local
);
1636 list_for_each_entry(sdata
, &local
->interfaces
, list
)
1637 sdata
->flags
&= ~IEEE80211_SDATA_IN_DRIVER
;
1639 /* Mark channel contexts as not being in the driver any more to avoid
1640 * removing them from the driver during the shutdown process...
1642 list_for_each_entry(ctx
, &local
->chanctx_list
, list
)
1643 ctx
->driver_present
= false;
1646 static void ieee80211_assign_chanctx(struct ieee80211_local
*local
,
1647 struct ieee80211_sub_if_data
*sdata
,
1648 struct ieee80211_link_data
*link
)
1650 struct ieee80211_chanctx_conf
*conf
;
1651 struct ieee80211_chanctx
*ctx
;
1653 lockdep_assert_wiphy(local
->hw
.wiphy
);
1655 conf
= rcu_dereference_protected(link
->conf
->chanctx_conf
,
1656 lockdep_is_held(&local
->hw
.wiphy
->mtx
));
1658 ctx
= container_of(conf
, struct ieee80211_chanctx
, conf
);
1659 drv_assign_vif_chanctx(local
, sdata
, link
->conf
, ctx
);
1663 static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data
*sdata
)
1665 struct ieee80211_local
*local
= sdata
->local
;
1666 struct sta_info
*sta
;
1668 lockdep_assert_wiphy(local
->hw
.wiphy
);
1671 list_for_each_entry(sta
, &local
->sta_list
, list
) {
1672 enum ieee80211_sta_state state
;
1674 if (!sta
->uploaded
|| sta
->sdata
!= sdata
)
1677 for (state
= IEEE80211_STA_NOTEXIST
;
1678 state
< sta
->sta_state
; state
++)
1679 WARN_ON(drv_sta_state(local
, sta
->sdata
, sta
, state
,
1684 static int ieee80211_reconfig_nan(struct ieee80211_sub_if_data
*sdata
)
1686 struct cfg80211_nan_func
*func
, **funcs
;
1689 res
= drv_start_nan(sdata
->local
, sdata
,
1690 &sdata
->u
.nan
.conf
);
1694 funcs
= kcalloc(sdata
->local
->hw
.max_nan_de_entries
+ 1,
1700 /* Add all the functions:
1701 * This is a little bit ugly. We need to call a potentially sleeping
1702 * callback for each NAN function, so we can't hold the spinlock.
1704 spin_lock_bh(&sdata
->u
.nan
.func_lock
);
1706 idr_for_each_entry(&sdata
->u
.nan
.function_inst_ids
, func
, id
)
1709 spin_unlock_bh(&sdata
->u
.nan
.func_lock
);
1711 for (i
= 0; funcs
[i
]; i
++) {
1712 res
= drv_add_nan_func(sdata
->local
, sdata
, funcs
[i
]);
1714 ieee80211_nan_func_terminated(&sdata
->vif
,
1715 funcs
[i
]->instance_id
,
1716 NL80211_NAN_FUNC_TERM_REASON_ERROR
,
1725 static void ieee80211_reconfig_ap_links(struct ieee80211_local
*local
,
1726 struct ieee80211_sub_if_data
*sdata
,
1731 for (link_id
= 0; link_id
< ARRAY_SIZE(sdata
->link
); link_id
++) {
1732 struct ieee80211_link_data
*link
;
1734 if (!(sdata
->vif
.active_links
& BIT(link_id
)))
1737 link
= sdata_dereference(sdata
->link
[link_id
], sdata
);
1741 if (rcu_access_pointer(link
->u
.ap
.beacon
))
1742 drv_start_ap(local
, sdata
, link
->conf
);
1744 if (!link
->conf
->enable_beacon
)
1747 changed
|= BSS_CHANGED_BEACON
|
1748 BSS_CHANGED_BEACON_ENABLED
;
1750 ieee80211_link_info_change_notify(sdata
, link
, changed
);
1754 int ieee80211_reconfig(struct ieee80211_local
*local
)
1756 struct ieee80211_hw
*hw
= &local
->hw
;
1757 struct ieee80211_sub_if_data
*sdata
;
1758 struct ieee80211_chanctx
*ctx
;
1759 struct sta_info
*sta
;
1761 bool reconfig_due_to_wowlan
= false;
1762 struct ieee80211_sub_if_data
*sched_scan_sdata
;
1763 struct cfg80211_sched_scan_request
*sched_scan_req
;
1764 bool sched_scan_stopped
= false;
1765 bool suspended
= local
->suspended
;
1766 bool in_reconfig
= false;
1768 lockdep_assert_wiphy(local
->hw
.wiphy
);
1770 /* nothing to do if HW shouldn't run */
1771 if (!local
->open_count
)
1776 local
->resuming
= true;
1778 if (local
->wowlan
) {
1780 * In the wowlan case, both mac80211 and the device
1781 * are functional when the resume op is called, so
1782 * clear local->suspended so the device could operate
1783 * normally (e.g. pass rx frames).
1785 local
->suspended
= false;
1786 res
= drv_resume(local
);
1787 local
->wowlan
= false;
1789 local
->resuming
= false;
1796 * res is 1, which means the driver requested
1797 * to go through a regular reset on wakeup.
1798 * restore local->suspended in this case.
1800 reconfig_due_to_wowlan
= true;
1801 local
->suspended
= true;
1806 * In case of hw_restart during suspend (without wowlan),
1807 * cancel restart work, as we are reconfiguring the device
1809 * Note that restart_work is scheduled on a frozen workqueue,
1810 * so we can't deadlock in this case.
1812 if (suspended
&& local
->in_reconfig
&& !reconfig_due_to_wowlan
)
1813 cancel_work_sync(&local
->restart_work
);
1815 local
->started
= false;
1818 * Upon resume hardware can sometimes be goofy due to
1819 * various platform / driver / bus issues, so restarting
1820 * the device may at times not work immediately. Propagate
1823 res
= drv_start(local
);
1826 WARN(1, "Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n");
1828 WARN(1, "Hardware became unavailable during restart.\n");
1829 ieee80211_wake_queues_by_reason(hw
, IEEE80211_MAX_QUEUE_MAP
,
1830 IEEE80211_QUEUE_STOP_REASON_SUSPEND
,
1832 ieee80211_handle_reconfig_failure(local
);
1836 /* setup fragmentation threshold */
1837 drv_set_frag_threshold(local
, hw
->wiphy
->frag_threshold
);
1839 /* setup RTS threshold */
1840 drv_set_rts_threshold(local
, hw
->wiphy
->rts_threshold
);
1842 /* reset coverage class */
1843 drv_set_coverage_class(local
, hw
->wiphy
->coverage_class
);
1845 ieee80211_led_radio(local
, true);
1846 ieee80211_mod_tpt_led_trig(local
,
1847 IEEE80211_TPT_LEDTRIG_FL_RADIO
, 0);
1849 /* add interfaces */
1850 sdata
= wiphy_dereference(local
->hw
.wiphy
, local
->monitor_sdata
);
1851 if (sdata
&& ieee80211_hw_check(&local
->hw
, WANT_MONITOR_VIF
)) {
1852 /* in HW restart it exists already */
1853 WARN_ON(local
->resuming
);
1854 res
= drv_add_interface(local
, sdata
);
1856 RCU_INIT_POINTER(local
->monitor_sdata
, NULL
);
1862 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
1863 if (sdata
->vif
.type
== NL80211_IFTYPE_MONITOR
&&
1864 !ieee80211_hw_check(&local
->hw
, NO_VIRTUAL_MONITOR
))
1866 if (sdata
->vif
.type
!= NL80211_IFTYPE_AP_VLAN
&&
1867 ieee80211_sdata_running(sdata
)) {
1868 res
= drv_add_interface(local
, sdata
);
1874 /* If adding any of the interfaces failed above, roll back and
1878 list_for_each_entry_continue_reverse(sdata
, &local
->interfaces
,
1880 if (sdata
->vif
.type
== NL80211_IFTYPE_MONITOR
&&
1881 !ieee80211_hw_check(&local
->hw
, NO_VIRTUAL_MONITOR
))
1883 if (sdata
->vif
.type
!= NL80211_IFTYPE_AP_VLAN
&&
1884 ieee80211_sdata_running(sdata
))
1885 drv_remove_interface(local
, sdata
);
1887 ieee80211_handle_reconfig_failure(local
);
1891 /* add channel contexts */
1892 list_for_each_entry(ctx
, &local
->chanctx_list
, list
)
1893 if (ctx
->replace_state
!= IEEE80211_CHANCTX_REPLACES_OTHER
)
1894 WARN_ON(drv_add_chanctx(local
, ctx
));
1896 sdata
= wiphy_dereference(local
->hw
.wiphy
, local
->monitor_sdata
);
1897 if (sdata
&& ieee80211_sdata_running(sdata
))
1898 ieee80211_assign_chanctx(local
, sdata
, &sdata
->deflink
);
1900 /* reconfigure hardware */
1901 ieee80211_hw_config(local
, IEEE80211_CONF_CHANGE_LISTEN_INTERVAL
|
1902 IEEE80211_CONF_CHANGE_MONITOR
|
1903 IEEE80211_CONF_CHANGE_PS
|
1904 IEEE80211_CONF_CHANGE_RETRY_LIMITS
|
1905 IEEE80211_CONF_CHANGE_IDLE
);
1907 ieee80211_configure_filter(local
);
1909 /* Finally also reconfigure all the BSS information */
1910 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
1911 /* common change flags for all interface types - link only */
1912 u64 changed
= BSS_CHANGED_ERP_CTS_PROT
|
1913 BSS_CHANGED_ERP_PREAMBLE
|
1914 BSS_CHANGED_ERP_SLOT
|
1916 BSS_CHANGED_BASIC_RATES
|
1917 BSS_CHANGED_BEACON_INT
|
1921 BSS_CHANGED_TXPOWER
|
1922 BSS_CHANGED_MCAST_RATE
;
1923 struct ieee80211_link_data
*link
= NULL
;
1924 unsigned int link_id
;
1925 u32 active_links
= 0;
1927 if (!ieee80211_sdata_running(sdata
))
1930 if (ieee80211_vif_is_mld(&sdata
->vif
)) {
1931 struct ieee80211_bss_conf
*old
[IEEE80211_MLD_MAX_NUM_LINKS
] = {
1932 [0] = &sdata
->vif
.bss_conf
,
1935 if (sdata
->vif
.type
== NL80211_IFTYPE_STATION
) {
1936 /* start with a single active link */
1937 active_links
= sdata
->vif
.active_links
;
1938 link_id
= ffs(active_links
) - 1;
1939 sdata
->vif
.active_links
= BIT(link_id
);
1942 drv_change_vif_links(local
, sdata
, 0,
1943 sdata
->vif
.active_links
,
1947 sdata
->restart_active_links
= active_links
;
1950 link_id
< ARRAY_SIZE(sdata
->vif
.link_conf
);
1952 if (!ieee80211_vif_link_active(&sdata
->vif
, link_id
))
1955 link
= sdata_dereference(sdata
->link
[link_id
], sdata
);
1959 ieee80211_assign_chanctx(local
, sdata
, link
);
1962 switch (sdata
->vif
.type
) {
1963 case NL80211_IFTYPE_AP_VLAN
:
1964 case NL80211_IFTYPE_MONITOR
:
1966 case NL80211_IFTYPE_ADHOC
:
1967 if (sdata
->vif
.cfg
.ibss_joined
)
1968 WARN_ON(drv_join_ibss(local
, sdata
));
1971 ieee80211_reconfig_stations(sdata
);
1973 case NL80211_IFTYPE_AP
: /* AP stations are handled later */
1974 for (i
= 0; i
< IEEE80211_NUM_ACS
; i
++)
1975 drv_conf_tx(local
, &sdata
->deflink
, i
,
1976 &sdata
->deflink
.tx_conf
[i
]);
1980 if (sdata
->vif
.bss_conf
.mu_mimo_owner
)
1981 changed
|= BSS_CHANGED_MU_GROUPS
;
1983 if (!ieee80211_vif_is_mld(&sdata
->vif
))
1984 changed
|= BSS_CHANGED_IDLE
;
1986 switch (sdata
->vif
.type
) {
1987 case NL80211_IFTYPE_STATION
:
1988 if (!ieee80211_vif_is_mld(&sdata
->vif
)) {
1989 changed
|= BSS_CHANGED_ASSOC
|
1990 BSS_CHANGED_ARP_FILTER
|
1993 /* Re-send beacon info report to the driver */
1994 if (sdata
->deflink
.u
.mgd
.have_beacon
)
1995 changed
|= BSS_CHANGED_BEACON_INFO
;
1997 if (sdata
->vif
.bss_conf
.max_idle_period
||
1998 sdata
->vif
.bss_conf
.protected_keep_alive
)
1999 changed
|= BSS_CHANGED_KEEP_ALIVE
;
2001 ieee80211_bss_info_change_notify(sdata
,
2003 } else if (!WARN_ON(!link
)) {
2004 ieee80211_link_info_change_notify(sdata
, link
,
2006 changed
= BSS_CHANGED_ASSOC
|
2009 BSS_CHANGED_ARP_FILTER
;
2010 ieee80211_vif_cfg_change_notify(sdata
, changed
);
2013 case NL80211_IFTYPE_OCB
:
2014 changed
|= BSS_CHANGED_OCB
;
2015 ieee80211_bss_info_change_notify(sdata
, changed
);
2017 case NL80211_IFTYPE_ADHOC
:
2018 changed
|= BSS_CHANGED_IBSS
;
2020 case NL80211_IFTYPE_AP
:
2021 changed
|= BSS_CHANGED_P2P_PS
;
2023 if (ieee80211_vif_is_mld(&sdata
->vif
))
2024 ieee80211_vif_cfg_change_notify(sdata
,
2027 changed
|= BSS_CHANGED_SSID
;
2029 if (sdata
->vif
.bss_conf
.ftm_responder
== 1 &&
2030 wiphy_ext_feature_isset(sdata
->local
->hw
.wiphy
,
2031 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER
))
2032 changed
|= BSS_CHANGED_FTM_RESPONDER
;
2034 if (sdata
->vif
.type
== NL80211_IFTYPE_AP
) {
2035 changed
|= BSS_CHANGED_AP_PROBE_RESP
;
2037 if (ieee80211_vif_is_mld(&sdata
->vif
)) {
2038 ieee80211_reconfig_ap_links(local
,
2044 if (rcu_access_pointer(sdata
->deflink
.u
.ap
.beacon
))
2045 drv_start_ap(local
, sdata
,
2046 sdata
->deflink
.conf
);
2049 case NL80211_IFTYPE_MESH_POINT
:
2050 if (sdata
->vif
.bss_conf
.enable_beacon
) {
2051 changed
|= BSS_CHANGED_BEACON
|
2052 BSS_CHANGED_BEACON_ENABLED
;
2053 ieee80211_bss_info_change_notify(sdata
, changed
);
2056 case NL80211_IFTYPE_NAN
:
2057 res
= ieee80211_reconfig_nan(sdata
);
2059 ieee80211_handle_reconfig_failure(local
);
2063 case NL80211_IFTYPE_AP_VLAN
:
2064 case NL80211_IFTYPE_MONITOR
:
2065 case NL80211_IFTYPE_P2P_DEVICE
:
2068 case NL80211_IFTYPE_UNSPECIFIED
:
2069 case NUM_NL80211_IFTYPES
:
2070 case NL80211_IFTYPE_P2P_CLIENT
:
2071 case NL80211_IFTYPE_P2P_GO
:
2072 case NL80211_IFTYPE_WDS
:
2078 ieee80211_recalc_ps(local
);
2081 * The sta might be in psm against the ap (e.g. because
2082 * this was the state before a hw restart), so we
2083 * explicitly send a null packet in order to make sure
2084 * it'll sync against the ap (and get out of psm).
2086 if (!(local
->hw
.conf
.flags
& IEEE80211_CONF_PS
)) {
2087 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
2088 if (sdata
->vif
.type
!= NL80211_IFTYPE_STATION
)
2090 if (!sdata
->u
.mgd
.associated
)
2093 ieee80211_send_nullfunc(local
, sdata
, false);
2097 /* APs are now beaconing, add back stations */
2098 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
2099 if (!ieee80211_sdata_running(sdata
))
2102 switch (sdata
->vif
.type
) {
2103 case NL80211_IFTYPE_AP_VLAN
:
2104 case NL80211_IFTYPE_AP
:
2105 ieee80211_reconfig_stations(sdata
);
2113 list_for_each_entry(sdata
, &local
->interfaces
, list
)
2114 ieee80211_reenable_keys(sdata
);
2116 /* re-enable multi-link for client interfaces */
2117 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
2118 if (sdata
->restart_active_links
)
2119 ieee80211_set_active_links(&sdata
->vif
,
2120 sdata
->restart_active_links
);
2122 * If a link switch was scheduled before the restart, and ran
2123 * before reconfig, it will do nothing, so re-schedule.
2125 if (sdata
->desired_active_links
)
2126 wiphy_work_queue(sdata
->local
->hw
.wiphy
,
2127 &sdata
->activate_links_work
);
2130 /* Reconfigure sched scan if it was interrupted by FW restart */
2131 sched_scan_sdata
= rcu_dereference_protected(local
->sched_scan_sdata
,
2132 lockdep_is_held(&local
->hw
.wiphy
->mtx
));
2133 sched_scan_req
= rcu_dereference_protected(local
->sched_scan_req
,
2134 lockdep_is_held(&local
->hw
.wiphy
->mtx
));
2135 if (sched_scan_sdata
&& sched_scan_req
)
2137 * Sched scan stopped, but we don't want to report it. Instead,
2138 * we're trying to reschedule. However, if more than one scan
2139 * plan was set, we cannot reschedule since we don't know which
2140 * scan plan was currently running (and some scan plans may have
2141 * already finished).
2143 if (sched_scan_req
->n_scan_plans
> 1 ||
2144 __ieee80211_request_sched_scan_start(sched_scan_sdata
,
2146 RCU_INIT_POINTER(local
->sched_scan_sdata
, NULL
);
2147 RCU_INIT_POINTER(local
->sched_scan_req
, NULL
);
2148 sched_scan_stopped
= true;
2151 if (sched_scan_stopped
)
2152 cfg80211_sched_scan_stopped_locked(local
->hw
.wiphy
, 0);
2156 if (local
->monitors
== local
->open_count
&& local
->monitors
> 0)
2157 ieee80211_add_virtual_monitor(local
);
2160 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
2161 * sessions can be established after a resume.
2163 * Also tear down aggregation sessions since reconfiguring
2164 * them in a hardware restart scenario is not easily done
2165 * right now, and the hardware will have lost information
2166 * about the sessions, but we and the AP still think they
2167 * are active. This is really a workaround though.
2169 if (ieee80211_hw_check(hw
, AMPDU_AGGREGATION
)) {
2170 list_for_each_entry(sta
, &local
->sta_list
, list
) {
2171 if (!local
->resuming
)
2172 ieee80211_sta_tear_down_BA_sessions(
2173 sta
, AGG_STOP_LOCAL_REQUEST
);
2174 clear_sta_flag(sta
, WLAN_STA_BLOCK_BA
);
2179 * If this is for hw restart things are still running.
2180 * We may want to change that later, however.
2182 if (local
->open_count
&& (!suspended
|| reconfig_due_to_wowlan
))
2183 drv_reconfig_complete(local
, IEEE80211_RECONFIG_TYPE_RESTART
);
2185 if (local
->in_reconfig
) {
2186 in_reconfig
= local
->in_reconfig
;
2187 local
->in_reconfig
= false;
2190 ieee80211_reconfig_roc(local
);
2192 /* Requeue all works */
2193 list_for_each_entry(sdata
, &local
->interfaces
, list
)
2194 wiphy_work_queue(local
->hw
.wiphy
, &sdata
->work
);
2197 ieee80211_wake_queues_by_reason(hw
, IEEE80211_MAX_QUEUE_MAP
,
2198 IEEE80211_QUEUE_STOP_REASON_SUSPEND
,
2202 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
2203 if (!ieee80211_sdata_running(sdata
))
2205 if (sdata
->vif
.type
== NL80211_IFTYPE_STATION
)
2206 ieee80211_sta_restart(sdata
);
2214 /* first set suspended false, then resuming */
2215 local
->suspended
= false;
2217 local
->resuming
= false;
2219 ieee80211_flush_completed_scan(local
, false);
2221 if (local
->open_count
&& !reconfig_due_to_wowlan
)
2222 drv_reconfig_complete(local
, IEEE80211_RECONFIG_TYPE_SUSPEND
);
2224 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
2225 if (!ieee80211_sdata_running(sdata
))
2227 if (sdata
->vif
.type
== NL80211_IFTYPE_STATION
)
2228 ieee80211_sta_restart(sdata
);
2231 mod_timer(&local
->sta_cleanup
, jiffies
+ 1);
2239 static void ieee80211_reconfig_disconnect(struct ieee80211_vif
*vif
, u8 flag
)
2241 struct ieee80211_sub_if_data
*sdata
;
2242 struct ieee80211_local
*local
;
2243 struct ieee80211_key
*key
;
2248 sdata
= vif_to_sdata(vif
);
2249 local
= sdata
->local
;
2251 lockdep_assert_wiphy(local
->hw
.wiphy
);
2253 if (WARN_ON(flag
& IEEE80211_SDATA_DISCONNECT_RESUME
&&
2257 if (WARN_ON(flag
& IEEE80211_SDATA_DISCONNECT_HW_RESTART
&&
2258 !local
->in_reconfig
))
2261 if (WARN_ON(vif
->type
!= NL80211_IFTYPE_STATION
))
2264 sdata
->flags
|= flag
;
2266 list_for_each_entry(key
, &sdata
->key_list
, list
)
2267 key
->flags
|= KEY_FLAG_TAINTED
;
2270 void ieee80211_hw_restart_disconnect(struct ieee80211_vif
*vif
)
2272 ieee80211_reconfig_disconnect(vif
, IEEE80211_SDATA_DISCONNECT_HW_RESTART
);
2274 EXPORT_SYMBOL_GPL(ieee80211_hw_restart_disconnect
);
2276 void ieee80211_resume_disconnect(struct ieee80211_vif
*vif
)
2278 ieee80211_reconfig_disconnect(vif
, IEEE80211_SDATA_DISCONNECT_RESUME
);
2280 EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect
);
2282 void ieee80211_recalc_smps(struct ieee80211_sub_if_data
*sdata
,
2283 struct ieee80211_link_data
*link
)
2285 struct ieee80211_local
*local
= sdata
->local
;
2286 struct ieee80211_chanctx_conf
*chanctx_conf
;
2287 struct ieee80211_chanctx
*chanctx
;
2289 lockdep_assert_wiphy(local
->hw
.wiphy
);
2291 chanctx_conf
= rcu_dereference_protected(link
->conf
->chanctx_conf
,
2292 lockdep_is_held(&local
->hw
.wiphy
->mtx
));
2295 * This function can be called from a work, thus it may be possible
2296 * that the chanctx_conf is removed (due to a disconnection, for
2298 * So nothing should be done in such case.
2303 chanctx
= container_of(chanctx_conf
, struct ieee80211_chanctx
, conf
);
2304 ieee80211_recalc_smps_chanctx(local
, chanctx
);
2307 void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data
*sdata
,
2310 struct ieee80211_local
*local
= sdata
->local
;
2311 struct ieee80211_chanctx_conf
*chanctx_conf
;
2312 struct ieee80211_chanctx
*chanctx
;
2315 lockdep_assert_wiphy(local
->hw
.wiphy
);
2317 for (i
= 0; i
< ARRAY_SIZE(sdata
->vif
.link_conf
); i
++) {
2318 struct ieee80211_bss_conf
*bss_conf
;
2320 if (link_id
>= 0 && link_id
!= i
)
2324 bss_conf
= rcu_dereference(sdata
->vif
.link_conf
[i
]);
2330 chanctx_conf
= rcu_dereference_protected(bss_conf
->chanctx_conf
,
2331 lockdep_is_held(&local
->hw
.wiphy
->mtx
));
2333 * Since we hold the wiphy mutex (checked above)
2334 * we can take the chanctx_conf pointer out of the
2335 * RCU critical section, it cannot go away without
2336 * the mutex. Just the way we reached it could - in
2337 * theory - go away, but we don't really care and
2338 * it really shouldn't happen anyway.
2345 chanctx
= container_of(chanctx_conf
, struct ieee80211_chanctx
,
2347 ieee80211_recalc_chanctx_min_def(local
, chanctx
, NULL
, false);
2351 size_t ieee80211_ie_split_vendor(const u8
*ies
, size_t ielen
, size_t offset
)
2353 size_t pos
= offset
;
2355 while (pos
< ielen
&& ies
[pos
] != WLAN_EID_VENDOR_SPECIFIC
)
2356 pos
+= 2 + ies
[pos
+ 1];
2361 u8
*ieee80211_ie_build_ht_cap(u8
*pos
, struct ieee80211_sta_ht_cap
*ht_cap
,
2366 *pos
++ = WLAN_EID_HT_CAPABILITY
;
2367 *pos
++ = sizeof(struct ieee80211_ht_cap
);
2368 memset(pos
, 0, sizeof(struct ieee80211_ht_cap
));
2370 /* capability flags */
2371 tmp
= cpu_to_le16(cap
);
2372 memcpy(pos
, &tmp
, sizeof(u16
));
2375 /* AMPDU parameters */
2376 *pos
++ = ht_cap
->ampdu_factor
|
2377 (ht_cap
->ampdu_density
<<
2378 IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT
);
2381 memcpy(pos
, &ht_cap
->mcs
, sizeof(ht_cap
->mcs
));
2382 pos
+= sizeof(ht_cap
->mcs
);
2384 /* extended capabilities */
2385 pos
+= sizeof(__le16
);
2387 /* BF capabilities */
2388 pos
+= sizeof(__le32
);
2390 /* antenna selection */
2396 u8
*ieee80211_ie_build_vht_cap(u8
*pos
, struct ieee80211_sta_vht_cap
*vht_cap
,
2401 *pos
++ = WLAN_EID_VHT_CAPABILITY
;
2402 *pos
++ = sizeof(struct ieee80211_vht_cap
);
2403 memset(pos
, 0, sizeof(struct ieee80211_vht_cap
));
2405 /* capability flags */
2406 tmp
= cpu_to_le32(cap
);
2407 memcpy(pos
, &tmp
, sizeof(u32
));
2411 memcpy(pos
, &vht_cap
->vht_mcs
, sizeof(vht_cap
->vht_mcs
));
2412 pos
+= sizeof(vht_cap
->vht_mcs
);
2417 /* this may return more than ieee80211_put_he_6ghz_cap() will need */
2418 u8
ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data
*sdata
)
2420 const struct ieee80211_sta_he_cap
*he_cap
;
2421 struct ieee80211_supported_band
*sband
;
2424 sband
= ieee80211_get_sband(sdata
);
2428 he_cap
= ieee80211_get_he_iftype_cap_vif(sband
, &sdata
->vif
);
2432 n
= ieee80211_he_mcs_nss_size(&he_cap
->he_cap_elem
);
2434 sizeof(he_cap
->he_cap_elem
) + n
+
2435 ieee80211_he_ppe_size(he_cap
->ppe_thres
[0],
2436 he_cap
->he_cap_elem
.phy_cap_info
);
2440 ieee80211_get_adjusted_he_cap(const struct ieee80211_conn_settings
*conn
,
2441 const struct ieee80211_sta_he_cap
*he_cap
,
2442 struct ieee80211_he_cap_elem
*elem
)
2444 u8 ru_limit
, max_ru
;
2446 *elem
= he_cap
->he_cap_elem
;
2448 switch (conn
->bw_limit
) {
2449 case IEEE80211_CONN_BW_LIMIT_20
:
2450 ru_limit
= IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242
;
2452 case IEEE80211_CONN_BW_LIMIT_40
:
2453 ru_limit
= IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484
;
2455 case IEEE80211_CONN_BW_LIMIT_80
:
2456 ru_limit
= IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_996
;
2459 ru_limit
= IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_2x996
;
2463 max_ru
= elem
->phy_cap_info
[8] & IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK
;
2464 max_ru
= min(max_ru
, ru_limit
);
2465 elem
->phy_cap_info
[8] &= ~IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_MASK
;
2466 elem
->phy_cap_info
[8] |= max_ru
;
2468 if (conn
->bw_limit
< IEEE80211_CONN_BW_LIMIT_40
) {
2469 elem
->phy_cap_info
[0] &=
2470 ~(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
|
2471 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G
);
2472 elem
->phy_cap_info
[9] &=
2473 ~IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM
;
2476 if (conn
->bw_limit
< IEEE80211_CONN_BW_LIMIT_160
) {
2477 elem
->phy_cap_info
[0] &=
2478 ~(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
|
2479 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
);
2480 elem
->phy_cap_info
[5] &=
2481 ~IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK
;
2482 elem
->phy_cap_info
[7] &=
2483 ~(IEEE80211_HE_PHY_CAP7_STBC_TX_ABOVE_80MHZ
|
2484 IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ
);
2488 int ieee80211_put_he_cap(struct sk_buff
*skb
,
2489 struct ieee80211_sub_if_data
*sdata
,
2490 const struct ieee80211_supported_band
*sband
,
2491 const struct ieee80211_conn_settings
*conn
)
2493 const struct ieee80211_sta_he_cap
*he_cap
;
2494 struct ieee80211_he_cap_elem elem
;
2500 conn
= &ieee80211_conn_settings_unlimited
;
2502 he_cap
= ieee80211_get_he_iftype_cap_vif(sband
, &sdata
->vif
);
2506 /* modify on stack first to calculate 'n' and 'ie_len' correctly */
2507 ieee80211_get_adjusted_he_cap(conn
, he_cap
, &elem
);
2509 n
= ieee80211_he_mcs_nss_size(&elem
);
2511 sizeof(he_cap
->he_cap_elem
) + n
+
2512 ieee80211_he_ppe_size(he_cap
->ppe_thres
[0],
2513 he_cap
->he_cap_elem
.phy_cap_info
);
2515 if (skb_tailroom(skb
) < ie_len
)
2518 skb_put_u8(skb
, WLAN_EID_EXTENSION
);
2519 len
= skb_put(skb
, 1); /* We'll set the size later below */
2520 skb_put_u8(skb
, WLAN_EID_EXT_HE_CAPABILITY
);
2523 skb_put_data(skb
, &elem
, sizeof(elem
));
2525 skb_put_data(skb
, &he_cap
->he_mcs_nss_supp
, n
);
2527 /* Check if PPE Threshold should be present */
2528 if ((he_cap
->he_cap_elem
.phy_cap_info
[6] &
2529 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT
) == 0)
2533 * Calculate how many PPET16/PPET8 pairs are to come. Algorithm:
2534 * (NSS_M1 + 1) x (num of 1 bits in RU_INDEX_BITMASK)
2536 n
= hweight8(he_cap
->ppe_thres
[0] &
2537 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK
);
2538 n
*= (1 + ((he_cap
->ppe_thres
[0] & IEEE80211_PPE_THRES_NSS_MASK
) >>
2539 IEEE80211_PPE_THRES_NSS_POS
));
2542 * Each pair is 6 bits, and we need to add the 7 "header" bits to the
2545 n
= (n
* IEEE80211_PPE_THRES_INFO_PPET_SIZE
* 2) + 7;
2546 n
= DIV_ROUND_UP(n
, 8);
2548 /* Copy PPE Thresholds */
2549 skb_put_data(skb
, &he_cap
->ppe_thres
, n
);
2552 *len
= skb_tail_pointer(skb
) - len
- 1;
2556 int ieee80211_put_he_6ghz_cap(struct sk_buff
*skb
,
2557 struct ieee80211_sub_if_data
*sdata
,
2558 enum ieee80211_smps_mode smps_mode
)
2560 struct ieee80211_supported_band
*sband
;
2561 const struct ieee80211_sband_iftype_data
*iftd
;
2562 enum nl80211_iftype iftype
= ieee80211_vif_type_p2p(&sdata
->vif
);
2565 if (!cfg80211_any_usable_channels(sdata
->local
->hw
.wiphy
,
2566 BIT(NL80211_BAND_6GHZ
),
2567 IEEE80211_CHAN_NO_HE
))
2570 sband
= sdata
->local
->hw
.wiphy
->bands
[NL80211_BAND_6GHZ
];
2572 iftd
= ieee80211_get_sband_iftype_data(sband
, iftype
);
2576 /* Check for device HE 6 GHz capability before adding element */
2577 if (!iftd
->he_6ghz_capa
.capa
)
2580 cap
= iftd
->he_6ghz_capa
.capa
;
2581 cap
&= cpu_to_le16(~IEEE80211_HE_6GHZ_CAP_SM_PS
);
2583 switch (smps_mode
) {
2584 case IEEE80211_SMPS_AUTOMATIC
:
2585 case IEEE80211_SMPS_NUM_MODES
:
2588 case IEEE80211_SMPS_OFF
:
2589 cap
|= le16_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED
,
2590 IEEE80211_HE_6GHZ_CAP_SM_PS
);
2592 case IEEE80211_SMPS_STATIC
:
2593 cap
|= le16_encode_bits(WLAN_HT_CAP_SM_PS_STATIC
,
2594 IEEE80211_HE_6GHZ_CAP_SM_PS
);
2596 case IEEE80211_SMPS_DYNAMIC
:
2597 cap
|= le16_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC
,
2598 IEEE80211_HE_6GHZ_CAP_SM_PS
);
2602 if (skb_tailroom(skb
) < 2 + 1 + sizeof(cap
))
2605 skb_put_u8(skb
, WLAN_EID_EXTENSION
);
2606 skb_put_u8(skb
, 1 + sizeof(cap
));
2607 skb_put_u8(skb
, WLAN_EID_EXT_HE_6GHZ_CAPA
);
2608 skb_put_data(skb
, &cap
, sizeof(cap
));
2612 u8
*ieee80211_ie_build_ht_oper(u8
*pos
, struct ieee80211_sta_ht_cap
*ht_cap
,
2613 const struct cfg80211_chan_def
*chandef
,
2614 u16 prot_mode
, bool rifs_mode
)
2616 struct ieee80211_ht_operation
*ht_oper
;
2617 /* Build HT Information */
2618 *pos
++ = WLAN_EID_HT_OPERATION
;
2619 *pos
++ = sizeof(struct ieee80211_ht_operation
);
2620 ht_oper
= (struct ieee80211_ht_operation
*)pos
;
2621 ht_oper
->primary_chan
= ieee80211_frequency_to_channel(
2622 chandef
->chan
->center_freq
);
2623 switch (chandef
->width
) {
2624 case NL80211_CHAN_WIDTH_160
:
2625 case NL80211_CHAN_WIDTH_80P80
:
2626 case NL80211_CHAN_WIDTH_80
:
2627 case NL80211_CHAN_WIDTH_40
:
2628 if (chandef
->center_freq1
> chandef
->chan
->center_freq
)
2629 ht_oper
->ht_param
= IEEE80211_HT_PARAM_CHA_SEC_ABOVE
;
2631 ht_oper
->ht_param
= IEEE80211_HT_PARAM_CHA_SEC_BELOW
;
2633 case NL80211_CHAN_WIDTH_320
:
2634 /* HT information element should not be included on 6GHz */
2638 ht_oper
->ht_param
= IEEE80211_HT_PARAM_CHA_SEC_NONE
;
2641 if (ht_cap
->cap
& IEEE80211_HT_CAP_SUP_WIDTH_20_40
&&
2642 chandef
->width
!= NL80211_CHAN_WIDTH_20_NOHT
&&
2643 chandef
->width
!= NL80211_CHAN_WIDTH_20
)
2644 ht_oper
->ht_param
|= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY
;
2647 ht_oper
->ht_param
|= IEEE80211_HT_PARAM_RIFS_MODE
;
2649 ht_oper
->operation_mode
= cpu_to_le16(prot_mode
);
2650 ht_oper
->stbc_param
= 0x0000;
2652 /* It seems that Basic MCS set and Supported MCS set
2653 are identical for the first 10 bytes */
2654 memset(&ht_oper
->basic_set
, 0, 16);
2655 memcpy(&ht_oper
->basic_set
, &ht_cap
->mcs
, 10);
2657 return pos
+ sizeof(struct ieee80211_ht_operation
);
2660 void ieee80211_ie_build_wide_bw_cs(u8
*pos
,
2661 const struct cfg80211_chan_def
*chandef
)
2663 *pos
++ = WLAN_EID_WIDE_BW_CHANNEL_SWITCH
; /* EID */
2664 *pos
++ = 3; /* IE length */
2665 /* New channel width */
2666 switch (chandef
->width
) {
2667 case NL80211_CHAN_WIDTH_80
:
2668 *pos
++ = IEEE80211_VHT_CHANWIDTH_80MHZ
;
2670 case NL80211_CHAN_WIDTH_160
:
2671 *pos
++ = IEEE80211_VHT_CHANWIDTH_160MHZ
;
2673 case NL80211_CHAN_WIDTH_80P80
:
2674 *pos
++ = IEEE80211_VHT_CHANWIDTH_80P80MHZ
;
2676 case NL80211_CHAN_WIDTH_320
:
2677 /* The behavior is not defined for 320 MHz channels */
2681 *pos
++ = IEEE80211_VHT_CHANWIDTH_USE_HT
;
2684 /* new center frequency segment 0 */
2685 *pos
++ = ieee80211_frequency_to_channel(chandef
->center_freq1
);
2686 /* new center frequency segment 1 */
2687 if (chandef
->center_freq2
)
2688 *pos
++ = ieee80211_frequency_to_channel(chandef
->center_freq2
);
2693 u8
*ieee80211_ie_build_vht_oper(u8
*pos
, struct ieee80211_sta_vht_cap
*vht_cap
,
2694 const struct cfg80211_chan_def
*chandef
)
2696 struct ieee80211_vht_operation
*vht_oper
;
2698 *pos
++ = WLAN_EID_VHT_OPERATION
;
2699 *pos
++ = sizeof(struct ieee80211_vht_operation
);
2700 vht_oper
= (struct ieee80211_vht_operation
*)pos
;
2701 vht_oper
->center_freq_seg0_idx
= ieee80211_frequency_to_channel(
2702 chandef
->center_freq1
);
2703 if (chandef
->center_freq2
)
2704 vht_oper
->center_freq_seg1_idx
=
2705 ieee80211_frequency_to_channel(chandef
->center_freq2
);
2707 vht_oper
->center_freq_seg1_idx
= 0x00;
2709 switch (chandef
->width
) {
2710 case NL80211_CHAN_WIDTH_160
:
2712 * Convert 160 MHz channel width to new style as interop
2715 vht_oper
->chan_width
= IEEE80211_VHT_CHANWIDTH_80MHZ
;
2716 vht_oper
->center_freq_seg1_idx
= vht_oper
->center_freq_seg0_idx
;
2717 if (chandef
->chan
->center_freq
< chandef
->center_freq1
)
2718 vht_oper
->center_freq_seg0_idx
-= 8;
2720 vht_oper
->center_freq_seg0_idx
+= 8;
2722 case NL80211_CHAN_WIDTH_80P80
:
2724 * Convert 80+80 MHz channel width to new style as interop
2727 vht_oper
->chan_width
= IEEE80211_VHT_CHANWIDTH_80MHZ
;
2729 case NL80211_CHAN_WIDTH_80
:
2730 vht_oper
->chan_width
= IEEE80211_VHT_CHANWIDTH_80MHZ
;
2732 case NL80211_CHAN_WIDTH_320
:
2733 /* VHT information element should not be included on 6GHz */
2737 vht_oper
->chan_width
= IEEE80211_VHT_CHANWIDTH_USE_HT
;
2741 /* don't require special VHT peer rates */
2742 vht_oper
->basic_mcs_set
= cpu_to_le16(0xffff);
2744 return pos
+ sizeof(struct ieee80211_vht_operation
);
2747 u8
*ieee80211_ie_build_he_oper(u8
*pos
, const struct cfg80211_chan_def
*chandef
)
2749 struct ieee80211_he_operation
*he_oper
;
2750 struct ieee80211_he_6ghz_oper
*he_6ghz_op
;
2752 u8 ie_len
= 1 + sizeof(struct ieee80211_he_operation
);
2754 if (chandef
->chan
->band
== NL80211_BAND_6GHZ
)
2755 ie_len
+= sizeof(struct ieee80211_he_6ghz_oper
);
2757 *pos
++ = WLAN_EID_EXTENSION
;
2759 *pos
++ = WLAN_EID_EXT_HE_OPERATION
;
2762 he_oper_params
|= u32_encode_bits(1023, /* disabled */
2763 IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK
);
2764 he_oper_params
|= u32_encode_bits(1,
2765 IEEE80211_HE_OPERATION_ER_SU_DISABLE
);
2766 he_oper_params
|= u32_encode_bits(1,
2767 IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED
);
2768 if (chandef
->chan
->band
== NL80211_BAND_6GHZ
)
2769 he_oper_params
|= u32_encode_bits(1,
2770 IEEE80211_HE_OPERATION_6GHZ_OP_INFO
);
2772 he_oper
= (struct ieee80211_he_operation
*)pos
;
2773 he_oper
->he_oper_params
= cpu_to_le32(he_oper_params
);
2775 /* don't require special HE peer rates */
2776 he_oper
->he_mcs_nss_set
= cpu_to_le16(0xffff);
2777 pos
+= sizeof(struct ieee80211_he_operation
);
2779 if (chandef
->chan
->band
!= NL80211_BAND_6GHZ
)
2782 /* TODO add VHT operational */
2783 he_6ghz_op
= (struct ieee80211_he_6ghz_oper
*)pos
;
2784 he_6ghz_op
->minrate
= 6; /* 6 Mbps */
2785 he_6ghz_op
->primary
=
2786 ieee80211_frequency_to_channel(chandef
->chan
->center_freq
);
2788 ieee80211_frequency_to_channel(chandef
->center_freq1
);
2789 if (chandef
->center_freq2
)
2791 ieee80211_frequency_to_channel(chandef
->center_freq2
);
2793 he_6ghz_op
->ccfs1
= 0;
2795 switch (chandef
->width
) {
2796 case NL80211_CHAN_WIDTH_320
:
2798 * TODO: mesh operation is not defined over 6GHz 320 MHz
2803 case NL80211_CHAN_WIDTH_160
:
2804 /* Convert 160 MHz channel width to new style as interop
2807 he_6ghz_op
->control
=
2808 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ
;
2809 he_6ghz_op
->ccfs1
= he_6ghz_op
->ccfs0
;
2810 if (chandef
->chan
->center_freq
< chandef
->center_freq1
)
2811 he_6ghz_op
->ccfs0
-= 8;
2813 he_6ghz_op
->ccfs0
+= 8;
2815 case NL80211_CHAN_WIDTH_80P80
:
2816 he_6ghz_op
->control
=
2817 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ
;
2819 case NL80211_CHAN_WIDTH_80
:
2820 he_6ghz_op
->control
=
2821 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ
;
2823 case NL80211_CHAN_WIDTH_40
:
2824 he_6ghz_op
->control
=
2825 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ
;
2828 he_6ghz_op
->control
=
2829 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ
;
2833 pos
+= sizeof(struct ieee80211_he_6ghz_oper
);
2839 u8
*ieee80211_ie_build_eht_oper(u8
*pos
, const struct cfg80211_chan_def
*chandef
,
2840 const struct ieee80211_sta_eht_cap
*eht_cap
)
2843 const struct ieee80211_eht_mcs_nss_supp_20mhz_only
*eht_mcs_nss
=
2844 &eht_cap
->eht_mcs_nss_supp
.only_20mhz
;
2845 struct ieee80211_eht_operation
*eht_oper
;
2846 struct ieee80211_eht_operation_info
*eht_oper_info
;
2847 u8 eht_oper_len
= offsetof(struct ieee80211_eht_operation
, optional
);
2848 u8 eht_oper_info_len
=
2849 offsetof(struct ieee80211_eht_operation_info
, optional
);
2852 *pos
++ = WLAN_EID_EXTENSION
;
2853 *pos
++ = 1 + eht_oper_len
+ eht_oper_info_len
;
2854 *pos
++ = WLAN_EID_EXT_EHT_OPERATION
;
2856 eht_oper
= (struct ieee80211_eht_operation
*)pos
;
2858 memcpy(&eht_oper
->basic_mcs_nss
, eht_mcs_nss
, sizeof(*eht_mcs_nss
));
2859 eht_oper
->params
|= IEEE80211_EHT_OPER_INFO_PRESENT
;
2860 pos
+= eht_oper_len
;
2863 (struct ieee80211_eht_operation_info
*)eht_oper
->optional
;
2865 eht_oper_info
->ccfs0
=
2866 ieee80211_frequency_to_channel(chandef
->center_freq1
);
2867 if (chandef
->center_freq2
)
2868 eht_oper_info
->ccfs1
=
2869 ieee80211_frequency_to_channel(chandef
->center_freq2
);
2871 eht_oper_info
->ccfs1
= 0;
2873 switch (chandef
->width
) {
2874 case NL80211_CHAN_WIDTH_320
:
2875 chan_width
= IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ
;
2876 eht_oper_info
->ccfs1
= eht_oper_info
->ccfs0
;
2877 if (chandef
->chan
->center_freq
< chandef
->center_freq1
)
2878 eht_oper_info
->ccfs0
-= 16;
2880 eht_oper_info
->ccfs0
+= 16;
2882 case NL80211_CHAN_WIDTH_160
:
2883 eht_oper_info
->ccfs1
= eht_oper_info
->ccfs0
;
2884 if (chandef
->chan
->center_freq
< chandef
->center_freq1
)
2885 eht_oper_info
->ccfs0
-= 8;
2887 eht_oper_info
->ccfs0
+= 8;
2889 case NL80211_CHAN_WIDTH_80P80
:
2890 chan_width
= IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ
;
2892 case NL80211_CHAN_WIDTH_80
:
2893 chan_width
= IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ
;
2895 case NL80211_CHAN_WIDTH_40
:
2896 chan_width
= IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ
;
2899 chan_width
= IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ
;
2902 eht_oper_info
->control
= chan_width
;
2903 pos
+= eht_oper_info_len
;
2905 /* TODO: eht_oper_info->optional */
2910 bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation
*ht_oper
,
2911 struct cfg80211_chan_def
*chandef
)
2913 enum nl80211_channel_type channel_type
;
2918 switch (ht_oper
->ht_param
& IEEE80211_HT_PARAM_CHA_SEC_OFFSET
) {
2919 case IEEE80211_HT_PARAM_CHA_SEC_NONE
:
2920 channel_type
= NL80211_CHAN_HT20
;
2922 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE
:
2923 channel_type
= NL80211_CHAN_HT40PLUS
;
2925 case IEEE80211_HT_PARAM_CHA_SEC_BELOW
:
2926 channel_type
= NL80211_CHAN_HT40MINUS
;
2932 cfg80211_chandef_create(chandef
, chandef
->chan
, channel_type
);
2936 bool ieee80211_chandef_vht_oper(struct ieee80211_hw
*hw
, u32 vht_cap_info
,
2937 const struct ieee80211_vht_operation
*oper
,
2938 const struct ieee80211_ht_operation
*htop
,
2939 struct cfg80211_chan_def
*chandef
)
2941 struct cfg80211_chan_def
new = *chandef
;
2943 int ccfs0
, ccfs1
, ccfs2
;
2946 bool support_80_80
= false;
2947 bool support_160
= false;
2948 u8 ext_nss_bw_supp
= u32_get_bits(vht_cap_info
,
2949 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK
);
2950 u8 supp_chwidth
= u32_get_bits(vht_cap_info
,
2951 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK
);
2956 vht_cap
= hw
->wiphy
->bands
[chandef
->chan
->band
]->vht_cap
.cap
;
2957 support_160
= (vht_cap
& (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK
|
2958 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK
));
2959 support_80_80
= ((vht_cap
&
2960 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ
) ||
2961 (vht_cap
& IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ
&&
2962 vht_cap
& IEEE80211_VHT_CAP_EXT_NSS_BW_MASK
) ||
2963 ((vht_cap
& IEEE80211_VHT_CAP_EXT_NSS_BW_MASK
) >>
2964 IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT
> 1));
2965 ccfs0
= oper
->center_freq_seg0_idx
;
2966 ccfs1
= oper
->center_freq_seg1_idx
;
2967 ccfs2
= (le16_to_cpu(htop
->operation_mode
) &
2968 IEEE80211_HT_OP_MODE_CCFS2_MASK
)
2969 >> IEEE80211_HT_OP_MODE_CCFS2_SHIFT
;
2973 /* if not supported, parse as though we didn't understand it */
2974 if (!ieee80211_hw_check(hw
, SUPPORTS_VHT_EXT_NSS_BW
))
2975 ext_nss_bw_supp
= 0;
2978 * Cf. IEEE 802.11 Table 9-250
2980 * We really just consider that because it's inefficient to connect
2981 * at a higher bandwidth than we'll actually be able to use.
2983 switch ((supp_chwidth
<< 4) | ext_nss_bw_supp
) {
2987 support_160
= false;
2988 support_80_80
= false;
2991 support_80_80
= false;
3014 cf0
= ieee80211_channel_to_frequency(ccf0
, chandef
->chan
->band
);
3015 cf1
= ieee80211_channel_to_frequency(ccf1
, chandef
->chan
->band
);
3017 switch (oper
->chan_width
) {
3018 case IEEE80211_VHT_CHANWIDTH_USE_HT
:
3019 /* just use HT information directly */
3021 case IEEE80211_VHT_CHANWIDTH_80MHZ
:
3022 new.width
= NL80211_CHAN_WIDTH_80
;
3023 new.center_freq1
= cf0
;
3024 /* If needed, adjust based on the newer interop workaround. */
3028 diff
= abs(ccf1
- ccf0
);
3029 if ((diff
== 8) && support_160
) {
3030 new.width
= NL80211_CHAN_WIDTH_160
;
3031 new.center_freq1
= cf1
;
3032 } else if ((diff
> 8) && support_80_80
) {
3033 new.width
= NL80211_CHAN_WIDTH_80P80
;
3034 new.center_freq2
= cf1
;
3038 case IEEE80211_VHT_CHANWIDTH_160MHZ
:
3039 /* deprecated encoding */
3040 new.width
= NL80211_CHAN_WIDTH_160
;
3041 new.center_freq1
= cf0
;
3043 case IEEE80211_VHT_CHANWIDTH_80P80MHZ
:
3044 /* deprecated encoding */
3045 new.width
= NL80211_CHAN_WIDTH_80P80
;
3046 new.center_freq1
= cf0
;
3047 new.center_freq2
= cf1
;
3053 if (!cfg80211_chandef_valid(&new))
3060 void ieee80211_chandef_eht_oper(const struct ieee80211_eht_operation_info
*info
,
3061 struct cfg80211_chan_def
*chandef
)
3063 chandef
->center_freq1
=
3064 ieee80211_channel_to_frequency(info
->ccfs0
,
3065 chandef
->chan
->band
);
3067 switch (u8_get_bits(info
->control
,
3068 IEEE80211_EHT_OPER_CHAN_WIDTH
)) {
3069 case IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ
:
3070 chandef
->width
= NL80211_CHAN_WIDTH_20
;
3072 case IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ
:
3073 chandef
->width
= NL80211_CHAN_WIDTH_40
;
3075 case IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ
:
3076 chandef
->width
= NL80211_CHAN_WIDTH_80
;
3078 case IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ
:
3079 chandef
->width
= NL80211_CHAN_WIDTH_160
;
3080 chandef
->center_freq1
=
3081 ieee80211_channel_to_frequency(info
->ccfs1
,
3082 chandef
->chan
->band
);
3084 case IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ
:
3085 chandef
->width
= NL80211_CHAN_WIDTH_320
;
3086 chandef
->center_freq1
=
3087 ieee80211_channel_to_frequency(info
->ccfs1
,
3088 chandef
->chan
->band
);
3093 bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_local
*local
,
3094 const struct ieee80211_he_operation
*he_oper
,
3095 const struct ieee80211_eht_operation
*eht_oper
,
3096 struct cfg80211_chan_def
*chandef
)
3098 struct cfg80211_chan_def he_chandef
= *chandef
;
3099 const struct ieee80211_he_6ghz_oper
*he_6ghz_oper
;
3102 if (chandef
->chan
->band
!= NL80211_BAND_6GHZ
)
3108 he_6ghz_oper
= ieee80211_he_6ghz_oper(he_oper
);
3113 * The EHT operation IE does not contain the primary channel so the
3114 * primary channel frequency should be taken from the 6 GHz operation
3117 freq
= ieee80211_channel_to_frequency(he_6ghz_oper
->primary
,
3119 he_chandef
.chan
= ieee80211_get_channel(local
->hw
.wiphy
, freq
);
3121 if (!he_chandef
.chan
)
3125 !(eht_oper
->params
& IEEE80211_EHT_OPER_INFO_PRESENT
)) {
3126 switch (u8_get_bits(he_6ghz_oper
->control
,
3127 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH
)) {
3128 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ
:
3129 he_chandef
.width
= NL80211_CHAN_WIDTH_20
;
3131 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ
:
3132 he_chandef
.width
= NL80211_CHAN_WIDTH_40
;
3134 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ
:
3135 he_chandef
.width
= NL80211_CHAN_WIDTH_80
;
3137 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ
:
3138 he_chandef
.width
= NL80211_CHAN_WIDTH_80
;
3139 if (!he_6ghz_oper
->ccfs1
)
3141 if (abs(he_6ghz_oper
->ccfs1
- he_6ghz_oper
->ccfs0
) == 8)
3142 he_chandef
.width
= NL80211_CHAN_WIDTH_160
;
3144 he_chandef
.width
= NL80211_CHAN_WIDTH_80P80
;
3148 if (he_chandef
.width
== NL80211_CHAN_WIDTH_160
) {
3149 he_chandef
.center_freq1
=
3150 ieee80211_channel_to_frequency(he_6ghz_oper
->ccfs1
,
3153 he_chandef
.center_freq1
=
3154 ieee80211_channel_to_frequency(he_6ghz_oper
->ccfs0
,
3156 he_chandef
.center_freq2
=
3157 ieee80211_channel_to_frequency(he_6ghz_oper
->ccfs1
,
3161 ieee80211_chandef_eht_oper((const void *)eht_oper
->optional
,
3163 he_chandef
.punctured
=
3164 ieee80211_eht_oper_dis_subchan_bitmap(eht_oper
);
3167 if (!cfg80211_chandef_valid(&he_chandef
))
3170 *chandef
= he_chandef
;
3175 bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie
*oper
,
3176 struct cfg80211_chan_def
*chandef
)
3183 switch (FIELD_GET(S1G_OPER_CH_WIDTH_OPER
, oper
->ch_width
)) {
3184 case IEEE80211_S1G_CHANWIDTH_1MHZ
:
3185 chandef
->width
= NL80211_CHAN_WIDTH_1
;
3187 case IEEE80211_S1G_CHANWIDTH_2MHZ
:
3188 chandef
->width
= NL80211_CHAN_WIDTH_2
;
3190 case IEEE80211_S1G_CHANWIDTH_4MHZ
:
3191 chandef
->width
= NL80211_CHAN_WIDTH_4
;
3193 case IEEE80211_S1G_CHANWIDTH_8MHZ
:
3194 chandef
->width
= NL80211_CHAN_WIDTH_8
;
3196 case IEEE80211_S1G_CHANWIDTH_16MHZ
:
3197 chandef
->width
= NL80211_CHAN_WIDTH_16
;
3203 oper_freq
= ieee80211_channel_to_freq_khz(oper
->oper_ch
,
3204 NL80211_BAND_S1GHZ
);
3205 chandef
->center_freq1
= KHZ_TO_MHZ(oper_freq
);
3206 chandef
->freq1_offset
= oper_freq
% 1000;
3211 int ieee80211_put_srates_elem(struct sk_buff
*skb
,
3212 const struct ieee80211_supported_band
*sband
,
3213 u32 basic_rates
, u32 rate_flags
, u32 masked_rates
,
3219 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
3220 if ((rate_flags
& sband
->bitrates
[i
].flags
) != rate_flags
)
3222 if (masked_rates
& BIT(i
))
3227 if (element_id
== WLAN_EID_SUPP_RATES
) {
3228 rates
= min_t(u8
, rates
, 8);
3237 if (skb_tailroom(skb
) < rates
+ 2)
3240 skb_put_u8(skb
, element_id
);
3241 skb_put_u8(skb
, rates
);
3243 for (i
= 0; i
< sband
->n_bitrates
&& rates
; i
++) {
3247 if ((rate_flags
& sband
->bitrates
[i
].flags
) != rate_flags
)
3249 if (masked_rates
& BIT(i
))
3257 basic
= basic_rates
& BIT(i
) ? 0x80 : 0;
3259 rate
= DIV_ROUND_UP(sband
->bitrates
[i
].bitrate
, 5);
3260 skb_put_u8(skb
, basic
| (u8
)rate
);
3264 WARN(rates
> 0, "rates confused: rates:%d, element:%d\n",
3270 int ieee80211_ave_rssi(struct ieee80211_vif
*vif
)
3272 struct ieee80211_sub_if_data
*sdata
= vif_to_sdata(vif
);
3274 if (WARN_ON_ONCE(sdata
->vif
.type
!= NL80211_IFTYPE_STATION
))
3277 return -ewma_beacon_signal_read(&sdata
->deflink
.u
.mgd
.ave_beacon_signal
);
3279 EXPORT_SYMBOL_GPL(ieee80211_ave_rssi
);
3281 u8
ieee80211_mcs_to_chains(const struct ieee80211_mcs_info
*mcs
)
3286 /* TODO: consider rx_highest */
3288 if (mcs
->rx_mask
[3])
3290 if (mcs
->rx_mask
[2])
3292 if (mcs
->rx_mask
[1])
3298 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame
3299 * @local: mac80211 hw info struct
3300 * @status: RX status
3301 * @mpdu_len: total MPDU length (including FCS)
3302 * @mpdu_offset: offset into MPDU to calculate timestamp at
3304 * This function calculates the RX timestamp at the given MPDU offset, taking
3305 * into account what the RX timestamp was. An offset of 0 will just normalize
3306 * the timestamp to TSF at beginning of MPDU reception.
3308 * Returns: the calculated timestamp
3310 u64
ieee80211_calculate_rx_timestamp(struct ieee80211_local
*local
,
3311 struct ieee80211_rx_status
*status
,
3312 unsigned int mpdu_len
,
3313 unsigned int mpdu_offset
)
3315 u64 ts
= status
->mactime
;
3316 bool mactime_plcp_start
;
3317 struct rate_info ri
;
3321 if (WARN_ON(!ieee80211_have_rx_timestamp(status
)))
3324 mactime_plcp_start
= (status
->flag
& RX_FLAG_MACTIME
) ==
3325 RX_FLAG_MACTIME_PLCP_START
;
3327 memset(&ri
, 0, sizeof(ri
));
3331 /* Fill cfg80211 rate info */
3332 switch (status
->encoding
) {
3334 ri
.flags
|= RATE_INFO_FLAGS_EHT_MCS
;
3335 ri
.mcs
= status
->rate_idx
;
3336 ri
.nss
= status
->nss
;
3337 ri
.eht_ru_alloc
= status
->eht
.ru
;
3338 if (status
->enc_flags
& RX_ENC_FLAG_SHORT_GI
)
3339 ri
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
3340 /* TODO/FIXME: is this right? handle other PPDUs */
3341 if (mactime_plcp_start
) {
3347 ri
.flags
|= RATE_INFO_FLAGS_HE_MCS
;
3348 ri
.mcs
= status
->rate_idx
;
3349 ri
.nss
= status
->nss
;
3350 ri
.he_ru_alloc
= status
->he_ru
;
3351 if (status
->enc_flags
& RX_ENC_FLAG_SHORT_GI
)
3352 ri
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
3355 * See P802.11ax_D6.0, section 27.3.4 for
3358 if (mactime_plcp_start
) {
3364 * For HE MU PPDU, add the HE-SIG-B.
3365 * For HE ER PPDU, add 8us for the HE-SIG-A.
3366 * For HE TB PPDU, add 4us for the HE-STF.
3367 * Add the HE-LTF durations - variable.
3373 ri
.mcs
= status
->rate_idx
;
3374 ri
.flags
|= RATE_INFO_FLAGS_MCS
;
3375 if (status
->enc_flags
& RX_ENC_FLAG_SHORT_GI
)
3376 ri
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
3379 * See P802.11REVmd_D3.0, section 19.3.2 for
3382 if (mactime_plcp_start
) {
3384 if (status
->enc_flags
& RX_ENC_FLAG_HT_GF
)
3390 * Add Data HT-LTFs per streams
3391 * TODO: add Extension HT-LTFs, 4us per LTF
3393 n_ltf
= ((ri
.mcs
>> 3) & 3) + 1;
3394 n_ltf
= n_ltf
== 3 ? 4 : n_ltf
;
3400 ri
.flags
|= RATE_INFO_FLAGS_VHT_MCS
;
3401 ri
.mcs
= status
->rate_idx
;
3402 ri
.nss
= status
->nss
;
3403 if (status
->enc_flags
& RX_ENC_FLAG_SHORT_GI
)
3404 ri
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
3407 * See P802.11REVmd_D3.0, section 21.3.2 for
3410 if (mactime_plcp_start
) {
3415 * Add VHT-LTFs per streams
3417 n_ltf
= (ri
.nss
!= 1) && (ri
.nss
% 2) ?
3418 ri
.nss
+ 1 : ri
.nss
;
3426 case RX_ENC_LEGACY
: {
3427 struct ieee80211_supported_band
*sband
;
3429 sband
= local
->hw
.wiphy
->bands
[status
->band
];
3430 ri
.legacy
= sband
->bitrates
[status
->rate_idx
].bitrate
;
3432 if (mactime_plcp_start
) {
3433 if (status
->band
== NL80211_BAND_5GHZ
) {
3436 } else if (status
->enc_flags
& RX_ENC_FLAG_SHORTPRE
) {
3446 rate
= cfg80211_calculate_bitrate(&ri
);
3447 if (WARN_ONCE(!rate
,
3448 "Invalid bitrate: flags=0x%llx, idx=%d, vht_nss=%d\n",
3449 (unsigned long long)status
->flag
, status
->rate_idx
,
3453 /* rewind from end of MPDU */
3454 if ((status
->flag
& RX_FLAG_MACTIME
) == RX_FLAG_MACTIME_END
)
3455 ts
-= mpdu_len
* 8 * 10 / rate
;
3457 ts
+= mpdu_offset
* 8 * 10 / rate
;
3462 /* Cancel CAC for the interfaces under the specified @local. If @ctx is
3463 * also provided, only the interfaces using that ctx will be canceled.
3465 void ieee80211_dfs_cac_cancel(struct ieee80211_local
*local
,
3466 struct ieee80211_chanctx
*ctx
)
3468 struct ieee80211_sub_if_data
*sdata
;
3469 struct cfg80211_chan_def chandef
;
3470 struct ieee80211_link_data
*link
;
3471 struct ieee80211_chanctx_conf
*chanctx_conf
;
3472 unsigned int link_id
;
3474 lockdep_assert_wiphy(local
->hw
.wiphy
);
3476 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
3477 for (link_id
= 0; link_id
< IEEE80211_MLD_MAX_NUM_LINKS
;
3479 link
= sdata_dereference(sdata
->link
[link_id
],
3484 chanctx_conf
= sdata_dereference(link
->conf
->chanctx_conf
,
3486 if (ctx
&& &ctx
->conf
!= chanctx_conf
)
3489 wiphy_delayed_work_cancel(local
->hw
.wiphy
,
3490 &link
->dfs_cac_timer_work
);
3492 if (!sdata
->wdev
.links
[link_id
].cac_started
)
3495 chandef
= link
->conf
->chanreq
.oper
;
3496 ieee80211_link_release_channel(link
);
3497 cfg80211_cac_event(sdata
->dev
, &chandef
,
3498 NL80211_RADAR_CAC_ABORTED
,
3499 GFP_KERNEL
, link_id
);
3504 void ieee80211_dfs_radar_detected_work(struct wiphy
*wiphy
,
3505 struct wiphy_work
*work
)
3507 struct ieee80211_local
*local
=
3508 container_of(work
, struct ieee80211_local
, radar_detected_work
);
3509 struct cfg80211_chan_def chandef
;
3510 struct ieee80211_chanctx
*ctx
;
3512 lockdep_assert_wiphy(local
->hw
.wiphy
);
3514 list_for_each_entry(ctx
, &local
->chanctx_list
, list
) {
3515 if (ctx
->replace_state
== IEEE80211_CHANCTX_REPLACES_OTHER
)
3518 if (!ctx
->radar_detected
)
3521 ctx
->radar_detected
= false;
3523 chandef
= ctx
->conf
.def
;
3525 ieee80211_dfs_cac_cancel(local
, ctx
);
3526 cfg80211_radar_event(local
->hw
.wiphy
, &chandef
, GFP_KERNEL
);
3531 ieee80211_radar_mark_chan_ctx_iterator(struct ieee80211_hw
*hw
,
3532 struct ieee80211_chanctx_conf
*chanctx_conf
,
3535 struct ieee80211_chanctx
*ctx
=
3536 container_of(chanctx_conf
, struct ieee80211_chanctx
,
3539 if (ctx
->replace_state
== IEEE80211_CHANCTX_REPLACES_OTHER
)
3542 if (data
&& data
!= chanctx_conf
)
3545 ctx
->radar_detected
= true;
3548 void ieee80211_radar_detected(struct ieee80211_hw
*hw
,
3549 struct ieee80211_chanctx_conf
*chanctx_conf
)
3551 struct ieee80211_local
*local
= hw_to_local(hw
);
3553 trace_api_radar_detected(local
);
3555 ieee80211_iter_chan_contexts_atomic(hw
, ieee80211_radar_mark_chan_ctx_iterator
,
3558 wiphy_work_queue(hw
->wiphy
, &local
->radar_detected_work
);
3560 EXPORT_SYMBOL(ieee80211_radar_detected
);
3562 void ieee80211_chandef_downgrade(struct cfg80211_chan_def
*c
,
3563 struct ieee80211_conn_settings
*conn
)
3565 enum nl80211_chan_width new_primary_width
;
3566 struct ieee80211_conn_settings _ignored
= {};
3568 /* allow passing NULL if caller doesn't care */
3573 /* no-HT indicates nothing to do */
3574 new_primary_width
= NL80211_CHAN_WIDTH_20_NOHT
;
3578 case NL80211_CHAN_WIDTH_20_NOHT
:
3581 case NL80211_CHAN_WIDTH_20
:
3582 c
->width
= NL80211_CHAN_WIDTH_20_NOHT
;
3583 conn
->mode
= IEEE80211_CONN_MODE_LEGACY
;
3584 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_20
;
3587 case NL80211_CHAN_WIDTH_40
:
3588 c
->width
= NL80211_CHAN_WIDTH_20
;
3589 c
->center_freq1
= c
->chan
->center_freq
;
3590 if (conn
->mode
== IEEE80211_CONN_MODE_VHT
)
3591 conn
->mode
= IEEE80211_CONN_MODE_HT
;
3592 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_20
;
3595 case NL80211_CHAN_WIDTH_80
:
3596 new_primary_width
= NL80211_CHAN_WIDTH_40
;
3597 if (conn
->mode
== IEEE80211_CONN_MODE_VHT
)
3598 conn
->mode
= IEEE80211_CONN_MODE_HT
;
3599 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_40
;
3601 case NL80211_CHAN_WIDTH_80P80
:
3602 c
->center_freq2
= 0;
3603 c
->width
= NL80211_CHAN_WIDTH_80
;
3604 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_80
;
3606 case NL80211_CHAN_WIDTH_160
:
3607 new_primary_width
= NL80211_CHAN_WIDTH_80
;
3608 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_80
;
3610 case NL80211_CHAN_WIDTH_320
:
3611 new_primary_width
= NL80211_CHAN_WIDTH_160
;
3612 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_160
;
3614 case NL80211_CHAN_WIDTH_1
:
3615 case NL80211_CHAN_WIDTH_2
:
3616 case NL80211_CHAN_WIDTH_4
:
3617 case NL80211_CHAN_WIDTH_8
:
3618 case NL80211_CHAN_WIDTH_16
:
3621 conn
->mode
= IEEE80211_CONN_MODE_S1G
;
3622 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_20
;
3624 case NL80211_CHAN_WIDTH_5
:
3625 case NL80211_CHAN_WIDTH_10
:
3628 conn
->mode
= IEEE80211_CONN_MODE_LEGACY
;
3629 conn
->bw_limit
= IEEE80211_CONN_BW_LIMIT_20
;
3633 if (new_primary_width
!= NL80211_CHAN_WIDTH_20_NOHT
) {
3634 c
->center_freq1
= cfg80211_chandef_primary(c
, new_primary_width
,
3636 c
->width
= new_primary_width
;
3640 * With an 80 MHz channel, we might have the puncturing in the primary
3641 * 40 Mhz channel, but that's not valid when downgraded to 40 MHz width.
3642 * In that case, downgrade again.
3644 if (!cfg80211_chandef_valid(c
) && c
->punctured
)
3647 WARN_ON_ONCE(!cfg80211_chandef_valid(c
));
3651 * Returns true if smps_mode_new is strictly more restrictive than
3654 bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old
,
3655 enum ieee80211_smps_mode smps_mode_new
)
3657 if (WARN_ON_ONCE(smps_mode_old
== IEEE80211_SMPS_AUTOMATIC
||
3658 smps_mode_new
== IEEE80211_SMPS_AUTOMATIC
))
3661 switch (smps_mode_old
) {
3662 case IEEE80211_SMPS_STATIC
:
3664 case IEEE80211_SMPS_DYNAMIC
:
3665 return smps_mode_new
== IEEE80211_SMPS_STATIC
;
3666 case IEEE80211_SMPS_OFF
:
3667 return smps_mode_new
!= IEEE80211_SMPS_OFF
;
3675 int ieee80211_send_action_csa(struct ieee80211_sub_if_data
*sdata
,
3676 struct cfg80211_csa_settings
*csa_settings
)
3678 struct sk_buff
*skb
;
3679 struct ieee80211_mgmt
*mgmt
;
3680 struct ieee80211_local
*local
= sdata
->local
;
3682 int hdr_len
= offsetofend(struct ieee80211_mgmt
,
3683 u
.action
.u
.chan_switch
);
3686 if (sdata
->vif
.type
!= NL80211_IFTYPE_ADHOC
&&
3687 sdata
->vif
.type
!= NL80211_IFTYPE_MESH_POINT
)
3690 skb
= dev_alloc_skb(local
->tx_headroom
+ hdr_len
+
3691 5 + /* channel switch announcement element */
3692 3 + /* secondary channel offset element */
3693 5 + /* wide bandwidth channel switch announcement */
3694 8); /* mesh channel switch parameters element */
3698 skb_reserve(skb
, local
->tx_headroom
);
3699 mgmt
= skb_put_zero(skb
, hdr_len
);
3700 mgmt
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
3701 IEEE80211_STYPE_ACTION
);
3703 eth_broadcast_addr(mgmt
->da
);
3704 memcpy(mgmt
->sa
, sdata
->vif
.addr
, ETH_ALEN
);
3705 if (ieee80211_vif_is_mesh(&sdata
->vif
)) {
3706 memcpy(mgmt
->bssid
, sdata
->vif
.addr
, ETH_ALEN
);
3708 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
3709 memcpy(mgmt
->bssid
, ifibss
->bssid
, ETH_ALEN
);
3711 mgmt
->u
.action
.category
= WLAN_CATEGORY_SPECTRUM_MGMT
;
3712 mgmt
->u
.action
.u
.chan_switch
.action_code
= WLAN_ACTION_SPCT_CHL_SWITCH
;
3713 pos
= skb_put(skb
, 5);
3714 *pos
++ = WLAN_EID_CHANNEL_SWITCH
; /* EID */
3715 *pos
++ = 3; /* IE length */
3716 *pos
++ = csa_settings
->block_tx
? 1 : 0; /* CSA mode */
3717 freq
= csa_settings
->chandef
.chan
->center_freq
;
3718 *pos
++ = ieee80211_frequency_to_channel(freq
); /* channel */
3719 *pos
++ = csa_settings
->count
; /* count */
3721 if (csa_settings
->chandef
.width
== NL80211_CHAN_WIDTH_40
) {
3722 enum nl80211_channel_type ch_type
;
3725 *pos
++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET
; /* EID */
3726 *pos
++ = 1; /* IE length */
3727 ch_type
= cfg80211_get_chandef_type(&csa_settings
->chandef
);
3728 if (ch_type
== NL80211_CHAN_HT40PLUS
)
3729 *pos
++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE
;
3731 *pos
++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW
;
3734 if (ieee80211_vif_is_mesh(&sdata
->vif
)) {
3735 struct ieee80211_if_mesh
*ifmsh
= &sdata
->u
.mesh
;
3738 *pos
++ = WLAN_EID_CHAN_SWITCH_PARAM
; /* EID */
3739 *pos
++ = 6; /* IE length */
3740 *pos
++ = sdata
->u
.mesh
.mshcfg
.dot11MeshTTL
; /* Mesh TTL */
3741 *pos
= 0x00; /* Mesh Flag: Tx Restrict, Initiator, Reason */
3742 *pos
|= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR
;
3743 *pos
++ |= csa_settings
->block_tx
?
3744 WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT
: 0x00;
3745 put_unaligned_le16(WLAN_REASON_MESH_CHAN
, pos
); /* Reason Cd */
3747 put_unaligned_le16(ifmsh
->pre_value
, pos
);/* Precedence Value */
3751 if (csa_settings
->chandef
.width
== NL80211_CHAN_WIDTH_80
||
3752 csa_settings
->chandef
.width
== NL80211_CHAN_WIDTH_80P80
||
3753 csa_settings
->chandef
.width
== NL80211_CHAN_WIDTH_160
) {
3755 ieee80211_ie_build_wide_bw_cs(pos
, &csa_settings
->chandef
);
3758 ieee80211_tx_skb(sdata
, skb
);
3763 ieee80211_extend_noa_desc(struct ieee80211_noa_data
*data
, u32 tsf
, int i
)
3765 s32 end
= data
->desc
[i
].start
+ data
->desc
[i
].duration
- (tsf
+ 1);
3772 if (data
->count
[i
] == 1)
3775 if (data
->desc
[i
].interval
== 0)
3778 /* End time is in the past, check for repetitions */
3779 skip
= DIV_ROUND_UP(-end
, data
->desc
[i
].interval
);
3780 if (data
->count
[i
] < 255) {
3781 if (data
->count
[i
] <= skip
) {
3786 data
->count
[i
] -= skip
;
3789 data
->desc
[i
].start
+= skip
* data
->desc
[i
].interval
;
3795 ieee80211_extend_absent_time(struct ieee80211_noa_data
*data
, u32 tsf
,
3801 for (i
= 0; i
< IEEE80211_P2P_NOA_DESC_MAX
; i
++) {
3804 if (!data
->count
[i
])
3807 if (ieee80211_extend_noa_desc(data
, tsf
+ *offset
, i
))
3810 cur
= data
->desc
[i
].start
- tsf
;
3814 cur
= data
->desc
[i
].start
+ data
->desc
[i
].duration
- tsf
;
3823 ieee80211_get_noa_absent_time(struct ieee80211_noa_data
*data
, u32 tsf
)
3828 * arbitrary limit, used to avoid infinite loops when combined NoA
3829 * descriptors cover the full time period.
3833 ieee80211_extend_absent_time(data
, tsf
, &offset
);
3835 if (!ieee80211_extend_absent_time(data
, tsf
, &offset
))
3839 } while (tries
< max_tries
);
3844 void ieee80211_update_p2p_noa(struct ieee80211_noa_data
*data
, u32 tsf
)
3846 u32 next_offset
= BIT(31) - 1;
3850 data
->has_next_tsf
= false;
3851 for (i
= 0; i
< IEEE80211_P2P_NOA_DESC_MAX
; i
++) {
3854 if (!data
->count
[i
])
3857 ieee80211_extend_noa_desc(data
, tsf
, i
);
3858 start
= data
->desc
[i
].start
- tsf
;
3860 data
->absent
|= BIT(i
);
3862 if (next_offset
> start
)
3863 next_offset
= start
;
3865 data
->has_next_tsf
= true;
3869 next_offset
= ieee80211_get_noa_absent_time(data
, tsf
);
3871 data
->next_tsf
= tsf
+ next_offset
;
3873 EXPORT_SYMBOL(ieee80211_update_p2p_noa
);
3875 int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr
*attr
,
3876 struct ieee80211_noa_data
*data
, u32 tsf
)
3881 memset(data
, 0, sizeof(*data
));
3883 for (i
= 0; i
< IEEE80211_P2P_NOA_DESC_MAX
; i
++) {
3884 const struct ieee80211_p2p_noa_desc
*desc
= &attr
->desc
[i
];
3886 if (!desc
->count
|| !desc
->duration
)
3889 data
->count
[i
] = desc
->count
;
3890 data
->desc
[i
].start
= le32_to_cpu(desc
->start_time
);
3891 data
->desc
[i
].duration
= le32_to_cpu(desc
->duration
);
3892 data
->desc
[i
].interval
= le32_to_cpu(desc
->interval
);
3894 if (data
->count
[i
] > 1 &&
3895 data
->desc
[i
].interval
< data
->desc
[i
].duration
)
3898 ieee80211_extend_noa_desc(data
, tsf
, i
);
3903 ieee80211_update_p2p_noa(data
, tsf
);
3907 EXPORT_SYMBOL(ieee80211_parse_p2p_noa
);
3909 void ieee80211_recalc_dtim(struct ieee80211_local
*local
,
3910 struct ieee80211_sub_if_data
*sdata
)
3912 u64 tsf
= drv_get_tsf(local
, sdata
);
3914 u16 beacon_int
= sdata
->vif
.bss_conf
.beacon_int
* 1024;
3915 u8 dtim_period
= sdata
->vif
.bss_conf
.dtim_period
;
3919 if (tsf
== -1ULL || !beacon_int
|| !dtim_period
)
3922 if (sdata
->vif
.type
== NL80211_IFTYPE_AP
||
3923 sdata
->vif
.type
== NL80211_IFTYPE_AP_VLAN
) {
3927 ps
= &sdata
->bss
->ps
;
3928 } else if (ieee80211_vif_is_mesh(&sdata
->vif
)) {
3929 ps
= &sdata
->u
.mesh
.ps
;
3935 * actually finds last dtim_count, mac80211 will update in
3936 * __beacon_add_tim().
3937 * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period
3939 do_div(tsf
, beacon_int
);
3940 bcns_from_dtim
= do_div(tsf
, dtim_period
);
3941 /* just had a DTIM */
3942 if (!bcns_from_dtim
)
3945 dtim_count
= dtim_period
- bcns_from_dtim
;
3947 ps
->dtim_count
= dtim_count
;
3950 static u8
ieee80211_chanctx_radar_detect(struct ieee80211_local
*local
,
3951 struct ieee80211_chanctx
*ctx
)
3953 struct ieee80211_link_data
*link
;
3954 u8 radar_detect
= 0;
3956 lockdep_assert_wiphy(local
->hw
.wiphy
);
3958 if (WARN_ON(ctx
->replace_state
== IEEE80211_CHANCTX_WILL_BE_REPLACED
))
3961 list_for_each_entry(link
, &ctx
->reserved_links
, reserved_chanctx_list
)
3962 if (link
->reserved_radar_required
)
3963 radar_detect
|= BIT(link
->reserved
.oper
.width
);
3966 * An in-place reservation context should not have any assigned vifs
3967 * until it replaces the other context.
3969 WARN_ON(ctx
->replace_state
== IEEE80211_CHANCTX_REPLACES_OTHER
&&
3970 !list_empty(&ctx
->assigned_links
));
3972 list_for_each_entry(link
, &ctx
->assigned_links
, assigned_chanctx_list
) {
3973 if (!link
->radar_required
)
3977 BIT(link
->conf
->chanreq
.oper
.width
);
3980 return radar_detect
;
3984 __ieee80211_get_radio_mask(struct ieee80211_sub_if_data
*sdata
)
3986 struct ieee80211_bss_conf
*link_conf
;
3987 struct ieee80211_chanctx_conf
*conf
;
3988 unsigned int link_id
;
3991 for_each_vif_active_link(&sdata
->vif
, link_conf
, link_id
) {
3992 conf
= sdata_dereference(link_conf
->chanctx_conf
, sdata
);
3993 if (!conf
|| conf
->radio_idx
< 0)
3996 mask
|= BIT(conf
->radio_idx
);
4002 u32
ieee80211_get_radio_mask(struct wiphy
*wiphy
, struct net_device
*dev
)
4004 struct ieee80211_sub_if_data
*sdata
= IEEE80211_DEV_TO_SUB_IF(dev
);
4006 return __ieee80211_get_radio_mask(sdata
);
4010 ieee80211_sdata_uses_radio(struct ieee80211_sub_if_data
*sdata
, int radio_idx
)
4015 return __ieee80211_get_radio_mask(sdata
) & BIT(radio_idx
);
4019 ieee80211_fill_ifcomb_params(struct ieee80211_local
*local
,
4020 struct iface_combination_params
*params
,
4021 const struct cfg80211_chan_def
*chandef
,
4022 struct ieee80211_sub_if_data
*sdata
)
4024 struct ieee80211_sub_if_data
*sdata_iter
;
4025 struct ieee80211_chanctx
*ctx
;
4026 int total
= !!sdata
;
4028 list_for_each_entry(ctx
, &local
->chanctx_list
, list
) {
4029 if (ctx
->replace_state
== IEEE80211_CHANCTX_WILL_BE_REPLACED
)
4032 if (params
->radio_idx
>= 0 &&
4033 ctx
->conf
.radio_idx
!= params
->radio_idx
)
4036 params
->radar_detect
|=
4037 ieee80211_chanctx_radar_detect(local
, ctx
);
4039 if (chandef
&& ctx
->mode
!= IEEE80211_CHANCTX_EXCLUSIVE
&&
4040 cfg80211_chandef_compatible(chandef
, &ctx
->conf
.def
))
4043 params
->num_different_channels
++;
4046 list_for_each_entry(sdata_iter
, &local
->interfaces
, list
) {
4047 struct wireless_dev
*wdev_iter
;
4049 wdev_iter
= &sdata_iter
->wdev
;
4051 if (sdata_iter
== sdata
||
4052 !ieee80211_sdata_running(sdata_iter
) ||
4053 cfg80211_iftype_allowed(local
->hw
.wiphy
,
4054 wdev_iter
->iftype
, 0, 1))
4057 if (!ieee80211_sdata_uses_radio(sdata_iter
, params
->radio_idx
))
4060 params
->iftype_num
[wdev_iter
->iftype
]++;
4067 int ieee80211_check_combinations(struct ieee80211_sub_if_data
*sdata
,
4068 const struct cfg80211_chan_def
*chandef
,
4069 enum ieee80211_chanctx_mode chanmode
,
4070 u8 radar_detect
, int radio_idx
)
4072 bool shared
= chanmode
== IEEE80211_CHANCTX_SHARED
;
4073 struct ieee80211_local
*local
= sdata
->local
;
4074 enum nl80211_iftype iftype
= sdata
->wdev
.iftype
;
4075 struct iface_combination_params params
= {
4076 .radar_detect
= radar_detect
,
4077 .radio_idx
= radio_idx
,
4081 lockdep_assert_wiphy(local
->hw
.wiphy
);
4083 if (WARN_ON(hweight32(radar_detect
) > 1))
4086 if (WARN_ON(chandef
&& chanmode
== IEEE80211_CHANCTX_SHARED
&&
4090 if (WARN_ON(iftype
>= NUM_NL80211_IFTYPES
))
4093 if (sdata
->vif
.type
== NL80211_IFTYPE_AP
||
4094 sdata
->vif
.type
== NL80211_IFTYPE_MESH_POINT
) {
4096 * always passing this is harmless, since it'll be the
4097 * same value that cfg80211 finds if it finds the same
4098 * interface ... and that's always allowed
4100 params
.new_beacon_int
= sdata
->vif
.bss_conf
.beacon_int
;
4103 /* Always allow software iftypes */
4104 if (cfg80211_iftype_allowed(local
->hw
.wiphy
, iftype
, 0, 1)) {
4111 params
.num_different_channels
= 1;
4113 if (iftype
!= NL80211_IFTYPE_UNSPECIFIED
)
4114 params
.iftype_num
[iftype
] = 1;
4116 total
= ieee80211_fill_ifcomb_params(local
, ¶ms
,
4117 shared
? chandef
: NULL
,
4119 if (total
== 1 && !params
.radar_detect
)
4122 return cfg80211_check_combinations(local
->hw
.wiphy
, ¶ms
);
4126 ieee80211_iter_max_chans(const struct ieee80211_iface_combination
*c
,
4129 u32
*max_num_different_channels
= data
;
4131 *max_num_different_channels
= max(*max_num_different_channels
,
4132 c
->num_different_channels
);
4135 int ieee80211_max_num_channels(struct ieee80211_local
*local
, int radio_idx
)
4137 u32 max_num_different_channels
= 1;
4139 struct iface_combination_params params
= {
4140 .radio_idx
= radio_idx
,
4143 lockdep_assert_wiphy(local
->hw
.wiphy
);
4145 ieee80211_fill_ifcomb_params(local
, ¶ms
, NULL
, NULL
);
4147 err
= cfg80211_iter_combinations(local
->hw
.wiphy
, ¶ms
,
4148 ieee80211_iter_max_chans
,
4149 &max_num_different_channels
);
4153 return max_num_different_channels
;
4156 void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data
*sdata
,
4157 struct ieee80211_sta_s1g_cap
*caps
,
4158 struct sk_buff
*skb
)
4160 struct ieee80211_if_managed
*ifmgd
= &sdata
->u
.mgd
;
4161 struct ieee80211_s1g_cap s1g_capab
;
4165 if (WARN_ON(sdata
->vif
.type
!= NL80211_IFTYPE_STATION
))
4171 memcpy(s1g_capab
.capab_info
, caps
->cap
, sizeof(caps
->cap
));
4172 memcpy(s1g_capab
.supp_mcs_nss
, caps
->nss_mcs
, sizeof(caps
->nss_mcs
));
4174 /* override the capability info */
4175 for (i
= 0; i
< sizeof(ifmgd
->s1g_capa
.capab_info
); i
++) {
4176 u8 mask
= ifmgd
->s1g_capa_mask
.capab_info
[i
];
4178 s1g_capab
.capab_info
[i
] &= ~mask
;
4179 s1g_capab
.capab_info
[i
] |= ifmgd
->s1g_capa
.capab_info
[i
] & mask
;
4182 /* then MCS and NSS set */
4183 for (i
= 0; i
< sizeof(ifmgd
->s1g_capa
.supp_mcs_nss
); i
++) {
4184 u8 mask
= ifmgd
->s1g_capa_mask
.supp_mcs_nss
[i
];
4186 s1g_capab
.supp_mcs_nss
[i
] &= ~mask
;
4187 s1g_capab
.supp_mcs_nss
[i
] |=
4188 ifmgd
->s1g_capa
.supp_mcs_nss
[i
] & mask
;
4191 pos
= skb_put(skb
, 2 + sizeof(s1g_capab
));
4192 *pos
++ = WLAN_EID_S1G_CAPABILITIES
;
4193 *pos
++ = sizeof(s1g_capab
);
4195 memcpy(pos
, &s1g_capab
, sizeof(s1g_capab
));
4198 void ieee80211_add_aid_request_ie(struct ieee80211_sub_if_data
*sdata
,
4199 struct sk_buff
*skb
)
4201 u8
*pos
= skb_put(skb
, 3);
4203 *pos
++ = WLAN_EID_AID_REQUEST
;
4208 u8
*ieee80211_add_wmm_info_ie(u8
*buf
, u8 qosinfo
)
4210 *buf
++ = WLAN_EID_VENDOR_SPECIFIC
;
4211 *buf
++ = 7; /* len */
4212 *buf
++ = 0x00; /* Microsoft OUI 00:50:F2 */
4215 *buf
++ = 2; /* WME */
4216 *buf
++ = 0; /* WME info */
4217 *buf
++ = 1; /* WME ver */
4218 *buf
++ = qosinfo
; /* U-APSD no in use */
4223 void ieee80211_txq_get_depth(struct ieee80211_txq
*txq
,
4224 unsigned long *frame_cnt
,
4225 unsigned long *byte_cnt
)
4227 struct txq_info
*txqi
= to_txq_info(txq
);
4228 u32 frag_cnt
= 0, frag_bytes
= 0;
4229 struct sk_buff
*skb
;
4231 skb_queue_walk(&txqi
->frags
, skb
) {
4233 frag_bytes
+= skb
->len
;
4237 *frame_cnt
= txqi
->tin
.backlog_packets
+ frag_cnt
;
4240 *byte_cnt
= txqi
->tin
.backlog_bytes
+ frag_bytes
;
4242 EXPORT_SYMBOL(ieee80211_txq_get_depth
);
4244 const u8 ieee80211_ac_to_qos_mask
[IEEE80211_NUM_ACS
] = {
4245 IEEE80211_WMM_IE_STA_QOSINFO_AC_VO
,
4246 IEEE80211_WMM_IE_STA_QOSINFO_AC_VI
,
4247 IEEE80211_WMM_IE_STA_QOSINFO_AC_BE
,
4248 IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
4251 u16
ieee80211_encode_usf(int listen_interval
)
4253 static const int listen_int_usf
[] = { 1, 10, 1000, 10000 };
4256 /* find greatest USF */
4257 while (usf
< IEEE80211_MAX_USF
) {
4258 if (listen_interval
% listen_int_usf
[usf
+ 1])
4262 ui
= listen_interval
/ listen_int_usf
[usf
];
4264 /* error if there is a remainder. Should've been checked by user */
4265 WARN_ON_ONCE(ui
> IEEE80211_MAX_UI
);
4266 listen_interval
= FIELD_PREP(LISTEN_INT_USF
, usf
) |
4267 FIELD_PREP(LISTEN_INT_UI
, ui
);
4269 return (u16
) listen_interval
;
4272 /* this may return more than ieee80211_put_eht_cap() will need */
4273 u8
ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data
*sdata
)
4275 const struct ieee80211_sta_he_cap
*he_cap
;
4276 const struct ieee80211_sta_eht_cap
*eht_cap
;
4277 struct ieee80211_supported_band
*sband
;
4281 sband
= ieee80211_get_sband(sdata
);
4285 he_cap
= ieee80211_get_he_iftype_cap_vif(sband
, &sdata
->vif
);
4286 eht_cap
= ieee80211_get_eht_iftype_cap_vif(sband
, &sdata
->vif
);
4287 if (!he_cap
|| !eht_cap
)
4290 is_ap
= sdata
->vif
.type
== NL80211_IFTYPE_AP
;
4292 n
= ieee80211_eht_mcs_nss_size(&he_cap
->he_cap_elem
,
4293 &eht_cap
->eht_cap_elem
,
4296 sizeof(eht_cap
->eht_cap_elem
) + n
+
4297 ieee80211_eht_ppe_size(eht_cap
->eht_ppe_thres
[0],
4298 eht_cap
->eht_cap_elem
.phy_cap_info
);
4302 int ieee80211_put_eht_cap(struct sk_buff
*skb
,
4303 struct ieee80211_sub_if_data
*sdata
,
4304 const struct ieee80211_supported_band
*sband
,
4305 const struct ieee80211_conn_settings
*conn
)
4307 const struct ieee80211_sta_he_cap
*he_cap
=
4308 ieee80211_get_he_iftype_cap_vif(sband
, &sdata
->vif
);
4309 const struct ieee80211_sta_eht_cap
*eht_cap
=
4310 ieee80211_get_eht_iftype_cap_vif(sband
, &sdata
->vif
);
4311 bool for_ap
= sdata
->vif
.type
== NL80211_IFTYPE_AP
;
4312 struct ieee80211_eht_cap_elem_fixed fixed
;
4313 struct ieee80211_he_cap_elem he
;
4314 u8 mcs_nss_len
, ppet_len
;
4315 u8 orig_mcs_nss_len
;
4319 conn
= &ieee80211_conn_settings_unlimited
;
4321 /* Make sure we have place for the IE */
4322 if (!he_cap
|| !eht_cap
)
4325 orig_mcs_nss_len
= ieee80211_eht_mcs_nss_size(&he_cap
->he_cap_elem
,
4326 &eht_cap
->eht_cap_elem
,
4329 ieee80211_get_adjusted_he_cap(conn
, he_cap
, &he
);
4331 fixed
= eht_cap
->eht_cap_elem
;
4333 if (conn
->bw_limit
< IEEE80211_CONN_BW_LIMIT_80
)
4334 fixed
.phy_cap_info
[6] &=
4335 ~IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_80MHZ
;
4337 if (conn
->bw_limit
< IEEE80211_CONN_BW_LIMIT_160
) {
4338 fixed
.phy_cap_info
[1] &=
4339 ~IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK
;
4340 fixed
.phy_cap_info
[2] &=
4341 ~IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK
;
4342 fixed
.phy_cap_info
[6] &=
4343 ~IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_160MHZ
;
4346 if (conn
->bw_limit
< IEEE80211_CONN_BW_LIMIT_320
) {
4347 fixed
.phy_cap_info
[0] &=
4348 ~IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ
;
4349 fixed
.phy_cap_info
[1] &=
4350 ~IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK
;
4351 fixed
.phy_cap_info
[2] &=
4352 ~IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK
;
4353 fixed
.phy_cap_info
[6] &=
4354 ~IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_320MHZ
;
4357 if (conn
->bw_limit
== IEEE80211_CONN_BW_LIMIT_20
)
4358 fixed
.phy_cap_info
[0] &=
4359 ~IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ
;
4361 mcs_nss_len
= ieee80211_eht_mcs_nss_size(&he
, &fixed
, for_ap
);
4362 ppet_len
= ieee80211_eht_ppe_size(eht_cap
->eht_ppe_thres
[0],
4363 fixed
.phy_cap_info
);
4365 ie_len
= 2 + 1 + sizeof(eht_cap
->eht_cap_elem
) + mcs_nss_len
+ ppet_len
;
4366 if (skb_tailroom(skb
) < ie_len
)
4369 skb_put_u8(skb
, WLAN_EID_EXTENSION
);
4370 skb_put_u8(skb
, ie_len
- 2);
4371 skb_put_u8(skb
, WLAN_EID_EXT_EHT_CAPABILITY
);
4372 skb_put_data(skb
, &fixed
, sizeof(fixed
));
4374 if (mcs_nss_len
== 4 && orig_mcs_nss_len
!= 4) {
4376 * If the (non-AP) STA became 20 MHz only, then convert from
4377 * <=80 to 20-MHz-only format, where MCSes are indicated in
4378 * the groups 0-7, 8-9, 10-11, 12-13 rather than just 0-9,
4379 * 10-11, 12-13. Thus, use 0-9 for 0-7 and 8-9.
4381 skb_put_u8(skb
, eht_cap
->eht_mcs_nss_supp
.bw
._80
.rx_tx_mcs9_max_nss
);
4382 skb_put_u8(skb
, eht_cap
->eht_mcs_nss_supp
.bw
._80
.rx_tx_mcs9_max_nss
);
4383 skb_put_u8(skb
, eht_cap
->eht_mcs_nss_supp
.bw
._80
.rx_tx_mcs11_max_nss
);
4384 skb_put_u8(skb
, eht_cap
->eht_mcs_nss_supp
.bw
._80
.rx_tx_mcs13_max_nss
);
4386 skb_put_data(skb
, &eht_cap
->eht_mcs_nss_supp
, mcs_nss_len
);
4390 skb_put_data(skb
, &eht_cap
->eht_ppe_thres
, ppet_len
);
4395 const char *ieee80211_conn_mode_str(enum ieee80211_conn_mode mode
)
4397 static const char * const modes
[] = {
4398 [IEEE80211_CONN_MODE_S1G
] = "S1G",
4399 [IEEE80211_CONN_MODE_LEGACY
] = "legacy",
4400 [IEEE80211_CONN_MODE_HT
] = "HT",
4401 [IEEE80211_CONN_MODE_VHT
] = "VHT",
4402 [IEEE80211_CONN_MODE_HE
] = "HE",
4403 [IEEE80211_CONN_MODE_EHT
] = "EHT",
4406 if (WARN_ON(mode
>= ARRAY_SIZE(modes
)))
4407 return "<out of range>";
4409 return modes
[mode
] ?: "<missing string>";
4412 enum ieee80211_conn_bw_limit
4413 ieee80211_min_bw_limit_from_chandef(struct cfg80211_chan_def
*chandef
)
4415 switch (chandef
->width
) {
4416 case NL80211_CHAN_WIDTH_20_NOHT
:
4417 case NL80211_CHAN_WIDTH_20
:
4418 return IEEE80211_CONN_BW_LIMIT_20
;
4419 case NL80211_CHAN_WIDTH_40
:
4420 return IEEE80211_CONN_BW_LIMIT_40
;
4421 case NL80211_CHAN_WIDTH_80
:
4422 return IEEE80211_CONN_BW_LIMIT_80
;
4423 case NL80211_CHAN_WIDTH_80P80
:
4424 case NL80211_CHAN_WIDTH_160
:
4425 return IEEE80211_CONN_BW_LIMIT_160
;
4426 case NL80211_CHAN_WIDTH_320
:
4427 return IEEE80211_CONN_BW_LIMIT_320
;
4429 WARN(1, "unhandled chandef width %d\n", chandef
->width
);
4430 return IEEE80211_CONN_BW_LIMIT_20
;
4434 void ieee80211_clear_tpe(struct ieee80211_parsed_tpe
*tpe
)
4436 for (int i
= 0; i
< 2; i
++) {
4437 tpe
->max_local
[i
].valid
= false;
4438 memset(tpe
->max_local
[i
].power
,
4439 IEEE80211_TPE_MAX_TX_PWR_NO_CONSTRAINT
,
4440 sizeof(tpe
->max_local
[i
].power
));
4442 tpe
->max_reg_client
[i
].valid
= false;
4443 memset(tpe
->max_reg_client
[i
].power
,
4444 IEEE80211_TPE_MAX_TX_PWR_NO_CONSTRAINT
,
4445 sizeof(tpe
->max_reg_client
[i
].power
));
4447 tpe
->psd_local
[i
].valid
= false;
4448 memset(tpe
->psd_local
[i
].power
,
4449 IEEE80211_TPE_PSD_NO_LIMIT
,
4450 sizeof(tpe
->psd_local
[i
].power
));
4452 tpe
->psd_reg_client
[i
].valid
= false;
4453 memset(tpe
->psd_reg_client
[i
].power
,
4454 IEEE80211_TPE_PSD_NO_LIMIT
,
4455 sizeof(tpe
->psd_reg_client
[i
].power
));