From owner-freebsd-bugs@FreeBSD.ORG Fri Sep 8 09:10:24 2006 Return-Path: X-Original-To: freebsd-bugs@hub.freebsd.org Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9B8A616A4DD for ; Fri, 8 Sep 2006 09:10:24 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 1D28343D4C for ; Fri, 8 Sep 2006 09:10:24 +0000 (GMT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id k889ANOL037199 for ; Fri, 8 Sep 2006 09:10:23 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id k889ANqP037198; Fri, 8 Sep 2006 09:10:23 GMT (envelope-from gnats) Resent-Date: Fri, 8 Sep 2006 09:10:23 GMT Resent-Message-Id: <200609080910.k889ANqP037198@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Eugene Grosbein Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id CF7B116A4DE; Fri, 8 Sep 2006 09:06:37 +0000 (UTC) (envelope-from eugen@www.svzserv.kemerovo.su) Received: from www.svzserv.kemerovo.su (www.svzserv.kemerovo.su [213.184.65.80]) by mx1.FreeBSD.org (Postfix) with ESMTP id EDA1D43D45; Fri, 8 Sep 2006 09:06:36 +0000 (GMT) (envelope-from eugen@www.svzserv.kemerovo.su) Received: from www.svzserv.kemerovo.su (eugen@localhost [127.0.0.1]) by www.svzserv.kemerovo.su (8.13.8/8.13.8) with ESMTP id k8896XQO016992; Fri, 8 Sep 2006 17:06:33 +0800 (KRAST) (envelope-from eugen@www.svzserv.kemerovo.su) Received: (from eugen@localhost) by www.svzserv.kemerovo.su (8.13.8/8.13.8/Submit) id k8896XrE016991; Fri, 8 Sep 2006 17:06:33 +0800 (KRAST) (envelope-from eugen) Message-Id: <200609080906.k8896XrE016991@www.svzserv.kemerovo.su> Date: Fri, 8 Sep 2006 17:06:33 +0800 (KRAST) From: Eugene Grosbein To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: jhb@FreeBSD.org Subject: kern/103019: [patch] MFC link flapping workaround for em(4) to RELENG_4 X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 08 Sep 2006 09:10:24 -0000 >Number: 103019 >Category: kern >Synopsis: [patch] MFC link flapping workaround for em(4) to RELENG_4 >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Sep 08 09:10:22 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Eugene Grosbein >Release: FreeBSD 4.11-STABLE i386 >Organization: Svyaz Service JSC >Environment: System: FreeBSD www.svzserv.kemerovo.su 4.11-STABLE FreeBSD 4.11-STABLE #17: Fri Sep 8 12:21:26 KRAST 2006 eu@www.svzserv.kemerovo.su:/home4/obj/home/src/sys/WWW i386 >Description: Please MFC part of if_em.c,v1.119 to RELENG_4 to work aroung link flapping problem. Path follows (tested). >How-To-Repeat: ifconfig em0 inet ... alias produces timeout, link regenitiation and there is no outgoing ARP cache update packet. >Fix: --- sys/dev/em/if_em.c.orig Fri Sep 8 10:36:26 2006 +++ sys/dev/em/if_em.c Fri Sep 8 12:19:50 2006 @@ -61,6 +61,7 @@ #include #include +#include #include #include #include @@ -729,6 +730,7 @@ { struct adapter *adapter = ifp->if_softc; struct ifreq *ifr = (struct ifreq *)data; + struct ifaddr *ifa = (struct ifaddr *)data; int error = 0; int s; @@ -741,7 +743,21 @@ case SIOCSIFADDR: case SIOCGIFADDR: IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFADDR (Get/Set Interface Addr)"); - ether_ioctl(ifp, command, data); + if (ifa->ifa_addr->sa_family == AF_INET) { + /* + * XXX + * Since resetting hardware takes a very long time + * and results in link renegotiation we only + * initialize the hardware only when it is absolutely + * required. + */ + ifp->if_flags |= IFF_UP; + if (!(ifp->if_flags & IFF_RUNNING)) { + em_init(adapter); + } + arp_ifinit(ifp, ifa); + } else + error = ether_ioctl(ifp, command, data); break; case SIOCSIFMTU: { @@ -790,12 +806,13 @@ case SIOCSIFFLAGS: IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)"); if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_flags & IFF_RUNNING)) { + if ((ifp->if_flags & IFF_RUNNING)) { + if (ifp->if_flags & IFF_PROMISC) { + em_disable_promisc(adapter); + em_set_promisc(adapter); + } + } else em_init(adapter); - } - - em_disable_promisc(adapter); - em_set_promisc(adapter); } else { if (ifp->if_flags & IFF_RUNNING) { em_stop(adapter); Eugene Grosbein >Release-Note: >Audit-Trail: >Unformatted: