Lines Matching refs:sdata
48 bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata) in __ieee80211_recalc_txpower() argument
54 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf); in __ieee80211_recalc_txpower()
63 if (sdata->deflink.user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
64 power = min(power, sdata->deflink.user_power_level); in __ieee80211_recalc_txpower()
66 if (sdata->deflink.ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
67 power = min(power, sdata->deflink.ap_power_level); in __ieee80211_recalc_txpower()
69 if (power != sdata->vif.bss_conf.txpower) { in __ieee80211_recalc_txpower()
70 sdata->vif.bss_conf.txpower = power; in __ieee80211_recalc_txpower()
71 ieee80211_hw_config(sdata->local, 0); in __ieee80211_recalc_txpower()
78 void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_txpower() argument
81 if (__ieee80211_recalc_txpower(sdata) || in ieee80211_recalc_txpower()
82 (update_bss && ieee80211_sdata_running(sdata))) in ieee80211_recalc_txpower()
83 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_recalc_txpower()
154 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, in ieee80211_verify_mac() argument
157 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
181 if (iter == sdata) in ieee80211_verify_mac()
203 static int ieee80211_can_powered_addr_change(struct ieee80211_sub_if_data *sdata) in ieee80211_can_powered_addr_change() argument
206 struct ieee80211_local *local = sdata->local; in ieee80211_can_powered_addr_change()
214 if (netif_carrier_ok(sdata->dev)) in ieee80211_can_powered_addr_change()
221 if (roc->sdata != sdata) in ieee80211_can_powered_addr_change()
234 if (sdata == scan_sdata) in ieee80211_can_powered_addr_change()
238 switch (sdata->vif.type) { in ieee80211_can_powered_addr_change()
256 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
257 struct ieee80211_local *local = sdata->local; in ieee80211_change_mac()
263 if (ieee80211_sdata_running(sdata)) { in ieee80211_change_mac()
264 ret = ieee80211_can_powered_addr_change(sdata); in ieee80211_change_mac()
271 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
272 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
275 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
280 drv_remove_interface(local, sdata); in ieee80211_change_mac()
284 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
285 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_change_mac()
292 WARN_ON(drv_add_interface(local, sdata)); in ieee80211_change_mac()
309 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
312 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
320 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
324 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
326 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
354 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
367 sdata->wdev.use_4addr && in ieee80211_check_concurrent_iface()
377 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
382 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
387 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
390 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
398 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
401 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
410 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
411 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
415 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
418 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
426 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
433 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
437 wiphy_lock(sdata->local->hw.wiphy); in ieee80211_open()
438 err = ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
439 wiphy_unlock(sdata->local->hw.wiphy); in ieee80211_open()
444 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down) in ieee80211_do_stop() argument
446 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
456 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
459 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
463 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
465 switch (sdata->vif.type) { in ieee80211_do_stop()
467 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
470 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
473 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_stop()
475 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
495 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
496 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && flushed > 0); in ieee80211_do_stop()
499 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
502 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
505 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
509 if (sdata->dev) { in ieee80211_do_stop()
510 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
512 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
513 sdata->dev->addr_len); in ieee80211_do_stop()
515 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
521 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
523 sdata_lock(sdata); in ieee80211_do_stop()
524 WARN(ieee80211_vif_is_mld(&sdata->vif), in ieee80211_do_stop()
526 sdata->vif.valid_links); in ieee80211_do_stop()
529 sdata->vif.bss_conf.csa_active = false; in ieee80211_do_stop()
530 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
531 sdata->deflink.u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
532 if (sdata->deflink.csa_block_tx) { in ieee80211_do_stop()
533 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
535 sdata->deflink.csa_block_tx = false; in ieee80211_do_stop()
538 sdata_unlock(sdata); in ieee80211_do_stop()
540 cancel_work_sync(&sdata->deflink.csa_finalize_work); in ieee80211_do_stop()
541 cancel_work_sync(&sdata->deflink.color_change_finalize_work); in ieee80211_do_stop()
543 cancel_delayed_work_sync(&sdata->deflink.dfs_cac_timer_work); in ieee80211_do_stop()
545 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
546 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
549 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_do_stop()
551 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
556 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
557 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
558 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
560 ps = &sdata->bss->ps; in ieee80211_do_stop()
564 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
576 switch (sdata->vif.type) { in ieee80211_do_stop()
579 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()
583 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
587 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { 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()
617 wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->work); in ieee80211_do_stop()
629 ieee80211_free_keys(sdata, true); 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()
638 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
646 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
647 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
649 sdata->bss = NULL; in ieee80211_do_stop()
654 sdata->vif.bss_conf.beacon_int = 0; in ieee80211_do_stop()
671 switch (sdata->vif.type) { in ieee80211_do_stop()
682 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_do_stop()
688 drv_remove_interface(local, sdata); in ieee80211_do_stop()
711 static void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_mbssid() argument
714 struct ieee80211_vif *tx_vif = sdata->vif.mbssid_tx_vif; in ieee80211_stop_mbssid()
720 sdata->vif.mbssid_tx_vif = NULL; in ieee80211_stop_mbssid()
724 if (non_tx_sdata != sdata && non_tx_sdata != tx_sdata && in ieee80211_stop_mbssid()
732 if (sdata != tx_sdata && ieee80211_sdata_running(tx_sdata)) { in ieee80211_stop_mbssid()
740 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
743 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_stop()
746 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_stop()
750 ieee80211_stop_mbssid(sdata); in ieee80211_stop()
753 cancel_work_sync(&sdata->activate_links_work); in ieee80211_stop()
755 wiphy_lock(sdata->local->hw.wiphy); in ieee80211_stop()
756 ieee80211_do_stop(sdata, true); in ieee80211_stop()
757 wiphy_unlock(sdata->local->hw.wiphy); in ieee80211_stop()
764 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
765 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
769 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
776 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
789 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
792 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
794 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
796 ieee80211_destroy_frag_cache(&sdata->frags); in ieee80211_teardown_sdata()
798 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
799 ieee80211_mesh_teardown_sdata(sdata); in ieee80211_teardown_sdata()
801 ieee80211_vif_clear_links(sdata); in ieee80211_teardown_sdata()
802 ieee80211_link_stop(&sdata->deflink); in ieee80211_teardown_sdata()
819 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_netdev_setup_tc() local
820 struct ieee80211_local *local = sdata->local; in ieee80211_netdev_setup_tc()
822 return drv_net_setup_tc(local, sdata, dev, type, type_data); in ieee80211_netdev_setup_tc()
840 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
841 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
861 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
878 struct ieee80211_sub_if_data *sdata; in ieee80211_netdev_fill_forward_path() local
883 sdata = IEEE80211_DEV_TO_SUB_IF(ctx->dev); in ieee80211_netdev_fill_forward_path()
884 local = sdata->local; in ieee80211_netdev_fill_forward_path()
890 switch (sdata->vif.type) { in ieee80211_netdev_fill_forward_path()
892 sta = rcu_dereference(sdata->u.vlan.sta); in ieee80211_netdev_fill_forward_path()
895 if (sdata->wdev.use_4addr) in ieee80211_netdev_fill_forward_path()
899 sta = sta_info_get_bss(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
904 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
907 if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { in ieee80211_netdev_fill_forward_path()
908 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
917 sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid); in ieee80211_netdev_fill_forward_path()
926 ret = drv_net_fill_forward_path(local, sdata, &sta->sta, ctx, path); in ieee80211_netdev_fill_forward_path()
957 static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata) in ieee80211_set_sdata_offload_flags() argument
959 struct ieee80211_local *local = sdata->local; in ieee80211_set_sdata_offload_flags()
962 flags = sdata->vif.offload_flags; in ieee80211_set_sdata_offload_flags()
965 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
979 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
989 if (sdata->vif.offload_flags == flags) in ieee80211_set_sdata_offload_flags()
992 sdata->vif.offload_flags = flags; in ieee80211_set_sdata_offload_flags()
993 ieee80211_check_fast_rx_iface(sdata); in ieee80211_set_sdata_offload_flags()
997 static void ieee80211_set_vif_encap_ops(struct ieee80211_sub_if_data *sdata) in ieee80211_set_vif_encap_ops() argument
999 struct ieee80211_local *local = sdata->local; in ieee80211_set_vif_encap_ops()
1000 struct ieee80211_sub_if_data *bss = sdata; in ieee80211_set_vif_encap_ops()
1003 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_set_vif_encap_ops()
1004 if (!sdata->bss) in ieee80211_set_vif_encap_ops()
1007 bss = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); in ieee80211_set_vif_encap_ops()
1015 if (sdata->wdev.use_4addr && in ieee80211_set_vif_encap_ops()
1019 sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops : in ieee80211_set_vif_encap_ops()
1023 static void ieee80211_recalc_sdata_offload(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_sdata_offload() argument
1025 struct ieee80211_local *local = sdata->local; in ieee80211_recalc_sdata_offload()
1028 if (ieee80211_set_sdata_offload_flags(sdata)) { in ieee80211_recalc_sdata_offload()
1029 drv_update_vif_offload(local, sdata); in ieee80211_recalc_sdata_offload()
1030 ieee80211_set_vif_encap_ops(sdata); in ieee80211_recalc_sdata_offload()
1035 vsdata->bss != &sdata->u.ap) in ieee80211_recalc_sdata_offload()
1044 struct ieee80211_sub_if_data *sdata; in ieee80211_recalc_offload() local
1051 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_offload()
1052 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_offload()
1055 ieee80211_recalc_sdata_offload(sdata); in ieee80211_recalc_offload()
1061 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
1064 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
1065 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
1081 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
1083 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
1088 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1090 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
1092 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
1094 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1098 struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_init() argument
1100 sdata->local = local; in ieee80211_sdata_init()
1110 ieee80211_link_init(sdata, -1, &sdata->deflink, &sdata->vif.bss_conf); in ieee80211_sdata_init()
1115 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
1127 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
1128 if (!sdata) in ieee80211_add_virtual_monitor()
1132 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1133 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
1135 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1136 mutex_init(&sdata->wdev.mtx); in ieee80211_add_virtual_monitor()
1138 ieee80211_sdata_init(local, sdata); in ieee80211_add_virtual_monitor()
1140 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
1142 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
1145 kfree(sdata); in ieee80211_add_virtual_monitor()
1149 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_add_virtual_monitor()
1151 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
1153 kfree(sdata); in ieee80211_add_virtual_monitor()
1158 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
1161 sdata_lock(sdata); in ieee80211_add_virtual_monitor()
1163 ret = ieee80211_link_use_channel(&sdata->deflink, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
1166 sdata_unlock(sdata); in ieee80211_add_virtual_monitor()
1172 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
1173 mutex_destroy(&sdata->wdev.mtx); in ieee80211_add_virtual_monitor()
1174 kfree(sdata); in ieee80211_add_virtual_monitor()
1178 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
1179 skb_queue_head_init(&sdata->status_queue); in ieee80211_add_virtual_monitor()
1180 wiphy_work_init(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
1187 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
1197 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
1199 if (!sdata) { in ieee80211_del_virtual_monitor()
1209 sdata_lock(sdata); in ieee80211_del_virtual_monitor()
1211 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_del_virtual_monitor()
1213 sdata_unlock(sdata); in ieee80211_del_virtual_monitor()
1215 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
1217 mutex_destroy(&sdata->wdev.mtx); in ieee80211_del_virtual_monitor()
1218 kfree(sdata); in ieee80211_del_virtual_monitor()
1228 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
1230 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
1235 switch (sdata->vif.type) { in ieee80211_do_open()
1239 if (!sdata->bss) in ieee80211_do_open()
1243 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
1246 master = container_of(sdata->bss, in ieee80211_do_open()
1248 sdata->control_port_protocol = in ieee80211_do_open()
1250 sdata->control_port_no_encrypt = in ieee80211_do_open()
1252 sdata->control_port_over_nl80211 = in ieee80211_do_open()
1254 sdata->control_port_no_preauth = in ieee80211_do_open()
1256 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
1257 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
1258 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
1259 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
1262 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
1269 sdata->bss = &sdata->u.ap; 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()
1324 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1330 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
1335 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
1336 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1352 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
1364 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_do_open()
1366 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1370 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1371 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
1372 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
1377 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
1382 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
1386 if (sdata->vif.probe_req_reg) in ieee80211_do_open()
1387 drv_config_iface_filter(local, sdata, in ieee80211_do_open()
1391 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
1392 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
1393 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
1394 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_do_open()
1397 switch (sdata->vif.type) { in ieee80211_do_open()
1419 ieee80211_set_wmm_default(&sdata->deflink, true, in ieee80211_do_open()
1420 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
1423 switch (sdata->vif.type) { in ieee80211_do_open()
1425 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
1428 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
1430 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
1441 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
1452 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1456 drv_remove_interface(local, sdata); in ieee80211_do_open()
1461 sdata->bss = NULL; in ieee80211_do_open()
1462 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
1464 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
1468 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1488 struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_skb() argument
1499 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1511 ieee80211_process_delba(sdata, sta, in ieee80211_iface_process_skb()
1534 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1537 ieee80211_vht_handle_opmode(sdata, in ieee80211_iface_process_skb()
1545 ieee80211_process_mu_groups(sdata, &sdata->deflink, in ieee80211_iface_process_skb()
1557 ieee80211_s1g_rx_twt_action(sdata, skb); in ieee80211_iface_process_skb()
1563 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_iface_process_skb()
1564 ieee80211_sta_rx_queued_ext(sdata, skb); in ieee80211_iface_process_skb()
1589 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1599 } else switch (sdata->vif.type) { in ieee80211_iface_process_skb()
1601 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1604 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1607 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_process_skb()
1609 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1617 static void ieee80211_iface_process_status(struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_status() argument
1627 ieee80211_s1g_status_twt_action(sdata, skb); in ieee80211_iface_process_status()
1637 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1639 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1642 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1652 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1656 ieee80211_process_tdls_channel_switch(sdata, skb); in ieee80211_iface_work()
1658 ieee80211_iface_process_skb(local, sdata, skb); in ieee80211_iface_work()
1665 while ((skb = skb_dequeue(&sdata->status_queue))) { in ieee80211_iface_work()
1668 ieee80211_iface_process_status(sdata, skb); in ieee80211_iface_work()
1675 switch (sdata->vif.type) { in ieee80211_iface_work()
1677 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1680 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1683 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1685 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1688 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1697 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1700 ieee80211_recalc_smps(sdata, &sdata->deflink); in ieee80211_recalc_smps_work()
1705 struct ieee80211_sub_if_data *sdata = in ieee80211_activate_links_work() local
1709 ieee80211_set_active_links(&sdata->vif, sdata->desired_active_links); in ieee80211_activate_links_work()
1715 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1722 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1723 memset(&sdata->deflink.u, 0, sizeof(sdata->deflink.u)); in ieee80211_setup_sdata()
1726 sdata->vif.type = type; in ieee80211_setup_sdata()
1727 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1728 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1730 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1731 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1732 sdata->control_port_over_nl80211 = false; in ieee80211_setup_sdata()
1733 sdata->control_port_no_preauth = false; in ieee80211_setup_sdata()
1734 sdata->vif.cfg.idle = true; in ieee80211_setup_sdata()
1735 sdata->vif.bss_conf.txpower = INT_MIN; /* unset */ in ieee80211_setup_sdata()
1737 sdata->noack_map = 0; in ieee80211_setup_sdata()
1740 if (sdata->dev) { in ieee80211_setup_sdata()
1741 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1742 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1745 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1746 skb_queue_head_init(&sdata->status_queue); in ieee80211_setup_sdata()
1747 wiphy_work_init(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1748 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1749 INIT_WORK(&sdata->activate_links_work, ieee80211_activate_links_work); in ieee80211_setup_sdata()
1754 sdata->vif.type = type; in ieee80211_setup_sdata()
1755 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1758 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1759 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1760 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1764 sdata->vif.type = type; in ieee80211_setup_sdata()
1765 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1768 sdata->vif.bss_conf.bssid = sdata->deflink.u.mgd.bssid; in ieee80211_setup_sdata()
1769 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1772 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1773 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1776 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1777 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1780 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1781 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1784 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1785 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1786 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1790 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1791 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1792 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1796 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1806 ieee80211_link_setup(&sdata->deflink); in ieee80211_setup_sdata()
1808 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1811 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1814 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1825 if (ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_runtime_change_iftype()
1828 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1830 if (!list_empty(&sdata->u.ap.vlans)) in ieee80211_runtime_change_iftype()
1869 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1873 ieee80211_stop_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1876 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1878 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1880 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_runtime_change_iftype()
1881 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1883 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1890 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1892 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1893 ieee80211_set_vif_encap_ops(sdata); in ieee80211_runtime_change_iftype()
1895 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1898 ieee80211_wake_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1903 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1910 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1913 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1914 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1919 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1920 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1925 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1933 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1954 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1955 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1957 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1965 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1966 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1968 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1970 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1980 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1982 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2016 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2017 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
2019 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
2041 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2042 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2068 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
2077 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2079 if (!sdata) in ieee80211_if_add()
2081 wdev = &sdata->wdev; in ieee80211_if_add()
2083 sdata->dev = NULL; in ieee80211_if_add()
2084 strscpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
2086 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
2087 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2089 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2137 sdata = netdev_priv(ndev); in ieee80211_if_add()
2138 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
2139 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
2140 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2141 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
2145 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
2148 sdata->dev = ndev; in ieee80211_if_add()
2152 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
2154 ieee80211_sdata_init(local, sdata); in ieee80211_if_add()
2156 ieee80211_init_frag_cache(&sdata->frags); in ieee80211_if_add()
2158 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
2160 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
2166 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
2172 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
2174 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2177 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
2180 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
2181 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2182 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
2183 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
2187 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
2189 sdata->deflink.ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
2190 sdata->deflink.user_power_level = local->user_power_level; in ieee80211_if_add()
2193 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
2198 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
2204 sdata->vif.netdev_features = local->hw.netdev_features; in ieee80211_if_add()
2227 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
2231 *new_wdev = &sdata->wdev; in ieee80211_if_add()
2236 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
2240 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2241 list_del_rcu(&sdata->list); in ieee80211_if_remove()
2242 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2244 if (sdata->vif.txq) in ieee80211_if_remove()
2245 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
2249 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
2251 if (!sdata->dev) { in ieee80211_if_remove()
2252 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
2253 kfree(sdata); in ieee80211_if_remove()
2257 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
2259 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
2261 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
2266 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
2294 list_for_each_entry_safe(sdata, tmp, &unreg_list, list) { in ieee80211_remove_interfaces()
2295 bool netdev = sdata->dev; in ieee80211_remove_interfaces()
2297 list_del(&sdata->list); in ieee80211_remove_interfaces()
2298 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
2301 kfree(sdata); in ieee80211_remove_interfaces()
2310 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
2321 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
2322 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
2323 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2342 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2344 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2345 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2346 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2347 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2350 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2352 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2353 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2354 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2355 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()