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.c24
1 files changed, 10 insertions, 14 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 8c6e29089216..28b8b6af4c42 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -363,7 +363,8 @@ ieee80211_rx_h_load_key(struct ieee80211_txrx_data *rx)
363 * we somehow allow the driver to tell us which key 363 * we somehow allow the driver to tell us which key
364 * the hardware used if this flag is set? 364 * the hardware used if this flag is set?
365 */ 365 */
366 if (!(rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV)) 366 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) &&
367 (rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED))
367 return TXRX_CONTINUE; 368 return TXRX_CONTINUE;
368 369
369 hdrlen = ieee80211_get_hdrlen(rx->fc); 370 hdrlen = ieee80211_get_hdrlen(rx->fc);
@@ -534,8 +535,8 @@ ieee80211_rx_h_wep_weak_iv_detection(struct ieee80211_txrx_data *rx)
534 return TXRX_CONTINUE; 535 return TXRX_CONTINUE;
535 536
536 /* Check for weak IVs, if hwaccel did not remove IV from the frame */ 537 /* Check for weak IVs, if hwaccel did not remove IV from the frame */
537 if ((rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) || 538 if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED) ||
538 !(rx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) 539 !(rx->u.rx.status->flag & RX_FLAG_DECRYPTED))
539 if (ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 540 if (ieee80211_wep_is_weak_iv(rx->skb, rx->key))
540 rx->sta->wep_weak_iv_count++; 541 rx->sta->wep_weak_iv_count++;
541 542
@@ -559,15 +560,14 @@ ieee80211_rx_h_wep_decrypt(struct ieee80211_txrx_data *rx)
559 return TXRX_DROP; 560 return TXRX_DROP;
560 } 561 }
561 562
562 if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED) || 563 if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) {
563 !(rx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) {
564 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) { 564 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) {
565 if (net_ratelimit()) 565 if (net_ratelimit())
566 printk(KERN_DEBUG "%s: RX WEP frame, decrypt " 566 printk(KERN_DEBUG "%s: RX WEP frame, decrypt "
567 "failed\n", rx->dev->name); 567 "failed\n", rx->dev->name);
568 return TXRX_DROP; 568 return TXRX_DROP;
569 } 569 }
570 } else if (rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) { 570 } else if (!(rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED)) {
571 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key); 571 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
572 /* remove ICV */ 572 /* remove ICV */
573 skb_trim(rx->skb, rx->skb->len - 4); 573 skb_trim(rx->skb, rx->skb->len - 4);
@@ -898,13 +898,10 @@ static ieee80211_txrx_result
898ieee80211_rx_h_drop_unencrypted(struct ieee80211_txrx_data *rx) 898ieee80211_rx_h_drop_unencrypted(struct ieee80211_txrx_data *rx)
899{ 899{
900 /* 900 /*
901 * Pass through unencrypted frames if the hardware might have 901 * Pass through unencrypted frames if the hardware has
902 * decrypted them already without telling us, but that can only 902 * decrypted them already.
903 * be true if we either didn't find a key or the found key is
904 * uploaded to the hardware.
905 */ 903 */
906 if ((rx->local->hw.flags & IEEE80211_HW_DEVICE_HIDES_WEP) && 904 if (rx->u.rx.status->flag & RX_FLAG_DECRYPTED)
907 (!rx->key || (rx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)))
908 return TXRX_CONTINUE; 905 return TXRX_CONTINUE;
909 906
910 /* Drop unencrypted frames if key is set. */ 907 /* Drop unencrypted frames if key is set. */
@@ -1212,8 +1209,7 @@ static void ieee80211_rx_michael_mic_report(struct net_device *dev,
1212 goto ignore; 1209 goto ignore;
1213 } 1210 }
1214 1211
1215 if ((rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) && 1212 if (rx->sdata->type == IEEE80211_IF_TYPE_AP && keyidx) {
1216 rx->sdata->type == IEEE80211_IF_TYPE_AP && keyidx) {
1217 /* AP with Pairwise keys support should never receive Michael 1213 /* AP with Pairwise keys support should never receive Michael
1218 * MIC errors for non-zero keyidx because these are reserved 1214 * MIC errors for non-zero keyidx because these are reserved
1219 * for group keys and only the AP is sending real multicast 1215 * for group keys and only the AP is sending real multicast