Lines Matching refs:sdata
16 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_setup()
20 void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, in ieee80211_link_init() argument
30 rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); in ieee80211_link_init()
31 rcu_assign_pointer(sdata->link[link_id], link); in ieee80211_link_init()
33 link->sdata = sdata; in ieee80211_link_init()
48 switch (sdata->vif.type) { in ieee80211_link_init()
51 sdata->wdev.links[link_id].addr); in ieee80211_link_init()
53 WARN_ON(!(sdata->wdev.valid_links & BIT(link_id))); in ieee80211_link_init()
66 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_stop()
77 static void ieee80211_tear_down_links(struct ieee80211_sub_if_data *sdata, in ieee80211_tear_down_links() argument
89 link = &sdata->deflink; in ieee80211_tear_down_links()
98 ieee80211_free_key_list(sdata->local, &keys); in ieee80211_tear_down_links()
101 static void ieee80211_free_links(struct ieee80211_sub_if_data *sdata, in ieee80211_free_links() argument
110 static int ieee80211_check_dup_link_addrs(struct ieee80211_sub_if_data *sdata) in ieee80211_check_dup_link_addrs() argument
117 link1 = sdata_dereference(sdata->link[i], sdata); in ieee80211_check_dup_link_addrs()
123 link2 = sdata_dereference(sdata->link[j], sdata); in ieee80211_check_dup_link_addrs()
136 static void ieee80211_set_vif_links_bitmaps(struct ieee80211_sub_if_data *sdata, in ieee80211_set_vif_links_bitmaps() argument
139 sdata->vif.valid_links = links; in ieee80211_set_vif_links_bitmaps()
142 sdata->vif.active_links = 0; in ieee80211_set_vif_links_bitmaps()
146 switch (sdata->vif.type) { in ieee80211_set_vif_links_bitmaps()
149 sdata->vif.active_links = links; in ieee80211_set_vif_links_bitmaps()
152 if (sdata->vif.active_links) in ieee80211_set_vif_links_bitmaps()
155 sdata->vif.active_links = links; in ieee80211_set_vif_links_bitmaps()
162 static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_update_links() argument
166 u16 old_links = sdata->vif.valid_links; in ieee80211_vif_update_links()
167 u16 old_active = sdata->vif.active_links; in ieee80211_vif_update_links()
177 sdata_assert_lock(sdata); in ieee80211_vif_update_links()
199 BUILD_BUG_ON(sizeof(old) != sizeof(sdata->vif.link_conf)); in ieee80211_vif_update_links()
200 memcpy(old, sdata->vif.link_conf, sizeof(old)); in ieee80211_vif_update_links()
202 BUILD_BUG_ON(sizeof(old_data) != sizeof(sdata->link)); in ieee80211_vif_update_links()
203 memcpy(old_data, sdata->link, sizeof(old_data)); in ieee80211_vif_update_links()
207 if (rcu_access_pointer(sdata->link[link_id]) != &sdata->deflink) { in ieee80211_vif_update_links()
212 to_free[link_id] = container_of(rcu_access_pointer(sdata->link[link_id]), in ieee80211_vif_update_links()
217 RCU_INIT_POINTER(sdata->link[link_id], NULL); in ieee80211_vif_update_links()
218 RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL); in ieee80211_vif_update_links()
224 rcu_access_pointer(sdata->link[link_id]) == &sdata->deflink); in ieee80211_vif_update_links()
227 ieee80211_link_init(sdata, link_id, &link->data, &link->conf); in ieee80211_vif_update_links()
232 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
233 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
235 ret = ieee80211_check_dup_link_addrs(sdata); in ieee80211_vif_update_links()
238 ieee80211_tear_down_links(sdata, to_free, rem); in ieee80211_vif_update_links()
240 ieee80211_set_vif_links_bitmaps(sdata, new_links); in ieee80211_vif_update_links()
243 ret = drv_change_vif_links(sdata->local, sdata, in ieee80211_vif_update_links()
245 new_links & sdata->vif.active_links, in ieee80211_vif_update_links()
251 memcpy(sdata->link, old_data, sizeof(old_data)); in ieee80211_vif_update_links()
252 memcpy(sdata->vif.link_conf, old, sizeof(old)); in ieee80211_vif_update_links()
253 ieee80211_set_vif_links_bitmaps(sdata, old_links); in ieee80211_vif_update_links()
271 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
272 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
276 int ieee80211_vif_set_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_set_links() argument
282 ret = ieee80211_vif_update_links(sdata, links, new_links); in ieee80211_vif_set_links()
283 ieee80211_free_links(sdata, links); in ieee80211_vif_set_links()
288 void ieee80211_vif_clear_links(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_clear_links() argument
298 sdata_lock(sdata); in ieee80211_vif_clear_links()
299 ieee80211_vif_update_links(sdata, links, 0); in ieee80211_vif_clear_links()
300 sdata_unlock(sdata); in ieee80211_vif_clear_links()
302 ieee80211_free_links(sdata, links); in ieee80211_vif_clear_links()
305 static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata, in _ieee80211_set_active_links() argument
309 struct ieee80211_local *local = sdata->local; in _ieee80211_set_active_links()
310 u16 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
317 if (!ieee80211_sdata_running(sdata)) in _ieee80211_set_active_links()
320 if (sdata->vif.type != NL80211_IFTYPE_STATION) in _ieee80211_set_active_links()
324 if (active_links & ~sdata->vif.valid_links) in _ieee80211_set_active_links()
332 link_confs[i] = sdata_dereference(sdata->vif.link_conf[i], in _ieee80211_set_active_links()
333 sdata); in _ieee80211_set_active_links()
336 sdata->vif.active_links |= active_links; in _ieee80211_set_active_links()
337 ret = drv_change_vif_links(local, sdata, in _ieee80211_set_active_links()
339 sdata->vif.active_links, in _ieee80211_set_active_links()
342 sdata->vif.active_links = old_active; in _ieee80211_set_active_links()
350 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
358 if (sdata != sta->sdata) in _ieee80211_set_active_links()
360 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
366 ret = ieee80211_key_switch_links(sdata, rem, add); in _ieee80211_set_active_links()
370 if (sdata != sta->sdata) in _ieee80211_set_active_links()
372 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
381 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
387 ieee80211_link_info_change_notify(sdata, link, in _ieee80211_set_active_links()
404 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
405 sdata->vif.active_links = active_links; in _ieee80211_set_active_links()
408 ret = drv_change_vif_links(local, sdata, old_active, in _ieee80211_set_active_links()
418 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links() local
419 struct ieee80211_local *local = sdata->local; in ieee80211_set_active_links()
423 sdata_lock(sdata); in ieee80211_set_active_links()
427 old_active = sdata->vif.active_links; in ieee80211_set_active_links()
434 ret = _ieee80211_set_active_links(sdata, in ieee80211_set_active_links()
437 ret = _ieee80211_set_active_links(sdata, active_links); in ieee80211_set_active_links()
440 ret = _ieee80211_set_active_links(sdata, active_links); in ieee80211_set_active_links()
445 sdata_unlock(sdata); in ieee80211_set_active_links()
454 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links_async() local
456 if (!ieee80211_sdata_running(sdata)) in ieee80211_set_active_links_async()
459 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_active_links_async()
463 if (active_links & ~sdata->vif.valid_links) in ieee80211_set_active_links_async()
467 if (sdata->vif.active_links == active_links) in ieee80211_set_active_links_async()
470 sdata->desired_active_links = active_links; in ieee80211_set_active_links_async()
471 schedule_work(&sdata->activate_links_work); in ieee80211_set_active_links_async()