diff options
author | Ivo van Doorn <ivdoorn@gmail.com> | 2009-04-26 10:08:30 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-05-06 15:14:49 -0400 |
commit | 9eb4e21e289beba9cfe34f24920eee83c144e62f (patch) | |
tree | ab2da2b66f308e94159742b52a126787a8e2d1a5 /drivers/net/wireless/rt2x00/rt2x00crypto.c | |
parent | bbb33881ae5bfe4197a005dc03b29b7dcc07fa28 (diff) |
rt2x00: Move iv_len into tx descriptor data
By placing the iv_len into the tx descriptor data and
by passing this data to the crypto IV handlers we can
save multiple calls to ieee80211_get_hdrlen_from_skb()
and some if-statements when copying/removing the IV data
from the outgoing frame.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00crypto.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00crypto.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00crypto.c b/drivers/net/wireless/rt2x00/rt2x00crypto.c index 0b41845d9543..ae31581372c0 100644 --- a/drivers/net/wireless/rt2x00/rt2x00crypto.c +++ b/drivers/net/wireless/rt2x00/rt2x00crypto.c | |||
@@ -66,6 +66,7 @@ void rt2x00crypto_create_tx_descriptor(struct queue_entry *entry, | |||
66 | 66 | ||
67 | txdesc->key_idx = hw_key->hw_key_idx; | 67 | txdesc->key_idx = hw_key->hw_key_idx; |
68 | txdesc->iv_offset = ieee80211_get_hdrlen_from_skb(entry->skb); | 68 | txdesc->iv_offset = ieee80211_get_hdrlen_from_skb(entry->skb); |
69 | txdesc->iv_len = hw_key->iv_len; | ||
69 | 70 | ||
70 | if (!(hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) | 71 | if (!(hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) |
71 | __set_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags); | 72 | __set_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags); |
@@ -103,34 +104,32 @@ unsigned int rt2x00crypto_tx_overhead(struct rt2x00_dev *rt2x00dev, | |||
103 | return overhead; | 104 | return overhead; |
104 | } | 105 | } |
105 | 106 | ||
106 | void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, unsigned int iv_len) | 107 | void rt2x00crypto_tx_copy_iv(struct sk_buff *skb, struct txentry_desc *txdesc) |
107 | { | 108 | { |
108 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 109 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); |
109 | unsigned int header_length = ieee80211_get_hdrlen_from_skb(skb); | ||
110 | 110 | ||
111 | if (unlikely(!iv_len)) | 111 | if (unlikely(!txdesc->iv_len)) |
112 | return; | 112 | return; |
113 | 113 | ||
114 | /* Copy IV/EIV data */ | 114 | /* Copy IV/EIV data */ |
115 | memcpy(skbdesc->iv, skb->data + header_length, iv_len); | 115 | memcpy(skbdesc->iv, skb->data + txdesc->iv_offset, txdesc->iv_len); |
116 | } | 116 | } |
117 | 117 | ||
118 | void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, unsigned int iv_len) | 118 | void rt2x00crypto_tx_remove_iv(struct sk_buff *skb, struct txentry_desc *txdesc) |
119 | { | 119 | { |
120 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 120 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); |
121 | unsigned int header_length = ieee80211_get_hdrlen_from_skb(skb); | ||
122 | 121 | ||
123 | if (unlikely(!iv_len)) | 122 | if (unlikely(!txdesc->iv_len)) |
124 | return; | 123 | return; |
125 | 124 | ||
126 | /* Copy IV/EIV data */ | 125 | /* Copy IV/EIV data */ |
127 | memcpy(skbdesc->iv, skb->data + header_length, iv_len); | 126 | memcpy(skbdesc->iv, skb->data + txdesc->iv_offset, txdesc->iv_len); |
128 | 127 | ||
129 | /* Move ieee80211 header */ | 128 | /* Move ieee80211 header */ |
130 | memmove(skb->data + iv_len, skb->data, header_length); | 129 | memmove(skb->data + txdesc->iv_len, skb->data, txdesc->iv_offset); |
131 | 130 | ||
132 | /* Pull buffer to correct size */ | 131 | /* Pull buffer to correct size */ |
133 | skb_pull(skb, iv_len); | 132 | skb_pull(skb, txdesc->iv_len); |
134 | 133 | ||
135 | /* IV/EIV data has officially be stripped */ | 134 | /* IV/EIV data has officially be stripped */ |
136 | skbdesc->flags |= FRAME_DESC_IV_STRIPPED; | 135 | skbdesc->flags |= FRAME_DESC_IV_STRIPPED; |