From owner-freebsd-net@FreeBSD.ORG Wed Mar 7 21:02:56 2007 Return-Path: X-Original-To: freebsd-net@freebsd.org Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B478716A501; Wed, 7 Mar 2007 21:02:56 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: from heff.fud.org.nz (203-109-251-39.static.bliink.ihug.co.nz [203.109.251.39]) by mx1.freebsd.org (Postfix) with ESMTP id 32DE713C4AA; Wed, 7 Mar 2007 21:02:55 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: by heff.fud.org.nz (Postfix, from userid 1001) id ADB201CC5A; Thu, 8 Mar 2007 10:02:54 +1300 (NZDT) Date: Thu, 8 Mar 2007 10:02:54 +1300 From: Andrew Thompson To: Roman Kurakin Message-ID: <20070307210254.GD54828@heff.fud.org.nz> References: <45E9F1E8.2000802@inse.ru> <20070304062203.GL80319@codelabs.ru> <45E9F1E8.2000802@inse.ru> <20070304160613.GN80319@codelabs.ru> <45EDA348.3030309@inse.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <45EDA348.3030309@inse.ru> User-Agent: Mutt/1.5.13 (2006-08-11) Cc: rik@FreeBSD.org, andre@FreeBSD.org, freebsd-net@freebsd.org, bms@FreeBSD.org, glebius@FreeBSD.org Subject: Re: kern/109815: wrong interface identifier at pfil_hooks for vlans + if_bridge X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 07 Mar 2007 21:02:56 -0000 On Tue, Mar 06, 2007 at 08:22:16PM +0300, Roman Kurakin wrote: > Ok, since no one want to provide an explanation I'll to do it myself. ... > I suggest to fix this problem in the other way, by checking if the > physical interface > is the dst interface by MAC. Eq if we got packet from Ci, it will be > market as received > from Ci, not from Cj. Yes it will add double checking for this interface > it is not the > dst with some probability, but will optimize the case the dst is the > current one cause > we will not check the list. This will keep the old behaviour eq case 1 > and will do the > same trick for cases like VLANs. Here my variant of the patch: I think this is probably the best way to do it. I have only been loosely following this thread due to other stuff going on. > > + /* Give a chance for ifp at first priority. This will help in case > we > + * the packet comes through the interface with VLAN's and the same > + * MACs on several interfaces in a bridge. Also will save some > circles > + * in case dst interface is the physical input interface (eq ifp). > + */ > + if (ifp->if_type == IFT_GIF ^^^^^^^^^^^^^^^^^^^^^^^ is this check right? > + && (memcmp(IF_LLADDR(bif2->bif_ifp), eh->ether_dhost, > + ETHER_ADDR_LEN) == 0 > +#ifdef DEV_CARP > + || (bif2->bif_ifp->if_carp > + && carp_forus(bif2->bif_ifp->if_carp, eh->ether_dhost)) > +#endif > + )) { > + if (bif->bif_flags & IFBIF_LEARNING) > + (void) bridge_rtupdate(sc, > + eh->ether_shost, bif, 0, IFBAF_DYNAMIC); > + m->m_pkthdr.rcvif = ifp; > + BRIDGE_UNLOCK(sc); > + return (m); > + } I will be keen to see your final patch. Andrew