netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* 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

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).