aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2016-09-13 10:39:38 -0400
committerJohannes Berg <johannes.berg@intel.com>2016-09-13 14:20:54 -0400
commit89b706fb28e431fa7639348536c284fb375eb3c0 (patch)
tree06fdb3e6e1f5f6cc573fc17b3732df8579dfb61d
parente9c8f8d3a4d54106a30f2b981b53d658c9bc0c8e (diff)
cfg80211: reduce connect key caching struct size
After the previous patches, connect keys can only (correctly) be used for storing static WEP keys. Therefore, remove all the data for dealing with key index 4/5 and reduce the size of the key material to the maximum for WEP keys. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/wireless/core.h6
-rw-r--r--net/wireless/ibss.c6
-rw-r--r--net/wireless/nl80211.c1
-rw-r--r--net/wireless/util.c5
-rw-r--r--net/wireless/wext-compat.c6
-rw-r--r--net/wireless/wext-sme.c3
6 files changed, 10 insertions, 17 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h
index eee91443924d..5555e3c13ae9 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -249,9 +249,9 @@ struct cfg80211_event {
249}; 249};
250 250
251struct cfg80211_cached_keys { 251struct cfg80211_cached_keys {
252 struct key_params params[6]; 252 struct key_params params[4];
253 u8 data[6][WLAN_MAX_KEY_LEN]; 253 u8 data[4][WLAN_KEY_LEN_WEP104];
254 int def, defmgmt; 254 int def;
255}; 255};
256 256
257enum cfg80211_chan_mode { 257enum cfg80211_chan_mode {
diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c
index 4a4dda53bdf1..896cbb20b6e1 100644
--- a/net/wireless/ibss.c
+++ b/net/wireless/ibss.c
@@ -284,10 +284,8 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
284 if (!netif_running(wdev->netdev)) 284 if (!netif_running(wdev->netdev))
285 return 0; 285 return 0;
286 286
287 if (wdev->wext.keys) { 287 if (wdev->wext.keys)
288 wdev->wext.keys->def = wdev->wext.default_key; 288 wdev->wext.keys->def = wdev->wext.default_key;
289 wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
290 }
291 289
292 wdev->wext.ibss.privacy = wdev->wext.default_key != -1; 290 wdev->wext.ibss.privacy = wdev->wext.default_key != -1;
293 291
@@ -295,7 +293,7 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
295 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 293 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
296 if (!ck) 294 if (!ck)
297 return -ENOMEM; 295 return -ENOMEM;
298 for (i = 0; i < 6; i++) 296 for (i = 0; i < 4; i++)
299 ck->params[i].key = ck->data[i]; 297 ck->params[i].key = ck->data[i];
300 } 298 }
301 err = __cfg80211_join_ibss(rdev, wdev->netdev, 299 err = __cfg80211_join_ibss(rdev, wdev->netdev,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 6cb33ae38ae3..71af96e8a947 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -854,7 +854,6 @@ nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
854 return ERR_PTR(-ENOMEM); 854 return ERR_PTR(-ENOMEM);
855 855
856 result->def = -1; 856 result->def = -1;
857 result->defmgmt = -1;
858 857
859 nla_for_each_nested(key, keys, rem) { 858 nla_for_each_nested(key, keys, rem) {
860 memset(&parse, 0, sizeof(parse)); 859 memset(&parse, 0, sizeof(parse));
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 12e2d3fae843..9e6e2aaa7766 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 < 6; i++) { 915 for (i = 0; i < 4; 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,
@@ -925,9 +925,6 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
925 netdev_err(dev, "failed to set defkey %d\n", i); 925 netdev_err(dev, "failed to set defkey %d\n", i);
926 continue; 926 continue;
927 } 927 }
928 if (wdev->connect_keys->defmgmt == i)
929 if (rdev_set_default_mgmt_key(rdev, dev, i))
930 netdev_err(dev, "failed to set mgtdef %d\n", i);
931 } 928 }
932 929
933 kzfree(wdev->connect_keys); 930 kzfree(wdev->connect_keys);
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
index e45a76449b43..7b97d43b27e1 100644
--- a/net/wireless/wext-compat.c
+++ b/net/wireless/wext-compat.c
@@ -408,10 +408,10 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
408 408
409 if (!wdev->wext.keys) { 409 if (!wdev->wext.keys) {
410 wdev->wext.keys = kzalloc(sizeof(*wdev->wext.keys), 410 wdev->wext.keys = kzalloc(sizeof(*wdev->wext.keys),
411 GFP_KERNEL); 411 GFP_KERNEL);
412 if (!wdev->wext.keys) 412 if (!wdev->wext.keys)
413 return -ENOMEM; 413 return -ENOMEM;
414 for (i = 0; i < 6; i++) 414 for (i = 0; i < 4; i++)
415 wdev->wext.keys->params[i].key = 415 wdev->wext.keys->params[i].key =
416 wdev->wext.keys->data[i]; 416 wdev->wext.keys->data[i];
417 } 417 }
@@ -460,7 +460,7 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
460 if (err == -ENOENT) 460 if (err == -ENOENT)
461 err = 0; 461 err = 0;
462 if (!err) { 462 if (!err) {
463 if (!addr) { 463 if (!addr && idx < 4) {
464 memset(wdev->wext.keys->data[idx], 0, 464 memset(wdev->wext.keys->data[idx], 0,
465 sizeof(wdev->wext.keys->data[idx])); 465 sizeof(wdev->wext.keys->data[idx]));
466 wdev->wext.keys->params[idx].key_len = 0; 466 wdev->wext.keys->params[idx].key_len = 0;
diff --git a/net/wireless/wext-sme.c b/net/wireless/wext-sme.c
index a4e8af3321d2..f6523a4387cc 100644
--- a/net/wireless/wext-sme.c
+++ b/net/wireless/wext-sme.c
@@ -35,7 +35,6 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
35 35
36 if (wdev->wext.keys) { 36 if (wdev->wext.keys) {
37 wdev->wext.keys->def = wdev->wext.default_key; 37 wdev->wext.keys->def = wdev->wext.default_key;
38 wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
39 if (wdev->wext.default_key != -1) 38 if (wdev->wext.default_key != -1)
40 wdev->wext.connect.privacy = true; 39 wdev->wext.connect.privacy = true;
41 } 40 }
@@ -47,7 +46,7 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
47 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 46 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
48 if (!ck) 47 if (!ck)
49 return -ENOMEM; 48 return -ENOMEM;
50 for (i = 0; i < 6; i++) 49 for (i = 0; i < 4; i++)
51 ck->params[i].key = ck->data[i]; 50 ck->params[i].key = ck->data[i];
52 } 51 }
53 52