Date: Wed, 17 Jul 2002 14:25:29 -0400 From: "Jim McGrath" <jimmcgra@bellatlantic.net> To: "Kelly Yancey" <kbyanc@posi.net>, "Bill Baumann" <bbaumann@isilon.com> Cc: "Jim McGrath" <jimmcgra@bellatlantic.net>, <freebsd-net@FreeBSD.ORG> Subject: RE: Inconsistency between net/if.c and several ethernet drivers Message-ID: <NDBBKKEELKBCJJBEGDECGEJECEAA.jimmcgra@bellatlantic.net> In-Reply-To: <Pine.BSF.4.21.0207170942280.35007-100000@isilon.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Any driver that uses miibus_attach() is broken if struct arpcom is not at the beginning of the softc structure. There was some discussion of this more than a year ago when this bug showed up in the wx driver. Jim > -----Original Message----- > From: owner-freebsd-net@FreeBSD.ORG > [mailto:owner-freebsd-net@FreeBSD.ORG]On Behalf Of Bill Baumann > Sent: Wednesday, July 17, 2002 1:58 PM > To: Kelly Yancey > Cc: freebsd-net@FreeBSD.ORG > Subject: Re: Inconsistency between net/if.c and several ethernet drivers > > > > Pointers to interface and arpcom are clearly equivalent as arpcom contains > the interface structure. The one definition for the combined structure > makes it very safe. However, there are many definitions of the softc > structure. Requiring arpcom to be at the beginning of all softc structs > requires every device driver writer to either track this obscure detail, > or risk obscure bugs. > > > Why bother with a if_softc field when the interface and softc pointer are > supposed to be the same? Also, the very old Lance driver (lnc) has this > problem. It makes me wonder how true we are to TCP/IP Illustrated... > > So while this wouldn't really be a bug fix, perhaps we should do my > suggested change anyway to avoid modifying the drivers. > > Regards, > Bill Baumann > > > On Tue, 16 Jul 2002, Kelly Yancey wrote: > > > On Tue, 16 Jul 2002, Bill Baumann wrote: > > > > > > > > In net/if.c in a couple of places, the ethernet address is > needed. This > > > is stored in the arpcom structure. A couple lines of code in > if.c require > > > struct arpcom be at the very begining of device softc > structures. Nearly > > > all drivers observe this. However, several do not. Sadly, > this includes > > > the one I'm working on. > > > > > > net/if.c routines if_findindex() and if_setlladdr() gain access to the > > > ethernet address via the following expression: > > > > > > ((struct arpcom *)ifp->if_softc)->ac_enaddr > > > > > > The above code assumes that the if_softc pointer is equivalent to an > > > struct arpcom pointer. The awi, ray, lnc and pdq drivers have other > > > fields at the beginning of their softc structures. Attempts > to set the > > > ethernet address of these devices may cause corruption. > > > > > > > > > Shouldn't access of arpcom be via ifp instead? > > > > > > ((struct arpcom *)ifp)->ac_enaddr > > > > > > > > > For example, if_ethersubr.c uses the following macro: > > > #define IFP2AC(IFP) ((struct arpcom *)IFP) > > > > > > It looked to me like the other code in net, like > if_ethersubr.c use ifp > > > rather than if_softc to find struct arpcom. > > > > > > Bug? > > > > > > > Design. :) See page 77 of Stevens' TCP/IP Illustrated Volume > 2. By putting > > the structures at the beginning of the softc, the networking > code can access > > them without any explicit knowledge of the driver's softc > itself (i.e. it can > > use the softc as an opaque encapsulated version of either the > arpcom or ifnet > > structures). The bug, then, would seem to be in the network > drivers that > > don't follow this convention. But I'm not familiar with those > particular > > drivers, so I cannot comment on them; perhaps they employ some > cleverness to > > circumvent the requirement (by why?). Anyway, it should be obvious that > > accessing the arpcom structure via casting from the ifnet > structure or the > > softc structure are supposed to have the same results, so the > code your quoted > > above is fine. > > > > Kelly > > > > -- > > Kelly Yancey -- kbyanc@{posi.net,FreeBSD.org} > > "The worst sin towards our fellow creatures is not to hate > them, but to be > > indifferent to them; that's the essence of inhumanity." > > -- George Bernard Shaw > > > > > > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > > with "unsubscribe freebsd-net" in the body of the message > > > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-net" in the body of the message > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?NDBBKKEELKBCJJBEGDECGEJECEAA.jimmcgra>