aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c46
1 files changed, 12 insertions, 34 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 6973d5c8e9e0..d5ce5d3649f3 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -419,7 +419,7 @@ ieee80211_rx_h_check(struct ieee80211_txrx_data *rx)
419 419
420 420
421static ieee80211_txrx_result 421static ieee80211_txrx_result
422ieee80211_rx_h_load_key(struct ieee80211_txrx_data *rx) 422ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
423{ 423{
424 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data; 424 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
425 int keyidx; 425 int keyidx;
@@ -456,7 +456,7 @@ ieee80211_rx_h_load_key(struct ieee80211_txrx_data *rx)
456 return TXRX_CONTINUE; 456 return TXRX_CONTINUE;
457 457
458 /* 458 /*
459 * No point in finding a key if the frame is neither 459 * No point in finding a key and decrypting if the frame is neither
460 * addressed to us nor a multicast frame. 460 * addressed to us nor a multicast frame.
461 */ 461 */
462 if (!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH)) 462 if (!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH))
@@ -507,42 +507,21 @@ ieee80211_rx_h_load_key(struct ieee80211_txrx_data *rx)
507 if (rx->key) { 507 if (rx->key) {
508 rx->key->tx_rx_count++; 508 rx->key->tx_rx_count++;
509 /* TODO: add threshold stuff again */ 509 /* TODO: add threshold stuff again */
510 } 510 } else {
511
512 return TXRX_CONTINUE;
513}
514
515static ieee80211_txrx_result
516ieee80211_rx_h_wep_weak_iv_detection(struct ieee80211_txrx_data *rx)
517{
518 if (!rx->sta || !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
519 (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA ||
520 !rx->key || rx->key->conf.alg != ALG_WEP ||
521 !(rx->flags & IEEE80211_TXRXD_RXRA_MATCH))
522 return TXRX_CONTINUE;
523
524 /* Check for weak IVs, if hwaccel did not remove IV from the frame */
525 if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED) ||
526 !(rx->u.rx.status->flag & RX_FLAG_DECRYPTED))
527 if (ieee80211_wep_is_weak_iv(rx->skb, rx->key))
528 rx->sta->wep_weak_iv_count++;
529
530 return TXRX_CONTINUE;
531}
532
533static ieee80211_txrx_result
534ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
535{
536 if (!(rx->fc & IEEE80211_FCTL_PROTECTED))
537 return TXRX_CONTINUE;
538
539 if (!rx->key) {
540 if (net_ratelimit()) 511 if (net_ratelimit())
541 printk(KERN_DEBUG "%s: RX protected frame," 512 printk(KERN_DEBUG "%s: RX protected frame,"
542 " but have no key\n", rx->dev->name); 513 " but have no key\n", rx->dev->name);
543 return TXRX_DROP; 514 return TXRX_DROP;
544 } 515 }
545 516
517 /* Check for weak IVs if possible */
518 if (rx->sta && rx->key->conf.alg == ALG_WEP &&
519 ((rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) &&
520 (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED) ||
521 !(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) &&
522 ieee80211_wep_is_weak_iv(rx->skb, rx->key))
523 rx->sta->wep_weak_iv_count++;
524
546 switch (rx->key->conf.alg) { 525 switch (rx->key->conf.alg) {
547 case ALG_WEP: 526 case ALG_WEP:
548 return ieee80211_crypto_wep_decrypt(rx); 527 return ieee80211_crypto_wep_decrypt(rx);
@@ -551,6 +530,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
551 case ALG_CCMP: 530 case ALG_CCMP:
552 return ieee80211_crypto_ccmp_decrypt(rx); 531 return ieee80211_crypto_ccmp_decrypt(rx);
553 case ALG_NONE: 532 case ALG_NONE:
533 WARN_ON(1);
554 return TXRX_CONTINUE; 534 return TXRX_CONTINUE;
555 } 535 }
556 536
@@ -1348,8 +1328,6 @@ ieee80211_rx_handler ieee80211_rx_handlers[] =
1348 ieee80211_rx_h_if_stats, 1328 ieee80211_rx_h_if_stats,
1349 ieee80211_rx_h_passive_scan, 1329 ieee80211_rx_h_passive_scan,
1350 ieee80211_rx_h_check, 1330 ieee80211_rx_h_check,
1351 ieee80211_rx_h_load_key,
1352 ieee80211_rx_h_wep_weak_iv_detection,
1353 ieee80211_rx_h_decrypt, 1331 ieee80211_rx_h_decrypt,
1354 ieee80211_rx_h_sta_process, 1332 ieee80211_rx_h_sta_process,
1355 ieee80211_rx_h_defragment, 1333 ieee80211_rx_h_defragment,