mlme.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * cfg80211 MLME SAP interface
  4. *
  5. * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
  6. * Copyright (c) 2015 Intel Deutschland GmbH
  7. */
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/etherdevice.h>
  11. #include <linux/netdevice.h>
  12. #include <linux/nl80211.h>
  13. #include <linux/slab.h>
  14. #include <linux/wireless.h>
  15. #include <net/cfg80211.h>
  16. #include <net/iw_handler.h>
  17. #include "core.h"
  18. #include "nl80211.h"
  19. #include "rdev-ops.h"
  20. void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
  21. const u8 *buf, size_t len, int uapsd_queues)
  22. {
  23. struct wireless_dev *wdev = dev->ieee80211_ptr;
  24. struct wiphy *wiphy = wdev->wiphy;
  25. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  26. struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
  27. struct cfg80211_connect_resp_params cr;
  28. memset(&cr, 0, sizeof(cr));
  29. cr.status = (int)le16_to_cpu(mgmt->u.assoc_resp.status_code);
  30. cr.bssid = mgmt->bssid;
  31. cr.bss = bss;
  32. cr.resp_ie = mgmt->u.assoc_resp.variable;
  33. cr.resp_ie_len =
  34. len - offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
  35. cr.timeout_reason = NL80211_TIMEOUT_UNSPECIFIED;
  36. trace_cfg80211_send_rx_assoc(dev, bss);
  37. /*
  38. * This is a bit of a hack, we don't notify userspace of
  39. * a (re-)association reply if we tried to send a reassoc
  40. * and got a reject -- we only try again with an assoc
  41. * frame instead of reassoc.
  42. */
  43. if (cfg80211_sme_rx_assoc_resp(wdev, cr.status)) {
  44. cfg80211_unhold_bss(bss_from_pub(bss));
  45. cfg80211_put_bss(wiphy, bss);
  46. return;
  47. }
  48. nl80211_send_rx_assoc(rdev, dev, buf, len, GFP_KERNEL, uapsd_queues);
  49. /* update current_bss etc., consumes the bss reference */
  50. __cfg80211_connect_result(dev, &cr, cr.status == WLAN_STATUS_SUCCESS);
  51. }
  52. EXPORT_SYMBOL(cfg80211_rx_assoc_resp);
  53. static void cfg80211_process_auth(struct wireless_dev *wdev,
  54. const u8 *buf, size_t len)
  55. {
  56. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  57. nl80211_send_rx_auth(rdev, wdev->netdev, buf, len, GFP_KERNEL);
  58. cfg80211_sme_rx_auth(wdev, buf, len);
  59. }
  60. static void cfg80211_process_deauth(struct wireless_dev *wdev,
  61. const u8 *buf, size_t len)
  62. {
  63. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  64. struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
  65. const u8 *bssid = mgmt->bssid;
  66. u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
  67. bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
  68. nl80211_send_deauth(rdev, wdev->netdev, buf, len, GFP_KERNEL);
  69. if (!wdev->current_bss ||
  70. !ether_addr_equal(wdev->current_bss->pub.bssid, bssid))
  71. return;
  72. __cfg80211_disconnected(wdev->netdev, NULL, 0, reason_code, from_ap);
  73. cfg80211_sme_deauth(wdev);
  74. }
  75. static void cfg80211_process_disassoc(struct wireless_dev *wdev,
  76. const u8 *buf, size_t len)
  77. {
  78. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  79. struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
  80. const u8 *bssid = mgmt->bssid;
  81. u16 reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
  82. bool from_ap = !ether_addr_equal(mgmt->sa, wdev->netdev->dev_addr);
  83. nl80211_send_disassoc(rdev, wdev->netdev, buf, len, GFP_KERNEL);
  84. if (WARN_ON(!wdev->current_bss ||
  85. !ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
  86. return;
  87. __cfg80211_disconnected(wdev->netdev, NULL, 0, reason_code, from_ap);
  88. cfg80211_sme_disassoc(wdev);
  89. }
  90. void cfg80211_rx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
  91. {
  92. struct wireless_dev *wdev = dev->ieee80211_ptr;
  93. struct ieee80211_mgmt *mgmt = (void *)buf;
  94. ASSERT_WDEV_LOCK(wdev);
  95. trace_cfg80211_rx_mlme_mgmt(dev, buf, len);
  96. if (WARN_ON(len < 2))
  97. return;
  98. if (ieee80211_is_auth(mgmt->frame_control))
  99. cfg80211_process_auth(wdev, buf, len);
  100. else if (ieee80211_is_deauth(mgmt->frame_control))
  101. cfg80211_process_deauth(wdev, buf, len);
  102. else if (ieee80211_is_disassoc(mgmt->frame_control))
  103. cfg80211_process_disassoc(wdev, buf, len);
  104. }
  105. EXPORT_SYMBOL(cfg80211_rx_mlme_mgmt);
  106. void cfg80211_auth_timeout(struct net_device *dev, const u8 *addr)
  107. {
  108. struct wireless_dev *wdev = dev->ieee80211_ptr;
  109. struct wiphy *wiphy = wdev->wiphy;
  110. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  111. trace_cfg80211_send_auth_timeout(dev, addr);
  112. nl80211_send_auth_timeout(rdev, dev, addr, GFP_KERNEL);
  113. cfg80211_sme_auth_timeout(wdev);
  114. }
  115. EXPORT_SYMBOL(cfg80211_auth_timeout);
  116. void cfg80211_assoc_timeout(struct net_device *dev, struct cfg80211_bss *bss)
  117. {
  118. struct wireless_dev *wdev = dev->ieee80211_ptr;
  119. struct wiphy *wiphy = wdev->wiphy;
  120. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  121. trace_cfg80211_send_assoc_timeout(dev, bss->bssid);
  122. nl80211_send_assoc_timeout(rdev, dev, bss->bssid, GFP_KERNEL);
  123. cfg80211_sme_assoc_timeout(wdev);
  124. cfg80211_unhold_bss(bss_from_pub(bss));
  125. cfg80211_put_bss(wiphy, bss);
  126. }
  127. EXPORT_SYMBOL(cfg80211_assoc_timeout);
  128. void cfg80211_abandon_assoc(struct net_device *dev, struct cfg80211_bss *bss)
  129. {
  130. struct wireless_dev *wdev = dev->ieee80211_ptr;
  131. struct wiphy *wiphy = wdev->wiphy;
  132. cfg80211_sme_abandon_assoc(wdev);
  133. cfg80211_unhold_bss(bss_from_pub(bss));
  134. cfg80211_put_bss(wiphy, bss);
  135. }
  136. EXPORT_SYMBOL(cfg80211_abandon_assoc);
  137. void cfg80211_tx_mlme_mgmt(struct net_device *dev, const u8 *buf, size_t len)
  138. {
  139. struct wireless_dev *wdev = dev->ieee80211_ptr;
  140. struct ieee80211_mgmt *mgmt = (void *)buf;
  141. ASSERT_WDEV_LOCK(wdev);
  142. trace_cfg80211_tx_mlme_mgmt(dev, buf, len);
  143. if (WARN_ON(len < 2))
  144. return;
  145. if (ieee80211_is_deauth(mgmt->frame_control))
  146. cfg80211_process_deauth(wdev, buf, len);
  147. else
  148. cfg80211_process_disassoc(wdev, buf, len);
  149. }
  150. EXPORT_SYMBOL(cfg80211_tx_mlme_mgmt);
  151. void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
  152. enum nl80211_key_type key_type, int key_id,
  153. const u8 *tsc, gfp_t gfp)
  154. {
  155. struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
  156. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  157. #ifdef CONFIG_CFG80211_WEXT
  158. union iwreq_data wrqu;
  159. char *buf = kmalloc(128, gfp);
  160. if (buf) {
  161. sprintf(buf, "MLME-MICHAELMICFAILURE.indication("
  162. "keyid=%d %scast addr=%pM)", key_id,
  163. key_type == NL80211_KEYTYPE_GROUP ? "broad" : "uni",
  164. addr);
  165. memset(&wrqu, 0, sizeof(wrqu));
  166. wrqu.data.length = strlen(buf);
  167. wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
  168. kfree(buf);
  169. }
  170. #endif
  171. trace_cfg80211_michael_mic_failure(dev, addr, key_type, key_id, tsc);
  172. nl80211_michael_mic_failure(rdev, dev, addr, key_type, key_id, tsc, gfp);
  173. }
  174. EXPORT_SYMBOL(cfg80211_michael_mic_failure);
  175. /* some MLME handling for userspace SME */
  176. int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
  177. struct net_device *dev,
  178. struct ieee80211_channel *chan,
  179. enum nl80211_auth_type auth_type,
  180. const u8 *bssid,
  181. const u8 *ssid, int ssid_len,
  182. const u8 *ie, int ie_len,
  183. const u8 *key, int key_len, int key_idx,
  184. const u8 *auth_data, int auth_data_len)
  185. {
  186. struct wireless_dev *wdev = dev->ieee80211_ptr;
  187. struct cfg80211_auth_request req = {
  188. .ie = ie,
  189. .ie_len = ie_len,
  190. .auth_data = auth_data,
  191. .auth_data_len = auth_data_len,
  192. .auth_type = auth_type,
  193. .key = key,
  194. .key_len = key_len,
  195. .key_idx = key_idx,
  196. };
  197. int err;
  198. ASSERT_WDEV_LOCK(wdev);
  199. if (auth_type == NL80211_AUTHTYPE_SHARED_KEY)
  200. if (!key || !key_len || key_idx < 0 || key_idx > 3)
  201. return -EINVAL;
  202. if (wdev->current_bss &&
  203. ether_addr_equal(bssid, wdev->current_bss->pub.bssid))
  204. return -EALREADY;
  205. req.bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
  206. IEEE80211_BSS_TYPE_ESS,
  207. IEEE80211_PRIVACY_ANY);
  208. if (!req.bss)
  209. return -ENOENT;
  210. err = rdev_auth(rdev, dev, &req);
  211. cfg80211_put_bss(&rdev->wiphy, req.bss);
  212. return err;
  213. }
  214. /* Do a logical ht_capa &= ht_capa_mask. */
  215. void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
  216. const struct ieee80211_ht_cap *ht_capa_mask)
  217. {
  218. int i;
  219. u8 *p1, *p2;
  220. if (!ht_capa_mask) {
  221. memset(ht_capa, 0, sizeof(*ht_capa));
  222. return;
  223. }
  224. p1 = (u8*)(ht_capa);
  225. p2 = (u8*)(ht_capa_mask);
  226. for (i = 0; i<sizeof(*ht_capa); i++)
  227. p1[i] &= p2[i];
  228. }
  229. /* Do a logical ht_capa &= ht_capa_mask. */
  230. void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
  231. const struct ieee80211_vht_cap *vht_capa_mask)
  232. {
  233. int i;
  234. u8 *p1, *p2;
  235. if (!vht_capa_mask) {
  236. memset(vht_capa, 0, sizeof(*vht_capa));
  237. return;
  238. }
  239. p1 = (u8*)(vht_capa);
  240. p2 = (u8*)(vht_capa_mask);
  241. for (i = 0; i < sizeof(*vht_capa); i++)
  242. p1[i] &= p2[i];
  243. }
  244. int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
  245. struct net_device *dev,
  246. struct ieee80211_channel *chan,
  247. const u8 *bssid,
  248. const u8 *ssid, int ssid_len,
  249. struct cfg80211_assoc_request *req)
  250. {
  251. struct wireless_dev *wdev = dev->ieee80211_ptr;
  252. int err;
  253. ASSERT_WDEV_LOCK(wdev);
  254. if (wdev->current_bss &&
  255. (!req->prev_bssid || !ether_addr_equal(wdev->current_bss->pub.bssid,
  256. req->prev_bssid)))
  257. return -EALREADY;
  258. cfg80211_oper_and_ht_capa(&req->ht_capa_mask,
  259. rdev->wiphy.ht_capa_mod_mask);
  260. cfg80211_oper_and_vht_capa(&req->vht_capa_mask,
  261. rdev->wiphy.vht_capa_mod_mask);
  262. req->bss = cfg80211_get_bss(&rdev->wiphy, chan, bssid, ssid, ssid_len,
  263. IEEE80211_BSS_TYPE_ESS,
  264. IEEE80211_PRIVACY_ANY);
  265. if (!req->bss)
  266. return -ENOENT;
  267. err = rdev_assoc(rdev, dev, req);
  268. if (!err)
  269. cfg80211_hold_bss(bss_from_pub(req->bss));
  270. else
  271. cfg80211_put_bss(&rdev->wiphy, req->bss);
  272. return err;
  273. }
  274. int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
  275. struct net_device *dev, const u8 *bssid,
  276. const u8 *ie, int ie_len, u16 reason,
  277. bool local_state_change)
  278. {
  279. struct wireless_dev *wdev = dev->ieee80211_ptr;
  280. struct cfg80211_deauth_request req = {
  281. .bssid = bssid,
  282. .reason_code = reason,
  283. .ie = ie,
  284. .ie_len = ie_len,
  285. .local_state_change = local_state_change,
  286. };
  287. ASSERT_WDEV_LOCK(wdev);
  288. if (local_state_change &&
  289. (!wdev->current_bss ||
  290. !ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
  291. return 0;
  292. if (ether_addr_equal(wdev->disconnect_bssid, bssid) ||
  293. (wdev->current_bss &&
  294. ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
  295. wdev->conn_owner_nlportid = 0;
  296. return rdev_deauth(rdev, dev, &req);
  297. }
  298. int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
  299. struct net_device *dev, const u8 *bssid,
  300. const u8 *ie, int ie_len, u16 reason,
  301. bool local_state_change)
  302. {
  303. struct wireless_dev *wdev = dev->ieee80211_ptr;
  304. struct cfg80211_disassoc_request req = {
  305. .reason_code = reason,
  306. .local_state_change = local_state_change,
  307. .ie = ie,
  308. .ie_len = ie_len,
  309. };
  310. int err;
  311. ASSERT_WDEV_LOCK(wdev);
  312. if (!wdev->current_bss)
  313. return -ENOTCONN;
  314. if (ether_addr_equal(wdev->current_bss->pub.bssid, bssid))
  315. req.bss = &wdev->current_bss->pub;
  316. else
  317. return -ENOTCONN;
  318. err = rdev_disassoc(rdev, dev, &req);
  319. if (err)
  320. return err;
  321. /* driver should have reported the disassoc */
  322. WARN_ON(wdev->current_bss);
  323. return 0;
  324. }
  325. void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
  326. struct net_device *dev)
  327. {
  328. struct wireless_dev *wdev = dev->ieee80211_ptr;
  329. u8 bssid[ETH_ALEN];
  330. ASSERT_WDEV_LOCK(wdev);
  331. if (!rdev->ops->deauth)
  332. return;
  333. if (!wdev->current_bss)
  334. return;
  335. memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
  336. cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
  337. WLAN_REASON_DEAUTH_LEAVING, false);
  338. }
  339. struct cfg80211_mgmt_registration {
  340. struct list_head list;
  341. struct wireless_dev *wdev;
  342. u32 nlportid;
  343. int match_len;
  344. __le16 frame_type;
  345. u8 match[];
  346. };
  347. static void
  348. cfg80211_process_mlme_unregistrations(struct cfg80211_registered_device *rdev)
  349. {
  350. struct cfg80211_mgmt_registration *reg;
  351. ASSERT_RTNL();
  352. spin_lock_bh(&rdev->mlme_unreg_lock);
  353. while ((reg = list_first_entry_or_null(&rdev->mlme_unreg,
  354. struct cfg80211_mgmt_registration,
  355. list))) {
  356. list_del(&reg->list);
  357. spin_unlock_bh(&rdev->mlme_unreg_lock);
  358. if (rdev->ops->mgmt_frame_register) {
  359. u16 frame_type = le16_to_cpu(reg->frame_type);
  360. rdev_mgmt_frame_register(rdev, reg->wdev,
  361. frame_type, false);
  362. }
  363. kfree(reg);
  364. spin_lock_bh(&rdev->mlme_unreg_lock);
  365. }
  366. spin_unlock_bh(&rdev->mlme_unreg_lock);
  367. }
  368. void cfg80211_mlme_unreg_wk(struct work_struct *wk)
  369. {
  370. struct cfg80211_registered_device *rdev;
  371. rdev = container_of(wk, struct cfg80211_registered_device,
  372. mlme_unreg_wk);
  373. rtnl_lock();
  374. cfg80211_process_mlme_unregistrations(rdev);
  375. rtnl_unlock();
  376. }
  377. int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
  378. u16 frame_type, const u8 *match_data,
  379. int match_len)
  380. {
  381. struct wiphy *wiphy = wdev->wiphy;
  382. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  383. struct cfg80211_mgmt_registration *reg, *nreg;
  384. int err = 0;
  385. u16 mgmt_type;
  386. if (!wdev->wiphy->mgmt_stypes)
  387. return -EOPNOTSUPP;
  388. if ((frame_type & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT)
  389. return -EINVAL;
  390. if (frame_type & ~(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE))
  391. return -EINVAL;
  392. mgmt_type = (frame_type & IEEE80211_FCTL_STYPE) >> 4;
  393. if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].rx & BIT(mgmt_type)))
  394. return -EINVAL;
  395. nreg = kzalloc(sizeof(*reg) + match_len, GFP_KERNEL);
  396. if (!nreg)
  397. return -ENOMEM;
  398. spin_lock_bh(&wdev->mgmt_registrations_lock);
  399. list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
  400. int mlen = min(match_len, reg->match_len);
  401. if (frame_type != le16_to_cpu(reg->frame_type))
  402. continue;
  403. if (memcmp(reg->match, match_data, mlen) == 0) {
  404. err = -EALREADY;
  405. break;
  406. }
  407. }
  408. if (err) {
  409. kfree(nreg);
  410. goto out;
  411. }
  412. memcpy(nreg->match, match_data, match_len);
  413. nreg->match_len = match_len;
  414. nreg->nlportid = snd_portid;
  415. nreg->frame_type = cpu_to_le16(frame_type);
  416. nreg->wdev = wdev;
  417. list_add(&nreg->list, &wdev->mgmt_registrations);
  418. spin_unlock_bh(&wdev->mgmt_registrations_lock);
  419. /* process all unregistrations to avoid driver confusion */
  420. cfg80211_process_mlme_unregistrations(rdev);
  421. if (rdev->ops->mgmt_frame_register)
  422. rdev_mgmt_frame_register(rdev, wdev, frame_type, true);
  423. return 0;
  424. out:
  425. spin_unlock_bh(&wdev->mgmt_registrations_lock);
  426. return err;
  427. }
  428. void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlportid)
  429. {
  430. struct wiphy *wiphy = wdev->wiphy;
  431. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  432. struct cfg80211_mgmt_registration *reg, *tmp;
  433. spin_lock_bh(&wdev->mgmt_registrations_lock);
  434. list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
  435. if (reg->nlportid != nlportid)
  436. continue;
  437. list_del(&reg->list);
  438. spin_lock(&rdev->mlme_unreg_lock);
  439. list_add_tail(&reg->list, &rdev->mlme_unreg);
  440. spin_unlock(&rdev->mlme_unreg_lock);
  441. schedule_work(&rdev->mlme_unreg_wk);
  442. }
  443. spin_unlock_bh(&wdev->mgmt_registrations_lock);
  444. if (nlportid && rdev->crit_proto_nlportid == nlportid) {
  445. rdev->crit_proto_nlportid = 0;
  446. rdev_crit_proto_stop(rdev, wdev);
  447. }
  448. if (nlportid == wdev->ap_unexpected_nlportid)
  449. wdev->ap_unexpected_nlportid = 0;
  450. }
  451. void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
  452. {
  453. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  454. spin_lock_bh(&wdev->mgmt_registrations_lock);
  455. spin_lock(&rdev->mlme_unreg_lock);
  456. list_splice_tail_init(&wdev->mgmt_registrations, &rdev->mlme_unreg);
  457. spin_unlock(&rdev->mlme_unreg_lock);
  458. spin_unlock_bh(&wdev->mgmt_registrations_lock);
  459. cfg80211_process_mlme_unregistrations(rdev);
  460. }
  461. int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
  462. struct wireless_dev *wdev,
  463. struct cfg80211_mgmt_tx_params *params, u64 *cookie)
  464. {
  465. const struct ieee80211_mgmt *mgmt;
  466. u16 stype;
  467. if (!wdev->wiphy->mgmt_stypes)
  468. return -EOPNOTSUPP;
  469. if (!rdev->ops->mgmt_tx)
  470. return -EOPNOTSUPP;
  471. if (params->len < 24 + 1)
  472. return -EINVAL;
  473. mgmt = (const struct ieee80211_mgmt *)params->buf;
  474. if (!ieee80211_is_mgmt(mgmt->frame_control))
  475. return -EINVAL;
  476. stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
  477. if (!(wdev->wiphy->mgmt_stypes[wdev->iftype].tx & BIT(stype >> 4)))
  478. return -EINVAL;
  479. if (ieee80211_is_action(mgmt->frame_control) &&
  480. mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
  481. int err = 0;
  482. wdev_lock(wdev);
  483. switch (wdev->iftype) {
  484. case NL80211_IFTYPE_ADHOC:
  485. case NL80211_IFTYPE_STATION:
  486. case NL80211_IFTYPE_P2P_CLIENT:
  487. if (!wdev->current_bss) {
  488. err = -ENOTCONN;
  489. break;
  490. }
  491. if (!ether_addr_equal(wdev->current_bss->pub.bssid,
  492. mgmt->bssid)) {
  493. err = -ENOTCONN;
  494. break;
  495. }
  496. /*
  497. * check for IBSS DA must be done by driver as
  498. * cfg80211 doesn't track the stations
  499. */
  500. if (wdev->iftype == NL80211_IFTYPE_ADHOC)
  501. break;
  502. /* for station, check that DA is the AP */
  503. if (!ether_addr_equal(wdev->current_bss->pub.bssid,
  504. mgmt->da)) {
  505. err = -ENOTCONN;
  506. break;
  507. }
  508. break;
  509. case NL80211_IFTYPE_AP:
  510. case NL80211_IFTYPE_P2P_GO:
  511. case NL80211_IFTYPE_AP_VLAN:
  512. if (!ether_addr_equal(mgmt->bssid, wdev_address(wdev)))
  513. err = -EINVAL;
  514. break;
  515. case NL80211_IFTYPE_MESH_POINT:
  516. if (!ether_addr_equal(mgmt->sa, mgmt->bssid)) {
  517. err = -EINVAL;
  518. break;
  519. }
  520. /*
  521. * check for mesh DA must be done by driver as
  522. * cfg80211 doesn't track the stations
  523. */
  524. break;
  525. case NL80211_IFTYPE_P2P_DEVICE:
  526. /*
  527. * fall through, P2P device only supports
  528. * public action frames
  529. */
  530. case NL80211_IFTYPE_NAN:
  531. default:
  532. err = -EOPNOTSUPP;
  533. break;
  534. }
  535. wdev_unlock(wdev);
  536. if (err)
  537. return err;
  538. }
  539. if (!ether_addr_equal(mgmt->sa, wdev_address(wdev))) {
  540. /* Allow random TA to be used with Public Action frames if the
  541. * driver has indicated support for this. Otherwise, only allow
  542. * the local address to be used.
  543. */
  544. if (!ieee80211_is_action(mgmt->frame_control) ||
  545. mgmt->u.action.category != WLAN_CATEGORY_PUBLIC)
  546. return -EINVAL;
  547. if (!wdev->current_bss &&
  548. !wiphy_ext_feature_isset(
  549. &rdev->wiphy,
  550. NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA))
  551. return -EINVAL;
  552. if (wdev->current_bss &&
  553. !wiphy_ext_feature_isset(
  554. &rdev->wiphy,
  555. NL80211_EXT_FEATURE_MGMT_TX_RANDOM_TA_CONNECTED))
  556. return -EINVAL;
  557. }
  558. /* Transmit the Action frame as requested by user space */
  559. return rdev_mgmt_tx(rdev, wdev, params, cookie);
  560. }
  561. bool cfg80211_rx_mgmt(struct wireless_dev *wdev, int freq, int sig_dbm,
  562. const u8 *buf, size_t len, u32 flags)
  563. {
  564. struct wiphy *wiphy = wdev->wiphy;
  565. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  566. struct cfg80211_mgmt_registration *reg;
  567. const struct ieee80211_txrx_stypes *stypes =
  568. &wiphy->mgmt_stypes[wdev->iftype];
  569. struct ieee80211_mgmt *mgmt = (void *)buf;
  570. const u8 *data;
  571. int data_len;
  572. bool result = false;
  573. __le16 ftype = mgmt->frame_control &
  574. cpu_to_le16(IEEE80211_FCTL_FTYPE | IEEE80211_FCTL_STYPE);
  575. u16 stype;
  576. trace_cfg80211_rx_mgmt(wdev, freq, sig_dbm);
  577. stype = (le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE) >> 4;
  578. if (!(stypes->rx & BIT(stype))) {
  579. trace_cfg80211_return_bool(false);
  580. return false;
  581. }
  582. data = buf + ieee80211_hdrlen(mgmt->frame_control);
  583. data_len = len - ieee80211_hdrlen(mgmt->frame_control);
  584. spin_lock_bh(&wdev->mgmt_registrations_lock);
  585. list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
  586. if (reg->frame_type != ftype)
  587. continue;
  588. if (reg->match_len > data_len)
  589. continue;
  590. if (memcmp(reg->match, data, reg->match_len))
  591. continue;
  592. /* found match! */
  593. /* Indicate the received Action frame to user space */
  594. if (nl80211_send_mgmt(rdev, wdev, reg->nlportid,
  595. freq, sig_dbm,
  596. buf, len, flags, GFP_ATOMIC))
  597. continue;
  598. result = true;
  599. break;
  600. }
  601. spin_unlock_bh(&wdev->mgmt_registrations_lock);
  602. trace_cfg80211_return_bool(result);
  603. return result;
  604. }
  605. EXPORT_SYMBOL(cfg80211_rx_mgmt);
  606. void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev)
  607. {
  608. cancel_delayed_work(&rdev->dfs_update_channels_wk);
  609. queue_delayed_work(cfg80211_wq, &rdev->dfs_update_channels_wk, 0);
  610. }
  611. void cfg80211_dfs_channels_update_work(struct work_struct *work)
  612. {
  613. struct delayed_work *delayed_work = to_delayed_work(work);
  614. struct cfg80211_registered_device *rdev;
  615. struct cfg80211_chan_def chandef;
  616. struct ieee80211_supported_band *sband;
  617. struct ieee80211_channel *c;
  618. struct wiphy *wiphy;
  619. bool check_again = false;
  620. unsigned long timeout, next_time = 0;
  621. unsigned long time_dfs_update;
  622. enum nl80211_radar_event radar_event;
  623. int bandid, i;
  624. rdev = container_of(delayed_work, struct cfg80211_registered_device,
  625. dfs_update_channels_wk);
  626. wiphy = &rdev->wiphy;
  627. rtnl_lock();
  628. for (bandid = 0; bandid < NUM_NL80211_BANDS; bandid++) {
  629. sband = wiphy->bands[bandid];
  630. if (!sband)
  631. continue;
  632. for (i = 0; i < sband->n_channels; i++) {
  633. c = &sband->channels[i];
  634. if (!(c->flags & IEEE80211_CHAN_RADAR))
  635. continue;
  636. if (c->dfs_state != NL80211_DFS_UNAVAILABLE &&
  637. c->dfs_state != NL80211_DFS_AVAILABLE)
  638. continue;
  639. if (c->dfs_state == NL80211_DFS_UNAVAILABLE) {
  640. time_dfs_update = IEEE80211_DFS_MIN_NOP_TIME_MS;
  641. radar_event = NL80211_RADAR_NOP_FINISHED;
  642. } else {
  643. if (regulatory_pre_cac_allowed(wiphy) ||
  644. cfg80211_any_wiphy_oper_chan(wiphy, c))
  645. continue;
  646. time_dfs_update = REG_PRE_CAC_EXPIRY_GRACE_MS;
  647. radar_event = NL80211_RADAR_PRE_CAC_EXPIRED;
  648. }
  649. timeout = c->dfs_state_entered +
  650. msecs_to_jiffies(time_dfs_update);
  651. if (time_after_eq(jiffies, timeout)) {
  652. c->dfs_state = NL80211_DFS_USABLE;
  653. c->dfs_state_entered = jiffies;
  654. cfg80211_chandef_create(&chandef, c,
  655. NL80211_CHAN_NO_HT);
  656. nl80211_radar_notify(rdev, &chandef,
  657. radar_event, NULL,
  658. GFP_ATOMIC);
  659. regulatory_propagate_dfs_state(wiphy, &chandef,
  660. c->dfs_state,
  661. radar_event);
  662. continue;
  663. }
  664. if (!check_again)
  665. next_time = timeout - jiffies;
  666. else
  667. next_time = min(next_time, timeout - jiffies);
  668. check_again = true;
  669. }
  670. }
  671. rtnl_unlock();
  672. /* reschedule if there are other channels waiting to be cleared again */
  673. if (check_again)
  674. queue_delayed_work(cfg80211_wq, &rdev->dfs_update_channels_wk,
  675. next_time);
  676. }
  677. void cfg80211_radar_event(struct wiphy *wiphy,
  678. struct cfg80211_chan_def *chandef,
  679. gfp_t gfp)
  680. {
  681. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  682. trace_cfg80211_radar_event(wiphy, chandef);
  683. /* only set the chandef supplied channel to unavailable, in
  684. * case the radar is detected on only one of multiple channels
  685. * spanned by the chandef.
  686. */
  687. cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_UNAVAILABLE);
  688. cfg80211_sched_dfs_chan_update(rdev);
  689. nl80211_radar_notify(rdev, chandef, NL80211_RADAR_DETECTED, NULL, gfp);
  690. memcpy(&rdev->radar_chandef, chandef, sizeof(struct cfg80211_chan_def));
  691. queue_work(cfg80211_wq, &rdev->propagate_radar_detect_wk);
  692. }
  693. EXPORT_SYMBOL(cfg80211_radar_event);
  694. void cfg80211_cac_event(struct net_device *netdev,
  695. const struct cfg80211_chan_def *chandef,
  696. enum nl80211_radar_event event, gfp_t gfp)
  697. {
  698. struct wireless_dev *wdev = netdev->ieee80211_ptr;
  699. struct wiphy *wiphy = wdev->wiphy;
  700. struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
  701. unsigned long timeout;
  702. trace_cfg80211_cac_event(netdev, event);
  703. if (WARN_ON(!wdev->cac_started && event != NL80211_RADAR_CAC_STARTED))
  704. return;
  705. if (WARN_ON(!wdev->chandef.chan))
  706. return;
  707. switch (event) {
  708. case NL80211_RADAR_CAC_FINISHED:
  709. timeout = wdev->cac_start_time +
  710. msecs_to_jiffies(wdev->cac_time_ms);
  711. WARN_ON(!time_after_eq(jiffies, timeout));
  712. cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
  713. memcpy(&rdev->cac_done_chandef, chandef,
  714. sizeof(struct cfg80211_chan_def));
  715. queue_work(cfg80211_wq, &rdev->propagate_cac_done_wk);
  716. cfg80211_sched_dfs_chan_update(rdev);
  717. /* fall through */
  718. case NL80211_RADAR_CAC_ABORTED:
  719. wdev->cac_started = false;
  720. break;
  721. case NL80211_RADAR_CAC_STARTED:
  722. wdev->cac_started = true;
  723. break;
  724. default:
  725. WARN_ON(1);
  726. return;
  727. }
  728. nl80211_radar_notify(rdev, chandef, event, netdev, gfp);
  729. }
  730. EXPORT_SYMBOL(cfg80211_cac_event);