Lines Matching +full:coexist +full:- +full:support

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright 2002-2005, Instant802 Networks, Inc.
6 * Copyright 2005-2006, Devicescape Software, Inc.
9 * Copyright 2013-2014 Intel Mobile Communications GmbH
11 * Copyright (C) 2018-2024 Intel Corporation
26 #include "driver-ops.h"
34 * three-fold:
39 * can traverse the list in RCU-safe blocks.
53 chanctx_conf = rcu_dereference(link->conf->chanctx_conf); in __ieee80211_recalc_txpower()
59 power = ieee80211_chandef_max_power(&chanctx_conf->def); in __ieee80211_recalc_txpower()
62 if (link->user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
63 power = min(power, link->user_power_level); in __ieee80211_recalc_txpower()
65 if (link->ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
66 power = min(power, link->ap_power_level); in __ieee80211_recalc_txpower()
68 if (power != link->conf->txpower) { in __ieee80211_recalc_txpower()
69 link->conf->txpower = power; in __ieee80211_recalc_txpower()
80 (update_bss && ieee80211_sdata_running(link->sdata))) in ieee80211_recalc_txpower()
81 ieee80211_link_info_change_notify(link->sdata, link, in ieee80211_recalc_txpower()
87 if (!(local->hw.conf.flags & IEEE80211_CONF_IDLE)) in __ieee80211_idle_off()
90 local->hw.conf.flags &= ~IEEE80211_CONF_IDLE; in __ieee80211_idle_off()
96 if (local->hw.conf.flags & IEEE80211_CONF_IDLE) in __ieee80211_idle_on()
101 local->hw.conf.flags |= IEEE80211_CONF_IDLE; in __ieee80211_idle_on()
111 lockdep_assert_wiphy(local->hw.wiphy); in __ieee80211_recalc_idle()
114 !list_empty(&local->chanctx_list) || in __ieee80211_recalc_idle()
115 local->monitors; in __ieee80211_recalc_idle()
117 working = !local->ops->remain_on_channel && in __ieee80211_recalc_idle()
118 !list_empty(&local->roc_list); in __ieee80211_recalc_idle()
120 scanning = test_bit(SCAN_SW_SCANNING, &local->scanning) || in __ieee80211_recalc_idle()
121 test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning); in __ieee80211_recalc_idle()
155 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
161 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_verify_mac()
163 if (is_zero_ether_addr(local->hw.wiphy->addr_mask)) in ieee80211_verify_mac()
171 m = local->hw.wiphy->addr_mask; in ieee80211_verify_mac()
179 list_for_each_entry(iter, &local->interfaces, list) { in ieee80211_verify_mac()
183 if (iter->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_verify_mac()
184 !(iter->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_verify_mac()
187 m = iter->vif.addr; in ieee80211_verify_mac()
193 ret = -EINVAL; in ieee80211_verify_mac()
204 struct ieee80211_local *local = sdata->local; in ieee80211_can_powered_addr_change()
208 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_can_powered_addr_change()
214 if (netif_carrier_ok(sdata->dev)) in ieee80211_can_powered_addr_change()
215 return -EBUSY; in ieee80211_can_powered_addr_change()
218 list_for_each_entry(roc, &local->roc_list, list) { in ieee80211_can_powered_addr_change()
219 if (roc->sdata != sdata) in ieee80211_can_powered_addr_change()
222 if (roc->started) { in ieee80211_can_powered_addr_change()
223 ret = -EBUSY; in ieee80211_can_powered_addr_change()
229 if (local->scanning) { in ieee80211_can_powered_addr_change()
230 scan_sdata = rcu_dereference_protected(local->scan_sdata, in ieee80211_can_powered_addr_change()
231 lockdep_is_held(&local->hw.wiphy->mtx)); in ieee80211_can_powered_addr_change()
233 ret = -EBUSY; in ieee80211_can_powered_addr_change()
236 switch (sdata->vif.type) { in ieee80211_can_powered_addr_change()
244 ret = -EOPNOTSUPP; in ieee80211_can_powered_addr_change()
254 struct ieee80211_local *local = sdata->local; in _ieee80211_change_mac()
268 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in _ieee80211_change_mac()
269 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in _ieee80211_change_mac()
272 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in _ieee80211_change_mac()
278 ret = eth_mac_addr(sdata->dev, sa); in _ieee80211_change_mac()
281 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in _ieee80211_change_mac()
282 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in _ieee80211_change_mac()
297 struct ieee80211_local *local = sdata->local; in ieee80211_change_mac()
304 if (!dev->ieee80211_ptr->registered) in ieee80211_change_mac()
307 guard(wiphy)(local->hw.wiphy); in ieee80211_change_mac()
327 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
331 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_check_concurrent_iface()
334 list_for_each_entry(nsdata, &local->interfaces, list) { in ieee80211_check_concurrent_iface()
337 * Only OCB and monitor mode may coexist in ieee80211_check_concurrent_iface()
339 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
340 nsdata->vif.type != NL80211_IFTYPE_MONITOR) || in ieee80211_check_concurrent_iface()
341 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
342 nsdata->vif.type == NL80211_IFTYPE_OCB)) in ieee80211_check_concurrent_iface()
343 return -EBUSY; in ieee80211_check_concurrent_iface()
356 nsdata->vif.type == NL80211_IFTYPE_ADHOC) in ieee80211_check_concurrent_iface()
357 return -EBUSY; in ieee80211_check_concurrent_iface()
362 if (nsdata->vif.bss_conf.csa_active) in ieee80211_check_concurrent_iface()
363 return -EBUSY; in ieee80211_check_concurrent_iface()
369 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
370 nsdata->vif.addr)) in ieee80211_check_concurrent_iface()
377 nsdata->vif.type)) in ieee80211_check_concurrent_iface()
378 return -ENOTUNIQ; in ieee80211_check_concurrent_iface()
380 /* No support for VLAN with MLO yet */ in ieee80211_check_concurrent_iface()
382 sdata->wdev.use_4addr && in ieee80211_check_concurrent_iface()
383 nsdata->vif.type == NL80211_IFTYPE_AP && in ieee80211_check_concurrent_iface()
384 nsdata->vif.valid_links) in ieee80211_check_concurrent_iface()
385 return -EOPNOTSUPP; in ieee80211_check_concurrent_iface()
391 nsdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_check_concurrent_iface()
392 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
396 return ieee80211_check_combinations(sdata, NULL, 0, 0, -1); in ieee80211_check_concurrent_iface()
402 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
410 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
412 return -EINVAL; in ieee80211_check_queues()
413 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
415 return -EINVAL; in ieee80211_check_queues()
422 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
423 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
427 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
428 return -EINVAL; in ieee80211_check_queues()
430 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
431 return -EINVAL; in ieee80211_check_queues()
442 if (!is_valid_ether_addr(dev->dev_addr)) in ieee80211_open()
443 return -EADDRNOTAVAIL; in ieee80211_open()
445 guard(wiphy)(sdata->local->hw.wiphy); in ieee80211_open()
447 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
451 return ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
456 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
467 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_do_stop()
469 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
472 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
478 switch (sdata->vif.type) { in ieee80211_do_stop()
486 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_stop()
488 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
497 * This must be done before calling ops->remove_interface() in ieee80211_do_stop()
498 * because otherwise we can later invoke ops->sta_notify() in ieee80211_do_stop()
501 * (because if we remove a STA after ops->remove_interface() in ieee80211_do_stop()
508 flushed = sta_info_flush(sdata, -1); in ieee80211_do_stop()
509 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && flushed > 0); in ieee80211_do_stop()
512 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
513 atomic_dec(&local->iff_allmultis); in ieee80211_do_stop()
515 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
516 local->fif_pspoll--; in ieee80211_do_stop()
517 local->fif_probe_req--; in ieee80211_do_stop()
518 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
519 local->fif_probe_req--; in ieee80211_do_stop()
522 if (sdata->dev) { in ieee80211_do_stop()
523 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
524 spin_lock_bh(&local->filter_lock); in ieee80211_do_stop()
525 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
526 sdata->dev->addr_len); in ieee80211_do_stop()
527 spin_unlock_bh(&local->filter_lock); in ieee80211_do_stop()
528 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
531 del_timer_sync(&local->dynamic_ps_timer); in ieee80211_do_stop()
532 wiphy_work_cancel(local->hw.wiphy, &local->dynamic_ps_enable_work); in ieee80211_do_stop()
534 WARN(ieee80211_vif_is_mld(&sdata->vif), in ieee80211_do_stop()
536 sdata->vif.valid_links); in ieee80211_do_stop()
538 sdata->vif.bss_conf.csa_active = false; in ieee80211_do_stop()
539 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
540 sdata->deflink.u.mgd.csa.waiting_bcn = false; in ieee80211_do_stop()
543 wiphy_work_cancel(local->hw.wiphy, &sdata->deflink.csa.finalize_work); in ieee80211_do_stop()
544 wiphy_work_cancel(local->hw.wiphy, in ieee80211_do_stop()
545 &sdata->deflink.color_change_finalize_work); in ieee80211_do_stop()
546 wiphy_delayed_work_cancel(local->hw.wiphy, in ieee80211_do_stop()
547 &sdata->deflink.dfs_cac_timer_work); in ieee80211_do_stop()
549 if (sdata->wdev.links[0].cac_started) { in ieee80211_do_stop()
550 chandef = sdata->vif.bss_conf.chanreq.oper; in ieee80211_do_stop()
551 WARN_ON(local->suspended); in ieee80211_do_stop()
552 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_do_stop()
553 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
558 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
559 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
560 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
562 ps = &sdata->bss->ps; in ieee80211_do_stop()
564 spin_lock_irqsave(&ps->bc_buf.lock, flags); in ieee80211_do_stop()
565 skb_queue_walk_safe(&ps->bc_buf, skb, tmp) { in ieee80211_do_stop()
566 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
567 __skb_unlink(skb, &ps->bc_buf); in ieee80211_do_stop()
568 local->total_ps_buffered--; in ieee80211_do_stop()
569 ieee80211_free_txskb(&local->hw, skb); in ieee80211_do_stop()
572 spin_unlock_irqrestore(&ps->bc_buf.lock, flags); in ieee80211_do_stop()
576 local->open_count--; in ieee80211_do_stop()
578 switch (sdata->vif.type) { in ieee80211_do_stop()
580 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
581 RCU_INIT_POINTER(sdata->vif.bss_conf.chanctx_conf, NULL); in ieee80211_do_stop()
587 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
588 local->cooked_mntrs--; in ieee80211_do_stop()
592 local->monitors--; in ieee80211_do_stop()
593 if (local->monitors == 0) { in ieee80211_do_stop()
594 local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR; in ieee80211_do_stop()
598 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
602 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
604 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
605 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
608 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
610 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
614 RCU_INIT_POINTER(local->p2p_sdata, NULL); in ieee80211_do_stop()
617 wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->work); in ieee80211_do_stop()
630 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
631 skb_queue_purge(&sdata->status_queue); in ieee80211_do_stop()
642 spin_lock_irqsave(&local->queue_stop_reason_lock, flags); in ieee80211_do_stop()
644 skb_queue_walk_safe(&local->pending[i], skb, tmp) { in ieee80211_do_stop()
646 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
647 __skb_unlink(skb, &local->pending[i]); in ieee80211_do_stop()
652 spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); in ieee80211_do_stop()
657 ieee80211_free_txskb(&local->hw, skb); in ieee80211_do_stop()
660 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
663 sdata->bss = NULL; in ieee80211_do_stop()
665 if (local->open_count == 0) in ieee80211_do_stop()
668 sdata->vif.bss_conf.beacon_int = 0; in ieee80211_do_stop()
679 if (local->suspended) { in ieee80211_do_stop()
680 WARN_ON(local->wowlan); in ieee80211_do_stop()
681 WARN_ON(rcu_access_pointer(local->monitor_sdata)); in ieee80211_do_stop()
685 switch (sdata->vif.type) { in ieee80211_do_stop()
689 if (local->monitors == 0) in ieee80211_do_stop()
695 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) && in ieee80211_do_stop()
696 !ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) in ieee80211_do_stop()
699 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_do_stop()
707 memset(sdata->vif.drv_priv, 0, local->hw.vif_data_size); in ieee80211_do_stop()
713 wiphy_delayed_work_flush(local->hw.wiphy, &local->scan_work); in ieee80211_do_stop()
715 if (local->open_count == 0) { in ieee80211_do_stop()
726 if (local->monitors == local->open_count) in ieee80211_do_stop()
733 struct ieee80211_vif *tx_vif = sdata->vif.mbssid_tx_vif; in ieee80211_stop_mbssid()
739 sdata->vif.mbssid_tx_vif = NULL; in ieee80211_stop_mbssid()
742 &tx_sdata->local->interfaces, list) { in ieee80211_stop_mbssid()
744 non_tx_sdata->vif.mbssid_tx_vif == tx_vif && in ieee80211_stop_mbssid()
746 non_tx_sdata->vif.mbssid_tx_vif = NULL; in ieee80211_stop_mbssid()
747 dev_close(non_tx_sdata->wdev.netdev); in ieee80211_stop_mbssid()
752 tx_sdata->vif.mbssid_tx_vif = NULL; in ieee80211_stop_mbssid()
753 dev_close(tx_sdata->wdev.netdev); in ieee80211_stop_mbssid()
762 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_stop()
765 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_stop()
767 dev_close(vlan->dev); in ieee80211_stop()
772 guard(wiphy)(sdata->local->hw.wiphy); in ieee80211_stop()
774 wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->activate_links_work); in ieee80211_stop()
784 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
787 allmulti = !!(dev->flags & IFF_ALLMULTI); in ieee80211_set_multicast_list()
788 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
791 if (dev->flags & IFF_ALLMULTI) in ieee80211_set_multicast_list()
792 atomic_inc(&local->iff_allmultis); in ieee80211_set_multicast_list()
794 atomic_dec(&local->iff_allmultis); in ieee80211_set_multicast_list()
795 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
798 spin_lock_bh(&local->filter_lock); in ieee80211_set_multicast_list()
799 __hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len); in ieee80211_set_multicast_list()
800 spin_unlock_bh(&local->filter_lock); in ieee80211_set_multicast_list()
801 wiphy_work_queue(local->hw.wiphy, &local->reconfig_filter); in ieee80211_set_multicast_list()
815 ieee80211_destroy_frag_cache(&sdata->frags); in ieee80211_teardown_sdata()
817 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
821 ieee80211_link_stop(&sdata->deflink); in ieee80211_teardown_sdata()
833 struct ieee80211_local *local = sdata->local; in ieee80211_netdev_setup_tc()
853 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
858 if (local->hw.queues < IEEE80211_NUM_ACS) in ieee80211_monitor_select_queue()
867 len_rthdr = ieee80211_get_radiotap_len(skb->data); in ieee80211_monitor_select_queue()
868 hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr); in ieee80211_monitor_select_queue()
869 if (skb->len < len_rthdr + 2 || in ieee80211_monitor_select_queue()
870 skb->len < len_rthdr + ieee80211_hdrlen(hdr->frame_control)) in ieee80211_monitor_select_queue()
892 int ret = -ENOENT; in ieee80211_netdev_fill_forward_path()
894 sdata = IEEE80211_DEV_TO_SUB_IF(ctx->dev); in ieee80211_netdev_fill_forward_path()
895 local = sdata->local; in ieee80211_netdev_fill_forward_path()
897 if (!local->ops->net_fill_forward_path) in ieee80211_netdev_fill_forward_path()
898 return -EOPNOTSUPP; in ieee80211_netdev_fill_forward_path()
901 switch (sdata->vif.type) { in ieee80211_netdev_fill_forward_path()
903 sta = rcu_dereference(sdata->u.vlan.sta); in ieee80211_netdev_fill_forward_path()
906 if (sdata->wdev.use_4addr) in ieee80211_netdev_fill_forward_path()
908 if (is_multicast_ether_addr(ctx->daddr)) in ieee80211_netdev_fill_forward_path()
910 sta = sta_info_get_bss(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
913 if (is_multicast_ether_addr(ctx->daddr)) in ieee80211_netdev_fill_forward_path()
915 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
918 if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { in ieee80211_netdev_fill_forward_path()
919 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
928 sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid); in ieee80211_netdev_fill_forward_path()
937 ret = drv_net_fill_forward_path(local, sdata, &sta->sta, ctx, path); in ieee80211_netdev_fill_forward_path()
969 struct ieee80211_local *local = sdata->local; in ieee80211_set_sdata_offload_flags()
972 flags = sdata->vif.offload_flags; in ieee80211_set_sdata_offload_flags()
974 if (ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) && in ieee80211_set_sdata_offload_flags()
975 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
978 if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_FRAG) && in ieee80211_set_sdata_offload_flags()
979 local->hw.wiphy->frag_threshold != (u32)-1) in ieee80211_set_sdata_offload_flags()
982 if (local->monitors) in ieee80211_set_sdata_offload_flags()
988 if (ieee80211_hw_check(&local->hw, SUPPORTS_RX_DECAP_OFFLOAD) && in ieee80211_set_sdata_offload_flags()
989 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
992 if (local->monitors && in ieee80211_set_sdata_offload_flags()
993 !ieee80211_hw_check(&local->hw, SUPPORTS_CONC_MON_RX_DECAP)) in ieee80211_set_sdata_offload_flags()
999 if (sdata->vif.offload_flags == flags) in ieee80211_set_sdata_offload_flags()
1002 sdata->vif.offload_flags = flags; in ieee80211_set_sdata_offload_flags()
1009 struct ieee80211_local *local = sdata->local; in ieee80211_set_vif_encap_ops()
1013 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_set_vif_encap_ops()
1014 if (!sdata->bss) in ieee80211_set_vif_encap_ops()
1017 bss = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); in ieee80211_set_vif_encap_ops()
1020 if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD) || in ieee80211_set_vif_encap_ops()
1021 !ieee80211_iftype_supports_hdr_offload(bss->vif.type)) in ieee80211_set_vif_encap_ops()
1024 enabled = bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED; in ieee80211_set_vif_encap_ops()
1025 if (sdata->wdev.use_4addr && in ieee80211_set_vif_encap_ops()
1026 !(bss->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_4ADDR)) in ieee80211_set_vif_encap_ops()
1029 sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops : in ieee80211_set_vif_encap_ops()
1035 struct ieee80211_local *local = sdata->local; in ieee80211_recalc_sdata_offload()
1043 list_for_each_entry(vsdata, &local->interfaces, list) { in ieee80211_recalc_sdata_offload()
1044 if (vsdata->vif.type != NL80211_IFTYPE_AP_VLAN || in ieee80211_recalc_sdata_offload()
1045 vsdata->bss != &sdata->u.ap) in ieee80211_recalc_sdata_offload()
1056 if (!ieee80211_hw_check(&local->hw, SUPPORTS_TX_ENCAP_OFFLOAD)) in ieee80211_recalc_offload()
1059 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_recalc_offload()
1061 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_offload()
1072 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
1073 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
1077 local->fif_##_s += offset; \ in ieee80211_adjust_monitor_flags()
1086 local->tx_mntrs += offset; in ieee80211_adjust_monitor_flags()
1093 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
1097 if (ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) in ieee80211_set_default_queues()
1098 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1099 else if (local->hw.queues >= IEEE80211_NUM_ACS) in ieee80211_set_default_queues()
1100 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
1102 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
1104 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1110 sdata->local = local; in ieee80211_sdata_init()
1113 * Initialize the default link, so we can use link_id 0 for non-MLD, in ieee80211_sdata_init()
1114 * and that continues to work for non-MLD-aware drivers that use just in ieee80211_sdata_init()
1120 ieee80211_link_init(sdata, -1, &sdata->deflink, &sdata->vif.bss_conf); in ieee80211_sdata_init()
1129 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_add_virtual_monitor()
1131 if (local->monitor_sdata || in ieee80211_add_virtual_monitor()
1132 ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) in ieee80211_add_virtual_monitor()
1135 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
1137 return -ENOMEM; in ieee80211_add_virtual_monitor()
1140 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1141 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
1142 wiphy_name(local->hw.wiphy)); in ieee80211_add_virtual_monitor()
1143 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1144 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_add_virtual_monitor()
1150 if (ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) { in ieee80211_add_virtual_monitor()
1159 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_add_virtual_monitor()
1167 mutex_lock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
1168 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
1169 mutex_unlock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
1171 ret = ieee80211_link_use_channel(&sdata->deflink, &local->monitor_chanreq, in ieee80211_add_virtual_monitor()
1174 mutex_lock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
1175 RCU_INIT_POINTER(local->monitor_sdata, NULL); in ieee80211_add_virtual_monitor()
1176 mutex_unlock(&local->iflist_mtx); in ieee80211_add_virtual_monitor()
1183 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
1184 skb_queue_head_init(&sdata->status_queue); in ieee80211_add_virtual_monitor()
1185 wiphy_work_init(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
1194 if (ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) in ieee80211_del_virtual_monitor()
1198 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_del_virtual_monitor()
1200 mutex_lock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
1202 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
1203 lockdep_is_held(&local->iflist_mtx)); in ieee80211_del_virtual_monitor()
1205 mutex_unlock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
1209 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_del_virtual_monitor()
1210 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_del_virtual_monitor()
1212 if (ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF)) in ieee80211_del_virtual_monitor()
1215 RCU_INIT_POINTER(local->monitor_sdata, NULL); in ieee80211_del_virtual_monitor()
1216 mutex_unlock(&local->iflist_mtx); in ieee80211_del_virtual_monitor()
1225 * an error on interface type changes that have been pre-checked, so most
1231 struct net_device *dev = wdev->netdev; in ieee80211_do_open()
1232 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
1237 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_do_open()
1239 switch (sdata->vif.type) { in ieee80211_do_open()
1243 if (!sdata->bss) in ieee80211_do_open()
1244 return -ENOLINK; in ieee80211_do_open()
1246 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
1248 master = container_of(sdata->bss, in ieee80211_do_open()
1250 sdata->control_port_protocol = in ieee80211_do_open()
1251 master->control_port_protocol; in ieee80211_do_open()
1252 sdata->control_port_no_encrypt = in ieee80211_do_open()
1253 master->control_port_no_encrypt; in ieee80211_do_open()
1254 sdata->control_port_over_nl80211 = in ieee80211_do_open()
1255 master->control_port_over_nl80211; in ieee80211_do_open()
1256 sdata->control_port_no_preauth = in ieee80211_do_open()
1257 master->control_port_no_preauth; in ieee80211_do_open()
1258 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
1259 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
1260 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
1261 sdata->vif.bss_conf.chanreq = master->vif.bss_conf.chanreq; in ieee80211_do_open()
1263 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
1264 master->crypto_tx_tailroom_needed_cnt; in ieee80211_do_open()
1269 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
1290 if (local->open_count == 0) { in ieee80211_do_open()
1292 local->reconfig_failure = false; in ieee80211_do_open()
1303 * Copy the hopefully now-present MAC address to in ieee80211_do_open()
1306 if (dev && is_zero_ether_addr(dev->dev_addr)) { in ieee80211_do_open()
1307 eth_hw_addr_set(dev, local->hw.wiphy->perm_addr); in ieee80211_do_open()
1308 memcpy(dev->perm_addr, dev->dev_addr, ETH_ALEN); in ieee80211_do_open()
1310 if (!is_valid_ether_addr(dev->dev_addr)) { in ieee80211_do_open()
1311 res = -EADDRNOTAVAIL; in ieee80211_do_open()
1316 sdata->vif.addr_valid = sdata->vif.type != NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
1317 (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE); in ieee80211_do_open()
1318 switch (sdata->vif.type) { in ieee80211_do_open()
1321 if (sdata->bss->active) { in ieee80211_do_open()
1322 ieee80211_link_vlan_copy_chanctx(&sdata->deflink); in ieee80211_do_open()
1330 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
1331 local->cooked_mntrs++; in ieee80211_do_open()
1335 if ((sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) || in ieee80211_do_open()
1336 ieee80211_hw_check(&local->hw, NO_VIRTUAL_MONITOR)) { in ieee80211_do_open()
1340 } else if (local->monitors == 0 && local->open_count == 0) { in ieee80211_do_open()
1347 local->monitors++; in ieee80211_do_open()
1348 if (local->monitors == 1) { in ieee80211_do_open()
1349 local->hw.conf.flags |= IEEE80211_CONF_MONITOR; in ieee80211_do_open()
1371 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
1376 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
1377 local->fif_pspoll++; in ieee80211_do_open()
1378 local->fif_probe_req++; in ieee80211_do_open()
1381 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
1382 local->fif_probe_req++; in ieee80211_do_open()
1385 if (sdata->vif.probe_req_reg) in ieee80211_do_open()
1390 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
1391 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
1393 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_do_open()
1396 switch (sdata->vif.type) { in ieee80211_do_open()
1418 ieee80211_set_wmm_default(&sdata->deflink, true, in ieee80211_do_open()
1419 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
1422 switch (sdata->vif.type) { in ieee80211_do_open()
1424 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
1427 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
1429 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
1440 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
1441 atomic_inc(&local->iff_allmultis); in ieee80211_do_open()
1444 local->open_count++; in ieee80211_do_open()
1446 if (local->open_count == 1) in ieee80211_do_open()
1453 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1459 if (!local->open_count) in ieee80211_do_open()
1462 sdata->bss = NULL; in ieee80211_do_open()
1463 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_open()
1464 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
1466 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1473 dev->priv_flags &= ~IFF_TX_SKB_SHARING; in ieee80211_if_setup()
1474 dev->priv_flags |= IFF_NO_QUEUE; in ieee80211_if_setup()
1475 dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_if_setup()
1476 dev->needs_free_netdev = true; in ieee80211_if_setup()
1483 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ieee80211_iface_process_skb()
1485 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_iface_process_skb()
1487 if (ieee80211_is_action(mgmt->frame_control) && in ieee80211_iface_process_skb()
1488 mgmt->u.action.category == WLAN_CATEGORY_BACK) { in ieee80211_iface_process_skb()
1490 int len = skb->len; in ieee80211_iface_process_skb()
1492 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1494 switch (mgmt->u.action.u.addba_req.action_code) { in ieee80211_iface_process_skb()
1512 } else if (ieee80211_is_action(mgmt->frame_control) && in ieee80211_iface_process_skb()
1513 mgmt->u.action.category == WLAN_CATEGORY_VHT) { in ieee80211_iface_process_skb()
1514 switch (mgmt->u.action.u.vht_group_notif.action_code) { in ieee80211_iface_process_skb()
1522 band = status->band; in ieee80211_iface_process_skb()
1523 opmode = mgmt->u.action.u.vht_opmode_notif.operating_mode; in ieee80211_iface_process_skb()
1525 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1529 &sta->deflink, in ieee80211_iface_process_skb()
1535 ieee80211_process_mu_groups(sdata, &sdata->deflink, in ieee80211_iface_process_skb()
1542 } else if (ieee80211_is_action(mgmt->frame_control) && in ieee80211_iface_process_skb()
1543 mgmt->u.action.category == WLAN_CATEGORY_S1G) { in ieee80211_iface_process_skb()
1544 switch (mgmt->u.action.u.s1g.action_code) { in ieee80211_iface_process_skb()
1552 } else if (ieee80211_is_action(mgmt->frame_control) && in ieee80211_iface_process_skb()
1553 mgmt->u.action.category == WLAN_CATEGORY_PROTECTED_EHT) { in ieee80211_iface_process_skb()
1554 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_iface_process_skb()
1555 switch (mgmt->u.action.u.ttlm_req.action_code) { in ieee80211_iface_process_skb()
1558 skb->len); in ieee80211_iface_process_skb()
1562 skb->len); in ieee80211_iface_process_skb()
1566 skb->len); in ieee80211_iface_process_skb()
1572 } else if (ieee80211_is_ext(mgmt->frame_control)) { in ieee80211_iface_process_skb()
1573 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_iface_process_skb()
1577 } else if (ieee80211_is_data_qos(mgmt->frame_control)) { in ieee80211_iface_process_skb()
1589 WARN_ON(hdr->frame_control & in ieee80211_iface_process_skb()
1591 WARN_ON(!(hdr->seq_ctrl & in ieee80211_iface_process_skb()
1595 * a block-ack session was active. That cannot be in ieee80211_iface_process_skb()
1598 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1607 } else switch (sdata->vif.type) { in ieee80211_iface_process_skb()
1615 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_process_skb()
1628 struct ieee80211_mgmt *mgmt = (void *)skb->data; in ieee80211_iface_process_status()
1630 if (ieee80211_is_action(mgmt->frame_control) && in ieee80211_iface_process_status()
1631 mgmt->u.action.category == WLAN_CATEGORY_S1G) { in ieee80211_iface_process_status()
1632 switch (mgmt->u.action.u.s1g.action_code) { in ieee80211_iface_process_status()
1647 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1653 if (test_bit(SCAN_SW_SCANNING, &local->scanning)) in ieee80211_iface_work()
1660 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1663 if (skb->protocol == cpu_to_be16(ETH_P_TDLS)) in ieee80211_iface_work()
1673 while ((skb = skb_dequeue(&sdata->status_queue))) { in ieee80211_iface_work()
1682 /* then other type-dependent work */ in ieee80211_iface_work()
1683 switch (sdata->vif.type) { in ieee80211_iface_work()
1691 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1711 if (local->in_reconfig) in ieee80211_activate_links_work()
1714 ieee80211_set_active_links(&sdata->vif, sdata->desired_active_links); in ieee80211_activate_links_work()
1715 sdata->desired_active_links = 0; in ieee80211_activate_links_work()
1727 /* clear type-dependent unions */ in ieee80211_setup_sdata()
1728 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1729 memset(&sdata->deflink.u, 0, sizeof(sdata->deflink.u)); in ieee80211_setup_sdata()
1731 /* and set some type-dependent values */ in ieee80211_setup_sdata()
1732 sdata->vif.type = type; in ieee80211_setup_sdata()
1733 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1734 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1736 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1737 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1738 sdata->control_port_over_nl80211 = false; in ieee80211_setup_sdata()
1739 sdata->control_port_no_preauth = false; in ieee80211_setup_sdata()
1740 sdata->vif.cfg.idle = true; in ieee80211_setup_sdata()
1741 sdata->vif.bss_conf.txpower = INT_MIN; /* unset */ in ieee80211_setup_sdata()
1743 sdata->noack_map = 0; in ieee80211_setup_sdata()
1745 /* only monitor/p2p-device differ */ in ieee80211_setup_sdata()
1746 if (sdata->dev) { in ieee80211_setup_sdata()
1747 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1748 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1751 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1752 skb_queue_head_init(&sdata->status_queue); in ieee80211_setup_sdata()
1753 wiphy_work_init(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1754 wiphy_work_init(&sdata->activate_links_work, in ieee80211_setup_sdata()
1760 sdata->vif.type = type; in ieee80211_setup_sdata()
1761 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1764 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1765 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1766 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1770 sdata->vif.type = type; in ieee80211_setup_sdata()
1771 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1774 sdata->vif.bss_conf.bssid = sdata->deflink.u.mgd.bssid; in ieee80211_setup_sdata()
1778 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1782 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1786 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1790 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1791 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1792 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1796 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1797 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1798 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1802 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1812 ieee80211_link_setup(&sdata->deflink); in ieee80211_setup_sdata()
1820 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1827 if (!local->ops->change_interface) in ieee80211_runtime_change_iftype()
1828 return -EBUSY; in ieee80211_runtime_change_iftype()
1830 /* for now, don't support changing while links exist */ in ieee80211_runtime_change_iftype()
1831 if (ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_runtime_change_iftype()
1832 return -EBUSY; in ieee80211_runtime_change_iftype()
1834 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1836 if (!list_empty(&sdata->u.ap.vlans)) in ieee80211_runtime_change_iftype()
1837 return -EBUSY; in ieee80211_runtime_change_iftype()
1850 return -EBUSY; in ieee80211_runtime_change_iftype()
1859 * Could probably support everything in ieee80211_runtime_change_iftype()
1872 return -EBUSY; in ieee80211_runtime_change_iftype()
1889 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1894 * The warnings will hopefully make driver authors fix it :-) in ieee80211_runtime_change_iftype()
1901 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1916 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1924 /* Purge and reset type-dependent state. */ in ieee80211_if_change_type()
1931 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1945 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_assign_perm_addr()
1948 memcpy(perm_addr, local->hw.wiphy->perm_addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1950 if (is_zero_ether_addr(local->hw.wiphy->addr_mask) && in ieee80211_assign_perm_addr()
1951 local->hw.wiphy->n_addresses <= 1) in ieee80211_assign_perm_addr()
1960 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1961 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1963 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1970 if (ieee80211_hw_check(&local->hw, P2P_DEV_ADDR_FOR_INTF)) { in ieee80211_assign_perm_addr()
1971 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1972 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1976 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1982 /* assign a new address if possible -- try n_addresses first */ in ieee80211_assign_perm_addr()
1983 for (i = 0; i < local->hw.wiphy->n_addresses; i++) { in ieee80211_assign_perm_addr()
1986 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1987 if (ether_addr_equal(local->hw.wiphy->addresses[i].addr, in ieee80211_assign_perm_addr()
1988 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1996 local->hw.wiphy->addresses[i].addr, in ieee80211_assign_perm_addr()
2003 if (is_zero_ether_addr(local->hw.wiphy->addr_mask)) in ieee80211_assign_perm_addr()
2006 m = local->hw.wiphy->addr_mask; in ieee80211_assign_perm_addr()
2021 m = local->hw.wiphy->perm_addr; in ieee80211_assign_perm_addr()
2022 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2023 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
2025 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
2047 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2048 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2076 lockdep_assert_wiphy(local->hw.wiphy); in ieee80211_if_add()
2081 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2084 return -ENOMEM; in ieee80211_if_add()
2085 wdev = &sdata->wdev; in ieee80211_if_add()
2087 sdata->dev = NULL; in ieee80211_if_add()
2088 strscpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
2089 ieee80211_assign_perm_addr(local, wdev->address, type); in ieee80211_if_add()
2090 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
2091 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2093 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2099 (params->flags & MONITOR_FLAG_ACTIVE))) in ieee80211_if_add()
2101 local->hw.txq_data_size; in ieee80211_if_add()
2107 return -ENOMEM; in ieee80211_if_add()
2109 dev_net_set(ndev, wiphy_net(local->hw.wiphy)); in ieee80211_if_add()
2111 ndev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS; in ieee80211_if_add()
2113 ndev->needed_headroom = local->tx_headroom + in ieee80211_if_add()
2118 - ETH_HLEN /* ethernet hard_header_len */ in ieee80211_if_add()
2120 ndev->needed_tailroom = IEEE80211_ENCRYPT_TAILROOM; in ieee80211_if_add()
2122 ret = dev_alloc_name(ndev, ndev->name); in ieee80211_if_add()
2128 ieee80211_assign_perm_addr(local, ndev->perm_addr, type); in ieee80211_if_add()
2129 if (is_valid_ether_addr(params->macaddr)) in ieee80211_if_add()
2130 eth_hw_addr_set(ndev, params->macaddr); in ieee80211_if_add()
2132 eth_hw_addr_set(ndev, ndev->perm_addr); in ieee80211_if_add()
2133 SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy)); in ieee80211_if_add()
2135 /* don't use IEEE80211_DEV_TO_SUB_IF -- it checks too much */ in ieee80211_if_add()
2137 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
2138 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
2139 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2140 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
2147 sdata->dev = ndev; in ieee80211_if_add()
2150 /* initialise type-independent data */ in ieee80211_if_add()
2151 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
2155 ieee80211_init_frag_cache(&sdata->frags); in ieee80211_if_add()
2157 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
2159 wiphy_delayed_work_init(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
2164 sband = local->hw.wiphy->bands[i]; in ieee80211_if_add()
2165 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
2166 sband ? (1 << sband->n_bitrates) - 1 : 0; in ieee80211_if_add()
2171 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
2172 sband->ht_cap.mcs.rx_mask, in ieee80211_if_add()
2173 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2175 cap = sband->vht_cap.vht_mcs.rx_mcs_map; in ieee80211_if_add()
2176 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
2179 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
2180 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2181 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
2182 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
2188 /* setup type-dependent data */ in ieee80211_if_add()
2192 ndev->ieee80211_ptr->use_4addr = params->use_4addr; in ieee80211_if_add()
2194 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
2196 ndev->features |= local->hw.netdev_features; in ieee80211_if_add()
2197 ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; in ieee80211_if_add()
2198 ndev->hw_features |= ndev->features & in ieee80211_if_add()
2200 sdata->vif.netdev_features = local->hw.netdev_features; in ieee80211_if_add()
2204 /* MTU range is normally 256 - 2304, where the upper limit is in ieee80211_if_add()
2206 * MPDU and A-MSDU frames which may be much larger so we do in ieee80211_if_add()
2209 ndev->min_mtu = 256; in ieee80211_if_add()
2211 ndev->max_mtu = 0; in ieee80211_if_add()
2213 ndev->max_mtu = local->hw.max_mtu; in ieee80211_if_add()
2222 mutex_lock(&local->iflist_mtx); in ieee80211_if_add()
2223 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
2224 mutex_unlock(&local->iflist_mtx); in ieee80211_if_add()
2227 *new_wdev = &sdata->wdev; in ieee80211_if_add()
2235 lockdep_assert_wiphy(sdata->local->hw.wiphy); in ieee80211_if_remove()
2237 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2238 list_del_rcu(&sdata->list); in ieee80211_if_remove()
2239 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2241 if (sdata->vif.txq) in ieee80211_if_remove()
2242 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
2246 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
2248 if (!sdata->dev) { in ieee80211_if_remove()
2256 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
2276 * have stopped all of its activities, so that we can do RCU-unaware in ieee80211_remove_interfaces()
2279 cfg80211_shutdown_all_interfaces(local->hw.wiphy); in ieee80211_remove_interfaces()
2281 guard(wiphy)(local->hw.wiphy); in ieee80211_remove_interfaces()
2283 WARN(local->open_count, "%s: open count remains %d\n", in ieee80211_remove_interfaces()
2284 wiphy_name(local->hw.wiphy), local->open_count); in ieee80211_remove_interfaces()
2286 mutex_lock(&local->iflist_mtx); in ieee80211_remove_interfaces()
2287 list_splice_init(&local->interfaces, &unreg_list); in ieee80211_remove_interfaces()
2288 mutex_unlock(&local->iflist_mtx); in ieee80211_remove_interfaces()
2291 bool netdev = sdata->dev; in ieee80211_remove_interfaces()
2295 * skip the callbacks if wdev->registered is false, since in ieee80211_remove_interfaces()
2299 sdata->vif.cfg.arp_addr_cnt = 0; in ieee80211_remove_interfaces()
2300 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_remove_interfaces()
2301 sdata->u.mgd.associated) in ieee80211_remove_interfaces()
2305 list_del(&sdata->list); in ieee80211_remove_interfaces()
2306 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
2322 if (!dev->ieee80211_ptr || !dev->ieee80211_ptr->wiphy) in netdev_notify()
2325 if (dev->ieee80211_ptr->wiphy->privid != mac80211_wiphy_privid) in netdev_notify()
2329 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
2351 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2352 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2353 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2354 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2359 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2360 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2361 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2362 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2367 struct ieee80211_local *local = sdata->local; in ieee80211_vif_block_queues_csa()
2369 if (ieee80211_hw_check(&local->hw, HANDLES_QUIET_CSA)) in ieee80211_vif_block_queues_csa()
2378 struct ieee80211_local *local = sdata->local; in ieee80211_vif_unblock_queues_csa()