diff options
author | Cedric Izoard <Cedric.Izoard@ceva-dsp.com> | 2015-03-17 06:47:33 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2015-03-17 07:34:26 -0400 |
commit | c7ef38e0ccca25050efed56a35df2e1e93c0b469 (patch) | |
tree | 041949d9e29d3f54936ccbd8de9b5c449ad5036e /net/mac80211/wpa.c | |
parent | 8a4988d13734f9340ba8b34467d8ea09347b55d5 (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.c | 13 |
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; |