Date: Tue, 24 Feb 2009 16:17:29 +0000 (UTC) From: Doug Rabson <dfr@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r188996 - user/dfr/xenhvm/7/sys/dev/xen/netfront Message-ID: <200902241617.n1OGHTUb069917@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dfr Date: Tue Feb 24 16:17:29 2009 New Revision: 188996 URL: http://svn.freebsd.org/changeset/base/188996 Log: Pay attention to whether or not LRO is enabled. Modified: user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c Modified: user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c ============================================================================== --- user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c Tue Feb 24 16:14:15 2009 (r188995) +++ user/dfr/xenhvm/7/sys/dev/xen/netfront/netfront.c Tue Feb 24 16:17:29 2009 (r188996) @@ -969,7 +969,8 @@ xn_rxeof(struct netfront_info *np) XN_RX_UNLOCK(np); #if __FreeBSD_version >= 700000 /* Use LRO if possible */ - if (lro->lro_cnt == 0 || tcp_lro_rx(lro, m, 0)) { + if ((ifp->if_capenable & IFCAP_LRO) == 0 || + lro->lro_cnt == 0 || tcp_lro_rx(lro, m, 0)) { /* * If LRO fails, pass up to the stack * directly. @@ -1614,13 +1615,37 @@ xn_ioctl(struct ifnet *ifp, u_long cmd, break; case SIOCSIFCAP: mask = ifr->ifr_reqcap ^ ifp->if_capenable; - if (mask & IFCAP_HWCSUM) { - ifp->if_capenable ^= IFCAP_HWCSUM; + if (mask & IFCAP_TXCSUM) { + if (IFCAP_TXCSUM & ifp->if_capenable) { + ifp->if_capenable &= ~(IFCAP_TXCSUM|IFCAP_TSO4); + ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP + | CSUM_IP | CSUM_TSO); + } else { + ifp->if_capenable |= IFCAP_TXCSUM; + ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP + | CSUM_IP); + } + } + if (mask & IFCAP_RXCSUM) { + ifp->if_capenable ^= IFCAP_RXCSUM; } #if __FreeBSD_version >= 700000 if (mask & IFCAP_TSO4) { - ifp->if_capenable ^= IFCAP_TSO4; - /* XXX inform backend? */ + if (IFCAP_TSO4 & ifp->if_capenable) { + ifp->if_capenable &= ~IFCAP_TSO4; + ifp->if_hwassist &= ~CSUM_TSO; + } else if (IFCAP_TXCSUM & ifp->if_capenable) { + ifp->if_capenable |= IFCAP_TSO4; + ifp->if_hwassist |= CSUM_TSO; + } else { + DPRINTK("Xen requires tx checksum offload" + " be enabled to use TSO\n"); + error = EINVAL; + } + } + if (mask & IFCAP_LRO) { + ifp->if_capenable ^= IFCAP_LRO; + } #endif error = 0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902241617.n1OGHTUb069917>