From owner-freebsd-bugs@FreeBSD.ORG Mon Oct 28 16:20:01 2013 Return-Path: Delivered-To: freebsd-bugs@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id EEE08B98 for ; Mon, 28 Oct 2013 16:20:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id DC1F62A76 for ; Mon, 28 Oct 2013 16:20:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id r9SGK1X0026825 for ; Mon, 28 Oct 2013 16:20:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id r9SGK1gX026824; Mon, 28 Oct 2013 16:20:01 GMT (envelope-from gnats) Date: Mon, 28 Oct 2013 16:20:01 GMT Message-Id: <201310281620.r9SGK1gX026824@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= Subject: Re: kern/183139: ifconfig options on xn0 lost after xen vm migration to another server X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Oct 2013 16:20:02 -0000 The following reply was made to PR kern/183139; it has been noted by GNATS. From: =?ISO-8859-1?Q?Roger_Pau_Monn=E9?= To: , Cc: Subject: Re: kern/183139: ifconfig options on xn0 lost after xen vm migration to another server Date: Mon, 28 Oct 2013 17:13:01 +0100 Hello, The following patch seems to solve the problem, but I'm not that much familiar with netfront or net drivers in general (also netfront code is not that great, which makes it even harder to understand IMHO). --- diff --git a/sys/dev/xen/netfront/netfront.c b/sys/dev/xen/netfront/netfront.c index f9c72e6..99d3cf9 100644 --- a/sys/dev/xen/netfront/netfront.c +++ b/sys/dev/xen/netfront/netfront.c @@ -2022,15 +2022,31 @@ static int xn_configure_features(struct netfront_info *np) { int err; + bool resume; err = 0; + resume = !!np->xn_ifp->if_capenable; + + if (!resume || ((np->xn_ifp->if_capenable & np->xn_ifp->if_capabilities) + != np->xn_ifp->if_capenable)) { + /* + * Check if current enabled capabilities are available, + * if not switch to default capabilities. + */ #if __FreeBSD_version >= 700000 - if ((np->xn_ifp->if_capenable & IFCAP_LRO) != 0) - tcp_lro_free(&np->xn_lro); + if ((np->xn_ifp->if_capenable & IFCAP_LRO) != 0) + tcp_lro_free(&np->xn_lro); #endif - np->xn_ifp->if_capenable = - np->xn_ifp->if_capabilities & ~(IFCAP_LRO|IFCAP_TSO4); - np->xn_ifp->if_hwassist &= ~CSUM_TSO; + np->xn_ifp->if_capenable = + np->xn_ifp->if_capabilities & ~(IFCAP_LRO|IFCAP_TSO4); + np->xn_ifp->if_hwassist &= ~CSUM_TSO; + } else { + /* + * What we have currently enabled is supported by the + * new host, no need to change anything. + */ + return 0; + } #if __FreeBSD_version >= 700000 if (xn_enable_lro && (np->xn_ifp->if_capabilities & IFCAP_LRO) != 0) { err = tcp_lro_init(&np->xn_lro); --