xen-netback: handle IPv6 TCP GSO packets from the guest
authorPaul Durrant <Paul.Durrant@citrix.com>
Wed, 16 Oct 2013 16:50:31 +0000 (17:50 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 17 Oct 2013 19:35:17 +0000 (15:35 -0400)
This patch adds a xenstore feature flag, festure-gso-tcpv6, to advertise
that netback can handle IPv6 TCP GSO packets. It creates SKB_GSO_TCPV6 skbs
if the frontend passes an extra segment with the new type
XEN_NETIF_GSO_TYPE_TCPV6 added to netif.h.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netback/netback.c
drivers/net/xen-netback/xenbus.c
include/xen/interface/io/netif.h

index 4271f8d1da7ad3cb6df996c41da50ba0deeb98d0..0e327d46a139e452cfabf9f9deaadfc70406c5c8 100644 (file)
@@ -1098,15 +1098,20 @@ static int xenvif_set_skb_gso(struct xenvif *vif,
                return -EINVAL;
        }
 
-       /* Currently only TCPv4 S.O. is supported. */
-       if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) {
+       switch (gso->u.gso.type) {
+       case XEN_NETIF_GSO_TYPE_TCPV4:
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
+               break;
+       case XEN_NETIF_GSO_TYPE_TCPV6:
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
+               break;
+       default:
                netdev_err(vif->dev, "Bad GSO type %d.\n", gso->u.gso.type);
                xenvif_fatal_tx_err(vif);
                return -EINVAL;
        }
 
        skb_shinfo(skb)->gso_size = gso->u.gso.size;
-       skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
 
        /* Header must be checked, and gso_segs computed. */
        skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
index 108e7523017aa0d81d0f9bcdd5c7a416637b4e36..02cb00bebdc9e1d254db87bd5447a56d3a5e0280 100644 (file)
@@ -105,6 +105,13 @@ static int netback_probe(struct xenbus_device *dev,
                        goto abort_transaction;
                }
 
+               err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv6",
+                                   "%d", sg);
+               if (err) {
+                       message = "writing feature-gso-tcpv6";
+                       goto abort_transaction;
+               }
+
                /* We support partial checksum setup for IPv6 packets */
                err = xenbus_printf(xbt, dev->nodename,
                                    "feature-ipv6-csum-offload",
index c9e81849fcd753c390307a6fe4fc85ddc911407d..5e766ebe77f6d576f807718c1d06feb9efc37ddb 100644 (file)
  * offload on or off. If it is missing then the feature is assumed to be off.
  */
 
+/*
+ * "feature-gso-tcpv4" and "feature-gso-tcpv6" advertise the capability to
+ * handle large TCP packets (in IPv4 or IPv6 form respectively). Neither
+ * frontends nor backends are assumed to be capable unless the flags are
+ * present.
+ */
+
 /*
  * This is the 'wire' format for packets:
  *  Request 1: xen_netif_tx_request  -- XEN_NETTXF_* (any flags)
@@ -102,8 +109,9 @@ struct xen_netif_tx_request {
 #define _XEN_NETIF_EXTRA_FLAG_MORE     (0)
 #define  XEN_NETIF_EXTRA_FLAG_MORE     (1U<<_XEN_NETIF_EXTRA_FLAG_MORE)
 
-/* GSO types - only TCPv4 currently supported. */
+/* GSO types */
 #define XEN_NETIF_GSO_TYPE_TCPV4       (1)
+#define XEN_NETIF_GSO_TYPE_TCPV6       (2)
 
 /*
  * This structure needs to fit within both netif_tx_request and