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