mlme.c 23 KB

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