Lines Matching refs:sdata
80 (update_bss && ieee80211_sdata_running(link->sdata))) in ieee80211_recalc_txpower()
81 ieee80211_link_info_change_notify(link->sdata, link, 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()
180 if (iter == sdata) in ieee80211_verify_mac()
201 static int ieee80211_can_powered_addr_change(struct ieee80211_sub_if_data *sdata) in ieee80211_can_powered_addr_change() argument
204 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()
219 if (roc->sdata != sdata) in ieee80211_can_powered_addr_change()
232 if (sdata == scan_sdata) in ieee80211_can_powered_addr_change()
236 switch (sdata->vif.type) { in ieee80211_can_powered_addr_change()
251 static int _ieee80211_change_mac(struct ieee80211_sub_if_data *sdata, in _ieee80211_change_mac() argument
254 struct ieee80211_local *local = sdata->local; in _ieee80211_change_mac()
260 if (ieee80211_sdata_running(sdata)) { in _ieee80211_change_mac()
261 ret = ieee80211_can_powered_addr_change(sdata); in _ieee80211_change_mac()
268 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in _ieee80211_change_mac()
269 !(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE)) in _ieee80211_change_mac()
272 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in _ieee80211_change_mac()
277 drv_remove_interface(local, sdata); in _ieee80211_change_mac()
278 ret = eth_mac_addr(sdata->dev, sa); in _ieee80211_change_mac()
281 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in _ieee80211_change_mac()
282 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in _ieee80211_change_mac()
289 WARN_ON(drv_add_interface(local, sdata)); in _ieee80211_change_mac()
296 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
297 struct ieee80211_local *local = sdata->local; in ieee80211_change_mac()
309 return _ieee80211_change_mac(sdata, addr); in ieee80211_change_mac()
324 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
327 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
335 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
339 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
341 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
369 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
382 sdata->wdev.use_4addr && in ieee80211_check_concurrent_iface()
392 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
396 return ieee80211_check_combinations(sdata, NULL, 0, 0, -1); in ieee80211_check_concurrent_iface()
399 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
402 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
410 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
413 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
422 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
423 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
427 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
430 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
438 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
445 guard(wiphy)(sdata->local->hw.wiphy); in ieee80211_open()
447 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
451 return ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
454 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_down) in ieee80211_do_stop() argument
456 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
469 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
472 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
476 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
478 switch (sdata->vif.type) { in ieee80211_do_stop()
480 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
483 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
486 list_del_rcu(&sdata->u.mntr.list); in ieee80211_do_stop()
489 ieee80211_apvlan_link_clear(sdata); in ieee80211_do_stop()
509 flushed = sta_info_flush(sdata, -1); in ieee80211_do_stop()
510 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && flushed > 0); in ieee80211_do_stop()
513 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
516 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
519 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
523 if (sdata->dev) { in ieee80211_do_stop()
524 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
526 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
527 sdata->dev->addr_len); in ieee80211_do_stop()
529 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
535 WARN(ieee80211_vif_is_mld(&sdata->vif), in ieee80211_do_stop()
537 sdata->vif.valid_links); in ieee80211_do_stop()
539 sdata->vif.bss_conf.csa_active = false; in ieee80211_do_stop()
540 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
541 sdata->deflink.u.mgd.csa.waiting_bcn = false; in ieee80211_do_stop()
542 ieee80211_vif_unblock_queues_csa(sdata); in ieee80211_do_stop()
544 wiphy_work_cancel(local->hw.wiphy, &sdata->deflink.csa.finalize_work); in ieee80211_do_stop()
546 &sdata->deflink.color_change_finalize_work); in ieee80211_do_stop()
548 &sdata->deflink.dfs_cac_timer_work); in ieee80211_do_stop()
550 if (sdata->wdev.links[0].cac_started) { in ieee80211_do_stop()
551 chandef = sdata->vif.bss_conf.chanreq.oper; in ieee80211_do_stop()
553 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_do_stop()
554 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
559 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
560 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
561 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
563 ps = &sdata->bss->ps; in ieee80211_do_stop()
567 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
579 switch (sdata->vif.type) { in ieee80211_do_stop()
581 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
582 RCU_INIT_POINTER(sdata->vif.bss_conf.chanctx_conf, NULL); in ieee80211_do_stop()
584 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
590 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) && in ieee80211_do_stop()
599 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
604 spin_lock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
606 idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, i) { in ieee80211_do_stop()
607 idr_remove(&sdata->u.nan.function_inst_ids, i); in ieee80211_do_stop()
610 idr_destroy(&sdata->u.nan.function_inst_ids); in ieee80211_do_stop()
612 spin_unlock_bh(&sdata->u.nan.func_lock); in ieee80211_do_stop()
619 wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->work); in ieee80211_do_stop()
631 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
632 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
633 skb_queue_purge(&sdata->status_queue); in ieee80211_do_stop()
648 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
662 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_stop()
663 ieee80211_txq_remove_vlan(local, sdata); in ieee80211_do_stop()
665 if (sdata->vif.txq) in ieee80211_do_stop()
666 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_do_stop()
668 sdata->bss = NULL; in ieee80211_do_stop()
673 sdata->vif.bss_conf.beacon_int = 0; in ieee80211_do_stop()
690 switch (sdata->vif.type) { in ieee80211_do_stop()
700 if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) && in ieee80211_do_stop()
704 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_do_stop()
709 drv_remove_interface(local, sdata); in ieee80211_do_stop()
712 memset(sdata->vif.drv_priv, 0, local->hw.vif_data_size); in ieee80211_do_stop()
735 void ieee80211_stop_mbssid(struct ieee80211_sub_if_data *sdata) in ieee80211_stop_mbssid() argument
742 lockdep_assert_wiphy(sdata->local->hw.wiphy); in ieee80211_stop_mbssid()
745 for_each_vif_active_link(&sdata->vif, link_conf, link_id) { in ieee80211_stop_mbssid()
746 tx_bss_conf = sdata_dereference(link_conf->tx_bss_conf, sdata); in ieee80211_stop_mbssid()
756 if (sdata != tx_sdata) { in ieee80211_stop_mbssid()
769 struct ieee80211_sub_if_data *link_sdata = link->sdata; in ieee80211_stop_mbssid()
771 if (link_sdata == sdata || link_sdata == tx_sdata || in ieee80211_stop_mbssid()
785 if (sdata != tx_sdata && ieee80211_sdata_running(tx_sdata)) in ieee80211_stop_mbssid()
793 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
796 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_stop()
799 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_stop()
804 guard(wiphy)(sdata->local->hw.wiphy); in ieee80211_stop()
806 wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->activate_links_work); in ieee80211_stop()
811 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_stop()
812 ieee80211_stop_mbssid(sdata); in ieee80211_stop()
814 ieee80211_do_stop(sdata, true); in ieee80211_stop()
821 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
822 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
826 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
833 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
846 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
848 if (WARN_ON(!list_empty(&sdata->work.entry))) in ieee80211_teardown_sdata()
849 wiphy_work_cancel(sdata->local->hw.wiphy, &sdata->work); in ieee80211_teardown_sdata()
852 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
854 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
856 ieee80211_destroy_frag_cache(&sdata->frags); in ieee80211_teardown_sdata()
858 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
859 ieee80211_mesh_teardown_sdata(sdata); in ieee80211_teardown_sdata()
861 ieee80211_vif_clear_links(sdata); in ieee80211_teardown_sdata()
862 ieee80211_link_stop(&sdata->deflink); in ieee80211_teardown_sdata()
873 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_netdev_setup_tc() local
874 struct ieee80211_local *local = sdata->local; in ieee80211_netdev_setup_tc()
876 return drv_net_setup_tc(local, sdata, dev, type, type_data); in ieee80211_netdev_setup_tc()
893 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
894 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
914 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
930 struct ieee80211_sub_if_data *sdata; in ieee80211_netdev_fill_forward_path() local
935 sdata = IEEE80211_DEV_TO_SUB_IF(ctx->dev); in ieee80211_netdev_fill_forward_path()
936 local = sdata->local; in ieee80211_netdev_fill_forward_path()
942 switch (sdata->vif.type) { in ieee80211_netdev_fill_forward_path()
944 sta = rcu_dereference(sdata->u.vlan.sta); in ieee80211_netdev_fill_forward_path()
947 if (sdata->wdev.use_4addr) in ieee80211_netdev_fill_forward_path()
951 sta = sta_info_get_bss(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
956 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
959 if (sdata->wdev.wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) { in ieee80211_netdev_fill_forward_path()
960 sta = sta_info_get(sdata, ctx->daddr); in ieee80211_netdev_fill_forward_path()
969 sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid); in ieee80211_netdev_fill_forward_path()
978 ret = drv_net_fill_forward_path(local, sdata, &sta->sta, ctx, path); in ieee80211_netdev_fill_forward_path()
1008 static bool ieee80211_set_sdata_offload_flags(struct ieee80211_sub_if_data *sdata) in ieee80211_set_sdata_offload_flags() argument
1010 struct ieee80211_local *local = sdata->local; in ieee80211_set_sdata_offload_flags()
1013 flags = sdata->vif.offload_flags; in ieee80211_set_sdata_offload_flags()
1016 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
1030 ieee80211_iftype_supports_hdr_offload(sdata->vif.type)) { in ieee80211_set_sdata_offload_flags()
1040 if (sdata->vif.offload_flags == flags) in ieee80211_set_sdata_offload_flags()
1043 sdata->vif.offload_flags = flags; in ieee80211_set_sdata_offload_flags()
1044 ieee80211_check_fast_rx_iface(sdata); in ieee80211_set_sdata_offload_flags()
1048 static void ieee80211_set_vif_encap_ops(struct ieee80211_sub_if_data *sdata) in ieee80211_set_vif_encap_ops() argument
1050 struct ieee80211_local *local = sdata->local; in ieee80211_set_vif_encap_ops()
1051 struct ieee80211_sub_if_data *bss = sdata; in ieee80211_set_vif_encap_ops()
1054 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_set_vif_encap_ops()
1055 if (!sdata->bss) in ieee80211_set_vif_encap_ops()
1058 bss = container_of(sdata->bss, struct ieee80211_sub_if_data, u.ap); in ieee80211_set_vif_encap_ops()
1066 if (sdata->wdev.use_4addr && in ieee80211_set_vif_encap_ops()
1070 sdata->dev->netdev_ops = enabled ? &ieee80211_dataif_8023_ops : in ieee80211_set_vif_encap_ops()
1074 static void ieee80211_recalc_sdata_offload(struct ieee80211_sub_if_data *sdata) in ieee80211_recalc_sdata_offload() argument
1076 struct ieee80211_local *local = sdata->local; in ieee80211_recalc_sdata_offload()
1079 if (ieee80211_set_sdata_offload_flags(sdata)) { in ieee80211_recalc_sdata_offload()
1080 drv_update_vif_offload(local, sdata); in ieee80211_recalc_sdata_offload()
1081 ieee80211_set_vif_encap_ops(sdata); in ieee80211_recalc_sdata_offload()
1086 vsdata->bss != &sdata->u.ap) in ieee80211_recalc_sdata_offload()
1095 struct ieee80211_sub_if_data *sdata; in ieee80211_recalc_offload() local
1102 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_recalc_offload()
1103 if (!ieee80211_sdata_running(sdata)) in ieee80211_recalc_offload()
1106 ieee80211_recalc_sdata_offload(sdata); in ieee80211_recalc_offload()
1110 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
1113 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
1114 u32 flags = sdata->u.mntr.flags; in ieee80211_adjust_monitor_flags()
1132 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
1134 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
1139 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1141 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
1143 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
1145 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
1149 struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_init() argument
1151 sdata->local = local; in ieee80211_sdata_init()
1153 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_sdata_init()
1163 ieee80211_link_init(sdata, -1, &sdata->deflink, &sdata->vif.bss_conf); in ieee80211_sdata_init()
1168 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
1178 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
1179 if (!sdata) in ieee80211_add_virtual_monitor()
1183 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1184 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
1186 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
1187 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_add_virtual_monitor()
1189 ieee80211_sdata_init(local, sdata); in ieee80211_add_virtual_monitor()
1191 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
1194 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
1197 kfree(sdata); in ieee80211_add_virtual_monitor()
1202 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_add_virtual_monitor()
1204 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
1206 kfree(sdata); in ieee80211_add_virtual_monitor()
1211 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
1214 ret = ieee80211_link_use_channel(&sdata->deflink, &local->monitor_chanreq, in ieee80211_add_virtual_monitor()
1221 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
1222 kfree(sdata); in ieee80211_add_virtual_monitor()
1226 skb_queue_head_init(&sdata->skb_queue); in ieee80211_add_virtual_monitor()
1227 skb_queue_head_init(&sdata->status_queue); in ieee80211_add_virtual_monitor()
1228 wiphy_work_init(&sdata->work, ieee80211_iface_work); in ieee80211_add_virtual_monitor()
1235 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
1245 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
1247 if (!sdata) { in ieee80211_del_virtual_monitor()
1252 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_del_virtual_monitor()
1253 ieee80211_link_release_channel(&sdata->deflink); in ieee80211_del_virtual_monitor()
1256 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
1263 kfree(sdata); in ieee80211_del_virtual_monitor()
1273 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
1275 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
1282 switch (sdata->vif.type) { in ieee80211_do_open()
1286 if (!sdata->bss) in ieee80211_do_open()
1289 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
1291 master = container_of(sdata->bss, in ieee80211_do_open()
1293 sdata->control_port_protocol = in ieee80211_do_open()
1295 sdata->control_port_no_encrypt = in ieee80211_do_open()
1297 sdata->control_port_over_nl80211 = in ieee80211_do_open()
1299 sdata->control_port_no_preauth = in ieee80211_do_open()
1301 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
1302 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
1303 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
1304 sdata->vif.bss_conf.chanreq = master->vif.bss_conf.chanreq; in ieee80211_do_open()
1306 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
1309 ieee80211_apvlan_link_setup(sdata); in ieee80211_do_open()
1314 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
1361 sdata->vif.addr_valid = sdata->vif.type != NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
1362 (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE); in ieee80211_do_open()
1363 switch (sdata->vif.type) { in ieee80211_do_open()
1366 if (sdata->bss->active) { in ieee80211_do_open()
1369 for_each_link_data(sdata, link) { in ieee80211_do_open()
1374 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1380 if ((sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) || in ieee80211_do_open()
1382 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1402 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
1412 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_do_open()
1414 res = drv_add_interface(local, sdata); in ieee80211_do_open()
1418 ieee80211_set_vif_encap_ops(sdata); in ieee80211_do_open()
1419 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
1420 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
1425 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
1430 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
1434 if (sdata->vif.probe_req_reg) in ieee80211_do_open()
1435 drv_config_iface_filter(local, sdata, in ieee80211_do_open()
1439 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE && in ieee80211_do_open()
1440 sdata->vif.type != NL80211_IFTYPE_NAN) in ieee80211_do_open()
1441 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
1442 ieee80211_link_info_change_notify(sdata, &sdata->deflink, in ieee80211_do_open()
1445 switch (sdata->vif.type) { in ieee80211_do_open()
1467 ieee80211_set_wmm_default(&sdata->deflink, true, in ieee80211_do_open()
1468 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
1471 switch (sdata->vif.type) { in ieee80211_do_open()
1473 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
1476 list_add_tail_rcu(&sdata->u.mntr.list, &local->mon_list); in ieee80211_do_open()
1487 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
1500 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1504 drv_remove_interface(local, sdata); in ieee80211_do_open()
1509 sdata->bss = NULL; in ieee80211_do_open()
1510 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_do_open()
1511 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
1513 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
1527 struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_skb() argument
1539 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1551 ieee80211_process_delba(sdata, sta, in ieee80211_iface_process_skb()
1568 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1579 ieee80211_ht_handle_chanwidth_notif(local, sdata, sta, in ieee80211_iface_process_skb()
1601 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1604 ieee80211_vht_handle_opmode(sdata, in ieee80211_iface_process_skb()
1611 ieee80211_process_mu_groups(sdata, &sdata->deflink, in ieee80211_iface_process_skb()
1623 ieee80211_s1g_rx_twt_action(sdata, skb); in ieee80211_iface_process_skb()
1630 if (sdata->vif.type == NL80211_IFTYPE_STATION) { in ieee80211_iface_process_skb()
1633 ieee80211_process_neg_ttlm_req(sdata, mgmt, in ieee80211_iface_process_skb()
1637 ieee80211_process_neg_ttlm_res(sdata, mgmt, in ieee80211_iface_process_skb()
1641 ieee80211_process_ttlm_teardown(sdata); in ieee80211_iface_process_skb()
1644 ieee80211_process_ml_reconf_resp(sdata, mgmt, in ieee80211_iface_process_skb()
1648 ieee80211_process_epcs_ena_resp(sdata, mgmt, in ieee80211_iface_process_skb()
1652 ieee80211_process_epcs_teardown(sdata, mgmt, in ieee80211_iface_process_skb()
1660 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_iface_process_skb()
1661 ieee80211_sta_rx_queued_ext(sdata, skb); in ieee80211_iface_process_skb()
1685 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_process_skb()
1694 } else switch (sdata->vif.type) { in ieee80211_iface_process_skb()
1696 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1699 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1702 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_process_skb()
1704 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_process_skb()
1712 static void ieee80211_iface_process_status(struct ieee80211_sub_if_data *sdata, in ieee80211_iface_process_status() argument
1722 ieee80211_s1g_status_twt_action(sdata, skb); in ieee80211_iface_process_status()
1732 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1734 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1737 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1747 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1751 ieee80211_process_tdls_channel_switch(sdata, skb); in ieee80211_iface_work()
1753 ieee80211_iface_process_skb(local, sdata, skb); in ieee80211_iface_work()
1760 while ((skb = skb_dequeue(&sdata->status_queue))) { in ieee80211_iface_work()
1763 ieee80211_iface_process_status(sdata, skb); in ieee80211_iface_work()
1770 switch (sdata->vif.type) { in ieee80211_iface_work()
1772 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1775 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1778 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1780 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1783 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1793 struct ieee80211_sub_if_data *sdata = in ieee80211_activate_links_work() local
1801 ieee80211_set_active_links(&sdata->vif, sdata->desired_active_links); in ieee80211_activate_links_work()
1802 sdata->desired_active_links = 0; in ieee80211_activate_links_work()
1808 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1815 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1816 memset(&sdata->deflink.u, 0, sizeof(sdata->deflink.u)); in ieee80211_setup_sdata()
1819 sdata->vif.type = type; in ieee80211_setup_sdata()
1820 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1821 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1823 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1824 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1825 sdata->control_port_over_nl80211 = false; in ieee80211_setup_sdata()
1826 sdata->control_port_no_preauth = false; in ieee80211_setup_sdata()
1827 sdata->vif.cfg.idle = true; in ieee80211_setup_sdata()
1828 sdata->vif.bss_conf.txpower = INT_MIN; /* unset */ in ieee80211_setup_sdata()
1830 sdata->noack_map = 0; in ieee80211_setup_sdata()
1833 if (sdata->dev) { in ieee80211_setup_sdata()
1834 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1835 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1838 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1839 skb_queue_head_init(&sdata->status_queue); in ieee80211_setup_sdata()
1840 wiphy_work_init(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1841 wiphy_work_init(&sdata->activate_links_work, in ieee80211_setup_sdata()
1847 sdata->vif.type = type; in ieee80211_setup_sdata()
1848 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1851 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1852 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1853 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1857 sdata->vif.type = type; in ieee80211_setup_sdata()
1858 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1861 sdata->vif.bss_conf.bssid = sdata->deflink.u.mgd.bssid; in ieee80211_setup_sdata()
1862 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1865 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1866 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1869 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1870 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1873 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1874 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1877 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1878 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1879 sdata->u.mntr.flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1883 idr_init(&sdata->u.nan.function_inst_ids); in ieee80211_setup_sdata()
1884 spin_lock_init(&sdata->u.nan.func_lock); in ieee80211_setup_sdata()
1885 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1889 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1899 ieee80211_link_setup(&sdata->deflink); in ieee80211_setup_sdata()
1901 ieee80211_debugfs_recreate_netdev(sdata, false); in ieee80211_setup_sdata()
1904 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1907 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1918 if (ieee80211_vif_is_mld(&sdata->vif)) in ieee80211_runtime_change_iftype()
1921 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1923 if (!list_empty(&sdata->u.ap.vlans)) in ieee80211_runtime_change_iftype()
1962 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1966 ieee80211_stop_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1969 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1971 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1973 ieee80211_set_sdata_offload_flags(sdata); in ieee80211_runtime_change_iftype()
1974 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1976 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1983 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1985 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1986 ieee80211_set_vif_encap_ops(sdata); in ieee80211_runtime_change_iftype()
1988 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1991 ieee80211_wake_vif_queues(local, sdata, in ieee80211_runtime_change_iftype()
1996 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
2003 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
2006 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
2007 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
2012 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
2013 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
2018 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
2026 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
2047 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2048 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
2050 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
2058 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2059 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
2061 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
2063 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
2073 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2075 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2109 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2110 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
2112 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
2134 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
2135 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
2158 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
2168 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2170 if (!sdata) in ieee80211_if_add()
2172 wdev = &sdata->wdev; in ieee80211_if_add()
2174 sdata->dev = NULL; in ieee80211_if_add()
2175 strscpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
2177 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
2178 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2180 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
2223 sdata = netdev_priv(ndev); in ieee80211_if_add()
2224 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
2225 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
2226 ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr); in ieee80211_if_add()
2227 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
2231 ieee80211_txq_init(sdata, NULL, txqi, 0); in ieee80211_if_add()
2234 sdata->dev = ndev; in ieee80211_if_add()
2238 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
2240 ieee80211_sdata_init(local, sdata); in ieee80211_if_add()
2242 ieee80211_init_frag_cache(&sdata->frags); in ieee80211_if_add()
2244 wiphy_delayed_work_init(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
2250 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
2256 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
2258 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2261 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
2264 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
2265 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
2266 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
2267 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
2271 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
2274 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
2279 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
2285 sdata->vif.netdev_features = local->hw.netdev_features; in ieee80211_if_add()
2308 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
2312 *new_wdev = &sdata->wdev; in ieee80211_if_add()
2317 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
2320 lockdep_assert_wiphy(sdata->local->hw.wiphy); in ieee80211_if_remove()
2322 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2323 list_del_rcu(&sdata->list); in ieee80211_if_remove()
2324 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
2326 if (sdata->vif.txq) in ieee80211_if_remove()
2327 ieee80211_txq_purge(sdata->local, to_txq_info(sdata->vif.txq)); in ieee80211_if_remove()
2331 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
2333 if (!sdata->dev) { in ieee80211_if_remove()
2334 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
2335 kfree(sdata); in ieee80211_if_remove()
2339 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
2341 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
2343 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
2348 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
2375 list_for_each_entry_safe(sdata, tmp, &unreg_list, list) { in ieee80211_remove_interfaces()
2376 bool netdev = sdata->dev; in ieee80211_remove_interfaces()
2384 sdata->vif.cfg.arp_addr_cnt = 0; in ieee80211_remove_interfaces()
2385 if (sdata->vif.type == NL80211_IFTYPE_STATION && in ieee80211_remove_interfaces()
2386 sdata->u.mgd.associated) in ieee80211_remove_interfaces()
2387 ieee80211_vif_cfg_change_notify(sdata, in ieee80211_remove_interfaces()
2390 list_del(&sdata->list); in ieee80211_remove_interfaces()
2391 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
2394 kfree(sdata); in ieee80211_remove_interfaces()
2402 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
2413 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
2414 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
2415 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()
2434 void ieee80211_vif_inc_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_inc_num_mcast() argument
2436 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_inc_num_mcast()
2437 atomic_inc(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2438 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_inc_num_mcast()
2439 atomic_inc(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_inc_num_mcast()
2442 void ieee80211_vif_dec_num_mcast(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_dec_num_mcast() argument
2444 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_dec_num_mcast()
2445 atomic_dec(&sdata->u.ap.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2446 else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_dec_num_mcast()
2447 atomic_dec(&sdata->u.vlan.num_mcast_sta); in ieee80211_vif_dec_num_mcast()
2450 void ieee80211_vif_block_queues_csa(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_block_queues_csa() argument
2452 struct ieee80211_local *local = sdata->local; in ieee80211_vif_block_queues_csa()
2457 ieee80211_stop_vif_queues_norefcount(local, sdata, in ieee80211_vif_block_queues_csa()
2461 void ieee80211_vif_unblock_queues_csa(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_unblock_queues_csa() argument
2463 struct ieee80211_local *local = sdata->local; in ieee80211_vif_unblock_queues_csa()
2465 ieee80211_wake_vif_queues_norefcount(local, sdata, in ieee80211_vif_unblock_queues_csa()