Lines Matching refs:sdata
49 bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata) in __ieee80211_recalc_txpower() argument
55 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in __ieee80211_recalc_txpower()
64 if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
65 power = min(power, sdata->user_power_level); in __ieee80211_recalc_txpower()
67 if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
68 power = min(power, sdata->ap_power_level); in __ieee80211_recalc_txpower()
70 if (power != sdata->vif.bss_conf.txpower) { in __ieee80211_recalc_txpower()
71 sdata->vif.bss_conf.txpower = power; in __ieee80211_recalc_txpower()
72 ieee80211_hw_config(sdata->local, 0); in __ieee80211_recalc_txpower()
79 void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_txpower() argument
82 if (__ieee80211_recalc_txpower(sdata) || in ieee80211_recalc_txpower()
83 (update_bss && ieee80211_sdata_running(sdata))) in ieee80211_recalc_txpower()
84 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); 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()
205 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
210 if (ieee80211_sdata_running(sdata)) in ieee80211_change_mac()
213 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
214 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
217 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
224 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
245 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
248 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
256 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
260 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
262 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
290 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
306 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
311 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
316 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
319 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
327 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
330 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
339 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
340 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
344 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
347 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
353 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
356 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
357 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
373 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
375 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
380 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
382 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
384 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
386 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
391 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
402 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
403 if (!sdata) in ieee80211_add_virtual_monitor()
407 sdata->local = local; in ieee80211_add_virtual_monitor()
408 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
409 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
411 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
413 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_add_virtual_monitor()
415 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
417 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
420 kfree(sdata); in ieee80211_add_virtual_monitor()
424 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
426 kfree(sdata); in ieee80211_add_virtual_monitor()
431 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
435 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
443 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
444 kfree(sdata); in ieee80211_add_virtual_monitor()
448 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
449 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
456 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
465 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
467 if (!sdata) { in ieee80211_del_virtual_monitor()
478 ieee80211_vif_release_channel(sdata); in ieee80211_del_virtual_monitor()
481 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
483 kfree(sdata); in ieee80211_del_virtual_monitor()
493 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
495 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
501 switch (sdata->vif.type) { in ieee80211_do_open()
503 if (!is_valid_ether_addr(sdata->u.wds.remote_addr)) in ieee80211_do_open()
509 if (!sdata->bss) in ieee80211_do_open()
513 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
516 master = container_of(sdata->bss, in ieee80211_do_open()
518 sdata->control_port_protocol = in ieee80211_do_open()
520 sdata->control_port_no_encrypt = in ieee80211_do_open()
522 sdata->control_port_over_nl80211 = in ieee80211_do_open()
524 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
525 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
526 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
527 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
530 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
537 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
584 switch (sdata->vif.type) { in ieee80211_do_open()
587 if (rtnl_dereference(sdata->bss->beacon)) { in ieee80211_do_open()
588 ieee80211_vif_vlan_copy_chanctx(sdata); in ieee80211_do_open()
595 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
600 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
601 res = drv_add_interface(local, sdata); in ieee80211_do_open()
617 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
629 res = drv_add_interface(local, sdata); in ieee80211_do_open()
632 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
633 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
638 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
643 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
647 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
648 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
649 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
650 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_do_open()
652 switch (sdata->vif.type) { in ieee80211_do_open()
675 ieee80211_set_wmm_default(sdata, true, in ieee80211_do_open()
676 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
679 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
681 switch (sdata->vif.type) { in ieee80211_do_open()
684 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, in ieee80211_do_open()
705 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
708 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
710 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
721 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
732 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
733 sdata->vif.type == NL80211_IFTYPE_AP_VLAN || in ieee80211_do_open()
747 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || in ieee80211_do_open()
748 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
749 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
751 int ac_queue = sdata->vif.hw_queue[ac]; in ieee80211_do_open()
763 drv_remove_interface(local, sdata); in ieee80211_do_open()
768 sdata->bss = NULL; in ieee80211_do_open()
769 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
771 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
775 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
781 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
788 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
792 return ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
795 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, in ieee80211_do_stop() argument
798 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
808 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
810 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
817 if (sdata->dev) in ieee80211_do_stop()
818 netif_tx_stop_all_queues(sdata->dev); in ieee80211_do_stop()
820 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
822 switch (sdata->vif.type) { in ieee80211_do_stop()
824 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
827 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
830 cancel_work_sync(&sdata->u.ap.request_smps_work); in ieee80211_do_stop()
833 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_stop()
835 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
856 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
857 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_do_stop()
858 ((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) || in ieee80211_do_stop()
859 (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1))); in ieee80211_do_stop()
862 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
865 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
868 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
872 if (sdata->dev) { in ieee80211_do_stop()
873 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
875 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
876 sdata->dev->addr_len); in ieee80211_do_stop()
878 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
884 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
885 sdata_lock(sdata); in ieee80211_do_stop()
887 sdata->vif.csa_active = false; in ieee80211_do_stop()
888 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
889 sdata->u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
890 if (sdata->csa_block_tx) { in ieee80211_do_stop()
891 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
893 sdata->csa_block_tx = false; in ieee80211_do_stop()
896 sdata_unlock(sdata); in ieee80211_do_stop()
898 cancel_work_sync(&sdata->csa_finalize_work); in ieee80211_do_stop()
900 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_do_stop()
902 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
903 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
906 ieee80211_vif_release_channel(sdata); in ieee80211_do_stop()
908 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
914 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
918 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_do_stop()
921 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
922 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
924 ps = &sdata->bss->ps; in ieee80211_do_stop()
928 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
940 switch (sdata->vif.type) { in ieee80211_do_stop()
943 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
945 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL); in ieee80211_do_stop()
947 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
951 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
962 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
966 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
968 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
969 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
972 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
974 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
981 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
994 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
995 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
1002 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
1010 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
1011 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
1013 sdata->bss = NULL; in ieee80211_do_stop()
1033 switch (sdata->vif.type) { in ieee80211_do_stop()
1044 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_do_stop()
1050 drv_remove_interface(local, sdata); in ieee80211_do_stop()
1075 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
1077 ieee80211_do_stop(sdata, true); in ieee80211_stop()
1084 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
1085 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
1089 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
1096 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
1109 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
1114 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
1116 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
1119 __skb_queue_purge(&sdata->fragments[i].skb_list); in ieee80211_teardown_sdata()
1120 sdata->fragment_next = 0; in ieee80211_teardown_sdata()
1122 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
1123 ieee80211_mesh_teardown_sdata(sdata); in ieee80211_teardown_sdata()
1182 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
1183 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
1196 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
1232 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1234 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1238 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1248 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1256 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1268 ieee80211_process_delba(sdata, sta, in ieee80211_iface_work()
1290 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1293 ieee80211_vht_handle_opmode(sdata, sta, in ieee80211_iface_work()
1301 ieee80211_process_mu_groups(sdata, mgmt); in ieee80211_iface_work()
1327 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1337 } else switch (sdata->vif.type) { in ieee80211_iface_work()
1339 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1342 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1345 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1347 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1358 switch (sdata->vif.type) { in ieee80211_iface_work()
1360 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1363 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1366 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1368 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1371 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1380 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1383 ieee80211_recalc_smps(sdata); in ieee80211_recalc_smps_work()
1389 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1396 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1399 sdata->vif.type = type; in ieee80211_setup_sdata()
1400 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1401 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1403 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1404 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1405 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_setup_sdata()
1406 sdata->vif.bss_conf.idle = true; in ieee80211_setup_sdata()
1408 sdata->noack_map = 0; in ieee80211_setup_sdata()
1411 if (sdata->dev) { in ieee80211_setup_sdata()
1412 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1413 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1416 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1417 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1418 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1419 INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work); in ieee80211_setup_sdata()
1420 INIT_LIST_HEAD(&sdata->assigned_chanctx_list); in ieee80211_setup_sdata()
1421 INIT_LIST_HEAD(&sdata->reserved_chanctx_list); in ieee80211_setup_sdata()
1426 sdata->vif.type = type; in ieee80211_setup_sdata()
1427 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1430 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1431 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1432 INIT_WORK(&sdata->u.ap.request_smps_work, in ieee80211_setup_sdata()
1434 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1435 sdata->u.ap.req_smps = IEEE80211_SMPS_OFF; in ieee80211_setup_sdata()
1439 sdata->vif.type = type; in ieee80211_setup_sdata()
1440 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1443 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid; in ieee80211_setup_sdata()
1444 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1447 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1448 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1451 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1452 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1455 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1456 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1459 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1460 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1461 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1465 sdata->vif.bss_conf.bssid = NULL; in ieee80211_setup_sdata()
1468 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1469 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1470 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1474 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1482 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1485 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1488 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1498 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1538 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1542 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1544 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1546 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1548 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1555 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1557 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1559 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1565 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1572 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1575 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1576 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1581 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1582 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1587 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1595 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1617 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1618 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1620 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1628 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1629 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1631 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1633 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1643 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1645 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1679 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1680 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
1682 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
1704 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1705 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1731 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
1742 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1744 if (!sdata) in ieee80211_if_add()
1746 wdev = &sdata->wdev; in ieee80211_if_add()
1748 sdata->dev = NULL; in ieee80211_if_add()
1749 strlcpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
1751 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
1753 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1809 sdata = netdev_priv(ndev); in ieee80211_if_add()
1810 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
1811 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
1812 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
1816 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
1819 sdata->dev = ndev; in ieee80211_if_add()
1823 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1824 sdata->local = local; in ieee80211_if_add()
1827 skb_queue_head_init(&sdata->fragments[i].skb_list); in ieee80211_if_add()
1829 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
1831 INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work, in ieee80211_if_add()
1833 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
1839 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
1845 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
1847 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1850 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
1853 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
1854 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1855 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
1856 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
1860 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
1862 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
1863 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1865 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_if_add()
1868 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
1874 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
1893 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
1897 *new_wdev = &sdata->wdev; in ieee80211_if_add()
1902 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
1906 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1907 list_del_rcu(&sdata->list); in ieee80211_if_remove()
1908 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1912 if (sdata->dev) { in ieee80211_if_remove()
1913 unregister_netdevice(sdata->dev); in ieee80211_if_remove()
1915 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
1916 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
1917 kfree(sdata); in ieee80211_if_remove()
1921 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
1923 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
1925 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
1930 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
1953 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
1954 list_del(&sdata->list); in ieee80211_remove_interfaces()
1956 if (sdata->dev) in ieee80211_remove_interfaces()
1957 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
1959 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
1964 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
1965 list_del(&sdata->list); in ieee80211_remove_interfaces()
1966 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
1967 kfree(sdata); in ieee80211_remove_interfaces()
1975 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
1986 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
1987 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
1988 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2007 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2009 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2010 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2011 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2012 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2015 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2017 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2018 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2019 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2020 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()