Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Jun 2006 21:52:37 -0700
From:      Sam Leffler <sam@errno.com>
To:        Xin LI <delphij@delphij.net>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: Why do we do if_init for AF_INET even if the interface is running?
Message-ID:  <448E4495.4030200@errno.com>
In-Reply-To: <1150166974.936.6.camel@spirit>
References:  <1150166974.936.6.camel@spirit>

next in thread | previous in thread | raw e-mail | index | archive | help
Xin LI wrote:
> Hi,
> 
> Is there any reason why we do if_init() for AF_INET regardless whether
> the interface is already in IF_DRV_RUNNING?  This seems to cause the
> interface to reinitialize its link level state, which causes the network
> to stop for a short while.
> 
> The proposed patch is inspired from NetBSD net/if_ethersubr.c,v 1.86
> which says:
> 
> "When setting an address on an interface, for address families which
> do not require changing the link-level address, only (*if_init)()
> if the interface is not already RUNNING."
> 
> I think we may want this as well.
> 
> Comments?
> 
> Cheers,
> 
> 
> ------------------------------------------------------------------------
> 
> Index: if_ethersubr.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/net/if_ethersubr.c,v
> retrieving revision 1.215
> diff -u -r1.215 if_ethersubr.c
> --- if_ethersubr.c	3 Mar 2006 17:21:08 -0000	1.215
> +++ if_ethersubr.c	13 Jun 2006 01:55:31 -0000
> @@ -997,7 +997,8 @@
>  		switch (ifa->ifa_addr->sa_family) {
>  #ifdef INET
>  		case AF_INET:
> -			ifp->if_init(ifp->if_softc);	/* before arpwhohas */
> +			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
> +				ifp->if_init(ifp->if_softc);	/* before arpwhohas */
>  			arp_ifinit(ifp, ifa);
>  			break;
>  #endif
> @@ -1027,7 +1028,8 @@
>  			}
>  #endif
>  		default:
> -			ifp->if_init(ifp->if_softc);
> +			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
> +				ifp->if_init(ifp->if_softc);
>  			break;
>  		}
>  		break;

Try it; you'll find various drivers blow up in their multicast code
because they assume the init method is called.  I tried to get this same
change committed last year because it causes wireless drivers to blow
chunks.  I finally gave up and stuck a similar change in ieee80211_ioctl.

	Sam




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?448E4495.4030200>