sme.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033
  1. /*
  2. * SME code for cfg80211's connect emulation.
  3. *
  4. * Copyright 2009 Johannes Berg <johannes@sipsolutions.net>
  5. * Copyright (C) 2009 Intel Corporation. All rights reserved.
  6. */
  7. #include <linux/etherdevice.h>
  8. #include <linux/if_arp.h>
  9. #include <linux/slab.h>
  10. #include <linux/workqueue.h>
  11. #include <linux/wireless.h>
  12. #include <linux/export.h>
  13. #include <net/iw_handler.h>
  14. #include <net/cfg80211.h>
  15. #include <net/rtnetlink.h>
  16. #include "nl80211.h"
  17. #include "reg.h"
  18. #include "rdev-ops.h"
  19. struct cfg80211_conn {
  20. struct cfg80211_connect_params params;
  21. /* these are sub-states of the _CONNECTING sme_state */
  22. enum {
  23. CFG80211_CONN_IDLE,
  24. CFG80211_CONN_SCANNING,
  25. CFG80211_CONN_SCAN_AGAIN,
  26. CFG80211_CONN_AUTHENTICATE_NEXT,
  27. CFG80211_CONN_AUTHENTICATING,
  28. CFG80211_CONN_ASSOCIATE_NEXT,
  29. CFG80211_CONN_ASSOCIATING,
  30. CFG80211_CONN_DEAUTH_ASSOC_FAIL,
  31. } state;
  32. u8 bssid[ETH_ALEN], prev_bssid[ETH_ALEN];
  33. u8 *ie;
  34. size_t ie_len;
  35. bool auto_auth, prev_bssid_valid;
  36. };
  37. static bool cfg80211_is_all_idle(void)
  38. {
  39. struct cfg80211_registered_device *rdev;
  40. struct wireless_dev *wdev;
  41. bool is_all_idle = true;
  42. mutex_lock(&cfg80211_mutex);
  43. /*
  44. * All devices must be idle as otherwise if you are actively
  45. * scanning some new beacon hints could be learned and would
  46. * count as new regulatory hints.
  47. */
  48. list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
  49. cfg80211_lock_rdev(rdev);
  50. list_for_each_entry(wdev, &rdev->wdev_list, list) {
  51. wdev_lock(wdev);
  52. if (wdev->sme_state != CFG80211_SME_IDLE)
  53. is_all_idle = false;
  54. wdev_unlock(wdev);
  55. }
  56. cfg80211_unlock_rdev(rdev);
  57. }
  58. mutex_unlock(&cfg80211_mutex);
  59. return is_all_idle;
  60. }
  61. static void disconnect_work(struct work_struct *work)
  62. {
  63. if (!cfg80211_is_all_idle())
  64. return;
  65. regulatory_hint_disconnect();
  66. }
  67. static DECLARE_WORK(cfg80211_disconnect_work, disconnect_work);
  68. static int cfg80211_conn_scan(struct wireless_dev *wdev)
  69. {
  70. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  71. struct cfg80211_scan_request *request;
  72. int n_channels, err;
  73. ASSERT_RTNL();
  74. ASSERT_RDEV_LOCK(rdev);
  75. ASSERT_WDEV_LOCK(wdev);
  76. if (rdev->scan_req)
  77. return -EBUSY;
  78. if (wdev->conn->params.channel) {
  79. n_channels = 1;
  80. } else {
  81. enum ieee80211_band band;
  82. n_channels = 0;
  83. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  84. if (!wdev->wiphy->bands[band])
  85. continue;
  86. n_channels += wdev->wiphy->bands[band]->n_channels;
  87. }
  88. }
  89. request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) +
  90. sizeof(request->channels[0]) * n_channels,
  91. GFP_KERNEL);
  92. if (!request)
  93. return -ENOMEM;
  94. if (wdev->conn->params.channel)
  95. request->channels[0] = wdev->conn->params.channel;
  96. else {
  97. int i = 0, j;
  98. enum ieee80211_band band;
  99. struct ieee80211_supported_band *bands;
  100. struct ieee80211_channel *channel;
  101. for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
  102. bands = wdev->wiphy->bands[band];
  103. if (!bands)
  104. continue;
  105. for (j = 0; j < bands->n_channels; j++) {
  106. channel = &bands->channels[j];
  107. if (channel->flags & IEEE80211_CHAN_DISABLED)
  108. continue;
  109. request->channels[i++] = channel;
  110. }
  111. request->rates[band] = (1 << bands->n_bitrates) - 1;
  112. }
  113. n_channels = i;
  114. }
  115. request->n_channels = n_channels;
  116. request->ssids = (void *)&request->channels[n_channels];
  117. request->n_ssids = 1;
  118. memcpy(request->ssids[0].ssid, wdev->conn->params.ssid,
  119. wdev->conn->params.ssid_len);
  120. request->ssids[0].ssid_len = wdev->conn->params.ssid_len;
  121. request->wdev = wdev;
  122. request->wiphy = &rdev->wiphy;
  123. request->scan_start = jiffies;
  124. rdev->scan_req = request;
  125. err = rdev_scan(rdev, request);
  126. if (!err) {
  127. wdev->conn->state = CFG80211_CONN_SCANNING;
  128. nl80211_send_scan_start(rdev, wdev);
  129. dev_hold(wdev->netdev);
  130. } else {
  131. rdev->scan_req = NULL;
  132. kfree(request);
  133. }
  134. return err;
  135. }
  136. static int cfg80211_conn_do_work(struct wireless_dev *wdev)
  137. {
  138. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  139. struct cfg80211_connect_params *params;
  140. struct cfg80211_assoc_request req = {};
  141. int err;
  142. ASSERT_WDEV_LOCK(wdev);
  143. if (!wdev->conn)
  144. return 0;
  145. params = &wdev->conn->params;
  146. switch (wdev->conn->state) {
  147. case CFG80211_CONN_SCAN_AGAIN:
  148. return cfg80211_conn_scan(wdev);
  149. case CFG80211_CONN_AUTHENTICATE_NEXT:
  150. BUG_ON(!rdev->ops->auth);
  151. wdev->conn->state = CFG80211_CONN_AUTHENTICATING;
  152. return __cfg80211_mlme_auth(rdev, wdev->netdev,
  153. params->channel, params->auth_type,
  154. params->bssid,
  155. params->ssid, params->ssid_len,
  156. NULL, 0,
  157. params->key, params->key_len,
  158. params->key_idx, NULL, 0);
  159. case CFG80211_CONN_ASSOCIATE_NEXT:
  160. BUG_ON(!rdev->ops->assoc);
  161. wdev->conn->state = CFG80211_CONN_ASSOCIATING;
  162. if (wdev->conn->prev_bssid_valid)
  163. req.prev_bssid = wdev->conn->prev_bssid;
  164. req.ie = params->ie;
  165. req.ie_len = params->ie_len;
  166. req.use_mfp = params->mfp != NL80211_MFP_NO;
  167. req.crypto = params->crypto;
  168. req.flags = params->flags;
  169. req.ht_capa = params->ht_capa;
  170. req.ht_capa_mask = params->ht_capa_mask;
  171. req.vht_capa = params->vht_capa;
  172. req.vht_capa_mask = params->vht_capa_mask;
  173. err = __cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel,
  174. params->bssid, params->ssid,
  175. params->ssid_len, &req);
  176. if (err)
  177. __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
  178. NULL, 0,
  179. WLAN_REASON_DEAUTH_LEAVING,
  180. false);
  181. return err;
  182. case CFG80211_CONN_DEAUTH_ASSOC_FAIL:
  183. __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
  184. NULL, 0,
  185. WLAN_REASON_DEAUTH_LEAVING, false);
  186. /* return an error so that we call __cfg80211_connect_result() */
  187. return -EINVAL;
  188. default:
  189. return 0;
  190. }
  191. }
  192. void cfg80211_conn_work(struct work_struct *work)
  193. {
  194. struct cfg80211_registered_device *rdev =
  195. container_of(work, struct cfg80211_registered_device, conn_work);
  196. struct wireless_dev *wdev;
  197. u8 bssid_buf[ETH_ALEN], *bssid = NULL;
  198. rtnl_lock();
  199. cfg80211_lock_rdev(rdev);
  200. mutex_lock(&rdev->devlist_mtx);
  201. list_for_each_entry(wdev, &rdev->wdev_list, list) {
  202. wdev_lock(wdev);
  203. if (!netif_running(wdev->netdev)) {
  204. wdev_unlock(wdev);
  205. continue;
  206. }
  207. if (wdev->sme_state != CFG80211_SME_CONNECTING || !wdev->conn) {
  208. wdev_unlock(wdev);
  209. continue;
  210. }
  211. if (wdev->conn->params.bssid) {
  212. memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
  213. bssid = bssid_buf;
  214. }
  215. if (cfg80211_conn_do_work(wdev))
  216. __cfg80211_connect_result(
  217. wdev->netdev, bssid,
  218. NULL, 0, NULL, 0,
  219. WLAN_STATUS_UNSPECIFIED_FAILURE,
  220. false, NULL);
  221. wdev_unlock(wdev);
  222. }
  223. mutex_unlock(&rdev->devlist_mtx);
  224. cfg80211_unlock_rdev(rdev);
  225. rtnl_unlock();
  226. }
  227. static struct cfg80211_bss *cfg80211_get_conn_bss(struct wireless_dev *wdev)
  228. {
  229. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  230. struct cfg80211_bss *bss;
  231. u16 capa = WLAN_CAPABILITY_ESS;
  232. ASSERT_WDEV_LOCK(wdev);
  233. if (wdev->conn->params.privacy)
  234. capa |= WLAN_CAPABILITY_PRIVACY;
  235. bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel,
  236. wdev->conn->params.bssid,
  237. wdev->conn->params.ssid,
  238. wdev->conn->params.ssid_len,
  239. WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_PRIVACY,
  240. capa);
  241. if (!bss)
  242. return NULL;
  243. memcpy(wdev->conn->bssid, bss->bssid, ETH_ALEN);
  244. wdev->conn->params.bssid = wdev->conn->bssid;
  245. wdev->conn->params.channel = bss->channel;
  246. wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
  247. schedule_work(&rdev->conn_work);
  248. return bss;
  249. }
  250. static void __cfg80211_sme_scan_done(struct net_device *dev)
  251. {
  252. struct wireless_dev *wdev = dev->ieee80211_ptr;
  253. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  254. struct cfg80211_bss *bss;
  255. ASSERT_WDEV_LOCK(wdev);
  256. if (wdev->sme_state != CFG80211_SME_CONNECTING)
  257. return;
  258. if (!wdev->conn)
  259. return;
  260. if (wdev->conn->state != CFG80211_CONN_SCANNING &&
  261. wdev->conn->state != CFG80211_CONN_SCAN_AGAIN)
  262. return;
  263. bss = cfg80211_get_conn_bss(wdev);
  264. if (bss) {
  265. cfg80211_put_bss(&rdev->wiphy, bss);
  266. } else {
  267. /* not found */
  268. if (wdev->conn->state == CFG80211_CONN_SCAN_AGAIN)
  269. schedule_work(&rdev->conn_work);
  270. else
  271. __cfg80211_connect_result(
  272. wdev->netdev,
  273. wdev->conn->params.bssid,
  274. NULL, 0, NULL, 0,
  275. WLAN_STATUS_UNSPECIFIED_FAILURE,
  276. false, NULL);
  277. }
  278. }
  279. void cfg80211_sme_scan_done(struct net_device *dev)
  280. {
  281. struct wireless_dev *wdev = dev->ieee80211_ptr;
  282. mutex_lock(&wiphy_to_dev(wdev->wiphy)->devlist_mtx);
  283. wdev_lock(wdev);
  284. __cfg80211_sme_scan_done(dev);
  285. wdev_unlock(wdev);
  286. mutex_unlock(&wiphy_to_dev(wdev->wiphy)->devlist_mtx);
  287. }
  288. void cfg80211_sme_rx_auth(struct net_device *dev,
  289. const u8 *buf, size_t len)
  290. {
  291. struct wireless_dev *wdev = dev->ieee80211_ptr;
  292. struct wiphy *wiphy = wdev->wiphy;
  293. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  294. struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
  295. u16 status_code = le16_to_cpu(mgmt->u.auth.status_code);
  296. ASSERT_WDEV_LOCK(wdev);
  297. /* should only RX auth frames when connecting */
  298. if (wdev->sme_state != CFG80211_SME_CONNECTING)
  299. return;
  300. if (WARN_ON(!wdev->conn))
  301. return;
  302. if (status_code == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG &&
  303. wdev->conn->auto_auth &&
  304. wdev->conn->params.auth_type != NL80211_AUTHTYPE_NETWORK_EAP) {
  305. /* select automatically between only open, shared, leap */
  306. switch (wdev->conn->params.auth_type) {
  307. case NL80211_AUTHTYPE_OPEN_SYSTEM:
  308. if (wdev->connect_keys)
  309. wdev->conn->params.auth_type =
  310. NL80211_AUTHTYPE_SHARED_KEY;
  311. else
  312. wdev->conn->params.auth_type =
  313. NL80211_AUTHTYPE_NETWORK_EAP;
  314. break;
  315. case NL80211_AUTHTYPE_SHARED_KEY:
  316. wdev->conn->params.auth_type =
  317. NL80211_AUTHTYPE_NETWORK_EAP;
  318. break;
  319. default:
  320. /* huh? */
  321. wdev->conn->params.auth_type =
  322. NL80211_AUTHTYPE_OPEN_SYSTEM;
  323. break;
  324. }
  325. wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
  326. schedule_work(&rdev->conn_work);
  327. } else if (status_code != WLAN_STATUS_SUCCESS) {
  328. __cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, NULL, 0,
  329. status_code, false, NULL);
  330. } else if (wdev->sme_state == CFG80211_SME_CONNECTING &&
  331. wdev->conn->state == CFG80211_CONN_AUTHENTICATING) {
  332. wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
  333. schedule_work(&rdev->conn_work);
  334. }
  335. }
  336. bool cfg80211_sme_failed_reassoc(struct wireless_dev *wdev)
  337. {
  338. struct wiphy *wiphy = wdev->wiphy;
  339. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  340. if (WARN_ON(!wdev->conn))
  341. return false;
  342. if (!wdev->conn->prev_bssid_valid)
  343. return false;
  344. /*
  345. * Some stupid APs don't accept reassoc, so we
  346. * need to fall back to trying regular assoc.
  347. */
  348. wdev->conn->prev_bssid_valid = false;
  349. wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
  350. schedule_work(&rdev->conn_work);
  351. return true;
  352. }
  353. void cfg80211_sme_failed_assoc(struct wireless_dev *wdev)
  354. {
  355. struct wiphy *wiphy = wdev->wiphy;
  356. struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  357. wdev->conn->state = CFG80211_CONN_DEAUTH_ASSOC_FAIL;
  358. schedule_work(&rdev->conn_work);
  359. }
  360. void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
  361. const u8 *req_ie, size_t req_ie_len,
  362. const u8 *resp_ie, size_t resp_ie_len,
  363. u16 status, bool wextev,
  364. struct cfg80211_bss *bss)
  365. {
  366. struct wireless_dev *wdev = dev->ieee80211_ptr;
  367. const u8 *country_ie;
  368. #ifdef CONFIG_CFG80211_WEXT
  369. union iwreq_data wrqu;
  370. #endif
  371. ASSERT_WDEV_LOCK(wdev);
  372. if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
  373. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
  374. return;
  375. if (wdev->sme_state != CFG80211_SME_CONNECTING)
  376. return;
  377. nl80211_send_connect_result(wiphy_to_dev(wdev->wiphy), dev,
  378. bssid, req_ie, req_ie_len,
  379. resp_ie, resp_ie_len,
  380. status, GFP_KERNEL);
  381. #ifdef CONFIG_CFG80211_WEXT
  382. if (wextev) {
  383. if (req_ie && status == WLAN_STATUS_SUCCESS) {
  384. memset(&wrqu, 0, sizeof(wrqu));
  385. wrqu.data.length = req_ie_len;
  386. wireless_send_event(dev, IWEVASSOCREQIE, &wrqu, req_ie);
  387. }
  388. if (resp_ie && status == WLAN_STATUS_SUCCESS) {
  389. memset(&wrqu, 0, sizeof(wrqu));
  390. wrqu.data.length = resp_ie_len;
  391. wireless_send_event(dev, IWEVASSOCRESPIE, &wrqu, resp_ie);
  392. }
  393. memset(&wrqu, 0, sizeof(wrqu));
  394. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  395. if (bssid && status == WLAN_STATUS_SUCCESS) {
  396. memcpy(wrqu.ap_addr.sa_data, bssid, ETH_ALEN);
  397. memcpy(wdev->wext.prev_bssid, bssid, ETH_ALEN);
  398. wdev->wext.prev_bssid_valid = true;
  399. }
  400. wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
  401. }
  402. #endif
  403. if (wdev->current_bss) {
  404. cfg80211_unhold_bss(wdev->current_bss);
  405. cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
  406. wdev->current_bss = NULL;
  407. }
  408. if (wdev->conn)
  409. wdev->conn->state = CFG80211_CONN_IDLE;
  410. if (status != WLAN_STATUS_SUCCESS) {
  411. wdev->sme_state = CFG80211_SME_IDLE;
  412. if (wdev->conn)
  413. kfree(wdev->conn->ie);
  414. kfree(wdev->conn);
  415. wdev->conn = NULL;
  416. kfree(wdev->connect_keys);
  417. wdev->connect_keys = NULL;
  418. wdev->ssid_len = 0;
  419. cfg80211_put_bss(wdev->wiphy, bss);
  420. return;
  421. }
  422. if (!bss)
  423. bss = cfg80211_get_bss(wdev->wiphy,
  424. wdev->conn ? wdev->conn->params.channel :
  425. NULL,
  426. bssid,
  427. wdev->ssid, wdev->ssid_len,
  428. WLAN_CAPABILITY_ESS,
  429. WLAN_CAPABILITY_ESS);
  430. if (WARN_ON(!bss))
  431. return;
  432. cfg80211_hold_bss(bss_from_pub(bss));
  433. wdev->current_bss = bss_from_pub(bss);
  434. wdev->sme_state = CFG80211_SME_CONNECTED;
  435. cfg80211_upload_connect_keys(wdev);
  436. rcu_read_lock();
  437. country_ie = ieee80211_bss_get_ie(bss, WLAN_EID_COUNTRY);
  438. if (!country_ie) {
  439. rcu_read_unlock();
  440. return;
  441. }
  442. country_ie = kmemdup(country_ie, 2 + country_ie[1], GFP_ATOMIC);
  443. rcu_read_unlock();
  444. if (!country_ie)
  445. return;
  446. /*
  447. * ieee80211_bss_get_ie() ensures we can access:
  448. * - country_ie + 2, the start of the country ie data, and
  449. * - and country_ie[1] which is the IE length
  450. */
  451. regulatory_hint_11d(wdev->wiphy, bss->channel->band,
  452. country_ie + 2, country_ie[1]);
  453. kfree(country_ie);
  454. }
  455. void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
  456. const u8 *req_ie, size_t req_ie_len,
  457. const u8 *resp_ie, size_t resp_ie_len,
  458. u16 status, gfp_t gfp)
  459. {
  460. struct wireless_dev *wdev = dev->ieee80211_ptr;
  461. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  462. struct cfg80211_event *ev;
  463. unsigned long flags;
  464. CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTING);
  465. ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp);
  466. if (!ev)
  467. return;
  468. ev->type = EVENT_CONNECT_RESULT;
  469. if (bssid)
  470. memcpy(ev->cr.bssid, bssid, ETH_ALEN);
  471. if (req_ie_len) {
  472. ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev);
  473. ev->cr.req_ie_len = req_ie_len;
  474. memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len);
  475. }
  476. if (resp_ie_len) {
  477. ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len;
  478. ev->cr.resp_ie_len = resp_ie_len;
  479. memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len);
  480. }
  481. ev->cr.status = status;
  482. spin_lock_irqsave(&wdev->event_lock, flags);
  483. list_add_tail(&ev->list, &wdev->event_list);
  484. spin_unlock_irqrestore(&wdev->event_lock, flags);
  485. queue_work(cfg80211_wq, &rdev->event_work);
  486. }
  487. EXPORT_SYMBOL(cfg80211_connect_result);
  488. void __cfg80211_roamed(struct wireless_dev *wdev,
  489. struct cfg80211_bss *bss,
  490. const u8 *req_ie, size_t req_ie_len,
  491. const u8 *resp_ie, size_t resp_ie_len)
  492. {
  493. #ifdef CONFIG_CFG80211_WEXT
  494. union iwreq_data wrqu;
  495. #endif
  496. ASSERT_WDEV_LOCK(wdev);
  497. if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
  498. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
  499. goto out;
  500. if (wdev->sme_state != CFG80211_SME_CONNECTED)
  501. goto out;
  502. /* internal error -- how did we get to CONNECTED w/o BSS? */
  503. if (WARN_ON(!wdev->current_bss)) {
  504. goto out;
  505. }
  506. cfg80211_unhold_bss(wdev->current_bss);
  507. cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
  508. wdev->current_bss = NULL;
  509. cfg80211_hold_bss(bss_from_pub(bss));
  510. wdev->current_bss = bss_from_pub(bss);
  511. nl80211_send_roamed(wiphy_to_dev(wdev->wiphy), wdev->netdev, bss->bssid,
  512. req_ie, req_ie_len, resp_ie, resp_ie_len,
  513. GFP_KERNEL);
  514. #ifdef CONFIG_CFG80211_WEXT
  515. if (req_ie) {
  516. memset(&wrqu, 0, sizeof(wrqu));
  517. wrqu.data.length = req_ie_len;
  518. wireless_send_event(wdev->netdev, IWEVASSOCREQIE,
  519. &wrqu, req_ie);
  520. }
  521. if (resp_ie) {
  522. memset(&wrqu, 0, sizeof(wrqu));
  523. wrqu.data.length = resp_ie_len;
  524. wireless_send_event(wdev->netdev, IWEVASSOCRESPIE,
  525. &wrqu, resp_ie);
  526. }
  527. memset(&wrqu, 0, sizeof(wrqu));
  528. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  529. memcpy(wrqu.ap_addr.sa_data, bss->bssid, ETH_ALEN);
  530. memcpy(wdev->wext.prev_bssid, bss->bssid, ETH_ALEN);
  531. wdev->wext.prev_bssid_valid = true;
  532. wireless_send_event(wdev->netdev, SIOCGIWAP, &wrqu, NULL);
  533. #endif
  534. return;
  535. out:
  536. cfg80211_put_bss(wdev->wiphy, bss);
  537. }
  538. void cfg80211_roamed(struct net_device *dev,
  539. struct ieee80211_channel *channel,
  540. const u8 *bssid,
  541. const u8 *req_ie, size_t req_ie_len,
  542. const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
  543. {
  544. struct wireless_dev *wdev = dev->ieee80211_ptr;
  545. struct cfg80211_bss *bss;
  546. CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED);
  547. bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, wdev->ssid,
  548. wdev->ssid_len, WLAN_CAPABILITY_ESS,
  549. WLAN_CAPABILITY_ESS);
  550. if (WARN_ON(!bss))
  551. return;
  552. cfg80211_roamed_bss(dev, bss, req_ie, req_ie_len, resp_ie,
  553. resp_ie_len, gfp);
  554. }
  555. EXPORT_SYMBOL(cfg80211_roamed);
  556. void cfg80211_roamed_bss(struct net_device *dev,
  557. struct cfg80211_bss *bss, const u8 *req_ie,
  558. size_t req_ie_len, const u8 *resp_ie,
  559. size_t resp_ie_len, gfp_t gfp)
  560. {
  561. struct wireless_dev *wdev = dev->ieee80211_ptr;
  562. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  563. struct cfg80211_event *ev;
  564. unsigned long flags;
  565. CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED);
  566. if (WARN_ON(!bss))
  567. return;
  568. ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp);
  569. if (!ev) {
  570. cfg80211_put_bss(wdev->wiphy, bss);
  571. return;
  572. }
  573. ev->type = EVENT_ROAMED;
  574. ev->rm.req_ie = ((u8 *)ev) + sizeof(*ev);
  575. ev->rm.req_ie_len = req_ie_len;
  576. memcpy((void *)ev->rm.req_ie, req_ie, req_ie_len);
  577. ev->rm.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len;
  578. ev->rm.resp_ie_len = resp_ie_len;
  579. memcpy((void *)ev->rm.resp_ie, resp_ie, resp_ie_len);
  580. ev->rm.bss = bss;
  581. spin_lock_irqsave(&wdev->event_lock, flags);
  582. list_add_tail(&ev->list, &wdev->event_list);
  583. spin_unlock_irqrestore(&wdev->event_lock, flags);
  584. queue_work(cfg80211_wq, &rdev->event_work);
  585. }
  586. EXPORT_SYMBOL(cfg80211_roamed_bss);
  587. void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
  588. size_t ie_len, u16 reason, bool from_ap)
  589. {
  590. struct wireless_dev *wdev = dev->ieee80211_ptr;
  591. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  592. int i;
  593. #ifdef CONFIG_CFG80211_WEXT
  594. union iwreq_data wrqu;
  595. #endif
  596. ASSERT_WDEV_LOCK(wdev);
  597. if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
  598. wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
  599. return;
  600. if (wdev->sme_state != CFG80211_SME_CONNECTED)
  601. return;
  602. if (wdev->current_bss) {
  603. cfg80211_unhold_bss(wdev->current_bss);
  604. cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
  605. }
  606. wdev->current_bss = NULL;
  607. wdev->sme_state = CFG80211_SME_IDLE;
  608. wdev->ssid_len = 0;
  609. if (wdev->conn) {
  610. kfree(wdev->conn->ie);
  611. wdev->conn->ie = NULL;
  612. kfree(wdev->conn);
  613. wdev->conn = NULL;
  614. }
  615. nl80211_send_disconnected(rdev, dev, reason, ie, ie_len, from_ap);
  616. /*
  617. * Delete all the keys ... pairwise keys can't really
  618. * exist any more anyway, but default keys might.
  619. */
  620. if (rdev->ops->del_key)
  621. for (i = 0; i < 6; i++)
  622. rdev_del_key(rdev, dev, i, false, NULL);
  623. #ifdef CONFIG_CFG80211_WEXT
  624. memset(&wrqu, 0, sizeof(wrqu));
  625. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  626. wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
  627. wdev->wext.connect.ssid_len = 0;
  628. #endif
  629. schedule_work(&cfg80211_disconnect_work);
  630. }
  631. void cfg80211_disconnected(struct net_device *dev, u16 reason,
  632. u8 *ie, size_t ie_len, gfp_t gfp)
  633. {
  634. struct wireless_dev *wdev = dev->ieee80211_ptr;
  635. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  636. struct cfg80211_event *ev;
  637. unsigned long flags;
  638. CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED);
  639. ev = kzalloc(sizeof(*ev) + ie_len, gfp);
  640. if (!ev)
  641. return;
  642. ev->type = EVENT_DISCONNECTED;
  643. ev->dc.ie = ((u8 *)ev) + sizeof(*ev);
  644. ev->dc.ie_len = ie_len;
  645. memcpy((void *)ev->dc.ie, ie, ie_len);
  646. ev->dc.reason = reason;
  647. spin_lock_irqsave(&wdev->event_lock, flags);
  648. list_add_tail(&ev->list, &wdev->event_list);
  649. spin_unlock_irqrestore(&wdev->event_lock, flags);
  650. queue_work(cfg80211_wq, &rdev->event_work);
  651. }
  652. EXPORT_SYMBOL(cfg80211_disconnected);
  653. int __cfg80211_connect(struct cfg80211_registered_device *rdev,
  654. struct net_device *dev,
  655. struct cfg80211_connect_params *connect,
  656. struct cfg80211_cached_keys *connkeys,
  657. const u8 *prev_bssid)
  658. {
  659. struct wireless_dev *wdev = dev->ieee80211_ptr;
  660. struct cfg80211_bss *bss = NULL;
  661. int err;
  662. ASSERT_WDEV_LOCK(wdev);
  663. if (wdev->sme_state != CFG80211_SME_IDLE)
  664. return -EALREADY;
  665. if (WARN_ON(wdev->connect_keys)) {
  666. kfree(wdev->connect_keys);
  667. wdev->connect_keys = NULL;
  668. }
  669. cfg80211_oper_and_ht_capa(&connect->ht_capa_mask,
  670. rdev->wiphy.ht_capa_mod_mask);
  671. if (connkeys && connkeys->def >= 0) {
  672. int idx;
  673. u32 cipher;
  674. idx = connkeys->def;
  675. cipher = connkeys->params[idx].cipher;
  676. /* If given a WEP key we may need it for shared key auth */
  677. if (cipher == WLAN_CIPHER_SUITE_WEP40 ||
  678. cipher == WLAN_CIPHER_SUITE_WEP104) {
  679. connect->key_idx = idx;
  680. connect->key = connkeys->params[idx].key;
  681. connect->key_len = connkeys->params[idx].key_len;
  682. /*
  683. * If ciphers are not set (e.g. when going through
  684. * iwconfig), we have to set them appropriately here.
  685. */
  686. if (connect->crypto.cipher_group == 0)
  687. connect->crypto.cipher_group = cipher;
  688. if (connect->crypto.n_ciphers_pairwise == 0) {
  689. connect->crypto.n_ciphers_pairwise = 1;
  690. connect->crypto.ciphers_pairwise[0] = cipher;
  691. }
  692. }
  693. }
  694. if (!rdev->ops->connect) {
  695. if (!rdev->ops->auth || !rdev->ops->assoc)
  696. return -EOPNOTSUPP;
  697. if (WARN_ON(wdev->conn))
  698. return -EINPROGRESS;
  699. wdev->conn = kzalloc(sizeof(*wdev->conn), GFP_KERNEL);
  700. if (!wdev->conn)
  701. return -ENOMEM;
  702. /*
  703. * Copy all parameters, and treat explicitly IEs, BSSID, SSID.
  704. */
  705. memcpy(&wdev->conn->params, connect, sizeof(*connect));
  706. if (connect->bssid) {
  707. wdev->conn->params.bssid = wdev->conn->bssid;
  708. memcpy(wdev->conn->bssid, connect->bssid, ETH_ALEN);
  709. }
  710. if (connect->ie) {
  711. wdev->conn->ie = kmemdup(connect->ie, connect->ie_len,
  712. GFP_KERNEL);
  713. wdev->conn->params.ie = wdev->conn->ie;
  714. if (!wdev->conn->ie) {
  715. kfree(wdev->conn);
  716. wdev->conn = NULL;
  717. return -ENOMEM;
  718. }
  719. }
  720. if (connect->auth_type == NL80211_AUTHTYPE_AUTOMATIC) {
  721. wdev->conn->auto_auth = true;
  722. /* start with open system ... should mostly work */
  723. wdev->conn->params.auth_type =
  724. NL80211_AUTHTYPE_OPEN_SYSTEM;
  725. } else {
  726. wdev->conn->auto_auth = false;
  727. }
  728. memcpy(wdev->ssid, connect->ssid, connect->ssid_len);
  729. wdev->ssid_len = connect->ssid_len;
  730. wdev->conn->params.ssid = wdev->ssid;
  731. wdev->conn->params.ssid_len = connect->ssid_len;
  732. /* see if we have the bss already */
  733. bss = cfg80211_get_conn_bss(wdev);
  734. wdev->sme_state = CFG80211_SME_CONNECTING;
  735. wdev->connect_keys = connkeys;
  736. if (prev_bssid) {
  737. memcpy(wdev->conn->prev_bssid, prev_bssid, ETH_ALEN);
  738. wdev->conn->prev_bssid_valid = true;
  739. }
  740. /* we're good if we have a matching bss struct */
  741. if (bss) {
  742. wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
  743. err = cfg80211_conn_do_work(wdev);
  744. cfg80211_put_bss(wdev->wiphy, bss);
  745. } else {
  746. /* otherwise we'll need to scan for the AP first */
  747. err = cfg80211_conn_scan(wdev);
  748. /*
  749. * If we can't scan right now, then we need to scan again
  750. * after the current scan finished, since the parameters
  751. * changed (unless we find a good AP anyway).
  752. */
  753. if (err == -EBUSY) {
  754. err = 0;
  755. wdev->conn->state = CFG80211_CONN_SCAN_AGAIN;
  756. }
  757. }
  758. if (err) {
  759. kfree(wdev->conn->ie);
  760. kfree(wdev->conn);
  761. wdev->conn = NULL;
  762. wdev->sme_state = CFG80211_SME_IDLE;
  763. wdev->connect_keys = NULL;
  764. wdev->ssid_len = 0;
  765. }
  766. return err;
  767. } else {
  768. wdev->sme_state = CFG80211_SME_CONNECTING;
  769. wdev->connect_keys = connkeys;
  770. err = rdev_connect(rdev, dev, connect);
  771. if (err) {
  772. wdev->connect_keys = NULL;
  773. wdev->sme_state = CFG80211_SME_IDLE;
  774. return err;
  775. }
  776. memcpy(wdev->ssid, connect->ssid, connect->ssid_len);
  777. wdev->ssid_len = connect->ssid_len;
  778. return 0;
  779. }
  780. }
  781. int cfg80211_connect(struct cfg80211_registered_device *rdev,
  782. struct net_device *dev,
  783. struct cfg80211_connect_params *connect,
  784. struct cfg80211_cached_keys *connkeys)
  785. {
  786. int err;
  787. mutex_lock(&rdev->devlist_mtx);
  788. wdev_lock(dev->ieee80211_ptr);
  789. err = __cfg80211_connect(rdev, dev, connect, connkeys, NULL);
  790. wdev_unlock(dev->ieee80211_ptr);
  791. mutex_unlock(&rdev->devlist_mtx);
  792. return err;
  793. }
  794. int __cfg80211_disconnect(struct cfg80211_registered_device *rdev,
  795. struct net_device *dev, u16 reason, bool wextev)
  796. {
  797. struct wireless_dev *wdev = dev->ieee80211_ptr;
  798. int err;
  799. ASSERT_WDEV_LOCK(wdev);
  800. if (wdev->sme_state == CFG80211_SME_IDLE)
  801. return -EINVAL;
  802. kfree(wdev->connect_keys);
  803. wdev->connect_keys = NULL;
  804. if (!rdev->ops->disconnect) {
  805. if (!rdev->ops->deauth)
  806. return -EOPNOTSUPP;
  807. /* was it connected by userspace SME? */
  808. if (!wdev->conn) {
  809. cfg80211_mlme_down(rdev, dev);
  810. return 0;
  811. }
  812. if (wdev->sme_state == CFG80211_SME_CONNECTING &&
  813. (wdev->conn->state == CFG80211_CONN_SCANNING ||
  814. wdev->conn->state == CFG80211_CONN_SCAN_AGAIN)) {
  815. wdev->sme_state = CFG80211_SME_IDLE;
  816. kfree(wdev->conn->ie);
  817. kfree(wdev->conn);
  818. wdev->conn = NULL;
  819. wdev->ssid_len = 0;
  820. return 0;
  821. }
  822. /* wdev->conn->params.bssid must be set if > SCANNING */
  823. err = __cfg80211_mlme_deauth(rdev, dev,
  824. wdev->conn->params.bssid,
  825. NULL, 0, reason, false);
  826. if (err)
  827. return err;
  828. } else {
  829. err = rdev_disconnect(rdev, dev, reason);
  830. if (err)
  831. return err;
  832. }
  833. if (wdev->sme_state == CFG80211_SME_CONNECTED)
  834. __cfg80211_disconnected(dev, NULL, 0, 0, false);
  835. else if (wdev->sme_state == CFG80211_SME_CONNECTING)
  836. __cfg80211_connect_result(dev, NULL, NULL, 0, NULL, 0,
  837. WLAN_STATUS_UNSPECIFIED_FAILURE,
  838. wextev, NULL);
  839. return 0;
  840. }
  841. int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
  842. struct net_device *dev,
  843. u16 reason, bool wextev)
  844. {
  845. int err;
  846. wdev_lock(dev->ieee80211_ptr);
  847. err = __cfg80211_disconnect(rdev, dev, reason, wextev);
  848. wdev_unlock(dev->ieee80211_ptr);
  849. return err;
  850. }
  851. void cfg80211_sme_disassoc(struct net_device *dev,
  852. struct cfg80211_internal_bss *bss)
  853. {
  854. struct wireless_dev *wdev = dev->ieee80211_ptr;
  855. struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  856. u8 bssid[ETH_ALEN];
  857. ASSERT_WDEV_LOCK(wdev);
  858. if (!wdev->conn)
  859. return;
  860. if (wdev->conn->state == CFG80211_CONN_IDLE)
  861. return;
  862. /*
  863. * Ok, so the association was made by this SME -- we don't
  864. * want it any more so deauthenticate too.
  865. */
  866. memcpy(bssid, bss->pub.bssid, ETH_ALEN);
  867. __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
  868. WLAN_REASON_DEAUTH_LEAVING, false);
  869. }