All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gertjan van Wingerde <gwingerde@gmail.com>
To: Ivo van Doorn <ivdoorn@gmail.com>
Cc: users@rt2x00.serialmonkey.com, linux-wireless@vger.kernel.org,
	Benoit Papillault <benoit.papillault@free.fr>
Subject: Re: [PATCH v3 3/4] rt2x00: Reorganize L2 padding inserting function.
Date: Tue, 01 Dec 2009 22:05:00 +0100	[thread overview]
Message-ID: <4B1584FC.5020804@gmail.com> (raw)
In-Reply-To: <200912012013.47692.IvDoorn@gmail.com>

On 12/01/09 20:13, Ivo van Doorn wrote:
> On Monday 30 November 2009, Gertjan van Wingerde wrote:
>> Simplify the rt2x00queue_insert_l2pad function by handling the alignment
>> operations one by one. Do not special case special circumstances.
>> Basically first perform header alignment, and then perform payload alignment
>> (if any payload does exist). This results in a properly aligned skb.
>>
>> The end result is better readable code, with better results, as now L2 padding
>> is inserted only when a payload is actually present in the frame.
>>
>> Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
>> ---
>>  drivers/net/wireless/rt2x00/rt2x00queue.c |   60 +++++++++++++----------------
>>  1 files changed, 27 insertions(+), 33 deletions(-)
>>
>> diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
>> index 719f4ae..7452fa8 100644
>> --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
>> +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
>> @@ -177,45 +177,38 @@ void rt2x00queue_align_payload(struct sk_buff *skb, unsigned int header_length)
>>  
>>  void rt2x00queue_insert_l2pad(struct sk_buff *skb, unsigned int header_length)
>>  {
>> -	unsigned int frame_length = skb->len;
>> +	unsigned int payload_length = skb->len - header_length;
>>  	unsigned int header_align = ALIGN_SIZE(skb, 0);
>>  	unsigned int payload_align = ALIGN_SIZE(skb, header_length);
>>  	unsigned int l2pad = L2PAD_SIZE(header_length);
>>  
>> -	if (header_align == payload_align) {
>> -		/*
>> -		 * Both header and payload must be moved the same
>> -		 * amount of bytes to align them properly. This means
>> -		 * we don't use the L2 padding but just move the entire
>> -		 * frame.
>> -		 */
>> -		rt2x00queue_align_frame(skb);
>> -	} else if (!payload_align) {
>> -		/*
>> -		 * Simple L2 padding, only the header needs to be moved,
>> -		 * the payload is already properly aligned.
>> -		 */
>> -		skb_push(skb, header_align);
>> -		memmove(skb->data, skb->data + header_align, header_length);
>> -	} else {
>> -		/*
>> -		 *
>> -		 * Complicated L2 padding, both header and payload need
>> -		 * to be moved. By default we only move to the start
>> -		 * of the buffer, so our header alignment needs to be
>> -		 * increased if there is not enough room for the header
>> -		 * to be moved.
>> -		 */
>> -		if (payload_align > header_align)
>> -			header_align += 4;
>> +	/*
>> +	 * Adjust the header alignment if the payload needs to be moved more
>> +	 * than the header.
>> +	 */
>> +	if (payload_align > header_align)
>> +		header_align += 4;
>> +
>> +	/* There is nothing to do if no alignment is needed */
>> +	if (!header_align)
>> +		return;
>>  
>> -		skb_push(skb, header_align);
>> -		memmove(skb->data, skb->data + header_align, header_length);
>> +	/* Reserve the amount of space needed in front of the frame */
>> +	skb_push(skb, header_align);
>> +
>> +	/*
>> +	 * Move the header.
>> +	 */
>> +	memmove(skb->data, skb->data + header_align, header_length);
>> +
>> +	/* Move the payload, if present and if required */
>> +	if (payload_length && payload_align)
>>  		memmove(skb->data + header_length + l2pad,
>>  			skb->data + header_length + l2pad + payload_align,
>> -			frame_length - header_length);
>> -		skb_trim(skb, frame_length + l2pad);
>> -	}
>> +			payload_length);
>> +
>> +	/* Trim the skb to the correct size */
>> +	skb_trim(skb, header_length + l2pad + payload_length);
>>  }
>>  
>>  void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length)
>> @@ -343,7 +336,8 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
>>  	 * Header and alignment information.
>>  	 */
>>  	txdesc->header_length = ieee80211_get_hdrlen_from_skb(entry->skb);
>> -	if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags))
>> +	if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags) &&
>> +	    (entry->skb->len > txdesc->header_length))
>>  		txdesc->l2pad = L2PAD_SIZE(txdesc->header_length);
> 
> This check is a bit unclear, are you not simply checking for ieee80211_is_data() or
> ieee80211_is_data_present()?
> 

Well, this check is more based on the actual contents of the skb, where ieee802111_is_data
and ieee80211_is_data_present only indicate, based on the frame_control field, whether any
data should be present.

Personally, I think this is safer, as it matches the actual data at hand. But I guess if
absolutely necessary ieee80211_is_data_present can be used as well.

---
Gertjan.

  reply	other threads:[~2009-12-01 21:04 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-30 21:08 [PATCH v3 0/4] Further L2 padding fixes Gertjan van Wingerde
2009-11-30 21:08 ` [PATCH v3 1/4] rt2x00: " Gertjan van Wingerde
2009-11-30 21:08   ` [PATCH v3 2/4] rt2x00: Remove SKBDESC_L2_PADDED flag Gertjan van Wingerde
2009-11-30 21:08     ` [PATCH v3 3/4] rt2x00: Reorganize L2 padding inserting function Gertjan van Wingerde
2009-11-30 21:08       ` [PATCH v3 4/4] rt2x00: Only remove L2 padding in received frames if there is payload Gertjan van Wingerde
2009-12-01 19:16         ` Ivo van Doorn
2009-12-01 21:08           ` Gertjan van Wingerde
2009-12-01 21:57             ` Ivo van Doorn
2009-12-01 22:09               ` Gertjan van Wingerde
2009-12-02  7:52                 ` Ivo Van Doorn
2009-12-01 21:58         ` Ivo van Doorn
2009-12-01 19:13       ` [PATCH v3 3/4] rt2x00: Reorganize L2 padding inserting function Ivo van Doorn
2009-12-01 21:05         ` Gertjan van Wingerde [this message]
2009-12-01 21:58       ` Ivo van Doorn
2009-12-01 19:07     ` [PATCH v3 2/4] rt2x00: Remove SKBDESC_L2_PADDED flag Ivo van Doorn
2009-12-01 19:07   ` [PATCH v3 1/4] rt2x00: Further L2 padding fixes Ivo van Doorn
2009-11-30 23:46 ` [rt2x00-users] [PATCH v3 0/4] " Benoit PAPILLAULT
2009-12-01 21:30   ` Gertjan van Wingerde
2009-12-02  9:54     ` Benoit PAPILLAULT
2009-12-03  9:32       ` Gertjan van Wingerde
2009-12-03 18:36         ` Ivo van Doorn
2009-12-03 21:36           ` Benoit PAPILLAULT
2009-12-04  7:53             ` Ivo Van Doorn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B1584FC.5020804@gmail.com \
    --to=gwingerde@gmail.com \
    --cc=benoit.papillault@free.fr \
    --cc=ivdoorn@gmail.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=users@rt2x00.serialmonkey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.