sme.c 26 KB

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