netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Hannes Frederic Sowa <hannes@stressinduktion.org>
To: Jiri Pirko <jiri@resnulli.us>,
	netdev@vger.kernel.org, yoshfuji@linux-ipv6.org,
	davem@davemloft.net, kuznet@ms2.inr.ac.ru, jmorris@namei.org,
	kaber@trash.net, herbert@gondor.apana.org.au,
	eric.dumazet@gmail.com
Subject: Re: [PATCH] ipv6: udp packets following an UFO enqueued packet need also be handled by UFO
Date: Wed, 2 Oct 2013 01:25:34 +0200	[thread overview]
Message-ID: <20131001232534.GM10771@order.stressinduktion.org> (raw)
In-Reply-To: <20131001214721.GJ10771@order.stressinduktion.org>

On Tue, Oct 01, 2013 at 11:47:21PM +0200, Hannes Frederic Sowa wrote:
> The strange thing is that if I don't do the IPV6_MTU setsockopt I don't
> get an oops.

This is incorrect, it just depends on the size of the writes and on the
interface mtu.

> IPv4 seems to work without problems, too.

I also get kernel oopses from IPv4 now, too.


So, skb_is_gso is not accurate enough in the output and we have to check if we
already started to append to skb frags. The following diff does resolve this
issue in both the IPv4 and IPv6 non-page-append output path but I am not
confident if it is correct:

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 6d56840..3565450 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1308,6 +1308,11 @@ static inline int skb_pagelen(const struct sk_buff *skb)
 	return len + skb_headlen(skb);
 }
 
+static inline bool skb_has_frags(const struct sk_buff *skb)
+{
+	return skb_shinfo(skb)->nr_frags;
+}
+
 /**
  * __skb_fill_page_desc - initialise a paged fragment in an skb
  * @skb: buffer containing fragment to be initialised
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 7d8357b..8dc3d8d 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -836,7 +836,7 @@ static int __ip_append_data(struct sock *sk,
 		csummode = CHECKSUM_PARTIAL;
 
 	cork->length += length;
-	if (((length > mtu) || (skb && skb_is_gso(skb))) &&
+	if (((length > mtu) || (skb && skb_has_frags(skb))) &&
 	    (sk->sk_protocol == IPPROTO_UDP) &&
 	    (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) {
 		err = ip_ufo_append_data(sk, queue, getfrag, from, length,
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index a54c45c..ded4f6f 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1227,7 +1227,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
 	skb = skb_peek_tail(&sk->sk_write_queue);
 	cork->length += length;
 	if (((length > mtu) ||
-	     (skb && skb_is_gso(skb))) &&
+	     (skb && skb_has_frags(skb))) &&
 	    (sk->sk_protocol == IPPROTO_UDP) &&
 	    (rt->dst.dev->features & NETIF_F_UFO)) {
 		err = ip6_ufo_append_data(sk, getfrag, from, length,

Greetings,

  Hannes

  reply	other threads:[~2013-10-01 23:25 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-21  4:27 [PATCH] ipv6: udp packets following an UFO enqueued packet need also be handled by UFO Hannes Frederic Sowa
2013-09-23  0:43 ` Hannes Frederic Sowa
2013-09-24 15:43 ` David Miller
2013-09-30 11:43 ` Jiri Pirko
2013-09-30 17:23   ` Hannes Frederic Sowa
2013-10-01 10:58     ` Jiri Pirko
2013-10-01 12:09       ` Hannes Frederic Sowa
2013-10-01 12:32         ` Hannes Frederic Sowa
2013-10-01 21:47           ` Hannes Frederic Sowa
2013-10-01 23:25             ` Hannes Frederic Sowa [this message]
2013-10-02  8:58               ` Jiri Pirko
2013-10-02 10:41                 ` Eric Dumazet
2013-10-02 12:12                   ` Hannes Frederic Sowa
2013-10-02 13:03                     ` Hannes Frederic Sowa
2013-10-02 15:14                       ` Eric Dumazet
2013-10-02 16:27                         ` Neterion and UFO handling [was: Re: [PATCH] ipv6: udp packets following an UFO enqueued packet need also be handled by UFO] Hannes Frederic Sowa
2013-10-07 16:53                           ` Hannes Frederic Sowa
2013-10-07 17:19                             ` Jon Mason
2013-10-07 17:27                               ` Hannes Frederic Sowa
2013-10-08  8:07                           ` Jon Mason
2013-10-08 13:00                             ` Eric Dumazet
2013-10-08 14:53                             ` Hannes Frederic Sowa
2013-10-17  4:45                               ` Hannes Frederic Sowa
2013-10-18  7:52                                 ` Jiri Pirko
2013-10-23 16:35                                 ` Jon Mason
2013-10-23 18:15                                   ` Hannes Frederic Sowa
2013-10-02 10:33               ` [PATCH] ipv6: udp packets following an UFO enqueued packet need also be handled by UFO Jiri Pirko
2013-10-02 12:01                 ` Hannes Frederic Sowa
2013-10-02 11:20               ` Jiri Pirko
2013-10-02 11:53                 ` Eric Dumazet
2013-10-02 12:10                   ` Jiri Pirko

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=20131001232534.GM10771@order.stressinduktion.org \
    --to=hannes@stressinduktion.org \
    --cc=davem@davemloft.net \
    --cc=eric.dumazet@gmail.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jiri@resnulli.us \
    --cc=jmorris@namei.org \
    --cc=kaber@trash.net \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=netdev@vger.kernel.org \
    --cc=yoshfuji@linux-ipv6.org \
    /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 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).