]> err.no Git - linux-2.6/commitdiff
Fix hardware encryption (both WEP and AES) doesn't work with fragmentation.
authorZhu Yi <yi.zhu@intel.com>
Wed, 13 Jul 2005 17:24:51 +0000 (12:24 -0500)
committerJames Ketrenos <jketreno@linux.intel.com>
Mon, 7 Nov 2005 23:50:14 +0000 (17:50 -0600)
Firmware sends received packets with double sized ICV/MIC.

Signed-off-by: James Ketrenos <jketreno@linux.intel.com>
drivers/net/wireless/ipw2200.c

index 1b6f0277a3e9baf9308cd94c6f4c655417800cd9..8f7e9ac37f86b57c19ab7af80b20c781a39cb2ec 100644 (file)
@@ -7587,7 +7587,10 @@ static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
                memmove(skb->data + IEEE80211_3ADDR_LEN,
                        skb->data + IEEE80211_3ADDR_LEN + 8,
                        skb->len - IEEE80211_3ADDR_LEN - 8);
-               skb_trim(skb, skb->len - 8);    /* MIC */
+               if (fc & IEEE80211_FCTL_MOREFRAGS)
+                       skb_trim(skb, skb->len - 16);   /* 2*MIC */
+               else
+                       skb_trim(skb, skb->len - 8);    /* MIC */
                break;
        case SEC_LEVEL_2:
                break;
@@ -7596,7 +7599,10 @@ static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
                memmove(skb->data + IEEE80211_3ADDR_LEN,
                        skb->data + IEEE80211_3ADDR_LEN + 4,
                        skb->len - IEEE80211_3ADDR_LEN - 4);
-               skb_trim(skb, skb->len - 4);    /* ICV */
+               if (fc & IEEE80211_FCTL_MOREFRAGS)
+                       skb_trim(skb, skb->len - 8);    /* 2*ICV */
+               else
+                       skb_trim(skb, skb->len - 4);    /* ICV */
                break;
        case SEC_LEVEL_0:
                break;