Lines Matching refs:sdata

47 bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)  in __ieee80211_recalc_txpower()  argument
53 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in __ieee80211_recalc_txpower()
62 if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
63 power = min(power, sdata->user_power_level); in __ieee80211_recalc_txpower()
65 if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
66 power = min(power, sdata->ap_power_level); in __ieee80211_recalc_txpower()
68 if (power != sdata->vif.bss_conf.txpower) { in __ieee80211_recalc_txpower()
69 sdata->vif.bss_conf.txpower = power; in __ieee80211_recalc_txpower()
70 ieee80211_hw_config(sdata->local, 0); in __ieee80211_recalc_txpower()
77 void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_txpower() argument
80 if (__ieee80211_recalc_txpower(sdata) || in ieee80211_recalc_txpower()
81 (update_bss && ieee80211_sdata_running(sdata))) in ieee80211_recalc_txpower()
82 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); in ieee80211_recalc_txpower()
152 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, in ieee80211_verify_mac() argument
155 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
179 if (iter == sdata) in ieee80211_verify_mac()
203 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
208 if (ieee80211_sdata_running(sdata)) in ieee80211_change_mac()
211 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
212 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
215 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
222 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
243 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
246 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
254 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
258 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
260 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
288 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
304 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
309 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
314 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
317 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
325 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
328 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
337 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
338 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
342 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
345 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
351 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
354 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
355 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
371 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
373 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
378 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
380 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
382 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
384 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
389 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
400 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
401 if (!sdata) in ieee80211_add_virtual_monitor()
405 sdata->local = local; in ieee80211_add_virtual_monitor()
406 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
407 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
409 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
411 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_add_virtual_monitor()
413 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
415 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
418 kfree(sdata); in ieee80211_add_virtual_monitor()
422 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
424 kfree(sdata); in ieee80211_add_virtual_monitor()
429 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
433 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
441 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
442 kfree(sdata); in ieee80211_add_virtual_monitor()
446 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
447 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
454 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
463 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
465 if (!sdata) { in ieee80211_del_virtual_monitor()
476 ieee80211_vif_release_channel(sdata); in ieee80211_del_virtual_monitor()
479 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
481 kfree(sdata); in ieee80211_del_virtual_monitor()
491 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
493 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
499 switch (sdata->vif.type) { in ieee80211_do_open()
501 if (!is_valid_ether_addr(sdata->u.wds.remote_addr)) in ieee80211_do_open()
507 if (!sdata->bss) in ieee80211_do_open()
511 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
514 master = container_of(sdata->bss, in ieee80211_do_open()
516 sdata->control_port_protocol = in ieee80211_do_open()
518 sdata->control_port_no_encrypt = in ieee80211_do_open()
520 sdata->control_port_over_nl80211 = in ieee80211_do_open()
522 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
523 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
524 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
525 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
528 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
535 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
582 switch (sdata->vif.type) { in ieee80211_do_open()
585 if (rtnl_dereference(sdata->bss->beacon)) { in ieee80211_do_open()
586 ieee80211_vif_vlan_copy_chanctx(sdata); in ieee80211_do_open()
593 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
598 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
599 res = drv_add_interface(local, sdata); in ieee80211_do_open()
615 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
627 res = drv_add_interface(local, sdata); in ieee80211_do_open()
630 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
631 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
636 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
641 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
645 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
646 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
647 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
648 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_do_open()
650 switch (sdata->vif.type) { in ieee80211_do_open()
673 ieee80211_set_wmm_default(sdata, true, in ieee80211_do_open()
674 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
677 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
679 switch (sdata->vif.type) { in ieee80211_do_open()
682 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, in ieee80211_do_open()
703 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
706 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
708 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
719 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
730 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
731 sdata->vif.type == NL80211_IFTYPE_AP_VLAN || in ieee80211_do_open()
745 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || in ieee80211_do_open()
746 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
747 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
749 int ac_queue = sdata->vif.hw_queue[ac]; in ieee80211_do_open()
761 drv_remove_interface(local, sdata); in ieee80211_do_open()
766 sdata->bss = NULL; in ieee80211_do_open()
767 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
769 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
773 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
779 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
786 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
790 return ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
793 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, in ieee80211_do_stop() argument
796 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
806 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
808 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
815 if (sdata->dev) in ieee80211_do_stop()
816 netif_tx_stop_all_queues(sdata->dev); in ieee80211_do_stop()
818 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
820 switch (sdata->vif.type) { in ieee80211_do_stop()
822 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
825 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
828 cancel_work_sync(&sdata->u.ap.request_smps_work); in ieee80211_do_stop()
831 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_stop()
833 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
854 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
855 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_do_stop()
856 ((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) || in ieee80211_do_stop()
857 (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1))); in ieee80211_do_stop()
860 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
863 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
866 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
870 if (sdata->dev) { in ieee80211_do_stop()
871 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
873 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
874 sdata->dev->addr_len); in ieee80211_do_stop()
876 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
882 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
883 sdata_lock(sdata); in ieee80211_do_stop()
885 sdata->vif.csa_active = false; in ieee80211_do_stop()
886 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
887 sdata->u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
888 if (sdata->csa_block_tx) { in ieee80211_do_stop()
889 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
891 sdata->csa_block_tx = false; in ieee80211_do_stop()
894 sdata_unlock(sdata); in ieee80211_do_stop()
896 cancel_work_sync(&sdata->csa_finalize_work); in ieee80211_do_stop()
898 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_do_stop()
900 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
901 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
904 ieee80211_vif_release_channel(sdata); in ieee80211_do_stop()
906 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
912 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
916 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_do_stop()
919 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
920 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
922 ps = &sdata->bss->ps; in ieee80211_do_stop()
926 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
938 switch (sdata->vif.type) { in ieee80211_do_stop()
941 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
943 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL); in ieee80211_do_stop()
945 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
949 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
960 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
964 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
966 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
967 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
970 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
972 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
979 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
992 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
993 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
1000 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
1008 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
1009 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
1011 sdata->bss = NULL; in ieee80211_do_stop()
1016 sdata->vif.bss_conf.beacon_int = 0; 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()
1180 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
1181 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
1194 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
1230 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1232 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1236 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1246 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1254 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1266 ieee80211_process_delba(sdata, sta, in ieee80211_iface_work()
1288 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1291 ieee80211_vht_handle_opmode(sdata, sta, in ieee80211_iface_work()
1299 ieee80211_process_mu_groups(sdata, mgmt); in ieee80211_iface_work()
1325 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1335 } else switch (sdata->vif.type) { in ieee80211_iface_work()
1337 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1340 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1343 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1345 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1356 switch (sdata->vif.type) { in ieee80211_iface_work()
1358 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1361 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1364 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1366 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1369 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1378 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1381 ieee80211_recalc_smps(sdata); in ieee80211_recalc_smps_work()
1387 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1394 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1397 sdata->vif.type = type; in ieee80211_setup_sdata()
1398 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1399 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1401 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1402 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1403 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_setup_sdata()
1404 sdata->vif.bss_conf.idle = true; in ieee80211_setup_sdata()
1406 sdata->noack_map = 0; in ieee80211_setup_sdata()
1409 if (sdata->dev) { in ieee80211_setup_sdata()
1410 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1411 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1414 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1415 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1416 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1417 INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work); in ieee80211_setup_sdata()
1418 INIT_LIST_HEAD(&sdata->assigned_chanctx_list); in ieee80211_setup_sdata()
1419 INIT_LIST_HEAD(&sdata->reserved_chanctx_list); in ieee80211_setup_sdata()
1424 sdata->vif.type = type; in ieee80211_setup_sdata()
1425 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1428 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1429 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1430 INIT_WORK(&sdata->u.ap.request_smps_work, in ieee80211_setup_sdata()
1432 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1433 sdata->u.ap.req_smps = IEEE80211_SMPS_OFF; in ieee80211_setup_sdata()
1437 sdata->vif.type = type; in ieee80211_setup_sdata()
1438 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1441 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid; in ieee80211_setup_sdata()
1442 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1445 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1446 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1449 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1450 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1453 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1454 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1457 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1458 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1459 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1463 sdata->vif.bss_conf.bssid = NULL; in ieee80211_setup_sdata()
1466 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1467 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1468 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1472 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1480 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1483 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1486 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1496 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1536 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1540 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1542 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1544 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1546 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1553 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1555 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1557 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1563 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1570 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1573 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1574 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1579 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1580 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1585 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1593 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1615 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1616 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1618 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1626 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1627 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1629 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1631 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1641 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1643 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1677 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1678 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
1680 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
1702 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1703 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1729 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
1740 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1742 if (!sdata) in ieee80211_if_add()
1744 wdev = &sdata->wdev; in ieee80211_if_add()
1746 sdata->dev = NULL; in ieee80211_if_add()
1747 strlcpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
1749 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
1751 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1807 sdata = netdev_priv(ndev); in ieee80211_if_add()
1808 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
1809 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
1810 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
1814 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
1817 sdata->dev = ndev; in ieee80211_if_add()
1821 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1822 sdata->local = local; in ieee80211_if_add()
1825 skb_queue_head_init(&sdata->fragments[i].skb_list); in ieee80211_if_add()
1827 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
1829 INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work, in ieee80211_if_add()
1831 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
1837 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
1843 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
1845 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1848 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
1851 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
1852 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1853 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
1854 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
1858 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
1860 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
1861 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1863 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_if_add()
1866 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
1871 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
1889 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
1893 *new_wdev = &sdata->wdev; in ieee80211_if_add()
1898 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
1902 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1903 list_del_rcu(&sdata->list); in ieee80211_if_remove()
1904 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1906 if (sdata->vif.txq) in ieee80211_if_remove()
1907 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
1911 if (sdata->dev) { in ieee80211_if_remove()
1912 unregister_netdevice(sdata->dev); in ieee80211_if_remove()
1914 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
1915 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
1916 kfree(sdata); in ieee80211_if_remove()
1920 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
1922 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
1924 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
1929 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
1954 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
1955 list_del(&sdata->list); in ieee80211_remove_interfaces()
1957 if (sdata->dev) in ieee80211_remove_interfaces()
1958 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
1960 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
1965 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
1966 list_del(&sdata->list); in ieee80211_remove_interfaces()
1967 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
1968 kfree(sdata); in ieee80211_remove_interfaces()
1976 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
1987 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
1988 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
1989 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2008 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2010 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2011 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2012 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2013 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2016 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2018 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2019 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2020 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2021 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()