aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorArik Nemtsov <arik@wizery.com>2014-10-22 05:33:45 -0400
committerJohannes Berg <johannes.berg@intel.com>2014-10-23 14:40:01 -0400
commit452218d9fd22505ed790e95b460b0f40cebb95a0 (patch)
tree77dfca537a74f8a472044e858069fd852b8f2f06 /net/mac80211
parenta7f3a768289858f03f5c1866639c8b476c1b8ebc (diff)
mac80211: fix network header breakage during encryption
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>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/wep.c2
-rw-r--r--net/mac80211/wpa.c5
2 files changed, 0 insertions, 7 deletions
diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c
index 9181fb6d6437..a4220e92f0cc 100644
--- a/net/mac80211/wep.c
+++ b/net/mac80211/wep.c
@@ -111,8 +111,6 @@ static u8 *ieee80211_wep_add_iv(struct ieee80211_local *local,
111 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) 111 (info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE))
112 return newhdr + hdrlen; 112 return newhdr + hdrlen;
113 113
114 skb_set_network_header(skb, skb_network_offset(skb) +
115 IEEE80211_WEP_IV_LEN);
116 ieee80211_wep_get_iv(local, keylen, keyidx, newhdr + hdrlen); 114 ieee80211_wep_get_iv(local, keylen, keyidx, newhdr + hdrlen);
117 return newhdr + hdrlen; 115 return newhdr + hdrlen;
118} 116}
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 983527a4c1ab..12398fde02e8 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -209,8 +209,6 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
209 209
210 pos = skb_push(skb, IEEE80211_TKIP_IV_LEN); 210 pos = skb_push(skb, IEEE80211_TKIP_IV_LEN);
211 memmove(pos, pos + IEEE80211_TKIP_IV_LEN, hdrlen); 211 memmove(pos, pos + IEEE80211_TKIP_IV_LEN, hdrlen);
212 skb_set_network_header(skb, skb_network_offset(skb) +
213 IEEE80211_TKIP_IV_LEN);
214 pos += hdrlen; 212 pos += hdrlen;
215 213
216 /* the HW only needs room for the IV, but not the actual IV */ 214 /* 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)
434 432
435 pos = skb_push(skb, IEEE80211_CCMP_HDR_LEN); 433 pos = skb_push(skb, IEEE80211_CCMP_HDR_LEN);
436 memmove(pos, pos + IEEE80211_CCMP_HDR_LEN, hdrlen); 434 memmove(pos, pos + IEEE80211_CCMP_HDR_LEN, hdrlen);
437 skb_set_network_header(skb, skb_network_offset(skb) +
438 IEEE80211_CCMP_HDR_LEN);
439 435
440 /* the HW only needs room for the IV, but not the actual IV */ 436 /* the HW only needs room for the IV, but not the actual IV */
441 if (info->control.hw_key && 437 if (info->control.hw_key &&
@@ -575,7 +571,6 @@ ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
575 571
576 pos = skb_push(skb, cs->hdr_len); 572 pos = skb_push(skb, cs->hdr_len);
577 memmove(pos, pos + cs->hdr_len, hdrlen); 573 memmove(pos, pos + cs->hdr_len, hdrlen);
578 skb_set_network_header(skb, skb_network_offset(skb) + cs->hdr_len);
579 574
580 return TX_CONTINUE; 575 return TX_CONTINUE;
581} 576}