Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[firefly-linux-kernel-4.4.55.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
89         if (rdev->scan_req)
90                 return -EBUSY;
91
92         if (wdev->conn->params.channel) {
93                 n_channels = 1;
94         } else {
95                 enum ieee80211_band band;
96                 n_channels = 0;
97
98                 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
99                         if (!wdev->wiphy->bands[band])
100                                 continue;
101                         n_channels += wdev->wiphy->bands[band]->n_channels;
102                 }
103         }
104         request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) +
105                           sizeof(request->channels[0]) * n_channels,
106                           GFP_KERNEL);
107         if (!request)
108                 return -ENOMEM;
109
110         if (wdev->conn->params.channel)
111                 request->channels[0] = wdev->conn->params.channel;
112         else {
113                 int i = 0, j;
114                 enum ieee80211_band band;
115                 struct ieee80211_supported_band *bands;
116                 struct ieee80211_channel *channel;
117
118                 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
119                         bands = wdev->wiphy->bands[band];
120                         if (!bands)
121                                 continue;
122                         for (j = 0; j < bands->n_channels; j++) {
123                                 channel = &bands->channels[j];
124                                 if (channel->flags & IEEE80211_CHAN_DISABLED)
125                                         continue;
126                                 request->channels[i++] = channel;
127                         }
128                         request->rates[band] = (1 << bands->n_bitrates) - 1;
129                 }
130                 n_channels = i;
131         }
132         request->n_channels = n_channels;
133         request->ssids = (void *)&request->channels[n_channels];
134         request->n_ssids = 1;
135
136         memcpy(request->ssids[0].ssid, wdev->conn->params.ssid,
137                 wdev->conn->params.ssid_len);
138         request->ssids[0].ssid_len = wdev->conn->params.ssid_len;
139
140         request->wdev = wdev;
141         request->wiphy = &rdev->wiphy;
142         request->scan_start = jiffies;
143
144         rdev->scan_req = request;
145
146         err = rdev_scan(rdev, request);
147         if (!err) {
148                 wdev->conn->state = CFG80211_CONN_SCANNING;
149                 nl80211_send_scan_start(rdev, wdev);
150                 dev_hold(wdev->netdev);
151         } else {
152                 rdev->scan_req = NULL;
153                 kfree(request);
154         }
155         return err;
156 }
157
158 static int cfg80211_conn_do_work(struct wireless_dev *wdev)
159 {
160         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
161         struct cfg80211_connect_params *params;
162         const u8 *prev_bssid = NULL;
163         int err;
164
165         ASSERT_WDEV_LOCK(wdev);
166
167         if (!wdev->conn)
168                 return 0;
169
170         params = &wdev->conn->params;
171
172         switch (wdev->conn->state) {
173         case CFG80211_CONN_SCAN_AGAIN:
174                 return cfg80211_conn_scan(wdev);
175         case CFG80211_CONN_AUTHENTICATE_NEXT:
176                 BUG_ON(!rdev->ops->auth);
177                 wdev->conn->state = CFG80211_CONN_AUTHENTICATING;
178                 return __cfg80211_mlme_auth(rdev, wdev->netdev,
179                                             params->channel, params->auth_type,
180                                             params->bssid,
181                                             params->ssid, params->ssid_len,
182                                             NULL, 0,
183                                             params->key, params->key_len,
184                                             params->key_idx, NULL, 0);
185         case CFG80211_CONN_ASSOCIATE_NEXT:
186                 BUG_ON(!rdev->ops->assoc);
187                 wdev->conn->state = CFG80211_CONN_ASSOCIATING;
188                 if (wdev->conn->prev_bssid_valid)
189                         prev_bssid = wdev->conn->prev_bssid;
190                 err = __cfg80211_mlme_assoc(rdev, wdev->netdev,
191                                             params->channel, params->bssid,
192                                             prev_bssid,
193                                             params->ssid, params->ssid_len,
194                                             params->ie, params->ie_len,
195                                             false, &params->crypto,
196                                             params->flags, &params->ht_capa,
197                                             &params->ht_capa_mask);
198                 if (err)
199                         __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
200                                                NULL, 0,
201                                                WLAN_REASON_DEAUTH_LEAVING,
202                                                false);
203                 return err;
204         case CFG80211_CONN_DEAUTH_ASSOC_FAIL:
205                 __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
206                                        NULL, 0,
207                                        WLAN_REASON_DEAUTH_LEAVING, false);
208                 /* return an error so that we call __cfg80211_connect_result() */
209                 return -EINVAL;
210         default:
211                 return 0;
212         }
213 }
214
215 void cfg80211_conn_work(struct work_struct *work)
216 {
217         struct cfg80211_registered_device *rdev =
218                 container_of(work, struct cfg80211_registered_device, conn_work);
219         struct wireless_dev *wdev;
220         u8 bssid_buf[ETH_ALEN], *bssid = NULL;
221
222         rtnl_lock();
223         cfg80211_lock_rdev(rdev);
224         mutex_lock(&rdev->devlist_mtx);
225
226         list_for_each_entry(wdev, &rdev->wdev_list, list) {
227                 wdev_lock(wdev);
228                 if (!netif_running(wdev->netdev)) {
229                         wdev_unlock(wdev);
230                         continue;
231                 }
232                 if (wdev->sme_state != CFG80211_SME_CONNECTING) {
233                         wdev_unlock(wdev);
234                         continue;
235                 }
236                 if (wdev->conn->params.bssid) {
237                         memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
238                         bssid = bssid_buf;
239                 }
240                 if (cfg80211_conn_do_work(wdev))
241                         __cfg80211_connect_result(
242                                         wdev->netdev, bssid,
243                                         NULL, 0, NULL, 0,
244                                         WLAN_STATUS_UNSPECIFIED_FAILURE,
245                                         false, NULL);
246                 wdev_unlock(wdev);
247         }
248
249         mutex_unlock(&rdev->devlist_mtx);
250         cfg80211_unlock_rdev(rdev);
251         rtnl_unlock();
252 }
253
254 static struct cfg80211_bss *cfg80211_get_conn_bss(struct wireless_dev *wdev)
255 {
256         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
257         struct cfg80211_bss *bss;
258         u16 capa = WLAN_CAPABILITY_ESS;
259
260         ASSERT_WDEV_LOCK(wdev);
261
262         if (wdev->conn->params.privacy)
263                 capa |= WLAN_CAPABILITY_PRIVACY;
264
265         bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel,
266                                wdev->conn->params.bssid,
267                                wdev->conn->params.ssid,
268                                wdev->conn->params.ssid_len,
269                                WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_PRIVACY,
270                                capa);
271         if (!bss)
272                 return NULL;
273
274         memcpy(wdev->conn->bssid, bss->bssid, ETH_ALEN);
275         wdev->conn->params.bssid = wdev->conn->bssid;
276         wdev->conn->params.channel = bss->channel;
277         wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
278         schedule_work(&rdev->conn_work);
279
280         return bss;
281 }
282
283 static void __cfg80211_sme_scan_done(struct net_device *dev)
284 {
285         struct wireless_dev *wdev = dev->ieee80211_ptr;
286         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
287         struct cfg80211_bss *bss;
288
289         ASSERT_WDEV_LOCK(wdev);
290
291         if (wdev->sme_state != CFG80211_SME_CONNECTING)
292                 return;
293
294         if (!wdev->conn)
295                 return;
296
297         if (wdev->conn->state != CFG80211_CONN_SCANNING &&
298             wdev->conn->state != CFG80211_CONN_SCAN_AGAIN)
299                 return;
300
301         bss = cfg80211_get_conn_bss(wdev);
302         if (bss) {
303                 cfg80211_put_bss(bss);
304         } else {
305                 /* not found */
306                 if (wdev->conn->state == CFG80211_CONN_SCAN_AGAIN)
307                         schedule_work(&rdev->conn_work);
308                 else
309                         __cfg80211_connect_result(
310                                         wdev->netdev,
311                                         wdev->conn->params.bssid,
312                                         NULL, 0, NULL, 0,
313                                         WLAN_STATUS_UNSPECIFIED_FAILURE,
314                                         false, NULL);
315         }
316 }
317
318 void cfg80211_sme_scan_done(struct net_device *dev)
319 {
320         struct wireless_dev *wdev = dev->ieee80211_ptr;
321
322         mutex_lock(&wiphy_to_dev(wdev->wiphy)->devlist_mtx);
323         wdev_lock(wdev);
324         __cfg80211_sme_scan_done(dev);
325         wdev_unlock(wdev);
326         mutex_unlock(&wiphy_to_dev(wdev->wiphy)->devlist_mtx);
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->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(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,
523                             bss->channel->band,
524                             country_ie + 2,
525                             country_ie[1]);
526         kfree(country_ie);
527 }
528
529 void cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
530                              const u8 *req_ie, size_t req_ie_len,
531                              const u8 *resp_ie, size_t resp_ie_len,
532                              u16 status, gfp_t gfp)
533 {
534         struct wireless_dev *wdev = dev->ieee80211_ptr;
535         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
536         struct cfg80211_event *ev;
537         unsigned long flags;
538
539         CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTING);
540
541         ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp);
542         if (!ev)
543                 return;
544
545         ev->type = EVENT_CONNECT_RESULT;
546         if (bssid)
547                 memcpy(ev->cr.bssid, bssid, ETH_ALEN);
548         if (req_ie_len) {
549                 ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev);
550                 ev->cr.req_ie_len = req_ie_len;
551                 memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len);
552         }
553         if (resp_ie_len) {
554                 ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len;
555                 ev->cr.resp_ie_len = resp_ie_len;
556                 memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len);
557         }
558         ev->cr.status = status;
559
560         spin_lock_irqsave(&wdev->event_lock, flags);
561         list_add_tail(&ev->list, &wdev->event_list);
562         spin_unlock_irqrestore(&wdev->event_lock, flags);
563         queue_work(cfg80211_wq, &rdev->event_work);
564 }
565 EXPORT_SYMBOL(cfg80211_connect_result);
566
567 void __cfg80211_roamed(struct wireless_dev *wdev,
568                        struct cfg80211_bss *bss,
569                        const u8 *req_ie, size_t req_ie_len,
570                        const u8 *resp_ie, size_t resp_ie_len)
571 {
572 #ifdef CONFIG_CFG80211_WEXT
573         union iwreq_data wrqu;
574 #endif
575         ASSERT_WDEV_LOCK(wdev);
576
577         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
578                     wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
579                 goto out;
580
581         if (wdev->sme_state != CFG80211_SME_CONNECTED)
582                 goto out;
583
584         /* internal error -- how did we get to CONNECTED w/o BSS? */
585         if (WARN_ON(!wdev->current_bss)) {
586                 goto out;
587         }
588
589         cfg80211_unhold_bss(wdev->current_bss);
590         cfg80211_put_bss(&wdev->current_bss->pub);
591         wdev->current_bss = NULL;
592
593         cfg80211_hold_bss(bss_from_pub(bss));
594         wdev->current_bss = bss_from_pub(bss);
595
596         nl80211_send_roamed(wiphy_to_dev(wdev->wiphy), wdev->netdev, bss->bssid,
597                             req_ie, req_ie_len, resp_ie, resp_ie_len,
598                             GFP_KERNEL);
599
600 #ifdef CONFIG_CFG80211_WEXT
601         if (req_ie) {
602                 memset(&wrqu, 0, sizeof(wrqu));
603                 wrqu.data.length = req_ie_len;
604                 wireless_send_event(wdev->netdev, IWEVASSOCREQIE,
605                                     &wrqu, req_ie);
606         }
607
608         if (resp_ie) {
609                 memset(&wrqu, 0, sizeof(wrqu));
610                 wrqu.data.length = resp_ie_len;
611                 wireless_send_event(wdev->netdev, IWEVASSOCRESPIE,
612                                     &wrqu, resp_ie);
613         }
614
615         memset(&wrqu, 0, sizeof(wrqu));
616         wrqu.ap_addr.sa_family = ARPHRD_ETHER;
617         memcpy(wrqu.ap_addr.sa_data, bss->bssid, ETH_ALEN);
618         memcpy(wdev->wext.prev_bssid, bss->bssid, ETH_ALEN);
619         wdev->wext.prev_bssid_valid = true;
620         wireless_send_event(wdev->netdev, SIOCGIWAP, &wrqu, NULL);
621 #endif
622
623         return;
624 out:
625         cfg80211_put_bss(bss);
626 }
627
628 void cfg80211_roamed(struct net_device *dev,
629                      struct ieee80211_channel *channel,
630                      const u8 *bssid,
631                      const u8 *req_ie, size_t req_ie_len,
632                      const u8 *resp_ie, size_t resp_ie_len, gfp_t gfp)
633 {
634         struct wireless_dev *wdev = dev->ieee80211_ptr;
635         struct cfg80211_bss *bss;
636
637         CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED);
638
639         bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, wdev->ssid,
640                                wdev->ssid_len, WLAN_CAPABILITY_ESS,
641                                WLAN_CAPABILITY_ESS);
642         if (WARN_ON(!bss))
643                 return;
644
645         cfg80211_roamed_bss(dev, bss, req_ie, req_ie_len, resp_ie,
646                             resp_ie_len, gfp);
647 }
648 EXPORT_SYMBOL(cfg80211_roamed);
649
650 void cfg80211_roamed_bss(struct net_device *dev,
651                          struct cfg80211_bss *bss, const u8 *req_ie,
652                          size_t req_ie_len, const u8 *resp_ie,
653                          size_t resp_ie_len, gfp_t gfp)
654 {
655         struct wireless_dev *wdev = dev->ieee80211_ptr;
656         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
657         struct cfg80211_event *ev;
658         unsigned long flags;
659
660         CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED);
661
662         if (WARN_ON(!bss))
663                 return;
664
665         ev = kzalloc(sizeof(*ev) + req_ie_len + resp_ie_len, gfp);
666         if (!ev) {
667                 cfg80211_put_bss(bss);
668                 return;
669         }
670
671         ev->type = EVENT_ROAMED;
672         ev->rm.req_ie = ((u8 *)ev) + sizeof(*ev);
673         ev->rm.req_ie_len = req_ie_len;
674         memcpy((void *)ev->rm.req_ie, req_ie, req_ie_len);
675         ev->rm.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len;
676         ev->rm.resp_ie_len = resp_ie_len;
677         memcpy((void *)ev->rm.resp_ie, resp_ie, resp_ie_len);
678         ev->rm.bss = bss;
679
680         spin_lock_irqsave(&wdev->event_lock, flags);
681         list_add_tail(&ev->list, &wdev->event_list);
682         spin_unlock_irqrestore(&wdev->event_lock, flags);
683         queue_work(cfg80211_wq, &rdev->event_work);
684 }
685 EXPORT_SYMBOL(cfg80211_roamed_bss);
686
687 void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
688                              size_t ie_len, u16 reason, bool from_ap)
689 {
690         struct wireless_dev *wdev = dev->ieee80211_ptr;
691         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
692         int i;
693 #ifdef CONFIG_CFG80211_WEXT
694         union iwreq_data wrqu;
695 #endif
696
697         ASSERT_WDEV_LOCK(wdev);
698
699         if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
700                     wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
701                 return;
702
703         if (wdev->sme_state != CFG80211_SME_CONNECTED)
704                 return;
705
706         if (wdev->current_bss) {
707                 cfg80211_unhold_bss(wdev->current_bss);
708                 cfg80211_put_bss(&wdev->current_bss->pub);
709         }
710
711         wdev->current_bss = NULL;
712         wdev->sme_state = CFG80211_SME_IDLE;
713         wdev->ssid_len = 0;
714
715         if (wdev->conn) {
716                 kfree(wdev->conn->ie);
717                 wdev->conn->ie = NULL;
718                 kfree(wdev->conn);
719                 wdev->conn = NULL;
720         }
721
722         nl80211_send_disconnected(rdev, dev, reason, ie, ie_len, from_ap);
723
724         /*
725          * Delete all the keys ... pairwise keys can't really
726          * exist any more anyway, but default keys might.
727          */
728         if (rdev->ops->del_key)
729                 for (i = 0; i < 6; i++)
730                         rdev_del_key(rdev, dev, i, false, NULL);
731
732 #ifdef CONFIG_CFG80211_WEXT
733         memset(&wrqu, 0, sizeof(wrqu));
734         wrqu.ap_addr.sa_family = ARPHRD_ETHER;
735         wireless_send_event(dev, SIOCGIWAP, &wrqu, NULL);
736         wdev->wext.connect.ssid_len = 0;
737 #endif
738
739         schedule_work(&cfg80211_disconnect_work);
740 }
741
742 void cfg80211_disconnected(struct net_device *dev, u16 reason,
743                            u8 *ie, size_t ie_len, gfp_t gfp)
744 {
745         struct wireless_dev *wdev = dev->ieee80211_ptr;
746         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
747         struct cfg80211_event *ev;
748         unsigned long flags;
749
750         CFG80211_DEV_WARN_ON(wdev->sme_state != CFG80211_SME_CONNECTED);
751
752         ev = kzalloc(sizeof(*ev) + ie_len, gfp);
753         if (!ev)
754                 return;
755
756         ev->type = EVENT_DISCONNECTED;
757         ev->dc.ie = ((u8 *)ev) + sizeof(*ev);
758         ev->dc.ie_len = ie_len;
759         memcpy((void *)ev->dc.ie, ie, ie_len);
760         ev->dc.reason = reason;
761
762         spin_lock_irqsave(&wdev->event_lock, flags);
763         list_add_tail(&ev->list, &wdev->event_list);
764         spin_unlock_irqrestore(&wdev->event_lock, flags);
765         queue_work(cfg80211_wq, &rdev->event_work);
766 }
767 EXPORT_SYMBOL(cfg80211_disconnected);
768
769 int __cfg80211_connect(struct cfg80211_registered_device *rdev,
770                        struct net_device *dev,
771                        struct cfg80211_connect_params *connect,
772                        struct cfg80211_cached_keys *connkeys,
773                        const u8 *prev_bssid)
774 {
775         struct wireless_dev *wdev = dev->ieee80211_ptr;
776         struct cfg80211_bss *bss = NULL;
777         int err;
778
779         ASSERT_WDEV_LOCK(wdev);
780
781         if (wdev->sme_state != CFG80211_SME_IDLE)
782                 return -EALREADY;
783
784         if (WARN_ON(wdev->connect_keys)) {
785                 kfree(wdev->connect_keys);
786                 wdev->connect_keys = NULL;
787         }
788
789         cfg80211_oper_and_ht_capa(&connect->ht_capa_mask,
790                                   rdev->wiphy.ht_capa_mod_mask);
791
792         if (connkeys && connkeys->def >= 0) {
793                 int idx;
794                 u32 cipher;
795
796                 idx = connkeys->def;
797                 cipher = connkeys->params[idx].cipher;
798                 /* If given a WEP key we may need it for shared key auth */
799                 if (cipher == WLAN_CIPHER_SUITE_WEP40 ||
800                     cipher == WLAN_CIPHER_SUITE_WEP104) {
801                         connect->key_idx = idx;
802                         connect->key = connkeys->params[idx].key;
803                         connect->key_len = connkeys->params[idx].key_len;
804
805                         /*
806                          * If ciphers are not set (e.g. when going through
807                          * iwconfig), we have to set them appropriately here.
808                          */
809                         if (connect->crypto.cipher_group == 0)
810                                 connect->crypto.cipher_group = cipher;
811
812                         if (connect->crypto.n_ciphers_pairwise == 0) {
813                                 connect->crypto.n_ciphers_pairwise = 1;
814                                 connect->crypto.ciphers_pairwise[0] = cipher;
815                         }
816                 }
817         }
818
819         if (!rdev->ops->connect) {
820                 if (!rdev->ops->auth || !rdev->ops->assoc)
821                         return -EOPNOTSUPP;
822
823                 if (WARN_ON(wdev->conn))
824                         return -EINPROGRESS;
825
826                 wdev->conn = kzalloc(sizeof(*wdev->conn), GFP_KERNEL);
827                 if (!wdev->conn)
828                         return -ENOMEM;
829
830                 /*
831                  * Copy all parameters, and treat explicitly IEs, BSSID, SSID.
832                  */
833                 memcpy(&wdev->conn->params, connect, sizeof(*connect));
834                 if (connect->bssid) {
835                         wdev->conn->params.bssid = wdev->conn->bssid;
836                         memcpy(wdev->conn->bssid, connect->bssid, ETH_ALEN);
837                 }
838
839                 if (connect->ie) {
840                         wdev->conn->ie = kmemdup(connect->ie, connect->ie_len,
841                                                 GFP_KERNEL);
842                         wdev->conn->params.ie = wdev->conn->ie;
843                         if (!wdev->conn->ie) {
844                                 kfree(wdev->conn);
845                                 wdev->conn = NULL;
846                                 return -ENOMEM;
847                         }
848                 }
849
850                 if (connect->auth_type == NL80211_AUTHTYPE_AUTOMATIC) {
851                         wdev->conn->auto_auth = true;
852                         /* start with open system ... should mostly work */
853                         wdev->conn->params.auth_type =
854                                 NL80211_AUTHTYPE_OPEN_SYSTEM;
855                 } else {
856                         wdev->conn->auto_auth = false;
857                 }
858
859                 memcpy(wdev->ssid, connect->ssid, connect->ssid_len);
860                 wdev->ssid_len = connect->ssid_len;
861                 wdev->conn->params.ssid = wdev->ssid;
862                 wdev->conn->params.ssid_len = connect->ssid_len;
863
864                 /* see if we have the bss already */
865                 bss = cfg80211_get_conn_bss(wdev);
866
867                 wdev->sme_state = CFG80211_SME_CONNECTING;
868                 wdev->connect_keys = connkeys;
869
870                 if (prev_bssid) {
871                         memcpy(wdev->conn->prev_bssid, prev_bssid, ETH_ALEN);
872                         wdev->conn->prev_bssid_valid = true;
873                 }
874
875                 /* we're good if we have a matching bss struct */
876                 if (bss) {
877                         wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
878                         err = cfg80211_conn_do_work(wdev);
879                         cfg80211_put_bss(bss);
880                 } else {
881                         /* otherwise we'll need to scan for the AP first */
882                         err = cfg80211_conn_scan(wdev);
883                         /*
884                          * If we can't scan right now, then we need to scan again
885                          * after the current scan finished, since the parameters
886                          * changed (unless we find a good AP anyway).
887                          */
888                         if (err == -EBUSY) {
889                                 err = 0;
890                                 wdev->conn->state = CFG80211_CONN_SCAN_AGAIN;
891                         }
892                 }
893                 if (err) {
894                         kfree(wdev->conn->ie);
895                         kfree(wdev->conn);
896                         wdev->conn = NULL;
897                         wdev->sme_state = CFG80211_SME_IDLE;
898                         wdev->connect_keys = NULL;
899                         wdev->ssid_len = 0;
900                 }
901
902                 return err;
903         } else {
904                 wdev->sme_state = CFG80211_SME_CONNECTING;
905                 wdev->connect_keys = connkeys;
906                 err = rdev_connect(rdev, dev, connect);
907                 if (err) {
908                         wdev->connect_keys = NULL;
909                         wdev->sme_state = CFG80211_SME_IDLE;
910                         return err;
911                 }
912
913                 memcpy(wdev->ssid, connect->ssid, connect->ssid_len);
914                 wdev->ssid_len = connect->ssid_len;
915
916                 return 0;
917         }
918 }
919
920 int cfg80211_connect(struct cfg80211_registered_device *rdev,
921                      struct net_device *dev,
922                      struct cfg80211_connect_params *connect,
923                      struct cfg80211_cached_keys *connkeys)
924 {
925         int err;
926
927         mutex_lock(&rdev->devlist_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->devlist_mtx);
932
933         return err;
934 }
935
936 int __cfg80211_disconnect(struct cfg80211_registered_device *rdev,
937                           struct net_device *dev, u16 reason, bool wextev)
938 {
939         struct wireless_dev *wdev = dev->ieee80211_ptr;
940         int err;
941
942         ASSERT_WDEV_LOCK(wdev);
943
944         if (wdev->sme_state == CFG80211_SME_IDLE)
945                 return -EINVAL;
946
947         kfree(wdev->connect_keys);
948         wdev->connect_keys = NULL;
949
950         if (!rdev->ops->disconnect) {
951                 if (!rdev->ops->deauth)
952                         return -EOPNOTSUPP;
953
954                 /* was it connected by userspace SME? */
955                 if (!wdev->conn) {
956                         cfg80211_mlme_down(rdev, dev);
957                         return 0;
958                 }
959
960                 if (wdev->sme_state == CFG80211_SME_CONNECTING &&
961                     (wdev->conn->state == CFG80211_CONN_SCANNING ||
962                      wdev->conn->state == CFG80211_CONN_SCAN_AGAIN)) {
963                         wdev->sme_state = CFG80211_SME_IDLE;
964                         kfree(wdev->conn->ie);
965                         kfree(wdev->conn);
966                         wdev->conn = NULL;
967                         wdev->ssid_len = 0;
968                         return 0;
969                 }
970
971                 /* wdev->conn->params.bssid must be set if > SCANNING */
972                 err = __cfg80211_mlme_deauth(rdev, dev,
973                                              wdev->conn->params.bssid,
974                                              NULL, 0, reason, false);
975                 if (err)
976                         return err;
977         } else {
978                 err = rdev_disconnect(rdev, dev, reason);
979                 if (err)
980                         return err;
981         }
982
983         if (wdev->sme_state == CFG80211_SME_CONNECTED)
984                 __cfg80211_disconnected(dev, NULL, 0, 0, false);
985         else if (wdev->sme_state == CFG80211_SME_CONNECTING)
986                 __cfg80211_connect_result(dev, NULL, NULL, 0, NULL, 0,
987                                           WLAN_STATUS_UNSPECIFIED_FAILURE,
988                                           wextev, NULL);
989
990         return 0;
991 }
992
993 int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
994                         struct net_device *dev,
995                         u16 reason, bool wextev)
996 {
997         int err;
998
999         wdev_lock(dev->ieee80211_ptr);
1000         err = __cfg80211_disconnect(rdev, dev, reason, wextev);
1001         wdev_unlock(dev->ieee80211_ptr);
1002
1003         return err;
1004 }
1005
1006 void cfg80211_sme_disassoc(struct net_device *dev,
1007                            struct cfg80211_internal_bss *bss)
1008 {
1009         struct wireless_dev *wdev = dev->ieee80211_ptr;
1010         struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
1011         u8 bssid[ETH_ALEN];
1012
1013         ASSERT_WDEV_LOCK(wdev);
1014
1015         if (!wdev->conn)
1016                 return;
1017
1018         if (wdev->conn->state == CFG80211_CONN_IDLE)
1019                 return;
1020
1021         /*
1022          * Ok, so the association was made by this SME -- we don't
1023          * want it any more so deauthenticate too.
1024          */
1025
1026         memcpy(bssid, bss->pub.bssid, ETH_ALEN);
1027
1028         __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0,
1029                                WLAN_REASON_DEAUTH_LEAVING, false);
1030 }