diff options
| author | Felix Fietkau <nbd@openwrt.org> | 2008-10-05 18:02:48 +0200 | 
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-10-06 18:14:57 -0400 | 
| commit | 76708dee382a69b2f9d0e50f413f99fefb2dc509 (patch) | |
| tree | ce1b8014520c08641423a0842d03eace38da0c4e | |
| parent | 417bd25ac4c6f76c8aafe8a584f3620f4a936b72 (diff) | |
mac80211: free up 2 bytes in skb->cb
Free up 2 bytes in skb->cb to be used for multi-rate retry later.
Move iv_len and icv_len initialization into key alloc.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/ath5k/base.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/ath9k/xmit.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/xmit.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/b43legacy/xmit.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00crypto.c | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 7 | ||||
| -rw-r--r-- | include/net/mac80211.h | 4 | ||||
| -rw-r--r-- | net/mac80211/key.c | 14 | ||||
| -rw-r--r-- | net/mac80211/wep.c | 3 | ||||
| -rw-r--r-- | net/mac80211/wpa.c | 6 | 
10 files changed, 29 insertions, 21 deletions
| diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index c151588aa484..47be49acf55e 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c @@ -1188,7 +1188,7 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)  	if (info->control.hw_key) {  		keyidx = info->control.hw_key->hw_key_idx; -		pktlen += info->control.icv_len; +		pktlen += info->control.hw_key->icv_len;  	}  	ret = ah->ah_setup_tx_desc(ah, ds, pktlen,  		ieee80211_get_hdrlen_from_skb(skb), AR5K_PKT_TYPE_NORMAL, diff --git a/drivers/net/wireless/ath9k/xmit.c b/drivers/net/wireless/ath9k/xmit.c index bdcb9e1799ca..3a4757942b3f 100644 --- a/drivers/net/wireless/ath9k/xmit.c +++ b/drivers/net/wireless/ath9k/xmit.c @@ -237,7 +237,7 @@ static int ath_tx_prepare(struct ath_softc *sc,  	if (tx_info->control.hw_key) {  		txctl->keyix = tx_info->control.hw_key->hw_key_idx; -		txctl->frmlen += tx_info->control.icv_len; +		txctl->frmlen += tx_info->control.hw_key->icv_len;  		if (tx_info->control.hw_key->alg == ALG_WEP)  			txctl->keytype = ATH9K_KEY_TYPE_WEP; diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 5e0b71c3ad02..e0749c0074cc 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c @@ -252,7 +252,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		}  		/* Hardware appends ICV. */ -		plcp_fragment_len += info->control.icv_len; +		plcp_fragment_len += info->control.hw_key->icv_len;  		key_idx = b43_kidx_to_fw(dev, key_idx);  		mac_ctl |= (key_idx << B43_TXH_MAC_KEYIDX_SHIFT) & @@ -260,7 +260,7 @@ int b43_generate_txhdr(struct b43_wldev *dev,  		mac_ctl |= (key->algorithm << B43_TXH_MAC_KEYALG_SHIFT) &  			   B43_TXH_MAC_KEYALG;  		wlhdr_len = ieee80211_hdrlen(fctl); -		iv_len = min((size_t) info->control.iv_len, +		iv_len = min((size_t) info->control.hw_key->iv_len,  			     ARRAY_SIZE(txhdr->iv));  		memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);  	} diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c index 6835064758fb..a894169411c5 100644 --- a/drivers/net/wireless/b43legacy/xmit.c +++ b/drivers/net/wireless/b43legacy/xmit.c @@ -243,7 +243,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,  		if (key->enabled) {  			/* Hardware appends ICV. */ -			plcp_fragment_len += info->control.icv_len; +			plcp_fragment_len += info->control.hw_key->icv_len;  			key_idx = b43legacy_kidx_to_fw(dev, key_idx);  			mac_ctl |= (key_idx << B43legacy_TX4_MAC_KEYIDX_SHIFT) & @@ -252,7 +252,7 @@ static int generate_txhdr_fw3(struct b43legacy_wldev *dev,  				   B43legacy_TX4_MAC_KEYALG_SHIFT) &  				   B43legacy_TX4_MAC_KEYALG;  			wlhdr_len = ieee80211_hdrlen(wlhdr->frame_control); -			iv_len = min((size_t)info->control.iv_len, +			iv_len = min((size_t)info->control.hw_key->iv_len,  				     ARRAY_SIZE(txhdr->iv));  			memcpy(txhdr->iv, ((u8 *)wlhdr) + wlhdr_len, iv_len);  		} else { diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c index e1448cfa9444..5a858e5106c4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00crypto.c +++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c @@ -56,10 +56,10 @@ unsigned int rt2x00crypto_tx_overhead(struct ieee80211_tx_info *tx_info)  	 * note that these lengths should only be added when  	 * mac80211 does not generate it.  	 */ -	overhead += tx_info->control.icv_len; +	overhead += key->icv_len;  	if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) -		overhead += tx_info->control.iv_len; +		overhead += key->iv_len;  	if (!(key->flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {  		if (key->alg == ALG_TKIP) diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index b7f4fe8fba6e..1676ac484790 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c @@ -374,7 +374,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)  	struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX);  	struct txentry_desc txdesc;  	struct skb_frame_desc *skbdesc; -	unsigned int iv_len = IEEE80211_SKB_CB(skb)->control.iv_len; +	unsigned int iv_len;  	if (unlikely(rt2x00queue_full(queue)))  		return -EINVAL; @@ -410,8 +410,11 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb)  	 * the frame so we can provide it to the driver seperately.  	 */  	if (test_bit(ENTRY_TXD_ENCRYPT, &txdesc.flags) && -	    !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags)) +	    !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc.flags) && +		(IEEE80211_SKB_CB(skb)->control.hw_key != NULL)) { +		iv_len = IEEE80211_SKB_CB(skb)->control.hw_key->iv_len;  		rt2x00crypto_tx_remove_iv(skb, iv_len); +	}  	/*  	 * It could be possible that the queue was corrupted and this diff --git a/include/net/mac80211.h b/include/net/mac80211.h index f5f5b1ff1584..feb3be81dfa6 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -337,8 +337,6 @@ struct ieee80211_tx_info {  			unsigned long jiffies;  			s8 rts_cts_rate_idx, alt_retry_rate_idx;  			u8 retry_limit; -			u8 icv_len; -			u8 iv_len;  		} control;  		struct {  			u64 ampdu_ack_map; @@ -635,6 +633,8 @@ enum ieee80211_key_flags {   */  struct ieee80211_key_conf {  	enum ieee80211_key_alg alg; +	u8 icv_len; +	u8 iv_len;  	u8 hw_key_idx;  	u8 flags;  	s8 keyidx; diff --git a/net/mac80211/key.c b/net/mac80211/key.c index 57afcd38cd9e..a5b06fe71980 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c @@ -281,6 +281,20 @@ struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,  	key->conf.alg = alg;  	key->conf.keyidx = idx;  	key->conf.keylen = key_len; +	switch (alg) { +	case ALG_WEP: +		key->conf.iv_len = WEP_IV_LEN; +		key->conf.icv_len = WEP_ICV_LEN; +		break; +	case ALG_TKIP: +		key->conf.iv_len = TKIP_IV_LEN; +		key->conf.icv_len = TKIP_ICV_LEN; +		break; +	case ALG_CCMP: +		key->conf.iv_len = CCMP_HDR_LEN; +		key->conf.icv_len = CCMP_MIC_LEN; +		break; +	}  	memcpy(key->conf.key, key_data, key_len);  	INIT_LIST_HEAD(&key->list);  	INIT_LIST_HEAD(&key->todo); diff --git a/net/mac80211/wep.c b/net/mac80211/wep.c index 376c84987e4f..f0e2d3ecb5c4 100644 --- a/net/mac80211/wep.c +++ b/net/mac80211/wep.c @@ -313,9 +313,6 @@ static int wep_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)  {  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -	info->control.iv_len = WEP_IV_LEN; -	info->control.icv_len = WEP_ICV_LEN; -  	if (!(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) {  		if (ieee80211_wep_encrypt(tx->local, skb, tx->key))  			return -1; diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index 37ae9a959f63..6db649480e8f 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c @@ -152,9 +152,6 @@ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)  	int len, tail;  	u8 *pos; -	info->control.icv_len = TKIP_ICV_LEN; -	info->control.iv_len = TKIP_IV_LEN; -  	if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&  	    !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {  		/* hwaccel - with no need for preallocated room for IV/ICV */ @@ -374,9 +371,6 @@ static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)  	u8 *pos, *pn;  	int i; -	info->control.icv_len = CCMP_MIC_LEN; -	info->control.iv_len = CCMP_HDR_LEN; -  	if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&  	    !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {  		/* hwaccel - with no need for preallocated room for CCMP " | 
