1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright 2002-2005, Instant802 Networks, Inc.
4 * Copyright 2005-2006, Devicescape Software, Inc.
7 * Copyright 2013-2014 Intel Mobile Communications GmbH
8 * Copyright (C) 2015-2017 Intel Deutschland GmbH
9 * Copyright (C) 2018-2023 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 u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
50 enum nl80211_iftype type)
52 __le16 fc = hdr->frame_control;
54 if (ieee80211_is_data(fc)) {
55 if (len < 24) /* drop incorrect hdr len (data) */
58 if (ieee80211_has_a4(fc))
60 if (ieee80211_has_tods(fc))
62 if (ieee80211_has_fromds(fc))
68 if (ieee80211_is_s1g_beacon(fc)) {
69 struct ieee80211_ext *ext = (void *) hdr;
71 return ext->u.s1g_beacon.sa;
74 if (ieee80211_is_mgmt(fc)) {
75 if (len < 24) /* drop incorrect hdr len (mgmt) */
80 if (ieee80211_is_ctl(fc)) {
81 if (ieee80211_is_pspoll(fc))
84 if (ieee80211_is_back_req(fc)) {
86 case NL80211_IFTYPE_STATION:
88 case NL80211_IFTYPE_AP:
89 case NL80211_IFTYPE_AP_VLAN:
92 break; /* fall through to the return */
99 EXPORT_SYMBOL(ieee80211_get_bssid);
101 void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
104 struct ieee80211_hdr *hdr;
106 skb_queue_walk(&tx->skbs, skb) {
107 hdr = (struct ieee80211_hdr *) skb->data;
108 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
112 int ieee80211_frame_duration(enum nl80211_band band, size_t len,
113 int rate, int erp, int short_preamble)
117 /* calculate duration (in microseconds, rounded up to next higher
118 * integer if it includes a fractional microsecond) to send frame of
119 * len bytes (does not include FCS) at the given rate. Duration will
122 * rate is in 100 kbps, so divident is multiplied by 10 in the
123 * DIV_ROUND_UP() operations.
126 if (band == NL80211_BAND_5GHZ || erp) {
130 * N_DBPS = DATARATE x 4
131 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS)
132 * (16 = SIGNAL time, 6 = tail bits)
133 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext
136 * 802.11a - 18.5.2: aSIFSTime = 16 usec
137 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
138 * signal ext = 6 usec
140 dur = 16; /* SIFS + signal ext */
141 dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
142 dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
144 /* rates should already consider the channel bandwidth,
145 * don't apply divisor again.
147 dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10,
148 4 * rate); /* T_SYM x N_SYM */
151 * 802.11b or 802.11g with 802.11b compatibility:
152 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime +
153 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0.
155 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4
156 * aSIFSTime = 10 usec
157 * aPreambleLength = 144 usec or 72 usec with short preamble
158 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble
160 dur = 10; /* aSIFSTime = 10 usec */
161 dur += short_preamble ? (72 + 24) : (144 + 48);
163 dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate);
169 /* Exported duration function for driver use */
170 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
171 struct ieee80211_vif *vif,
172 enum nl80211_band band,
174 struct ieee80211_rate *rate)
176 struct ieee80211_sub_if_data *sdata;
179 bool short_preamble = false;
183 sdata = vif_to_sdata(vif);
184 short_preamble = sdata->vif.bss_conf.use_short_preamble;
185 if (sdata->deflink.operating_11g_mode)
186 erp = rate->flags & IEEE80211_RATE_ERP_G;
189 dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
192 return cpu_to_le16(dur);
194 EXPORT_SYMBOL(ieee80211_generic_frame_duration);
196 __le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
197 struct ieee80211_vif *vif, size_t frame_len,
198 const struct ieee80211_tx_info *frame_txctl)
200 struct ieee80211_local *local = hw_to_local(hw);
201 struct ieee80211_rate *rate;
202 struct ieee80211_sub_if_data *sdata;
206 struct ieee80211_supported_band *sband;
208 sband = local->hw.wiphy->bands[frame_txctl->band];
210 short_preamble = false;
212 rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
216 sdata = vif_to_sdata(vif);
217 short_preamble = sdata->vif.bss_conf.use_short_preamble;
218 if (sdata->deflink.operating_11g_mode)
219 erp = rate->flags & IEEE80211_RATE_ERP_G;
222 bitrate = rate->bitrate;
225 dur = ieee80211_frame_duration(sband->band, 10, bitrate,
226 erp, short_preamble);
227 /* Data frame duration */
228 dur += ieee80211_frame_duration(sband->band, frame_len, bitrate,
229 erp, short_preamble);
231 dur += ieee80211_frame_duration(sband->band, 10, bitrate,
232 erp, short_preamble);
234 return cpu_to_le16(dur);
236 EXPORT_SYMBOL(ieee80211_rts_duration);
238 __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
239 struct ieee80211_vif *vif,
241 const struct ieee80211_tx_info *frame_txctl)
243 struct ieee80211_local *local = hw_to_local(hw);
244 struct ieee80211_rate *rate;
245 struct ieee80211_sub_if_data *sdata;
249 struct ieee80211_supported_band *sband;
251 sband = local->hw.wiphy->bands[frame_txctl->band];
253 short_preamble = false;
255 rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
258 sdata = vif_to_sdata(vif);
259 short_preamble = sdata->vif.bss_conf.use_short_preamble;
260 if (sdata->deflink.operating_11g_mode)
261 erp = rate->flags & IEEE80211_RATE_ERP_G;
264 bitrate = rate->bitrate;
266 /* Data frame duration */
267 dur = ieee80211_frame_duration(sband->band, frame_len, bitrate,
268 erp, short_preamble);
269 if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
271 dur += ieee80211_frame_duration(sband->band, 10, bitrate,
272 erp, short_preamble);
275 return cpu_to_le16(dur);
277 EXPORT_SYMBOL(ieee80211_ctstoself_duration);
279 static void wake_tx_push_queue(struct ieee80211_local *local,
280 struct ieee80211_sub_if_data *sdata,
281 struct ieee80211_txq *queue)
283 struct ieee80211_tx_control control = {
289 skb = ieee80211_tx_dequeue(&local->hw, queue);
293 drv_tx(local, &control, skb);
297 /* wake_tx_queue handler for driver not implementing a custom one*/
298 void ieee80211_handle_wake_tx_queue(struct ieee80211_hw *hw,
299 struct ieee80211_txq *txq)
301 struct ieee80211_local *local = hw_to_local(hw);
302 struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif);
303 struct ieee80211_txq *queue;
305 spin_lock(&local->handle_wake_tx_queue_lock);
307 /* Use ieee80211_next_txq() for airtime fairness accounting */
308 ieee80211_txq_schedule_start(hw, txq->ac);
309 while ((queue = ieee80211_next_txq(hw, txq->ac))) {
310 wake_tx_push_queue(local, sdata, queue);
311 ieee80211_return_txq(hw, queue, false);
313 ieee80211_txq_schedule_end(hw, txq->ac);
314 spin_unlock(&local->handle_wake_tx_queue_lock);
316 EXPORT_SYMBOL(ieee80211_handle_wake_tx_queue);
318 static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac)
320 struct ieee80211_local *local = sdata->local;
321 struct ieee80211_vif *vif = &sdata->vif;
322 struct fq *fq = &local->fq;
323 struct ps_data *ps = NULL;
324 struct txq_info *txqi;
325 struct sta_info *sta;
329 spin_lock(&fq->lock);
331 if (!test_bit(SDATA_STATE_RUNNING, &sdata->state))
334 if (sdata->vif.type == NL80211_IFTYPE_AP)
335 ps = &sdata->bss->ps;
337 list_for_each_entry_rcu(sta, &local->sta_list, list) {
338 if (sdata != sta->sdata)
341 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
342 struct ieee80211_txq *txq = sta->sta.txq[i];
347 txqi = to_txq_info(txq);
352 if (!test_and_clear_bit(IEEE80211_TXQ_DIRTY,
356 spin_unlock(&fq->lock);
357 drv_wake_tx_queue(local, txqi);
358 spin_lock(&fq->lock);
365 txqi = to_txq_info(vif->txq);
367 if (!test_and_clear_bit(IEEE80211_TXQ_DIRTY, &txqi->flags) ||
368 (ps && atomic_read(&ps->num_sta_ps)) || ac != vif->txq->ac)
371 spin_unlock(&fq->lock);
373 drv_wake_tx_queue(local, txqi);
377 spin_unlock(&fq->lock);
382 __releases(&local->queue_stop_reason_lock)
383 __acquires(&local->queue_stop_reason_lock)
384 _ieee80211_wake_txqs(struct ieee80211_local *local, unsigned long *flags)
386 struct ieee80211_sub_if_data *sdata;
387 int n_acs = IEEE80211_NUM_ACS;
392 if (local->hw.queues < IEEE80211_NUM_ACS)
395 for (i = 0; i < local->hw.queues; i++) {
396 if (local->queue_stop_reasons[i])
399 spin_unlock_irqrestore(&local->queue_stop_reason_lock, *flags);
400 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
403 for (ac = 0; ac < n_acs; ac++) {
404 int ac_queue = sdata->vif.hw_queue[ac];
407 sdata->vif.cab_queue == i)
408 __ieee80211_wake_txqs(sdata, ac);
411 spin_lock_irqsave(&local->queue_stop_reason_lock, *flags);
417 void ieee80211_wake_txqs(struct tasklet_struct *t)
419 struct ieee80211_local *local = from_tasklet(local, t,
423 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
424 _ieee80211_wake_txqs(local, &flags);
425 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
428 static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
429 enum queue_stop_reason reason,
431 unsigned long *flags)
433 struct ieee80211_local *local = hw_to_local(hw);
435 trace_wake_queue(local, queue, reason);
437 if (WARN_ON(queue >= hw->queues))
440 if (!test_bit(reason, &local->queue_stop_reasons[queue]))
444 local->q_stop_reasons[queue][reason] = 0;
446 local->q_stop_reasons[queue][reason]--;
447 if (WARN_ON(local->q_stop_reasons[queue][reason] < 0))
448 local->q_stop_reasons[queue][reason] = 0;
451 if (local->q_stop_reasons[queue][reason] == 0)
452 __clear_bit(reason, &local->queue_stop_reasons[queue]);
454 if (local->queue_stop_reasons[queue] != 0)
455 /* someone still has this queue stopped */
458 if (!skb_queue_empty(&local->pending[queue]))
459 tasklet_schedule(&local->tx_pending_tasklet);
462 * Calling _ieee80211_wake_txqs here can be a problem because it may
463 * release queue_stop_reason_lock which has been taken by
464 * __ieee80211_wake_queue's caller. It is certainly not very nice to
465 * release someone's lock, but it is fine because all the callers of
466 * __ieee80211_wake_queue call it right before releasing the lock.
468 if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
469 tasklet_schedule(&local->wake_txqs_tasklet);
471 _ieee80211_wake_txqs(local, flags);
474 void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
475 enum queue_stop_reason reason,
478 struct ieee80211_local *local = hw_to_local(hw);
481 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
482 __ieee80211_wake_queue(hw, queue, reason, refcounted, &flags);
483 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
486 void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue)
488 ieee80211_wake_queue_by_reason(hw, queue,
489 IEEE80211_QUEUE_STOP_REASON_DRIVER,
492 EXPORT_SYMBOL(ieee80211_wake_queue);
494 static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
495 enum queue_stop_reason reason,
498 struct ieee80211_local *local = hw_to_local(hw);
500 trace_stop_queue(local, queue, reason);
502 if (WARN_ON(queue >= hw->queues))
506 local->q_stop_reasons[queue][reason] = 1;
508 local->q_stop_reasons[queue][reason]++;
510 set_bit(reason, &local->queue_stop_reasons[queue]);
513 void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
514 enum queue_stop_reason reason,
517 struct ieee80211_local *local = hw_to_local(hw);
520 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
521 __ieee80211_stop_queue(hw, queue, reason, refcounted);
522 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
525 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
527 ieee80211_stop_queue_by_reason(hw, queue,
528 IEEE80211_QUEUE_STOP_REASON_DRIVER,
531 EXPORT_SYMBOL(ieee80211_stop_queue);
533 void ieee80211_add_pending_skb(struct ieee80211_local *local,
536 struct ieee80211_hw *hw = &local->hw;
538 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
539 int queue = info->hw_queue;
541 if (WARN_ON(!info->control.vif)) {
542 ieee80211_free_txskb(&local->hw, skb);
546 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
547 __ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
549 __skb_queue_tail(&local->pending[queue], skb);
550 __ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
552 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
555 void ieee80211_add_pending_skbs(struct ieee80211_local *local,
556 struct sk_buff_head *skbs)
558 struct ieee80211_hw *hw = &local->hw;
563 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
564 while ((skb = skb_dequeue(skbs))) {
565 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
567 if (WARN_ON(!info->control.vif)) {
568 ieee80211_free_txskb(&local->hw, skb);
572 queue = info->hw_queue;
574 __ieee80211_stop_queue(hw, queue,
575 IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
578 __skb_queue_tail(&local->pending[queue], skb);
581 for (i = 0; i < hw->queues; i++)
582 __ieee80211_wake_queue(hw, i,
583 IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
585 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
588 void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
589 unsigned long queues,
590 enum queue_stop_reason reason,
593 struct ieee80211_local *local = hw_to_local(hw);
597 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
599 for_each_set_bit(i, &queues, hw->queues)
600 __ieee80211_stop_queue(hw, i, reason, refcounted);
602 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
605 void ieee80211_stop_queues(struct ieee80211_hw *hw)
607 ieee80211_stop_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
608 IEEE80211_QUEUE_STOP_REASON_DRIVER,
611 EXPORT_SYMBOL(ieee80211_stop_queues);
613 int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue)
615 struct ieee80211_local *local = hw_to_local(hw);
619 if (WARN_ON(queue >= hw->queues))
622 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
623 ret = test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER,
624 &local->queue_stop_reasons[queue]);
625 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
628 EXPORT_SYMBOL(ieee80211_queue_stopped);
630 void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
631 unsigned long queues,
632 enum queue_stop_reason reason,
635 struct ieee80211_local *local = hw_to_local(hw);
639 spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
641 for_each_set_bit(i, &queues, hw->queues)
642 __ieee80211_wake_queue(hw, i, reason, refcounted, &flags);
644 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
647 void ieee80211_wake_queues(struct ieee80211_hw *hw)
649 ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
650 IEEE80211_QUEUE_STOP_REASON_DRIVER,
653 EXPORT_SYMBOL(ieee80211_wake_queues);
656 ieee80211_get_vif_queues(struct ieee80211_local *local,
657 struct ieee80211_sub_if_data *sdata)
661 if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
666 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
667 queues |= BIT(sdata->vif.hw_queue[ac]);
668 if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE)
669 queues |= BIT(sdata->vif.cab_queue);
672 queues = BIT(local->hw.queues) - 1;
678 void __ieee80211_flush_queues(struct ieee80211_local *local,
679 struct ieee80211_sub_if_data *sdata,
680 unsigned int queues, bool drop)
682 if (!local->ops->flush)
686 * If no queue was set, or if the HW doesn't support
687 * IEEE80211_HW_QUEUE_CONTROL - flush all queues
689 if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
690 queues = ieee80211_get_vif_queues(local, sdata);
692 ieee80211_stop_queues_by_reason(&local->hw, queues,
693 IEEE80211_QUEUE_STOP_REASON_FLUSH,
697 struct sta_info *sta;
699 /* Purge the queues, so the frames on them won't be
700 * sent during __ieee80211_wake_queue()
702 list_for_each_entry(sta, &local->sta_list, list) {
703 if (sdata != sta->sdata)
705 ieee80211_purge_sta_txqs(sta);
709 drv_flush(local, sdata, queues, drop);
711 ieee80211_wake_queues_by_reason(&local->hw, queues,
712 IEEE80211_QUEUE_STOP_REASON_FLUSH,
716 void ieee80211_flush_queues(struct ieee80211_local *local,
717 struct ieee80211_sub_if_data *sdata, bool drop)
719 __ieee80211_flush_queues(local, sdata, 0, drop);
722 void ieee80211_stop_vif_queues(struct ieee80211_local *local,
723 struct ieee80211_sub_if_data *sdata,
724 enum queue_stop_reason reason)
726 ieee80211_stop_queues_by_reason(&local->hw,
727 ieee80211_get_vif_queues(local, sdata),
731 void ieee80211_wake_vif_queues(struct ieee80211_local *local,
732 struct ieee80211_sub_if_data *sdata,
733 enum queue_stop_reason reason)
735 ieee80211_wake_queues_by_reason(&local->hw,
736 ieee80211_get_vif_queues(local, sdata),
740 static void __iterate_interfaces(struct ieee80211_local *local,
742 void (*iterator)(void *data, u8 *mac,
743 struct ieee80211_vif *vif),
746 struct ieee80211_sub_if_data *sdata;
747 bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
749 list_for_each_entry_rcu(sdata, &local->interfaces, list) {
750 switch (sdata->vif.type) {
751 case NL80211_IFTYPE_MONITOR:
752 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
755 case NL80211_IFTYPE_AP_VLAN:
760 if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) &&
761 active_only && !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
763 if ((iter_flags & IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER) &&
764 !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
766 if (ieee80211_sdata_running(sdata) || !active_only)
767 iterator(data, sdata->vif.addr,
771 sdata = rcu_dereference_check(local->monitor_sdata,
772 lockdep_is_held(&local->iflist_mtx) ||
773 lockdep_is_held(&local->hw.wiphy->mtx));
775 (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only ||
776 sdata->flags & IEEE80211_SDATA_IN_DRIVER))
777 iterator(data, sdata->vif.addr, &sdata->vif);
780 void ieee80211_iterate_interfaces(
781 struct ieee80211_hw *hw, u32 iter_flags,
782 void (*iterator)(void *data, u8 *mac,
783 struct ieee80211_vif *vif),
786 struct ieee80211_local *local = hw_to_local(hw);
788 mutex_lock(&local->iflist_mtx);
789 __iterate_interfaces(local, iter_flags, iterator, data);
790 mutex_unlock(&local->iflist_mtx);
792 EXPORT_SYMBOL_GPL(ieee80211_iterate_interfaces);
794 void ieee80211_iterate_active_interfaces_atomic(
795 struct ieee80211_hw *hw, u32 iter_flags,
796 void (*iterator)(void *data, u8 *mac,
797 struct ieee80211_vif *vif),
800 struct ieee80211_local *local = hw_to_local(hw);
803 __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
807 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
809 void ieee80211_iterate_active_interfaces_mtx(
810 struct ieee80211_hw *hw, u32 iter_flags,
811 void (*iterator)(void *data, u8 *mac,
812 struct ieee80211_vif *vif),
815 struct ieee80211_local *local = hw_to_local(hw);
817 lockdep_assert_wiphy(hw->wiphy);
819 __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
822 EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_mtx);
824 static void __iterate_stations(struct ieee80211_local *local,
825 void (*iterator)(void *data,
826 struct ieee80211_sta *sta),
829 struct sta_info *sta;
831 list_for_each_entry_rcu(sta, &local->sta_list, list) {
835 iterator(data, &sta->sta);
839 void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
840 void (*iterator)(void *data,
841 struct ieee80211_sta *sta),
844 struct ieee80211_local *local = hw_to_local(hw);
847 __iterate_stations(local, iterator, data);
850 EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic);
852 struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev)
854 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
856 if (!ieee80211_sdata_running(sdata) ||
857 !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
861 EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif);
863 struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
868 return &vif_to_sdata(vif)->wdev;
870 EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
873 * Nothing should have been stuffed into the workqueue during
874 * the suspend->resume cycle. Since we can't check each caller
875 * of this function if we are already quiescing / suspended,
876 * check here and don't WARN since this can actually happen when
877 * the rx path (for example) is racing against __ieee80211_suspend
878 * and suspending / quiescing was set after the rx path checked
881 static bool ieee80211_can_queue_work(struct ieee80211_local *local)
883 if (local->quiescing || (local->suspended && !local->resuming)) {
884 pr_warn("queueing ieee80211 work while going to suspend\n");
891 void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work)
893 struct ieee80211_local *local = hw_to_local(hw);
895 if (!ieee80211_can_queue_work(local))
898 queue_work(local->workqueue, work);
900 EXPORT_SYMBOL(ieee80211_queue_work);
902 void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
903 struct delayed_work *dwork,
906 struct ieee80211_local *local = hw_to_local(hw);
908 if (!ieee80211_can_queue_work(local))
911 queue_delayed_work(local->workqueue, dwork, delay);
913 EXPORT_SYMBOL(ieee80211_queue_delayed_work);
916 ieee80211_parse_extension_element(u32 *crc,
917 const struct element *elem,
918 struct ieee802_11_elems *elems,
919 struct ieee80211_elems_parse_params *params)
921 const void *data = elem->data + 1;
922 bool calc_crc = false;
928 len = elem->datalen - 1;
930 switch (elem->data[0]) {
931 case WLAN_EID_EXT_HE_MU_EDCA:
933 if (len >= sizeof(*elems->mu_edca_param_set))
934 elems->mu_edca_param_set = data;
936 case WLAN_EID_EXT_HE_CAPABILITY:
937 if (ieee80211_he_capa_size_ok(data, len)) {
938 elems->he_cap = data;
939 elems->he_cap_len = len;
942 case WLAN_EID_EXT_HE_OPERATION:
944 if (len >= sizeof(*elems->he_operation) &&
945 len >= ieee80211_he_oper_size(data) - 1)
946 elems->he_operation = data;
948 case WLAN_EID_EXT_UORA:
950 elems->uora_element = data;
952 case WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME:
954 elems->max_channel_switch_time = data;
956 case WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION:
957 if (len >= sizeof(*elems->mbssid_config_ie))
958 elems->mbssid_config_ie = data;
960 case WLAN_EID_EXT_HE_SPR:
961 if (len >= sizeof(*elems->he_spr) &&
962 len >= ieee80211_he_spr_size(data))
963 elems->he_spr = data;
965 case WLAN_EID_EXT_HE_6GHZ_CAPA:
966 if (len >= sizeof(*elems->he_6ghz_capa))
967 elems->he_6ghz_capa = data;
969 case WLAN_EID_EXT_EHT_CAPABILITY:
970 if (ieee80211_eht_capa_size_ok(elems->he_cap,
973 elems->eht_cap = data;
974 elems->eht_cap_len = len;
977 case WLAN_EID_EXT_EHT_OPERATION:
978 if (ieee80211_eht_oper_size_ok(data, len))
979 elems->eht_operation = data;
982 case WLAN_EID_EXT_EHT_MULTI_LINK:
985 if (ieee80211_mle_size_ok(data, len)) {
986 const struct ieee80211_multi_link_elem *mle =
989 switch (le16_get_bits(mle->control,
990 IEEE80211_ML_CONTROL_TYPE)) {
991 case IEEE80211_ML_CONTROL_TYPE_BASIC:
992 elems->ml_basic_elem = (void *)elem;
993 elems->ml_basic = data;
994 elems->ml_basic_len = len;
996 case IEEE80211_ML_CONTROL_TYPE_RECONF:
997 elems->ml_reconf_elem = (void *)elem;
998 elems->ml_reconf = data;
999 elems->ml_reconf_len = len;
1006 case WLAN_EID_EXT_BANDWIDTH_INDICATION:
1007 if (ieee80211_bandwidth_indication_size_ok(data, len))
1008 elems->bandwidth_indication = data;
1011 case WLAN_EID_EXT_TID_TO_LINK_MAPPING:
1013 if (ieee80211_tid_to_link_map_size_ok(data, len) &&
1014 elems->ttlm_num < ARRAY_SIZE(elems->ttlm)) {
1015 elems->ttlm[elems->ttlm_num] = (void *)data;
1021 if (crc && calc_crc)
1022 *crc = crc32_be(*crc, (void *)elem, elem->datalen + 2);
1026 _ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params,
1027 struct ieee802_11_elems *elems,
1028 const struct element *check_inherit)
1030 const struct element *elem;
1031 bool calc_crc = params->filter != 0;
1032 DECLARE_BITMAP(seen_elems, 256);
1033 u32 crc = params->crc;
1035 bitmap_zero(seen_elems, 256);
1037 for_each_element(elem, params->start, params->len) {
1038 const struct element *subelem;
1039 bool elem_parse_failed;
1041 u8 elen = elem->datalen;
1042 const u8 *pos = elem->data;
1044 if (check_inherit &&
1045 !cfg80211_is_element_inherited(elem,
1051 case WLAN_EID_SUPP_RATES:
1052 case WLAN_EID_FH_PARAMS:
1053 case WLAN_EID_DS_PARAMS:
1054 case WLAN_EID_CF_PARAMS:
1056 case WLAN_EID_IBSS_PARAMS:
1057 case WLAN_EID_CHALLENGE:
1059 case WLAN_EID_ERP_INFO:
1060 case WLAN_EID_EXT_SUPP_RATES:
1061 case WLAN_EID_HT_CAPABILITY:
1062 case WLAN_EID_HT_OPERATION:
1063 case WLAN_EID_VHT_CAPABILITY:
1064 case WLAN_EID_VHT_OPERATION:
1065 case WLAN_EID_MESH_ID:
1066 case WLAN_EID_MESH_CONFIG:
1067 case WLAN_EID_PEER_MGMT:
1072 case WLAN_EID_CHANNEL_SWITCH:
1073 case WLAN_EID_EXT_CHANSWITCH_ANN:
1074 case WLAN_EID_COUNTRY:
1075 case WLAN_EID_PWR_CONSTRAINT:
1076 case WLAN_EID_TIMEOUT_INTERVAL:
1077 case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
1078 case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
1079 case WLAN_EID_CHAN_SWITCH_PARAM:
1080 case WLAN_EID_EXT_CAPABILITY:
1081 case WLAN_EID_CHAN_SWITCH_TIMING:
1082 case WLAN_EID_LINK_ID:
1083 case WLAN_EID_BSS_MAX_IDLE_PERIOD:
1085 case WLAN_EID_S1G_BCN_COMPAT:
1086 case WLAN_EID_S1G_CAPABILITIES:
1087 case WLAN_EID_S1G_OPERATION:
1088 case WLAN_EID_AID_RESPONSE:
1089 case WLAN_EID_S1G_SHORT_BCN_INTERVAL:
1091 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible
1092 * that if the content gets bigger it might be needed more than once
1094 if (test_bit(id, seen_elems)) {
1095 elems->parse_error = true;
1101 if (calc_crc && id < 64 && (params->filter & (1ULL << id)))
1102 crc = crc32_be(crc, pos - 2, elen + 2);
1104 elem_parse_failed = false;
1107 case WLAN_EID_LINK_ID:
1108 if (elen + 2 < sizeof(struct ieee80211_tdls_lnkie)) {
1109 elem_parse_failed = true;
1112 elems->lnk_id = (void *)(pos - 2);
1114 case WLAN_EID_CHAN_SWITCH_TIMING:
1115 if (elen < sizeof(struct ieee80211_ch_switch_timing)) {
1116 elem_parse_failed = true;
1119 elems->ch_sw_timing = (void *)pos;
1121 case WLAN_EID_EXT_CAPABILITY:
1122 elems->ext_capab = pos;
1123 elems->ext_capab_len = elen;
1127 elems->ssid_len = elen;
1129 case WLAN_EID_SUPP_RATES:
1130 elems->supp_rates = pos;
1131 elems->supp_rates_len = elen;
1133 case WLAN_EID_DS_PARAMS:
1135 elems->ds_params = pos;
1137 elem_parse_failed = true;
1140 if (elen >= sizeof(struct ieee80211_tim_ie)) {
1141 elems->tim = (void *)pos;
1142 elems->tim_len = elen;
1144 elem_parse_failed = true;
1146 case WLAN_EID_VENDOR_SPECIFIC:
1147 if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
1149 /* Microsoft OUI (00:50:F2) */
1152 crc = crc32_be(crc, pos - 2, elen + 2);
1154 if (elen >= 5 && pos[3] == 2) {
1155 /* OUI Type 2 - WMM IE */
1157 elems->wmm_info = pos;
1158 elems->wmm_info_len = elen;
1159 } else if (pos[4] == 1) {
1160 elems->wmm_param = pos;
1161 elems->wmm_param_len = elen;
1168 elems->rsn_len = elen;
1170 case WLAN_EID_ERP_INFO:
1172 elems->erp_info = pos;
1174 elem_parse_failed = true;
1176 case WLAN_EID_EXT_SUPP_RATES:
1177 elems->ext_supp_rates = pos;
1178 elems->ext_supp_rates_len = elen;
1180 case WLAN_EID_HT_CAPABILITY:
1181 if (elen >= sizeof(struct ieee80211_ht_cap))
1182 elems->ht_cap_elem = (void *)pos;
1184 elem_parse_failed = true;
1186 case WLAN_EID_HT_OPERATION:
1187 if (elen >= sizeof(struct ieee80211_ht_operation))
1188 elems->ht_operation = (void *)pos;
1190 elem_parse_failed = true;
1192 case WLAN_EID_VHT_CAPABILITY:
1193 if (elen >= sizeof(struct ieee80211_vht_cap))
1194 elems->vht_cap_elem = (void *)pos;
1196 elem_parse_failed = true;
1198 case WLAN_EID_VHT_OPERATION:
1199 if (elen >= sizeof(struct ieee80211_vht_operation)) {
1200 elems->vht_operation = (void *)pos;
1202 crc = crc32_be(crc, pos - 2, elen + 2);
1205 elem_parse_failed = true;
1207 case WLAN_EID_OPMODE_NOTIF:
1209 elems->opmode_notif = pos;
1211 crc = crc32_be(crc, pos - 2, elen + 2);
1214 elem_parse_failed = true;
1216 case WLAN_EID_MESH_ID:
1217 elems->mesh_id = pos;
1218 elems->mesh_id_len = elen;
1220 case WLAN_EID_MESH_CONFIG:
1221 if (elen >= sizeof(struct ieee80211_meshconf_ie))
1222 elems->mesh_config = (void *)pos;
1224 elem_parse_failed = true;
1226 case WLAN_EID_PEER_MGMT:
1227 elems->peering = pos;
1228 elems->peering_len = elen;
1230 case WLAN_EID_MESH_AWAKE_WINDOW:
1232 elems->awake_window = (void *)pos;
1236 elems->preq_len = elen;
1240 elems->prep_len = elen;
1244 elems->perr_len = elen;
1247 if (elen >= sizeof(struct ieee80211_rann_ie))
1248 elems->rann = (void *)pos;
1250 elem_parse_failed = true;
1252 case WLAN_EID_CHANNEL_SWITCH:
1253 if (elen != sizeof(struct ieee80211_channel_sw_ie)) {
1254 elem_parse_failed = true;
1257 elems->ch_switch_ie = (void *)pos;
1259 case WLAN_EID_EXT_CHANSWITCH_ANN:
1260 if (elen != sizeof(struct ieee80211_ext_chansw_ie)) {
1261 elem_parse_failed = true;
1264 elems->ext_chansw_ie = (void *)pos;
1266 case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
1267 if (elen != sizeof(struct ieee80211_sec_chan_offs_ie)) {
1268 elem_parse_failed = true;
1271 elems->sec_chan_offs = (void *)pos;
1273 case WLAN_EID_CHAN_SWITCH_PARAM:
1275 sizeof(*elems->mesh_chansw_params_ie)) {
1276 elem_parse_failed = true;
1279 elems->mesh_chansw_params_ie = (void *)pos;
1281 case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
1282 if (!params->action ||
1283 elen < sizeof(*elems->wide_bw_chansw_ie)) {
1284 elem_parse_failed = true;
1287 elems->wide_bw_chansw_ie = (void *)pos;
1289 case WLAN_EID_CHANNEL_SWITCH_WRAPPER:
1290 if (params->action) {
1291 elem_parse_failed = true;
1295 * This is a bit tricky, but as we only care about
1296 * a few elements, parse them out manually.
1298 subelem = cfg80211_find_elem(WLAN_EID_WIDE_BW_CHANNEL_SWITCH,
1301 if (subelem->datalen >= sizeof(*elems->wide_bw_chansw_ie))
1302 elems->wide_bw_chansw_ie =
1303 (void *)subelem->data;
1305 elem_parse_failed = true;
1308 subelem = cfg80211_find_ext_elem(WLAN_EID_EXT_BANDWIDTH_INDICATION,
1311 const void *edata = subelem->data + 1;
1312 u8 edatalen = subelem->datalen - 1;
1314 if (ieee80211_bandwidth_indication_size_ok(edata,
1316 elems->bandwidth_indication = edata;
1318 elem_parse_failed = true;
1321 case WLAN_EID_COUNTRY:
1322 elems->country_elem = pos;
1323 elems->country_elem_len = elen;
1325 case WLAN_EID_PWR_CONSTRAINT:
1327 elem_parse_failed = true;
1330 elems->pwr_constr_elem = pos;
1332 case WLAN_EID_CISCO_VENDOR_SPECIFIC:
1333 /* Lots of different options exist, but we only care
1334 * about the Dynamic Transmit Power Control element.
1335 * First check for the Cisco OUI, then for the DTPC
1339 elem_parse_failed = true;
1343 if (pos[0] != 0x00 || pos[1] != 0x40 ||
1344 pos[2] != 0x96 || pos[3] != 0x00)
1348 elem_parse_failed = true;
1353 crc = crc32_be(crc, pos - 2, elen + 2);
1355 elems->cisco_dtpc_elem = pos;
1357 case WLAN_EID_ADDBA_EXT:
1358 if (elen < sizeof(struct ieee80211_addba_ext_ie)) {
1359 elem_parse_failed = true;
1362 elems->addba_ext_ie = (void *)pos;
1364 case WLAN_EID_TIMEOUT_INTERVAL:
1365 if (elen >= sizeof(struct ieee80211_timeout_interval_ie))
1366 elems->timeout_int = (void *)pos;
1368 elem_parse_failed = true;
1370 case WLAN_EID_BSS_MAX_IDLE_PERIOD:
1371 if (elen >= sizeof(*elems->max_idle_period_ie))
1372 elems->max_idle_period_ie = (void *)pos;
1376 elems->rsnx_len = elen;
1378 case WLAN_EID_TX_POWER_ENVELOPE:
1380 elen > sizeof(struct ieee80211_tx_pwr_env))
1383 if (elems->tx_pwr_env_num >= ARRAY_SIZE(elems->tx_pwr_env))
1386 elems->tx_pwr_env[elems->tx_pwr_env_num] = (void *)pos;
1387 elems->tx_pwr_env_len[elems->tx_pwr_env_num] = elen;
1388 elems->tx_pwr_env_num++;
1390 case WLAN_EID_EXTENSION:
1391 ieee80211_parse_extension_element(calc_crc ?
1393 elem, elems, params);
1395 case WLAN_EID_S1G_CAPABILITIES:
1396 if (elen >= sizeof(*elems->s1g_capab))
1397 elems->s1g_capab = (void *)pos;
1399 elem_parse_failed = true;
1401 case WLAN_EID_S1G_OPERATION:
1402 if (elen == sizeof(*elems->s1g_oper))
1403 elems->s1g_oper = (void *)pos;
1405 elem_parse_failed = true;
1407 case WLAN_EID_S1G_BCN_COMPAT:
1408 if (elen == sizeof(*elems->s1g_bcn_compat))
1409 elems->s1g_bcn_compat = (void *)pos;
1411 elem_parse_failed = true;
1413 case WLAN_EID_AID_RESPONSE:
1414 if (elen == sizeof(struct ieee80211_aid_response_ie))
1415 elems->aid_resp = (void *)pos;
1417 elem_parse_failed = true;
1423 if (elem_parse_failed)
1424 elems->parse_error = true;
1426 __set_bit(id, seen_elems);
1429 if (!for_each_element_completed(elem, params->start, params->len))
1430 elems->parse_error = true;
1435 static size_t ieee802_11_find_bssid_profile(const u8 *start, size_t len,
1436 struct ieee802_11_elems *elems,
1437 struct cfg80211_bss *bss,
1438 u8 *nontransmitted_profile)
1440 const struct element *elem, *sub;
1441 size_t profile_len = 0;
1444 if (!bss || !bss->transmitted_bss)
1447 for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, len) {
1448 if (elem->datalen < 2)
1450 if (elem->data[0] < 1 || elem->data[0] > 8)
1453 for_each_element(sub, elem->data + 1, elem->datalen - 1) {
1454 u8 new_bssid[ETH_ALEN];
1457 if (sub->id != 0 || sub->datalen < 4) {
1458 /* not a valid BSS profile */
1462 if (sub->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
1463 sub->data[1] != 2) {
1464 /* The first element of the
1465 * Nontransmitted BSSID Profile is not
1466 * the Nontransmitted BSSID Capability
1472 memset(nontransmitted_profile, 0, len);
1473 profile_len = cfg80211_merge_profile(start, len,
1476 nontransmitted_profile,
1479 /* found a Nontransmitted BSSID Profile */
1480 index = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX,
1481 nontransmitted_profile,
1483 if (!index || index[1] < 1 || index[2] == 0) {
1484 /* Invalid MBSSID Index element */
1488 cfg80211_gen_new_bssid(bss->transmitted_bss->bssid,
1492 if (ether_addr_equal(new_bssid, bss->bssid)) {
1494 elems->bssid_index_len = index[1];
1495 elems->bssid_index = (void *)&index[2];
1501 return found ? profile_len : 0;
1504 static void ieee80211_mle_get_sta_prof(struct ieee802_11_elems *elems,
1507 const struct ieee80211_multi_link_elem *ml = elems->ml_basic;
1508 ssize_t ml_len = elems->ml_basic_len;
1509 const struct element *sub;
1514 if (le16_get_bits(ml->control, IEEE80211_ML_CONTROL_TYPE) !=
1515 IEEE80211_ML_CONTROL_TYPE_BASIC)
1518 for_each_mle_subelement(sub, (u8 *)ml, ml_len) {
1519 struct ieee80211_mle_per_sta_profile *prof = (void *)sub->data;
1520 ssize_t sta_prof_len;
1523 if (sub->id != IEEE80211_MLE_SUBELEM_PER_STA_PROFILE)
1526 if (!ieee80211_mle_basic_sta_prof_size_ok(sub->data,
1530 control = le16_to_cpu(prof->control);
1532 if (link_id != u16_get_bits(control,
1533 IEEE80211_MLE_STA_CONTROL_LINK_ID))
1536 if (!(control & IEEE80211_MLE_STA_CONTROL_COMPLETE_PROFILE))
1539 /* the sub element can be fragmented */
1541 cfg80211_defragment_element(sub,
1545 elems->scratch_len -
1547 IEEE80211_MLE_SUBELEM_FRAGMENT);
1549 if (sta_prof_len < 0)
1552 elems->prof = (void *)elems->scratch_pos;
1553 elems->sta_prof_len = sta_prof_len;
1554 elems->scratch_pos += sta_prof_len;
1560 static void ieee80211_mle_parse_link(struct ieee802_11_elems *elems,
1561 struct ieee80211_elems_parse_params *params)
1563 struct ieee80211_mle_per_sta_profile *prof;
1564 struct ieee80211_elems_parse_params sub = {
1565 .action = params->action,
1566 .from_ap = params->from_ap,
1569 ssize_t ml_len = elems->ml_basic_len;
1570 const struct element *non_inherit = NULL;
1573 if (params->link_id == -1)
1576 ml_len = cfg80211_defragment_element(elems->ml_basic_elem,
1581 elems->scratch_len -
1588 elems->ml_basic = (const void *)elems->scratch_pos;
1589 elems->ml_basic_len = ml_len;
1591 ieee80211_mle_get_sta_prof(elems, params->link_id);
1597 /* check if we have the 4 bytes for the fixed part in assoc response */
1598 if (elems->sta_prof_len < sizeof(*prof) + prof->sta_info_len - 1 + 4) {
1600 elems->sta_prof_len = 0;
1605 * Skip the capability information and the status code that are expected
1606 * as part of the station profile in association response frames. Note
1607 * the -1 is because the 'sta_info_len' is accounted to as part of the
1608 * per-STA profile, but not part of the 'u8 variable[]' portion.
1610 sub.start = prof->variable + prof->sta_info_len - 1 + 4;
1611 end = (const u8 *)prof + elems->sta_prof_len;
1612 sub.len = end - sub.start;
1614 non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
1615 sub.start, sub.len);
1616 _ieee802_11_parse_elems_full(&sub, elems, non_inherit);
1619 struct ieee802_11_elems *
1620 ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
1622 struct ieee802_11_elems *elems;
1623 const struct element *non_inherit = NULL;
1624 u8 *nontransmitted_profile;
1625 int nontransmitted_profile_len = 0;
1626 size_t scratch_len = 3 * params->len;
1628 elems = kzalloc(struct_size(elems, scratch, scratch_len), GFP_ATOMIC);
1631 elems->ie_start = params->start;
1632 elems->total_len = params->len;
1633 elems->scratch_len = scratch_len;
1634 elems->scratch_pos = elems->scratch;
1636 nontransmitted_profile = elems->scratch_pos;
1637 nontransmitted_profile_len =
1638 ieee802_11_find_bssid_profile(params->start, params->len,
1640 nontransmitted_profile);
1641 elems->scratch_pos += nontransmitted_profile_len;
1642 elems->scratch_len -= nontransmitted_profile_len;
1643 non_inherit = cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
1644 nontransmitted_profile,
1645 nontransmitted_profile_len);
1647 elems->crc = _ieee802_11_parse_elems_full(params, elems, non_inherit);
1649 /* Override with nontransmitted profile, if found */
1650 if (nontransmitted_profile_len) {
1651 struct ieee80211_elems_parse_params sub = {
1652 .start = nontransmitted_profile,
1653 .len = nontransmitted_profile_len,
1654 .action = params->action,
1655 .link_id = params->link_id,
1658 _ieee802_11_parse_elems_full(&sub, elems, NULL);
1661 ieee80211_mle_parse_link(elems, params);
1663 if (elems->tim && !elems->parse_error) {
1664 const struct ieee80211_tim_ie *tim_ie = elems->tim;
1666 elems->dtim_period = tim_ie->dtim_period;
1667 elems->dtim_count = tim_ie->dtim_count;
1670 /* Override DTIM period and count if needed */
1671 if (elems->bssid_index &&
1672 elems->bssid_index_len >=
1673 offsetofend(struct ieee80211_bssid_index, dtim_period))
1674 elems->dtim_period = elems->bssid_index->dtim_period;
1676 if (elems->bssid_index &&
1677 elems->bssid_index_len >=
1678 offsetofend(struct ieee80211_bssid_index, dtim_count))
1679 elems->dtim_count = elems->bssid_index->dtim_count;
1683 EXPORT_SYMBOL_IF_KUNIT(ieee802_11_parse_elems_full);
1685 void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
1686 struct ieee80211_tx_queue_params
1689 struct ieee80211_chanctx_conf *chanctx_conf;
1690 const struct ieee80211_reg_rule *rrule;
1691 const struct ieee80211_wmm_ac *wmm_ac;
1692 u16 center_freq = 0;
1694 if (sdata->vif.type != NL80211_IFTYPE_AP &&
1695 sdata->vif.type != NL80211_IFTYPE_STATION)
1699 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
1701 center_freq = chanctx_conf->def.chan->center_freq;
1708 rrule = freq_reg_info(sdata->wdev.wiphy, MHZ_TO_KHZ(center_freq));
1710 if (IS_ERR_OR_NULL(rrule) || !rrule->has_wmm) {
1715 if (sdata->vif.type == NL80211_IFTYPE_AP)
1716 wmm_ac = &rrule->wmm_rule.ap[ac];
1718 wmm_ac = &rrule->wmm_rule.client[ac];
1719 qparam->cw_min = max_t(u16, qparam->cw_min, wmm_ac->cw_min);
1720 qparam->cw_max = max_t(u16, qparam->cw_max, wmm_ac->cw_max);
1721 qparam->aifs = max_t(u8, qparam->aifs, wmm_ac->aifsn);
1722 qparam->txop = min_t(u16, qparam->txop, wmm_ac->cot / 32);
1726 void ieee80211_set_wmm_default(struct ieee80211_link_data *link,
1727 bool bss_notify, bool enable_qos)
1729 struct ieee80211_sub_if_data *sdata = link->sdata;
1730 struct ieee80211_local *local = sdata->local;
1731 struct ieee80211_tx_queue_params qparam;
1732 struct ieee80211_chanctx_conf *chanctx_conf;
1735 bool is_ocb; /* Use another EDCA parameters if dot11OCBActivated=true */
1738 if (!local->ops->conf_tx)
1741 if (local->hw.queues < IEEE80211_NUM_ACS)
1744 memset(&qparam, 0, sizeof(qparam));
1747 chanctx_conf = rcu_dereference(link->conf->chanctx_conf);
1748 use_11b = (chanctx_conf &&
1749 chanctx_conf->def.chan->band == NL80211_BAND_2GHZ) &&
1750 !link->operating_11g_mode;
1753 is_ocb = (sdata->vif.type == NL80211_IFTYPE_OCB);
1755 /* Set defaults according to 802.11-2007 Table 7-37 */
1762 /* Confiure old 802.11b/g medium access rules. */
1763 qparam.cw_max = aCWmax;
1764 qparam.cw_min = aCWmin;
1768 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1769 /* Update if QoS is enabled. */
1772 case IEEE80211_AC_BK:
1773 qparam.cw_max = aCWmax;
1774 qparam.cw_min = aCWmin;
1781 /* never happens but let's not leave undefined */
1783 case IEEE80211_AC_BE:
1784 qparam.cw_max = aCWmax;
1785 qparam.cw_min = aCWmin;
1792 case IEEE80211_AC_VI:
1793 qparam.cw_max = aCWmin;
1794 qparam.cw_min = (aCWmin + 1) / 2 - 1;
1798 qparam.txop = 6016/32;
1800 qparam.txop = 3008/32;
1807 case IEEE80211_AC_VO:
1808 qparam.cw_max = (aCWmin + 1) / 2 - 1;
1809 qparam.cw_min = (aCWmin + 1) / 4 - 1;
1813 qparam.txop = 3264/32;
1815 qparam.txop = 1504/32;
1820 ieee80211_regulatory_limit_wmm_params(sdata, &qparam, ac);
1822 qparam.uapsd = false;
1824 link->tx_conf[ac] = qparam;
1825 drv_conf_tx(local, link, ac, &qparam);
1828 if (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
1829 sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
1830 sdata->vif.type != NL80211_IFTYPE_NAN) {
1831 link->conf->qos = enable_qos;
1833 ieee80211_link_info_change_notify(sdata, link,
1838 void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
1839 u16 transaction, u16 auth_alg, u16 status,
1840 const u8 *extra, size_t extra_len, const u8 *da,
1841 const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx,
1844 struct ieee80211_local *local = sdata->local;
1845 struct sk_buff *skb;
1846 struct ieee80211_mgmt *mgmt;
1847 bool multi_link = ieee80211_vif_is_mld(&sdata->vif);
1852 struct ieee80211_multi_link_elem ml;
1853 struct ieee80211_mle_basic_common_info basic;
1855 .id = WLAN_EID_EXTENSION,
1856 .len = sizeof(mle) - 2,
1857 .ext_id = WLAN_EID_EXT_EHT_MULTI_LINK,
1858 .ml.control = cpu_to_le16(IEEE80211_ML_CONTROL_TYPE_BASIC),
1859 .basic.len = sizeof(mle.basic),
1863 memcpy(mle.basic.mld_mac_addr, sdata->vif.addr, ETH_ALEN);
1865 /* 24 + 6 = header + auth_algo + auth_transaction + status_code */
1866 skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN +
1867 24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN +
1868 multi_link * sizeof(mle));
1872 skb_reserve(skb, local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN);
1874 mgmt = skb_put_zero(skb, 24 + 6);
1875 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1876 IEEE80211_STYPE_AUTH);
1877 memcpy(mgmt->da, da, ETH_ALEN);
1878 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1879 memcpy(mgmt->bssid, bssid, ETH_ALEN);
1880 mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg);
1881 mgmt->u.auth.auth_transaction = cpu_to_le16(transaction);
1882 mgmt->u.auth.status_code = cpu_to_le16(status);
1884 skb_put_data(skb, extra, extra_len);
1886 skb_put_data(skb, &mle, sizeof(mle));
1888 if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) {
1889 mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
1890 err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx);
1897 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
1899 ieee80211_tx_skb(sdata, skb);
1902 void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
1903 const u8 *da, const u8 *bssid,
1904 u16 stype, u16 reason,
1905 bool send_frame, u8 *frame_buf)
1907 struct ieee80211_local *local = sdata->local;
1908 struct sk_buff *skb;
1909 struct ieee80211_mgmt *mgmt = (void *)frame_buf;
1912 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
1913 mgmt->duration = 0; /* initialize only */
1914 mgmt->seq_ctrl = 0; /* initialize only */
1915 memcpy(mgmt->da, da, ETH_ALEN);
1916 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1917 memcpy(mgmt->bssid, bssid, ETH_ALEN);
1918 /* u.deauth.reason_code == u.disassoc.reason_code */
1919 mgmt->u.deauth.reason_code = cpu_to_le16(reason);
1922 skb = dev_alloc_skb(local->hw.extra_tx_headroom +
1923 IEEE80211_DEAUTH_FRAME_LEN);
1927 skb_reserve(skb, local->hw.extra_tx_headroom);
1930 skb_put_data(skb, mgmt, IEEE80211_DEAUTH_FRAME_LEN);
1932 if (sdata->vif.type != NL80211_IFTYPE_STATION ||
1933 !(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED))
1934 IEEE80211_SKB_CB(skb)->flags |=
1935 IEEE80211_TX_INTFL_DONT_ENCRYPT;
1937 ieee80211_tx_skb(sdata, skb);
1941 u8 *ieee80211_write_he_6ghz_cap(u8 *pos, __le16 cap, u8 *end)
1943 if ((end - pos) < 5)
1946 *pos++ = WLAN_EID_EXTENSION;
1947 *pos++ = 1 + sizeof(cap);
1948 *pos++ = WLAN_EID_EXT_HE_6GHZ_CAPA;
1949 memcpy(pos, &cap, sizeof(cap));
1954 static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
1955 u8 *buffer, size_t buffer_len,
1956 const u8 *ie, size_t ie_len,
1957 enum nl80211_band band,
1959 struct cfg80211_chan_def *chandef,
1960 size_t *offset, u32 flags)
1962 struct ieee80211_local *local = sdata->local;
1963 struct ieee80211_supported_band *sband;
1964 const struct ieee80211_sta_he_cap *he_cap;
1965 const struct ieee80211_sta_eht_cap *eht_cap;
1966 u8 *pos = buffer, *end = buffer + buffer_len;
1968 int supp_rates_len, i;
1973 bool have_80mhz = false;
1977 sband = local->hw.wiphy->bands[band];
1978 if (WARN_ON_ONCE(!sband))
1981 rate_flags = ieee80211_chandef_rate_flags(chandef);
1983 /* For direct scan add S1G IE and consider its override bits */
1984 if (band == NL80211_BAND_S1GHZ) {
1985 if (end - pos < 2 + sizeof(struct ieee80211_s1g_cap))
1987 pos = ieee80211_ie_build_s1g_cap(pos, &sband->s1g_cap);
1992 for (i = 0; i < sband->n_bitrates; i++) {
1993 if ((BIT(i) & rate_mask) == 0)
1994 continue; /* skip rate */
1995 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
1998 rates[num_rates++] =
1999 (u8) DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
2002 supp_rates_len = min_t(int, num_rates, 8);
2004 if (end - pos < 2 + supp_rates_len)
2006 *pos++ = WLAN_EID_SUPP_RATES;
2007 *pos++ = supp_rates_len;
2008 memcpy(pos, rates, supp_rates_len);
2009 pos += supp_rates_len;
2011 /* insert "request information" if in custom IEs */
2013 static const u8 before_extrates[] = {
2015 WLAN_EID_SUPP_RATES,
2018 noffset = ieee80211_ie_split(ie, ie_len,
2020 ARRAY_SIZE(before_extrates),
2022 if (end - pos < noffset - *offset)
2024 memcpy(pos, ie + *offset, noffset - *offset);
2025 pos += noffset - *offset;
2029 ext_rates_len = num_rates - supp_rates_len;
2030 if (ext_rates_len > 0) {
2031 if (end - pos < 2 + ext_rates_len)
2033 *pos++ = WLAN_EID_EXT_SUPP_RATES;
2034 *pos++ = ext_rates_len;
2035 memcpy(pos, rates + supp_rates_len, ext_rates_len);
2036 pos += ext_rates_len;
2039 if (chandef->chan && sband->band == NL80211_BAND_2GHZ) {
2042 *pos++ = WLAN_EID_DS_PARAMS;
2044 *pos++ = ieee80211_frequency_to_channel(
2045 chandef->chan->center_freq);
2048 if (flags & IEEE80211_PROBE_FLAG_MIN_CONTENT)
2051 /* insert custom IEs that go before HT */
2053 static const u8 before_ht[] = {
2055 * no need to list the ones split off already
2056 * (or generated here)
2059 WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
2061 noffset = ieee80211_ie_split(ie, ie_len,
2062 before_ht, ARRAY_SIZE(before_ht),
2064 if (end - pos < noffset - *offset)
2066 memcpy(pos, ie + *offset, noffset - *offset);
2067 pos += noffset - *offset;
2071 if (sband->ht_cap.ht_supported) {
2072 if (end - pos < 2 + sizeof(struct ieee80211_ht_cap))
2074 pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap,
2078 /* insert custom IEs that go before VHT */
2080 static const u8 before_vht[] = {
2082 * no need to list the ones split off already
2083 * (or generated here)
2085 WLAN_EID_BSS_COEX_2040,
2086 WLAN_EID_EXT_CAPABILITY,
2088 WLAN_EID_CHANNEL_USAGE,
2089 WLAN_EID_INTERWORKING,
2091 /* 60 GHz (Multi-band, DMG, MMS) can't happen */
2093 noffset = ieee80211_ie_split(ie, ie_len,
2094 before_vht, ARRAY_SIZE(before_vht),
2096 if (end - pos < noffset - *offset)
2098 memcpy(pos, ie + *offset, noffset - *offset);
2099 pos += noffset - *offset;
2103 /* Check if any channel in this sband supports at least 80 MHz */
2104 for (i = 0; i < sband->n_channels; i++) {
2105 if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
2106 IEEE80211_CHAN_NO_80MHZ))
2113 if (sband->vht_cap.vht_supported && have_80mhz) {
2114 if (end - pos < 2 + sizeof(struct ieee80211_vht_cap))
2116 pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap,
2117 sband->vht_cap.cap);
2120 /* insert custom IEs that go before HE */
2122 static const u8 before_he[] = {
2124 * no need to list the ones split off before VHT
2127 WLAN_EID_EXTENSION, WLAN_EID_EXT_FILS_REQ_PARAMS,
2129 /* TODO: add 11ah/11aj/11ak elements */
2131 noffset = ieee80211_ie_split(ie, ie_len,
2132 before_he, ARRAY_SIZE(before_he),
2134 if (end - pos < noffset - *offset)
2136 memcpy(pos, ie + *offset, noffset - *offset);
2137 pos += noffset - *offset;
2141 he_cap = ieee80211_get_he_iftype_cap_vif(sband, &sdata->vif);
2143 cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band),
2144 IEEE80211_CHAN_NO_HE)) {
2145 pos = ieee80211_ie_build_he_cap(0, pos, he_cap, end);
2150 eht_cap = ieee80211_get_eht_iftype_cap_vif(sband, &sdata->vif);
2153 cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band),
2154 IEEE80211_CHAN_NO_HE |
2155 IEEE80211_CHAN_NO_EHT)) {
2156 pos = ieee80211_ie_build_eht_cap(pos, he_cap, eht_cap, end,
2157 sdata->vif.type == NL80211_IFTYPE_AP);
2162 if (cfg80211_any_usable_channels(local->hw.wiphy,
2163 BIT(NL80211_BAND_6GHZ),
2164 IEEE80211_CHAN_NO_HE)) {
2165 struct ieee80211_supported_band *sband6;
2167 sband6 = local->hw.wiphy->bands[NL80211_BAND_6GHZ];
2168 he_cap = ieee80211_get_he_iftype_cap_vif(sband6, &sdata->vif);
2171 enum nl80211_iftype iftype =
2172 ieee80211_vif_type_p2p(&sdata->vif);
2173 __le16 cap = ieee80211_get_he_6ghz_capa(sband6, iftype);
2175 pos = ieee80211_write_he_6ghz_cap(pos, cap, end);
2180 * If adding more here, adjust code in main.c
2181 * that calculates local->scan_ies_len.
2184 return pos - buffer;
2186 WARN_ONCE(1, "not enough space for preq IEs\n");
2188 return pos - buffer;
2191 int ieee80211_build_preq_ies(struct ieee80211_sub_if_data *sdata, u8 *buffer,
2193 struct ieee80211_scan_ies *ie_desc,
2194 const u8 *ie, size_t ie_len,
2195 u8 bands_used, u32 *rate_masks,
2196 struct cfg80211_chan_def *chandef,
2199 size_t pos = 0, old_pos = 0, custom_ie_offset = 0;
2202 memset(ie_desc, 0, sizeof(*ie_desc));
2204 for (i = 0; i < NUM_NL80211_BANDS; i++) {
2205 if (bands_used & BIT(i)) {
2206 pos += ieee80211_build_preq_ies_band(sdata,
2214 ie_desc->ies[i] = buffer + old_pos;
2215 ie_desc->len[i] = pos - old_pos;
2220 /* add any remaining custom IEs */
2222 if (WARN_ONCE(buffer_len - pos < ie_len - custom_ie_offset,
2223 "not enough space for preq custom IEs\n"))
2225 memcpy(buffer + pos, ie + custom_ie_offset,
2226 ie_len - custom_ie_offset);
2227 ie_desc->common_ies = buffer + pos;
2228 ie_desc->common_ie_len = ie_len - custom_ie_offset;
2229 pos += ie_len - custom_ie_offset;
2235 struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
2236 const u8 *src, const u8 *dst,
2238 struct ieee80211_channel *chan,
2239 const u8 *ssid, size_t ssid_len,
2240 const u8 *ie, size_t ie_len,
2243 struct ieee80211_local *local = sdata->local;
2244 struct cfg80211_chan_def chandef;
2245 struct sk_buff *skb;
2246 struct ieee80211_mgmt *mgmt;
2248 u32 rate_masks[NUM_NL80211_BANDS] = {};
2249 struct ieee80211_scan_ies dummy_ie_desc;
2252 * Do not send DS Channel parameter for directed probe requests
2253 * in order to maximize the chance that we get a response. Some
2254 * badly-behaved APs don't respond when this parameter is included.
2256 chandef.width = sdata->vif.bss_conf.chandef.width;
2257 if (flags & IEEE80211_PROBE_FLAG_DIRECTED)
2258 chandef.chan = NULL;
2260 chandef.chan = chan;
2262 skb = ieee80211_probereq_get(&local->hw, src, ssid, ssid_len,
2263 local->scan_ies_len + ie_len);
2267 rate_masks[chan->band] = ratemask;
2268 ies_len = ieee80211_build_preq_ies(sdata, skb_tail_pointer(skb),
2269 skb_tailroom(skb), &dummy_ie_desc,
2270 ie, ie_len, BIT(chan->band),
2271 rate_masks, &chandef, flags);
2272 skb_put(skb, ies_len);
2275 mgmt = (struct ieee80211_mgmt *) skb->data;
2276 memcpy(mgmt->da, dst, ETH_ALEN);
2277 memcpy(mgmt->bssid, dst, ETH_ALEN);
2280 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
2285 u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
2286 struct ieee802_11_elems *elems,
2287 enum nl80211_band band, u32 *basic_rates)
2289 struct ieee80211_supported_band *sband;
2291 u32 supp_rates, rate_flags;
2294 sband = sdata->local->hw.wiphy->bands[band];
2295 if (WARN_ON(!sband))
2298 rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
2300 num_rates = sband->n_bitrates;
2302 for (i = 0; i < elems->supp_rates_len +
2303 elems->ext_supp_rates_len; i++) {
2307 if (i < elems->supp_rates_len)
2308 rate = elems->supp_rates[i];
2309 else if (elems->ext_supp_rates)
2310 rate = elems->ext_supp_rates
2311 [i - elems->supp_rates_len];
2312 own_rate = 5 * (rate & 0x7f);
2313 is_basic = !!(rate & 0x80);
2315 if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
2318 for (j = 0; j < num_rates; j++) {
2320 if ((rate_flags & sband->bitrates[j].flags)
2324 brate = sband->bitrates[j].bitrate;
2326 if (brate == own_rate) {
2327 supp_rates |= BIT(j);
2328 if (basic_rates && is_basic)
2329 *basic_rates |= BIT(j);
2336 void ieee80211_stop_device(struct ieee80211_local *local)
2338 ieee80211_led_radio(local, false);
2339 ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO);
2341 wiphy_work_cancel(local->hw.wiphy, &local->reconfig_filter);
2343 flush_workqueue(local->workqueue);
2344 wiphy_work_flush(local->hw.wiphy, NULL);
2348 static void ieee80211_flush_completed_scan(struct ieee80211_local *local,
2351 /* It's possible that we don't handle the scan completion in
2352 * time during suspend, so if it's still marked as completed
2353 * here, queue the work and flush it to clean things up.
2354 * Instead of calling the worker function directly here, we
2355 * really queue it to avoid potential races with other flows
2356 * scheduling the same work.
2358 if (test_bit(SCAN_COMPLETED, &local->scanning)) {
2359 /* If coming from reconfiguration failure, abort the scan so
2360 * we don't attempt to continue a partial HW scan - which is
2361 * possible otherwise if (e.g.) the 2.4 GHz portion was the
2362 * completed scan, and a 5 GHz portion is still pending.
2365 set_bit(SCAN_ABORTED, &local->scanning);
2366 wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
2367 wiphy_delayed_work_flush(local->hw.wiphy, &local->scan_work);
2371 static void ieee80211_handle_reconfig_failure(struct ieee80211_local *local)
2373 struct ieee80211_sub_if_data *sdata;
2374 struct ieee80211_chanctx *ctx;
2376 lockdep_assert_wiphy(local->hw.wiphy);
2379 * We get here if during resume the device can't be restarted properly.
2380 * We might also get here if this happens during HW reset, which is a
2381 * slightly different situation and we need to drop all connections in
2384 * Ask cfg80211 to turn off all interfaces, this will result in more
2385 * warnings but at least we'll then get into a clean stopped state.
2388 local->resuming = false;
2389 local->suspended = false;
2390 local->in_reconfig = false;
2391 local->reconfig_failure = true;
2393 ieee80211_flush_completed_scan(local, true);
2395 /* scheduled scan clearly can't be running any more, but tell
2396 * cfg80211 and clear local state
2398 ieee80211_sched_scan_end(local);
2400 list_for_each_entry(sdata, &local->interfaces, list)
2401 sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
2403 /* Mark channel contexts as not being in the driver any more to avoid
2404 * removing them from the driver during the shutdown process...
2406 list_for_each_entry(ctx, &local->chanctx_list, list)
2407 ctx->driver_present = false;
2410 static void ieee80211_assign_chanctx(struct ieee80211_local *local,
2411 struct ieee80211_sub_if_data *sdata,
2412 struct ieee80211_link_data *link)
2414 struct ieee80211_chanctx_conf *conf;
2415 struct ieee80211_chanctx *ctx;
2417 lockdep_assert_wiphy(local->hw.wiphy);
2419 if (!local->use_chanctx)
2422 conf = rcu_dereference_protected(link->conf->chanctx_conf,
2423 lockdep_is_held(&local->hw.wiphy->mtx));
2425 ctx = container_of(conf, struct ieee80211_chanctx, conf);
2426 drv_assign_vif_chanctx(local, sdata, link->conf, ctx);
2430 static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data *sdata)
2432 struct ieee80211_local *local = sdata->local;
2433 struct sta_info *sta;
2435 lockdep_assert_wiphy(local->hw.wiphy);
2438 list_for_each_entry(sta, &local->sta_list, list) {
2439 enum ieee80211_sta_state state;
2441 if (!sta->uploaded || sta->sdata != sdata)
2444 for (state = IEEE80211_STA_NOTEXIST;
2445 state < sta->sta_state; state++)
2446 WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
2451 static int ieee80211_reconfig_nan(struct ieee80211_sub_if_data *sdata)
2453 struct cfg80211_nan_func *func, **funcs;
2456 res = drv_start_nan(sdata->local, sdata,
2457 &sdata->u.nan.conf);
2461 funcs = kcalloc(sdata->local->hw.max_nan_de_entries + 1,
2467 /* Add all the functions:
2468 * This is a little bit ugly. We need to call a potentially sleeping
2469 * callback for each NAN function, so we can't hold the spinlock.
2471 spin_lock_bh(&sdata->u.nan.func_lock);
2473 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id)
2476 spin_unlock_bh(&sdata->u.nan.func_lock);
2478 for (i = 0; funcs[i]; i++) {
2479 res = drv_add_nan_func(sdata->local, sdata, funcs[i]);
2481 ieee80211_nan_func_terminated(&sdata->vif,
2482 funcs[i]->instance_id,
2483 NL80211_NAN_FUNC_TERM_REASON_ERROR,
2492 static void ieee80211_reconfig_ap_links(struct ieee80211_local *local,
2493 struct ieee80211_sub_if_data *sdata,
2498 for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) {
2499 struct ieee80211_link_data *link;
2501 if (!(sdata->vif.active_links & BIT(link_id)))
2504 link = sdata_dereference(sdata->link[link_id], sdata);
2508 if (rcu_access_pointer(link->u.ap.beacon))
2509 drv_start_ap(local, sdata, link->conf);
2511 if (!link->conf->enable_beacon)
2514 changed |= BSS_CHANGED_BEACON |
2515 BSS_CHANGED_BEACON_ENABLED;
2517 ieee80211_link_info_change_notify(sdata, link, changed);
2521 int ieee80211_reconfig(struct ieee80211_local *local)
2523 struct ieee80211_hw *hw = &local->hw;
2524 struct ieee80211_sub_if_data *sdata;
2525 struct ieee80211_chanctx *ctx;
2526 struct sta_info *sta;
2528 bool reconfig_due_to_wowlan = false;
2529 struct ieee80211_sub_if_data *sched_scan_sdata;
2530 struct cfg80211_sched_scan_request *sched_scan_req;
2531 bool sched_scan_stopped = false;
2532 bool suspended = local->suspended;
2533 bool in_reconfig = false;
2535 lockdep_assert_wiphy(local->hw.wiphy);
2537 /* nothing to do if HW shouldn't run */
2538 if (!local->open_count)
2543 local->resuming = true;
2545 if (local->wowlan) {
2547 * In the wowlan case, both mac80211 and the device
2548 * are functional when the resume op is called, so
2549 * clear local->suspended so the device could operate
2550 * normally (e.g. pass rx frames).
2552 local->suspended = false;
2553 res = drv_resume(local);
2554 local->wowlan = false;
2556 local->resuming = false;
2563 * res is 1, which means the driver requested
2564 * to go through a regular reset on wakeup.
2565 * restore local->suspended in this case.
2567 reconfig_due_to_wowlan = true;
2568 local->suspended = true;
2573 * In case of hw_restart during suspend (without wowlan),
2574 * cancel restart work, as we are reconfiguring the device
2576 * Note that restart_work is scheduled on a frozen workqueue,
2577 * so we can't deadlock in this case.
2579 if (suspended && local->in_reconfig && !reconfig_due_to_wowlan)
2580 cancel_work_sync(&local->restart_work);
2582 local->started = false;
2585 * Upon resume hardware can sometimes be goofy due to
2586 * various platform / driver / bus issues, so restarting
2587 * the device may at times not work immediately. Propagate
2590 res = drv_start(local);
2593 WARN(1, "Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n");
2595 WARN(1, "Hardware became unavailable during restart.\n");
2596 ieee80211_handle_reconfig_failure(local);
2600 /* setup fragmentation threshold */
2601 drv_set_frag_threshold(local, hw->wiphy->frag_threshold);
2603 /* setup RTS threshold */
2604 drv_set_rts_threshold(local, hw->wiphy->rts_threshold);
2606 /* reset coverage class */
2607 drv_set_coverage_class(local, hw->wiphy->coverage_class);
2609 ieee80211_led_radio(local, true);
2610 ieee80211_mod_tpt_led_trig(local,
2611 IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
2613 /* add interfaces */
2614 sdata = wiphy_dereference(local->hw.wiphy, local->monitor_sdata);
2616 /* in HW restart it exists already */
2617 WARN_ON(local->resuming);
2618 res = drv_add_interface(local, sdata);
2620 RCU_INIT_POINTER(local->monitor_sdata, NULL);
2626 list_for_each_entry(sdata, &local->interfaces, list) {
2627 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
2628 sdata->vif.type != NL80211_IFTYPE_MONITOR &&
2629 ieee80211_sdata_running(sdata)) {
2630 res = drv_add_interface(local, sdata);
2636 /* If adding any of the interfaces failed above, roll back and
2640 list_for_each_entry_continue_reverse(sdata, &local->interfaces,
2642 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
2643 sdata->vif.type != NL80211_IFTYPE_MONITOR &&
2644 ieee80211_sdata_running(sdata))
2645 drv_remove_interface(local, sdata);
2646 ieee80211_handle_reconfig_failure(local);
2650 /* add channel contexts */
2651 if (local->use_chanctx) {
2652 list_for_each_entry(ctx, &local->chanctx_list, list)
2653 if (ctx->replace_state !=
2654 IEEE80211_CHANCTX_REPLACES_OTHER)
2655 WARN_ON(drv_add_chanctx(local, ctx));
2657 sdata = wiphy_dereference(local->hw.wiphy,
2658 local->monitor_sdata);
2659 if (sdata && ieee80211_sdata_running(sdata))
2660 ieee80211_assign_chanctx(local, sdata, &sdata->deflink);
2663 /* reconfigure hardware */
2664 ieee80211_hw_config(local, ~0);
2666 ieee80211_configure_filter(local);
2668 /* Finally also reconfigure all the BSS information */
2669 list_for_each_entry(sdata, &local->interfaces, list) {
2670 /* common change flags for all interface types - link only */
2671 u64 changed = BSS_CHANGED_ERP_CTS_PROT |
2672 BSS_CHANGED_ERP_PREAMBLE |
2673 BSS_CHANGED_ERP_SLOT |
2675 BSS_CHANGED_BASIC_RATES |
2676 BSS_CHANGED_BEACON_INT |
2680 BSS_CHANGED_TXPOWER |
2681 BSS_CHANGED_MCAST_RATE;
2682 struct ieee80211_link_data *link = NULL;
2683 unsigned int link_id;
2684 u32 active_links = 0;
2686 if (!ieee80211_sdata_running(sdata))
2689 if (ieee80211_vif_is_mld(&sdata->vif)) {
2690 struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS] = {
2691 [0] = &sdata->vif.bss_conf,
2694 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
2695 /* start with a single active link */
2696 active_links = sdata->vif.active_links;
2697 link_id = ffs(active_links) - 1;
2698 sdata->vif.active_links = BIT(link_id);
2701 drv_change_vif_links(local, sdata, 0,
2702 sdata->vif.active_links,
2707 link_id < ARRAY_SIZE(sdata->vif.link_conf);
2709 if (ieee80211_vif_is_mld(&sdata->vif) &&
2710 !(sdata->vif.active_links & BIT(link_id)))
2713 link = sdata_dereference(sdata->link[link_id], sdata);
2717 ieee80211_assign_chanctx(local, sdata, link);
2720 switch (sdata->vif.type) {
2721 case NL80211_IFTYPE_AP_VLAN:
2722 case NL80211_IFTYPE_MONITOR:
2724 case NL80211_IFTYPE_ADHOC:
2725 if (sdata->vif.cfg.ibss_joined)
2726 WARN_ON(drv_join_ibss(local, sdata));
2729 ieee80211_reconfig_stations(sdata);
2731 case NL80211_IFTYPE_AP: /* AP stations are handled later */
2732 for (i = 0; i < IEEE80211_NUM_ACS; i++)
2733 drv_conf_tx(local, &sdata->deflink, i,
2734 &sdata->deflink.tx_conf[i]);
2738 if (sdata->vif.bss_conf.mu_mimo_owner)
2739 changed |= BSS_CHANGED_MU_GROUPS;
2741 if (!ieee80211_vif_is_mld(&sdata->vif))
2742 changed |= BSS_CHANGED_IDLE;
2744 switch (sdata->vif.type) {
2745 case NL80211_IFTYPE_STATION:
2746 if (!ieee80211_vif_is_mld(&sdata->vif)) {
2747 changed |= BSS_CHANGED_ASSOC |
2748 BSS_CHANGED_ARP_FILTER |
2751 /* Re-send beacon info report to the driver */
2752 if (sdata->deflink.u.mgd.have_beacon)
2753 changed |= BSS_CHANGED_BEACON_INFO;
2755 if (sdata->vif.bss_conf.max_idle_period ||
2756 sdata->vif.bss_conf.protected_keep_alive)
2757 changed |= BSS_CHANGED_KEEP_ALIVE;
2759 if (sdata->vif.bss_conf.eht_puncturing)
2760 changed |= BSS_CHANGED_EHT_PUNCTURING;
2762 ieee80211_bss_info_change_notify(sdata,
2764 } else if (!WARN_ON(!link)) {
2765 ieee80211_link_info_change_notify(sdata, link,
2767 changed = BSS_CHANGED_ASSOC |
2770 BSS_CHANGED_ARP_FILTER;
2771 ieee80211_vif_cfg_change_notify(sdata, changed);
2774 case NL80211_IFTYPE_OCB:
2775 changed |= BSS_CHANGED_OCB;
2776 ieee80211_bss_info_change_notify(sdata, changed);
2778 case NL80211_IFTYPE_ADHOC:
2779 changed |= BSS_CHANGED_IBSS;
2781 case NL80211_IFTYPE_AP:
2782 changed |= BSS_CHANGED_P2P_PS;
2784 if (ieee80211_vif_is_mld(&sdata->vif))
2785 ieee80211_vif_cfg_change_notify(sdata,
2788 changed |= BSS_CHANGED_SSID;
2790 if (sdata->vif.bss_conf.ftm_responder == 1 &&
2791 wiphy_ext_feature_isset(sdata->local->hw.wiphy,
2792 NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
2793 changed |= BSS_CHANGED_FTM_RESPONDER;
2795 if (sdata->vif.type == NL80211_IFTYPE_AP) {
2796 changed |= BSS_CHANGED_AP_PROBE_RESP;
2798 if (ieee80211_vif_is_mld(&sdata->vif)) {
2799 ieee80211_reconfig_ap_links(local,
2805 if (rcu_access_pointer(sdata->deflink.u.ap.beacon))
2806 drv_start_ap(local, sdata,
2807 sdata->deflink.conf);
2810 case NL80211_IFTYPE_MESH_POINT:
2811 if (sdata->vif.bss_conf.enable_beacon) {
2812 changed |= BSS_CHANGED_BEACON |
2813 BSS_CHANGED_BEACON_ENABLED;
2814 ieee80211_bss_info_change_notify(sdata, changed);
2817 case NL80211_IFTYPE_NAN:
2818 res = ieee80211_reconfig_nan(sdata);
2820 ieee80211_handle_reconfig_failure(local);
2824 case NL80211_IFTYPE_AP_VLAN:
2825 case NL80211_IFTYPE_MONITOR:
2826 case NL80211_IFTYPE_P2P_DEVICE:
2829 case NL80211_IFTYPE_UNSPECIFIED:
2830 case NUM_NL80211_IFTYPES:
2831 case NL80211_IFTYPE_P2P_CLIENT:
2832 case NL80211_IFTYPE_P2P_GO:
2833 case NL80211_IFTYPE_WDS:
2839 ieee80211_set_active_links(&sdata->vif, active_links);
2842 ieee80211_recalc_ps(local);
2845 * The sta might be in psm against the ap (e.g. because
2846 * this was the state before a hw restart), so we
2847 * explicitly send a null packet in order to make sure
2848 * it'll sync against the ap (and get out of psm).
2850 if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) {
2851 list_for_each_entry(sdata, &local->interfaces, list) {
2852 if (sdata->vif.type != NL80211_IFTYPE_STATION)
2854 if (!sdata->u.mgd.associated)
2857 ieee80211_send_nullfunc(local, sdata, false);
2861 /* APs are now beaconing, add back stations */
2862 list_for_each_entry(sdata, &local->interfaces, list) {
2863 if (!ieee80211_sdata_running(sdata))
2866 switch (sdata->vif.type) {
2867 case NL80211_IFTYPE_AP_VLAN:
2868 case NL80211_IFTYPE_AP:
2869 ieee80211_reconfig_stations(sdata);
2877 list_for_each_entry(sdata, &local->interfaces, list)
2878 ieee80211_reenable_keys(sdata);
2880 /* Reconfigure sched scan if it was interrupted by FW restart */
2881 sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata,
2882 lockdep_is_held(&local->hw.wiphy->mtx));
2883 sched_scan_req = rcu_dereference_protected(local->sched_scan_req,
2884 lockdep_is_held(&local->hw.wiphy->mtx));
2885 if (sched_scan_sdata && sched_scan_req)
2887 * Sched scan stopped, but we don't want to report it. Instead,
2888 * we're trying to reschedule. However, if more than one scan
2889 * plan was set, we cannot reschedule since we don't know which
2890 * scan plan was currently running (and some scan plans may have
2891 * already finished).
2893 if (sched_scan_req->n_scan_plans > 1 ||
2894 __ieee80211_request_sched_scan_start(sched_scan_sdata,
2896 RCU_INIT_POINTER(local->sched_scan_sdata, NULL);
2897 RCU_INIT_POINTER(local->sched_scan_req, NULL);
2898 sched_scan_stopped = true;
2901 if (sched_scan_stopped)
2902 cfg80211_sched_scan_stopped_locked(local->hw.wiphy, 0);
2906 if (local->monitors == local->open_count && local->monitors > 0)
2907 ieee80211_add_virtual_monitor(local);
2910 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
2911 * sessions can be established after a resume.
2913 * Also tear down aggregation sessions since reconfiguring
2914 * them in a hardware restart scenario is not easily done
2915 * right now, and the hardware will have lost information
2916 * about the sessions, but we and the AP still think they
2917 * are active. This is really a workaround though.
2919 if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
2920 list_for_each_entry(sta, &local->sta_list, list) {
2921 if (!local->resuming)
2922 ieee80211_sta_tear_down_BA_sessions(
2923 sta, AGG_STOP_LOCAL_REQUEST);
2924 clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
2929 * If this is for hw restart things are still running.
2930 * We may want to change that later, however.
2932 if (local->open_count && (!suspended || reconfig_due_to_wowlan))
2933 drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART);
2935 if (local->in_reconfig) {
2936 in_reconfig = local->in_reconfig;
2937 local->in_reconfig = false;
2940 /* Restart deferred ROCs */
2941 ieee80211_start_next_roc(local);
2943 /* Requeue all works */
2944 list_for_each_entry(sdata, &local->interfaces, list)
2945 wiphy_work_queue(local->hw.wiphy, &sdata->work);
2948 ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
2949 IEEE80211_QUEUE_STOP_REASON_SUSPEND,
2953 list_for_each_entry(sdata, &local->interfaces, list) {
2954 if (!ieee80211_sdata_running(sdata))
2956 if (sdata->vif.type == NL80211_IFTYPE_STATION)
2957 ieee80211_sta_restart(sdata);
2965 /* first set suspended false, then resuming */
2966 local->suspended = false;
2968 local->resuming = false;
2970 ieee80211_flush_completed_scan(local, false);
2972 if (local->open_count && !reconfig_due_to_wowlan)
2973 drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_SUSPEND);
2975 list_for_each_entry(sdata, &local->interfaces, list) {
2976 if (!ieee80211_sdata_running(sdata))
2978 if (sdata->vif.type == NL80211_IFTYPE_STATION)
2979 ieee80211_sta_restart(sdata);
2982 mod_timer(&local->sta_cleanup, jiffies + 1);
2990 static void ieee80211_reconfig_disconnect(struct ieee80211_vif *vif, u8 flag)
2992 struct ieee80211_sub_if_data *sdata;
2993 struct ieee80211_local *local;
2994 struct ieee80211_key *key;
2999 sdata = vif_to_sdata(vif);
3000 local = sdata->local;
3002 lockdep_assert_wiphy(local->hw.wiphy);
3004 if (WARN_ON(flag & IEEE80211_SDATA_DISCONNECT_RESUME &&
3008 if (WARN_ON(flag & IEEE80211_SDATA_DISCONNECT_HW_RESTART &&
3009 !local->in_reconfig))
3012 if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
3015 sdata->flags |= flag;
3017 list_for_each_entry(key, &sdata->key_list, list)
3018 key->flags |= KEY_FLAG_TAINTED;
3021 void ieee80211_hw_restart_disconnect(struct ieee80211_vif *vif)
3023 ieee80211_reconfig_disconnect(vif, IEEE80211_SDATA_DISCONNECT_HW_RESTART);
3025 EXPORT_SYMBOL_GPL(ieee80211_hw_restart_disconnect);
3027 void ieee80211_resume_disconnect(struct ieee80211_vif *vif)
3029 ieee80211_reconfig_disconnect(vif, IEEE80211_SDATA_DISCONNECT_RESUME);
3031 EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect);
3033 void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata,
3034 struct ieee80211_link_data *link)
3036 struct ieee80211_local *local = sdata->local;
3037 struct ieee80211_chanctx_conf *chanctx_conf;
3038 struct ieee80211_chanctx *chanctx;
3040 lockdep_assert_wiphy(local->hw.wiphy);
3042 chanctx_conf = rcu_dereference_protected(link->conf->chanctx_conf,
3043 lockdep_is_held(&local->hw.wiphy->mtx));
3046 * This function can be called from a work, thus it may be possible
3047 * that the chanctx_conf is removed (due to a disconnection, for
3049 * So nothing should be done in such case.
3054 chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
3055 ieee80211_recalc_smps_chanctx(local, chanctx);
3058 void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata,
3061 struct ieee80211_local *local = sdata->local;
3062 struct ieee80211_chanctx_conf *chanctx_conf;
3063 struct ieee80211_chanctx *chanctx;
3066 lockdep_assert_wiphy(local->hw.wiphy);
3068 for (i = 0; i < ARRAY_SIZE(sdata->vif.link_conf); i++) {
3069 struct ieee80211_bss_conf *bss_conf;
3071 if (link_id >= 0 && link_id != i)
3075 bss_conf = rcu_dereference(sdata->vif.link_conf[i]);
3081 chanctx_conf = rcu_dereference_protected(bss_conf->chanctx_conf,
3082 lockdep_is_held(&local->hw.wiphy->mtx));
3084 * Since we hold the wiphy mutex (checked above)
3085 * we can take the chanctx_conf pointer out of the
3086 * RCU critical section, it cannot go away without
3087 * the mutex. Just the way we reached it could - in
3088 * theory - go away, but we don't really care and
3089 * it really shouldn't happen anyway.
3096 chanctx = container_of(chanctx_conf, struct ieee80211_chanctx,
3098 ieee80211_recalc_chanctx_min_def(local, chanctx, NULL);
3102 size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
3104 size_t pos = offset;
3106 while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC)
3107 pos += 2 + ies[pos + 1];
3112 u8 *ieee80211_ie_build_s1g_cap(u8 *pos, struct ieee80211_sta_s1g_cap *s1g_cap)
3114 *pos++ = WLAN_EID_S1G_CAPABILITIES;
3115 *pos++ = sizeof(struct ieee80211_s1g_cap);
3116 memset(pos, 0, sizeof(struct ieee80211_s1g_cap));
3118 memcpy(pos, &s1g_cap->cap, sizeof(s1g_cap->cap));
3119 pos += sizeof(s1g_cap->cap);
3121 memcpy(pos, &s1g_cap->nss_mcs, sizeof(s1g_cap->nss_mcs));
3122 pos += sizeof(s1g_cap->nss_mcs);
3127 u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
3132 *pos++ = WLAN_EID_HT_CAPABILITY;
3133 *pos++ = sizeof(struct ieee80211_ht_cap);
3134 memset(pos, 0, sizeof(struct ieee80211_ht_cap));
3136 /* capability flags */
3137 tmp = cpu_to_le16(cap);
3138 memcpy(pos, &tmp, sizeof(u16));
3141 /* AMPDU parameters */
3142 *pos++ = ht_cap->ampdu_factor |
3143 (ht_cap->ampdu_density <<
3144 IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
3147 memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs));
3148 pos += sizeof(ht_cap->mcs);
3150 /* extended capabilities */
3151 pos += sizeof(__le16);
3153 /* BF capabilities */
3154 pos += sizeof(__le32);
3156 /* antenna selection */
3162 u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
3167 *pos++ = WLAN_EID_VHT_CAPABILITY;
3168 *pos++ = sizeof(struct ieee80211_vht_cap);
3169 memset(pos, 0, sizeof(struct ieee80211_vht_cap));
3171 /* capability flags */
3172 tmp = cpu_to_le32(cap);
3173 memcpy(pos, &tmp, sizeof(u32));
3177 memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs));
3178 pos += sizeof(vht_cap->vht_mcs);
3183 u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype)
3185 const struct ieee80211_sta_he_cap *he_cap;
3186 struct ieee80211_supported_band *sband;
3189 sband = ieee80211_get_sband(sdata);
3193 he_cap = ieee80211_get_he_iftype_cap(sband, iftype);
3197 n = ieee80211_he_mcs_nss_size(&he_cap->he_cap_elem);
3199 sizeof(he_cap->he_cap_elem) + n +
3200 ieee80211_he_ppe_size(he_cap->ppe_thres[0],
3201 he_cap->he_cap_elem.phy_cap_info);
3204 u8 *ieee80211_ie_build_he_cap(ieee80211_conn_flags_t disable_flags, u8 *pos,
3205 const struct ieee80211_sta_he_cap *he_cap,
3208 struct ieee80211_he_cap_elem elem;
3213 /* Make sure we have place for the IE */
3215 * TODO: the 1 added is because this temporarily is under the EXTENSION
3216 * IE. Get rid of it when it moves.
3221 /* modify on stack first to calculate 'n' and 'ie_len' correctly */
3222 elem = he_cap->he_cap_elem;
3224 if (disable_flags & IEEE80211_CONN_DISABLE_40MHZ)
3225 elem.phy_cap_info[0] &=
3226 ~(IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3227 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G);
3229 if (disable_flags & IEEE80211_CONN_DISABLE_160MHZ)
3230 elem.phy_cap_info[0] &=
3231 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
3233 if (disable_flags & IEEE80211_CONN_DISABLE_80P80MHZ)
3234 elem.phy_cap_info[0] &=
3235 ~IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
3237 n = ieee80211_he_mcs_nss_size(&elem);
3239 sizeof(he_cap->he_cap_elem) + n +
3240 ieee80211_he_ppe_size(he_cap->ppe_thres[0],
3241 he_cap->he_cap_elem.phy_cap_info);
3243 if ((end - pos) < ie_len)
3246 *pos++ = WLAN_EID_EXTENSION;
3247 pos++; /* We'll set the size later below */
3248 *pos++ = WLAN_EID_EXT_HE_CAPABILITY;
3251 memcpy(pos, &elem, sizeof(elem));
3252 pos += sizeof(elem);
3254 memcpy(pos, &he_cap->he_mcs_nss_supp, n);
3257 /* Check if PPE Threshold should be present */
3258 if ((he_cap->he_cap_elem.phy_cap_info[6] &
3259 IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0)
3263 * Calculate how many PPET16/PPET8 pairs are to come. Algorithm:
3264 * (NSS_M1 + 1) x (num of 1 bits in RU_INDEX_BITMASK)
3266 n = hweight8(he_cap->ppe_thres[0] &
3267 IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
3268 n *= (1 + ((he_cap->ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) >>
3269 IEEE80211_PPE_THRES_NSS_POS));
3272 * Each pair is 6 bits, and we need to add the 7 "header" bits to the
3275 n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7;
3276 n = DIV_ROUND_UP(n, 8);
3278 /* Copy PPE Thresholds */
3279 memcpy(pos, &he_cap->ppe_thres, n);
3283 orig_pos[1] = (pos - orig_pos) - 2;
3287 void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
3288 enum ieee80211_smps_mode smps_mode,
3289 struct sk_buff *skb)
3291 struct ieee80211_supported_band *sband;
3292 const struct ieee80211_sband_iftype_data *iftd;
3293 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
3297 if (!cfg80211_any_usable_channels(sdata->local->hw.wiphy,
3298 BIT(NL80211_BAND_6GHZ),
3299 IEEE80211_CHAN_NO_HE))
3302 sband = sdata->local->hw.wiphy->bands[NL80211_BAND_6GHZ];
3304 iftd = ieee80211_get_sband_iftype_data(sband, iftype);
3308 /* Check for device HE 6 GHz capability before adding element */
3309 if (!iftd->he_6ghz_capa.capa)
3312 cap = le16_to_cpu(iftd->he_6ghz_capa.capa);
3313 cap &= ~IEEE80211_HE_6GHZ_CAP_SM_PS;
3315 switch (smps_mode) {
3316 case IEEE80211_SMPS_AUTOMATIC:
3317 case IEEE80211_SMPS_NUM_MODES:
3320 case IEEE80211_SMPS_OFF:
3321 cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
3322 IEEE80211_HE_6GHZ_CAP_SM_PS);
3324 case IEEE80211_SMPS_STATIC:
3325 cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_STATIC,
3326 IEEE80211_HE_6GHZ_CAP_SM_PS);
3328 case IEEE80211_SMPS_DYNAMIC:
3329 cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
3330 IEEE80211_HE_6GHZ_CAP_SM_PS);
3334 pos = skb_put(skb, 2 + 1 + sizeof(cap));
3335 ieee80211_write_he_6ghz_cap(pos, cpu_to_le16(cap),
3336 pos + 2 + 1 + sizeof(cap));
3339 u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
3340 const struct cfg80211_chan_def *chandef,
3341 u16 prot_mode, bool rifs_mode)
3343 struct ieee80211_ht_operation *ht_oper;
3344 /* Build HT Information */
3345 *pos++ = WLAN_EID_HT_OPERATION;
3346 *pos++ = sizeof(struct ieee80211_ht_operation);
3347 ht_oper = (struct ieee80211_ht_operation *)pos;
3348 ht_oper->primary_chan = ieee80211_frequency_to_channel(
3349 chandef->chan->center_freq);
3350 switch (chandef->width) {
3351 case NL80211_CHAN_WIDTH_160:
3352 case NL80211_CHAN_WIDTH_80P80:
3353 case NL80211_CHAN_WIDTH_80:
3354 case NL80211_CHAN_WIDTH_40:
3355 if (chandef->center_freq1 > chandef->chan->center_freq)
3356 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
3358 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
3360 case NL80211_CHAN_WIDTH_320:
3361 /* HT information element should not be included on 6GHz */
3365 ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
3368 if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 &&
3369 chandef->width != NL80211_CHAN_WIDTH_20_NOHT &&
3370 chandef->width != NL80211_CHAN_WIDTH_20)
3371 ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
3374 ht_oper->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
3376 ht_oper->operation_mode = cpu_to_le16(prot_mode);
3377 ht_oper->stbc_param = 0x0000;
3379 /* It seems that Basic MCS set and Supported MCS set
3380 are identical for the first 10 bytes */
3381 memset(&ht_oper->basic_set, 0, 16);
3382 memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10);
3384 return pos + sizeof(struct ieee80211_ht_operation);
3387 void ieee80211_ie_build_wide_bw_cs(u8 *pos,
3388 const struct cfg80211_chan_def *chandef)
3390 *pos++ = WLAN_EID_WIDE_BW_CHANNEL_SWITCH; /* EID */
3391 *pos++ = 3; /* IE length */
3392 /* New channel width */
3393 switch (chandef->width) {
3394 case NL80211_CHAN_WIDTH_80:
3395 *pos++ = IEEE80211_VHT_CHANWIDTH_80MHZ;
3397 case NL80211_CHAN_WIDTH_160:
3398 *pos++ = IEEE80211_VHT_CHANWIDTH_160MHZ;
3400 case NL80211_CHAN_WIDTH_80P80:
3401 *pos++ = IEEE80211_VHT_CHANWIDTH_80P80MHZ;
3403 case NL80211_CHAN_WIDTH_320:
3404 /* The behavior is not defined for 320 MHz channels */
3408 *pos++ = IEEE80211_VHT_CHANWIDTH_USE_HT;
3411 /* new center frequency segment 0 */
3412 *pos++ = ieee80211_frequency_to_channel(chandef->center_freq1);
3413 /* new center frequency segment 1 */
3414 if (chandef->center_freq2)
3415 *pos++ = ieee80211_frequency_to_channel(chandef->center_freq2);
3420 u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
3421 const struct cfg80211_chan_def *chandef)
3423 struct ieee80211_vht_operation *vht_oper;
3425 *pos++ = WLAN_EID_VHT_OPERATION;
3426 *pos++ = sizeof(struct ieee80211_vht_operation);
3427 vht_oper = (struct ieee80211_vht_operation *)pos;
3428 vht_oper->center_freq_seg0_idx = ieee80211_frequency_to_channel(
3429 chandef->center_freq1);
3430 if (chandef->center_freq2)
3431 vht_oper->center_freq_seg1_idx =
3432 ieee80211_frequency_to_channel(chandef->center_freq2);
3434 vht_oper->center_freq_seg1_idx = 0x00;
3436 switch (chandef->width) {
3437 case NL80211_CHAN_WIDTH_160:
3439 * Convert 160 MHz channel width to new style as interop
3442 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
3443 vht_oper->center_freq_seg1_idx = vht_oper->center_freq_seg0_idx;
3444 if (chandef->chan->center_freq < chandef->center_freq1)
3445 vht_oper->center_freq_seg0_idx -= 8;
3447 vht_oper->center_freq_seg0_idx += 8;
3449 case NL80211_CHAN_WIDTH_80P80:
3451 * Convert 80+80 MHz channel width to new style as interop
3454 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
3456 case NL80211_CHAN_WIDTH_80:
3457 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
3459 case NL80211_CHAN_WIDTH_320:
3460 /* VHT information element should not be included on 6GHz */
3464 vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT;
3468 /* don't require special VHT peer rates */
3469 vht_oper->basic_mcs_set = cpu_to_le16(0xffff);
3471 return pos + sizeof(struct ieee80211_vht_operation);
3474 u8 *ieee80211_ie_build_he_oper(u8 *pos, struct cfg80211_chan_def *chandef)
3476 struct ieee80211_he_operation *he_oper;
3477 struct ieee80211_he_6ghz_oper *he_6ghz_op;
3479 u8 ie_len = 1 + sizeof(struct ieee80211_he_operation);
3481 if (chandef->chan->band == NL80211_BAND_6GHZ)
3482 ie_len += sizeof(struct ieee80211_he_6ghz_oper);
3484 *pos++ = WLAN_EID_EXTENSION;
3486 *pos++ = WLAN_EID_EXT_HE_OPERATION;
3489 he_oper_params |= u32_encode_bits(1023, /* disabled */
3490 IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
3491 he_oper_params |= u32_encode_bits(1,
3492 IEEE80211_HE_OPERATION_ER_SU_DISABLE);
3493 he_oper_params |= u32_encode_bits(1,
3494 IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED);
3495 if (chandef->chan->band == NL80211_BAND_6GHZ)
3496 he_oper_params |= u32_encode_bits(1,
3497 IEEE80211_HE_OPERATION_6GHZ_OP_INFO);
3499 he_oper = (struct ieee80211_he_operation *)pos;
3500 he_oper->he_oper_params = cpu_to_le32(he_oper_params);
3502 /* don't require special HE peer rates */
3503 he_oper->he_mcs_nss_set = cpu_to_le16(0xffff);
3504 pos += sizeof(struct ieee80211_he_operation);
3506 if (chandef->chan->band != NL80211_BAND_6GHZ)
3509 /* TODO add VHT operational */
3510 he_6ghz_op = (struct ieee80211_he_6ghz_oper *)pos;
3511 he_6ghz_op->minrate = 6; /* 6 Mbps */
3512 he_6ghz_op->primary =
3513 ieee80211_frequency_to_channel(chandef->chan->center_freq);
3515 ieee80211_frequency_to_channel(chandef->center_freq1);
3516 if (chandef->center_freq2)
3518 ieee80211_frequency_to_channel(chandef->center_freq2);
3520 he_6ghz_op->ccfs1 = 0;
3522 switch (chandef->width) {
3523 case NL80211_CHAN_WIDTH_320:
3525 * TODO: mesh operation is not defined over 6GHz 320 MHz
3530 case NL80211_CHAN_WIDTH_160:
3531 /* Convert 160 MHz channel width to new style as interop
3534 he_6ghz_op->control =
3535 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
3536 he_6ghz_op->ccfs1 = he_6ghz_op->ccfs0;
3537 if (chandef->chan->center_freq < chandef->center_freq1)
3538 he_6ghz_op->ccfs0 -= 8;
3540 he_6ghz_op->ccfs0 += 8;
3542 case NL80211_CHAN_WIDTH_80P80:
3543 he_6ghz_op->control =
3544 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
3546 case NL80211_CHAN_WIDTH_80:
3547 he_6ghz_op->control =
3548 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ;
3550 case NL80211_CHAN_WIDTH_40:
3551 he_6ghz_op->control =
3552 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ;
3555 he_6ghz_op->control =
3556 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ;
3560 pos += sizeof(struct ieee80211_he_6ghz_oper);
3566 u8 *ieee80211_ie_build_eht_oper(u8 *pos, struct cfg80211_chan_def *chandef,
3567 const struct ieee80211_sta_eht_cap *eht_cap)
3570 const struct ieee80211_eht_mcs_nss_supp_20mhz_only *eht_mcs_nss =
3571 &eht_cap->eht_mcs_nss_supp.only_20mhz;
3572 struct ieee80211_eht_operation *eht_oper;
3573 struct ieee80211_eht_operation_info *eht_oper_info;
3574 u8 eht_oper_len = offsetof(struct ieee80211_eht_operation, optional);
3575 u8 eht_oper_info_len =
3576 offsetof(struct ieee80211_eht_operation_info, optional);
3579 *pos++ = WLAN_EID_EXTENSION;
3580 *pos++ = 1 + eht_oper_len + eht_oper_info_len;
3581 *pos++ = WLAN_EID_EXT_EHT_OPERATION;
3583 eht_oper = (struct ieee80211_eht_operation *)pos;
3585 memcpy(&eht_oper->basic_mcs_nss, eht_mcs_nss, sizeof(*eht_mcs_nss));
3586 eht_oper->params |= IEEE80211_EHT_OPER_INFO_PRESENT;
3587 pos += eht_oper_len;
3590 (struct ieee80211_eht_operation_info *)eht_oper->optional;
3592 eht_oper_info->ccfs0 =
3593 ieee80211_frequency_to_channel(chandef->center_freq1);
3594 if (chandef->center_freq2)
3595 eht_oper_info->ccfs1 =
3596 ieee80211_frequency_to_channel(chandef->center_freq2);
3598 eht_oper_info->ccfs1 = 0;
3600 switch (chandef->width) {
3601 case NL80211_CHAN_WIDTH_320:
3602 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ;
3603 eht_oper_info->ccfs1 = eht_oper_info->ccfs0;
3604 if (chandef->chan->center_freq < chandef->center_freq1)
3605 eht_oper_info->ccfs0 -= 16;
3607 eht_oper_info->ccfs0 += 16;
3609 case NL80211_CHAN_WIDTH_160:
3610 eht_oper_info->ccfs1 = eht_oper_info->ccfs0;
3611 if (chandef->chan->center_freq < chandef->center_freq1)
3612 eht_oper_info->ccfs0 -= 8;
3614 eht_oper_info->ccfs0 += 8;
3616 case NL80211_CHAN_WIDTH_80P80:
3617 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ;
3619 case NL80211_CHAN_WIDTH_80:
3620 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ;
3622 case NL80211_CHAN_WIDTH_40:
3623 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ;
3626 chan_width = IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ;
3629 eht_oper_info->control = chan_width;
3630 pos += eht_oper_info_len;
3632 /* TODO: eht_oper_info->optional */
3637 bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
3638 struct cfg80211_chan_def *chandef)
3640 enum nl80211_channel_type channel_type;
3645 switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
3646 case IEEE80211_HT_PARAM_CHA_SEC_NONE:
3647 channel_type = NL80211_CHAN_HT20;
3649 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
3650 channel_type = NL80211_CHAN_HT40PLUS;
3652 case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
3653 channel_type = NL80211_CHAN_HT40MINUS;
3659 cfg80211_chandef_create(chandef, chandef->chan, channel_type);
3663 bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, u32 vht_cap_info,
3664 const struct ieee80211_vht_operation *oper,
3665 const struct ieee80211_ht_operation *htop,
3666 struct cfg80211_chan_def *chandef)
3668 struct cfg80211_chan_def new = *chandef;
3670 int ccfs0, ccfs1, ccfs2;
3673 bool support_80_80 = false;
3674 bool support_160 = false;
3675 u8 ext_nss_bw_supp = u32_get_bits(vht_cap_info,
3676 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
3677 u8 supp_chwidth = u32_get_bits(vht_cap_info,
3678 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK);
3683 vht_cap = hw->wiphy->bands[chandef->chan->band]->vht_cap.cap;
3684 support_160 = (vht_cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK |
3685 IEEE80211_VHT_CAP_EXT_NSS_BW_MASK));
3686 support_80_80 = ((vht_cap &
3687 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) ||
3688 (vht_cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
3689 vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) ||
3690 ((vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
3691 IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT > 1));
3692 ccfs0 = oper->center_freq_seg0_idx;
3693 ccfs1 = oper->center_freq_seg1_idx;
3694 ccfs2 = (le16_to_cpu(htop->operation_mode) &
3695 IEEE80211_HT_OP_MODE_CCFS2_MASK)
3696 >> IEEE80211_HT_OP_MODE_CCFS2_SHIFT;
3700 /* if not supported, parse as though we didn't understand it */
3701 if (!ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW))
3702 ext_nss_bw_supp = 0;
3705 * Cf. IEEE 802.11 Table 9-250
3707 * We really just consider that because it's inefficient to connect
3708 * at a higher bandwidth than we'll actually be able to use.
3710 switch ((supp_chwidth << 4) | ext_nss_bw_supp) {
3714 support_160 = false;
3715 support_80_80 = false;
3718 support_80_80 = false;
3741 cf0 = ieee80211_channel_to_frequency(ccf0, chandef->chan->band);
3742 cf1 = ieee80211_channel_to_frequency(ccf1, chandef->chan->band);
3744 switch (oper->chan_width) {
3745 case IEEE80211_VHT_CHANWIDTH_USE_HT:
3746 /* just use HT information directly */
3748 case IEEE80211_VHT_CHANWIDTH_80MHZ:
3749 new.width = NL80211_CHAN_WIDTH_80;
3750 new.center_freq1 = cf0;
3751 /* If needed, adjust based on the newer interop workaround. */
3755 diff = abs(ccf1 - ccf0);
3756 if ((diff == 8) && support_160) {
3757 new.width = NL80211_CHAN_WIDTH_160;
3758 new.center_freq1 = cf1;
3759 } else if ((diff > 8) && support_80_80) {
3760 new.width = NL80211_CHAN_WIDTH_80P80;
3761 new.center_freq2 = cf1;
3765 case IEEE80211_VHT_CHANWIDTH_160MHZ:
3766 /* deprecated encoding */
3767 new.width = NL80211_CHAN_WIDTH_160;
3768 new.center_freq1 = cf0;
3770 case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
3771 /* deprecated encoding */
3772 new.width = NL80211_CHAN_WIDTH_80P80;
3773 new.center_freq1 = cf0;
3774 new.center_freq2 = cf1;
3780 if (!cfg80211_chandef_valid(&new))
3787 void ieee80211_chandef_eht_oper(const struct ieee80211_eht_operation_info *info,
3788 bool support_160, bool support_320,
3789 struct cfg80211_chan_def *chandef)
3791 chandef->center_freq1 =
3792 ieee80211_channel_to_frequency(info->ccfs0,
3793 chandef->chan->band);
3795 switch (u8_get_bits(info->control,
3796 IEEE80211_EHT_OPER_CHAN_WIDTH)) {
3797 case IEEE80211_EHT_OPER_CHAN_WIDTH_20MHZ:
3798 chandef->width = NL80211_CHAN_WIDTH_20;
3800 case IEEE80211_EHT_OPER_CHAN_WIDTH_40MHZ:
3801 chandef->width = NL80211_CHAN_WIDTH_40;
3803 case IEEE80211_EHT_OPER_CHAN_WIDTH_80MHZ:
3804 chandef->width = NL80211_CHAN_WIDTH_80;
3806 case IEEE80211_EHT_OPER_CHAN_WIDTH_160MHZ:
3808 chandef->width = NL80211_CHAN_WIDTH_160;
3809 chandef->center_freq1 =
3810 ieee80211_channel_to_frequency(info->ccfs1,
3811 chandef->chan->band);
3813 chandef->width = NL80211_CHAN_WIDTH_80;
3816 case IEEE80211_EHT_OPER_CHAN_WIDTH_320MHZ:
3818 chandef->width = NL80211_CHAN_WIDTH_320;
3819 chandef->center_freq1 =
3820 ieee80211_channel_to_frequency(info->ccfs1,
3821 chandef->chan->band);
3822 } else if (support_160) {
3823 chandef->width = NL80211_CHAN_WIDTH_160;
3825 chandef->width = NL80211_CHAN_WIDTH_80;
3827 if (chandef->center_freq1 > chandef->chan->center_freq)
3828 chandef->center_freq1 -= 40;
3830 chandef->center_freq1 += 40;
3836 bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_sub_if_data *sdata,
3837 const struct ieee80211_he_operation *he_oper,
3838 const struct ieee80211_eht_operation *eht_oper,
3839 struct cfg80211_chan_def *chandef)
3841 struct ieee80211_local *local = sdata->local;
3842 struct ieee80211_supported_band *sband;
3843 enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
3844 const struct ieee80211_sta_he_cap *he_cap;
3845 const struct ieee80211_sta_eht_cap *eht_cap;
3846 struct cfg80211_chan_def he_chandef = *chandef;
3847 const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
3848 struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
3849 bool support_80_80, support_160, support_320;
3850 u8 he_phy_cap, eht_phy_cap;
3853 if (chandef->chan->band != NL80211_BAND_6GHZ)
3856 sband = local->hw.wiphy->bands[NL80211_BAND_6GHZ];
3858 he_cap = ieee80211_get_he_iftype_cap(sband, iftype);
3860 sdata_info(sdata, "Missing iftype sband data/HE cap");
3864 he_phy_cap = he_cap->he_cap_elem.phy_cap_info[0];
3867 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
3870 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
3874 "HE is not advertised on (on %d MHz), expect issues\n",
3875 chandef->chan->center_freq);
3879 eht_cap = ieee80211_get_eht_iftype_cap(sband, iftype);
3883 he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
3885 if (!he_6ghz_oper) {
3887 "HE 6GHz operation missing (on %d MHz), expect issues\n",
3888 chandef->chan->center_freq);
3893 * The EHT operation IE does not contain the primary channel so the
3894 * primary channel frequency should be taken from the 6 GHz operation
3897 freq = ieee80211_channel_to_frequency(he_6ghz_oper->primary,
3899 he_chandef.chan = ieee80211_get_channel(sdata->local->hw.wiphy, freq);
3901 switch (u8_get_bits(he_6ghz_oper->control,
3902 IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) {
3903 case IEEE80211_6GHZ_CTRL_REG_LPI_AP:
3904 bss_conf->power_type = IEEE80211_REG_LPI_AP;
3906 case IEEE80211_6GHZ_CTRL_REG_SP_AP:
3907 bss_conf->power_type = IEEE80211_REG_SP_AP;
3910 bss_conf->power_type = IEEE80211_REG_UNSET_AP;
3915 !(eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT)) {
3916 switch (u8_get_bits(he_6ghz_oper->control,
3917 IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH)) {
3918 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ:
3919 he_chandef.width = NL80211_CHAN_WIDTH_20;
3921 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ:
3922 he_chandef.width = NL80211_CHAN_WIDTH_40;
3924 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ:
3925 he_chandef.width = NL80211_CHAN_WIDTH_80;
3927 case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ:
3928 he_chandef.width = NL80211_CHAN_WIDTH_80;
3929 if (!he_6ghz_oper->ccfs1)
3931 if (abs(he_6ghz_oper->ccfs1 - he_6ghz_oper->ccfs0) == 8) {
3933 he_chandef.width = NL80211_CHAN_WIDTH_160;
3936 he_chandef.width = NL80211_CHAN_WIDTH_80P80;
3941 if (he_chandef.width == NL80211_CHAN_WIDTH_160) {
3942 he_chandef.center_freq1 =
3943 ieee80211_channel_to_frequency(he_6ghz_oper->ccfs1,
3946 he_chandef.center_freq1 =
3947 ieee80211_channel_to_frequency(he_6ghz_oper->ccfs0,
3949 if (support_80_80 || support_160)
3950 he_chandef.center_freq2 =
3951 ieee80211_channel_to_frequency(he_6ghz_oper->ccfs1,
3955 eht_phy_cap = eht_cap->eht_cap_elem.phy_cap_info[0];
3957 eht_phy_cap & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ;
3959 ieee80211_chandef_eht_oper((const void *)eht_oper->optional,
3960 support_160, support_320,
3964 if (!cfg80211_chandef_valid(&he_chandef)) {
3966 "HE 6GHz operation resulted in invalid chandef: %d MHz/%d/%d MHz/%d MHz\n",
3967 he_chandef.chan ? he_chandef.chan->center_freq : 0,
3969 he_chandef.center_freq1,
3970 he_chandef.center_freq2);
3974 *chandef = he_chandef;
3979 bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie *oper,
3980 struct cfg80211_chan_def *chandef)
3987 switch (FIELD_GET(S1G_OPER_CH_WIDTH_OPER, oper->ch_width)) {
3988 case IEEE80211_S1G_CHANWIDTH_1MHZ:
3989 chandef->width = NL80211_CHAN_WIDTH_1;
3991 case IEEE80211_S1G_CHANWIDTH_2MHZ:
3992 chandef->width = NL80211_CHAN_WIDTH_2;
3994 case IEEE80211_S1G_CHANWIDTH_4MHZ:
3995 chandef->width = NL80211_CHAN_WIDTH_4;
3997 case IEEE80211_S1G_CHANWIDTH_8MHZ:
3998 chandef->width = NL80211_CHAN_WIDTH_8;
4000 case IEEE80211_S1G_CHANWIDTH_16MHZ:
4001 chandef->width = NL80211_CHAN_WIDTH_16;
4007 oper_freq = ieee80211_channel_to_freq_khz(oper->oper_ch,
4008 NL80211_BAND_S1GHZ);
4009 chandef->center_freq1 = KHZ_TO_MHZ(oper_freq);
4010 chandef->freq1_offset = oper_freq % 1000;
4015 int ieee80211_parse_bitrates(enum nl80211_chan_width width,
4016 const struct ieee80211_supported_band *sband,
4017 const u8 *srates, int srates_len, u32 *rates)
4019 u32 rate_flags = ieee80211_chanwidth_rate_flags(width);
4020 struct ieee80211_rate *br;
4021 int brate, rate, i, j, count = 0;
4025 for (i = 0; i < srates_len; i++) {
4026 rate = srates[i] & 0x7f;
4028 for (j = 0; j < sband->n_bitrates; j++) {
4029 br = &sband->bitrates[j];
4030 if ((rate_flags & br->flags) != rate_flags)
4033 brate = DIV_ROUND_UP(br->bitrate, 5);
4034 if (brate == rate) {
4044 int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
4045 struct sk_buff *skb, bool need_basic,
4046 enum nl80211_band band)
4048 struct ieee80211_local *local = sdata->local;
4049 struct ieee80211_supported_band *sband;
4052 u32 basic_rates = sdata->vif.bss_conf.basic_rates;
4055 rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
4056 sband = local->hw.wiphy->bands[band];
4058 for (i = 0; i < sband->n_bitrates; i++) {
4059 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
4066 if (skb_tailroom(skb) < rates + 2)
4069 pos = skb_put(skb, rates + 2);
4070 *pos++ = WLAN_EID_SUPP_RATES;
4072 for (i = 0; i < rates; i++) {
4074 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
4077 if (need_basic && basic_rates & BIT(i))
4079 rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
4080 *pos++ = basic | (u8) rate;
4086 int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
4087 struct sk_buff *skb, bool need_basic,
4088 enum nl80211_band band)
4090 struct ieee80211_local *local = sdata->local;
4091 struct ieee80211_supported_band *sband;
4093 u8 i, exrates, *pos;
4094 u32 basic_rates = sdata->vif.bss_conf.basic_rates;
4097 rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
4099 sband = local->hw.wiphy->bands[band];
4101 for (i = 0; i < sband->n_bitrates; i++) {
4102 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
4112 if (skb_tailroom(skb) < exrates + 2)
4116 pos = skb_put(skb, exrates + 2);
4117 *pos++ = WLAN_EID_EXT_SUPP_RATES;
4119 for (i = 8; i < sband->n_bitrates; i++) {
4121 if ((rate_flags & sband->bitrates[i].flags)
4124 if (need_basic && basic_rates & BIT(i))
4126 rate = DIV_ROUND_UP(sband->bitrates[i].bitrate, 5);
4127 *pos++ = basic | (u8) rate;
4133 int ieee80211_ave_rssi(struct ieee80211_vif *vif)
4135 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
4137 if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION))
4140 return -ewma_beacon_signal_read(&sdata->deflink.u.mgd.ave_beacon_signal);
4142 EXPORT_SYMBOL_GPL(ieee80211_ave_rssi);
4144 u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs)
4149 /* TODO: consider rx_highest */
4151 if (mcs->rx_mask[3])
4153 if (mcs->rx_mask[2])
4155 if (mcs->rx_mask[1])
4161 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame
4162 * @local: mac80211 hw info struct
4163 * @status: RX status
4164 * @mpdu_len: total MPDU length (including FCS)
4165 * @mpdu_offset: offset into MPDU to calculate timestamp at
4167 * This function calculates the RX timestamp at the given MPDU offset, taking
4168 * into account what the RX timestamp was. An offset of 0 will just normalize
4169 * the timestamp to TSF at beginning of MPDU reception.
4171 * Returns: the calculated timestamp
4173 u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
4174 struct ieee80211_rx_status *status,
4175 unsigned int mpdu_len,
4176 unsigned int mpdu_offset)
4178 u64 ts = status->mactime;
4179 bool mactime_plcp_start;
4180 struct rate_info ri;
4184 if (WARN_ON(!ieee80211_have_rx_timestamp(status)))
4187 mactime_plcp_start = (status->flag & RX_FLAG_MACTIME) ==
4188 RX_FLAG_MACTIME_PLCP_START;
4190 memset(&ri, 0, sizeof(ri));
4194 /* Fill cfg80211 rate info */
4195 switch (status->encoding) {
4197 ri.flags |= RATE_INFO_FLAGS_EHT_MCS;
4198 ri.mcs = status->rate_idx;
4199 ri.nss = status->nss;
4200 ri.eht_ru_alloc = status->eht.ru;
4201 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
4202 ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
4203 /* TODO/FIXME: is this right? handle other PPDUs */
4204 if (mactime_plcp_start) {
4210 ri.flags |= RATE_INFO_FLAGS_HE_MCS;
4211 ri.mcs = status->rate_idx;
4212 ri.nss = status->nss;
4213 ri.he_ru_alloc = status->he_ru;
4214 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
4215 ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
4218 * See P802.11ax_D6.0, section 27.3.4 for
4221 if (mactime_plcp_start) {
4227 * For HE MU PPDU, add the HE-SIG-B.
4228 * For HE ER PPDU, add 8us for the HE-SIG-A.
4229 * For HE TB PPDU, add 4us for the HE-STF.
4230 * Add the HE-LTF durations - variable.
4236 ri.mcs = status->rate_idx;
4237 ri.flags |= RATE_INFO_FLAGS_MCS;
4238 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
4239 ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
4242 * See P802.11REVmd_D3.0, section 19.3.2 for
4245 if (mactime_plcp_start) {
4247 if (status->enc_flags & RX_ENC_FLAG_HT_GF)
4253 * Add Data HT-LTFs per streams
4254 * TODO: add Extension HT-LTFs, 4us per LTF
4256 n_ltf = ((ri.mcs >> 3) & 3) + 1;
4257 n_ltf = n_ltf == 3 ? 4 : n_ltf;
4263 ri.flags |= RATE_INFO_FLAGS_VHT_MCS;
4264 ri.mcs = status->rate_idx;
4265 ri.nss = status->nss;
4266 if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
4267 ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
4270 * See P802.11REVmd_D3.0, section 21.3.2 for
4273 if (mactime_plcp_start) {
4278 * Add VHT-LTFs per streams
4280 n_ltf = (ri.nss != 1) && (ri.nss % 2) ?
4281 ri.nss + 1 : ri.nss;
4289 case RX_ENC_LEGACY: {
4290 struct ieee80211_supported_band *sband;
4292 sband = local->hw.wiphy->bands[status->band];
4293 ri.legacy = sband->bitrates[status->rate_idx].bitrate;
4295 if (mactime_plcp_start) {
4296 if (status->band == NL80211_BAND_5GHZ) {
4299 } else if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) {
4309 rate = cfg80211_calculate_bitrate(&ri);
4310 if (WARN_ONCE(!rate,
4311 "Invalid bitrate: flags=0x%llx, idx=%d, vht_nss=%d\n",
4312 (unsigned long long)status->flag, status->rate_idx,
4316 /* rewind from end of MPDU */
4317 if ((status->flag & RX_FLAG_MACTIME) == RX_FLAG_MACTIME_END)
4318 ts -= mpdu_len * 8 * 10 / rate;
4320 ts += mpdu_offset * 8 * 10 / rate;
4325 void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)
4327 struct ieee80211_sub_if_data *sdata;
4328 struct cfg80211_chan_def chandef;
4330 lockdep_assert_wiphy(local->hw.wiphy);
4332 list_for_each_entry(sdata, &local->interfaces, list) {
4333 /* it might be waiting for the local->mtx, but then
4334 * by the time it gets it, sdata->wdev.cac_started
4335 * will no longer be true
4337 wiphy_delayed_work_cancel(local->hw.wiphy,
4338 &sdata->deflink.dfs_cac_timer_work);
4340 if (sdata->wdev.cac_started) {
4341 chandef = sdata->vif.bss_conf.chandef;
4342 ieee80211_link_release_channel(&sdata->deflink);
4343 cfg80211_cac_event(sdata->dev,
4345 NL80211_RADAR_CAC_ABORTED,
4351 void ieee80211_dfs_radar_detected_work(struct wiphy *wiphy,
4352 struct wiphy_work *work)
4354 struct ieee80211_local *local =
4355 container_of(work, struct ieee80211_local, radar_detected_work);
4356 struct cfg80211_chan_def chandef = local->hw.conf.chandef;
4357 struct ieee80211_chanctx *ctx;
4358 int num_chanctx = 0;
4360 lockdep_assert_wiphy(local->hw.wiphy);
4362 list_for_each_entry(ctx, &local->chanctx_list, list) {
4363 if (ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER)
4367 chandef = ctx->conf.def;
4370 ieee80211_dfs_cac_cancel(local);
4372 if (num_chanctx > 1)
4373 /* XXX: multi-channel is not supported yet */
4376 cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
4379 void ieee80211_radar_detected(struct ieee80211_hw *hw)
4381 struct ieee80211_local *local = hw_to_local(hw);
4383 trace_api_radar_detected(local);
4385 wiphy_work_queue(hw->wiphy, &local->radar_detected_work);
4387 EXPORT_SYMBOL(ieee80211_radar_detected);
4389 ieee80211_conn_flags_t ieee80211_chandef_downgrade(struct cfg80211_chan_def *c)
4391 ieee80211_conn_flags_t ret;
4395 case NL80211_CHAN_WIDTH_20:
4396 c->width = NL80211_CHAN_WIDTH_20_NOHT;
4397 ret = IEEE80211_CONN_DISABLE_HT | IEEE80211_CONN_DISABLE_VHT;
4399 case NL80211_CHAN_WIDTH_40:
4400 c->width = NL80211_CHAN_WIDTH_20;
4401 c->center_freq1 = c->chan->center_freq;
4402 ret = IEEE80211_CONN_DISABLE_40MHZ |
4403 IEEE80211_CONN_DISABLE_VHT;
4405 case NL80211_CHAN_WIDTH_80:
4406 tmp = (30 + c->chan->center_freq - c->center_freq1)/20;
4410 c->center_freq1 = c->center_freq1 - 20 + 40 * tmp;
4411 c->width = NL80211_CHAN_WIDTH_40;
4412 ret = IEEE80211_CONN_DISABLE_VHT;
4414 case NL80211_CHAN_WIDTH_80P80:
4415 c->center_freq2 = 0;
4416 c->width = NL80211_CHAN_WIDTH_80;
4417 ret = IEEE80211_CONN_DISABLE_80P80MHZ |
4418 IEEE80211_CONN_DISABLE_160MHZ;
4420 case NL80211_CHAN_WIDTH_160:
4422 tmp = (70 + c->chan->center_freq - c->center_freq1)/20;
4425 c->center_freq1 = c->center_freq1 - 40 + 80 * tmp;
4426 c->width = NL80211_CHAN_WIDTH_80;
4427 ret = IEEE80211_CONN_DISABLE_80P80MHZ |
4428 IEEE80211_CONN_DISABLE_160MHZ;
4430 case NL80211_CHAN_WIDTH_320:
4432 tmp = (150 + c->chan->center_freq - c->center_freq1) / 20;
4435 c->center_freq1 = c->center_freq1 - 80 + 160 * tmp;
4436 c->width = NL80211_CHAN_WIDTH_160;
4437 ret = IEEE80211_CONN_DISABLE_320MHZ;
4440 case NL80211_CHAN_WIDTH_20_NOHT:
4442 c->width = NL80211_CHAN_WIDTH_20_NOHT;
4443 ret = IEEE80211_CONN_DISABLE_HT | IEEE80211_CONN_DISABLE_VHT;
4445 case NL80211_CHAN_WIDTH_1:
4446 case NL80211_CHAN_WIDTH_2:
4447 case NL80211_CHAN_WIDTH_4:
4448 case NL80211_CHAN_WIDTH_8:
4449 case NL80211_CHAN_WIDTH_16:
4450 case NL80211_CHAN_WIDTH_5:
4451 case NL80211_CHAN_WIDTH_10:
4454 ret = IEEE80211_CONN_DISABLE_HT | IEEE80211_CONN_DISABLE_VHT;
4458 WARN_ON_ONCE(!cfg80211_chandef_valid(c));
4464 * Returns true if smps_mode_new is strictly more restrictive than
4467 bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old,
4468 enum ieee80211_smps_mode smps_mode_new)
4470 if (WARN_ON_ONCE(smps_mode_old == IEEE80211_SMPS_AUTOMATIC ||
4471 smps_mode_new == IEEE80211_SMPS_AUTOMATIC))
4474 switch (smps_mode_old) {
4475 case IEEE80211_SMPS_STATIC:
4477 case IEEE80211_SMPS_DYNAMIC:
4478 return smps_mode_new == IEEE80211_SMPS_STATIC;
4479 case IEEE80211_SMPS_OFF:
4480 return smps_mode_new != IEEE80211_SMPS_OFF;
4488 int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata,
4489 struct cfg80211_csa_settings *csa_settings)
4491 struct sk_buff *skb;
4492 struct ieee80211_mgmt *mgmt;
4493 struct ieee80211_local *local = sdata->local;
4495 int hdr_len = offsetofend(struct ieee80211_mgmt,
4496 u.action.u.chan_switch);
4499 if (sdata->vif.type != NL80211_IFTYPE_ADHOC &&
4500 sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
4503 skb = dev_alloc_skb(local->tx_headroom + hdr_len +
4504 5 + /* channel switch announcement element */
4505 3 + /* secondary channel offset element */
4506 5 + /* wide bandwidth channel switch announcement */
4507 8); /* mesh channel switch parameters element */
4511 skb_reserve(skb, local->tx_headroom);
4512 mgmt = skb_put_zero(skb, hdr_len);
4513 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
4514 IEEE80211_STYPE_ACTION);
4516 eth_broadcast_addr(mgmt->da);
4517 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
4518 if (ieee80211_vif_is_mesh(&sdata->vif)) {
4519 memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
4521 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
4522 memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
4524 mgmt->u.action.category = WLAN_CATEGORY_SPECTRUM_MGMT;
4525 mgmt->u.action.u.chan_switch.action_code = WLAN_ACTION_SPCT_CHL_SWITCH;
4526 pos = skb_put(skb, 5);
4527 *pos++ = WLAN_EID_CHANNEL_SWITCH; /* EID */
4528 *pos++ = 3; /* IE length */
4529 *pos++ = csa_settings->block_tx ? 1 : 0; /* CSA mode */
4530 freq = csa_settings->chandef.chan->center_freq;
4531 *pos++ = ieee80211_frequency_to_channel(freq); /* channel */
4532 *pos++ = csa_settings->count; /* count */
4534 if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_40) {
4535 enum nl80211_channel_type ch_type;
4538 *pos++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET; /* EID */
4539 *pos++ = 1; /* IE length */
4540 ch_type = cfg80211_get_chandef_type(&csa_settings->chandef);
4541 if (ch_type == NL80211_CHAN_HT40PLUS)
4542 *pos++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
4544 *pos++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
4547 if (ieee80211_vif_is_mesh(&sdata->vif)) {
4548 struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
4551 *pos++ = WLAN_EID_CHAN_SWITCH_PARAM; /* EID */
4552 *pos++ = 6; /* IE length */
4553 *pos++ = sdata->u.mesh.mshcfg.dot11MeshTTL; /* Mesh TTL */
4554 *pos = 0x00; /* Mesh Flag: Tx Restrict, Initiator, Reason */
4555 *pos |= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
4556 *pos++ |= csa_settings->block_tx ?
4557 WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00;
4558 put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */
4560 put_unaligned_le16(ifmsh->pre_value, pos);/* Precedence Value */
4564 if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_80 ||
4565 csa_settings->chandef.width == NL80211_CHAN_WIDTH_80P80 ||
4566 csa_settings->chandef.width == NL80211_CHAN_WIDTH_160) {
4568 ieee80211_ie_build_wide_bw_cs(pos, &csa_settings->chandef);
4571 ieee80211_tx_skb(sdata, skb);
4576 ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i)
4578 s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1);
4585 if (data->count[i] == 1)
4588 if (data->desc[i].interval == 0)
4591 /* End time is in the past, check for repetitions */
4592 skip = DIV_ROUND_UP(-end, data->desc[i].interval);
4593 if (data->count[i] < 255) {
4594 if (data->count[i] <= skip) {
4599 data->count[i] -= skip;
4602 data->desc[i].start += skip * data->desc[i].interval;
4608 ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf,
4614 for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
4617 if (!data->count[i])
4620 if (ieee80211_extend_noa_desc(data, tsf + *offset, i))
4623 cur = data->desc[i].start - tsf;
4627 cur = data->desc[i].start + data->desc[i].duration - tsf;
4636 ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf)
4641 * arbitrary limit, used to avoid infinite loops when combined NoA
4642 * descriptors cover the full time period.
4646 ieee80211_extend_absent_time(data, tsf, &offset);
4648 if (!ieee80211_extend_absent_time(data, tsf, &offset))
4652 } while (tries < max_tries);
4657 void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf)
4659 u32 next_offset = BIT(31) - 1;
4663 data->has_next_tsf = false;
4664 for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
4667 if (!data->count[i])
4670 ieee80211_extend_noa_desc(data, tsf, i);
4671 start = data->desc[i].start - tsf;
4673 data->absent |= BIT(i);
4675 if (next_offset > start)
4676 next_offset = start;
4678 data->has_next_tsf = true;
4682 next_offset = ieee80211_get_noa_absent_time(data, tsf);
4684 data->next_tsf = tsf + next_offset;
4686 EXPORT_SYMBOL(ieee80211_update_p2p_noa);
4688 int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
4689 struct ieee80211_noa_data *data, u32 tsf)
4694 memset(data, 0, sizeof(*data));
4696 for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
4697 const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i];
4699 if (!desc->count || !desc->duration)
4702 data->count[i] = desc->count;
4703 data->desc[i].start = le32_to_cpu(desc->start_time);
4704 data->desc[i].duration = le32_to_cpu(desc->duration);
4705 data->desc[i].interval = le32_to_cpu(desc->interval);
4707 if (data->count[i] > 1 &&
4708 data->desc[i].interval < data->desc[i].duration)
4711 ieee80211_extend_noa_desc(data, tsf, i);
4716 ieee80211_update_p2p_noa(data, tsf);
4720 EXPORT_SYMBOL(ieee80211_parse_p2p_noa);
4722 void ieee80211_recalc_dtim(struct ieee80211_local *local,
4723 struct ieee80211_sub_if_data *sdata)
4725 u64 tsf = drv_get_tsf(local, sdata);
4727 u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
4728 u8 dtim_period = sdata->vif.bss_conf.dtim_period;
4732 if (tsf == -1ULL || !beacon_int || !dtim_period)
4735 if (sdata->vif.type == NL80211_IFTYPE_AP ||
4736 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
4740 ps = &sdata->bss->ps;
4741 } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
4742 ps = &sdata->u.mesh.ps;
4748 * actually finds last dtim_count, mac80211 will update in
4749 * __beacon_add_tim().
4750 * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period
4752 do_div(tsf, beacon_int);
4753 bcns_from_dtim = do_div(tsf, dtim_period);
4754 /* just had a DTIM */
4755 if (!bcns_from_dtim)
4758 dtim_count = dtim_period - bcns_from_dtim;
4760 ps->dtim_count = dtim_count;
4763 static u8 ieee80211_chanctx_radar_detect(struct ieee80211_local *local,
4764 struct ieee80211_chanctx *ctx)
4766 struct ieee80211_link_data *link;
4767 u8 radar_detect = 0;
4769 lockdep_assert_wiphy(local->hw.wiphy);
4771 if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED))
4774 list_for_each_entry(link, &ctx->reserved_links, reserved_chanctx_list)
4775 if (link->reserved_radar_required)
4776 radar_detect |= BIT(link->reserved_chandef.width);
4779 * An in-place reservation context should not have any assigned vifs
4780 * until it replaces the other context.
4782 WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER &&
4783 !list_empty(&ctx->assigned_links));
4785 list_for_each_entry(link, &ctx->assigned_links, assigned_chanctx_list) {
4786 if (!link->radar_required)
4790 BIT(link->conf->chandef.width);
4793 return radar_detect;
4796 int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
4797 const struct cfg80211_chan_def *chandef,
4798 enum ieee80211_chanctx_mode chanmode,
4801 struct ieee80211_local *local = sdata->local;
4802 struct ieee80211_sub_if_data *sdata_iter;
4803 enum nl80211_iftype iftype = sdata->wdev.iftype;
4804 struct ieee80211_chanctx *ctx;
4806 struct iface_combination_params params = {
4807 .radar_detect = radar_detect,
4810 lockdep_assert_wiphy(local->hw.wiphy);
4812 if (WARN_ON(hweight32(radar_detect) > 1))
4815 if (WARN_ON(chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
4819 if (WARN_ON(iftype >= NUM_NL80211_IFTYPES))
4822 if (sdata->vif.type == NL80211_IFTYPE_AP ||
4823 sdata->vif.type == NL80211_IFTYPE_MESH_POINT) {
4825 * always passing this is harmless, since it'll be the
4826 * same value that cfg80211 finds if it finds the same
4827 * interface ... and that's always allowed
4829 params.new_beacon_int = sdata->vif.bss_conf.beacon_int;
4832 /* Always allow software iftypes */
4833 if (cfg80211_iftype_allowed(local->hw.wiphy, iftype, 0, 1)) {
4840 params.num_different_channels = 1;
4842 if (iftype != NL80211_IFTYPE_UNSPECIFIED)
4843 params.iftype_num[iftype] = 1;
4845 list_for_each_entry(ctx, &local->chanctx_list, list) {
4846 if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
4848 params.radar_detect |=
4849 ieee80211_chanctx_radar_detect(local, ctx);
4850 if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) {
4851 params.num_different_channels++;
4854 if (chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
4855 cfg80211_chandef_compatible(chandef,
4858 params.num_different_channels++;
4861 list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
4862 struct wireless_dev *wdev_iter;
4864 wdev_iter = &sdata_iter->wdev;
4866 if (sdata_iter == sdata ||
4867 !ieee80211_sdata_running(sdata_iter) ||
4868 cfg80211_iftype_allowed(local->hw.wiphy,
4869 wdev_iter->iftype, 0, 1))
4872 params.iftype_num[wdev_iter->iftype]++;
4876 if (total == 1 && !params.radar_detect)
4879 return cfg80211_check_combinations(local->hw.wiphy, ¶ms);
4883 ieee80211_iter_max_chans(const struct ieee80211_iface_combination *c,
4886 u32 *max_num_different_channels = data;
4888 *max_num_different_channels = max(*max_num_different_channels,
4889 c->num_different_channels);
4892 int ieee80211_max_num_channels(struct ieee80211_local *local)
4894 struct ieee80211_sub_if_data *sdata;
4895 struct ieee80211_chanctx *ctx;
4896 u32 max_num_different_channels = 1;
4898 struct iface_combination_params params = {0};
4900 lockdep_assert_wiphy(local->hw.wiphy);
4902 list_for_each_entry(ctx, &local->chanctx_list, list) {
4903 if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
4906 params.num_different_channels++;
4908 params.radar_detect |=
4909 ieee80211_chanctx_radar_detect(local, ctx);
4912 list_for_each_entry_rcu(sdata, &local->interfaces, list)
4913 params.iftype_num[sdata->wdev.iftype]++;
4915 err = cfg80211_iter_combinations(local->hw.wiphy, ¶ms,
4916 ieee80211_iter_max_chans,
4917 &max_num_different_channels);
4921 return max_num_different_channels;
4924 void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata,
4925 struct ieee80211_sta_s1g_cap *caps,
4926 struct sk_buff *skb)
4928 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4929 struct ieee80211_s1g_cap s1g_capab;
4933 if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
4939 memcpy(s1g_capab.capab_info, caps->cap, sizeof(caps->cap));
4940 memcpy(s1g_capab.supp_mcs_nss, caps->nss_mcs, sizeof(caps->nss_mcs));
4942 /* override the capability info */
4943 for (i = 0; i < sizeof(ifmgd->s1g_capa.capab_info); i++) {
4944 u8 mask = ifmgd->s1g_capa_mask.capab_info[i];
4946 s1g_capab.capab_info[i] &= ~mask;
4947 s1g_capab.capab_info[i] |= ifmgd->s1g_capa.capab_info[i] & mask;
4950 /* then MCS and NSS set */
4951 for (i = 0; i < sizeof(ifmgd->s1g_capa.supp_mcs_nss); i++) {
4952 u8 mask = ifmgd->s1g_capa_mask.supp_mcs_nss[i];
4954 s1g_capab.supp_mcs_nss[i] &= ~mask;
4955 s1g_capab.supp_mcs_nss[i] |=
4956 ifmgd->s1g_capa.supp_mcs_nss[i] & mask;
4959 pos = skb_put(skb, 2 + sizeof(s1g_capab));
4960 *pos++ = WLAN_EID_S1G_CAPABILITIES;
4961 *pos++ = sizeof(s1g_capab);
4963 memcpy(pos, &s1g_capab, sizeof(s1g_capab));
4966 void ieee80211_add_aid_request_ie(struct ieee80211_sub_if_data *sdata,
4967 struct sk_buff *skb)
4969 u8 *pos = skb_put(skb, 3);
4971 *pos++ = WLAN_EID_AID_REQUEST;
4976 u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo)
4978 *buf++ = WLAN_EID_VENDOR_SPECIFIC;
4979 *buf++ = 7; /* len */
4980 *buf++ = 0x00; /* Microsoft OUI 00:50:F2 */
4983 *buf++ = 2; /* WME */
4984 *buf++ = 0; /* WME info */
4985 *buf++ = 1; /* WME ver */
4986 *buf++ = qosinfo; /* U-APSD no in use */
4991 void ieee80211_txq_get_depth(struct ieee80211_txq *txq,
4992 unsigned long *frame_cnt,
4993 unsigned long *byte_cnt)
4995 struct txq_info *txqi = to_txq_info(txq);
4996 u32 frag_cnt = 0, frag_bytes = 0;
4997 struct sk_buff *skb;
4999 skb_queue_walk(&txqi->frags, skb) {
5001 frag_bytes += skb->len;
5005 *frame_cnt = txqi->tin.backlog_packets + frag_cnt;
5008 *byte_cnt = txqi->tin.backlog_bytes + frag_bytes;
5010 EXPORT_SYMBOL(ieee80211_txq_get_depth);
5012 const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS] = {
5013 IEEE80211_WMM_IE_STA_QOSINFO_AC_VO,
5014 IEEE80211_WMM_IE_STA_QOSINFO_AC_VI,
5015 IEEE80211_WMM_IE_STA_QOSINFO_AC_BE,
5016 IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
5019 u16 ieee80211_encode_usf(int listen_interval)
5021 static const int listen_int_usf[] = { 1, 10, 1000, 10000 };
5024 /* find greatest USF */
5025 while (usf < IEEE80211_MAX_USF) {
5026 if (listen_interval % listen_int_usf[usf + 1])
5030 ui = listen_interval / listen_int_usf[usf];
5032 /* error if there is a remainder. Should've been checked by user */
5033 WARN_ON_ONCE(ui > IEEE80211_MAX_UI);
5034 listen_interval = FIELD_PREP(LISTEN_INT_USF, usf) |
5035 FIELD_PREP(LISTEN_INT_UI, ui);
5037 return (u16) listen_interval;
5040 u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata, u8 iftype)
5042 const struct ieee80211_sta_he_cap *he_cap;
5043 const struct ieee80211_sta_eht_cap *eht_cap;
5044 struct ieee80211_supported_band *sband;
5048 sband = ieee80211_get_sband(sdata);
5052 he_cap = ieee80211_get_he_iftype_cap(sband, iftype);
5053 eht_cap = ieee80211_get_eht_iftype_cap(sband, iftype);
5054 if (!he_cap || !eht_cap)
5057 is_ap = iftype == NL80211_IFTYPE_AP ||
5058 iftype == NL80211_IFTYPE_P2P_GO;
5060 n = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
5061 &eht_cap->eht_cap_elem,
5064 sizeof(eht_cap->eht_cap_elem) + n +
5065 ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
5066 eht_cap->eht_cap_elem.phy_cap_info);
5070 u8 *ieee80211_ie_build_eht_cap(u8 *pos,
5071 const struct ieee80211_sta_he_cap *he_cap,
5072 const struct ieee80211_sta_eht_cap *eht_cap,
5076 u8 mcs_nss_len, ppet_len;
5080 /* Make sure we have place for the IE */
5081 if (!he_cap || !eht_cap)
5084 mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
5085 &eht_cap->eht_cap_elem,
5087 ppet_len = ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
5088 eht_cap->eht_cap_elem.phy_cap_info);
5090 ie_len = 2 + 1 + sizeof(eht_cap->eht_cap_elem) + mcs_nss_len + ppet_len;
5091 if ((end - pos) < ie_len)
5094 *pos++ = WLAN_EID_EXTENSION;
5095 *pos++ = ie_len - 2;
5096 *pos++ = WLAN_EID_EXT_EHT_CAPABILITY;
5099 memcpy(pos, &eht_cap->eht_cap_elem, sizeof(eht_cap->eht_cap_elem));
5100 pos += sizeof(eht_cap->eht_cap_elem);
5102 memcpy(pos, &eht_cap->eht_mcs_nss_supp, mcs_nss_len);
5106 memcpy(pos, &eht_cap->eht_ppe_thres, ppet_len);