Ian Campbell
2009-Jan-13 10:59 UTC
[Xen-devel] [PATCH] netfront/back: do not mark packets of length < MSS as GSO
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1231847296 0 # Node ID 5b29f1081b2061cf56fa57ed67fef25cc1426a57 # Parent 28acedb66302a29c9ef14a3084b4736d3fc192f1 netfront/back: do not mark packets of length < MSS as GSO 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> diff -r 28acedb66302 -r 5b29f1081b20 drivers/xen/netback/netback.c --- a/drivers/xen/netback/netback.c Wed Jan 07 12:21:54 2009 +0900 +++ b/drivers/xen/netback/netback.c Tue Jan 13 11:48:16 2009 +0000 @@ -1345,6 +1345,9 @@ static void net_tx_action(unsigned long skb_shinfo(skb)->frags[0].page = (void *)~0UL; } + if (skb->data_len < skb_shinfo(skb)->gso_size) + skb_shinfo(skb)->gso_size = 0; + __skb_queue_tail(&tx_queue, skb); pending_cons++; diff -r 28acedb66302 -r 5b29f1081b20 drivers/xen/netfront/netfront.c --- a/drivers/xen/netfront/netfront.c Wed Jan 07 12:21:54 2009 +0900 +++ b/drivers/xen/netfront/netfront.c Tue Jan 13 11:48:16 2009 +0000 @@ -1439,6 +1439,10 @@ err: np->stats.rx_packets++; np->stats.rx_bytes += skb->len; +#ifdef HAVE_TSO + if (skb->data_len < skb_shinfo(skb)->gso_size) + skb_shinfo(skb)->gso_size = 0; +#endif __skb_queue_tail(&rxq, skb); np->rx.rsp_cons = ++i; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Campbell
2009-Jan-13 12:51 UTC
[Xen-devel] Re: [PATCH] netfront/back: do not mark packets of length < MSS as GSO
Should clear gso_type too: changeset: 774:cb5ad51f5206cb2b756ac1c5731ee47f7e3b8273 tag: tip user: Ian Campbell <ian.campbell@citrix.com> date: Tue Jan 13 12:50:26 2009 +0000 files: drivers/xen/netback/netback.c drivers/xen/netfront/netfront.c description: netfront/back: do not mark packets of length < MSS as GSO 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> diff -r 28acedb66302a29c9ef14a3084b4736d3fc192f1 -r cb5ad51f5206cb2b756ac1c5731ee47f7e3b8273 drivers/xen/netback/netback.c --- a/drivers/xen/netback/netback.c Wed Jan 07 12:21:54 2009 +0900 +++ b/drivers/xen/netback/netback.c Tue Jan 13 12:50:26 2009 +0000 @@ -1345,6 +1345,11 @@ static void net_tx_action(unsigned long 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++; diff -r 28acedb66302a29c9ef14a3084b4736d3fc192f1 -r cb5ad51f5206cb2b756ac1c5731ee47f7e3b8273 drivers/xen/netfront/netfront.c --- a/drivers/xen/netfront/netfront.c Wed Jan 07 12:21:54 2009 +0900 +++ b/drivers/xen/netfront/netfront.c Tue Jan 13 12:50:26 2009 +0000 @@ -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; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel