Lines Matching refs:sdata
46 bool __ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata) in __ieee80211_recalc_txpower() argument
52 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); in __ieee80211_recalc_txpower()
61 if (sdata->user_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
62 power = min(power, sdata->user_power_level); in __ieee80211_recalc_txpower()
64 if (sdata->ap_power_level != IEEE80211_UNSET_POWER_LEVEL) in __ieee80211_recalc_txpower()
65 power = min(power, sdata->ap_power_level); in __ieee80211_recalc_txpower()
67 if (power != sdata->vif.bss_conf.txpower) { in __ieee80211_recalc_txpower()
68 sdata->vif.bss_conf.txpower = power; in __ieee80211_recalc_txpower()
69 ieee80211_hw_config(sdata->local, 0); in __ieee80211_recalc_txpower()
76 void ieee80211_recalc_txpower(struct ieee80211_sub_if_data *sdata, in ieee80211_recalc_txpower() argument
79 if (__ieee80211_recalc_txpower(sdata) || in ieee80211_recalc_txpower()
80 (update_bss && ieee80211_sdata_running(sdata))) in ieee80211_recalc_txpower()
81 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); in ieee80211_recalc_txpower()
160 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, in ieee80211_verify_mac() argument
163 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
187 if (iter == sdata) in ieee80211_verify_mac()
211 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
216 if (ieee80211_sdata_running(sdata)) in ieee80211_change_mac()
219 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
220 !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
223 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
230 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
251 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
254 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
262 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
266 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
268 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
296 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
312 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
317 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
322 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
325 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
330 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
333 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
342 !ieee80211_hw_check(&sdata->local->hw, QUEUE_CONTROL)) { in ieee80211_check_queues()
343 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
347 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
350 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
356 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
359 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
360 u32 flags = sdata->u.mntr_flags; in ieee80211_adjust_monitor_flags()
376 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
378 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
383 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
385 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
387 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
389 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
394 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
405 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
406 if (!sdata) in ieee80211_add_virtual_monitor()
410 sdata->local = local; in ieee80211_add_virtual_monitor()
411 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
412 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
414 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
416 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_add_virtual_monitor()
418 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
420 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
423 kfree(sdata); in ieee80211_add_virtual_monitor()
427 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
429 kfree(sdata); in ieee80211_add_virtual_monitor()
434 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
438 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
446 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
447 kfree(sdata); in ieee80211_add_virtual_monitor()
456 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
465 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
467 if (!sdata) { in ieee80211_del_virtual_monitor()
478 ieee80211_vif_release_channel(sdata); in ieee80211_del_virtual_monitor()
481 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
483 kfree(sdata); in ieee80211_del_virtual_monitor()
493 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
495 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
501 switch (sdata->vif.type) { in ieee80211_do_open()
503 if (!is_valid_ether_addr(sdata->u.wds.remote_addr)) in ieee80211_do_open()
509 if (!sdata->bss) in ieee80211_do_open()
513 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
516 master = container_of(sdata->bss, in ieee80211_do_open()
518 sdata->control_port_protocol = in ieee80211_do_open()
520 sdata->control_port_no_encrypt = in ieee80211_do_open()
522 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
523 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
524 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
525 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
528 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
535 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
581 switch (sdata->vif.type) { in ieee80211_do_open()
584 if (rtnl_dereference(sdata->bss->beacon)) { in ieee80211_do_open()
585 ieee80211_vif_vlan_copy_chanctx(sdata); in ieee80211_do_open()
592 if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
597 if (sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
598 res = drv_add_interface(local, sdata); in ieee80211_do_open()
614 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
626 res = drv_add_interface(local, sdata); in ieee80211_do_open()
629 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
630 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
635 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
640 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
644 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_do_open()
645 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
646 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_do_open()
648 switch (sdata->vif.type) { in ieee80211_do_open()
670 ieee80211_set_wmm_default(sdata, true, in ieee80211_do_open()
671 sdata->vif.type != NL80211_IFTYPE_STATION); in ieee80211_do_open()
674 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
676 if (sdata->vif.type == NL80211_IFTYPE_WDS) { in ieee80211_do_open()
678 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, in ieee80211_do_open()
697 } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { in ieee80211_do_open()
698 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
706 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
717 if (sdata->vif.type == NL80211_IFTYPE_MONITOR || in ieee80211_do_open()
718 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
730 if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE || in ieee80211_do_open()
731 (local->queue_stop_reasons[sdata->vif.cab_queue] == 0 && in ieee80211_do_open()
732 skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) { in ieee80211_do_open()
734 int ac_queue = sdata->vif.hw_queue[ac]; in ieee80211_do_open()
746 drv_remove_interface(local, sdata); in ieee80211_do_open()
751 sdata->bss = NULL; in ieee80211_do_open()
752 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_open()
754 list_del(&sdata->u.vlan.list); in ieee80211_do_open()
758 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
764 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_open() local
771 err = ieee80211_check_concurrent_iface(sdata, sdata->vif.type); in ieee80211_open()
775 return ieee80211_do_open(&sdata->wdev, true); in ieee80211_open()
778 static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, in ieee80211_do_stop() argument
781 struct ieee80211_local *local = sdata->local; in ieee80211_do_stop()
790 clear_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_stop()
792 cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata; in ieee80211_do_stop()
799 if (sdata->dev) in ieee80211_do_stop()
800 netif_tx_stop_all_queues(sdata->dev); in ieee80211_do_stop()
802 ieee80211_roc_purge(local, sdata); in ieee80211_do_stop()
804 switch (sdata->vif.type) { in ieee80211_do_stop()
806 ieee80211_mgd_stop(sdata); in ieee80211_do_stop()
809 ieee80211_ibss_stop(sdata); in ieee80211_do_stop()
812 cancel_work_sync(&sdata->u.ap.request_smps_work); in ieee80211_do_stop()
833 flushed = sta_info_flush(sdata); in ieee80211_do_stop()
834 WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN && in ieee80211_do_stop()
835 ((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) || in ieee80211_do_stop()
836 (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1))); in ieee80211_do_stop()
839 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_stop()
842 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
845 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
849 if (sdata->dev) { in ieee80211_do_stop()
850 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
852 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
853 sdata->dev->addr_len); in ieee80211_do_stop()
855 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
861 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
862 sdata_lock(sdata); in ieee80211_do_stop()
864 sdata->vif.csa_active = false; in ieee80211_do_stop()
865 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
866 sdata->u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
867 if (sdata->csa_block_tx) { in ieee80211_do_stop()
868 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
870 sdata->csa_block_tx = false; in ieee80211_do_stop()
873 sdata_unlock(sdata); in ieee80211_do_stop()
875 cancel_work_sync(&sdata->csa_finalize_work); in ieee80211_do_stop()
877 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_do_stop()
879 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
880 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
883 ieee80211_vif_release_channel(sdata); in ieee80211_do_stop()
885 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
891 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
895 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_do_stop()
898 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
899 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
901 ps = &sdata->bss->ps; in ieee80211_do_stop()
905 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
917 switch (sdata->vif.type) { in ieee80211_do_stop()
920 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
922 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL); in ieee80211_do_stop()
924 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
928 if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
939 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
946 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
959 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
960 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
963 sdata->bss = NULL; in ieee80211_do_stop()
969 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
977 if (sdata->vif.txq) { in ieee80211_do_stop()
978 struct txq_info *txqi = to_txq_info(sdata->vif.txq); in ieee80211_do_stop()
984 atomic_set(&sdata->txqs_len[txqi->txq.ac], 0); in ieee80211_do_stop()
1005 switch (sdata->vif.type) { in ieee80211_do_stop()
1016 if (!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) in ieee80211_do_stop()
1022 drv_remove_interface(local, sdata); in ieee80211_do_stop()
1047 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_stop() local
1049 ieee80211_do_stop(sdata, true); in ieee80211_stop()
1056 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_set_multicast_list() local
1057 struct ieee80211_local *local = sdata->local; in ieee80211_set_multicast_list()
1061 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
1068 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
1081 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
1086 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
1088 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
1091 __skb_queue_purge(&sdata->fragments[i].skb_list); in ieee80211_teardown_sdata()
1092 sdata->fragment_next = 0; in ieee80211_teardown_sdata()
1094 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
1095 mesh_rmc_free(sdata); in ieee80211_teardown_sdata()
1157 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
1158 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
1171 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
1202 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1204 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1210 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1220 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1225 ieee80211_start_tx_ba_cb(&sdata->vif, ra_tid->ra, in ieee80211_iface_work()
1229 ieee80211_stop_tx_ba_cb(&sdata->vif, ra_tid->ra, in ieee80211_iface_work()
1234 sta = sta_info_get_bss(sdata, rx_agg->addr); in ieee80211_iface_work()
1244 sta = sta_info_get_bss(sdata, rx_agg->addr); in ieee80211_iface_work()
1256 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1268 ieee80211_process_delba(sdata, sta, in ieee80211_iface_work()
1297 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1308 } else switch (sdata->vif.type) { in ieee80211_iface_work()
1310 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1313 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1316 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1318 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1329 switch (sdata->vif.type) { in ieee80211_iface_work()
1331 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1334 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1337 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1339 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1342 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1351 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1354 ieee80211_recalc_smps(sdata); in ieee80211_recalc_smps_work()
1360 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1367 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1370 sdata->vif.type = type; in ieee80211_setup_sdata()
1371 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1372 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1374 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1375 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1376 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_setup_sdata()
1377 sdata->vif.bss_conf.idle = true; in ieee80211_setup_sdata()
1379 sdata->noack_map = 0; in ieee80211_setup_sdata()
1382 if (sdata->dev) { in ieee80211_setup_sdata()
1383 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1384 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1387 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1388 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1389 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1390 INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work); in ieee80211_setup_sdata()
1391 INIT_LIST_HEAD(&sdata->assigned_chanctx_list); in ieee80211_setup_sdata()
1392 INIT_LIST_HEAD(&sdata->reserved_chanctx_list); in ieee80211_setup_sdata()
1397 sdata->vif.type = type; in ieee80211_setup_sdata()
1398 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1401 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1402 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1403 INIT_WORK(&sdata->u.ap.request_smps_work, in ieee80211_setup_sdata()
1405 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1406 sdata->u.ap.req_smps = IEEE80211_SMPS_OFF; in ieee80211_setup_sdata()
1410 sdata->vif.type = type; in ieee80211_setup_sdata()
1411 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1414 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid; in ieee80211_setup_sdata()
1415 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1418 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1419 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1422 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1423 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1426 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1427 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1430 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1431 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1432 sdata->u.mntr_flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1436 sdata->vif.bss_conf.bssid = NULL; in ieee80211_setup_sdata()
1440 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1448 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1451 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1454 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1464 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1504 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1508 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1510 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1512 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1514 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1521 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1523 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1525 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1531 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1538 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1541 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1542 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1547 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1548 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1553 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1561 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1583 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1584 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1586 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1594 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1595 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1597 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1599 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1609 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1611 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1645 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1646 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
1648 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
1670 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1671 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1697 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
1707 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1709 if (!sdata) in ieee80211_if_add()
1711 wdev = &sdata->wdev; in ieee80211_if_add()
1713 sdata->dev = NULL; in ieee80211_if_add()
1714 strlcpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
1716 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
1718 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1765 sdata = netdev_priv(ndev); in ieee80211_if_add()
1766 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
1767 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
1768 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
1772 ieee80211_init_tx_queue(sdata, NULL, txqi, 0); in ieee80211_if_add()
1775 sdata->dev = ndev; in ieee80211_if_add()
1779 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1780 sdata->local = local; in ieee80211_if_add()
1783 skb_queue_head_init(&sdata->fragments[i].skb_list); in ieee80211_if_add()
1785 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
1787 INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work, in ieee80211_if_add()
1789 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
1795 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
1801 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
1803 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1806 vht_rate_mask = sdata->rc_rateidx_vht_mcs_mask[i]; in ieee80211_if_add()
1809 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
1810 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1811 memset(sdata->rc_rateidx_vht_mcs_mask[i], 0, in ieee80211_if_add()
1812 sizeof(sdata->rc_rateidx_vht_mcs_mask[i])); in ieee80211_if_add()
1816 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
1818 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
1819 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1821 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_if_add()
1824 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
1830 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
1845 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
1849 *new_wdev = &sdata->wdev; in ieee80211_if_add()
1854 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
1858 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1859 list_del_rcu(&sdata->list); in ieee80211_if_remove()
1860 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1864 if (sdata->dev) { in ieee80211_if_remove()
1865 unregister_netdevice(sdata->dev); in ieee80211_if_remove()
1867 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
1868 ieee80211_teardown_sdata(sdata); in ieee80211_if_remove()
1869 kfree(sdata); in ieee80211_if_remove()
1873 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
1875 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
1877 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
1882 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
1905 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
1906 list_del(&sdata->list); in ieee80211_remove_interfaces()
1908 if (sdata->dev) in ieee80211_remove_interfaces()
1909 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
1911 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
1916 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
1917 list_del(&sdata->list); in ieee80211_remove_interfaces()
1918 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
1919 kfree(sdata); in ieee80211_remove_interfaces()
1927 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
1938 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
1939 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
1940 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()