Module Name: src Committed By: jdolecek Date: Mon Apr 6 19:52:38 UTC 2020
Modified Files: src/sys/arch/xen/xen: if_xennet_xenbus.c xennetback_xenbus.c Log Message: pass and use feature-ipv6-csum-offload for ipv6 csum support, matches Linux Dom0/DomU To generate a diff of this commit: cvs rdiff -u -r1.106 -r1.107 src/sys/arch/xen/xen/if_xennet_xenbus.c cvs rdiff -u -r1.92 -r1.93 src/sys/arch/xen/xen/xennetback_xenbus.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/xen/xen/if_xennet_xenbus.c diff -u src/sys/arch/xen/xen/if_xennet_xenbus.c:1.106 src/sys/arch/xen/xen/if_xennet_xenbus.c:1.107 --- src/sys/arch/xen/xen/if_xennet_xenbus.c:1.106 Mon Apr 6 18:23:21 2020 +++ src/sys/arch/xen/xen/if_xennet_xenbus.c Mon Apr 6 19:52:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_xennet_xenbus.c,v 1.106 2020/04/06 18:23:21 jdolecek Exp $ */ +/* $NetBSD: if_xennet_xenbus.c,v 1.107 2020/04/06 19:52:38 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -81,7 +81,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.106 2020/04/06 18:23:21 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_xennet_xenbus.c,v 1.107 2020/04/06 19:52:38 jdolecek Exp $"); #include "opt_xen.h" #include "opt_nfs_boot.h" @@ -207,6 +207,7 @@ struct xennet_xenbus_softc { #define BEST_DISCONNECTED 1 #define BEST_CONNECTED 2 #define BEST_SUSPENDED 3 + bool sc_ipv6_csum; /* whether backend support IPv6 csum offload */ krndsource_t sc_rnd_source; }; #define SC_NLIVEREQ(sc) ((sc)->sc_rx_ring.req_prod_pvt - \ @@ -268,6 +269,7 @@ xennet_xenbus_attach(device_t parent, de netif_rx_sring_t *rx_ring; RING_IDX i; char *val, *e, *p; + unsigned long uval; extern int ifqmaxlen; /* XXX */ #ifdef XENNET_DEBUG char **dir; @@ -338,7 +340,7 @@ xennet_xenbus_attach(device_t parent, de } /* read mac address */ - err = xenbus_read(NULL, xa->xa_xbusd->xbusd_path, "mac", NULL, &val); + err = xenbus_read(NULL, sc->sc_xbusd->xbusd_path, "mac", NULL, &val); if (err) { aprint_error_dev(self, "can't read mac address, err %d\n", err); return; @@ -356,6 +358,12 @@ xennet_xenbus_attach(device_t parent, de free(val, M_DEVBUF); aprint_normal_dev(self, "MAC address %s\n", ether_sprintf(sc->sc_enaddr)); + + /* read ipv6 csum support flag */ + err = xenbus_read_ul(NULL, sc->sc_xbusd->xbusd_otherend, + "feature-ipv6-csum-offload", &uval, 10); + sc->sc_ipv6_csum = (!err && uval == 1); + /* Initialize ifnet structure and attach interface */ strlcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); sc->sc_ethercom.ec_capabilities |= ETHERCAP_VLAN_MTU; @@ -377,6 +385,15 @@ xennet_xenbus_attach(device_t parent, de M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_IPv4 \ | M_CSUM_TCPv6 | M_CSUM_UDPv6 \ ) + if (!sc->sc_ipv6_csum) { + /* + * If backend doesn't support IPv6 csum offloading, we must + * provide valid IPv6 csum for Tx packets, but can still + * skip validation for Rx packets. + */ + ifp->if_capabilities &= + ~(IFCAP_CSUM_UDPv6_Tx | IFCAP_CSUM_TCPv6_Tx); + } IFQ_SET_READY(&ifp->if_snd); if_attach(ifp); Index: src/sys/arch/xen/xen/xennetback_xenbus.c diff -u src/sys/arch/xen/xen/xennetback_xenbus.c:1.92 src/sys/arch/xen/xen/xennetback_xenbus.c:1.93 --- src/sys/arch/xen/xen/xennetback_xenbus.c:1.92 Sun Apr 5 17:26:46 2020 +++ src/sys/arch/xen/xen/xennetback_xenbus.c Mon Apr 6 19:52:38 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: xennetback_xenbus.c,v 1.92 2020/04/05 17:26:46 jdolecek Exp $ */ +/* $NetBSD: xennetback_xenbus.c,v 1.93 2020/04/06 19:52:38 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.92 2020/04/05 17:26:46 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xennetback_xenbus.c,v 1.93 2020/04/06 19:52:38 jdolecek Exp $"); #include "opt_xen.h" @@ -289,6 +289,14 @@ xennetback_xenbus_create(struct xenbus_d xbusd->xbusd_path, err); goto abort_xbt; } + err = xenbus_printf(xbt, xbusd->xbusd_path, + "feature-ipv6-csum-offload", "%d", 1); + if (err) { + aprint_error_ifnet(ifp, + "failed to write %s/feature-ipv6-csum-offload: %d\n", + xbusd->xbusd_path, err); + goto abort_xbt; + } } while ((err = xenbus_transaction_end(xbt, 0)) == EAGAIN); if (err) { aprint_error_ifnet(ifp,