Fortunately, none of the offending drivers (awi,lnc,pdq,ray) use mii.

On Wed, 17 Jul 2002, Jim McGrath wrote:

> 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: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED]]On Behalf Of Bill Baumann
> > Sent: Wednesday, July 17, 2002 1:58 PM
> > To: Kelly Yancey
> > Cc: [EMAIL PROTECTED]
> > 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 [EMAIL PROTECTED]
> > > with "unsubscribe freebsd-net" in the body of the message
> > >
> >
> >
> > To Unsubscribe: send mail to [EMAIL PROTECTED]
> > with "unsubscribe freebsd-net" in the body of the message
> >
> 
> 


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message

Reply via email to