]> xenbits.xensource.com Git - legacy/linux-2.6.18-xen.git/commitdiff
netfront/back: do not mark packets of length < MSS as GSO
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 13 Jan 2009 15:17:54 +0000 (15:17 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 13 Jan 2009 15:17:54 +0000 (15:17 +0000)
Linux assumes that skbs marked for GSO are longer than MSS. In
particular tcp_tso_segment assumes that skb_segment will return a
chain of at least 2 skbs.

Both netfront and back should therefor not pass such a packet up the
stack.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
drivers/xen/netback/netback.c
drivers/xen/netfront/netfront.c

index 2d69f822d6c7c7400be06cce62eef526fede9d0f..f843244613cffa697ac64e70a1d8ca82651fab53 100644 (file)
@@ -1345,6 +1345,11 @@ static void net_tx_action(unsigned long unused)
                        skb_shinfo(skb)->frags[0].page = (void *)~0UL;
                }
 
+               if (skb->data_len < skb_shinfo(skb)->gso_size) {
+                       skb_shinfo(skb)->gso_size = 0;
+                       skb_shinfo(skb)->gso_type = 0;
+               }
+
                __skb_queue_tail(&tx_queue, skb);
 
                pending_cons++;
index 8e51aa7250f6f2b758629f2419cb1b4b144ebe0e..0f5faac6304314befd40be8679a74fcb298fd625 100644 (file)
@@ -1439,6 +1439,14 @@ err:
                np->stats.rx_packets++;
                np->stats.rx_bytes += skb->len;
 
+#if HAVE_TSO
+               if (skb->data_len < skb_shinfo(skb)->gso_size) {
+                       skb_shinfo(skb)->gso_size = 0;
+#if HAVE_GSO
+                       skb_shinfo(skb)->gso_type = 0;
+#endif
+               }
+#endif
                __skb_queue_tail(&rxq, skb);
 
                np->rx.rsp_cons = ++i;