diff options
author | Marco Pfatschbacher <mpf@cvs.openbsd.org> | 2012-09-20 14:10:19 +0000 |
---|---|---|
committer | Marco Pfatschbacher <mpf@cvs.openbsd.org> | 2012-09-20 14:10:19 +0000 |
commit | 7c9894d57a7f696a314e3b1ddb0b21a3f123dc4d (patch) | |
tree | 21b3344f113435f4e6f41c7bc7f8b7cfd3fa2220 /sys/net | |
parent | 06e2955cdc9dc864884658fa3502f0887b1feb94 (diff) |
Don't filter spanning tree BPDUs. Either process, or forward them.
Even though this violates IEEE 802.1D, we'd rather avoid bridging loops
by not getting in the way of STP.
OK henning, camield, reyk
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/bridgestp.c | 7 | ||||
-rw-r--r-- | sys/net/if_bridge.c | 7 | ||||
-rw-r--r-- | sys/net/if_bridge.h | 4 |
3 files changed, 10 insertions, 8 deletions
diff --git a/sys/net/bridgestp.c b/sys/net/bridgestp.c index bfc282c9a4c..70c4e63511a 100644 --- a/sys/net/bridgestp.c +++ b/sys/net/bridgestp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bridgestp.c,v 1.40 2011/07/09 04:53:33 henning Exp $ */ +/* $OpenBSD: bridgestp.c,v 1.41 2012/09/20 14:10:18 mpf Exp $ */ /* * Copyright (c) 2000 Jason L. Wright (jason@thought.net) @@ -594,7 +594,7 @@ bstp_pdu_flags(struct bstp_port *bp) return (flags); } -void +struct mbuf * bstp_input(struct bstp_state *bs, struct bstp_port *bp, struct ether_header *eh, struct mbuf *m) { @@ -602,7 +602,7 @@ bstp_input(struct bstp_state *bs, struct bstp_port *bp, u_int16_t len; if (bs == NULL || bp == NULL || bp->bp_active == 0) - goto out; + return (m); len = ntohs(eh->ether_type); if (len < sizeof(tpdu)) @@ -654,6 +654,7 @@ bstp_input(struct bstp_state *bs, struct bstp_port *bp, out: if (m) m_freem(m); + return (NULL); } void diff --git a/sys/net/if_bridge.c b/sys/net/if_bridge.c index 052cd6c626e..54503a16dc6 100644 --- a/sys/net/if_bridge.c +++ b/sys/net/if_bridge.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_bridge.c,v 1.195 2012/09/20 10:25:03 blambert Exp $ */ +/* $OpenBSD: if_bridge.c,v 1.196 2012/09/20 14:10:18 mpf Exp $ */ /* * Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net) @@ -1418,8 +1418,9 @@ bridge_input(struct ifnet *ifp, struct ether_header *eh, struct mbuf *m) == 0) { if (eh->ether_dhost[ETHER_ADDR_LEN - 1] == 0) { /* STP traffic */ - bstp_input(sc->sc_stp, ifl->bif_stp, eh, m); - return (NULL); + if ((m = bstp_input(sc->sc_stp, ifl->bif_stp, + eh, m)) == NULL); + return (NULL); } else if (eh->ether_dhost[ETHER_ADDR_LEN - 1] <= 0xf) { m_freem(m); return (NULL); diff --git a/sys/net/if_bridge.h b/sys/net/if_bridge.h index 4d393b74ff3..68f3047b1f2 100644 --- a/sys/net/if_bridge.h +++ b/sys/net/if_bridge.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_bridge.h,v 1.34 2010/11/20 14:23:09 fgsch Exp $ */ +/* $OpenBSD: if_bridge.h,v 1.35 2012/09/20 14:10:18 mpf Exp $ */ /* * Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net) @@ -444,7 +444,7 @@ void bstp_stop(struct bstp_state *); int bstp_ioctl(struct ifnet *, u_long, caddr_t); struct bstp_port *bstp_add(struct bstp_state *, struct ifnet *); void bstp_delete(struct bstp_port *); -void bstp_input(struct bstp_state *, struct bstp_port *, +struct mbuf *bstp_input(struct bstp_state *, struct bstp_port *, struct ether_header *, struct mbuf *); void bstp_ifstate(void *); u_int8_t bstp_getstate(struct bstp_state *, struct bstp_port *); |