aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/ieee80211_ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/ieee80211_ioctl.c')
-rw-r--r--net/mac80211/ieee80211_ioctl.c79
1 files changed, 30 insertions, 49 deletions
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
index 9964f057bcef..380670c7a0ca 100644
--- a/net/mac80211/ieee80211_ioctl.c
+++ b/net/mac80211/ieee80211_ioctl.c
@@ -31,29 +31,20 @@ static void ieee80211_set_hw_encryption(struct net_device *dev,
31 struct sta_info *sta, u8 addr[ETH_ALEN], 31 struct sta_info *sta, u8 addr[ETH_ALEN],
32 struct ieee80211_key *key) 32 struct ieee80211_key *key)
33{ 33{
34 struct ieee80211_key_conf *keyconf = NULL;
35 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 34 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
36 35
37 /* default to sw encryption; this will be cleared by low-level 36 /* default to sw encryption; this will be cleared by low-level
38 * driver if the hw supports requested encryption */ 37 * driver if the hw supports requested encryption */
39 if (key) 38 if (key)
40 key->force_sw_encrypt = 1; 39 key->conf.flags |= IEEE80211_KEY_FORCE_SW_ENCRYPT;
41 40
42 if (key && local->ops->set_key && 41 if (key && local->ops->set_key) {
43 (keyconf = ieee80211_key_data2conf(local, key))) {
44 if (local->ops->set_key(local_to_hw(local), SET_KEY, addr, 42 if (local->ops->set_key(local_to_hw(local), SET_KEY, addr,
45 keyconf, sta ? sta->aid : 0)) { 43 &key->conf, local->default_wep_only)) {
46 key->force_sw_encrypt = 1; 44 key->conf.flags |= IEEE80211_KEY_FORCE_SW_ENCRYPT;
47 key->hw_key_idx = HW_KEY_IDX_INVALID; 45 key->conf.hw_key_idx = HW_KEY_IDX_INVALID;
48 } else {
49 key->force_sw_encrypt =
50 !!(keyconf->flags & IEEE80211_KEY_FORCE_SW_ENCRYPT);
51 key->hw_key_idx =
52 keyconf->hw_key_idx;
53
54 } 46 }
55 } 47 }
56 kfree(keyconf);
57} 48}
58 49
59 50
@@ -66,7 +57,6 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
66 struct sta_info *sta; 57 struct sta_info *sta;
67 struct ieee80211_key *key, *old_key; 58 struct ieee80211_key *key, *old_key;
68 int try_hwaccel = 1; 59 int try_hwaccel = 1;
69 struct ieee80211_key_conf *keyconf;
70 struct ieee80211_sub_if_data *sdata; 60 struct ieee80211_sub_if_data *sdata;
71 61
72 sdata = IEEE80211_DEV_TO_SUB_IF(dev); 62 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
@@ -154,18 +144,16 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
154 } 144 }
155 145
156 if (alg == ALG_NONE) { 146 if (alg == ALG_NONE) {
157 keyconf = NULL;
158 if (try_hwaccel && key && 147 if (try_hwaccel && key &&
159 key->hw_key_idx != HW_KEY_IDX_INVALID && 148 key->conf.hw_key_idx != HW_KEY_IDX_INVALID &&
160 local->ops->set_key && 149 local->ops->set_key &&
161 (keyconf = ieee80211_key_data2conf(local, key)) != NULL &&
162 local->ops->set_key(local_to_hw(local), DISABLE_KEY, 150 local->ops->set_key(local_to_hw(local), DISABLE_KEY,
163 sta_addr, keyconf, sta ? sta->aid : 0)) { 151 sta_addr, &key->conf,
152 local->default_wep_only)) {
164 printk(KERN_DEBUG "%s: set_encrypt - low-level disable" 153 printk(KERN_DEBUG "%s: set_encrypt - low-level disable"
165 " failed\n", dev->name); 154 " failed\n", dev->name);
166 ret = -EINVAL; 155 ret = -EINVAL;
167 } 156 }
168 kfree(keyconf);
169 157
170 if (set_tx_key || sdata->default_key == key) { 158 if (set_tx_key || sdata->default_key == key) {
171 ieee80211_debugfs_key_remove_default(sdata); 159 ieee80211_debugfs_key_remove_default(sdata);
@@ -189,22 +177,20 @@ static int ieee80211_set_encryption(struct net_device *dev, u8 *sta_addr,
189 177
190 /* default to sw encryption; low-level driver sets these if the 178 /* default to sw encryption; low-level driver sets these if the
191 * requested encryption is supported */ 179 * requested encryption is supported */
192 key->hw_key_idx = HW_KEY_IDX_INVALID; 180 key->conf.hw_key_idx = HW_KEY_IDX_INVALID;
193 key->force_sw_encrypt = 1; 181 key->conf.flags |= IEEE80211_KEY_FORCE_SW_ENCRYPT;
194 182
195 key->alg = alg; 183 key->conf.alg = alg;
196 key->keyidx = idx; 184 key->conf.keyidx = idx;
197 key->keylen = key_len; 185 key->conf.keylen = key_len;
198 memcpy(key->key, _key, key_len); 186 memcpy(key->conf.key, _key, key_len);
199 if (set_tx_key)
200 key->default_tx_key = 1;
201 187
202 if (alg == ALG_CCMP) { 188 if (alg == ALG_CCMP) {
203 /* Initialize AES key state here as an optimization 189 /* Initialize AES key state here as an optimization
204 * so that it does not need to be initialized for every 190 * so that it does not need to be initialized for every
205 * packet. */ 191 * packet. */
206 key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt( 192 key->u.ccmp.tfm = ieee80211_aes_key_setup_encrypt(
207 key->key); 193 key->conf.key);
208 if (!key->u.ccmp.tfm) { 194 if (!key->u.ccmp.tfm) {
209 ret = -ENOMEM; 195 ret = -ENOMEM;
210 goto err_free; 196 goto err_free;
@@ -941,43 +927,38 @@ static int ieee80211_ioctl_giwretry(struct net_device *dev,
941static void ieee80211_key_enable_hwaccel(struct ieee80211_local *local, 927static void ieee80211_key_enable_hwaccel(struct ieee80211_local *local,
942 struct ieee80211_key *key) 928 struct ieee80211_key *key)
943{ 929{
944 struct ieee80211_key_conf *keyconf;
945 u8 addr[ETH_ALEN]; 930 u8 addr[ETH_ALEN];
946 931
947 if (!key || key->alg != ALG_WEP || !key->force_sw_encrypt || 932 if (!key || key->conf.alg != ALG_WEP ||
933 !(key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT) ||
948 (local->hw.flags & IEEE80211_HW_DEVICE_HIDES_WEP)) 934 (local->hw.flags & IEEE80211_HW_DEVICE_HIDES_WEP))
949 return; 935 return;
950 936
951 memset(addr, 0xff, ETH_ALEN); 937 memset(addr, 0xff, ETH_ALEN);
952 keyconf = ieee80211_key_data2conf(local, key); 938
953 if (keyconf && local->ops->set_key && 939 if (local->ops->set_key)
954 local->ops->set_key(local_to_hw(local), 940 local->ops->set_key(local_to_hw(local),
955 SET_KEY, addr, keyconf, 0) == 0) { 941 SET_KEY, addr, &key->conf,
956 key->force_sw_encrypt = 942 local->default_wep_only);
957 !!(keyconf->flags & IEEE80211_KEY_FORCE_SW_ENCRYPT);
958 key->hw_key_idx = keyconf->hw_key_idx;
959 }
960 kfree(keyconf);
961} 943}
962 944
963 945
964static void ieee80211_key_disable_hwaccel(struct ieee80211_local *local, 946static void ieee80211_key_disable_hwaccel(struct ieee80211_local *local,
965 struct ieee80211_key *key) 947 struct ieee80211_key *key)
966{ 948{
967 struct ieee80211_key_conf *keyconf;
968 u8 addr[ETH_ALEN]; 949 u8 addr[ETH_ALEN];
969 950
970 if (!key || key->alg != ALG_WEP || key->force_sw_encrypt || 951 if (!key || key->conf.alg != ALG_WEP ||
952 (key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT) ||
971 (local->hw.flags & IEEE80211_HW_DEVICE_HIDES_WEP)) 953 (local->hw.flags & IEEE80211_HW_DEVICE_HIDES_WEP))
972 return; 954 return;
973 955
974 memset(addr, 0xff, ETH_ALEN); 956 memset(addr, 0xff, ETH_ALEN);
975 keyconf = ieee80211_key_data2conf(local, key); 957 if (local->ops->set_key)
976 if (keyconf && local->ops->set_key)
977 local->ops->set_key(local_to_hw(local), DISABLE_KEY, 958 local->ops->set_key(local_to_hw(local), DISABLE_KEY,
978 addr, keyconf, 0); 959 addr, &key->conf,
979 kfree(keyconf); 960 local->default_wep_only);
980 key->force_sw_encrypt = 1; 961 key->conf.flags |= IEEE80211_KEY_FORCE_SW_ENCRYPT;
981} 962}
982 963
983 964
@@ -1341,9 +1322,9 @@ static int ieee80211_ioctl_giwencode(struct net_device *dev,
1341 return 0; 1322 return 0;
1342 } 1323 }
1343 1324
1344 memcpy(key, sdata->keys[idx]->key, 1325 memcpy(key, sdata->keys[idx]->conf.key,
1345 min((int)erq->length, sdata->keys[idx]->keylen)); 1326 min((int)erq->length, sdata->keys[idx]->conf.keylen));
1346 erq->length = sdata->keys[idx]->keylen; 1327 erq->length = sdata->keys[idx]->conf.keylen;
1347 erq->flags |= IW_ENCODE_ENABLED; 1328 erq->flags |= IW_ENCODE_ENABLED;
1348 1329
1349 return 0; 1330 return 0;