* SKB truesize bug
@ 2008-11-11 17:25 Stephen Hemminger
2008-11-12 1:37 ` Herbert Xu
0 siblings, 1 reply; 4+ messages in thread
From: Stephen Hemminger @ 2008-11-11 17:25 UTC (permalink / raw)
To: Herbert Xu; +Cc: netdev
Is this bug fixed? is it in the 2.6.26.8 kernel?
http://bugzilla.kernel.org/show_bug.cgi?id=10996
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH][IPv4] UFO: prevent generation of chained skb
@ 2008-04-28 12:13 Kostya B
2008-04-29 10:27 ` David Miller
0 siblings, 1 reply; 4+ messages in thread
From: Kostya B @ 2008-04-28 12:13 UTC (permalink / raw)
To: netdev
[IPv4] UFO: prevent generation of chained skb destined to UFO device
Problem:
ip_append_data() could wrongly generate a chained skb for devices which support UFO.
When sk_write_queue is not empty (e.g. MSG_MORE), __instead__ of appending data
into the next nr_frag of the queued skb, a new chained skb is created.
I would normally assume UFO device should get data in nr_frags and not in frag_list.
Later the udp4_hwcsum_outgoing() resets csum to NONE and skb_gso_segment() has oops.
Proposal:
1. Even length is less than mtu, employ ip_ufo_append_data() and append data to the __existed__ skb in the sk_write_queue.
2. ip_ufo_append_data() is fixed due to a wrong manipulation of peek-ing and later enqueue-ing of the same skb.
Now, enqueuing is always performed, because on error the further ip_flush_pending_frames() would release the queued skb.
Signed-off-by: Kostya B
---
net/ipv4/ip_output.c | 25 +++++++++----------------
1 file changed, 9 insertions(+), 16 deletions(-)
diff -uprN -X linux-2.6.25-git11/Documentation/dontdiff linux-2.6.25-git11/net/ipv4/ip_output.c linux-2.6.25-git11-fix/net/ipv4/ip_output.c
--- linux-2.6.25-git11/net/ipv4/ip_output.c 2008-04-28 12:22:00.000000000 +0300
+++ linux-2.6.25-git11-fix/net/ipv4/ip_output.c 2008-04-28 14:02:41.000000000 +0300
@@ -753,23 +753,15 @@ static inline int ip_ufo_append_data(str
skb->ip_summed = CHECKSUM_PARTIAL;
skb->csum = 0;
sk->sk_sndmsg_off = 0;
+
+ /* specify the length of each IP datagram fragment*/
+ skb_shinfo(skb)->gso_size = mtu - fragheaderlen;
+ skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
+ __skb_queue_tail(&sk->sk_write_queue, skb);
}
- err = skb_append_datato_frags(sk,skb, getfrag, from,
+ return skb_append_datato_frags(sk,skb, getfrag, from,
(length - transhdrlen));
- if (!err) {
- /* specify the length of each IP datagram fragment*/
- skb_shinfo(skb)->gso_size = mtu - fragheaderlen;
- skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
- __skb_queue_tail(&sk->sk_write_queue, skb);
-
- return 0;
- }
- /* There is not enough support do UFO ,
- * so follow normal path
- */
- kfree_skb(skb);
- return err;
}
/*
@@ -863,8 +855,9 @@ int ip_append_data(struct sock *sk,
csummode = CHECKSUM_PARTIAL;
inet->cork.length += length;
- if (((length> mtu) && (sk->sk_protocol == IPPROTO_UDP)) &&
- (rt->u.dst.dev->features & NETIF_F_UFO)) {
+ if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) &&
+ (sk->sk_protocol == IPPROTO_UDP) &&
+ (rt->u.dst.dev->features & NETIF_F_UFO)) {
err = ip_ufo_append_data(sk, getfrag, from, length, hh_len,
fragheaderlen, transhdrlen, mtu,
---
_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH][IPv4] UFO: prevent generation of chained skb
2008-04-28 12:13 [PATCH][IPv4] UFO: prevent generation of chained skb Kostya B
@ 2008-04-29 10:27 ` David Miller
2008-04-29 12:07 ` Herbert Xu
0 siblings, 1 reply; 4+ messages in thread
From: David Miller @ 2008-04-29 10:27 UTC (permalink / raw)
To: bkostya; +Cc: netdev, herbert
From: Kostya B <bkostya@hotmail.com>
Date: Mon, 28 Apr 2008 12:13:27 +0000
>
> [IPv4] UFO: prevent generation of chained skb destined to UFO device
>
> Problem:
> ip_append_data() could wrongly generate a chained skb for devices which support UFO.
> When sk_write_queue is not empty (e.g. MSG_MORE), __instead__ of appending data
> into the next nr_frag of the queued skb, a new chained skb is created.
>
> I would normally assume UFO device should get data in nr_frags and not in frag_list.
> Later the udp4_hwcsum_outgoing() resets csum to NONE and skb_gso_segment() has oops.
>
> Proposal:
> 1. Even length is less than mtu, employ ip_ufo_append_data() and append data to the __existed__ skb in the sk_write_queue.
>
> 2. ip_ufo_append_data() is fixed due to a wrong manipulation of peek-ing and later enqueue-ing of the same skb.
> Now, enqueuing is always performed, because on error the further ip_flush_pending_frames() would release the queued skb.
>
>
> Signed-off-by: Kostya B
Mostly this looks fine to me.
Herbert, can you take a quick look at this?
Thanks.
>
> ---
>
> net/ipv4/ip_output.c | 25 +++++++++----------------
> 1 file changed, 9 insertions(+), 16 deletions(-)
>
> diff -uprN -X linux-2.6.25-git11/Documentation/dontdiff linux-2.6.25-git11/net/ipv4/ip_output.c linux-2.6.25-git11-fix/net/ipv4/ip_output.c
> --- linux-2.6.25-git11/net/ipv4/ip_output.c 2008-04-28 12:22:00.000000000 +0300
> +++ linux-2.6.25-git11-fix/net/ipv4/ip_output.c 2008-04-28 14:02:41.000000000 +0300
> @@ -753,23 +753,15 @@ static inline int ip_ufo_append_data(str
> skb->ip_summed = CHECKSUM_PARTIAL;
> skb->csum = 0;
> sk->sk_sndmsg_off = 0;
> +
> + /* specify the length of each IP datagram fragment*/
> + skb_shinfo(skb)->gso_size = mtu - fragheaderlen;
> + skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
> + __skb_queue_tail(&sk->sk_write_queue, skb);
> }
>
> - err = skb_append_datato_frags(sk,skb, getfrag, from,
> + return skb_append_datato_frags(sk,skb, getfrag, from,
> (length - transhdrlen));
> - if (!err) {
> - /* specify the length of each IP datagram fragment*/
> - skb_shinfo(skb)->gso_size = mtu - fragheaderlen;
> - skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
> - __skb_queue_tail(&sk->sk_write_queue, skb);
> -
> - return 0;
> - }
> - /* There is not enough support do UFO ,
> - * so follow normal path
> - */
> - kfree_skb(skb);
> - return err;
> }
>
> /*
> @@ -863,8 +855,9 @@ int ip_append_data(struct sock *sk,
> csummode = CHECKSUM_PARTIAL;
>
> inet->cork.length += length;
> - if (((length> mtu) && (sk->sk_protocol == IPPROTO_UDP)) &&
> - (rt->u.dst.dev->features & NETIF_F_UFO)) {
> + if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) &&
> + (sk->sk_protocol == IPPROTO_UDP) &&
> + (rt->u.dst.dev->features & NETIF_F_UFO)) {
>
> err = ip_ufo_append_data(sk, getfrag, from, length, hh_len,
> fragheaderlen, transhdrlen, mtu,
> ---
> _________________________________________________________________
> Explore the seven wonders of the world
> http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH][IPv4] UFO: prevent generation of chained skb
2008-04-29 10:27 ` David Miller
@ 2008-04-29 12:07 ` Herbert Xu
2008-04-30 5:37 ` David Miller
0 siblings, 1 reply; 4+ messages in thread
From: Herbert Xu @ 2008-04-29 12:07 UTC (permalink / raw)
To: David Miller; +Cc: bkostya, netdev
On Tue, Apr 29, 2008 at 03:27:14AM -0700, David Miller wrote:
>
> Mostly this looks fine to me.
>
> Herbert, can you take a quick look at this?
Yep looks good to me too.
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Thanks,
--
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH][IPv4] UFO: prevent generation of chained skb
2008-04-29 12:07 ` Herbert Xu
@ 2008-04-30 5:37 ` David Miller
2008-11-20 11:59 ` SKB truesize bug Kostya B
0 siblings, 1 reply; 4+ messages in thread
From: David Miller @ 2008-04-30 5:37 UTC (permalink / raw)
To: herbert; +Cc: bkostya, netdev
From: Herbert Xu <herbert@gondor.apana.org.au>
Date: Tue, 29 Apr 2008 20:07:13 +0800
> On Tue, Apr 29, 2008 at 03:27:14AM -0700, David Miller wrote:
> >
> > Mostly this looks fine to me.
> >
> > Herbert, can you take a quick look at this?
>
> Yep looks good to me too.
>
> Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Applied, thanks everyone.
K, I had to fix up your patch by hand because your email
client corrupted the patch, changing tabs into space
characters, and things of that nature.
Also, your patch description had many lines longer than
80 columns, which I had to fix up as well.
I'm happy to do this before you are aware of the problem,
like this time, but now that I've made you aware I will
push back future patches which have these errors.
Thank you.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-11-20 12:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-11 17:25 SKB truesize bug Stephen Hemminger
2008-11-12 1:37 ` Herbert Xu
-- strict thread matches above, loose matches on Subject: below --
2008-04-28 12:13 [PATCH][IPv4] UFO: prevent generation of chained skb Kostya B
2008-04-29 10:27 ` David Miller
2008-04-29 12:07 ` Herbert Xu
2008-04-30 5:37 ` David Miller
2008-11-20 11:59 ` SKB truesize bug Kostya B
2008-11-20 12:03 ` 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).