diff options
-rw-r--r-- | include/net/ieee80211.h | 1 | ||||
-rw-r--r-- | include/net/ieee80211_crypt.h | 2 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_crypt.c | 9 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_crypt_ccmp.c | 2 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_crypt_tkip.c | 31 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_crypt_wep.c | 2 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_rx.c | 11 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_tx.c | 14 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_wx.c | 6 |
9 files changed, 40 insertions, 38 deletions
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index 2d9c679cf6b6..ed06a9454edc 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h | |||
@@ -434,6 +434,7 @@ struct ieee80211_device; | |||
434 | #define SEC_KEY_2 (1<<1) | 434 | #define SEC_KEY_2 (1<<1) |
435 | #define SEC_KEY_3 (1<<2) | 435 | #define SEC_KEY_3 (1<<2) |
436 | #define SEC_KEY_4 (1<<3) | 436 | #define SEC_KEY_4 (1<<3) |
437 | #define SEC_KEY_MASK (SEC_KEY_1 | SEC_KEY_2 | SEC_KEY_3 | SEC_KEY_4) | ||
437 | #define SEC_ACTIVE_KEY (1<<4) | 438 | #define SEC_ACTIVE_KEY (1<<4) |
438 | #define SEC_AUTH_MODE (1<<5) | 439 | #define SEC_AUTH_MODE (1<<5) |
439 | #define SEC_UNICAST_GROUP (1<<6) | 440 | #define SEC_UNICAST_GROUP (1<<6) |
diff --git a/include/net/ieee80211_crypt.h b/include/net/ieee80211_crypt.h index 93bf91fda82e..e2064edb957d 100644 --- a/include/net/ieee80211_crypt.h +++ b/include/net/ieee80211_crypt.h | |||
@@ -31,7 +31,7 @@ struct ieee80211_crypto_ops { | |||
31 | /* init new crypto context (e.g., allocate private data space, | 31 | /* init new crypto context (e.g., allocate private data space, |
32 | * select IV, etc.); returns NULL on failure or pointer to allocated | 32 | * select IV, etc.); returns NULL on failure or pointer to allocated |
33 | * private data on success */ | 33 | * private data on success */ |
34 | void *(*init) (int keyidx); | 34 | void *(*init) (struct ieee80211_device * ieee, int keyidx); |
35 | 35 | ||
36 | /* deinitialize crypto context and free allocated private data */ | 36 | /* deinitialize crypto context and free allocated private data */ |
37 | void (*deinit) (void *priv); | 37 | void (*deinit) (void *priv); |
diff --git a/net/ieee80211/ieee80211_crypt.c b/net/ieee80211/ieee80211_crypt.c index dc835f68edd3..0c366299db0f 100644 --- a/net/ieee80211/ieee80211_crypt.c +++ b/net/ieee80211/ieee80211_crypt.c | |||
@@ -41,7 +41,9 @@ void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, int force) | |||
41 | { | 41 | { |
42 | struct list_head *ptr, *n; | 42 | struct list_head *ptr, *n; |
43 | struct ieee80211_crypt_data *entry; | 43 | struct ieee80211_crypt_data *entry; |
44 | unsigned long flags; | ||
44 | 45 | ||
46 | spin_lock_irqsave(&ieee->lock, flags); | ||
45 | for (ptr = ieee->crypt_deinit_list.next, n = ptr->next; | 47 | for (ptr = ieee->crypt_deinit_list.next, n = ptr->next; |
46 | ptr != &ieee->crypt_deinit_list; ptr = n, n = ptr->next) { | 48 | ptr != &ieee->crypt_deinit_list; ptr = n, n = ptr->next) { |
47 | entry = list_entry(ptr, struct ieee80211_crypt_data, list); | 49 | entry = list_entry(ptr, struct ieee80211_crypt_data, list); |
@@ -57,14 +59,13 @@ void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, int force) | |||
57 | } | 59 | } |
58 | kfree(entry); | 60 | kfree(entry); |
59 | } | 61 | } |
62 | spin_unlock_irqrestore(&ieee->lock, flags); | ||
60 | } | 63 | } |
61 | 64 | ||
62 | void ieee80211_crypt_deinit_handler(unsigned long data) | 65 | void ieee80211_crypt_deinit_handler(unsigned long data) |
63 | { | 66 | { |
64 | struct ieee80211_device *ieee = (struct ieee80211_device *)data; | 67 | struct ieee80211_device *ieee = (struct ieee80211_device *)data; |
65 | unsigned long flags; | ||
66 | 68 | ||
67 | spin_lock_irqsave(&ieee->lock, flags); | ||
68 | ieee80211_crypt_deinit_entries(ieee, 0); | 69 | ieee80211_crypt_deinit_entries(ieee, 0); |
69 | if (!list_empty(&ieee->crypt_deinit_list)) { | 70 | if (!list_empty(&ieee->crypt_deinit_list)) { |
70 | printk(KERN_DEBUG "%s: entries remaining in delayed crypt " | 71 | printk(KERN_DEBUG "%s: entries remaining in delayed crypt " |
@@ -72,7 +73,6 @@ void ieee80211_crypt_deinit_handler(unsigned long data) | |||
72 | ieee->crypt_deinit_timer.expires = jiffies + HZ; | 73 | ieee->crypt_deinit_timer.expires = jiffies + HZ; |
73 | add_timer(&ieee->crypt_deinit_timer); | 74 | add_timer(&ieee->crypt_deinit_timer); |
74 | } | 75 | } |
75 | spin_unlock_irqrestore(&ieee->lock, flags); | ||
76 | 76 | ||
77 | } | 77 | } |
78 | 78 | ||
@@ -182,7 +182,8 @@ struct ieee80211_crypto_ops *ieee80211_get_crypto_ops(const char *name) | |||
182 | return NULL; | 182 | return NULL; |
183 | } | 183 | } |
184 | 184 | ||
185 | static void *ieee80211_crypt_null_init(int keyidx) | 185 | static void *ieee80211_crypt_null_init(struct ieee80211_device *ieee, |
186 | int keyidx) | ||
186 | { | 187 | { |
187 | return (void *)1; | 188 | return (void *)1; |
188 | } | 189 | } |
diff --git a/net/ieee80211/ieee80211_crypt_ccmp.c b/net/ieee80211/ieee80211_crypt_ccmp.c index 7b6290885e7d..1e6644b133dc 100644 --- a/net/ieee80211/ieee80211_crypt_ccmp.c +++ b/net/ieee80211/ieee80211_crypt_ccmp.c | |||
@@ -74,7 +74,7 @@ static void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, | |||
74 | crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); | 74 | crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); |
75 | } | 75 | } |
76 | 76 | ||
77 | static void *ieee80211_ccmp_init(int key_idx) | 77 | static void *ieee80211_ccmp_init(struct ieee80211_device *ieee, int key_idx) |
78 | { | 78 | { |
79 | struct ieee80211_ccmp_data *priv; | 79 | struct ieee80211_ccmp_data *priv; |
80 | 80 | ||
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index dca380e57454..0c495f07e718 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c | |||
@@ -59,9 +59,11 @@ struct ieee80211_tkip_data { | |||
59 | 59 | ||
60 | /* scratch buffers for virt_to_page() (crypto API) */ | 60 | /* scratch buffers for virt_to_page() (crypto API) */ |
61 | u8 rx_hdr[16], tx_hdr[16]; | 61 | u8 rx_hdr[16], tx_hdr[16]; |
62 | |||
63 | struct ieee80211_device *ieee; | ||
62 | }; | 64 | }; |
63 | 65 | ||
64 | static void *ieee80211_tkip_init(int key_idx) | 66 | static void *ieee80211_tkip_init(struct ieee80211_device *ieee, int key_idx) |
65 | { | 67 | { |
66 | struct ieee80211_tkip_data *priv; | 68 | struct ieee80211_tkip_data *priv; |
67 | 69 | ||
@@ -69,6 +71,9 @@ static void *ieee80211_tkip_init(int key_idx) | |||
69 | if (priv == NULL) | 71 | if (priv == NULL) |
70 | goto fail; | 72 | goto fail; |
71 | memset(priv, 0, sizeof(*priv)); | 73 | memset(priv, 0, sizeof(*priv)); |
74 | |||
75 | priv->ieee = ieee; | ||
76 | |||
72 | priv->key_idx = key_idx; | 77 | priv->key_idx = key_idx; |
73 | 78 | ||
74 | priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); | 79 | priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); |
@@ -264,11 +269,21 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
264 | u32 crc; | 269 | u32 crc; |
265 | struct scatterlist sg; | 270 | struct scatterlist sg; |
266 | 271 | ||
272 | hdr = (struct ieee80211_hdr *)skb->data; | ||
273 | |||
274 | if (tkey->ieee->tkip_countermeasures) { | ||
275 | if (net_ratelimit()) { | ||
276 | printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " | ||
277 | "TX packet to " MAC_FMT "\n", | ||
278 | tkey->ieee->dev->name, MAC_ARG(hdr->addr1)); | ||
279 | } | ||
280 | return -1; | ||
281 | } | ||
282 | |||
267 | if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || | 283 | if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || |
268 | skb->len < hdr_len) | 284 | skb->len < hdr_len) |
269 | return -1; | 285 | return -1; |
270 | 286 | ||
271 | hdr = (struct ieee80211_hdr *)skb->data; | ||
272 | if (!tkey->tx_phase1_done) { | 287 | if (!tkey->tx_phase1_done) { |
273 | tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, | 288 | tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, |
274 | tkey->tx_iv32); | 289 | tkey->tx_iv32); |
@@ -325,10 +340,20 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
325 | struct scatterlist sg; | 340 | struct scatterlist sg; |
326 | int plen; | 341 | int plen; |
327 | 342 | ||
343 | hdr = (struct ieee80211_hdr *)skb->data; | ||
344 | |||
345 | if (tkey->ieee->tkip_countermeasures) { | ||
346 | if (net_ratelimit()) { | ||
347 | printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " | ||
348 | "received packet from " MAC_FMT "\n", | ||
349 | tkey->ieee->dev->name, MAC_ARG(hdr->addr2)); | ||
350 | } | ||
351 | return -1; | ||
352 | } | ||
353 | |||
328 | if (skb->len < hdr_len + 8 + 4) | 354 | if (skb->len < hdr_len + 8 + 4) |
329 | return -1; | 355 | return -1; |
330 | 356 | ||
331 | hdr = (struct ieee80211_hdr *)skb->data; | ||
332 | pos = skb->data + hdr_len; | 357 | pos = skb->data + hdr_len; |
333 | keyidx = pos[3]; | 358 | keyidx = pos[3]; |
334 | if (!(keyidx & (1 << 5))) { | 359 | if (!(keyidx & (1 << 5))) { |
diff --git a/net/ieee80211/ieee80211_crypt_wep.c b/net/ieee80211/ieee80211_crypt_wep.c index ebe16155e792..63e783fa5173 100644 --- a/net/ieee80211/ieee80211_crypt_wep.c +++ b/net/ieee80211/ieee80211_crypt_wep.c | |||
@@ -37,7 +37,7 @@ struct prism2_wep_data { | |||
37 | struct crypto_tfm *tfm; | 37 | struct crypto_tfm *tfm; |
38 | }; | 38 | }; |
39 | 39 | ||
40 | static void *prism2_wep_init(int keyidx) | 40 | static void *prism2_wep_init(struct ieee80211_device *ieee, int keyidx) |
41 | { | 41 | { |
42 | struct prism2_wep_data *priv; | 42 | struct prism2_wep_data *priv; |
43 | 43 | ||
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index e0337c8fcde8..9a125d45289a 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c | |||
@@ -280,17 +280,6 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device *ieee, struct sk_buff *skb, | |||
280 | hdr = (struct ieee80211_hdr *)skb->data; | 280 | hdr = (struct ieee80211_hdr *)skb->data; |
281 | hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); | 281 | hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); |
282 | 282 | ||
283 | #ifdef CONFIG_IEEE80211_CRYPT_TKIP | ||
284 | if (ieee->tkip_countermeasures && strcmp(crypt->ops->name, "TKIP") == 0) { | ||
285 | if (net_ratelimit()) { | ||
286 | printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " | ||
287 | "received packet from " MAC_FMT "\n", | ||
288 | ieee->dev->name, MAC_ARG(hdr->addr2)); | ||
289 | } | ||
290 | return -1; | ||
291 | } | ||
292 | #endif | ||
293 | |||
294 | atomic_inc(&crypt->refcnt); | 283 | atomic_inc(&crypt->refcnt); |
295 | res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv); | 284 | res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv); |
296 | atomic_dec(&crypt->refcnt); | 285 | atomic_dec(&crypt->refcnt); |
diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c index 1a09448016ed..435ef5a73d75 100644 --- a/net/ieee80211/ieee80211_tx.c +++ b/net/ieee80211/ieee80211_tx.c | |||
@@ -157,20 +157,6 @@ static inline int ieee80211_encrypt_fragment(struct ieee80211_device *ieee, | |||
157 | struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx]; | 157 | struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx]; |
158 | int res; | 158 | int res; |
159 | 159 | ||
160 | #ifdef CONFIG_IEEE80211_CRYPT_TKIP | ||
161 | struct ieee80211_hdr *header; | ||
162 | |||
163 | if (ieee->tkip_countermeasures && | ||
164 | crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { | ||
165 | header = (struct ieee80211_hdr *)frag->data; | ||
166 | if (net_ratelimit()) { | ||
167 | printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " | ||
168 | "TX packet to " MAC_FMT "\n", | ||
169 | ieee->dev->name, MAC_ARG(header->addr1)); | ||
170 | } | ||
171 | return -1; | ||
172 | } | ||
173 | #endif | ||
174 | /* To encrypt, frame format is: | 160 | /* To encrypt, frame format is: |
175 | * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */ | 161 | * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */ |
176 | 162 | ||
diff --git a/net/ieee80211/ieee80211_wx.c b/net/ieee80211/ieee80211_wx.c index 04f0897b0653..fc4e1377aba7 100644 --- a/net/ieee80211/ieee80211_wx.c +++ b/net/ieee80211/ieee80211_wx.c | |||
@@ -182,7 +182,7 @@ static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, | |||
182 | if (iwe.u.data.length) | 182 | if (iwe.u.data.length) |
183 | start = iwe_stream_add_point(start, stop, &iwe, custom); | 183 | start = iwe_stream_add_point(start, stop, &iwe, custom); |
184 | 184 | ||
185 | if (ieee->wpa_enabled && network->wpa_ie_len) { | 185 | if (network->wpa_ie_len) { |
186 | char buf[MAX_WPA_IE_LEN * 2 + 30]; | 186 | char buf[MAX_WPA_IE_LEN * 2 + 30]; |
187 | 187 | ||
188 | u8 *p = buf; | 188 | u8 *p = buf; |
@@ -197,7 +197,7 @@ static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, | |||
197 | start = iwe_stream_add_point(start, stop, &iwe, buf); | 197 | start = iwe_stream_add_point(start, stop, &iwe, buf); |
198 | } | 198 | } |
199 | 199 | ||
200 | if (ieee->wpa_enabled && network->rsn_ie_len) { | 200 | if (network->rsn_ie_len) { |
201 | char buf[MAX_WPA_IE_LEN * 2 + 30]; | 201 | char buf[MAX_WPA_IE_LEN * 2 + 30]; |
202 | 202 | ||
203 | u8 *p = buf; | 203 | u8 *p = buf; |
@@ -351,7 +351,7 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, | |||
351 | } | 351 | } |
352 | 352 | ||
353 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 353 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) |
354 | new_crypt->priv = new_crypt->ops->init(key); | 354 | new_crypt->priv = new_crypt->ops->init(ieee, key); |
355 | 355 | ||
356 | if (!new_crypt->ops || !new_crypt->priv) { | 356 | if (!new_crypt->ops || !new_crypt->priv) { |
357 | kfree(new_crypt); | 357 | kfree(new_crypt); |