cfg80211: reduce connect key caching struct size
authorJohannes Berg <johannes.berg@intel.com>
Tue, 13 Sep 2016 14:39:38 +0000 (16:39 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 13 Sep 2016 18:20:54 +0000 (20:20 +0200)
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>
net/wireless/core.h
net/wireless/ibss.c
net/wireless/nl80211.c
net/wireless/util.c
net/wireless/wext-compat.c
net/wireless/wext-sme.c

index eee9144..5555e3c 100644 (file)
@@ -249,9 +249,9 @@ struct cfg80211_event {
 };
 
 struct cfg80211_cached_keys {
-       struct key_params params[6];
-       u8 data[6][WLAN_MAX_KEY_LEN];
-       int def, defmgmt;
+       struct key_params params[4];
+       u8 data[4][WLAN_KEY_LEN_WEP104];
+       int def;
 };
 
 enum cfg80211_chan_mode {
index 4a4dda5..896cbb2 100644 (file)
@@ -284,10 +284,8 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
        if (!netif_running(wdev->netdev))
                return 0;
 
-       if (wdev->wext.keys) {
+       if (wdev->wext.keys)
                wdev->wext.keys->def = wdev->wext.default_key;
-               wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
-       }
 
        wdev->wext.ibss.privacy = wdev->wext.default_key != -1;
 
@@ -295,7 +293,7 @@ int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
                ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
                if (!ck)
                        return -ENOMEM;
-               for (i = 0; i < 6; i++)
+               for (i = 0; i < 4; i++)
                        ck->params[i].key = ck->data[i];
        }
        err = __cfg80211_join_ibss(rdev, wdev->netdev,
index 6cb33ae..71af96e 100644 (file)
@@ -854,7 +854,6 @@ nl80211_parse_connkeys(struct cfg80211_registered_device *rdev,
                return ERR_PTR(-ENOMEM);
 
        result->def = -1;
-       result->defmgmt = -1;
 
        nla_for_each_nested(key, keys, rem) {
                memset(&parse, 0, sizeof(parse));
index 12e2d3f..9e6e2aa 100644 (file)
@@ -912,7 +912,7 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
        if (!wdev->connect_keys)
                return;
 
-       for (i = 0; i < 6; i++) {
+       for (i = 0; i < 4; i++) {
                if (!wdev->connect_keys->params[i].cipher)
                        continue;
                if (rdev_add_key(rdev, dev, i, false, NULL,
@@ -925,9 +925,6 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
                                netdev_err(dev, "failed to set defkey %d\n", i);
                                continue;
                        }
-               if (wdev->connect_keys->defmgmt == i)
-                       if (rdev_set_default_mgmt_key(rdev, dev, i))
-                               netdev_err(dev, "failed to set mgtdef %d\n", i);
        }
 
        kzfree(wdev->connect_keys);
index e45a764..7b97d43 100644 (file)
@@ -408,10 +408,10 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
 
        if (!wdev->wext.keys) {
                wdev->wext.keys = kzalloc(sizeof(*wdev->wext.keys),
-                                             GFP_KERNEL);
+                                         GFP_KERNEL);
                if (!wdev->wext.keys)
                        return -ENOMEM;
-               for (i = 0; i < 6; i++)
+               for (i = 0; i < 4; i++)
                        wdev->wext.keys->params[i].key =
                                wdev->wext.keys->data[i];
        }
@@ -460,7 +460,7 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
                if (err == -ENOENT)
                        err = 0;
                if (!err) {
-                       if (!addr) {
+                       if (!addr && idx < 4) {
                                memset(wdev->wext.keys->data[idx], 0,
                                       sizeof(wdev->wext.keys->data[idx]));
                                wdev->wext.keys->params[idx].key_len = 0;
index a4e8af3..f6523a4 100644 (file)
@@ -35,7 +35,6 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
 
        if (wdev->wext.keys) {
                wdev->wext.keys->def = wdev->wext.default_key;
-               wdev->wext.keys->defmgmt = wdev->wext.default_mgmt_key;
                if (wdev->wext.default_key != -1)
                        wdev->wext.connect.privacy = true;
        }
@@ -47,7 +46,7 @@ int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
                ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL);
                if (!ck)
                        return -ENOMEM;
-               for (i = 0; i < 6; i++)
+               for (i = 0; i < 4; i++)
                        ck->params[i].key = ck->data[i];
        }