HEADSUP: internal network interface changes
Brooks Davis
brooks at one-eyed-alien.net
Thu Jun 9 06:44:56 GMT 2005
I plan to commit a major rework of network interface related storage
Friday morning PDT. This is a massive change touching every network
driver in the system. This change was discussed at the BSDCan dev
summit and derives from discussions at EuroBSDCon on dealing with
dynamic network devices. You can view the diff at:
http://people.freebsd.org/~brooks/patches/ifnet.diff
I'm not posting the diff to the list as it is nearly 700K. Below, you
will find the diff to ifnet(9) for a more technical view of the API
change.
In short, the change removes the embedded struct ifnet and layer 2 common
structures (struct arpcom, struct ifatm, struct sppp, etc) from driver
softcs and replaces them with a struct ifnet pointer which is allocated
with a new function, if_alloc which takes an interface type. For
certain types, if_alloc also fills in the new struct ifnet member,
if_l2com with an initialized layer 2 common structure.
The benefits of this change are:
- The size of struct ifnet and the layer 2 common structures is no
longer part of the network interface ABI. This means we add
features to the generic interface code so long as they do not require
action on the part of the driver without breaking the ABI.
- Since storage is no longer tied to the softc, we will able to
reference count struct ifnet more easily which is a prerequisite for
fixing the panics on removing an interface which is configured with
dummynet.
- This patch eliminates many ugly casts and the historically weakly
documented requirement that softc's be castable to ifnet's and
arpcom's.
Things to note about this change:
- External drivers including those in ports will panic if loaded until
they are converted to the new API.
Things to note about this patch:
- There are nearly 100 drivers in the tree and I only use a small set
of them so there are likely to be some small bugs in this patch. The
changes were mostly mechanical, but varying naming conventions, plus
the occasional driver written entirely from scratch introduce the
possibility of errors. Use care when updating, particularly with
remote systems.
- In most cases, this patch does not address the issue of keeping
source compatible with previous releases or other systems. I will
supply patches to do so in any case where there is a need, but I
intend to wait until after committing to do so. I hope the set of
drivers requiring these changes will be small.
-- Brooks
P.S. the posted patch contains a bug in the udav driver. It will be
fixed before commit.
--- freebsd/share/man/man9/ifnet.9 Sun Jun 5 13:33:05 2005
+++ ifnet/share/man/man9/ifnet.9 Sun Jun 5 20:20:03 2005
@@ -46,9 +46,17 @@
.In net/if_types.h
.\"
.Ss "Interface Manipulation Functions"
+.Ft "struct ifnet *"
+.Fn if_alloc "u_char type"
.Ft void
.Fn if_attach "struct ifnet *ifp"
.Ft void
+.Fn if_detach "struct ifnet *ifp"
+.Ft void
+.Fn if_free "struct ifnet *ifp"
+.Ft void
+.Fn if_free_type "struct ifnet *ifp" "u_char type"
+.Ft void
.Fn if_down "struct ifnet *ifp"
.Ft int
.Fn ifioctl "struct socket *so" "u_long cmd" "caddr_t data" "struct thread *td"
@@ -219,6 +227,11 @@
.Pq Vt "void *"
A pointer to the driver's private state block.
(Initialized by driver.)
+.It Va if_l2com
+.Pq Vt "void *"
+A pointer to the common data for the interface's layer 2 protocol.
+(Initialized by
+.Fn if_alloc .)
.It Va if_link
.Pq Fn TAILQ_ENTRY ifnet
.Xr queue 3
@@ -270,6 +283,8 @@
to refer to a particular interface by index
(see
.Xr link_addr 3 ) .
+(Initialized by
+.Fn if_alloc .)
.It Va if_timer
.Pq Vt short
Number of seconds until the watchdog timer
@@ -988,6 +1003,14 @@
.El
.Ss Interface Manipulation Functions
.Bl -ohang -offset indent
+.It Fn if_alloc
+Allocate and initalize an
+.Fa ifp .
+Initalization includes the allocation of an interface index and may
+include the allocation of a
+.Fa type
+specific structure in
+.Va if_l2com .
.It Fn if_attach
Link the specified interface
.Fa ifp
@@ -999,6 +1022,29 @@
(A pointer to
this address structure is saved in the global array
.Va ifnet_addrs . )
+The
+.Fa ifp
+must have been allocted by
+.Fn if_alloc .
+.It Fn if_detach
+Shutdown and unlink the specified
+.Fa ifp
+from the interface list.
+.It Fn if_free
+Free the given
+.Fa ifp
+back to the system.
+The interface must have been previously detached if it was ever attached.
+.It Fn if_free_type
+Identical to
+.Fn if_free
+except that the given
+.Fa type
+ is used to free
+ .Va if_l2com
+ instead of the type in
+ .Va if_type .
+ This is intended for use with drivers that change their interface type.
.It Fn if_down
Mark the interface
.Fa ifp
--
Any statement of the form "X is the one, true Y" is FALSE.
PGP fingerprint 655D 519C 26A7 82E7 2529 9BF0 5D8E 8BE9 F238 1AD4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-net/attachments/20050608/4121a2e7/attachment.bin
More information about the freebsd-net
mailing list