link.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * MLO link handling
  4. *
  5. * Copyright (C) 2022-2023 Intel Corporation
  6. */
  7. #include <linux/slab.h>
  8. #include <linux/kernel.h>
  9. #include <net/mac80211.h>
  10. #include "ieee80211_i.h"
  11. #include "driver-ops.h"
  12. #include "key.h"
  13. void ieee80211_link_setup(struct ieee80211_link_data *link)
  14. {
  15. if (link->sdata->vif.type == NL80211_IFTYPE_STATION)
  16. ieee80211_mgd_setup_link(link);
  17. }
  18. void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
  19. int link_id,
  20. struct ieee80211_link_data *link,
  21. struct ieee80211_bss_conf *link_conf)
  22. {
  23. bool deflink = link_id < 0;
  24. if (link_id < 0)
  25. link_id = 0;
  26. rcu_assign_pointer(sdata->vif.link_conf[link_id], link_conf);
  27. rcu_assign_pointer(sdata->link[link_id], link);
  28. link->sdata = sdata;
  29. link->link_id = link_id;
  30. link->conf = link_conf;
  31. link_conf->link_id = link_id;
  32. INIT_WORK(&link->csa_finalize_work,
  33. ieee80211_csa_finalize_work);
  34. INIT_WORK(&link->color_change_finalize_work,
  35. ieee80211_color_change_finalize_work);
  36. INIT_DELAYED_WORK(&link->color_collision_detect_work,
  37. ieee80211_color_collision_detection_work);
  38. INIT_LIST_HEAD(&link->assigned_chanctx_list);
  39. INIT_LIST_HEAD(&link->reserved_chanctx_list);
  40. INIT_DELAYED_WORK(&link->dfs_cac_timer_work,
  41. ieee80211_dfs_cac_timer_work);
  42. if (!deflink) {
  43. switch (sdata->vif.type) {
  44. case NL80211_IFTYPE_AP:
  45. ether_addr_copy(link_conf->addr,
  46. sdata->wdev.links[link_id].addr);
  47. link_conf->bssid = link_conf->addr;
  48. WARN_ON(!(sdata->wdev.valid_links & BIT(link_id)));
  49. break;
  50. case NL80211_IFTYPE_STATION:
  51. /* station sets the bssid in ieee80211_mgd_setup_link */
  52. break;
  53. default:
  54. WARN_ON(1);
  55. }
  56. }
  57. }
  58. void ieee80211_link_stop(struct ieee80211_link_data *link)
  59. {
  60. if (link->sdata->vif.type == NL80211_IFTYPE_STATION)
  61. ieee80211_mgd_stop_link(link);
  62. cancel_delayed_work_sync(&link->color_collision_detect_work);
  63. ieee80211_link_release_channel(link);
  64. }
  65. struct link_container {
  66. struct ieee80211_link_data data;
  67. struct ieee80211_bss_conf conf;
  68. };
  69. static void ieee80211_tear_down_links(struct ieee80211_sub_if_data *sdata,
  70. struct link_container **links, u16 mask)
  71. {
  72. struct ieee80211_link_data *link;
  73. LIST_HEAD(keys);
  74. unsigned int link_id;
  75. for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
  76. if (!(mask & BIT(link_id)))
  77. continue;
  78. link = &links[link_id]->data;
  79. if (link_id == 0 && !link)
  80. link = &sdata->deflink;
  81. if (WARN_ON(!link))
  82. continue;
  83. ieee80211_remove_link_keys(link, &keys);
  84. ieee80211_link_stop(link);
  85. }
  86. synchronize_rcu();
  87. ieee80211_free_key_list(sdata->local, &keys);
  88. }
  89. static void ieee80211_free_links(struct ieee80211_sub_if_data *sdata,
  90. struct link_container **links)
  91. {
  92. unsigned int link_id;
  93. for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++)
  94. kfree(links[link_id]);
  95. }
  96. static int ieee80211_check_dup_link_addrs(struct ieee80211_sub_if_data *sdata)
  97. {
  98. unsigned int i, j;
  99. for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
  100. struct ieee80211_link_data *link1;
  101. link1 = sdata_dereference(sdata->link[i], sdata);
  102. if (!link1)
  103. continue;
  104. for (j = i + 1; j < IEEE80211_MLD_MAX_NUM_LINKS; j++) {
  105. struct ieee80211_link_data *link2;
  106. link2 = sdata_dereference(sdata->link[j], sdata);
  107. if (!link2)
  108. continue;
  109. if (ether_addr_equal(link1->conf->addr,
  110. link2->conf->addr))
  111. return -EALREADY;
  112. }
  113. }
  114. return 0;
  115. }
  116. static void ieee80211_set_vif_links_bitmaps(struct ieee80211_sub_if_data *sdata,
  117. u16 links)
  118. {
  119. sdata->vif.valid_links = links;
  120. if (!links) {
  121. sdata->vif.active_links = 0;
  122. return;
  123. }
  124. switch (sdata->vif.type) {
  125. case NL80211_IFTYPE_AP:
  126. /* in an AP all links are always active */
  127. sdata->vif.active_links = links;
  128. break;
  129. case NL80211_IFTYPE_STATION:
  130. if (sdata->vif.active_links)
  131. break;
  132. WARN_ON(hweight16(links) > 1);
  133. sdata->vif.active_links = links;
  134. break;
  135. default:
  136. WARN_ON(1);
  137. }
  138. }
  139. static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,
  140. struct link_container **to_free,
  141. u16 new_links)
  142. {
  143. u16 old_links = sdata->vif.valid_links;
  144. u16 old_active = sdata->vif.active_links;
  145. unsigned long add = new_links & ~old_links;
  146. unsigned long rem = old_links & ~new_links;
  147. unsigned int link_id;
  148. int ret;
  149. struct link_container *links[IEEE80211_MLD_MAX_NUM_LINKS] = {}, *link;
  150. struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS];
  151. struct ieee80211_link_data *old_data[IEEE80211_MLD_MAX_NUM_LINKS];
  152. bool use_deflink = old_links == 0; /* set for error case */
  153. sdata_assert_lock(sdata);
  154. memset(to_free, 0, sizeof(links));
  155. if (old_links == new_links)
  156. return 0;
  157. /* if there were no old links, need to clear the pointers to deflink */
  158. if (!old_links)
  159. rem |= BIT(0);
  160. /* allocate new link structures first */
  161. for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
  162. link = kzalloc(sizeof(*link), GFP_KERNEL);
  163. if (!link) {
  164. ret = -ENOMEM;
  165. goto free;
  166. }
  167. links[link_id] = link;
  168. }
  169. /* keep track of the old pointers for the driver */
  170. BUILD_BUG_ON(sizeof(old) != sizeof(sdata->vif.link_conf));
  171. memcpy(old, sdata->vif.link_conf, sizeof(old));
  172. /* and for us in error cases */
  173. BUILD_BUG_ON(sizeof(old_data) != sizeof(sdata->link));
  174. memcpy(old_data, sdata->link, sizeof(old_data));
  175. /* grab old links to free later */
  176. for_each_set_bit(link_id, &rem, IEEE80211_MLD_MAX_NUM_LINKS) {
  177. if (rcu_access_pointer(sdata->link[link_id]) != &sdata->deflink) {
  178. /*
  179. * we must have allocated the data through this path so
  180. * we know we can free both at the same time
  181. */
  182. to_free[link_id] = container_of(rcu_access_pointer(sdata->link[link_id]),
  183. typeof(*links[link_id]),
  184. data);
  185. }
  186. RCU_INIT_POINTER(sdata->link[link_id], NULL);
  187. RCU_INIT_POINTER(sdata->vif.link_conf[link_id], NULL);
  188. }
  189. /* link them into data structures */
  190. for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
  191. WARN_ON(!use_deflink &&
  192. rcu_access_pointer(sdata->link[link_id]) == &sdata->deflink);
  193. link = links[link_id];
  194. ieee80211_link_init(sdata, link_id, &link->data, &link->conf);
  195. ieee80211_link_setup(&link->data);
  196. }
  197. if (new_links == 0)
  198. ieee80211_link_init(sdata, -1, &sdata->deflink,
  199. &sdata->vif.bss_conf);
  200. ret = ieee80211_check_dup_link_addrs(sdata);
  201. if (!ret) {
  202. /* for keys we will not be able to undo this */
  203. ieee80211_tear_down_links(sdata, to_free, rem);
  204. ieee80211_set_vif_links_bitmaps(sdata, new_links);
  205. /* tell the driver */
  206. ret = drv_change_vif_links(sdata->local, sdata,
  207. old_links & old_active,
  208. new_links & sdata->vif.active_links,
  209. old);
  210. }
  211. if (ret) {
  212. /* restore config */
  213. memcpy(sdata->link, old_data, sizeof(old_data));
  214. memcpy(sdata->vif.link_conf, old, sizeof(old));
  215. ieee80211_set_vif_links_bitmaps(sdata, old_links);
  216. /* and free (only) the newly allocated links */
  217. memset(to_free, 0, sizeof(links));
  218. goto free;
  219. }
  220. /* use deflink/bss_conf again if and only if there are no more links */
  221. use_deflink = new_links == 0;
  222. goto deinit;
  223. free:
  224. /* if we failed during allocation, only free all */
  225. for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
  226. kfree(links[link_id]);
  227. links[link_id] = NULL;
  228. }
  229. deinit:
  230. if (use_deflink)
  231. ieee80211_link_init(sdata, -1, &sdata->deflink,
  232. &sdata->vif.bss_conf);
  233. return ret;
  234. }
  235. int ieee80211_vif_set_links(struct ieee80211_sub_if_data *sdata,
  236. u16 new_links)
  237. {
  238. struct link_container *links[IEEE80211_MLD_MAX_NUM_LINKS];
  239. int ret;
  240. ret = ieee80211_vif_update_links(sdata, links, new_links);
  241. ieee80211_free_links(sdata, links);
  242. return ret;
  243. }
  244. void ieee80211_vif_clear_links(struct ieee80211_sub_if_data *sdata)
  245. {
  246. struct link_container *links[IEEE80211_MLD_MAX_NUM_LINKS];
  247. /*
  248. * The locking here is different because when we free links
  249. * in the station case we need to be able to cancel_work_sync()
  250. * something that also takes the lock.
  251. */
  252. sdata_lock(sdata);
  253. ieee80211_vif_update_links(sdata, links, 0);
  254. sdata_unlock(sdata);
  255. ieee80211_free_links(sdata, links);
  256. }
  257. static int _ieee80211_set_active_links(struct ieee80211_sub_if_data *sdata,
  258. u16 active_links)
  259. {
  260. struct ieee80211_bss_conf *link_confs[IEEE80211_MLD_MAX_NUM_LINKS];
  261. struct ieee80211_local *local = sdata->local;
  262. u16 old_active = sdata->vif.active_links;
  263. unsigned long rem = old_active & ~active_links;
  264. unsigned long add = active_links & ~old_active;
  265. struct sta_info *sta;
  266. unsigned int link_id;
  267. int ret, i;
  268. if (!ieee80211_sdata_running(sdata))
  269. return -ENETDOWN;
  270. if (sdata->vif.type != NL80211_IFTYPE_STATION)
  271. return -EINVAL;
  272. /* cannot activate links that don't exist */
  273. if (active_links & ~sdata->vif.valid_links)
  274. return -EINVAL;
  275. /* nothing to do */
  276. if (old_active == active_links)
  277. return 0;
  278. for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++)
  279. link_confs[i] = sdata_dereference(sdata->vif.link_conf[i],
  280. sdata);
  281. if (add) {
  282. sdata->vif.active_links |= active_links;
  283. ret = drv_change_vif_links(local, sdata,
  284. old_active,
  285. sdata->vif.active_links,
  286. link_confs);
  287. if (ret) {
  288. sdata->vif.active_links = old_active;
  289. return ret;
  290. }
  291. }
  292. for_each_set_bit(link_id, &rem, IEEE80211_MLD_MAX_NUM_LINKS) {
  293. struct ieee80211_link_data *link;
  294. link = sdata_dereference(sdata->link[link_id], sdata);
  295. /* FIXME: kill TDLS connections on the link */
  296. ieee80211_link_release_channel(link);
  297. }
  298. list_for_each_entry(sta, &local->sta_list, list) {
  299. if (sdata != sta->sdata)
  300. continue;
  301. ret = drv_change_sta_links(local, sdata, &sta->sta,
  302. old_active,
  303. old_active | active_links);
  304. WARN_ON_ONCE(ret);
  305. }
  306. ret = ieee80211_key_switch_links(sdata, rem, add);
  307. WARN_ON_ONCE(ret);
  308. list_for_each_entry(sta, &local->sta_list, list) {
  309. if (sdata != sta->sdata)
  310. continue;
  311. ret = drv_change_sta_links(local, sdata, &sta->sta,
  312. old_active | active_links,
  313. active_links);
  314. WARN_ON_ONCE(ret);
  315. }
  316. for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
  317. struct ieee80211_link_data *link;
  318. link = sdata_dereference(sdata->link[link_id], sdata);
  319. ret = ieee80211_link_use_channel(link, &link->conf->chandef,
  320. IEEE80211_CHANCTX_SHARED);
  321. WARN_ON_ONCE(ret);
  322. ieee80211_mgd_set_link_qos_params(link);
  323. ieee80211_link_info_change_notify(sdata, link,
  324. BSS_CHANGED_ERP_CTS_PROT |
  325. BSS_CHANGED_ERP_PREAMBLE |
  326. BSS_CHANGED_ERP_SLOT |
  327. BSS_CHANGED_HT |
  328. BSS_CHANGED_BASIC_RATES |
  329. BSS_CHANGED_BSSID |
  330. BSS_CHANGED_CQM |
  331. BSS_CHANGED_QOS |
  332. BSS_CHANGED_TXPOWER |
  333. BSS_CHANGED_BANDWIDTH |
  334. BSS_CHANGED_TWT |
  335. BSS_CHANGED_HE_OBSS_PD |
  336. BSS_CHANGED_HE_BSS_COLOR);
  337. }
  338. old_active = sdata->vif.active_links;
  339. sdata->vif.active_links = active_links;
  340. if (rem) {
  341. ret = drv_change_vif_links(local, sdata, old_active,
  342. active_links, link_confs);
  343. WARN_ON_ONCE(ret);
  344. }
  345. return 0;
  346. }
  347. int ieee80211_set_active_links(struct ieee80211_vif *vif, u16 active_links)
  348. {
  349. struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
  350. struct ieee80211_local *local = sdata->local;
  351. u16 old_active;
  352. int ret;
  353. sdata_lock(sdata);
  354. mutex_lock(&local->sta_mtx);
  355. mutex_lock(&local->mtx);
  356. mutex_lock(&local->key_mtx);
  357. old_active = sdata->vif.active_links;
  358. if (old_active & active_links) {
  359. /*
  360. * if there's at least one link that stays active across
  361. * the change then switch to it (to those) first, and
  362. * then enable the additional links
  363. */
  364. ret = _ieee80211_set_active_links(sdata,
  365. old_active & active_links);
  366. if (!ret)
  367. ret = _ieee80211_set_active_links(sdata, active_links);
  368. } else {
  369. /* otherwise switch directly */
  370. ret = _ieee80211_set_active_links(sdata, active_links);
  371. }
  372. mutex_unlock(&local->key_mtx);
  373. mutex_unlock(&local->mtx);
  374. mutex_unlock(&local->sta_mtx);
  375. sdata_unlock(sdata);
  376. return ret;
  377. }
  378. EXPORT_SYMBOL_GPL(ieee80211_set_active_links);
  379. void ieee80211_set_active_links_async(struct ieee80211_vif *vif,
  380. u16 active_links)
  381. {
  382. struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
  383. if (!ieee80211_sdata_running(sdata))
  384. return;
  385. if (sdata->vif.type != NL80211_IFTYPE_STATION)
  386. return;
  387. /* cannot activate links that don't exist */
  388. if (active_links & ~sdata->vif.valid_links)
  389. return;
  390. /* nothing to do */
  391. if (sdata->vif.active_links == active_links)
  392. return;
  393. sdata->desired_active_links = active_links;
  394. schedule_work(&sdata->activate_links_work);
  395. }
  396. EXPORT_SYMBOL_GPL(ieee80211_set_active_links_async);