Lines Matching refs:sdata

17 	if (link->sdata->vif.type == NL80211_IFTYPE_STATION)  in ieee80211_link_setup()
21 void ieee80211_link_init(struct ieee80211_sub_if_data *sdata, in ieee80211_link_init() argument
31 rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf); in ieee80211_link_init()
32 rcu_assign_pointer(sdata->link[link_id], link); in ieee80211_link_init()
34 link->sdata = sdata; in ieee80211_link_init()
38 link_conf->vif = &sdata->vif; in ieee80211_link_init()
52 switch (sdata->vif.type) { in ieee80211_link_init()
55 sdata->wdev.links[link_id].addr); in ieee80211_link_init()
57 WARN_ON(!(sdata->wdev.valid_links & BIT(link_id))); in ieee80211_link_init()
72 if (link->sdata->vif.type == NL80211_IFTYPE_STATION) in ieee80211_link_stop()
84 static void ieee80211_tear_down_links(struct ieee80211_sub_if_data *sdata, in ieee80211_tear_down_links() argument
96 link = &sdata->deflink; in ieee80211_tear_down_links()
106 ieee80211_free_key_list(sdata->local, &keys); in ieee80211_tear_down_links()
109 static void ieee80211_free_links(struct ieee80211_sub_if_data *sdata, in ieee80211_free_links() argument
118 static int ieee80211_check_dup_link_addrs(struct ieee80211_sub_if_data *sdata) in ieee80211_check_dup_link_addrs() argument
125 link1 = sdata_dereference(sdata->link[i], sdata); in ieee80211_check_dup_link_addrs()
131 link2 = sdata_dereference(sdata->link[j], sdata); in ieee80211_check_dup_link_addrs()
144 static void ieee80211_set_vif_links_bitmaps(struct ieee80211_sub_if_data *sdata, in ieee80211_set_vif_links_bitmaps() argument
147 sdata->vif.valid_links = valid_links; in ieee80211_set_vif_links_bitmaps()
148 sdata->vif.dormant_links = dormant_links; in ieee80211_set_vif_links_bitmaps()
155 sdata->vif.active_links = 0; in ieee80211_set_vif_links_bitmaps()
156 sdata->vif.dormant_links = 0; in ieee80211_set_vif_links_bitmaps()
160 switch (sdata->vif.type) { in ieee80211_set_vif_links_bitmaps()
163 sdata->vif.active_links = valid_links; in ieee80211_set_vif_links_bitmaps()
169 if (sdata->vif.active_links) in ieee80211_set_vif_links_bitmaps()
171 sdata->vif.active_links = valid_links & ~dormant_links; in ieee80211_set_vif_links_bitmaps()
172 WARN_ON(hweight16(sdata->vif.active_links) > 1); in ieee80211_set_vif_links_bitmaps()
179 static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_update_links() argument
183 u16 old_links = sdata->vif.valid_links; in ieee80211_vif_update_links()
184 u16 old_active = sdata->vif.active_links; in ieee80211_vif_update_links()
194 sdata_assert_lock(sdata); in ieee80211_vif_update_links()
198 if (old_links == new_links && dormant_links == sdata->vif.dormant_links) in ieee80211_vif_update_links()
216 BUILD_BUG_ON(sizeof(old) != sizeof(sdata->vif.link_conf)); in ieee80211_vif_update_links()
217 memcpy(old, sdata->vif.link_conf, sizeof(old)); in ieee80211_vif_update_links()
219 BUILD_BUG_ON(sizeof(old_data) != sizeof(sdata->link)); in ieee80211_vif_update_links()
220 memcpy(old_data, sdata->link, sizeof(old_data)); in ieee80211_vif_update_links()
224 if (rcu_access_pointer(sdata->link[link_id]) != &sdata->deflink) { in ieee80211_vif_update_links()
229 to_free[link_id] = container_of(rcu_access_pointer(sdata->link[link_id]), in ieee80211_vif_update_links()
234 RCU_INIT_POINTER(sdata->link[link_id], NULL); in ieee80211_vif_update_links()
235 RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL); in ieee80211_vif_update_links()
241 rcu_access_pointer(sdata->link[link_id]) == &sdata->deflink); in ieee80211_vif_update_links()
244 ieee80211_link_init(sdata, link_id, &link->data, &link->conf); in ieee80211_vif_update_links()
249 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
250 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
252 ret = ieee80211_check_dup_link_addrs(sdata); in ieee80211_vif_update_links()
255 ieee80211_tear_down_links(sdata, to_free, rem); in ieee80211_vif_update_links()
257 ieee80211_set_vif_links_bitmaps(sdata, new_links, dormant_links); in ieee80211_vif_update_links()
260 ret = drv_change_vif_links(sdata->local, sdata, in ieee80211_vif_update_links()
262 new_links & sdata->vif.active_links, in ieee80211_vif_update_links()
268 memcpy(sdata->link, old_data, sizeof(old_data)); in ieee80211_vif_update_links()
269 memcpy(sdata->vif.link_conf, old, sizeof(old)); in ieee80211_vif_update_links()
270 ieee80211_set_vif_links_bitmaps(sdata, old_links, dormant_links); in ieee80211_vif_update_links()
288 ieee80211_link_init(sdata, -1, &sdata->deflink, in ieee80211_vif_update_links()
289 &sdata->vif.bss_conf); in ieee80211_vif_update_links()
293 int ieee80211_vif_set_links(struct ieee80211_sub_if_data *sdata, in ieee80211_vif_set_links() argument
299 ret = ieee80211_vif_update_links(sdata, links, new_links, in ieee80211_vif_set_links()
301 ieee80211_free_links(sdata, links); in ieee80211_vif_set_links()
306 void ieee80211_vif_clear_links(struct ieee80211_sub_if_data *sdata) in ieee80211_vif_clear_links() argument
316 sdata_lock(sdata); in ieee80211_vif_clear_links()
317 ieee80211_vif_update_links(sdata, links, 0, 0); in ieee80211_vif_clear_links()
318 sdata_unlock(sdata); in ieee80211_vif_clear_links()
320 ieee80211_free_links(sdata, links); in ieee80211_vif_clear_links()
323 static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata, in _ieee80211_set_active_links() argument
327 struct ieee80211_local *local = sdata->local; in _ieee80211_set_active_links()
328 u16 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
335 if (!ieee80211_sdata_running(sdata)) in _ieee80211_set_active_links()
338 if (sdata->vif.type != NL80211_IFTYPE_STATION) in _ieee80211_set_active_links()
341 if (active_links & ~ieee80211_vif_usable_links(&sdata->vif)) in _ieee80211_set_active_links()
349 link_confs[i] = sdata_dereference(sdata->vif.link_conf[i], in _ieee80211_set_active_links()
350 sdata); in _ieee80211_set_active_links()
353 sdata->vif.active_links |= active_links; in _ieee80211_set_active_links()
354 ret = drv_change_vif_links(local, sdata, in _ieee80211_set_active_links()
356 sdata->vif.active_links, in _ieee80211_set_active_links()
359 sdata->vif.active_links = old_active; in _ieee80211_set_active_links()
367 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
375 if (sdata != sta->sdata) in _ieee80211_set_active_links()
382 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
388 ret = ieee80211_key_switch_links(sdata, rem, add); in _ieee80211_set_active_links()
392 if (sdata != sta->sdata) in _ieee80211_set_active_links()
397 ret = drv_change_sta_links(local, sdata, &sta->sta, in _ieee80211_set_active_links()
415 link = sdata_dereference(sdata->link[link_id], sdata); in _ieee80211_set_active_links()
422 ieee80211_link_info_change_notify(sdata, link, in _ieee80211_set_active_links()
438 old_active = sdata->vif.active_links; in _ieee80211_set_active_links()
439 sdata->vif.active_links = active_links; in _ieee80211_set_active_links()
442 ret = drv_change_vif_links(local, sdata, old_active, in _ieee80211_set_active_links()
452 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in __ieee80211_set_active_links() local
453 struct ieee80211_local *local = sdata->local; in __ieee80211_set_active_links()
457 sdata_assert_lock(sdata); in __ieee80211_set_active_links()
461 old_active = sdata->vif.active_links; in __ieee80211_set_active_links()
468 ret = _ieee80211_set_active_links(sdata, in __ieee80211_set_active_links()
471 ret = _ieee80211_set_active_links(sdata, active_links); in __ieee80211_set_active_links()
474 ret = _ieee80211_set_active_links(sdata, active_links); in __ieee80211_set_active_links()
485 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links() local
488 sdata_lock(sdata); in ieee80211_set_active_links()
490 sdata_unlock(sdata); in ieee80211_set_active_links()
499 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); in ieee80211_set_active_links_async() local
501 if (!ieee80211_sdata_running(sdata)) in ieee80211_set_active_links_async()
504 if (sdata->vif.type != NL80211_IFTYPE_STATION) in ieee80211_set_active_links_async()
507 if (active_links & ~ieee80211_vif_usable_links(&sdata->vif)) in ieee80211_set_active_links_async()
511 if (sdata->vif.active_links == active_links) in ieee80211_set_active_links_async()
514 sdata->desired_active_links = active_links; in ieee80211_set_active_links_async()
515 schedule_work(&sdata->activate_links_work); in ieee80211_set_active_links_async()