netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [1/3] IRDA: Create new field tx_extra in skbuff
@ 2008-11-10 16:09 Alex Villací­s Lasso
  2008-11-10 16:35 ` Evgeniy Polyakov
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Alex Villací­s Lasso @ 2008-11-10 16:09 UTC (permalink / raw)
  To: irda-users, netdev

[-- Attachment #1: Type: text/plain, Size: 1955 bytes --]

For background, see regression report at 
http://bugzilla.kernel.org/show_bug.cgi?id=11795

This patchset attempts to fix a regression that broke the irda stack as 
a result of the qdisc patches merged in 2.6.27.

The previous patchsets attempt to fix the clobbering of the irda 
information by storing it within the data payload itself, as an 
additional header. For this, space has been allocated via skb_pull (?!) 
and later, skb_reserve(). The problem with this approach is that  we do 
not have a guarantee that all skbuffs that are processed in the irda 
stack are actually allocated with functions that reserve the required 
space for the irda metadata, especially in the tx route. In addition, 
this approach mixes the payload data with metadata that should not be 
transmitted at all, which is a bit disorganized.

This is the first of 3 patches that try a different approach. Instead of 
allocating an additional "header" within the data buffer itself, it 
introduces a new field within the skbuff, named tx_extra. This field 
should be used for passing data from the higher layers that is required 
for the drivers to transmit the packet correctly, and formalizes the 
previous usage of the cb field by the irda stack. The only issue I see 
is that every single skbuff carries an additional 32 bytes which are not 
put to any use in other stacks (for now). I was thinking about a pointer 
field to on-the-fly allocated data, but that means messing around with 
the skbuff allocation functions, the cloning functions (involving 
deciding how to behave on cloning), etc. This way is simpler to understand.

This patch and the other two that follow fix the issue for me under 
2.6.28-rc3. Please comment on this, as I am messing around with the 
skbuff structure, which potentially affects all network stacks.

Signed-off-by: Alex Villacís Lasso <a_villacis@palosanto.com>

-- 
perl -e '$x=2.4;print sprintf("%.0f + %.0f = %.0f\n",$x,$x,$x+$x);'


[-- Attachment #2: 0001-irda-Introduce_skbuff_tx_extra.patch --]
[-- Type: text/x-patch, Size: 1237 bytes --]

diff -ur linux-2.6.28-rc3-git-orig/include/linux/skbuff.h linux-2.6.28-rc3-git/include/linux/skbuff.h
--- linux-2.6.28-rc3-git-orig/include/linux/skbuff.h	2008-11-06 19:44:23.000000000 -0500
+++ linux-2.6.28-rc3-git/include/linux/skbuff.h	2008-11-08 11:47:46.000000000 -0500
@@ -279,6 +279,14 @@
 	 */
 	char			cb[48];
 
+	/*
+	 * Additional space for layer-specific variables that need to
+	 * survive past dev_queue_xmit(), which clobbers cb above.
+	 * Intended for use by drivers that need additional layer-specific
+	 * parameters in order to transmit a packet properly.
+	 */
+	char			tx_extra[32];
+
 	unsigned int		len,
 				data_len;
 	__u16			mac_len,
diff -ur linux-2.6.28-rc3-git-orig/include/net/irda/irda_device.h linux-2.6.28-rc3-git/include/net/irda/irda_device.h
--- linux-2.6.28-rc3-git-orig/include/net/irda/irda_device.h	2008-11-06 19:44:23.000000000 -0500
+++ linux-2.6.28-rc3-git/include/net/irda/irda_device.h	2008-11-08 11:55:00.000000000 -0500
@@ -230,6 +230,12 @@
 
 void irda_setup_dma(int channel, dma_addr_t buffer, int count, int mode);
 
+
+static inline struct irda_skb_cb *irda_get_skb_cb(struct sk_buff *skb)
+{
+	return (struct irda_skb_cb *)skb->tx_extra;
+}
+
 /*
  * Function irda_get_mtt (skb)
  *

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2008-11-11  6:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-10 16:09 [1/3] IRDA: Create new field tx_extra in skbuff Alex Villací­s Lasso
2008-11-10 16:35 ` Evgeniy Polyakov
2008-11-10 16:55   ` Evgeniy Polyakov
     [not found]     ` <20081110165544.GB19804-i6C2adt8DTjR7s880joybQ@public.gmane.org>
2008-11-11  1:00       ` Samuel Ortiz
2008-11-11  6:22         ` [irda-users] " Evgeniy Polyakov
2008-11-10 16:47 ` Samuel Ortiz
2008-11-10 20:51 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).