Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 Jul 2004 12:21:54 -0700
From:      Sam Leffler <sam@errno.com>
To:        Bill Paul <wpaul@FreeBSD.org>
Cc:        cvs-all@FreeBSD.org
Subject:   Re: cvs commit: src/sys/compat/ndis ndis_var.h subr_ndis.c src/sys/dev/if_ndis if_ndis.c if_ndisvar.h
Message-ID:  <200407071221.54962.sam@errno.com>
In-Reply-To: <200407071746.i67HkUSQ075464@repoman.freebsd.org>
References:  <200407071746.i67HkUSQ075464@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wednesday 07 July 2004 10:46 am, Bill Paul wrote:

>   - Create am NDIS_INITIALIZED() macro in if_ndisvar.h and use it in
>     if_ndis.c to test whether the device has been initialized rather
>     than checking for the presence of the IFF_UP flag in if_flags.
>     While debugging the previous problem, I noticed that bringing
>     up the device would always produce failures from ndis_setmulti().
>     It turns out that the following steps now occur during device
>     initialization:
>
>           - IFF_UP flag is set in if_flags
>           - ifp->if_ioctl() called with SIOCSIFADDR (which we don't handle)
>           - ifp->if_ioctl() called with SIOCADDMULTI
>           - ifp->if_ioctl() called with SIOCADDMULTI (again)
>           - ifp->if_ioctl() called with SIOCADDMULTI (yet again)
>           - ifp->if_ioctl() called with SIOCSIFFLAGS
>
>     Setting the receive filter and multicast filters can only be done
>     when the underlying NDIS driver has been initialized, which is done
>     by ifp->if_init(). However, we don't call ifp->if_init() until
>     ifp->if_ioctl() is called with SIOCSIFFLAGS and IFF_UP has been
>     set. It appears that now, the network stack tries to add multicast
>     addresses to interface's filter before those steps occur. Normally,
>     ndis_setmulti() would trap this condition by checking for the IFF_UP
>     flag, but the network code has in fact set this flag already, so
>     ndis_setmulti() is fooled into thinking the interface has been
>     initialized when it really hasn't.
>
>     It turns out this is usually harmless because the ifp->if_init()
>     routine (in this case ndis_init()) will set up the multicast
>     filter when it initializes the hardware anyway, and the underlying
>     routines (ndis_get_info()/ndis_set_info()) know that the driver/NIC
>     haven't been initialized yet, but you end up spurious error messages
>     on the console all the time.
>
>   Something tells me this new behavior isn't really correct. I think
>   the intention was to fix it so that ifp->if_init() is only called
>   once when we ifconfig an interface up, but the end result seems a
>   little bogus: the change of the IFF_UP flag should be propagated
>   down to the driver before calling any other ioctl() that might actually
>   require the hardware to be up and running.

This "new behaviour" is many many months old (assuming it's what I think it 
is).  The if_init routine is only called by the 802.11 ioctl routine when you 
mark the interface up to avoid forcing a device initialization (and run of 
the 802.11 state machine) on every ioctl that's done before marking the if 
up.  This is done based on the setting of the IFF_UP flag.  In general IFF_UP 
means the interface is "ready for traffic to flow".  A device should be 
capable of editing it's multicast state as soon as it marks itself 
IFF_RUNNING.

	Sam



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