On Fri, Oct 23, 2015 at 01:54:36PM +0200, Martin Pieuchot wrote:
> On 23/10/15(Fri) 13:21, David Gwynne wrote:
> > 
> > > On 23 Oct 2015, at 09:00, Reyk Floeter <r...@openbsd.org> wrote:
> > > 
> > > Hi,
> > > 
> > > this diff allows to interconnect routing domains.
> > > 
> > > It is very useful to route traffic from one routing domain to another,
> > > without using the pf "rtable" hack (tested in production for a long
> > > time).
> > > 
> > > eg.,
> > > # ifconfig vether0 10.0.1.1/24
> > > # ifconfig vether1 rdomain 1 10.0.1.2/24
> > > # ping 10.1.1.2
> > > # route -T 1 add default 10.0.1.1
> > > # ifconfig bridge0 add vether0 add em0
> > > 
> > > for hacking/testing, you can do thing like:
> > > # dhcpd vether0
> > > # dhclient vether1
> > > 
> > > It has been discussed in much detail if this is possible with
> > > bridge(4).  It is not.  The bridge is not designed for it and explain
> > > on request.
> > 
> > the diff implements a crossover option, but the example above doesnt use 
> > them. does that mean you can use a bridge to build crossovers without the 
> > extra code, or the example is wrong?
> 
> As said yesterday an alternative would be to use the bridge(4) as below:
> 

no.

You missed the discussion in the morning: your diff is for the receive
path (data received on one interface and received on others) and not
for the transmit path (data sent from one interface and sent out on
one or more others).  The transmit path is bridge_output() ->
bridge_ifenqueue() (TX) only.

I need "data sent on one interface, but received on others". It
doesn't make much sense to tx->rx on the same bridge, I illustrated it
on the board in front of you:

        http://arc4random.com/bridge-booom.jpg

I also think doing such a hack on rdomains in bridge(4) would be
another ugly hack in bridge(4).

Updated pair(4) diff follows.

Reyk

> Index: net/if_bridge.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_bridge.c,v
> retrieving revision 1.268
> diff -u -p -r1.268 if_bridge.c
> --- net/if_bridge.c   12 Oct 2015 10:03:25 -0000      1.268
> +++ net/if_bridge.c   23 Oct 2015 11:52:13 -0000
> @@ -1218,10 +1218,12 @@ bridgeintr_frame(struct bridge_softc *sc
>       if (m == NULL)
>               return;
>       /*
> -      * If the packet is a multicast or broadcast OR if we don't
> -      * know any better, forward it to all interfaces.
> +      * If the packet is a multicast/broadcast, if we don't know
> +      * any better or if the destination is in a different routing
> +      * domain, forward it to all interfaces.
>        */
> -     if ((m->m_flags & (M_BCAST | M_MCAST)) || dst_if == NULL) {
> +     if ((m->m_flags & (M_BCAST | M_MCAST)) || dst_if == NULL ||
> +         (dst_if->if_rdomain != src_if->if_rdomain)) {
>               sc->sc_if.if_imcasts++;
>               bridge_broadcast(sc, src_if, &eh, m);
>               return;
> 

The transmit path is bridge_output() -> bridge_ifenqueue() (TX) only.
-- 

Reply via email to