[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20100615121530.GC2361@redhat.com>
Date: Tue, 15 Jun 2010 15:15:30 +0300
From: "Michael S. Tsirkin" <mst@...hat.com>
To: Herbert Xu <herbert@...dor.hengli.com.au>
Cc: "David S. Miller" <davem@...emloft.net>, netdev@...r.kernel.org
Subject: Re: udp: Fix bogus UFO packet generation
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@...dor.apana.org.au>
FWIW
Reviewed-by: Michael S. Tsirkin <mst@...hat.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@...dor.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@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists