Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Jul 2002 18:28:46 -0700 (PDT)
From:      Kelly Yancey <kbyanc@posi.net>
To:        Bill Baumann <bbaumann@isilon.com>
Cc:        freebsd-net@FreeBSD.ORG
Subject:   Re: Inconsistency between net/if.c and several ethernet drivers
Message-ID:  <20020716180110.E4709-100000@gateway.posi.net>
In-Reply-To: <Pine.BSF.4.21.0207161207140.78028-100000@isilon.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020716180110.E4709-100000>