gro: Check for GSO packets and packets with frag_list
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 14 Jan 2009 22:36:12 +0000 (14:36 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Jan 2009 22:36:12 +0000 (14:36 -0800)
As GRO cannot be applied to packets with frag_list we need to
make sure that we reject such packets if they are fed to us,
e.g., through a tunnel device.

Also there is no point in applying GRO on GSO packets so they
too should be rejected.  This allows GRO to be used in virtio-net
which may produce GSO packets directly but may still benefit
from GRO if the other end of it doesn't support GSO.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index b715a55cccc417e07c3165b544b7fc95d162f90f..7dec715293b1d40b1fb770354b552ed88e429c9c 100644 (file)
@@ -2392,6 +2392,9 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
        if (!(skb->dev->features & NETIF_F_GRO))
                goto normal;
 
+       if (skb_is_gso(skb) || skb_shinfo(skb)->frag_list)
+               goto normal;
+
        rcu_read_lock();
        list_for_each_entry_rcu(ptype, head, list) {
                struct sk_buff *p;