diff options
author | Gertjan van Wingerde <gwingerde@gmail.com> | 2009-12-04 17:47:01 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-12-21 18:56:30 -0500 |
commit | 77e73d1849c860d22ebba8826ad162ccfda4c535 (patch) | |
tree | a4e238c8dd4f2e1c813619f092eca1668b947815 /drivers/net | |
parent | 1398d4580eff2656f3a808ec24744ce5a842db35 (diff) |
rt2x00: Further L2 padding fixes.
Fix a couple of more bugs in the L2 padding code:
1. Compute the amount of L2 padding correctly (in 3 places).
2. Trim the skb correctly when the L2 padding has been applied.
Also introduce a central macro the compute the L2 padding size.
Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
Acked-by: Ivo van Doorn <ivdoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 8 |
2 files changed, 11 insertions, 3 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 4d841c07c970..194dae01d0c3 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -104,6 +104,12 @@ | |||
104 | #define GET_DURATION_RES(__size, __rate)(((__size) * 8 * 10) % (__rate)) | 104 | #define GET_DURATION_RES(__size, __rate)(((__size) * 8 * 10) % (__rate)) |
105 | 105 | ||
106 | /* | 106 | /* |
107 | * Determine the number of L2 padding bytes required between the header and | ||
108 | * the payload. | ||
109 | */ | ||
110 | #define L2PAD_SIZE(__hdrlen) (-(__hdrlen) & 3) | ||
111 | |||
112 | /* | ||
107 | * Determine the alignment requirement, | 113 | * Determine the alignment requirement, |
108 | * to make sure the 802.11 payload is padded to a 4-byte boundrary | 114 | * to make sure the 802.11 payload is padded to a 4-byte boundrary |
109 | * we must determine the address of the payload and calculate the | 115 | * we must determine the address of the payload and calculate the |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index b8f09547787d..21d58769a1a7 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -181,7 +181,7 @@ void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length) | |||
181 | unsigned int frame_length = skb->len; | 181 | unsigned int frame_length = skb->len; |
182 | unsigned int header_align = ALIGN_SIZE(skb, 0); | 182 | unsigned int header_align = ALIGN_SIZE(skb, 0); |
183 | unsigned int payload_align = ALIGN_SIZE(skb, header_length); | 183 | unsigned int payload_align = ALIGN_SIZE(skb, header_length); |
184 | unsigned int l2pad = 4 - (payload_align - header_align); | 184 | unsigned int l2pad = L2PAD_SIZE(header_length); |
185 | 185 | ||
186 | if (header_align == payload_align) { | 186 | if (header_align == payload_align) { |
187 | /* | 187 | /* |
@@ -216,6 +216,7 @@ void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length) | |||
216 | memmove(skb->data + header_length + l2pad, | 216 | memmove(skb->data + header_length + l2pad, |
217 | skb->data + header_length + l2pad + payload_align, | 217 | skb->data + header_length + l2pad + payload_align, |
218 | frame_length - header_length); | 218 | frame_length - header_length); |
219 | skb_trim(skb, frame_length + l2pad); | ||
219 | skbdesc->flags |= SKBDESC_L2_PADDED; | 220 | skbdesc->flags |= SKBDESC_L2_PADDED; |
220 | } | 221 | } |
221 | } | 222 | } |
@@ -223,7 +224,7 @@ void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length) | |||
223 | void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length) | 224 | void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length) |
224 | { | 225 | { |
225 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 226 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); |
226 | unsigned int l2pad = 4 - (header_length & 3); | 227 | unsigned int l2pad = L2PAD_SIZE(header_length); |
227 | 228 | ||
228 | if (!l2pad || (skbdesc->flags & SKBDESC_L2_PADDED)) | 229 | if (!l2pad || (skbdesc->flags & SKBDESC_L2_PADDED)) |
229 | return; | 230 | return; |
@@ -346,7 +347,8 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
346 | * Header and alignment information. | 347 | * Header and alignment information. |
347 | */ | 348 | */ |
348 | txdesc->header_length = ieee80211_get_hdrlen_from_skb(entry->skb); | 349 | txdesc->header_length = ieee80211_get_hdrlen_from_skb(entry->skb); |
349 | txdesc->l2pad = ALIGN_SIZE(entry->skb, txdesc->header_length); | 350 | if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags)) |
351 | txdesc->l2pad = L2PAD_SIZE(txdesc->header_length); | ||
350 | 352 | ||
351 | /* | 353 | /* |
352 | * Check whether this frame is to be acked. | 354 | * Check whether this frame is to be acked. |