summaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorDavid Spinadel <david.spinadel@intel.com>2016-09-22 16:16:50 -0400
committerJohannes Berg <johannes.berg@intel.com>2016-09-30 07:19:10 -0400
commitb8676221f00dd5b6018f0fd88cd278f93e11143a (patch)
treef8e0667b2c0125479b0a72c0ca572c32109d2237 /net/wireless
parente0e2effff5e19eba07de1ee1c95ba0588a7b3330 (diff)
cfg80211: Add support for static WEP in the driver
Add support for drivers that implement static WEP internally, i.e. expose connection keys to the driver in connect flow and don't upload the keys after the connection. Signed-off-by: David Spinadel <david.spinadel@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/core.h4
-rw-r--r--net/wireless/ibss.c5
-rw-r--r--net/wireless/sme.c6
-rw-r--r--net/wireless/util.c2
-rw-r--r--net/wireless/wext-compat.c2
-rw-r--r--net/wireless/wext-sme.c2
6 files changed, 13 insertions, 8 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 5555e3c13ae9..554f87d0f991 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -249,8 +249,8 @@ struct cfg80211_event {
249}; 249};
250 250
251struct cfg80211_cached_keys { 251struct cfg80211_cached_keys {
252 struct key_params params[4]; 252 struct key_params params[CFG80211_MAX_WEP_KEYS];
253 u8 data[4][WLAN_KEY_LEN_WEP104]; 253 u8 data[CFG80211_MAX_WEP_KEYS][WLAN_KEY_LEN_WEP104];
254 int def; 254 int def;
255}; 255};
256 256
diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c
index eafdfa5798ae..364f900a3dc4 100644
--- a/net/wireless/ibss.c
+++ b/net/wireless/ibss.c
@@ -43,7 +43,8 @@ void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
43 cfg80211_hold_bss(bss_from_pub(bss)); 43 cfg80211_hold_bss(bss_from_pub(bss));
44 wdev->current_bss = bss_from_pub(bss); 44 wdev->current_bss = bss_from_pub(bss);
45 45
46 cfg80211_upload_connect_keys(wdev); 46 if (!(wdev->wiphy->flags & WIPHY_FLAG_HAS_STATIC_WEP))
47 cfg80211_upload_connect_keys(wdev);
47 48
48 nl80211_send_ibss_bssid(wiphy_to_rdev(wdev->wiphy), dev, bssid, 49 nl80211_send_ibss_bssid(wiphy_to_rdev(wdev->wiphy), dev, bssid,
49 GFP_KERNEL); 50 GFP_KERNEL);
@@ -296,7 +297,7 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
296 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 297 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
297 if (!ck) 298 if (!ck)
298 return -ENOMEM; 299 return -ENOMEM;
299 for (i = 0; i < 4; i++) 300 for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++)
300 ck->params[i].key = ck->data[i]; 301 ck->params[i].key = ck->data[i];
301 } 302 }
302 err = __cfg80211_join_ibss(rdev, wdev->netdev, 303 err = __cfg80211_join_ibss(rdev, wdev->netdev,
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index c08a3b57dca1..a77db333927e 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -726,7 +726,8 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
726 726
727 wdev->current_bss = bss_from_pub(bss); 727 wdev->current_bss = bss_from_pub(bss);
728 728
729 cfg80211_upload_connect_keys(wdev); 729 if (!(wdev->wiphy->flags & WIPHY_FLAG_HAS_STATIC_WEP))
730 cfg80211_upload_connect_keys(wdev);
730 731
731 rcu_read_lock(); 732 rcu_read_lock();
732 country_ie = ieee80211_bss_get_ie(bss, WLAN_EID_COUNTRY); 733 country_ie = ieee80211_bss_get_ie(bss, WLAN_EID_COUNTRY);
@@ -1043,6 +1044,9 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
1043 connect->crypto.ciphers_pairwise[0] = cipher; 1044 connect->crypto.ciphers_pairwise[0] = cipher;
1044 } 1045 }
1045 } 1046 }
1047
1048 connect->crypto.wep_keys = connkeys->params;
1049 connect->crypto.wep_tx_key = connkeys->def;
1046 } else { 1050 } else {
1047 if (WARN_ON(connkeys)) 1051 if (WARN_ON(connkeys))
1048 return -EINVAL; 1052 return -EINVAL;
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 9e6e2aaa7766..e02141d66b69 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -912,7 +912,7 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
912 if (!wdev->connect_keys) 912 if (!wdev->connect_keys)
913 return; 913 return;
914 914
915 for (i = 0; i < 4; i++) { 915 for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) {
916 if (!wdev->connect_keys->params[i].cipher) 916 if (!wdev->connect_keys->params[i].cipher)
917 continue; 917 continue;
918 if (rdev_add_key(rdev, dev, i, false, NULL, 918 if (rdev_add_key(rdev, dev, i, false, NULL,
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
index 2b096c02eb85..a220156cf217 100644
--- a/net/wireless/wext-compat.c
+++ b/net/wireless/wext-compat.c
@@ -415,7 +415,7 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
415 GFP_KERNEL); 415 GFP_KERNEL);
416 if (!wdev->wext.keys) 416 if (!wdev->wext.keys)
417 return -ENOMEM; 417 return -ENOMEM;
418 for (i = 0; i < 4; i++) 418 for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++)
419 wdev->wext.keys->params[i].key = 419 wdev->wext.keys->params[i].key =
420 wdev->wext.keys->data[i]; 420 wdev->wext.keys->data[i];
421 } 421 }
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c
index 88f1f6931ab8..995163830a61 100644
--- a/net/wireless/wext-sme.c
+++ b/net/wireless/wext-sme.c
@@ -46,7 +46,7 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
46 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 46 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
47 if (!ck) 47 if (!ck)
48 return -ENOMEM; 48 return -ENOMEM;
49 for (i = 0; i < 4; i++) 49 for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++)
50 ck->params[i].key = ck->data[i]; 50 ck->params[i].key = ck->data[i];
51 } 51 }
52 52