Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Feb 2008 06:28:11 -0800 (PST)
From:      Barney Cordoba <barney_cordoba@yahoo.com>
To:        net@freebsd.org
Subject:   Bridge design issues
Message-ID:  <804857.47220.qm@web63906.mail.re1.yahoo.com>

next in thread | raw e-mail | index | archive | help
I've been playing with the bridging code, and
something doesn't seem quite right about it.  It seems
to work better and more efficiently when configured
the "wrong" way, according to the handbook.

The "correct" way would be a settup as follows:

bridge0  1.2.3.4 netmask 255.255.255.0 addm em0 addm
em1 up

where the bridge has the address and em0 and em1 are
members of the bridge. However this results in some
ugliness:

The path for traffic originating from the system
itself goes through the standard ethernet output
machinery and gets queued twice:

ip_output(bridge0) -> ether_output(bridge0) -> queued
on bridge0 :: bridge_start() ->bridge_enqueue(em0/em1)

bridge_output() is never used in this setup:

When the following "wrong" setup is used:

ifconfig em0 1.2.3.4 netmask 255.255.255.0
ifconfig bridge0 addm em0 addm em1 up

Where em0 has the address. This results in 2 desirable
things: 1) a real ethernet is used in packets, and 2)
the path is streamlined:

ip_output(bridge0) -> ether_output(bridge0) ->
bridge_output(bridge0) -> bridge_enqueue(em0/em1)


In my view, it should work the same no matter what the
setup, if done correctly. Any output sent to a bridge
should be passed through the same bridge output
machinery. So

ether_output(em0|em1|bridge0)  should all resolve to
bridge_output(bridge0) and let the bridge determine
the proper path.

The reason the FreeBSD code doesn't work this way is
that the bridge interface doesn't point to itself.
Setting if_bridge in the bridge interface structure to
point to itself seems to normalized the path.
bridge_output() needs to be made aware that it may be
passed a bridge interface to make sure it resolves the
route before trying to send the packet.
bridge_forward() should also use bridge_output()
rather than resolving itself. The bridge resolution is
always the same logic; its undesirable to have
different paths for every case. Arguably, packets that
arrive from the local stack are no different from ones
that arrive via a bridge member in terms of output
resolution.

There should also be a way to assign a static ethernet
address to a bridge interface so its always the same.
ISPs in many countries are required to keep track of
devices so random ethernets are problematic idea for
them

Barney



      ____________________________________________________________________________________
Looking for last minute shopping deals?  
Find them fast with Yahoo! Search.  http://tools.search.yahoo.com/newsearch/category.php?category=shopping



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?804857.47220.qm>