Fix hardware encryption (both WEP and AES) doesn't work with fragmentation. Firmware sends received packets with double sized ICV/MIC. --- ipw2200-1.0.5-chuyee/ipw2200.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff -puN ipw2200.c~hw-frag-rcv ipw2200.c --- ipw2200-1.0.5/ipw2200.c~hw-frag-rcv 2005-07-13 14:33:23.000000000 +0800 +++ ipw2200-1.0.5-chuyee/ipw2200.c 2005-07-13 14:33:59.000000000 +0800 @@ -7590,7 +7590,10 @@ static void ipw_rebuild_decrypted_skb(st 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; @@ -7599,7 +7602,10 @@ static void ipw_rebuild_decrypted_skb(st 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; _