aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/wext-sme.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/wext-sme.c')
-rw-r--r--net/wireless/wext-sme.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c
index 6f75aaa7f795..c33ea9a5de78 100644
--- a/net/wireless/wext-sme.c
+++ b/net/wireless/wext-sme.c
@@ -10,10 +10,11 @@
10#include <net/cfg80211.h> 10#include <net/cfg80211.h>
11#include "nl80211.h" 11#include "nl80211.h"
12 12
13static int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev, 13int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
14 struct wireless_dev *wdev) 14 struct wireless_dev *wdev)
15{ 15{
16 int err; 16 struct cfg80211_cached_keys *ck = NULL;
17 int err, i;
17 18
18 ASSERT_RDEV_LOCK(rdev); 19 ASSERT_RDEV_LOCK(rdev);
19 ASSERT_WDEV_LOCK(wdev); 20 ASSERT_WDEV_LOCK(wdev);
@@ -25,10 +26,25 @@ static int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
25 wdev->wext.connect.ie_len = wdev->wext.ie_len; 26 wdev->wext.connect.ie_len = wdev->wext.ie_len;
26 wdev->wext.connect.privacy = wdev->wext.default_key != -1; 27 wdev->wext.connect.privacy = wdev->wext.default_key != -1;
27 28
28 err = 0; 29 if (wdev->wext.keys) {
29 if (wdev->wext.connect.ssid_len != 0) 30 wdev->wext.keys->def = wdev->wext.default_key;
30 err = __cfg80211_connect(rdev, wdev->netdev, 31 wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
31 &wdev->wext.connect); 32 }
33
34 if (!wdev->wext.connect.ssid_len)
35 return 0;
36
37 if (wdev->wext.keys) {
38 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
39 if (!ck)
40 return -ENOMEM;
41 for (i = 0; i < 6; i++)
42 ck->params[i].key = ck->data[i];
43 }
44 err = __cfg80211_connect(rdev, wdev->netdev,
45 &wdev->wext.connect, ck);
46 if (err)
47 kfree(ck);
32 48
33 return err; 49 return err;
34} 50}