On Tue, 2008-09-30 at 13:22 +0200, Felix Fietkau wrote: > Free up 2 bytes in skb->cb to be used for multi-rate retry. > Move iv_len and icv_len initialization into key alloc. > > Signed-off-by: Felix Fietkau <nbd@xxxxxxxxxxx> The mac80211 changes look good to me, the driver stuff I cannot really judge. > > --- a/include/net/mac80211.h > +++ b/include/net/mac80211.h > @@ -337,8 +337,6 @@ > 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 @@ > */ > struct ieee80211_key_conf { > enum ieee80211_key_alg alg; > + u8 icv_len; > + u8 iv_len; > u8 hw_key_idx; > u8 flags; > s8 keyidx; > --- a/drivers/net/wireless/b43/xmit.c > +++ b/drivers/net/wireless/b43/xmit.c > @@ -252,7 +252,7 @@ > } > > /* 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 @@ > 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); > } > --- a/drivers/net/wireless/b43legacy/xmit.c > +++ b/drivers/net/wireless/b43legacy/xmit.c > @@ -243,7 +243,7 @@ > > 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 @@ > 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 { > --- a/net/mac80211/wep.c > +++ b/net/mac80211/wep.c > @@ -313,9 +313,6 @@ > { > 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; > --- a/net/mac80211/wpa.c > +++ b/net/mac80211/wpa.c > @@ -152,9 +152,6 @@ > 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 @@ > 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 " > --- a/drivers/net/wireless/ath5k/base.c > +++ b/drivers/net/wireless/ath5k/base.c > @@ -1164,7 +1164,7 @@ > > 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, > --- a/drivers/net/wireless/ath9k/xmit.c > +++ b/drivers/net/wireless/ath9k/xmit.c > @@ -237,7 +237,7 @@ > > 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; > --- a/drivers/net/wireless/rt2x00/rt2x00crypto.c > +++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c > @@ -56,10 +56,10 @@ > * 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) > --- a/drivers/net/wireless/rt2x00/rt2x00queue.c > +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c > @@ -374,7 +374,7 @@ > 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 @@ > * 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 > --- a/net/mac80211/key.c > +++ b/net/mac80211/key.c > @@ -281,6 +281,20 @@ > 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); >
Attachment:
signature.asc
Description: This is a digitally signed message part