Lines Matching refs:sdata

48 bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata)  in __ieee80211_recalc_txpower()  argument
54 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf); in __ieee80211_recalc_txpower()
63 if (sdata->deflink.user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
64 power = min(power, sdata->deflink.user_power_level); in __ieee80211_recalc_txpower()
66 if (sdata->deflink.ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
67 power = min(power, sdata->deflink.ap_power_level); in __ieee80211_recalc_txpower()
69 if (power != sdata->vif.bss_conf.txpower) { in __ieee80211_recalc_txpower()
70 sdata->vif.bss_conf.txpower = power; in __ieee80211_recalc_txpower()
71 ieee80211_hw_config(sdata->local, 0); in __ieee80211_recalc_txpower()
78 void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_txpower() argument
81 if (__ieee80211_recalc_txpower(sdata) || in ieee80211_recalc_txpower()
82 (update_bss && ieee80211_sdata_running(sdata))) in ieee80211_recalc_txpower()
83 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_recalc_txpower()
154 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, in ieee80211_verify_mac() argument
157 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
181 if (iter == sdata) in ieee80211_verify_mac()
203 static int ieee80211_can_powered_addr_change(struct ieee80211_sub_if_data *sdata) in ieee80211_can_powered_addr_change() argument
206 struct ieee80211_local *local = sdata->local; in ieee80211_can_powered_addr_change()
214 if (netif_carrier_ok(sdata->dev)) in ieee80211_can_powered_addr_change()
221 if (roc->sdata != sdata) in ieee80211_can_powered_addr_change()
234 if (sdata == scan_sdata) in ieee80211_can_powered_addr_change()
238 switch (sdata->vif.type) { in ieee80211_can_powered_addr_change()
256 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
257 struct ieee80211_local *local = sdata->local; in ieee80211_change_mac()
263 if (ieee80211_sdata_running(sdata)) { in ieee80211_change_mac()
264 ret = ieee80211_can_powered_addr_change(sdata); in ieee80211_change_mac()
271 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
272 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
275 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
280 drv_remove_interface(local, sdata); in ieee80211_change_mac()
284 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
285 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_change_mac()
292 WARN_ON(drv_add_interface(local, sdata)); in ieee80211_change_mac()
309 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
312 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
320 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
324 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
326 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
354 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
375 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
380 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
385 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
388 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
396 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
399 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
408 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
409 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
413 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
416 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
424 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
431 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
435 wiphy_lock(sdata->local->hw.wiphy); in ieee80211_open()
436 err = ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
437 wiphy_unlock(sdata->local->hw.wiphy); in ieee80211_open()
442 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down) in ieee80211_do_stop() argument
444 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
454 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
457 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
464 if (!local->ops->wake_tx_queue && sdata->dev) in ieee80211_do_stop()
465 netif_tx_stop_all_queues(sdata->dev); in ieee80211_do_stop()
467 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
469 switch (sdata->vif.type) { in ieee80211_do_stop()
471 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
474 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
477 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_stop()
479 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
499 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
500 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && flushed > 0); in ieee80211_do_stop()
503 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
506 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
509 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
513 if (sdata->dev) { in ieee80211_do_stop()
514 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
516 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
517 sdata->dev->addr_len); in ieee80211_do_stop()
519 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
525 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
527 sdata_lock(sdata); in ieee80211_do_stop()
528 WARN(sdata->vif.valid_links, in ieee80211_do_stop()
530 sdata->vif.valid_links); in ieee80211_do_stop()
533 sdata->vif.bss_conf.csa_active = false; in ieee80211_do_stop()
534 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
535 sdata->deflink.u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
536 if (sdata->deflink.csa_block_tx) { in ieee80211_do_stop()
537 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
539 sdata->deflink.csa_block_tx = false; in ieee80211_do_stop()
542 sdata_unlock(sdata); in ieee80211_do_stop()
544 cancel_work_sync(&sdata->deflink.csa_finalize_work); in ieee80211_do_stop()
545 cancel_work_sync(&sdata->deflink.color_change_finalize_work); in ieee80211_do_stop()
547 cancel_delayed_work_sync(&sdata->deflink.dfs_cac_timer_work); in ieee80211_do_stop()
549 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
550 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
553 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_do_stop()
555 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
560 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
561 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
562 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
564 ps = &sdata->bss->ps; in ieee80211_do_stop()
568 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
580 switch (sdata->vif.type) { in ieee80211_do_stop()
583 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
585 RCU_INIT_POINTER(sdata->vif.bss_conf.chanctx_conf, NULL); in ieee80211_do_stop()
587 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
591 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
602 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
606 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
608 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
609 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
612 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
614 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
621 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
633 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
634 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
635 skb_queue_purge(&sdata->status_queue); in ieee80211_do_stop()
642 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
650 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
651 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
653 sdata->bss = NULL; in ieee80211_do_stop()
658 sdata->vif.bss_conf.beacon_int = 0; in ieee80211_do_stop()
675 switch (sdata->vif.type) { in ieee80211_do_stop()
686 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in ieee80211_do_stop()
692 drv_remove_interface(local, sdata); in ieee80211_do_stop()
715 static void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_mbssid() argument
718 struct ieee80211_vif *tx_vif = sdata->vif.mbssid_tx_vif; in ieee80211_stop_mbssid()
724 sdata->vif.mbssid_tx_vif = NULL; in ieee80211_stop_mbssid()
728 if (non_tx_sdata != sdata && non_tx_sdata != tx_sdata && in ieee80211_stop_mbssid()
736 if (sdata != tx_sdata && ieee80211_sdata_running(tx_sdata)) { in ieee80211_stop_mbssid()
744 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
747 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_stop()
750 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_stop()
754 ieee80211_stop_mbssid(sdata); in ieee80211_stop()
757 cancel_work_sync(&sdata->activate_links_work); in ieee80211_stop()
759 wiphy_lock(sdata->local->hw.wiphy); in ieee80211_stop()
760 ieee80211_do_stop(sdata, true); in ieee80211_stop()
761 wiphy_unlock(sdata->local->hw.wiphy); in ieee80211_stop()
768 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
769 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
773 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
780 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
793 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
796 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
798 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
800 ieee80211_destroy_frag_cache(&sdata->frags); in ieee80211_teardown_sdata()
802 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
803 ieee80211_mesh_teardown_sdata(sdata); in ieee80211_teardown_sdata()
805 ieee80211_vif_clear_links(sdata); in ieee80211_teardown_sdata()
806 ieee80211_link_stop(&sdata->deflink); in ieee80211_teardown_sdata()
842 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
843 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
863 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
880 struct ieee80211_sub_if_data *sdata; in ieee80211_netdev_fill_forward_path() local
885 sdata = IEEE80211_DEV_TO_SUB_IF(ctx->dev); in ieee80211_netdev_fill_forward_path()
886 local = sdata->local; in ieee80211_netdev_fill_forward_path()
892 switch (sdata->vif.type) { in ieee80211_netdev_fill_forward_path()
894 sta = rcu_dereference(sdata->u.vlan.sta); in ieee80211_netdev_fill_forward_path()
897 if (sdata->wdev.use_4addr) in ieee80211_netdev_fill_forward_path()
901 sta = sta_info_get_bss(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
906 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
909 if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { in ieee80211_netdev_fill_forward_path()
910 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
919 sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid); in ieee80211_netdev_fill_forward_path()
928 ret = drv_net_fill_forward_path(local, sdata, &sta->sta, ctx, path); in ieee80211_netdev_fill_forward_path()
959 static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata) in ieee80211_set_sdata_offload_flags() argument
961 struct ieee80211_local *local = sdata->local; in ieee80211_set_sdata_offload_flags()
964 flags = sdata->vif.offload_flags; in ieee80211_set_sdata_offload_flags()
967 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
981 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
991 if (sdata->vif.offload_flags == flags) in ieee80211_set_sdata_offload_flags()
994 sdata->vif.offload_flags = flags; in ieee80211_set_sdata_offload_flags()
995 ieee80211_check_fast_rx_iface(sdata); in ieee80211_set_sdata_offload_flags()
999 static void ieee80211_set_vif_encap_ops(struct ieee80211_sub_if_data *sdata) in ieee80211_set_vif_encap_ops() argument
1001 struct ieee80211_local *local = sdata->local; in ieee80211_set_vif_encap_ops()
1002 struct ieee80211_sub_if_data *bss = sdata; in ieee80211_set_vif_encap_ops()
1005 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_set_vif_encap_ops()
1006 if (!sdata->bss) in ieee80211_set_vif_encap_ops()
1009 bss = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); in ieee80211_set_vif_encap_ops()
1017 if (sdata->wdev.use_4addr && in ieee80211_set_vif_encap_ops()
1021 sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops : in ieee80211_set_vif_encap_ops()
1025 static void ieee80211_recalc_sdata_offload(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_sdata_offload() argument
1027 struct ieee80211_local *local = sdata->local; in ieee80211_recalc_sdata_offload()
1030 if (ieee80211_set_sdata_offload_flags(sdata)) { in ieee80211_recalc_sdata_offload()
1031 drv_update_vif_offload(local, sdata); in ieee80211_recalc_sdata_offload()
1032 ieee80211_set_vif_encap_ops(sdata); in ieee80211_recalc_sdata_offload()
1037 vsdata->bss != &sdata->u.ap) in ieee80211_recalc_sdata_offload()
1046 struct ieee80211_sub_if_data *sdata; in ieee80211_recalc_offload() local
1053 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_offload()
1054 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_offload()
1057 ieee80211_recalc_sdata_offload(sdata); in ieee80211_recalc_offload()
1063 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
1066 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
1067 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
1083 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
1085 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
1090 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1092 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
1094 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
1096 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1100 struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_init() argument
1102 sdata->local = local; in ieee80211_sdata_init()
1112 ieee80211_link_init(sdata, -1, &sdata->deflink, &sdata->vif.bss_conf); in ieee80211_sdata_init()
1117 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
1129 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
1130 if (!sdata) in ieee80211_add_virtual_monitor()
1134 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1135 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
1137 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1139 ieee80211_sdata_init(local, sdata); in ieee80211_add_virtual_monitor()
1141 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
1143 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
1146 kfree(sdata); in ieee80211_add_virtual_monitor()
1150 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_add_virtual_monitor()
1152 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
1154 kfree(sdata); in ieee80211_add_virtual_monitor()
1159 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
1163 ret = ieee80211_link_use_channel(&sdata->deflink, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
1171 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
1172 kfree(sdata); in ieee80211_add_virtual_monitor()
1176 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
1177 skb_queue_head_init(&sdata->status_queue); in ieee80211_add_virtual_monitor()
1178 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
1185 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
1195 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
1197 if (!sdata) { in ieee80211_del_virtual_monitor()
1208 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_del_virtual_monitor()
1211 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
1213 kfree(sdata); in ieee80211_del_virtual_monitor()
1223 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
1225 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
1230 switch (sdata->vif.type) { in ieee80211_do_open()
1234 if (!sdata->bss) in ieee80211_do_open()
1238 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
1241 master = container_of(sdata->bss, in ieee80211_do_open()
1243 sdata->control_port_protocol = in ieee80211_do_open()
1245 sdata->control_port_no_encrypt = in ieee80211_do_open()
1247 sdata->control_port_over_nl80211 = in ieee80211_do_open()
1249 sdata->control_port_no_preauth = in ieee80211_do_open()
1251 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
1252 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
1253 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
1254 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
1257 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
1264 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
1310 switch (sdata->vif.type) { in ieee80211_do_open()
1313 if (sdata->bss->active) { in ieee80211_do_open()
1314 ieee80211_link_vlan_copy_chanctx(&sdata->deflink); in ieee80211_do_open()
1316 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1322 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
1327 if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
1328 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1344 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
1356 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_do_open()
1358 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1362 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1363 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
1364 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
1369 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
1374 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
1378 if (sdata->vif.probe_req_reg) in ieee80211_do_open()
1379 drv_config_iface_filter(local, sdata, in ieee80211_do_open()
1383 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
1384 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
1385 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
1386 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_do_open()
1389 switch (sdata->vif.type) { in ieee80211_do_open()
1411 ieee80211_set_wmm_default(&sdata->deflink, true, in ieee80211_do_open()
1412 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
1415 switch (sdata->vif.type) { in ieee80211_do_open()
1417 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
1420 if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) in ieee80211_do_open()
1422 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
1433 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
1444 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
1445 sdata->vif.type == NL80211_IFTYPE_AP_VLAN || in ieee80211_do_open()
1459 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || in ieee80211_do_open()
1460 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
1461 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
1463 int ac_queue = sdata->vif.hw_queue[ac]; in ieee80211_do_open()
1473 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1477 drv_remove_interface(local, sdata); in ieee80211_do_open()
1482 sdata->bss = NULL; in ieee80211_do_open()
1483 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
1485 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
1489 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1514 struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_skb() argument
1525 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1537 ieee80211_process_delba(sdata, sta, in ieee80211_iface_process_skb()
1560 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1563 ieee80211_vht_handle_opmode(sdata, in ieee80211_iface_process_skb()
1571 ieee80211_process_mu_groups(sdata, &sdata->deflink, in ieee80211_iface_process_skb()
1583 ieee80211_s1g_rx_twt_action(sdata, skb); in ieee80211_iface_process_skb()
1589 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_iface_process_skb()
1590 ieee80211_sta_rx_queued_ext(sdata, skb); in ieee80211_iface_process_skb()
1615 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1625 } else switch (sdata->vif.type) { in ieee80211_iface_process_skb()
1627 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1630 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1633 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_process_skb()
1635 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1643 static void ieee80211_iface_process_status(struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_status() argument
1653 ieee80211_s1g_status_twt_action(sdata, skb); in ieee80211_iface_process_status()
1663 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1665 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1668 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1678 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1682 ieee80211_process_tdls_channel_switch(sdata, skb); in ieee80211_iface_work()
1684 ieee80211_iface_process_skb(local, sdata, skb); in ieee80211_iface_work()
1691 while ((skb = skb_dequeue(&sdata->status_queue))) { in ieee80211_iface_work()
1694 ieee80211_iface_process_status(sdata, skb); in ieee80211_iface_work()
1701 switch (sdata->vif.type) { in ieee80211_iface_work()
1703 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1706 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1709 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1711 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1714 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1723 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1726 ieee80211_recalc_smps(sdata, &sdata->deflink); in ieee80211_recalc_smps_work()
1731 struct ieee80211_sub_if_data *sdata = in ieee80211_activate_links_work() local
1735 ieee80211_set_active_links(&sdata->vif, sdata->desired_active_links); in ieee80211_activate_links_work()
1741 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1748 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1749 memset(&sdata->deflink.u, 0, sizeof(sdata->deflink.u)); in ieee80211_setup_sdata()
1752 sdata->vif.type = type; in ieee80211_setup_sdata()
1753 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1754 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1756 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1757 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1758 sdata->control_port_over_nl80211 = false; in ieee80211_setup_sdata()
1759 sdata->control_port_no_preauth = false; in ieee80211_setup_sdata()
1760 sdata->vif.cfg.idle = true; in ieee80211_setup_sdata()
1761 sdata->vif.bss_conf.txpower = INT_MIN; /* unset */ in ieee80211_setup_sdata()
1763 sdata->noack_map = 0; in ieee80211_setup_sdata()
1766 if (sdata->dev) { in ieee80211_setup_sdata()
1767 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1768 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1771 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1772 skb_queue_head_init(&sdata->status_queue); in ieee80211_setup_sdata()
1773 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1774 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1775 INIT_WORK(&sdata->activate_links_work, ieee80211_activate_links_work); in ieee80211_setup_sdata()
1780 sdata->vif.type = type; in ieee80211_setup_sdata()
1781 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1784 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1785 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1786 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1790 sdata->vif.type = type; in ieee80211_setup_sdata()
1791 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1794 sdata->vif.bss_conf.bssid = sdata->deflink.u.mgd.bssid; in ieee80211_setup_sdata()
1795 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1798 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1799 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1802 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1803 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1806 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1807 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1810 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1811 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1812 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1816 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1817 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1818 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1822 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1832 ieee80211_link_setup(&sdata->deflink); in ieee80211_setup_sdata()
1834 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1837 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1840 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1851 if (sdata->vif.valid_links) in ieee80211_runtime_change_iftype()
1854 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1856 if (!list_empty(&sdata->u.ap.vlans)) in ieee80211_runtime_change_iftype()
1895 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1899 ieee80211_stop_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1903 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1905 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1907 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_runtime_change_iftype()
1908 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1910 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1917 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1919 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1920 ieee80211_set_vif_encap_ops(sdata); in ieee80211_runtime_change_iftype()
1922 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1925 ieee80211_wake_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1930 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1937 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1940 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1941 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1946 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1947 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1952 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1960 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1981 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1982 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1984 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1992 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1993 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1995 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1997 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
2007 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2009 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2043 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2044 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
2046 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
2068 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2069 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2095 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
2106 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2108 if (!sdata) in ieee80211_if_add()
2110 wdev = &sdata->wdev; in ieee80211_if_add()
2112 sdata->dev = NULL; in ieee80211_if_add()
2113 strscpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
2115 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
2116 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2118 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2178 sdata = netdev_priv(ndev); in ieee80211_if_add()
2179 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
2180 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
2181 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2182 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
2186 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
2189 sdata->dev = ndev; in ieee80211_if_add()
2193 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
2195 ieee80211_sdata_init(local, sdata); in ieee80211_if_add()
2197 ieee80211_init_frag_cache(&sdata->frags); in ieee80211_if_add()
2199 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
2201 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
2207 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
2213 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
2215 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2218 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
2221 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
2222 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2223 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
2224 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
2228 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
2230 sdata->deflink.ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
2231 sdata->deflink.user_power_level = local->user_power_level; in ieee80211_if_add()
2234 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
2239 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
2267 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
2271 *new_wdev = &sdata->wdev; in ieee80211_if_add()
2276 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
2280 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2281 list_del_rcu(&sdata->list); in ieee80211_if_remove()
2282 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2284 if (sdata->vif.txq) in ieee80211_if_remove()
2285 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
2289 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
2291 if (!sdata->dev) { in ieee80211_if_remove()
2292 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
2293 kfree(sdata); in ieee80211_if_remove()
2297 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
2299 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
2301 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
2306 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
2331 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
2332 list_del(&sdata->list); in ieee80211_remove_interfaces()
2334 if (sdata->dev) in ieee80211_remove_interfaces()
2335 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
2337 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
2344 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
2345 list_del(&sdata->list); in ieee80211_remove_interfaces()
2346 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
2347 kfree(sdata); in ieee80211_remove_interfaces()
2356 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
2367 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
2368 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
2369 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2388 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2390 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2391 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2392 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2393 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2396 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2398 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2399 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2400 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2401 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()