Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Jul 2002 12:12:03 -0700 (PDT)
From:      Bill Baumann <bbaumann@isilon.com>
To:        freebsd-net@FreeBSD.ORG
Subject:   Inconsistency between net/if.c and several ethernet drivers
Message-ID:  <Pine.BSF.4.21.0207161207140.78028-100000@isilon.com>

next in thread | raw e-mail | index | archive | help

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?

- Bill Baumann (bbaumann@isilon.com)


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?Pine.BSF.4.21.0207161207140.78028-100000>