Currently, our bridge(4) code forwards ethernet frames with
destination MAC address 01:80:C2:00:00:0X, except for X=0 (STP BPDUs).
This is not allowed according to 802.1D-2004, section 7.12.6: these
addresses are reserved (and currently used by eg. LLDP). In turn,
this causes issues for ports such as net/ladvd.
This will filter out those reserved addresses and not forward them.
Please test and report success or failure directly to me.
Thanks,
Paul 'WEiRD' de Weerd
Index: if_bridge.c
===================================================================
RCS file: /cvs/src/sys/net/if_bridge.c,v
retrieving revision 1.185
diff -u -r1.185 if_bridge.c
--- if_bridge.c 28 Oct 2010 13:49:54 -0000 1.185
+++ if_bridge.c 28 Oct 2010 16:12:36 -0000
@@ -1421,10 +1421,23 @@
bridge_span(sc, eh, m);
if (m->m_flags & (M_BCAST | M_MCAST)) {
- /* Tap off 802.1D packets, they do not get forwarded */
- if (bcmp(eh->ether_dhost, bstp_etheraddr, ETHER_ADDR_LEN) == 0)
{
- bstp_input(sc->sc_stp, ifl->bif_stp, eh, m);
- return (NULL);
+ /*
+ * Reserved destination MAC addresses (01:80:C2:00:00:0x)
+ * should not be forwarded to bridge members according to
+ * section 7.12.6 of the 802.1D-2004 specification. The
+ * STP destination address (as stored in bstp_etheraddr)
+ * is the first of these.
+ */
+ if (bcmp(eh->ether_dhost, bstp_etheraddr, ETHER_ADDR_LEN - 1)
+ == 0) {
+ if (eh->ether_dhost[ETHER_ADDR_LEN - 1] == 0) {
+ /* STP traffic */
+ bstp_input(sc->sc_stp, ifl->bif_stp, eh, m);
+ return (NULL);
+ } else if (eh->ether_dhost[ETHER_ADDR_LEN - 1] <= 0xf) {
+ m_freem(m);
+ return (NULL);
+ }
}
/*
--
>++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+
+++++++++++>-]<.>++[<------------>-]<+.--------------.[-]
http://www.undeadly.org