gro: Use gso_size to store MSS
Herbert Xu [Mon, 5 Jan 2009 00:13:19 +0000 (16:13 -0800)]
In order to allow GRO packets without frag_list at all, we need to
store the MSS in the packet itself.  The obvious place is gso_size.
The only thing to watch out for is if the packet ends up not being
GRO then we need to clear gso_size before pushing the packet into
the stack.

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

net/core/dev.c
net/core/skbuff.c
net/ipv4/tcp.c

index 09c66a4..1e1a680 100644 (file)
@@ -2365,6 +2365,7 @@ static int napi_gro_complete(struct sk_buff *skb)
        }
 
 out:
+       skb_shinfo(skb)->gso_size = 0;
        __skb_push(skb, -skb_network_offset(skb));
        return netif_receive_skb(skb);
 }
@@ -2446,6 +2447,7 @@ int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
        }
 
        NAPI_GRO_CB(skb)->count = 1;
+       skb_shinfo(skb)->gso_size = skb->len;
        skb->next = napi->gro_list;
        napi->gro_list = skb;
 
index b8d0abb..3aafb10 100644 (file)
@@ -2613,6 +2613,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
 
        *NAPI_GRO_CB(nskb) = *NAPI_GRO_CB(p);
        skb_shinfo(nskb)->frag_list = p;
+       skb_shinfo(nskb)->gso_size = skb_shinfo(p)->gso_size;
        skb_header_release(p);
        nskb->prev = p;
 
index f28acf1..4d655e9 100644 (file)
@@ -2519,9 +2519,7 @@ found:
        flush |= memcmp(th + 1, th2 + 1, thlen - sizeof(*th));
 
        total = p->len;
-       mss = total;
-       if (skb_shinfo(p)->frag_list)
-               mss = skb_shinfo(p)->frag_list->len;
+       mss = skb_shinfo(p)->gso_size;
 
        flush |= skb->len > mss || skb->len <= 0;
        flush |= ntohl(th2->seq) + total != ntohl(th->seq);
@@ -2557,7 +2555,6 @@ int tcp_gro_complete(struct sk_buff *skb)
        skb->csum_offset = offsetof(struct tcphdr, check);
        skb->ip_summed = CHECKSUM_PARTIAL;
 
-       skb_shinfo(skb)->gso_size = skb_shinfo(skb)->frag_list->len;
        skb_shinfo(skb)->gso_segs = NAPI_GRO_CB(skb)->count;
 
        if (th->cwr)