From owner-freebsd-net Wed Jul 17 11:25:38 2002 Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A6CDA37B400 for ; Wed, 17 Jul 2002 11:25:33 -0700 (PDT) Received: from out005.verizon.net (out005pub.verizon.net [206.46.170.143]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5D83D43E75 for ; Wed, 17 Jul 2002 11:25:32 -0700 (PDT) (envelope-from jimmcgra@bellatlantic.net) Received: from Default ([141.154.238.54]) by out005.verizon.net (InterMail vM.5.01.05.05 201-253-122-126-105-20020426) with SMTP id <20020717182443.IIPC20552.out005.verizon.net@Default>; Wed, 17 Jul 2002 13:24:43 -0500 From: "Jim McGrath" To: "Kelly Yancey" , "Bill Baumann" Cc: "Jim McGrath" , Subject: RE: Inconsistency between net/if.c and several ethernet drivers Date: Wed, 17 Jul 2002 14:25:29 -0400 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 In-Reply-To: Importance: Normal Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org 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