Lines Matching full:link
3 * MLO link handling
18 struct ieee80211_link_data *link; in ieee80211_update_apvlan_links() local
44 link = sdata_dereference(vlan->link[link_id], vlan); in ieee80211_update_apvlan_links()
45 ieee80211_link_vlan_copy_chanctx(link); in ieee80211_update_apvlan_links()
80 void ieee80211_link_setup(struct ieee80211_link_data *link) in ieee80211_link_setup() argument
82 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_setup()
83 ieee80211_mgd_setup_link(link); in ieee80211_link_setup()
88 struct ieee80211_link_data *link, in ieee80211_link_init() argument
107 link->sdata = sdata; in ieee80211_link_init()
108 link->link_id = link_id; in ieee80211_link_init()
109 link->conf = link_conf; in ieee80211_link_init()
112 link->ap_power_level = IEEE80211_UNSET_POWER_LEVEL; in ieee80211_link_init()
113 link->user_power_level = sdata->local->user_power_level; in ieee80211_link_init()
116 wiphy_work_init(&link->csa.finalize_work, in ieee80211_link_init()
118 wiphy_work_init(&link->color_change_finalize_work, in ieee80211_link_init()
120 wiphy_delayed_work_init(&link->color_collision_detect_work, in ieee80211_link_init()
122 INIT_LIST_HEAD(&link->assigned_chanctx_list); in ieee80211_link_init()
123 INIT_LIST_HEAD(&link->reserved_chanctx_list); in ieee80211_link_init()
124 wiphy_delayed_work_init(&link->dfs_cac_timer_work, in ieee80211_link_init()
143 ieee80211_link_debugfs_add(link); in ieee80211_link_init()
147 rcu_assign_pointer(sdata->link[link_id], link); in ieee80211_link_init()
150 void ieee80211_link_stop(struct ieee80211_link_data *link) in ieee80211_link_stop() argument
152 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_stop()
153 ieee80211_mgd_stop_link(link); in ieee80211_link_stop()
155 wiphy_delayed_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
156 &link->color_collision_detect_work); in ieee80211_link_stop()
157 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
158 &link->color_change_finalize_work); in ieee80211_link_stop()
159 wiphy_work_cancel(link->sdata->local->hw.wiphy, in ieee80211_link_stop()
160 &link->csa.finalize_work); 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()
164 &link->dfs_cac_timer_work); in ieee80211_link_stop()
165 cfg80211_cac_event(link->sdata->dev, in ieee80211_link_stop()
166 &link->conf->chanreq.oper, in ieee80211_link_stop()
168 GFP_KERNEL, link->link_id); in ieee80211_link_stop()
171 ieee80211_link_release_channel(link); in ieee80211_link_stop()
182 struct ieee80211_link_data *link; in ieee80211_tear_down_links() local
189 link = &links[link_id]->data; in ieee80211_tear_down_links()
190 if (link_id == 0 && !link) in ieee80211_tear_down_links()
191 link = &sdata->deflink; in ieee80211_tear_down_links()
192 if (WARN_ON(!link)) in ieee80211_tear_down_links()
194 ieee80211_remove_link_keys(link, &keys); in ieee80211_tear_down_links()
195 ieee80211_link_debugfs_remove(link); in ieee80211_tear_down_links()
196 ieee80211_link_stop(link); in ieee80211_tear_down_links()
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()
285 struct link_container *links[IEEE80211_MLD_MAX_NUM_LINKS] = {}, *link; in ieee80211_vif_update_links() local
301 /* allocate new link structures first */ in ieee80211_vif_update_links()
303 link = kzalloc(sizeof(*link), GFP_KERNEL); in ieee80211_vif_update_links()
304 if (!link) { in ieee80211_vif_update_links()
308 links[link_id] = link; 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()
337 /* link them into data structures */ in ieee80211_vif_update_links()
340 rcu_access_pointer(sdata->link[link_id]) == &sdata->deflink); in ieee80211_vif_update_links()
342 link = links[link_id]; in ieee80211_vif_update_links()
343 ieee80211_link_init(sdata, link_id, &link->data, &link->conf); in ieee80211_vif_update_links()
344 ieee80211_link_setup(&link->data); in ieee80211_vif_update_links()
380 memcpy(sdata->link, old_data, sizeof(old_data)); in ieee80211_vif_update_links()
460 struct ieee80211_link_data *link; in _ieee80211_set_active_links() local
462 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
464 ieee80211_teardown_tdls_peers(link); in _ieee80211_set_active_links()
466 __ieee80211_link_release_channel(link, true); in _ieee80211_set_active_links()
469 * If CSA is (still) active while the link is deactivated, in _ieee80211_set_active_links()
474 if (link->conf->csa_active) in _ieee80211_set_active_links()
476 &link->u.mgd.csa.switch_work, in _ieee80211_set_active_links()
477 link->u.mgd.csa.time - in _ieee80211_set_active_links()
482 struct ieee80211_link_data *link; in _ieee80211_set_active_links() local
484 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
500 ret = _ieee80211_link_use_channel(link, in _ieee80211_set_active_links()
501 &link->conf->chanreq, in _ieee80211_set_active_links()
507 * inform about the link info changed parameters after all in _ieee80211_set_active_links()
551 struct ieee80211_link_data *link; in _ieee80211_set_active_links() local
553 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
555 ieee80211_mgd_set_link_qos_params(link); in _ieee80211_set_active_links()
556 ieee80211_link_info_change_notify(sdata, link, in _ieee80211_set_active_links()
605 * if there's at least one link that stays active across in ieee80211_set_active_links()