public inbox for netdev@vger.kernel.org 
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat•com>
To: Herbert Xu <herbert@gondor•hengli.com.au>
Cc: "David S. Miller" <davem@davemloft•net>, netdev@vger•kernel.org
Subject: Re: udp: Fix bogus UFO packet generation
Date: Tue, 15 Jun 2010 15:15:30 +0300	[thread overview]
Message-ID: <20100615121530.GC2361@redhat.com> (raw)
In-Reply-To: <20100615115225.GA7239@gondor.apana.org.au>

On Tue, Jun 15, 2010 at 09:52:25PM +1000, Herbert Xu wrote:
> Hi:
> 
> udp: Fix bogus UFO packet generation
> 
> It has been reported that the new UFO software fallback path
> fails under certain conditions with NFS.  I tracked the problem
> down to the generation of UFO packets that are smaller than the
> MTU.  The software fallback path simply discards these packets.
> 
> This patch fixes the problem by not generating such packets on
> the UFO path.
> 
> Signed-off-by: Herbert Xu <herbert@gondor•apana.org.au>

FWIW
Reviewed-by: Michael S. Tsirkin <mst@redhat•com>


> diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
> index 9a4a6c9..041d41d 100644
> --- a/net/ipv4/ip_output.c
> +++ b/net/ipv4/ip_output.c
> @@ -873,8 +873,10 @@ int ip_append_data(struct sock *sk,
>  	    !exthdrlen)
>  		csummode = CHECKSUM_PARTIAL;
>  
> +	skb = skb_peek_tail(&sk->sk_write_queue);
> +
>  	inet->cork.length += length;
> -	if (((length> mtu) || !skb_queue_empty(&sk->sk_write_queue)) &&
> +	if (((length > mtu) || (skb && skb_is_gso(skb))) &&
>  	    (sk->sk_protocol == IPPROTO_UDP) &&
>  	    (rt->u.dst.dev->features & NETIF_F_UFO)) {
>  		err = ip_ufo_append_data(sk, getfrag, from, length, hh_len,
> @@ -892,7 +894,7 @@ int ip_append_data(struct sock *sk,
>  	 * adding appropriate IP header.
>  	 */
>  
> -	if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL)
> +	if (!skb)
>  		goto alloc_new_skb;
>  
>  	while (length > 0) {
> @@ -1121,7 +1123,8 @@ ssize_t	ip_append_page(struct sock *sk, struct page *page,
>  		return -EINVAL;
>  
>  	inet->cork.length += size;
> -	if ((sk->sk_protocol == IPPROTO_UDP) &&
> +	if ((size + skb->len > mtu) &&
> +	    (sk->sk_protocol == IPPROTO_UDP) &&
>  	    (rt->u.dst.dev->features & NETIF_F_UFO)) {
>  		skb_shinfo(skb)->gso_size = mtu - fragheaderlen;
>  		skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
> 
> Cheers,
> -- 
> 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
> --
> 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

  reply	other threads:[~2010-06-15 12:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-15 11:52 udp: Fix bogus UFO packet generation Herbert Xu
2010-06-15 12:15 ` Michael S. Tsirkin [this message]
2010-06-21 20:57   ` David Miller

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=20100615121530.GC2361@redhat.com \
    --to=mst@redhat$(echo .)com \
    --cc=davem@davemloft$(echo .)net \
    --cc=herbert@gondor$(echo .)hengli.com.au \
    --cc=netdev@vger$(echo .)kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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