aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ipw2200.c
diff options
context:
space:
mode:
authorZhu Yi <yi.zhu@intel.com>2005-07-13 13:24:51 -0400
committerJames Ketrenos <jketreno@linux.intel.com>2005-11-07 18:50:14 -0500
commita2d73e60bb018da74ba508943c79c83659f3a883 (patch)
treef657e3b54634c5b05f100ed8df7f47a8f3b2ff39 /drivers/net/wireless/ipw2200.c
parentafbf30a2b78cac38e6ddae10a73063943b4783ee (diff)
Fix hardware encryption (both WEP and AES) doesn't work with fragmentation.
Firmware sends received packets with double sized ICV/MIC. Signed-off-by: James Ketrenos <jketreno@linux.intel.com>
Diffstat (limited to 'drivers/net/wireless/ipw2200.c')
-rw-r--r--drivers/net/wireless/ipw2200.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index 1b6f0277a3e9..8f7e9ac37f86 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -7587,7 +7587,10 @@ static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
7587 memmove(skb->data + IEEE80211_3ADDR_LEN, 7587 memmove(skb->data + IEEE80211_3ADDR_LEN,
7588 skb->data + IEEE80211_3ADDR_LEN + 8, 7588 skb->data + IEEE80211_3ADDR_LEN + 8,
7589 skb->len - IEEE80211_3ADDR_LEN - 8); 7589 skb->len - IEEE80211_3ADDR_LEN - 8);
7590 skb_trim(skb, skb->len - 8); /* MIC */ 7590 if (fc & IEEE80211_FCTL_MOREFRAGS)
7591 skb_trim(skb, skb->len - 16); /* 2*MIC */
7592 else
7593 skb_trim(skb, skb->len - 8); /* MIC */
7591 break; 7594 break;
7592 case SEC_LEVEL_2: 7595 case SEC_LEVEL_2:
7593 break; 7596 break;
@@ -7596,7 +7599,10 @@ static void ipw_rebuild_decrypted_skb(struct ipw_priv *priv,
7596 memmove(skb->data + IEEE80211_3ADDR_LEN, 7599 memmove(skb->data + IEEE80211_3ADDR_LEN,
7597 skb->data + IEEE80211_3ADDR_LEN + 4, 7600 skb->data + IEEE80211_3ADDR_LEN + 4,
7598 skb->len - IEEE80211_3ADDR_LEN - 4); 7601 skb->len - IEEE80211_3ADDR_LEN - 4);
7599 skb_trim(skb, skb->len - 4); /* ICV */ 7602 if (fc & IEEE80211_FCTL_MOREFRAGS)
7603 skb_trim(skb, skb->len - 8); /* 2*ICV */
7604 else
7605 skb_trim(skb, skb->len - 4); /* ICV */
7600 break; 7606 break;
7601 case SEC_LEVEL_0: 7607 case SEC_LEVEL_0:
7602 break; 7608 break;