aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2007-09-26 09:19:40 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:53:13 -0400
commit4f0d18e26f8bc4c6507b69aa0080d0fae807c990 (patch)
treeb9ef529b35cec6a81b8b7868c80088a30aa6bc9d /net/mac80211/rx.c
parentb2e7771e556917cc301a3308561f49b2b2272c07 (diff)
[PATCH] mac80211: consolidate decryption
Currently, we run through all three crypto algorithms for each received frame even though we have previously determined which key we have and as such already know which algorithm will be used. Change it to invoke only the needed function. Also move the WEP decrypt handler to wep.c so that fewer functions need to be non-static. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c40
1 files changed, 17 insertions, 23 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index a0dfafb4f38b..453ccab060a2 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -662,36 +662,32 @@ ieee80211_rx_h_wep_weak_iv_detection(struct ieee80211_txrx_data *rx)
662} 662}
663 663
664static ieee80211_txrx_result 664static ieee80211_txrx_result
665ieee80211_rx_h_wep_decrypt(struct ieee80211_txrx_data *rx) 665ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
666{ 666{
667 if ((rx->key && rx->key->conf.alg != ALG_WEP) || 667 if (!(rx->fc & IEEE80211_FCTL_PROTECTED))
668 !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
669 ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA &&
670 ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
671 (rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH)))
672 return TXRX_CONTINUE; 668 return TXRX_CONTINUE;
673 669
674 if (!rx->key) { 670 if (!rx->key) {
675 if (net_ratelimit()) 671 if (net_ratelimit())
676 printk(KERN_DEBUG "%s: RX WEP frame, but no key set\n", 672 printk(KERN_DEBUG "%s: RX protected frame,"
677 rx->dev->name); 673 " but have no key\n", rx->dev->name);
678 return TXRX_DROP; 674 return TXRX_DROP;
679 } 675 }
680 676
681 if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) { 677 switch (rx->key->conf.alg) {
682 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) { 678 case ALG_WEP:
683 if (net_ratelimit()) 679 return ieee80211_crypto_wep_decrypt(rx);
684 printk(KERN_DEBUG "%s: RX WEP frame, decrypt " 680 case ALG_TKIP:
685 "failed\n", rx->dev->name); 681 return ieee80211_crypto_tkip_decrypt(rx);
686 return TXRX_DROP; 682 case ALG_CCMP:
687 } 683 return ieee80211_crypto_ccmp_decrypt(rx);
688 } else if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED)) { 684 case ALG_NONE:
689 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key); 685 return TXRX_CONTINUE;
690 /* remove ICV */
691 skb_trim(rx->skb, rx->skb->len - 4);
692 } 686 }
693 687
694 return TXRX_CONTINUE; 688 /* not reached */
689 WARN_ON(1);
690 return TXRX_DROP;
695} 691}
696 692
697static inline struct ieee80211_fragment_entry * 693static inline struct ieee80211_fragment_entry *
@@ -1371,10 +1367,8 @@ ieee80211_rx_handler ieee80211_rx_handlers[] =
1371 ieee80211_rx_h_check, 1367 ieee80211_rx_h_check,
1372 ieee80211_rx_h_load_key, 1368 ieee80211_rx_h_load_key,
1373 ieee80211_rx_h_sta_process, 1369 ieee80211_rx_h_sta_process,
1374 ieee80211_rx_h_ccmp_decrypt,
1375 ieee80211_rx_h_tkip_decrypt,
1376 ieee80211_rx_h_wep_weak_iv_detection, 1370 ieee80211_rx_h_wep_weak_iv_detection,
1377 ieee80211_rx_h_wep_decrypt, 1371 ieee80211_rx_h_decrypt,
1378 ieee80211_rx_h_defragment, 1372 ieee80211_rx_h_defragment,
1379 ieee80211_rx_h_ps_poll, 1373 ieee80211_rx_h_ps_poll,
1380 ieee80211_rx_h_michael_mic_verify, 1374 ieee80211_rx_h_michael_mic_verify,