diff options
Diffstat (limited to 'net/wireless/sme.c')
| -rw-r--r-- | net/wireless/sme.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index f4dfd5f5f2ea..72222f0074db 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
| @@ -171,7 +171,7 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
| 171 | params->ssid, params->ssid_len, | 171 | params->ssid, params->ssid_len, |
| 172 | NULL, 0, | 172 | NULL, 0, |
| 173 | params->key, params->key_len, | 173 | params->key, params->key_len, |
| 174 | params->key_idx); | 174 | params->key_idx, false); |
| 175 | case CFG80211_CONN_ASSOCIATE_NEXT: | 175 | case CFG80211_CONN_ASSOCIATE_NEXT: |
| 176 | BUG_ON(!rdev->ops->assoc); | 176 | BUG_ON(!rdev->ops->assoc); |
| 177 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; | 177 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; |
| @@ -186,12 +186,13 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
| 186 | if (err) | 186 | if (err) |
| 187 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 187 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
| 188 | NULL, 0, | 188 | NULL, 0, |
| 189 | WLAN_REASON_DEAUTH_LEAVING); | 189 | WLAN_REASON_DEAUTH_LEAVING, |
| 190 | false); | ||
| 190 | return err; | 191 | return err; |
| 191 | case CFG80211_CONN_DEAUTH_ASSOC_FAIL: | 192 | case CFG80211_CONN_DEAUTH_ASSOC_FAIL: |
| 192 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 193 | __cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
| 193 | NULL, 0, | 194 | NULL, 0, |
| 194 | WLAN_REASON_DEAUTH_LEAVING); | 195 | WLAN_REASON_DEAUTH_LEAVING, false); |
| 195 | /* return an error so that we call __cfg80211_connect_result() */ | 196 | /* return an error so that we call __cfg80211_connect_result() */ |
| 196 | return -EINVAL; | 197 | return -EINVAL; |
| 197 | default: | 198 | default: |
| @@ -517,12 +518,16 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, | |||
| 517 | ev->type = EVENT_CONNECT_RESULT; | 518 | ev->type = EVENT_CONNECT_RESULT; |
| 518 | if (bssid) | 519 | if (bssid) |
| 519 | memcpy(ev->cr.bssid, bssid, ETH_ALEN); | 520 | memcpy(ev->cr.bssid, bssid, ETH_ALEN); |
| 520 | ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); | 521 | if (req_ie_len) { |
| 521 | ev->cr.req_ie_len = req_ie_len; | 522 | ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); |
| 522 | memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); | 523 | ev->cr.req_ie_len = req_ie_len; |
| 523 | ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; | 524 | memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); |
| 524 | ev->cr.resp_ie_len = resp_ie_len; | 525 | } |
| 525 | memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); | 526 | if (resp_ie_len) { |
| 527 | ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; | ||
| 528 | ev->cr.resp_ie_len = resp_ie_len; | ||
| 529 | memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); | ||
| 530 | } | ||
| 526 | ev->cr.status = status; | 531 | ev->cr.status = status; |
| 527 | 532 | ||
| 528 | spin_lock_irqsave(&wdev->event_lock, flags); | 533 | spin_lock_irqsave(&wdev->event_lock, flags); |
| @@ -676,7 +681,8 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie, | |||
| 676 | continue; | 681 | continue; |
| 677 | bssid = wdev->auth_bsses[i]->pub.bssid; | 682 | bssid = wdev->auth_bsses[i]->pub.bssid; |
| 678 | ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, | 683 | ret = __cfg80211_mlme_deauth(rdev, dev, bssid, NULL, 0, |
| 679 | WLAN_REASON_DEAUTH_LEAVING); | 684 | WLAN_REASON_DEAUTH_LEAVING, |
| 685 | false); | ||
| 680 | WARN(ret, "deauth failed: %d\n", ret); | 686 | WARN(ret, "deauth failed: %d\n", ret); |
| 681 | } | 687 | } |
| 682 | } | 688 | } |
| @@ -735,7 +741,6 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev, | |||
| 735 | const u8 *prev_bssid) | 741 | const u8 *prev_bssid) |
| 736 | { | 742 | { |
| 737 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 743 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
| 738 | struct ieee80211_channel *chan; | ||
| 739 | struct cfg80211_bss *bss = NULL; | 744 | struct cfg80211_bss *bss = NULL; |
| 740 | int err; | 745 | int err; |
| 741 | 746 | ||
| @@ -744,10 +749,6 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev, | |||
| 744 | if (wdev->sme_state != CFG80211_SME_IDLE) | 749 | if (wdev->sme_state != CFG80211_SME_IDLE) |
| 745 | return -EALREADY; | 750 | return -EALREADY; |
| 746 | 751 | ||
| 747 | chan = rdev_fixed_channel(rdev, wdev); | ||
| 748 | if (chan && chan != connect->channel) | ||
| 749 | return -EBUSY; | ||
| 750 | |||
| 751 | if (WARN_ON(wdev->connect_keys)) { | 752 | if (WARN_ON(wdev->connect_keys)) { |
| 752 | kfree(wdev->connect_keys); | 753 | kfree(wdev->connect_keys); |
| 753 | wdev->connect_keys = NULL; | 754 | wdev->connect_keys = NULL; |
| @@ -935,7 +936,7 @@ int __cfg80211_disconnect(struct cfg80211_registered_device *rdev, | |||
| 935 | /* wdev->conn->params.bssid must be set if > SCANNING */ | 936 | /* wdev->conn->params.bssid must be set if > SCANNING */ |
| 936 | err = __cfg80211_mlme_deauth(rdev, dev, | 937 | err = __cfg80211_mlme_deauth(rdev, dev, |
| 937 | wdev->conn->params.bssid, | 938 | wdev->conn->params.bssid, |
| 938 | NULL, 0, reason); | 939 | NULL, 0, reason, false); |
| 939 | if (err) | 940 | if (err) |
| 940 | return err; | 941 | return err; |
| 941 | } else { | 942 | } else { |
| @@ -991,7 +992,8 @@ void cfg80211_sme_disassoc(struct net_device *dev, int idx) | |||
| 991 | 992 | ||
| 992 | memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN); | 993 | memcpy(bssid, wdev->auth_bsses[idx]->pub.bssid, ETH_ALEN); |
| 993 | if (__cfg80211_mlme_deauth(rdev, dev, bssid, | 994 | if (__cfg80211_mlme_deauth(rdev, dev, bssid, |
| 994 | NULL, 0, WLAN_REASON_DEAUTH_LEAVING)) { | 995 | NULL, 0, WLAN_REASON_DEAUTH_LEAVING, |
| 996 | false)) { | ||
| 995 | /* whatever -- assume gone anyway */ | 997 | /* whatever -- assume gone anyway */ |
| 996 | cfg80211_unhold_bss(wdev->auth_bsses[idx]); | 998 | cfg80211_unhold_bss(wdev->auth_bsses[idx]); |
| 997 | cfg80211_put_bss(&wdev->auth_bsses[idx]->pub); | 999 | cfg80211_put_bss(&wdev->auth_bsses[idx]->pub); |
