From owner-freebsd-net@FreeBSD.ORG Tue Mar 13 05:50:38 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 F11BC16A401; Tue, 13 Mar 2007 05:50:37 +0000 (UTC) (envelope-from rea-fbsd@codelabs.ru) Received: from pobox.codelabs.ru (pobox.codelabs.ru [144.206.177.45]) by mx1.freebsd.org (Postfix) with ESMTP id 870B113C44C; Tue, 13 Mar 2007 05:50:37 +0000 (UTC) (envelope-from rea-fbsd@codelabs.ru) Received: from codelabs.ru (pobox.codelabs.ru [144.206.177.45]) by pobox.codelabs.ru with esmtpsa (TLSv1:AES256-SHA:256) id 1HQzu7-000PEx-CX; Tue, 13 Mar 2007 08:50:36 +0300 Date: Tue, 13 Mar 2007 08:50:29 +0300 From: Eygene Ryabinkin To: Yar Tikhiy Message-ID: <20070313055029.GK58523@codelabs.ru> References: <45ED900A.7050208@FreeBSD.org> <20070312092406.GJ58523@codelabs.ru> <45F51F2B.5020906@FreeBSD.org> <20070312112056.GC44732@comp.chem.msu.su> <45F554F5.8020505@FreeBSD.org> <20070312140219.GE44732@comp.chem.msu.su> <20070312143811.GA58523@codelabs.ru> <20070312165145.GF44732@comp.chem.msu.su> <45F5BD36.1070205@inse.ru> <20070312214926.GK44732@comp.chem.msu.su> MIME-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline In-Reply-To: <20070312214926.GK44732@comp.chem.msu.su> Sender: rea-fbsd@codelabs.ru X-Spam-Status: No, score=-3.4 required=4.0 tests=ALL_TRUSTED,AWL,BAYES_00 Cc: rik@FreeBSD.org, Roman Kurakin , andre@FreeBSD.org, freebsd-net@FreeBSD.org, glebius@FreeBSD.org, thompsa@FreeBSD.org, "Bruce M. Simpson" 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: Tue, 13 Mar 2007 05:50:38 -0000 Yar, good day. > > >>Probably because if_bridge is written for Ethernet, 802.11 and > > >>may be some other 802 interfaces: > > >>----- > > >>DESCRIPTION > > >> The if_bridge driver creates a logical link between two or more IEEE > > >> 802 > > >> networks that use the same (or ``similar enough'') framing format. > > >> For > > >> example, it is possible to bridge Ethernet and 802.11 networks > > >> together, > > >> but it is not possible to bridge Ethernet and Token Ring together. > > >>----- > > >> > > > > > >The IEEE standards don't prevent us from keeping the pointer to the > > >receive interface and using it to identify the interface unambiguously. > > >That's what I meant. OK, no problem: we can keep the actual incoming interface in the mbuf. > > >>>Each frame was received via a particular interface, which is recorded > > >>>in mbuf's recvif. As the frame moves between levels of abstraction, > > >>>such as a physical interface, vlan, bridge, recvif can change, but > > >>>at each level the pointer to an entity in the previous level should > > >>>be enough, shouldn't it? > > >>> > > >>Excuse me, but are we talking about the problem that is cured by > > >>our patch, or about some general points? If about the former, then > > >>this problem shows up only for the packet that is destined for the > > >>local interface at the L2. And the pfil gots the wrong interface name > > >>due to the bug. > > >> > > > > > >A patch is unlikely to be correct if it's based on wrong assumptions. Yes, it is based on the wrong assumptions that were made about 3-4 years ago in the NetBSD. And the real problem here is if we want to leave the current behaviour of locally destined packets or we want completely different thing. We asked in the list if someone uses the current behaviour, but no replies were received yet. > > >>And who is saying that if_bridge should need to know about the > > >>underlying (parent) interface for the VLAN? The word 'physical' that > > >>we use here denotes the VLAN interface in which the packet showed up > > >>at ether_input. And the word 'logical' means the interface that > > >>the L2 packet is destined for. Perhaps it is the source of confusion? > > >> > > > > > >Quite likely. Even pfil is confused. ;^) As I've managed to figure > > >out finally, the "physical" interface (in this discussion) is the > > >interface the L2 packet actually came from, and the "logical" one > > >just bears the MAC address equal to that in the destination field > > >of the packet. > > > > > >The problem is that we cannot determine the "logical" interface > > >reliably in the presence of interfaces sharing the same MAC address. > > >No hacks can help us with that. Sure. And that is why all switches that can bear the IP on their interfaces have distinct MACs for each interface or/and the only one interface can have the IP. And that is why I am going to add the paragraph to the if_bridge(4) describing the current situation and giving advice on the setting IP for the bridge members and the bridge itself. Will provide the patch in a day or two. > > >Assume that a host has two physical interfaces, say, em0 and em1, > > >with different MAC addresses. We set up a few vlans on the former > > >and a few vlans on the latter, and then bridge all vlans together. > > >Now an Ethernet packet comes via, say, em0.7, with its destination > > >MAC address equal to that of em1 (and its vlans). Which of em1.* > > >vlans would you "logically" assign the packet to, and why? > > > > > This problem was described in my "very long e-mail". And yes it can not be > > fixed. Only if we will try to assign the packet to every interfaces in > > bridge > > with the same MAC, until the rules for the one allow this packet. This > > is too > > heavy solution. But if we can't fix the all sides of this problem it > > doesn't mean > > we shouldn't try to fix one that possible. > > See bms_netdev, it's rather promising: with it, we won't have to do > duplicate checks for the destination MAC address. Namely see lines > 642-682 of //depot/user/bms/netdev/sys/net/if_ethersubr.c#9. > The things may need some moving around, but all code is already there. > Then the bridge_input code will be able to make use of M_PROMISC to > see if it must consume the packet or just update its forwarding table. I tried to understand this, because Bruce already gave me a patch, but I am a bit stupid: I do not see how M_PROMISC that is cleared unconditionally before BRIDGE_INPUT will help us to identify the right interface. As I see now, the BRIDGE_INPUT is called once from if_ethersubr.c, once from if_gif.c and once from ng_ether.c: http://fxr.watson.org/fxr/ident?i=BRIDGE_INPUT So there is no distinct code paths that can allow BRIDGE_INPUT to modify its behaviour based on the M_PROMISC flag. But I feel that I am wrong in some place and missing some discuission on the M_PROMISC. Can anyone point me to the right place? > So all the tangled if()s inside LIST_FOREACH() will be gone completely > from bridge_input(). But we still need to see if we want to consume the packet by the bridge or it members or to do forwarding. Am I missing something? > > >I'm afraid there is a serious flaw in the very notion of such a > > >"logical" interface. If it's true, we should start by admitting > > >that the support for "logical" interfaces should be a side hack for > > >compatibility, and not something that can live forever on the main > > >code path. I agree with you. That is why I patched if_bridge once again to enable the pfil hooks for the "physical" incoming interface. And there are two ways to solve the problem: - to give each VLAN interface the distinct MAC, as Bruce suggested, - to refuse the "logical" interfaces completely and to support only "physical" ones. It is what my very first (and very short) patch did. But this can break some existing firewall rulesets. And that should be discuissed -- we do not need the total breakage due to out changes. And you're right: the best way for this alternative is to leave the current behaviour as the compatibility sysctl that is turned off by default and move to the filtering on the "physical" interfaces by default. No problem, but skilled network people that are using FreeBSD as the bridge for VLANs should say if they are happy with it. -- Eygene