mac80211: fix network header breakage during encryption
authorArik Nemtsov <arik@wizery.com>
Wed, 22 Oct 2014 09:33:45 +0000 (12:33 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 23 Oct 2014 18:40:01 +0000 (20:40 +0200)
When an IV is generated, only the MAC header is moved back. The network
header location remains the same relative to the skb head, as the new IV
is using headroom space that was reserved in advance.

Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/wep.c
net/mac80211/wpa.c

index 9181fb6d643786788abfed37d3ed3d5130e3cb3e..a4220e92f0cc20c0feb04c307f6ed72097f4fe3a 100644 (file)
@@ -111,8 +111,6 @@ static u8 *ieee80211_wep_add_iv(struct ieee80211_local *local,
            (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
                return newhdr + hdrlen;
 
-       skb_set_network_header(skb, skb_network_offset(skb) +
-                                   IEEE80211_WEP_IV_LEN);
        ieee80211_wep_get_iv(local, keylen, keyidx, newhdr + hdrlen);
        return newhdr + hdrlen;
 }
index 983527a4c1aba22c4ae6dc43c113ed1df9f1eb9c..12398fde02e87e7c7eb0eba1430e72287c6bb6f8 100644 (file)
@@ -209,8 +209,6 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
 
        pos = skb_push(skb, IEEE80211_TKIP_IV_LEN);
        memmove(pos, pos + IEEE80211_TKIP_IV_LEN, hdrlen);
-       skb_set_network_header(skb, skb_network_offset(skb) +
-                                   IEEE80211_TKIP_IV_LEN);
        pos += hdrlen;
 
        /* the HW only needs room for the IV, but not the actual IV */
@@ -434,8 +432,6 @@ static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
 
        pos = skb_push(skb, IEEE80211_CCMP_HDR_LEN);
        memmove(pos, pos + IEEE80211_CCMP_HDR_LEN, hdrlen);
-       skb_set_network_header(skb, skb_network_offset(skb) +
-                                   IEEE80211_CCMP_HDR_LEN);
 
        /* the HW only needs room for the IV, but not the actual IV */
        if (info->control.hw_key &&
@@ -575,7 +571,6 @@ ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
 
        pos = skb_push(skb, cs->hdr_len);
        memmove(pos, pos + cs->hdr_len, hdrlen);
-       skb_set_network_header(skb, skb_network_offset(skb) + cs->hdr_len);
 
        return TX_CONTINUE;
 }