mlme.c 23 KB

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