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()
353 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
360 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
364 return ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
367 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, 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()
425 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
426 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_do_stop()
427 ((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) || in ieee80211_do_stop()
428 (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1))); in ieee80211_do_stop()
431 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
434 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
437 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
441 if (sdata->dev) { in ieee80211_do_stop()
442 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
444 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
445 sdata->dev->addr_len); in ieee80211_do_stop()
447 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
453 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
454 sdata_lock(sdata); in ieee80211_do_stop()
456 sdata->vif.csa_active = false; in ieee80211_do_stop()
457 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
458 sdata->u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
459 if (sdata->csa_block_tx) { in ieee80211_do_stop()
460 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
462 sdata->csa_block_tx = false; in ieee80211_do_stop()
465 sdata_unlock(sdata); in ieee80211_do_stop()
467 cancel_work_sync(&sdata->csa_finalize_work); in ieee80211_do_stop()
469 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_do_stop()
471 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
472 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
475 ieee80211_vif_release_channel(sdata); in ieee80211_do_stop()
477 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
483 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
487 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_do_stop()
490 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
491 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
493 ps = &sdata->bss->ps; in ieee80211_do_stop()
497 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
509 switch (sdata->vif.type) { in ieee80211_do_stop()
512 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
514 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL); in ieee80211_do_stop()
516 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
520 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
531 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
535 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
537 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
538 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
541 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
543 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
550 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
563 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
564 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
571 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
579 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
580 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
582 sdata->bss = NULL; in ieee80211_do_stop()
587 sdata->vif.bss_conf.beacon_int = 0; in ieee80211_do_stop()
604 switch (sdata->vif.type) { in ieee80211_do_stop()
615 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_do_stop()
621 drv_remove_interface(local, sdata); in ieee80211_do_stop()
646 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
648 ieee80211_do_stop(sdata, true); in ieee80211_stop()
655 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
656 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
660 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
667 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
680 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()
690 __skb_queue_purge(&sdata->fragments[i].skb_list); in ieee80211_teardown_sdata()
691 sdata->fragment_next = 0; in ieee80211_teardown_sdata()
693 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
694 ieee80211_mesh_teardown_sdata(sdata); in ieee80211_teardown_sdata()
730 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
731 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
751 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
788 static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata) in ieee80211_set_sdata_offload_flags() argument
790 struct ieee80211_local *local = sdata->local; in ieee80211_set_sdata_offload_flags()
793 flags = sdata->vif.offload_flags; in ieee80211_set_sdata_offload_flags()
796 ieee80211_iftype_supports_encap_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
809 if (sdata->vif.offload_flags == flags) in ieee80211_set_sdata_offload_flags()
812 sdata->vif.offload_flags = flags; in ieee80211_set_sdata_offload_flags()
816 static void ieee80211_set_vif_encap_ops(struct ieee80211_sub_if_data *sdata) in ieee80211_set_vif_encap_ops() argument
818 struct ieee80211_local *local = sdata->local; in ieee80211_set_vif_encap_ops()
819 struct ieee80211_sub_if_data *bss = sdata; in ieee80211_set_vif_encap_ops()
822 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_set_vif_encap_ops()
823 if (!sdata->bss) in ieee80211_set_vif_encap_ops()
826 bss = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); in ieee80211_set_vif_encap_ops()
834 if (sdata->wdev.use_4addr && in ieee80211_set_vif_encap_ops()
838 sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops : in ieee80211_set_vif_encap_ops()
842 static void ieee80211_recalc_sdata_offload(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_sdata_offload() argument
844 struct ieee80211_local *local = sdata->local; in ieee80211_recalc_sdata_offload()
847 if (ieee80211_set_sdata_offload_flags(sdata)) { in ieee80211_recalc_sdata_offload()
848 drv_update_vif_offload(local, sdata); in ieee80211_recalc_sdata_offload()
849 ieee80211_set_vif_encap_ops(sdata); in ieee80211_recalc_sdata_offload()
854 vsdata->bss != &sdata->u.ap) in ieee80211_recalc_sdata_offload()
863 struct ieee80211_sub_if_data *sdata; in ieee80211_recalc_offload() local
870 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_offload()
871 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_offload()
874 ieee80211_recalc_sdata_offload(sdata); in ieee80211_recalc_offload()
880 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
883 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
884 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
900 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
902 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
907 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
909 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
911 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
913 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
918 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
929 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
930 if (!sdata) in ieee80211_add_virtual_monitor()
934 sdata->local = local; in ieee80211_add_virtual_monitor()
935 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
936 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
938 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
940 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_add_virtual_monitor()
942 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
944 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
947 kfree(sdata); in ieee80211_add_virtual_monitor()
951 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_add_virtual_monitor()
953 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
955 kfree(sdata); in ieee80211_add_virtual_monitor()
960 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
964 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
972 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
973 kfree(sdata); in ieee80211_add_virtual_monitor()
977 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
978 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
985 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
994 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
996 if (!sdata) { in ieee80211_del_virtual_monitor()
1007 ieee80211_vif_release_channel(sdata); in ieee80211_del_virtual_monitor()
1010 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
1012 kfree(sdata); in ieee80211_del_virtual_monitor()
1022 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
1024 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
1030 switch (sdata->vif.type) { in ieee80211_do_open()
1032 if (!is_valid_ether_addr(sdata->u.wds.remote_addr)) in ieee80211_do_open()
1038 if (!sdata->bss) in ieee80211_do_open()
1042 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
1045 master = container_of(sdata->bss, in ieee80211_do_open()
1047 sdata->control_port_protocol = in ieee80211_do_open()
1049 sdata->control_port_no_encrypt = in ieee80211_do_open()
1051 sdata->control_port_over_nl80211 = in ieee80211_do_open()
1053 sdata->control_port_no_preauth = in ieee80211_do_open()
1055 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
1056 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
1057 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
1058 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
1061 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
1068 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
1115 switch (sdata->vif.type) { in ieee80211_do_open()
1118 if (rtnl_dereference(sdata->bss->beacon)) { in ieee80211_do_open()
1119 ieee80211_vif_vlan_copy_chanctx(sdata); in ieee80211_do_open()
1121 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1127 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
1132 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
1133 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1149 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
1161 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_do_open()
1163 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1167 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1168 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
1169 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
1174 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
1179 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
1183 if (sdata->vif.probe_req_reg) in ieee80211_do_open()
1184 drv_config_iface_filter(local, sdata, in ieee80211_do_open()
1188 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
1189 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
1190 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
1191 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_do_open()
1193 switch (sdata->vif.type) { in ieee80211_do_open()
1216 ieee80211_set_wmm_default(sdata, true, in ieee80211_do_open()
1217 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
1220 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1222 switch (sdata->vif.type) { in ieee80211_do_open()
1225 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, in ieee80211_do_open()
1246 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
1249 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
1251 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
1262 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
1273 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
1274 sdata->vif.type == NL80211_IFTYPE_AP_VLAN || in ieee80211_do_open()
1288 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || in ieee80211_do_open()
1289 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
1290 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
1292 int ac_queue = sdata->vif.hw_queue[ac]; in ieee80211_do_open()
1304 drv_remove_interface(local, sdata); in ieee80211_do_open()
1309 sdata->bss = NULL; in ieee80211_do_open()
1310 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
1312 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
1316 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1342 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1344 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1348 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1358 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1366 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1378 ieee80211_process_delba(sdata, sta, in ieee80211_iface_work()
1400 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1403 ieee80211_vht_handle_opmode(sdata, sta, in ieee80211_iface_work()
1411 ieee80211_process_mu_groups(sdata, mgmt); in ieee80211_iface_work()
1418 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_iface_work()
1419 ieee80211_sta_rx_queued_ext(sdata, skb); in ieee80211_iface_work()
1442 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1452 } else switch (sdata->vif.type) { in ieee80211_iface_work()
1454 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1457 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1460 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1462 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1473 switch (sdata->vif.type) { in ieee80211_iface_work()
1475 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1478 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1481 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1483 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1486 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1495 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1498 ieee80211_recalc_smps(sdata); in ieee80211_recalc_smps_work()
1504 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1511 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1514 sdata->vif.type = type; in ieee80211_setup_sdata()
1515 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1516 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1518 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1519 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1520 sdata->control_port_over_nl80211 = false; in ieee80211_setup_sdata()
1521 sdata->control_port_no_preauth = false; in ieee80211_setup_sdata()
1522 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_setup_sdata()
1523 sdata->vif.bss_conf.idle = true; in ieee80211_setup_sdata()
1524 sdata->vif.bss_conf.txpower = INT_MIN; /* unset */ in ieee80211_setup_sdata()
1526 sdata->noack_map = 0; in ieee80211_setup_sdata()
1529 if (sdata->dev) { in ieee80211_setup_sdata()
1530 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1531 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1534 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1535 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1536 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1537 INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work); in ieee80211_setup_sdata()
1538 INIT_LIST_HEAD(&sdata->assigned_chanctx_list); in ieee80211_setup_sdata()
1539 INIT_LIST_HEAD(&sdata->reserved_chanctx_list); in ieee80211_setup_sdata()
1544 sdata->vif.type = type; in ieee80211_setup_sdata()
1545 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1548 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1549 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1550 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1554 sdata->vif.type = type; in ieee80211_setup_sdata()
1555 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1558 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid; in ieee80211_setup_sdata()
1559 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1562 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1563 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1566 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1567 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1570 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1571 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1574 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1575 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1576 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1580 sdata->vif.bss_conf.bssid = NULL; in ieee80211_setup_sdata()
1583 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1584 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1585 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1589 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1597 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1600 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1603 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1613 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1653 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1657 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1659 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1661 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_runtime_change_iftype()
1662 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1664 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1671 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1673 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1674 ieee80211_set_vif_encap_ops(sdata); in ieee80211_runtime_change_iftype()
1676 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1682 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1689 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1692 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1693 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1698 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1699 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1704 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1712 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1734 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1735 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1737 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1745 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1746 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1748 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1750 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1760 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1762 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1796 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1797 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
1799 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
1821 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1822 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1848 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
1859 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1861 if (!sdata) in ieee80211_if_add()
1863 wdev = &sdata->wdev; in ieee80211_if_add()
1865 sdata->dev = NULL; in ieee80211_if_add()
1866 strlcpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
1868 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
1870 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1930 sdata = netdev_priv(ndev); in ieee80211_if_add()
1931 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
1932 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
1933 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
1937 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
1940 sdata->dev = ndev; in ieee80211_if_add()
1944 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1945 sdata->local = local; in ieee80211_if_add()
1948 skb_queue_head_init(&sdata->fragments[i].skb_list); in ieee80211_if_add()
1950 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
1952 INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work, in ieee80211_if_add()
1954 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
1960 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
1966 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
1968 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1971 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
1974 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
1975 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1976 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
1977 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
1981 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
1983 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
1984 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1986 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_if_add()
1989 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
1994 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
2014 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
2018 *new_wdev = &sdata->wdev; in ieee80211_if_add()
2023 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
2027 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2028 list_del_rcu(&sdata->list); in ieee80211_if_remove()
2029 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2031 if (sdata->vif.txq) in ieee80211_if_remove()
2032 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
2036 if (sdata->dev) { in ieee80211_if_remove()
2037 unregister_netdevice(sdata->dev); in ieee80211_if_remove()
2039 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
2040 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
2041 kfree(sdata); in ieee80211_if_remove()
2045 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
2047 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
2049 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
2054 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
2079 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
2080 list_del(&sdata->list); in ieee80211_remove_interfaces()
2082 if (sdata->dev) in ieee80211_remove_interfaces()
2083 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
2085 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
2090 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
2091 list_del(&sdata->list); in ieee80211_remove_interfaces()
2092 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
2093 kfree(sdata); in ieee80211_remove_interfaces()
2101 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
2112 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
2113 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
2114 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2133 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2135 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2136 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2137 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2138 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2141 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2143 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2144 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2145 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2146 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()