aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorGertjan van Wingerde <gwingerde@gmail.com>2009-12-04 17:47:01 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-12-21 18:56:30 -0500
commit77e73d1849c860d22ebba8826ad162ccfda4c535 (patch)
treea4e238c8dd4f2e1c813619f092eca1668b947815 /drivers/net
parent1398d4580eff2656f3a808ec24744ce5a842db35 (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.h6
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c8
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)
223void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length) 224void 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.