if_flags usage etc.
Robert Watson
rwatson at FreeBSD.org
Tue Jan 24 13:46:00 PST 2006
On Tue, 24 Jan 2006, Luigi Rizzo wrote:
> approx 1 month ago there was some discussion on the usage of if_flags and
> if_drv_flags in the stack As an exercise, i tried to identify the places
> these flags are used by taking a -current snapshot, splitting if_flags into
> two sets (those created at init time, those modified during normal
> operation) called if_flags_i and if_flags_n, and renaming the flags IFF_i_*
> and IFF_n_* respectively. Also, to point out where the IFF_DRV_* flags are
> used, i have renamed them IFF_d_DRV_*.
I've spent several weeks over the past couple of months working through the
use of if_flags in the network stack. There are a number of complicating
issues, and I basically concluded that before we could get too much further,
we needed to catalog and normalize the use of the flags across drivers. The
mean sticking points I ran into were:
(1) Modify drivers not to directly adjust IFF_UP. In many cases, this is
simple, but in others, it is hard.
(2) Clarify semantics of driver-specific (LINKX) flags, which sometimes
reflect driver state, and sometimes control it (and sometimes both).
(3) Introduce or reuse a mutex to protect read-modify-write of if_flags by the
stack.
(4) Push if_start oactive check into device driver to allow it to lock (or
not) as it sees fit.
I have works in progress for several of these, but because there's inevitably
a snow-balling effect, I've been trickling changes in a bit as a time as I
decide what is actually the right thing to do and fix drivers to match. The
if_drv_flags breakout was all I figured was safe to get in to 6.x, but I hope
to do quite a bit more for 7.x. I have significant numbers of patches along
the above lines in p4, and will try to sort them out in the next few days.
Robert N M Watson
>
> just to see how it looks, the patch that allows GENERIC to compile is at
> http://info.iet.unipi.it/~luigi/FreeBSD/if_flags.20060114.diff
> (i know it is missing netgraph, carp, vlan and atm, but
> covers the majority of drivers).
> No big suprises here but a few interesting things:
>
> - because if_drv_flags only contains RUNNING and OACTIVE, it
> could be manipulated by simple assignments by the drivers,
> instead of using bitwise ops;
>
> - ifp->if_drv_flags |= IFF_d_DRV_RUNNING;
> - ifp->if_drv_flags &= ~IFF_d_DRV_OACTIVE;
> + ifp->if_drv_flags = IFF_d_DRV_RUNNING; /* clear OACTIVE */
>
> ...
>
> - ifp->if_drv_flags &= ~(IFF_d_DRV_RUNNING | IFF_d_DRV_OACTIVE);
> + ifp->if_drv_flags = 0;
>
> and so on;
>
> - the check for IFF_UP is written so often that i wonder if it wouldn't
> be the case to wrap it around a macro, as e.g. it is done in
> net80211/ieee80211_ioctl.c for something similar.
>
> - IFF_CANTCHANGE still has masks for IFF_DRV_RUNNING and IFF_DRV_OACTIVE,
> that are no more in if_flags so should probably be removed.
>
> - very few places outside drivers look at IFF_DRV_RUNNING. Basically.
> net/if_ethersubr.c, netinet/ip_fastfwd.c , net80211/ieee80211_ioctl.c
> in all cases checking that both IFF_UP and IFF_RUNNING are set.
> I am not sure why we need both.
>
> - some drivers try to manipulate flags that they should not e.g.
>
> if_bge
> sets IFF_UP
>
> if_ed
> sets IFF_ALTPHYS (IFF_LINK*, but it is almost a capability here)
>
> if_fwe
> sets IFF_PROMISC
>
> if_ie
> resets IFF_UP
> sets IFF_UP
> sets IFF_ALLMULTI (commented as broken)
>
> if_plip
> sets IFF_UP
>
> if_re
> resets IFF_PROMISC
> sets IFF_PROMISC
> resets IFF_UP
> if_vge
> resets IFF_UP
> if_faith
> sets IFF_UP
> if_gif
> sets IFF_UP
> if_loop
> sets IFF_UP
>
> if_ppp
> resets IFF_UP
> if_sl
> resets IFF_UP
> sets IFF_UP
> if_tun
> sets IFF_UP
>
> if_de
> resets IFF_UP
>
> this can be probably fixedin many cases.
>
> - in most drivers, the logic for SIOCSIFFLAGS is very
> convoluted and could be cleaned up a lot. if_dc.c has a
> reasonable version. if_xl.c has a bad example, unfortunately
> copied a few times around.
>
> cheers
> luigi
> _______________________________________________
> freebsd-current at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-current
> To unsubscribe, send any mail to "freebsd-current-unsubscribe at freebsd.org"
>
More information about the freebsd-current
mailing list