cvs commit: src/sys/dev/re if_re.c
Ruslan Ermilov
ru at FreeBSD.org
Sun Sep 18 09:35:19 PDT 2005
Hi,
On Sun, Sep 18, 2005 at 03:06:10AM +0000, Bill Paul wrote:
> > On Fri, Sep 16, 2005 at 11:06:08PM +0000, Bill Paul wrote:
> > > If you insist on sticking to the "no twiddling IFF_UP from inside
> > > the driver" rule, then I think the problem can be avoided by simply not
> > > being lazy in foo_ioctl() and actually having explicit code in SIOCSIFFLAGS
> > > case that turns promisc mode on and off on an IFF_PROMISC transition,
> > > and is careful not to do it unless IFF_RUNNING is set. It also
> > > needs to handle IFF_UP separately from IFF_PROMISC. I think the
> > > correct logic would look something like:
> > >
> > > if (IFF_UP was toggled up)
> > > foo_init(sc);
> > > else if (IFF_UP was toggled down)
> > > foo_stop(sc);
> > >
> > > if (IFF_PROMISC was toggled up && ifp->if_flags & IFF_RUNNING)
> > > foo_set_promisc(sc);
> > > else if (IFF_PROMISC was toggled down && ifp->if_flags & IFF_RUNNING)
> > > foo_clear_promisc(sc);
> > >
> > How about prototyping the "lazy" SIOCSIFFLAGS handler as follows:
> >
> > if (IFF_UP has toggled up)
> > foo_init(); /* foo_init takes care of IFF_PROMISC etc. */
> > else if (IFF_UP has toggled down)
> > foo_stop();
> > else if (IFF_DRV_RUNNING) {
> > if (something interesting has toggled)
> > foo_init();
> > }
> >
>
> I don't think that's quite right. Remember, it's possible to manipulate
> serveral flags with a single call to SIOCSIFFLAGS. Supposing I call
> SIOCSIFFLAGS to set both the IFF_UP and IFF_PROMISC bits at the same
> time. With your logic, the interface will be brought up, but the
> IFF_PROMISC setting will be ignored.
>
The "/* foo_init takes care of IFF_PROMISC etc. */" comment
above was supposed to answer this question. From what I can
tell, this holds true for all drivers.
> I think this is more like it:
>
> if (IFF_UP was toggled up)
> foo_init(sc);
> else if (IFF_UP was toggled down)
> foo_stop(sc);
>
> if (ifp->if_flags & IFF_RUNNING) {
> /* handle other state bits, PROMISC, ALLMULTI, etc... */
> }
>
> If possible, you should avoid shortcutting the "handle other state bits"
> part with foo_init(), since there are other side effects. For example,
> foo_init() will usually reset the link state, so if the link is up, it'll
> drop it and then restablish it. For ethernet, renegotiating the link
> could take a couple of seconds. You don't want to clobber the link
> for that length of time if all you want to do is toggle PROMISC or
> ALLMULTI mode. These things can be programmed on the fly without
> resetting the chip. Promisc mode is usually just a matter of setting one
> bit in a register somewhere.
>
That's clear. I'm talking about fixing all drivers for the
BPF detach bug.
Cheers,
--
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/cvs-src/attachments/20050918/940c98db/attachment.bin
More information about the cvs-src
mailing list