svn commit: r188996 - user/dfr/xenhvm/7/sys/dev/xen/netfront
Doug Rabson
dfr at FreeBSD.org
Tue Feb 24 08:17:30 PST 2009
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;
More information about the svn-src-user
mailing list