aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wpa.c
diff options
context:
space:
mode:
authorCedric Izoard <Cedric.Izoard@ceva-dsp.com>2015-03-17 06:47:33 -0400
committerJohannes Berg <johannes.berg@intel.com>2015-03-17 07:34:26 -0400
commitc7ef38e0ccca25050efed56a35df2e1e93c0b469 (patch)
tree041949d9e29d3f54936ccbd8de9b5c449ad5036e /net/mac80211/wpa.c
parent8a4988d13734f9340ba8b34467d8ea09347b55d5 (diff)
mac80211: Get IV len from key conf and not cipher scheme
When a key is installed using a cipher scheme, set a new internal key flag (KEY_FLAG_CIPHER_SCHEME) on it, to allow distinguishing such keys more easily. In particular, use this flag on the TX path instead of testing the sta->cipher_scheme pointer, as the station is NULL for broad-/multicast message, and use the key's iv_len instead of the cipher scheme information. Signed-off-by: Cedric Izoard <cedric.izoard@ceva-dsp.com> [add missing documentation, rewrite commit message] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/wpa.c')
-rw-r--r--net/mac80211/wpa.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 75de6fac40d1..9d63d93c836e 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -780,9 +780,8 @@ ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
780 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 780 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
781 struct ieee80211_key *key = tx->key; 781 struct ieee80211_key *key = tx->key;
782 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 782 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
783 const struct ieee80211_cipher_scheme *cs = key->sta->cipher_scheme;
784 int hdrlen; 783 int hdrlen;
785 u8 *pos; 784 u8 *pos, iv_len = key->conf.iv_len;
786 785
787 if (info->control.hw_key && 786 if (info->control.hw_key &&
788 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) { 787 !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
@@ -790,14 +789,14 @@ ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
790 return TX_CONTINUE; 789 return TX_CONTINUE;
791 } 790 }
792 791
793 if (unlikely(skb_headroom(skb) < cs->hdr_len && 792 if (unlikely(skb_headroom(skb) < iv_len &&
794 pskb_expand_head(skb, cs->hdr_len, 0, GFP_ATOMIC))) 793 pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC)))
795 return TX_DROP; 794 return TX_DROP;
796 795
797 hdrlen = ieee80211_hdrlen(hdr->frame_control); 796 hdrlen = ieee80211_hdrlen(hdr->frame_control);
798 797
799 pos = skb_push(skb, cs->hdr_len); 798 pos = skb_push(skb, iv_len);
800 memmove(pos, pos + cs->hdr_len, hdrlen); 799 memmove(pos, pos + iv_len, hdrlen);
801 800
802 return TX_CONTINUE; 801 return TX_CONTINUE;
803} 802}
@@ -1217,7 +1216,7 @@ ieee80211_crypto_hw_encrypt(struct ieee80211_tx_data *tx)
1217 if (!info->control.hw_key) 1216 if (!info->control.hw_key)
1218 return TX_DROP; 1217 return TX_DROP;
1219 1218
1220 if (tx->key->sta->cipher_scheme) { 1219 if (tx->key->flags & KEY_FLAG_CIPHER_SCHEME) {
1221 res = ieee80211_crypto_cs_encrypt(tx, skb); 1220 res = ieee80211_crypto_cs_encrypt(tx, skb);
1222 if (res != TX_CONTINUE) 1221 if (res != TX_CONTINUE)
1223 return res; 1222 return res;