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.chanctx_conf); in __ieee80211_recalc_txpower()
63 if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
64 power = min(power, sdata->user_power_level); in __ieee80211_recalc_txpower()
66 if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
67 power = min(power, sdata->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_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); in ieee80211_recalc_txpower()
153 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, in ieee80211_verify_mac() argument
156 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
180 if (iter == sdata) in ieee80211_verify_mac()
204 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
209 if (ieee80211_sdata_running(sdata)) in ieee80211_change_mac()
212 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
213 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
216 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
223 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
240 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
243 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
251 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
255 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
257 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
285 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
301 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
306 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
311 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
314 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
322 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
325 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
334 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
335 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
339 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
342 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
350 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
357 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
361 wiphy_lock(sdata->local->hw.wiphy); in ieee80211_open()
362 err = ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
363 wiphy_unlock(sdata->local->hw.wiphy); in ieee80211_open()
368 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down) in ieee80211_do_stop() argument
370 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
380 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
382 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
389 if (sdata->dev) in ieee80211_do_stop()
390 netif_tx_stop_all_queues(sdata->dev); in ieee80211_do_stop()
392 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
394 switch (sdata->vif.type) { in ieee80211_do_stop()
396 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
399 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
402 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_stop()
404 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
424 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
425 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && flushed > 0); in ieee80211_do_stop()
428 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
431 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
434 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
438 if (sdata->dev) { in ieee80211_do_stop()
439 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
441 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
442 sdata->dev->addr_len); in ieee80211_do_stop()
444 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
450 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
451 sdata_lock(sdata); in ieee80211_do_stop()
453 sdata->vif.csa_active = false; in ieee80211_do_stop()
454 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
455 sdata->u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
456 if (sdata->csa_block_tx) { in ieee80211_do_stop()
457 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
459 sdata->csa_block_tx = false; in ieee80211_do_stop()
462 sdata_unlock(sdata); in ieee80211_do_stop()
464 cancel_work_sync(&sdata->csa_finalize_work); in ieee80211_do_stop()
465 cancel_work_sync(&sdata->color_change_finalize_work); in ieee80211_do_stop()
467 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_do_stop()
469 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
470 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
473 ieee80211_vif_release_channel(sdata); in ieee80211_do_stop()
475 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
480 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
481 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
482 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
484 ps = &sdata->bss->ps; in ieee80211_do_stop()
488 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
500 switch (sdata->vif.type) { in ieee80211_do_stop()
503 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
505 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL); in ieee80211_do_stop()
507 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
511 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
522 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
526 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
528 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
529 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
532 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
534 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
541 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
553 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
554 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
555 skb_queue_purge(&sdata->status_queue); in ieee80211_do_stop()
562 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
570 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
571 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
573 sdata->bss = NULL; in ieee80211_do_stop()
578 sdata->vif.bss_conf.beacon_int = 0; in ieee80211_do_stop()
595 switch (sdata->vif.type) { in ieee80211_do_stop()
606 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_do_stop()
612 drv_remove_interface(local, sdata); in ieee80211_do_stop()
637 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
640 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_stop()
643 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_stop()
648 wiphy_lock(sdata->local->hw.wiphy); in ieee80211_stop()
649 ieee80211_do_stop(sdata, true); in ieee80211_stop()
650 wiphy_unlock(sdata->local->hw.wiphy); in ieee80211_stop()
657 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
658 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
662 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
669 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
682 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
685 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
687 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
689 ieee80211_destroy_frag_cache(&sdata->frags); in ieee80211_teardown_sdata()
691 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
692 ieee80211_mesh_teardown_sdata(sdata); in ieee80211_teardown_sdata()
728 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
729 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
749 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
786 static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata) in ieee80211_set_sdata_offload_flags() argument
788 struct ieee80211_local *local = sdata->local; in ieee80211_set_sdata_offload_flags()
791 flags = sdata->vif.offload_flags; in ieee80211_set_sdata_offload_flags()
794 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
808 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
818 if (sdata->vif.offload_flags == flags) in ieee80211_set_sdata_offload_flags()
821 sdata->vif.offload_flags = flags; in ieee80211_set_sdata_offload_flags()
822 ieee80211_check_fast_rx_iface(sdata); in ieee80211_set_sdata_offload_flags()
826 static void ieee80211_set_vif_encap_ops(struct ieee80211_sub_if_data *sdata) in ieee80211_set_vif_encap_ops() argument
828 struct ieee80211_local *local = sdata->local; in ieee80211_set_vif_encap_ops()
829 struct ieee80211_sub_if_data *bss = sdata; in ieee80211_set_vif_encap_ops()
832 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_set_vif_encap_ops()
833 if (!sdata->bss) in ieee80211_set_vif_encap_ops()
836 bss = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); in ieee80211_set_vif_encap_ops()
844 if (sdata->wdev.use_4addr && in ieee80211_set_vif_encap_ops()
848 sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops : in ieee80211_set_vif_encap_ops()
852 static void ieee80211_recalc_sdata_offload(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_sdata_offload() argument
854 struct ieee80211_local *local = sdata->local; in ieee80211_recalc_sdata_offload()
857 if (ieee80211_set_sdata_offload_flags(sdata)) { in ieee80211_recalc_sdata_offload()
858 drv_update_vif_offload(local, sdata); in ieee80211_recalc_sdata_offload()
859 ieee80211_set_vif_encap_ops(sdata); in ieee80211_recalc_sdata_offload()
864 vsdata->bss != &sdata->u.ap) in ieee80211_recalc_sdata_offload()
873 struct ieee80211_sub_if_data *sdata; in ieee80211_recalc_offload() local
880 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_offload()
881 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_offload()
884 ieee80211_recalc_sdata_offload(sdata); in ieee80211_recalc_offload()
890 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
893 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
894 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
910 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
912 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
917 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
919 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
921 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
923 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
928 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
939 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
940 if (!sdata) in ieee80211_add_virtual_monitor()
944 sdata->local = local; in ieee80211_add_virtual_monitor()
945 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
946 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
948 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
950 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_add_virtual_monitor()
952 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
954 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
957 kfree(sdata); in ieee80211_add_virtual_monitor()
961 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_add_virtual_monitor()
963 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
965 kfree(sdata); in ieee80211_add_virtual_monitor()
970 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
974 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
982 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
983 kfree(sdata); in ieee80211_add_virtual_monitor()
987 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
988 skb_queue_head_init(&sdata->status_queue); in ieee80211_add_virtual_monitor()
989 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
996 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
1005 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
1007 if (!sdata) { in ieee80211_del_virtual_monitor()
1018 ieee80211_vif_release_channel(sdata); in ieee80211_del_virtual_monitor()
1021 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
1023 kfree(sdata); in ieee80211_del_virtual_monitor()
1033 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
1035 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
1040 switch (sdata->vif.type) { in ieee80211_do_open()
1044 if (!sdata->bss) in ieee80211_do_open()
1048 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
1051 master = container_of(sdata->bss, in ieee80211_do_open()
1053 sdata->control_port_protocol = in ieee80211_do_open()
1055 sdata->control_port_no_encrypt = in ieee80211_do_open()
1057 sdata->control_port_over_nl80211 = in ieee80211_do_open()
1059 sdata->control_port_no_preauth = in ieee80211_do_open()
1061 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
1062 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
1063 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
1064 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
1067 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
1074 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
1122 switch (sdata->vif.type) { in ieee80211_do_open()
1125 if (rtnl_dereference(sdata->bss->beacon)) { in ieee80211_do_open()
1126 ieee80211_vif_vlan_copy_chanctx(sdata); in ieee80211_do_open()
1128 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1134 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
1139 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
1140 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1156 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
1168 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_do_open()
1170 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1174 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1175 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
1176 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
1181 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
1186 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
1190 if (sdata->vif.probe_req_reg) in ieee80211_do_open()
1191 drv_config_iface_filter(local, sdata, in ieee80211_do_open()
1195 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
1196 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
1197 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
1198 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_do_open()
1200 switch (sdata->vif.type) { in ieee80211_do_open()
1222 ieee80211_set_wmm_default(sdata, true, in ieee80211_do_open()
1223 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
1226 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1228 switch (sdata->vif.type) { in ieee80211_do_open()
1230 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
1233 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
1235 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
1246 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
1257 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
1258 sdata->vif.type == NL80211_IFTYPE_AP_VLAN || in ieee80211_do_open()
1272 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || in ieee80211_do_open()
1273 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
1274 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
1276 int ac_queue = sdata->vif.hw_queue[ac]; in ieee80211_do_open()
1288 drv_remove_interface(local, sdata); in ieee80211_do_open()
1293 sdata->bss = NULL; in ieee80211_do_open()
1294 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
1296 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
1300 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1325 struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_skb() argument
1336 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1348 ieee80211_process_delba(sdata, sta, in ieee80211_iface_process_skb()
1371 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1374 ieee80211_vht_handle_opmode(sdata, sta, opmode, in ieee80211_iface_process_skb()
1381 ieee80211_process_mu_groups(sdata, mgmt); in ieee80211_iface_process_skb()
1392 ieee80211_s1g_rx_twt_action(sdata, skb); in ieee80211_iface_process_skb()
1398 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_iface_process_skb()
1399 ieee80211_sta_rx_queued_ext(sdata, skb); in ieee80211_iface_process_skb()
1424 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1434 } else switch (sdata->vif.type) { in ieee80211_iface_process_skb()
1436 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1439 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1442 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_process_skb()
1444 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1452 static void ieee80211_iface_process_status(struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_status() argument
1462 ieee80211_s1g_status_twt_action(sdata, skb); in ieee80211_iface_process_status()
1472 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1474 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1477 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1487 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1491 ieee80211_process_tdls_channel_switch(sdata, skb); in ieee80211_iface_work()
1493 ieee80211_iface_process_skb(local, sdata, skb); in ieee80211_iface_work()
1500 while ((skb = skb_dequeue(&sdata->status_queue))) { in ieee80211_iface_work()
1503 ieee80211_iface_process_status(sdata, skb); in ieee80211_iface_work()
1510 switch (sdata->vif.type) { in ieee80211_iface_work()
1512 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1515 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1518 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1520 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1523 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1532 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1535 ieee80211_recalc_smps(sdata); in ieee80211_recalc_smps_work()
1541 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1548 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1551 sdata->vif.type = type; in ieee80211_setup_sdata()
1552 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1553 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1555 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1556 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1557 sdata->control_port_over_nl80211 = false; in ieee80211_setup_sdata()
1558 sdata->control_port_no_preauth = false; in ieee80211_setup_sdata()
1559 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_setup_sdata()
1560 sdata->vif.bss_conf.idle = true; in ieee80211_setup_sdata()
1561 sdata->vif.bss_conf.txpower = INT_MIN; /* unset */ in ieee80211_setup_sdata()
1563 sdata->noack_map = 0; in ieee80211_setup_sdata()
1566 if (sdata->dev) { in ieee80211_setup_sdata()
1567 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1568 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1571 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1572 skb_queue_head_init(&sdata->status_queue); in ieee80211_setup_sdata()
1573 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1574 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1575 INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work); in ieee80211_setup_sdata()
1576 INIT_WORK(&sdata->color_change_finalize_work, ieee80211_color_change_finalize_work); in ieee80211_setup_sdata()
1577 INIT_LIST_HEAD(&sdata->assigned_chanctx_list); in ieee80211_setup_sdata()
1578 INIT_LIST_HEAD(&sdata->reserved_chanctx_list); in ieee80211_setup_sdata()
1583 sdata->vif.type = type; in ieee80211_setup_sdata()
1584 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1587 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1588 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1589 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1593 sdata->vif.type = type; in ieee80211_setup_sdata()
1594 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1597 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid; in ieee80211_setup_sdata()
1598 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1601 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1602 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1605 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1606 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1609 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1610 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1613 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1614 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1615 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1619 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1620 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1621 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1625 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1634 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1637 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1640 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1650 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1652 if (!list_empty(&sdata->u.ap.vlans)) in ieee80211_runtime_change_iftype()
1691 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1695 ieee80211_stop_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1699 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1701 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1703 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_runtime_change_iftype()
1704 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1706 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1713 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1715 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1716 ieee80211_set_vif_encap_ops(sdata); in ieee80211_runtime_change_iftype()
1718 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1721 ieee80211_wake_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1726 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1733 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1736 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1737 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1742 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1743 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1748 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1756 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1777 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1778 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1780 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1788 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1789 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1791 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1793 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1803 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1805 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1839 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1840 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
1842 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
1864 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1865 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1891 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
1902 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1904 if (!sdata) in ieee80211_if_add()
1906 wdev = &sdata->wdev; in ieee80211_if_add()
1908 sdata->dev = NULL; in ieee80211_if_add()
1909 strlcpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
1911 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
1913 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1973 sdata = netdev_priv(ndev); in ieee80211_if_add()
1974 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
1975 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
1976 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
1980 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
1983 sdata->dev = ndev; in ieee80211_if_add()
1987 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1988 sdata->local = local; in ieee80211_if_add()
1990 ieee80211_init_frag_cache(&sdata->frags); in ieee80211_if_add()
1992 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
1994 INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work, in ieee80211_if_add()
1996 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
2002 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
2008 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
2010 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2013 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
2016 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
2017 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2018 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
2019 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
2024 init_airtime_info(&sdata->airtime[i], &local->airtime[i]); in ieee80211_if_add()
2026 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
2028 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
2029 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
2031 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_if_add()
2034 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
2039 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
2066 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
2070 *new_wdev = &sdata->wdev; in ieee80211_if_add()
2075 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
2079 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2080 list_del_rcu(&sdata->list); in ieee80211_if_remove()
2081 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2083 if (sdata->vif.txq) in ieee80211_if_remove()
2084 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
2088 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
2090 if (!sdata->dev) { in ieee80211_if_remove()
2091 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
2092 kfree(sdata); in ieee80211_if_remove()
2096 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
2098 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
2100 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
2105 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
2130 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
2131 list_del(&sdata->list); in ieee80211_remove_interfaces()
2133 if (sdata->dev) in ieee80211_remove_interfaces()
2134 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
2136 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
2143 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
2144 list_del(&sdata->list); in ieee80211_remove_interfaces()
2145 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
2146 kfree(sdata); in ieee80211_remove_interfaces()
2155 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
2166 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
2167 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
2168 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2187 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2189 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2190 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2191 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2192 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2195 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2197 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2198 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2199 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2200 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()