Lines Matching refs:sdata

15 static void ieee80211_update_apvlan_links(struct ieee80211_sub_if_data *sdata)  in ieee80211_update_apvlan_links()  argument
19 u16 ap_bss_links = sdata->vif.valid_links; in ieee80211_update_apvlan_links()
23 list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) { in ieee80211_update_apvlan_links()
50 void ieee80211_apvlan_link_setup(struct ieee80211_sub_if_data *sdata) in ieee80211_apvlan_link_setup() argument
52 struct ieee80211_sub_if_data *ap_bss = container_of(sdata->bss, in ieee80211_apvlan_link_setup()
63 sdata->wdev.valid_links |= BIT(link_id); in ieee80211_apvlan_link_setup()
64 ether_addr_copy(sdata->wdev.links[link_id].addr, in ieee80211_apvlan_link_setup()
68 ieee80211_vif_set_links(sdata, new_links, 0); in ieee80211_apvlan_link_setup()
71 void ieee80211_apvlan_link_clear(struct ieee80211_sub_if_data *sdata) in ieee80211_apvlan_link_clear() argument
73 if (!sdata->wdev.valid_links) in ieee80211_apvlan_link_clear()
76 sdata->wdev.valid_links = 0; in ieee80211_apvlan_link_clear()
77 ieee80211_vif_clear_links(sdata); in ieee80211_apvlan_link_clear()
82 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_setup()
86 void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, in ieee80211_link_init() argument
96 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in ieee80211_link_init()
100 ap_bss = container_of(sdata->bss, in ieee80211_link_init()
107 link->sdata = sdata; in ieee80211_link_init()
111 link_conf->vif = &sdata->vif; in ieee80211_link_init()
113 link->user_power_level = sdata->local->user_power_level; in ieee80211_link_init()
128 switch (sdata->vif.type) { in ieee80211_link_init()
132 sdata->wdev.links[link_id].addr); in ieee80211_link_init()
134 WARN_ON(!(sdata->wdev.valid_links & BIT(link_id))); in ieee80211_link_init()
146 rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); in ieee80211_link_init()
147 rcu_assign_pointer(sdata->link[link_id], link); in ieee80211_link_init()
152 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_stop()
155 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
157 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
159 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
162 if (link->sdata->wdev.links[link->link_id].cac_started) { in ieee80211_link_stop()
163 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
165 cfg80211_cac_event(link->sdata->dev, in ieee80211_link_stop()
179 static void ieee80211_tear_down_links(struct ieee80211_sub_if_data *sdata, in ieee80211_tear_down_links() argument
191 link = &sdata->deflink; in ieee80211_tear_down_links()
201 ieee80211_free_key_list(sdata->local, &keys); in ieee80211_tear_down_links()
204 static void ieee80211_free_links(struct ieee80211_sub_if_data *sdata, in ieee80211_free_links() argument
213 static int ieee80211_check_dup_link_addrs(struct ieee80211_sub_if_data *sdata) in ieee80211_check_dup_link_addrs() argument
220 link1 = sdata_dereference(sdata->link[i], sdata); in ieee80211_check_dup_link_addrs()
226 link2 = sdata_dereference(sdata->link[j], sdata); in ieee80211_check_dup_link_addrs()
239 static void ieee80211_set_vif_links_bitmaps(struct ieee80211_sub_if_data *sdata, in ieee80211_set_vif_links_bitmaps() argument
242 sdata->vif.valid_links = valid_links; in ieee80211_set_vif_links_bitmaps()
243 sdata->vif.dormant_links = dormant_links; in ieee80211_set_vif_links_bitmaps()
250 sdata->vif.active_links = 0; in ieee80211_set_vif_links_bitmaps()
251 sdata->vif.dormant_links = 0; in ieee80211_set_vif_links_bitmaps()
255 switch (sdata->vif.type) { in ieee80211_set_vif_links_bitmaps()
259 sdata->vif.active_links = valid_links; in ieee80211_set_vif_links_bitmaps()
265 if (sdata->vif.active_links) in ieee80211_set_vif_links_bitmaps()
267 sdata->vif.active_links = valid_links & ~dormant_links; in ieee80211_set_vif_links_bitmaps()
268 WARN_ON(hweight16(sdata->vif.active_links) > 1); in ieee80211_set_vif_links_bitmaps()
275 static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_update_links() argument
279 u16 old_links = sdata->vif.valid_links; in ieee80211_vif_update_links()
280 u16 old_active = sdata->vif.active_links; in ieee80211_vif_update_links()
290 lockdep_assert_wiphy(sdata->local->hw.wiphy); in ieee80211_vif_update_links()
294 if (old_links == new_links && dormant_links == sdata->vif.dormant_links) in ieee80211_vif_update_links()
312 BUILD_BUG_ON(sizeof(old) != sizeof(sdata->vif.link_conf)); in ieee80211_vif_update_links()
313 memcpy(old, sdata->vif.link_conf, sizeof(old)); in ieee80211_vif_update_links()
315 BUILD_BUG_ON(sizeof(old_data) != sizeof(sdata->link)); in ieee80211_vif_update_links()
316 memcpy(old_data, sdata->link, sizeof(old_data)); in ieee80211_vif_update_links()
320 if (rcu_access_pointer(sdata->link[link_id]) != &sdata->deflink) { in ieee80211_vif_update_links()
325 to_free[link_id] = container_of(rcu_access_pointer(sdata->link[link_id]), in ieee80211_vif_update_links()
330 RCU_INIT_POINTER(sdata->link[link_id], NULL); in ieee80211_vif_update_links()
331 RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL); in ieee80211_vif_update_links()
335 ieee80211_debugfs_recreate_netdev(sdata, true); in ieee80211_vif_update_links()
340 rcu_access_pointer(sdata->link[link_id]) == &sdata->deflink); in ieee80211_vif_update_links()
343 ieee80211_link_init(sdata, link_id, &link->data, &link->conf); in ieee80211_vif_update_links()
348 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
349 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
351 ret = ieee80211_check_dup_link_addrs(sdata); in ieee80211_vif_update_links()
354 ieee80211_tear_down_links(sdata, to_free, rem); in ieee80211_vif_update_links()
356 ieee80211_set_vif_links_bitmaps(sdata, new_links, dormant_links); in ieee80211_vif_update_links()
359 if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN) in ieee80211_vif_update_links()
360 ret = drv_change_vif_links(sdata->local, sdata, in ieee80211_vif_update_links()
362 new_links & sdata->vif.active_links, in ieee80211_vif_update_links()
365 ieee80211_debugfs_recreate_netdev(sdata, false); in ieee80211_vif_update_links()
367 if (sdata->vif.type == NL80211_IFTYPE_AP) in ieee80211_vif_update_links()
368 ieee80211_update_apvlan_links(sdata); in ieee80211_vif_update_links()
380 memcpy(sdata->link, old_data, sizeof(old_data)); in ieee80211_vif_update_links()
381 memcpy(sdata->vif.link_conf, old, sizeof(old)); in ieee80211_vif_update_links()
382 ieee80211_set_vif_links_bitmaps(sdata, old_links, dormant_links); in ieee80211_vif_update_links()
400 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
401 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
405 int ieee80211_vif_set_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_set_links() argument
411 ret = ieee80211_vif_update_links(sdata, links, new_links, in ieee80211_vif_set_links()
413 ieee80211_free_links(sdata, links); in ieee80211_vif_set_links()
418 static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata, in _ieee80211_set_active_links() argument
422 struct ieee80211_local *local = sdata->local; in _ieee80211_set_active_links()
423 u16 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
430 if (!ieee80211_sdata_running(sdata)) in _ieee80211_set_active_links()
433 if (sdata->vif.type != NL80211_IFTYPE_STATION) in _ieee80211_set_active_links()
436 if (active_links & ~ieee80211_vif_usable_links(&sdata->vif)) in _ieee80211_set_active_links()
444 link_confs[i] = sdata_dereference(sdata->vif.link_conf[i], in _ieee80211_set_active_links()
445 sdata); in _ieee80211_set_active_links()
448 sdata->vif.active_links |= active_links; in _ieee80211_set_active_links()
449 ret = drv_change_vif_links(local, sdata, in _ieee80211_set_active_links()
451 sdata->vif.active_links, in _ieee80211_set_active_links()
454 sdata->vif.active_links = old_active; in _ieee80211_set_active_links()
462 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
484 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
513 if (sdata != sta->sdata) in _ieee80211_set_active_links()
520 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
526 ret = ieee80211_key_switch_links(sdata, rem, add); in _ieee80211_set_active_links()
530 if (sdata != sta->sdata) in _ieee80211_set_active_links()
535 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
553 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
556 ieee80211_link_info_change_notify(sdata, link, in _ieee80211_set_active_links()
572 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
573 sdata->vif.active_links = active_links; in _ieee80211_set_active_links()
576 ret = drv_change_vif_links(local, sdata, old_active, in _ieee80211_set_active_links()
586 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links() local
587 struct ieee80211_local *local = sdata->local; in ieee80211_set_active_links()
596 old_active = sdata->vif.active_links; in ieee80211_set_active_links()
600 if (!drv_can_activate_links(local, sdata, active_links)) in ieee80211_set_active_links()
609 ret = _ieee80211_set_active_links(sdata, in ieee80211_set_active_links()
612 ret = _ieee80211_set_active_links(sdata, active_links); in ieee80211_set_active_links()
615 ret = _ieee80211_set_active_links(sdata, active_links); in ieee80211_set_active_links()
625 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links_async() local
630 if (!ieee80211_sdata_running(sdata)) in ieee80211_set_active_links_async()
633 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_active_links_async()
636 if (active_links & ~ieee80211_vif_usable_links(&sdata->vif)) in ieee80211_set_active_links_async()
640 if (sdata->vif.active_links == active_links) in ieee80211_set_active_links_async()
643 sdata->desired_active_links = active_links; in ieee80211_set_active_links_async()
644 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->activate_links_work); in ieee80211_set_active_links_async()