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) || update_bss) in ieee80211_recalc_txpower()
80 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_TXPOWER); in ieee80211_recalc_txpower()
159 static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, in ieee80211_verify_mac() argument
162 struct ieee80211_local *local = sdata->local; in ieee80211_verify_mac()
186 if (iter == sdata) in ieee80211_verify_mac()
210 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_change_mac() local
215 if (ieee80211_sdata_running(sdata)) in ieee80211_change_mac()
218 if (sdata->vif.type == NL80211_IFTYPE_MONITOR && in ieee80211_change_mac()
219 !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) in ieee80211_change_mac()
222 ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); in ieee80211_change_mac()
229 memcpy(sdata->vif.addr, sa->sa_data, ETH_ALEN); in ieee80211_change_mac()
250 static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, in ieee80211_check_concurrent_iface() argument
253 struct ieee80211_local *local = sdata->local; in ieee80211_check_concurrent_iface()
261 if (nsdata != sdata && ieee80211_sdata_running(nsdata)) { in ieee80211_check_concurrent_iface()
265 if ((sdata->vif.type == NL80211_IFTYPE_OCB && in ieee80211_check_concurrent_iface()
267 (sdata->vif.type != NL80211_IFTYPE_MONITOR && in ieee80211_check_concurrent_iface()
295 if (!ether_addr_equal(sdata->vif.addr, in ieee80211_check_concurrent_iface()
311 sdata->bss = &nsdata->u.ap; in ieee80211_check_concurrent_iface()
316 ret = ieee80211_check_combinations(sdata, NULL, 0, 0); in ieee80211_check_concurrent_iface()
321 static int ieee80211_check_queues(struct ieee80211_sub_if_data *sdata, in ieee80211_check_queues() argument
324 int n_queues = sdata->local->hw.queues; in ieee80211_check_queues()
329 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] == in ieee80211_check_queues()
332 if (WARN_ON_ONCE(sdata->vif.hw_queue[i] >= in ieee80211_check_queues()
341 !(sdata->local->hw.flags & IEEE80211_HW_QUEUE_CONTROL)) { in ieee80211_check_queues()
342 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_check_queues()
346 if (WARN_ON_ONCE(sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE)) in ieee80211_check_queues()
349 if (WARN_ON_ONCE(sdata->vif.cab_queue >= n_queues)) in ieee80211_check_queues()
355 void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, in ieee80211_adjust_monitor_flags() argument
358 struct ieee80211_local *local = sdata->local; in ieee80211_adjust_monitor_flags()
359 u32 flags = sdata->u.mntr_flags; in ieee80211_adjust_monitor_flags()
375 static void ieee80211_set_default_queues(struct ieee80211_sub_if_data *sdata) in ieee80211_set_default_queues() argument
377 struct ieee80211_local *local = sdata->local; in ieee80211_set_default_queues()
382 sdata->vif.hw_queue[i] = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
384 sdata->vif.hw_queue[i] = i; in ieee80211_set_default_queues()
386 sdata->vif.hw_queue[i] = 0; in ieee80211_set_default_queues()
388 sdata->vif.cab_queue = IEEE80211_INVAL_HW_QUEUE; in ieee80211_set_default_queues()
393 struct ieee80211_sub_if_data *sdata; in ieee80211_add_virtual_monitor() local
404 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, GFP_KERNEL); in ieee80211_add_virtual_monitor()
405 if (!sdata) in ieee80211_add_virtual_monitor()
409 sdata->local = local; in ieee80211_add_virtual_monitor()
410 sdata->vif.type = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
411 snprintf(sdata->name, IFNAMSIZ, "%s-monitor", in ieee80211_add_virtual_monitor()
413 sdata->wdev.iftype = NL80211_IFTYPE_MONITOR; in ieee80211_add_virtual_monitor()
415 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_add_virtual_monitor()
417 ieee80211_set_default_queues(sdata); in ieee80211_add_virtual_monitor()
419 ret = drv_add_interface(local, sdata); in ieee80211_add_virtual_monitor()
422 kfree(sdata); in ieee80211_add_virtual_monitor()
426 ret = ieee80211_check_queues(sdata, NL80211_IFTYPE_MONITOR); in ieee80211_add_virtual_monitor()
428 kfree(sdata); in ieee80211_add_virtual_monitor()
433 rcu_assign_pointer(local->monitor_sdata, sdata); in ieee80211_add_virtual_monitor()
437 ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef, in ieee80211_add_virtual_monitor()
445 drv_remove_interface(local, sdata); in ieee80211_add_virtual_monitor()
446 kfree(sdata); in ieee80211_add_virtual_monitor()
455 struct ieee80211_sub_if_data *sdata; in ieee80211_del_virtual_monitor() local
464 sdata = rcu_dereference_protected(local->monitor_sdata, in ieee80211_del_virtual_monitor()
466 if (!sdata) { in ieee80211_del_virtual_monitor()
477 ieee80211_vif_release_channel(sdata); in ieee80211_del_virtual_monitor()
480 drv_remove_interface(local, sdata); in ieee80211_del_virtual_monitor()
482 kfree(sdata); in ieee80211_del_virtual_monitor()
492 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); in ieee80211_do_open() local
494 struct ieee80211_local *local = sdata->local; in ieee80211_do_open()
500 switch (sdata->vif.type) { in ieee80211_do_open()
502 if (!is_valid_ether_addr(sdata->u.wds.remote_addr)) in ieee80211_do_open()
508 if (!sdata->bss) in ieee80211_do_open()
512 list_add(&sdata->u.vlan.list, &sdata->bss->vlans); in ieee80211_do_open()
515 master = container_of(sdata->bss, in ieee80211_do_open()
517 sdata->control_port_protocol = in ieee80211_do_open()
519 sdata->control_port_no_encrypt = in ieee80211_do_open()
521 sdata->vif.cab_queue = master->vif.cab_queue; in ieee80211_do_open()
522 memcpy(sdata->vif.hw_queue, master->vif.hw_queue, in ieee80211_do_open()
523 sizeof(sdata->vif.hw_queue)); in ieee80211_do_open()
524 sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; in ieee80211_do_open()
527 sdata->crypto_tx_tailroom_needed_cnt += in ieee80211_do_open()
534 sdata->bss = &sdata->u.ap; in ieee80211_do_open()
580 switch (sdata->vif.type) { in ieee80211_do_open()
583 if (rtnl_dereference(sdata->bss->beacon)) { in ieee80211_do_open()
584 ieee80211_vif_vlan_copy_chanctx(sdata); in ieee80211_do_open()
591 if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_open()
596 if (sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE) { in ieee80211_do_open()
597 res = drv_add_interface(local, sdata); in ieee80211_do_open()
613 ieee80211_adjust_monitor_flags(sdata, 1); in ieee80211_do_open()
625 res = drv_add_interface(local, sdata); in ieee80211_do_open()
628 res = ieee80211_check_queues(sdata, in ieee80211_do_open()
629 ieee80211_vif_type_p2p(&sdata->vif)); in ieee80211_do_open()
634 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_open()
639 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_open()
643 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_do_open()
644 changed |= ieee80211_reset_erp_info(sdata); in ieee80211_do_open()
645 ieee80211_bss_info_change_notify(sdata, changed); in ieee80211_do_open()
647 switch (sdata->vif.type) { in ieee80211_do_open()
668 ieee80211_set_wmm_default(sdata, true); in ieee80211_do_open()
671 set_bit(SDATA_STATE_RUNNING, &sdata->state); in ieee80211_do_open()
673 if (sdata->vif.type == NL80211_IFTYPE_WDS) { in ieee80211_do_open()
675 sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr, in ieee80211_do_open()
694 } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) { in ieee80211_do_open()
695 rcu_assign_pointer(local->p2p_sdata, sdata); in ieee80211_do_open()
703 if (sdata->flags & IEEE80211_SDATA_ALLMULTI) in ieee80211_do_open()
706 if (sdata->flags & IEEE80211_SDATA_PROMISC) 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->flags & IEEE80211_SDATA_PROMISC) in ieee80211_do_stop()
845 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
848 } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) { in ieee80211_do_stop()
852 if (sdata->dev) { in ieee80211_do_stop()
853 netif_addr_lock_bh(sdata->dev); in ieee80211_do_stop()
855 __hw_addr_unsync(&local->mc_list, &sdata->dev->mc, in ieee80211_do_stop()
856 sdata->dev->addr_len); in ieee80211_do_stop()
858 netif_addr_unlock_bh(sdata->dev); in ieee80211_do_stop()
864 cancel_work_sync(&sdata->recalc_smps); in ieee80211_do_stop()
865 sdata_lock(sdata); in ieee80211_do_stop()
867 sdata->vif.csa_active = false; in ieee80211_do_stop()
868 if (sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_do_stop()
869 sdata->u.mgd.csa_waiting_bcn = false; in ieee80211_do_stop()
870 if (sdata->csa_block_tx) { in ieee80211_do_stop()
871 ieee80211_wake_vif_queues(local, sdata, in ieee80211_do_stop()
873 sdata->csa_block_tx = false; in ieee80211_do_stop()
876 sdata_unlock(sdata); in ieee80211_do_stop()
878 cancel_work_sync(&sdata->csa_finalize_work); in ieee80211_do_stop()
880 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); in ieee80211_do_stop()
882 if (sdata->wdev.cac_started) { in ieee80211_do_stop()
883 chandef = sdata->vif.bss_conf.chandef; in ieee80211_do_stop()
886 ieee80211_vif_release_channel(sdata); in ieee80211_do_stop()
888 cfg80211_cac_event(sdata->dev, &chandef, in ieee80211_do_stop()
894 if (sdata->vif.type == NL80211_IFTYPE_AP) { in ieee80211_do_stop()
898 list_for_each_entry_safe(vlan, tmpsdata, &sdata->u.ap.vlans, in ieee80211_do_stop()
901 WARN_ON(!list_empty(&sdata->u.ap.vlans)); in ieee80211_do_stop()
902 } else if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_do_stop()
904 ps = &sdata->bss->ps; in ieee80211_do_stop()
908 if (skb->dev == sdata->dev) { in ieee80211_do_stop()
920 switch (sdata->vif.type) { in ieee80211_do_stop()
923 list_del(&sdata->u.vlan.list); in ieee80211_do_stop()
925 RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL); in ieee80211_do_stop()
927 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
931 if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) { in ieee80211_do_stop()
942 ieee80211_adjust_monitor_flags(sdata, -1); in ieee80211_do_stop()
949 cancel_work_sync(&sdata->work); in ieee80211_do_stop()
962 ieee80211_free_keys(sdata, true); in ieee80211_do_stop()
963 skb_queue_purge(&sdata->skb_queue); in ieee80211_do_stop()
966 sdata->bss = NULL; in ieee80211_do_stop()
972 if (info->control.vif == &sdata->vif) { in ieee80211_do_stop()
980 if (sdata->vif.txq) { in ieee80211_do_stop()
981 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()
1062 sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI); in ieee80211_set_multicast_list()
1063 sdata_promisc = !!(sdata->flags & IEEE80211_SDATA_PROMISC); in ieee80211_set_multicast_list()
1070 sdata->flags ^= IEEE80211_SDATA_ALLMULTI; in ieee80211_set_multicast_list()
1078 sdata->flags ^= IEEE80211_SDATA_PROMISC; in ieee80211_set_multicast_list()
1090 static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) in ieee80211_teardown_sdata() argument
1095 ieee80211_free_keys(sdata, false); in ieee80211_teardown_sdata()
1097 ieee80211_debugfs_remove_netdev(sdata); in ieee80211_teardown_sdata()
1100 __skb_queue_purge(&sdata->fragments[i].skb_list); in ieee80211_teardown_sdata()
1101 sdata->fragment_next = 0; in ieee80211_teardown_sdata()
1103 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_teardown_sdata()
1104 mesh_rmc_free(sdata); in ieee80211_teardown_sdata()
1136 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); in ieee80211_monitor_select_queue() local
1137 struct ieee80211_local *local = sdata->local; in ieee80211_monitor_select_queue()
1150 return ieee80211_select_queue_80211(sdata, skb, hdr); in ieee80211_monitor_select_queue()
1174 struct ieee80211_sub_if_data *sdata = in ieee80211_iface_work() local
1176 struct ieee80211_local *local = sdata->local; in ieee80211_iface_work()
1182 if (!ieee80211_sdata_running(sdata)) in ieee80211_iface_work()
1192 while ((skb = skb_dequeue(&sdata->skb_queue))) { in ieee80211_iface_work()
1197 ieee80211_start_tx_ba_cb(&sdata->vif, ra_tid->ra, in ieee80211_iface_work()
1201 ieee80211_stop_tx_ba_cb(&sdata->vif, ra_tid->ra, in ieee80211_iface_work()
1206 sta = sta_info_get_bss(sdata, rx_agg->addr); in ieee80211_iface_work()
1216 sta = sta_info_get_bss(sdata, rx_agg->addr); in ieee80211_iface_work()
1224 ieee80211_process_tdls_channel_switch(sdata, skb); in ieee80211_iface_work()
1230 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1242 ieee80211_process_delba(sdata, sta, in ieee80211_iface_work()
1271 sta = sta_info_get_bss(sdata, mgmt->sa); in ieee80211_iface_work()
1282 } else switch (sdata->vif.type) { in ieee80211_iface_work()
1284 ieee80211_sta_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1287 ieee80211_ibss_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1290 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1292 ieee80211_mesh_rx_queued_mgmt(sdata, skb); in ieee80211_iface_work()
1303 switch (sdata->vif.type) { in ieee80211_iface_work()
1305 ieee80211_sta_work(sdata); in ieee80211_iface_work()
1308 ieee80211_ibss_work(sdata); in ieee80211_iface_work()
1311 if (!ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_iface_work()
1313 ieee80211_mesh_work(sdata); in ieee80211_iface_work()
1316 ieee80211_ocb_work(sdata); in ieee80211_iface_work()
1325 struct ieee80211_sub_if_data *sdata = in ieee80211_recalc_smps_work() local
1328 ieee80211_recalc_smps(sdata); in ieee80211_recalc_smps_work()
1334 static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, in ieee80211_setup_sdata() argument
1341 memset(&sdata->u, 0, sizeof(sdata->u)); in ieee80211_setup_sdata()
1344 sdata->vif.type = type; in ieee80211_setup_sdata()
1345 sdata->vif.p2p = false; in ieee80211_setup_sdata()
1346 sdata->wdev.iftype = type; in ieee80211_setup_sdata()
1348 sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE); in ieee80211_setup_sdata()
1349 sdata->control_port_no_encrypt = false; in ieee80211_setup_sdata()
1350 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_setup_sdata()
1351 sdata->vif.bss_conf.idle = true; in ieee80211_setup_sdata()
1353 sdata->noack_map = 0; in ieee80211_setup_sdata()
1356 if (sdata->dev) { in ieee80211_setup_sdata()
1357 sdata->dev->netdev_ops = &ieee80211_dataif_ops; in ieee80211_setup_sdata()
1358 sdata->dev->type = ARPHRD_ETHER; in ieee80211_setup_sdata()
1361 skb_queue_head_init(&sdata->skb_queue); in ieee80211_setup_sdata()
1362 INIT_WORK(&sdata->work, ieee80211_iface_work); in ieee80211_setup_sdata()
1363 INIT_WORK(&sdata->recalc_smps, ieee80211_recalc_smps_work); in ieee80211_setup_sdata()
1364 INIT_WORK(&sdata->csa_finalize_work, ieee80211_csa_finalize_work); in ieee80211_setup_sdata()
1365 INIT_LIST_HEAD(&sdata->assigned_chanctx_list); in ieee80211_setup_sdata()
1366 INIT_LIST_HEAD(&sdata->reserved_chanctx_list); in ieee80211_setup_sdata()
1371 sdata->vif.type = type; in ieee80211_setup_sdata()
1372 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1375 skb_queue_head_init(&sdata->u.ap.ps.bc_buf); in ieee80211_setup_sdata()
1376 INIT_LIST_HEAD(&sdata->u.ap.vlans); in ieee80211_setup_sdata()
1377 INIT_WORK(&sdata->u.ap.request_smps_work, in ieee80211_setup_sdata()
1379 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1380 sdata->u.ap.req_smps = IEEE80211_SMPS_OFF; in ieee80211_setup_sdata()
1384 sdata->vif.type = type; in ieee80211_setup_sdata()
1385 sdata->vif.p2p = true; in ieee80211_setup_sdata()
1388 sdata->vif.bss_conf.bssid = sdata->u.mgd.bssid; in ieee80211_setup_sdata()
1389 ieee80211_sta_setup_sdata(sdata); in ieee80211_setup_sdata()
1392 sdata->vif.bss_conf.bssid = bssid_wildcard; in ieee80211_setup_sdata()
1393 ieee80211_ocb_setup_sdata(sdata); in ieee80211_setup_sdata()
1396 sdata->vif.bss_conf.bssid = sdata->u.ibss.bssid; in ieee80211_setup_sdata()
1397 ieee80211_ibss_setup_sdata(sdata); in ieee80211_setup_sdata()
1400 if (ieee80211_vif_is_mesh(&sdata->vif)) in ieee80211_setup_sdata()
1401 ieee80211_mesh_init_sdata(sdata); in ieee80211_setup_sdata()
1404 sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP; in ieee80211_setup_sdata()
1405 sdata->dev->netdev_ops = &ieee80211_monitorif_ops; in ieee80211_setup_sdata()
1406 sdata->u.mntr_flags = MONITOR_FLAG_CONTROL | in ieee80211_setup_sdata()
1410 sdata->vif.bss_conf.bssid = NULL; in ieee80211_setup_sdata()
1414 sdata->vif.bss_conf.bssid = sdata->vif.addr; in ieee80211_setup_sdata()
1422 ieee80211_debugfs_add_netdev(sdata); in ieee80211_setup_sdata()
1425 static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata, in ieee80211_runtime_change_iftype() argument
1428 struct ieee80211_local *local = sdata->local; in ieee80211_runtime_change_iftype()
1438 switch (sdata->vif.type) { in ieee80211_runtime_change_iftype()
1478 ret = ieee80211_check_concurrent_iface(sdata, internal_type); in ieee80211_runtime_change_iftype()
1482 ieee80211_do_stop(sdata, false); in ieee80211_runtime_change_iftype()
1484 ieee80211_teardown_sdata(sdata); in ieee80211_runtime_change_iftype()
1486 ret = drv_change_interface(local, sdata, internal_type, p2p); in ieee80211_runtime_change_iftype()
1488 type = ieee80211_vif_type_p2p(&sdata->vif); in ieee80211_runtime_change_iftype()
1495 ieee80211_check_queues(sdata, type); in ieee80211_runtime_change_iftype()
1497 ieee80211_setup_sdata(sdata, type); in ieee80211_runtime_change_iftype()
1499 err = ieee80211_do_open(&sdata->wdev, false); in ieee80211_runtime_change_iftype()
1505 int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, in ieee80211_if_change_type() argument
1512 if (type == ieee80211_vif_type_p2p(&sdata->vif)) in ieee80211_if_change_type()
1515 if (ieee80211_sdata_running(sdata)) { in ieee80211_if_change_type()
1516 ret = ieee80211_runtime_change_iftype(sdata, type); in ieee80211_if_change_type()
1521 ieee80211_teardown_sdata(sdata); in ieee80211_if_change_type()
1522 ieee80211_setup_sdata(sdata, type); in ieee80211_if_change_type()
1527 sdata->u.mgd.use_4addr = false; in ieee80211_if_change_type()
1535 struct ieee80211_sub_if_data *sdata; in ieee80211_assign_perm_addr() local
1557 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1558 if (sdata->vif.type != NL80211_IFTYPE_AP) in ieee80211_assign_perm_addr()
1560 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1568 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1569 if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) in ieee80211_assign_perm_addr()
1571 if (!ieee80211_sdata_running(sdata)) in ieee80211_assign_perm_addr()
1573 memcpy(perm_addr, sdata->vif.addr, ETH_ALEN); in ieee80211_assign_perm_addr()
1583 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1585 sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1619 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1620 if (sdata->vif.type == NL80211_IFTYPE_MONITOR) in ieee80211_assign_perm_addr()
1622 m = sdata->vif.addr; in ieee80211_assign_perm_addr()
1644 list_for_each_entry(sdata, &local->interfaces, list) { in ieee80211_assign_perm_addr()
1645 if (ether_addr_equal(tmp_addr, sdata->vif.addr)) { in ieee80211_assign_perm_addr()
1671 struct ieee80211_sub_if_data *sdata = NULL; in ieee80211_if_add() local
1681 sdata = kzalloc(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1683 if (!sdata) in ieee80211_if_add()
1685 wdev = &sdata->wdev; in ieee80211_if_add()
1687 sdata->dev = NULL; in ieee80211_if_add()
1688 strlcpy(sdata->name, name, IFNAMSIZ); in ieee80211_if_add()
1690 memcpy(sdata->vif.addr, wdev->address, ETH_ALEN); in ieee80211_if_add()
1692 int size = ALIGN(sizeof(*sdata) + local->hw.vif_data_size, in ieee80211_if_add()
1733 sdata = netdev_priv(ndev); in ieee80211_if_add()
1734 ndev->ieee80211_ptr = &sdata->wdev; in ieee80211_if_add()
1735 memcpy(sdata->vif.addr, ndev->dev_addr, ETH_ALEN); in ieee80211_if_add()
1736 memcpy(sdata->name, ndev->name, IFNAMSIZ); in ieee80211_if_add()
1740 ieee80211_init_tx_queue(sdata, NULL, txqi, 0); in ieee80211_if_add()
1743 sdata->dev = ndev; in ieee80211_if_add()
1747 sdata->wdev.wiphy = local->hw.wiphy; in ieee80211_if_add()
1748 sdata->local = local; in ieee80211_if_add()
1751 skb_queue_head_init(&sdata->fragments[i].skb_list); in ieee80211_if_add()
1753 INIT_LIST_HEAD(&sdata->key_list); in ieee80211_if_add()
1755 INIT_DELAYED_WORK(&sdata->dfs_cac_timer_work, in ieee80211_if_add()
1757 INIT_DELAYED_WORK(&sdata->dec_tailroom_needed_wk, in ieee80211_if_add()
1763 sdata->rc_rateidx_mask[i] = in ieee80211_if_add()
1766 memcpy(sdata->rc_rateidx_mcs_mask[i], in ieee80211_if_add()
1768 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1770 memset(sdata->rc_rateidx_mcs_mask[i], 0, in ieee80211_if_add()
1771 sizeof(sdata->rc_rateidx_mcs_mask[i])); in ieee80211_if_add()
1774 ieee80211_set_default_queues(sdata); in ieee80211_if_add()
1776 sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_if_add()
1777 sdata->user_power_level = local->user_power_level; in ieee80211_if_add()
1779 sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM; in ieee80211_if_add()
1782 ieee80211_setup_sdata(sdata, type); in ieee80211_if_add()
1788 sdata->u.mgd.use_4addr = params->use_4addr; in ieee80211_if_add()
1803 list_add_tail_rcu(&sdata->list, &local->interfaces); in ieee80211_if_add()
1807 *new_wdev = &sdata->wdev; in ieee80211_if_add()
1812 void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata) in ieee80211_if_remove() argument
1816 mutex_lock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1817 list_del_rcu(&sdata->list); in ieee80211_if_remove()
1818 mutex_unlock(&sdata->local->iflist_mtx); in ieee80211_if_remove()
1822 if (sdata->dev) { in ieee80211_if_remove()
1823 unregister_netdevice(sdata->dev); in ieee80211_if_remove()
1825 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_if_remove()
1826 kfree(sdata); in ieee80211_if_remove()
1830 void ieee80211_sdata_stop(struct ieee80211_sub_if_data *sdata) in ieee80211_sdata_stop() argument
1832 if (WARN_ON_ONCE(!test_bit(SDATA_STATE_RUNNING, &sdata->state))) in ieee80211_sdata_stop()
1834 ieee80211_do_stop(sdata, true); in ieee80211_sdata_stop()
1835 ieee80211_teardown_sdata(sdata); in ieee80211_sdata_stop()
1844 struct ieee80211_sub_if_data *sdata, *tmp; in ieee80211_remove_interfaces() local
1855 list_for_each_entry(sdata, &local->interfaces, list) in ieee80211_remove_interfaces()
1856 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in ieee80211_remove_interfaces()
1857 dev_close(sdata->dev); in ieee80211_remove_interfaces()
1860 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { in ieee80211_remove_interfaces()
1861 list_del(&sdata->list); in ieee80211_remove_interfaces()
1863 if (sdata->dev) in ieee80211_remove_interfaces()
1864 unregister_netdevice_queue(sdata->dev, &unreg_list); in ieee80211_remove_interfaces()
1866 list_add(&sdata->list, &wdev_list); in ieee80211_remove_interfaces()
1871 list_for_each_entry_safe(sdata, tmp, &wdev_list, list) { in ieee80211_remove_interfaces()
1872 list_del(&sdata->list); in ieee80211_remove_interfaces()
1873 cfg80211_unregister_wdev(&sdata->wdev); in ieee80211_remove_interfaces()
1874 kfree(sdata); in ieee80211_remove_interfaces()
1882 struct ieee80211_sub_if_data *sdata; in netdev_notify() local
1893 sdata = IEEE80211_DEV_TO_SUB_IF(dev); in netdev_notify()
1894 memcpy(sdata->name, dev->name, IFNAMSIZ); in netdev_notify()
1895 ieee80211_debugfs_rename_netdev(sdata); in netdev_notify()