diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-09-06 11:02:22 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-09-06 11:02:22 -0400 |
commit | a2413598b8c5f14d75f914ce95d72bacdeabd05e (patch) | |
tree | 35e1340b05b295dbefefaa45424e00a55c28402e /net | |
parent | f2ad2d9b65963322186a8af2bd2965c734a7badb (diff) | |
parent | c576af479162c0a11d4e2691ebc97354958d9285 (diff) |
Merge branch 'upstream' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6 into upstream
Diffstat (limited to 'net')
-rw-r--r-- | net/ieee80211/ieee80211_crypt_ccmp.c | 23 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_crypt_tkip.c | 108 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_crypt_wep.c | 35 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_rx.c | 17 | ||||
-rw-r--r-- | net/ieee80211/ieee80211_tx.c | 9 |
5 files changed, 132 insertions, 60 deletions
diff --git a/net/ieee80211/ieee80211_crypt_ccmp.c b/net/ieee80211/ieee80211_crypt_ccmp.c index ed90a8af1444..098c66846339 100644 --- a/net/ieee80211/ieee80211_crypt_ccmp.c +++ b/net/ieee80211/ieee80211_crypt_ccmp.c | |||
@@ -271,6 +271,27 @@ static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
271 | return 0; | 271 | return 0; |
272 | } | 272 | } |
273 | 273 | ||
274 | /* | ||
275 | * deal with seq counter wrapping correctly. | ||
276 | * refer to timer_after() for jiffies wrapping handling | ||
277 | */ | ||
278 | static inline int ccmp_replay_check(u8 *pn_n, u8 *pn_o) | ||
279 | { | ||
280 | u32 iv32_n, iv16_n; | ||
281 | u32 iv32_o, iv16_o; | ||
282 | |||
283 | iv32_n = (pn_n[0] << 24) | (pn_n[1] << 16) | (pn_n[2] << 8) | pn_n[3]; | ||
284 | iv16_n = (pn_n[4] << 8) | pn_n[5]; | ||
285 | |||
286 | iv32_o = (pn_o[0] << 24) | (pn_o[1] << 16) | (pn_o[2] << 8) | pn_o[3]; | ||
287 | iv16_o = (pn_o[4] << 8) | pn_o[5]; | ||
288 | |||
289 | if ((s32)iv32_n - (s32)iv32_o < 0 || | ||
290 | (iv32_n == iv32_o && iv16_n <= iv16_o)) | ||
291 | return 1; | ||
292 | return 0; | ||
293 | } | ||
294 | |||
274 | static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | 295 | static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) |
275 | { | 296 | { |
276 | struct ieee80211_ccmp_data *key = priv; | 297 | struct ieee80211_ccmp_data *key = priv; |
@@ -323,7 +344,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
323 | pn[5] = pos[0]; | 344 | pn[5] = pos[0]; |
324 | pos += 8; | 345 | pos += 8; |
325 | 346 | ||
326 | if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) { | 347 | if (ccmp_replay_check(pn, key->rx_pn)) { |
327 | if (net_ratelimit()) { | 348 | if (net_ratelimit()) { |
328 | printk(KERN_DEBUG "CCMP: replay detected: STA=" MAC_FMT | 349 | printk(KERN_DEBUG "CCMP: replay detected: STA=" MAC_FMT |
329 | " previous PN %02x%02x%02x%02x%02x%02x " | 350 | " previous PN %02x%02x%02x%02x%02x%02x " |
diff --git a/net/ieee80211/ieee80211_crypt_tkip.c b/net/ieee80211/ieee80211_crypt_tkip.c index 34dba0ba545d..f2df2f5b3e4c 100644 --- a/net/ieee80211/ieee80211_crypt_tkip.c +++ b/net/ieee80211/ieee80211_crypt_tkip.c | |||
@@ -52,8 +52,10 @@ struct ieee80211_tkip_data { | |||
52 | 52 | ||
53 | int key_idx; | 53 | int key_idx; |
54 | 54 | ||
55 | struct crypto_tfm *tfm_arc4; | 55 | struct crypto_tfm *tx_tfm_arc4; |
56 | struct crypto_tfm *tfm_michael; | 56 | struct crypto_tfm *tx_tfm_michael; |
57 | struct crypto_tfm *rx_tfm_arc4; | ||
58 | struct crypto_tfm *rx_tfm_michael; | ||
57 | 59 | ||
58 | /* scratch buffers for virt_to_page() (crypto API) */ | 60 | /* scratch buffers for virt_to_page() (crypto API) */ |
59 | u8 rx_hdr[16], tx_hdr[16]; | 61 | u8 rx_hdr[16], tx_hdr[16]; |
@@ -85,15 +87,29 @@ static void *ieee80211_tkip_init(int key_idx) | |||
85 | 87 | ||
86 | priv->key_idx = key_idx; | 88 | priv->key_idx = key_idx; |
87 | 89 | ||
88 | priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); | 90 | priv->tx_tfm_arc4 = crypto_alloc_tfm("arc4", 0); |
89 | if (priv->tfm_arc4 == NULL) { | 91 | if (priv->tx_tfm_arc4 == NULL) { |
90 | printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " | 92 | printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " |
91 | "crypto API arc4\n"); | 93 | "crypto API arc4\n"); |
92 | goto fail; | 94 | goto fail; |
93 | } | 95 | } |
94 | 96 | ||
95 | priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); | 97 | priv->tx_tfm_michael = crypto_alloc_tfm("michael_mic", 0); |
96 | if (priv->tfm_michael == NULL) { | 98 | if (priv->tx_tfm_michael == NULL) { |
99 | printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " | ||
100 | "crypto API michael_mic\n"); | ||
101 | goto fail; | ||
102 | } | ||
103 | |||
104 | priv->rx_tfm_arc4 = crypto_alloc_tfm("arc4", 0); | ||
105 | if (priv->rx_tfm_arc4 == NULL) { | ||
106 | printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " | ||
107 | "crypto API arc4\n"); | ||
108 | goto fail; | ||
109 | } | ||
110 | |||
111 | priv->rx_tfm_michael = crypto_alloc_tfm("michael_mic", 0); | ||
112 | if (priv->rx_tfm_michael == NULL) { | ||
97 | printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " | 113 | printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " |
98 | "crypto API michael_mic\n"); | 114 | "crypto API michael_mic\n"); |
99 | goto fail; | 115 | goto fail; |
@@ -103,10 +119,14 @@ static void *ieee80211_tkip_init(int key_idx) | |||
103 | 119 | ||
104 | fail: | 120 | fail: |
105 | if (priv) { | 121 | if (priv) { |
106 | if (priv->tfm_michael) | 122 | if (priv->tx_tfm_michael) |
107 | crypto_free_tfm(priv->tfm_michael); | 123 | crypto_free_tfm(priv->tx_tfm_michael); |
108 | if (priv->tfm_arc4) | 124 | if (priv->tx_tfm_arc4) |
109 | crypto_free_tfm(priv->tfm_arc4); | 125 | crypto_free_tfm(priv->tx_tfm_arc4); |
126 | if (priv->rx_tfm_michael) | ||
127 | crypto_free_tfm(priv->rx_tfm_michael); | ||
128 | if (priv->rx_tfm_arc4) | ||
129 | crypto_free_tfm(priv->rx_tfm_arc4); | ||
110 | kfree(priv); | 130 | kfree(priv); |
111 | } | 131 | } |
112 | 132 | ||
@@ -116,10 +136,16 @@ static void *ieee80211_tkip_init(int key_idx) | |||
116 | static void ieee80211_tkip_deinit(void *priv) | 136 | static void ieee80211_tkip_deinit(void *priv) |
117 | { | 137 | { |
118 | struct ieee80211_tkip_data *_priv = priv; | 138 | struct ieee80211_tkip_data *_priv = priv; |
119 | if (_priv && _priv->tfm_michael) | 139 | if (_priv) { |
120 | crypto_free_tfm(_priv->tfm_michael); | 140 | if (_priv->tx_tfm_michael) |
121 | if (_priv && _priv->tfm_arc4) | 141 | crypto_free_tfm(_priv->tx_tfm_michael); |
122 | crypto_free_tfm(_priv->tfm_arc4); | 142 | if (_priv->tx_tfm_arc4) |
143 | crypto_free_tfm(_priv->tx_tfm_arc4); | ||
144 | if (_priv->rx_tfm_michael) | ||
145 | crypto_free_tfm(_priv->rx_tfm_michael); | ||
146 | if (_priv->rx_tfm_arc4) | ||
147 | crypto_free_tfm(_priv->rx_tfm_arc4); | ||
148 | } | ||
123 | kfree(priv); | 149 | kfree(priv); |
124 | } | 150 | } |
125 | 151 | ||
@@ -351,12 +377,25 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
351 | icv[2] = crc >> 16; | 377 | icv[2] = crc >> 16; |
352 | icv[3] = crc >> 24; | 378 | icv[3] = crc >> 24; |
353 | 379 | ||
354 | crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); | 380 | crypto_cipher_setkey(tkey->tx_tfm_arc4, rc4key, 16); |
355 | sg.page = virt_to_page(pos); | 381 | sg.page = virt_to_page(pos); |
356 | sg.offset = offset_in_page(pos); | 382 | sg.offset = offset_in_page(pos); |
357 | sg.length = len + 4; | 383 | sg.length = len + 4; |
358 | crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); | 384 | crypto_cipher_encrypt(tkey->tx_tfm_arc4, &sg, &sg, len + 4); |
385 | |||
386 | return 0; | ||
387 | } | ||
359 | 388 | ||
389 | /* | ||
390 | * deal with seq counter wrapping correctly. | ||
391 | * refer to timer_after() for jiffies wrapping handling | ||
392 | */ | ||
393 | static inline int tkip_replay_check(u32 iv32_n, u16 iv16_n, | ||
394 | u32 iv32_o, u16 iv16_o) | ||
395 | { | ||
396 | if ((s32)iv32_n - (s32)iv32_o < 0 || | ||
397 | (iv32_n == iv32_o && iv16_n <= iv16_o)) | ||
398 | return 1; | ||
360 | return 0; | 399 | return 0; |
361 | } | 400 | } |
362 | 401 | ||
@@ -414,8 +453,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
414 | iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24); | 453 | iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24); |
415 | pos += 8; | 454 | pos += 8; |
416 | 455 | ||
417 | if (iv32 < tkey->rx_iv32 || | 456 | if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) { |
418 | (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) { | ||
419 | if (net_ratelimit()) { | 457 | if (net_ratelimit()) { |
420 | printk(KERN_DEBUG "TKIP: replay detected: STA=" MAC_FMT | 458 | printk(KERN_DEBUG "TKIP: replay detected: STA=" MAC_FMT |
421 | " previous TSC %08x%04x received TSC " | 459 | " previous TSC %08x%04x received TSC " |
@@ -434,11 +472,11 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
434 | 472 | ||
435 | plen = skb->len - hdr_len - 12; | 473 | plen = skb->len - hdr_len - 12; |
436 | 474 | ||
437 | crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); | 475 | crypto_cipher_setkey(tkey->rx_tfm_arc4, rc4key, 16); |
438 | sg.page = virt_to_page(pos); | 476 | sg.page = virt_to_page(pos); |
439 | sg.offset = offset_in_page(pos); | 477 | sg.offset = offset_in_page(pos); |
440 | sg.length = plen + 4; | 478 | sg.length = plen + 4; |
441 | crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); | 479 | crypto_cipher_decrypt(tkey->rx_tfm_arc4, &sg, &sg, plen + 4); |
442 | 480 | ||
443 | crc = ~crc32_le(~0, pos, plen); | 481 | crc = ~crc32_le(~0, pos, plen); |
444 | icv[0] = crc; | 482 | icv[0] = crc; |
@@ -472,12 +510,12 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
472 | return keyidx; | 510 | return keyidx; |
473 | } | 511 | } |
474 | 512 | ||
475 | static int michael_mic(struct ieee80211_tkip_data *tkey, u8 * key, u8 * hdr, | 513 | static int michael_mic(struct crypto_tfm *tfm_michael, u8 * key, u8 * hdr, |
476 | u8 * data, size_t data_len, u8 * mic) | 514 | u8 * data, size_t data_len, u8 * mic) |
477 | { | 515 | { |
478 | struct scatterlist sg[2]; | 516 | struct scatterlist sg[2]; |
479 | 517 | ||
480 | if (tkey->tfm_michael == NULL) { | 518 | if (tfm_michael == NULL) { |
481 | printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); | 519 | printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); |
482 | return -1; | 520 | return -1; |
483 | } | 521 | } |
@@ -489,10 +527,10 @@ static int michael_mic(struct ieee80211_tkip_data *tkey, u8 * key, u8 * hdr, | |||
489 | sg[1].offset = offset_in_page(data); | 527 | sg[1].offset = offset_in_page(data); |
490 | sg[1].length = data_len; | 528 | sg[1].length = data_len; |
491 | 529 | ||
492 | crypto_digest_init(tkey->tfm_michael); | 530 | crypto_digest_init(tfm_michael); |
493 | crypto_digest_setkey(tkey->tfm_michael, key, 8); | 531 | crypto_digest_setkey(tfm_michael, key, 8); |
494 | crypto_digest_update(tkey->tfm_michael, sg, 2); | 532 | crypto_digest_update(tfm_michael, sg, 2); |
495 | crypto_digest_final(tkey->tfm_michael, mic); | 533 | crypto_digest_final(tfm_michael, mic); |
496 | 534 | ||
497 | return 0; | 535 | return 0; |
498 | } | 536 | } |
@@ -528,7 +566,7 @@ static void michael_mic_hdr(struct sk_buff *skb, u8 * hdr) | |||
528 | if (stype & IEEE80211_STYPE_QOS_DATA) { | 566 | if (stype & IEEE80211_STYPE_QOS_DATA) { |
529 | const struct ieee80211_hdr_3addrqos *qoshdr = | 567 | const struct ieee80211_hdr_3addrqos *qoshdr = |
530 | (struct ieee80211_hdr_3addrqos *)skb->data; | 568 | (struct ieee80211_hdr_3addrqos *)skb->data; |
531 | hdr[12] = le16_to_cpu(qoshdr->qos_ctl) & IEEE80211_QCTL_TID; | 569 | hdr[12] = qoshdr->qos_ctl & cpu_to_le16(IEEE80211_QCTL_TID); |
532 | } else | 570 | } else |
533 | hdr[12] = 0; /* priority */ | 571 | hdr[12] = 0; /* priority */ |
534 | 572 | ||
@@ -550,7 +588,7 @@ static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, | |||
550 | 588 | ||
551 | michael_mic_hdr(skb, tkey->tx_hdr); | 589 | michael_mic_hdr(skb, tkey->tx_hdr); |
552 | pos = skb_put(skb, 8); | 590 | pos = skb_put(skb, 8); |
553 | if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, | 591 | if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr, |
554 | skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) | 592 | skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) |
555 | return -1; | 593 | return -1; |
556 | 594 | ||
@@ -588,7 +626,7 @@ static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, | |||
588 | return -1; | 626 | return -1; |
589 | 627 | ||
590 | michael_mic_hdr(skb, tkey->rx_hdr); | 628 | michael_mic_hdr(skb, tkey->rx_hdr); |
591 | if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, | 629 | if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr, |
592 | skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) | 630 | skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) |
593 | return -1; | 631 | return -1; |
594 | if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { | 632 | if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { |
@@ -618,14 +656,18 @@ static int ieee80211_tkip_set_key(void *key, int len, u8 * seq, void *priv) | |||
618 | { | 656 | { |
619 | struct ieee80211_tkip_data *tkey = priv; | 657 | struct ieee80211_tkip_data *tkey = priv; |
620 | int keyidx; | 658 | int keyidx; |
621 | struct crypto_tfm *tfm = tkey->tfm_michael; | 659 | struct crypto_tfm *tfm = tkey->tx_tfm_michael; |
622 | struct crypto_tfm *tfm2 = tkey->tfm_arc4; | 660 | struct crypto_tfm *tfm2 = tkey->tx_tfm_arc4; |
661 | struct crypto_tfm *tfm3 = tkey->rx_tfm_michael; | ||
662 | struct crypto_tfm *tfm4 = tkey->rx_tfm_arc4; | ||
623 | 663 | ||
624 | keyidx = tkey->key_idx; | 664 | keyidx = tkey->key_idx; |
625 | memset(tkey, 0, sizeof(*tkey)); | 665 | memset(tkey, 0, sizeof(*tkey)); |
626 | tkey->key_idx = keyidx; | 666 | tkey->key_idx = keyidx; |
627 | tkey->tfm_michael = tfm; | 667 | tkey->tx_tfm_michael = tfm; |
628 | tkey->tfm_arc4 = tfm2; | 668 | tkey->tx_tfm_arc4 = tfm2; |
669 | tkey->rx_tfm_michael = tfm3; | ||
670 | tkey->rx_tfm_arc4 = tfm4; | ||
629 | if (len == TKIP_KEY_LEN) { | 671 | if (len == TKIP_KEY_LEN) { |
630 | memcpy(tkey->key, key, TKIP_KEY_LEN); | 672 | memcpy(tkey->key, key, TKIP_KEY_LEN); |
631 | tkey->key_set = 1; | 673 | tkey->key_set = 1; |
diff --git a/net/ieee80211/ieee80211_crypt_wep.c b/net/ieee80211/ieee80211_crypt_wep.c index 0ebf235f6939..b435b28857ed 100644 --- a/net/ieee80211/ieee80211_crypt_wep.c +++ b/net/ieee80211/ieee80211_crypt_wep.c | |||
@@ -32,7 +32,8 @@ struct prism2_wep_data { | |||
32 | u8 key[WEP_KEY_LEN + 1]; | 32 | u8 key[WEP_KEY_LEN + 1]; |
33 | u8 key_len; | 33 | u8 key_len; |
34 | u8 key_idx; | 34 | u8 key_idx; |
35 | struct crypto_tfm *tfm; | 35 | struct crypto_tfm *tx_tfm; |
36 | struct crypto_tfm *rx_tfm; | ||
36 | }; | 37 | }; |
37 | 38 | ||
38 | static void *prism2_wep_init(int keyidx) | 39 | static void *prism2_wep_init(int keyidx) |
@@ -44,13 +45,19 @@ static void *prism2_wep_init(int keyidx) | |||
44 | goto fail; | 45 | goto fail; |
45 | priv->key_idx = keyidx; | 46 | priv->key_idx = keyidx; |
46 | 47 | ||
47 | priv->tfm = crypto_alloc_tfm("arc4", 0); | 48 | priv->tx_tfm = crypto_alloc_tfm("arc4", 0); |
48 | if (priv->tfm == NULL) { | 49 | if (priv->tx_tfm == NULL) { |
49 | printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " | 50 | printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " |
50 | "crypto API arc4\n"); | 51 | "crypto API arc4\n"); |
51 | goto fail; | 52 | goto fail; |
52 | } | 53 | } |
53 | 54 | ||
55 | priv->rx_tfm = crypto_alloc_tfm("arc4", 0); | ||
56 | if (priv->rx_tfm == NULL) { | ||
57 | printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " | ||
58 | "crypto API arc4\n"); | ||
59 | goto fail; | ||
60 | } | ||
54 | /* start WEP IV from a random value */ | 61 | /* start WEP IV from a random value */ |
55 | get_random_bytes(&priv->iv, 4); | 62 | get_random_bytes(&priv->iv, 4); |
56 | 63 | ||
@@ -58,8 +65,10 @@ static void *prism2_wep_init(int keyidx) | |||
58 | 65 | ||
59 | fail: | 66 | fail: |
60 | if (priv) { | 67 | if (priv) { |
61 | if (priv->tfm) | 68 | if (priv->tx_tfm) |
62 | crypto_free_tfm(priv->tfm); | 69 | crypto_free_tfm(priv->tx_tfm); |
70 | if (priv->rx_tfm) | ||
71 | crypto_free_tfm(priv->rx_tfm); | ||
63 | kfree(priv); | 72 | kfree(priv); |
64 | } | 73 | } |
65 | return NULL; | 74 | return NULL; |
@@ -68,8 +77,12 @@ static void *prism2_wep_init(int keyidx) | |||
68 | static void prism2_wep_deinit(void *priv) | 77 | static void prism2_wep_deinit(void *priv) |
69 | { | 78 | { |
70 | struct prism2_wep_data *_priv = priv; | 79 | struct prism2_wep_data *_priv = priv; |
71 | if (_priv && _priv->tfm) | 80 | if (_priv) { |
72 | crypto_free_tfm(_priv->tfm); | 81 | if (_priv->tx_tfm) |
82 | crypto_free_tfm(_priv->tx_tfm); | ||
83 | if (_priv->rx_tfm) | ||
84 | crypto_free_tfm(_priv->rx_tfm); | ||
85 | } | ||
73 | kfree(priv); | 86 | kfree(priv); |
74 | } | 87 | } |
75 | 88 | ||
@@ -151,11 +164,11 @@ static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
151 | icv[2] = crc >> 16; | 164 | icv[2] = crc >> 16; |
152 | icv[3] = crc >> 24; | 165 | icv[3] = crc >> 24; |
153 | 166 | ||
154 | crypto_cipher_setkey(wep->tfm, key, klen); | 167 | crypto_cipher_setkey(wep->tx_tfm, key, klen); |
155 | sg.page = virt_to_page(pos); | 168 | sg.page = virt_to_page(pos); |
156 | sg.offset = offset_in_page(pos); | 169 | sg.offset = offset_in_page(pos); |
157 | sg.length = len + 4; | 170 | sg.length = len + 4; |
158 | crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); | 171 | crypto_cipher_encrypt(wep->tx_tfm, &sg, &sg, len + 4); |
159 | 172 | ||
160 | return 0; | 173 | return 0; |
161 | } | 174 | } |
@@ -194,11 +207,11 @@ static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) | |||
194 | /* Apply RC4 to data and compute CRC32 over decrypted data */ | 207 | /* Apply RC4 to data and compute CRC32 over decrypted data */ |
195 | plen = skb->len - hdr_len - 8; | 208 | plen = skb->len - hdr_len - 8; |
196 | 209 | ||
197 | crypto_cipher_setkey(wep->tfm, key, klen); | 210 | crypto_cipher_setkey(wep->rx_tfm, key, klen); |
198 | sg.page = virt_to_page(pos); | 211 | sg.page = virt_to_page(pos); |
199 | sg.offset = offset_in_page(pos); | 212 | sg.offset = offset_in_page(pos); |
200 | sg.length = plen + 4; | 213 | sg.length = plen + 4; |
201 | crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); | 214 | crypto_cipher_decrypt(wep->rx_tfm, &sg, &sg, plen + 4); |
202 | 215 | ||
203 | crc = ~crc32_le(~0, pos, plen); | 216 | crc = ~crc32_le(~0, pos, plen); |
204 | icv[0] = crc; | 217 | icv[0] = crc; |
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c index d60358d702d7..770704183a1b 100644 --- a/net/ieee80211/ieee80211_rx.c +++ b/net/ieee80211/ieee80211_rx.c | |||
@@ -1078,13 +1078,16 @@ static int ieee80211_parse_info_param(struct ieee80211_info_element | |||
1078 | 1078 | ||
1079 | while (length >= sizeof(*info_element)) { | 1079 | while (length >= sizeof(*info_element)) { |
1080 | if (sizeof(*info_element) + info_element->len > length) { | 1080 | if (sizeof(*info_element) + info_element->len > length) { |
1081 | IEEE80211_DEBUG_MGMT("Info elem: parse failed: " | 1081 | IEEE80211_ERROR("Info elem: parse failed: " |
1082 | "info_element->len + 2 > left : " | 1082 | "info_element->len + 2 > left : " |
1083 | "info_element->len+2=%zd left=%d, id=%d.\n", | 1083 | "info_element->len+2=%zd left=%d, id=%d.\n", |
1084 | info_element->len + | 1084 | info_element->len + |
1085 | sizeof(*info_element), | 1085 | sizeof(*info_element), |
1086 | length, info_element->id); | 1086 | length, info_element->id); |
1087 | return 1; | 1087 | /* We stop processing but don't return an error here |
1088 | * because some misbehaviour APs break this rule. ie. | ||
1089 | * Orinoco AP1000. */ | ||
1090 | break; | ||
1088 | } | 1091 | } |
1089 | 1092 | ||
1090 | switch (info_element->id) { | 1093 | switch (info_element->id) { |
diff --git a/net/ieee80211/ieee80211_tx.c b/net/ieee80211/ieee80211_tx.c index bf042139c7ab..ae254497ba3d 100644 --- a/net/ieee80211/ieee80211_tx.c +++ b/net/ieee80211/ieee80211_tx.c | |||
@@ -337,7 +337,7 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) | |||
337 | hdr_len += 2; | 337 | hdr_len += 2; |
338 | 338 | ||
339 | skb->priority = ieee80211_classify(skb); | 339 | skb->priority = ieee80211_classify(skb); |
340 | header.qos_ctl |= skb->priority & IEEE80211_QCTL_TID; | 340 | header.qos_ctl |= cpu_to_le16(skb->priority & IEEE80211_QCTL_TID); |
341 | } | 341 | } |
342 | header.frame_ctl = cpu_to_le16(fc); | 342 | header.frame_ctl = cpu_to_le16(fc); |
343 | 343 | ||
@@ -532,13 +532,6 @@ int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev) | |||
532 | return 0; | 532 | return 0; |
533 | } | 533 | } |
534 | 534 | ||
535 | if (ret == NETDEV_TX_BUSY) { | ||
536 | printk(KERN_ERR "%s: NETDEV_TX_BUSY returned; " | ||
537 | "driver should report queue full via " | ||
538 | "ieee_device->is_queue_full.\n", | ||
539 | ieee->dev->name); | ||
540 | } | ||
541 | |||
542 | ieee80211_txb_free(txb); | 535 | ieee80211_txb_free(txb); |
543 | } | 536 | } |
544 | 537 | ||