[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xen-cvs
Subject:    [Xen-changelog] [linux-2.6.18-xen] netfront: reduce gso_max_size to account for max TCP header
From:       Xen patchbot-linux-2.6.18-xen <patchbot () xen ! org>
Date:       2013-04-30 14:44:03
Message-ID: E1UXBml-0006rG-Kb () xenbits ! xen ! org
[Download RAW message or body]

# HG changeset patch
# User Wei Liu <wei.liu2@citrix.com>
# Date 1367332425 -7200
# Node ID 5e80033562fa444531ba87e51c7d8cc45c93715b
# Parent  03152e80954136f7eb4ea37c7dc358024a45888f
netfront: reduce gso_max_size to account for max TCP header

The maximum packet including header that can be handled by netfront / netback
wire format is 65535. Reduce gso_max_size accordingly.

Drop skb and print warning when skb->len > 65535. This can 1) save the effort
to send malformed packet to netback, 2) help spotting misconfiguration of
netfront in the future.

Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Jan Beulich <jbeulich@suse.com>
---


diff -r 03152e809541 -r 5e80033562fa drivers/xen/netfront/netfront.c
--- a/drivers/xen/netfront/netfront.c	Tue Apr 30 16:30:31 2013 +0200
+++ b/drivers/xen/netfront/netfront.c	Tue Apr 30 16:33:45 2013 +0200
@@ -52,6 +52,7 @@
 #include <net/pkt_sched.h>
 #include <net/arp.h>
 #include <net/route.h>
+#include <net/tcp.h>
 #include <asm/uaccess.h>
 #include <xen/evtchn.h>
 #include <xen/xenbus.h>
@@ -960,6 +961,16 @@ static int network_start_xmit(struct sk_
  		return 0; 
  	} 
 
+	/*
+	 * If skb->len is too big for wire format, drop skb and alert
+	 * user about misconfiguration.
+	 */
+	if (unlikely(skb->len > XEN_NETIF_MAX_TX_SIZE)) {
+		printk(KERN_ALERT "xennet: length %u too big for interface\n",
+		       skb->len);
+		goto drop;
+	}
+
 	frags += (offset + len + PAGE_SIZE - 1) / PAGE_SIZE;
 	if (unlikely(frags > MAX_SKB_FRAGS + 1)) {
 		printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n",
@@ -1709,7 +1720,8 @@ static int xennet_set_mac_address(struct
 
 static int xennet_change_mtu(struct net_device *dev, int mtu)
 {
-	int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
+	int max = xennet_can_sg(dev) ? XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER
+				     : ETH_DATA_LEN;
 
 	if (mtu > max)
 		return -EINVAL;
@@ -2111,6 +2123,10 @@ static struct net_device * __devinit cre
 	SET_MODULE_OWNER(netdev);
 	SET_NETDEV_DEV(netdev, &dev->dev);
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+	netif_set_gso_max_size(netdev, XEN_NETIF_MAX_TX_SIZE - MAX_TCP_HEADER);
+#endif
+
 	np->netdev = netdev;
 
 	netfront_carrier_off(np);
diff -r 03152e809541 -r 5e80033562fa include/xen/interface/io/netif.h
--- a/include/xen/interface/io/netif.h	Tue Apr 30 16:30:31 2013 +0200
+++ b/include/xen/interface/io/netif.h	Tue Apr 30 16:33:45 2013 +0200
@@ -71,6 +71,7 @@ struct netif_tx_request {
     uint16_t flags;        /* NETTXF_* */
     uint16_t id;           /* Echoed in response message. */
     uint16_t size;         /* Packet size in bytes.       */
+#define XEN_NETIF_MAX_TX_SIZE 0xFFFF
 };
 typedef struct netif_tx_request netif_tx_request_t;
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xen.org
http://lists.xensource.com/xen-changelog
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic