I need help testing this bridge diff, as I cannot test (or even imagine) all the possible bridge setups.
It brings a nice speed improvement and simplifies the code. Testing especially appreciated with gif, tun and vether interfaces in the bridge. I can provide i386 and amd64 kernels to make it convenient. :-) Thanks! Index: dev/isa/if_ie.c =================================================================== RCS file: /cvs/src/sys/dev/isa/if_ie.c,v retrieving revision 1.35 diff -u -p -r1.35 if_ie.c --- dev/isa/if_ie.c 28 Nov 2008 02:44:17 -0000 1.35 +++ dev/isa/if_ie.c 18 Sep 2012 09:55:59 -0000 @@ -1054,16 +1054,16 @@ check_eh(sc, eh, to_bpf) */ #if NBPFILTER > 0 *to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0) || - (sc->sc_arpcom.ac_if.if_bridge != NULL); + (sc->sc_arpcom.ac_if.if_bridgeport != NULL); #else - *to_bpf = (sc->sc_arpcom.ac_if.if_bridge != NULL); + *to_bpf = (sc->sc_arpcom.ac_if.if_bridgeport != NULL); #endif /* If for us, accept and hand up to BPF */ if (ether_equal(eh->ether_dhost, sc->sc_arpcom.ac_enaddr)) return 1; #if NBPFILTER > 0 - if (*to_bpf && sc->sc_arpcom.ac_if.if_bridge == NULL) + if (*to_bpf && sc->sc_arpcom.ac_if.if_bridgeport == NULL) *to_bpf = 2; /* we don't need to see it */ #endif @@ -1095,9 +1095,9 @@ check_eh(sc, eh, to_bpf) */ #if NBPFILTER > 0 *to_bpf = (sc->sc_arpcom.ac_if.if_bpf != 0) || - (sc->sc_arpcom.ac_if.if_bridge != NULL); + (sc->sc_arpcom.ac_if.if_bridgeport != NULL); #else - *to_bpf = (sc->sc_arpcom.ac_if.if_bridge != NULL); + *to_bpf = (sc->sc_arpcom.ac_if.if_bridgeport != NULL); #endif /* We want to see multicasts. */ if (eh->ether_dhost[0] & 1) @@ -1109,7 +1109,7 @@ check_eh(sc, eh, to_bpf) /* Anything else goes to BPF but nothing else. */ #if NBPFILTER > 0 - if (*to_bpf && sc->sc_arpcom.ac_if.if_bridge == NULL) + if (*to_bpf && sc->sc_arpcom.ac_if.if_bridgeport == NULL) *to_bpf = 2; #endif return 1; Index: net/bridgestp.c =================================================================== RCS file: /cvs/src/sys/net/bridgestp.c,v retrieving revision 1.40 diff -u -p -r1.40 bridgestp.c --- net/bridgestp.c 9 Jul 2011 04:53:33 -0000 1.40 +++ net/bridgestp.c 18 Sep 2012 09:56:00 -0000 @@ -1640,7 +1640,6 @@ void bstp_ifstate(void *arg) { struct ifnet *ifp = (struct ifnet *)arg; - struct bridge_softc *sc; struct bridge_iflist *p; struct bstp_port *bp; struct bstp_state *bs; @@ -1648,16 +1647,11 @@ bstp_ifstate(void *arg) if (ifp->if_type == IFT_BRIDGE) return; - sc = (struct bridge_softc *)ifp->if_bridge; s = splnet(); - LIST_FOREACH(p, &sc->sc_iflist, next) { - if ((p->bif_flags & IFBIF_STP) == 0) - continue; - if (p->ifp == ifp) - break; - } - if (p == LIST_END(&sc->sc_iflist)) + if ((p = (struct bridge_iflist *)ifp->if_bridgeport) == NULL) + goto done; + if ((p->bif_flags & IFBIF_STP) == 0) goto done; if ((bp = p->bif_stp) == NULL) goto done; @@ -2120,7 +2114,7 @@ bstp_ifsflags(struct bstp_port *bp, u_in int bstp_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { - struct bridge_softc *sc = (struct bridge_softc *)ifp; + struct bridge_softc *sc = (struct bridge_softc *)ifp->if_softc; struct bstp_state *bs = sc->sc_stp; struct ifbrparam *ifbp = (struct ifbrparam *)data; struct ifbreq *ifbr = (struct ifbreq *)data; @@ -2137,15 +2131,8 @@ bstp_ioctl(struct ifnet *ifp, u_long cmd err = ENOENT; break; } - if ((caddr_t)sc != ifs->if_bridge) { - err = ESRCH; - break; - } - LIST_FOREACH(p, &sc->sc_iflist, next) { - if (p->ifp == ifs) - break; - } - if (p == LIST_END(&sc->sc_iflist)) { + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { err = ESRCH; break; } Index: net/if.c =================================================================== RCS file: /cvs/src/sys/net/if.c,v retrieving revision 1.241 diff -u -p -r1.241 if.c --- net/if.c 3 Jan 2012 23:41:51 -0000 1.241 +++ net/if.c 18 Sep 2012 09:56:00 -0000 @@ -531,7 +531,7 @@ if_detach(struct ifnet *ifp) #if NBRIDGE > 0 /* Remove the interface from any bridge it is part of. */ - if (ifp->if_bridge) + if (ifp->if_bridgeport) bridge_ifdetach(ifp); #endif @@ -1094,7 +1094,7 @@ if_down(struct ifnet *ifp) carp_carpdev_state(ifp); #endif #if NBRIDGE > 0 - if (ifp->if_bridge) + if (ifp->if_bridgeport) bstp_ifstate(ifp); #endif rt_ifmsg(ifp); @@ -1130,7 +1130,7 @@ if_up(struct ifnet *ifp) carp_carpdev_state(ifp); #endif #if NBRIDGE > 0 - if (ifp->if_bridge) + if (ifp->if_bridgeport) bstp_ifstate(ifp); #endif rt_ifmsg(ifp); Index: net/if.h =================================================================== RCS file: /cvs/src/sys/net/if.h,v retrieving revision 1.133 diff -u -p -r1.133 if.h --- net/if.h 10 Sep 2012 02:24:24 -0000 1.133 +++ net/if.h 18 Sep 2012 09:56:00 -0000 @@ -270,7 +270,7 @@ struct ifnet { /* and the entries */ char if_xname[IFNAMSIZ]; /* external name (name + unit) */ int if_pcount; /* number of promiscuous listeners */ caddr_t if_bpf; /* packet filter structure */ - caddr_t if_bridge; /* bridge structure */ + caddr_t if_bridgeport; /* used by bridge ports */ caddr_t if_tp; /* used by trunk ports */ caddr_t if_pf_kif; /* pf interface abstraction */ union { Index: net/if_bridge.c =================================================================== RCS file: /cvs/src/sys/net/if_bridge.c,v retrieving revision 1.194 diff -u -p -r1.194 if_bridge.c --- net/if_bridge.c 16 Jul 2012 18:05:36 -0000 1.194 +++ net/if_bridge.c 18 Sep 2012 09:56:00 -0000 @@ -273,7 +273,7 @@ bridge_delete(struct bridge_softc *sc, s if (p->bif_flags & IFBIF_STP) bstp_delete(p->bif_stp); - p->ifp->if_bridge = NULL; + p->ifp->if_bridgeport = NULL; error = ifpromisc(p->ifp, 0); LIST_REMOVE(p, next); @@ -310,11 +310,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c error = ENOENT; break; } - if (ifs->if_bridge == (caddr_t)sc) { - error = EEXIST; - break; - } - if (ifs->if_bridge != NULL) { + if (ifs->if_bridgeport != NULL) { error = EBUSY; break; } @@ -384,28 +380,28 @@ bridge_ioctl(struct ifnet *ifp, u_long c break; } + p->bridge_sc = sc; p->ifp = ifs; p->bif_flags = IFBIF_LEARNING | IFBIF_DISCOVER; SIMPLEQ_INIT(&p->bif_brlin); SIMPLEQ_INIT(&p->bif_brlout); - ifs->if_bridge = (caddr_t)sc; + ifs->if_bridgeport = (caddr_t)p; LIST_INSERT_HEAD(&sc->sc_iflist, p, next); break; case SIOCBRDGDEL: if ((error = suser(curproc, 0)) != 0) break; - - LIST_FOREACH(p, &sc->sc_iflist, next) { - if (strncmp(p->ifp->if_xname, req->ifbr_ifsname, - sizeof(p->ifp->if_xname)) == 0) { - error = bridge_delete(sc, p); - break; - } - } - if (p == LIST_END(&sc->sc_iflist)) { + ifs = ifunit(req->ifbr_ifsname); + if (ifs == NULL) { error = ENOENT; break; } + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { + error = ESRCH; + break; + } + error = bridge_delete(sc, p); break; case SIOCBRDGIFS: error = bridge_bifconf(sc, (struct ifbifconf *)data); @@ -418,11 +414,7 @@ bridge_ioctl(struct ifnet *ifp, u_long c error = ENOENT; break; } - if (ifs->if_bridge == (caddr_t)sc) { - error = EEXIST; - break; - } - if (ifs->if_bridge != NULL) { + if (ifs->if_bridgeport != NULL) { error = EBUSY; break; } @@ -467,15 +459,8 @@ bridge_ioctl(struct ifnet *ifp, u_long c error = ENOENT; break; } - if ((caddr_t)sc != ifs->if_bridge) { - error = ESRCH; - break; - } - LIST_FOREACH(p, &sc->sc_iflist, next) { - if (p->ifp == ifs) - break; - } - if (p == LIST_END(&sc->sc_iflist)) { + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { error = ESRCH; break; } @@ -515,15 +500,8 @@ bridge_ioctl(struct ifnet *ifp, u_long c error = ENOENT; break; } - if ((caddr_t)sc != ifs->if_bridge) { - error = ESRCH; - break; - } - LIST_FOREACH(p, &sc->sc_iflist, next) { - if (p->ifp == ifs) - break; - } - if (p == LIST_END(&sc->sc_iflist)) { + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { error = ESRCH; break; } @@ -561,15 +539,13 @@ bridge_ioctl(struct ifnet *ifp, u_long c case SIOCBRDGSADDR: if ((error = suser(curproc, 0)) != 0) break; - ifs = ifunit(bareq->ifba_ifsname); if (ifs == NULL) { /* no such interface */ error = ENOENT; break; } - - if (ifs->if_bridge == NULL || - ifs->if_bridge != (caddr_t)sc) { + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { error = ESRCH; break; } @@ -626,16 +602,8 @@ bridge_ioctl(struct ifnet *ifp, u_long c error = ENOENT; break; } - if (ifs->if_bridge == NULL || - ifs->if_bridge != (caddr_t)sc) { - error = ESRCH; - break; - } - LIST_FOREACH(p, &sc->sc_iflist, next) { - if (p->ifp == ifs) - break; - } - if (p == LIST_END(&sc->sc_iflist)) { + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { error = ESRCH; break; } @@ -664,16 +632,8 @@ bridge_ioctl(struct ifnet *ifp, u_long c error = ENOENT; break; } - if (ifs->if_bridge == NULL || - ifs->if_bridge != (caddr_t)sc) { - error = ESRCH; - break; - } - LIST_FOREACH(p, &sc->sc_iflist, next) { - if (p->ifp == ifs) - break; - } - if (p == LIST_END(&sc->sc_iflist)) { + p = (struct bridge_iflist *)ifs->if_bridgeport; + if (p == NULL || p->bridge_sc != sc) { error = ESRCH; break; } @@ -731,51 +691,49 @@ bridge_ioctl(struct ifnet *ifp, u_long c void bridge_ifdetach(struct ifnet *ifp) { - struct bridge_softc *sc = (struct bridge_softc *)ifp->if_bridge; + struct bridge_softc *sc; struct bridge_iflist *bif; - LIST_FOREACH(bif, &sc->sc_iflist, next) - if (bif->ifp == ifp) { - bridge_delete(sc, bif); - break; - } + bif = (struct bridge_iflist *)ifp->if_bridgeport; + sc = bif->bridge_sc; + + bridge_delete(sc, bif); } void bridge_update(struct ifnet *ifp, struct ether_addr *ea, int delete) { - struct bridge_softc *sc = (struct bridge_softc *)ifp->if_bridge; + struct bridge_softc *sc; struct bridge_iflist *bif; u_int8_t *addr; addr = (u_int8_t *)ea; - LIST_FOREACH(bif, &sc->sc_iflist, next) - if (bif->ifp == ifp) { - /* - * Update the bridge interface if it is in - * the learning state. - */ - if ((bif->bif_flags & IFBIF_LEARNING) && - (ETHER_IS_MULTICAST(addr) == 0) && - !(addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && - addr[3] == 0 && addr[4] == 0 && addr[5] == 0)) { - /* Care must be taken with spanning tree */ - if ((bif->bif_flags & IFBIF_STP) && - (bif->bif_state == BSTP_IFSTATE_DISCARDING)) - return; - - /* Delete the address from the bridge */ - bridge_rtdaddr(sc, ea); + bif = (struct bridge_iflist *)ifp->if_bridgeport; + sc = bif->bridge_sc; - if (!delete) { - /* Update the bridge table */ - bridge_rtupdate(sc, ea, ifp, 0, - IFBAF_DYNAMIC); - } - } + /* + * Update the bridge interface if it is in + * the learning state. + */ + if ((bif->bif_flags & IFBIF_LEARNING) && + (ETHER_IS_MULTICAST(addr) == 0) && + !(addr[0] == 0 && addr[1] == 0 && addr[2] == 0 && + addr[3] == 0 && addr[4] == 0 && addr[5] == 0)) { + /* Care must be taken with spanning tree */ + if ((bif->bif_flags & IFBIF_STP) && + (bif->bif_state == BSTP_IFSTATE_DISCARDING)) return; + + /* Delete the address from the bridge */ + bridge_rtdaddr(sc, ea); + + if (!delete) { + /* Update the bridge table */ + bridge_rtupdate(sc, ea, ifp, 0, IFBAF_DYNAMIC); } + } + return; } int @@ -879,13 +837,8 @@ bridge_brlconf(struct bridge_softc *sc, ifp = ifunit(bc->ifbrl_ifsname); if (ifp == NULL) return (ENOENT); - if (ifp->if_bridge == NULL || ifp->if_bridge != (caddr_t)sc) - return (ESRCH); - LIST_FOREACH(ifl, &sc->sc_iflist, next) { - if (ifl->ifp == ifp) - break; - } - if (ifl == LIST_END(&sc->sc_iflist)) + ifl = (struct bridge_iflist *)ifp->if_bridgeport; + if (ifl == NULL || ifl->bridge_sc != sc) return (ESRCH); SIMPLEQ_FOREACH(n, &ifl->bif_brlin, brl_next) { @@ -1005,11 +958,11 @@ bridge_output(struct ifnet *ifp, struct #endif /* IPSEC */ /* ifp must be a member interface of the bridge. */ - sc = (struct bridge_softc *)ifp->if_bridge; - if (sc == NULL) { + if (ifp->if_bridgeport == NULL) { m_freem(m); return (EINVAL); } + sc = ((struct bridge_iflist *)ifp->if_bridgeport)->bridge_sc; if (m->m_len < sizeof(*eh)) { m = m_pullup(m, sizeof(*eh)); @@ -1207,11 +1160,8 @@ bridgeintr_frame(struct bridge_softc *sc sc->sc_if.if_ipackets++; sc->sc_if.if_ibytes += m->m_pkthdr.len; - LIST_FOREACH(ifl, &sc->sc_iflist, next) - if (ifl->ifp == src_if) - break; - - if (ifl == LIST_END(&sc->sc_iflist)) { + ifl = (struct bridge_iflist *)src_if->if_bridgeport; + if (ifl == NULL) { m_freem(m); return; } @@ -1327,14 +1277,7 @@ bridgeintr_frame(struct bridge_softc *sc m_freem(m); return; } - LIST_FOREACH(ifl, &sc->sc_iflist, next) { - if (ifl->ifp == dst_if) - break; - } - if (ifl == LIST_END(&sc->sc_iflist)) { - m_freem(m); - return; - } + ifl = (struct bridge_iflist *)dst_if->if_bridgeport; if ((ifl->bif_flags & IFBIF_STP) && (ifl->bif_state == BSTP_IFSTATE_DISCARDING)) { m_freem(m); @@ -1379,7 +1322,7 @@ bridge_input(struct ifnet *ifp, struct e /* * Make sure this interface is a bridge member. */ - if (ifp == NULL || ifp->if_bridge == NULL || m == NULL) + if (ifp == NULL || ifp->if_bridgeport == NULL || m == NULL) return (m); if ((m->m_flags & M_PKTHDR) == 0) @@ -1387,17 +1330,11 @@ bridge_input(struct ifnet *ifp, struct e m->m_flags &= ~M_PROTO1; /* Loop prevention */ - sc = (struct bridge_softc *)ifp->if_bridge; + ifl = (struct bridge_iflist *)ifp->if_bridgeport; + sc = ifl->bridge_sc; if ((sc->sc_if.if_flags & IFF_RUNNING) == 0) return (m); - LIST_FOREACH(ifl, &sc->sc_iflist, next) { - if (ifl->ifp == ifp) - break; - } - if (ifl == LIST_END(&sc->sc_iflist)) - return (m); - #if NBPFILTER > 0 if (sc->sc_if.if_bpf) bpf_mtap_hdr(sc->sc_if.if_bpf, (caddr_t)eh, @@ -1999,10 +1936,11 @@ bridge_rtage(struct bridge_softc *sc) void bridge_rtagenode(struct ifnet *ifp, int age) { - struct bridge_softc *sc = (struct bridge_softc *)ifp->if_bridge; + struct bridge_softc *sc; struct bridge_rtnode *n; int i; + sc = ((struct bridge_iflist *)ifp->if_bridgeport)->bridge_sc; if (sc == NULL) return; Index: net/if_bridge.h =================================================================== RCS file: /cvs/src/sys/net/if_bridge.h,v retrieving revision 1.34 diff -u -p -r1.34 if_bridge.h --- net/if_bridge.h 20 Nov 2010 14:23:09 -0000 1.34 +++ net/if_bridge.h 18 Sep 2012 09:56:01 -0000 @@ -384,6 +384,7 @@ struct bstp_state { */ struct bridge_iflist { LIST_ENTRY(bridge_iflist) next; /* next in list */ + struct bridge_softc *bridge_sc; struct bstp_port *bif_stp; /* STP port state */ struct brl_head bif_brlin; /* input rules */ struct brl_head bif_brlout; /* output rules */ @@ -391,6 +392,10 @@ struct bridge_iflist { u_int32_t bif_flags; /* member flags */ }; #define bif_state bif_stp->bp_state + +#define SAME_BRIDGE(_bp1, _bp2) \ + (_bp1 && _bp2 && ((struct bridge_iflist *)_bp1)->bridge_sc == \ + ((struct bridge_iflist *)_bp2)->bridge_sc) /* * Bridge route node Index: net/if_ethersubr.c =================================================================== RCS file: /cvs/src/sys/net/if_ethersubr.c,v retrieving revision 1.151 diff -u -p -r1.151 if_ethersubr.c --- net/if_ethersubr.c 9 Jul 2011 00:47:18 -0000 1.151 +++ net/if_ethersubr.c 18 Sep 2012 09:56:01 -0000 @@ -379,15 +379,14 @@ ether_output(ifp0, m0, dst, rt0) #if NBRIDGE > 0 /* - * Interfaces that are bridge members need special handling - * for output. + * Interfaces that are bridgeports need special handling for output. */ - if (ifp->if_bridge) { + if (ifp->if_bridgeport) { struct m_tag *mtag; /* * Check if this packet has already been sent out through - * this bridge, in which case we simply send it out + * this bridgeport, in which case we simply send it out * without further bridge processing. */ for (mtag = m_tag_find(m, PACKET_TAG_BRIDGE, NULL); mtag; @@ -399,7 +398,7 @@ ether_output(ifp0, m0, dst, rt0) goto bad; } #endif - if (!bcmp(&ifp->if_bridge, mtag + 1, sizeof(caddr_t))) + if (!bcmp(&ifp->if_bridgeport, mtag + 1, sizeof(caddr_t))) break; } if (mtag == NULL) { @@ -410,7 +409,7 @@ ether_output(ifp0, m0, dst, rt0) error = ENOBUFS; goto bad; } - bcopy(&ifp->if_bridge, mtag + 1, sizeof(caddr_t)); + bcopy(&ifp->if_bridgeport, mtag + 1, sizeof(caddr_t)); m_tag_prepend(m, mtag); error = bridge_output(ifp, m, NULL, NULL); return (error); @@ -560,7 +559,7 @@ ether_input(ifp0, eh, m) * NULL if it has consumed the packet, otherwise, it * gets processed as normal. */ - if (ifp->if_bridge) { + if (ifp->if_bridgeport) { if (m->m_flags & M_PROTO1) m->m_flags &= ~M_PROTO1; else { Index: net/if_gif.c =================================================================== RCS file: /cvs/src/sys/net/if_gif.c,v retrieving revision 1.57 diff -u -p -r1.57 if_gif.c --- net/if_gif.c 12 May 2012 12:58:16 -0000 1.57 +++ net/if_gif.c 18 Sep 2012 09:56:01 -0000 @@ -176,7 +176,7 @@ gif_start(struct ifnet *ifp) * the start function and bypasses the if_output function * so we need to do the encap here. */ - if (ifp->if_bridge && (m->m_flags & M_PROTO1)) { + if (ifp->if_bridgeport && (m->m_flags & M_PROTO1)) { int error = 0; /* * Remove multicast and broadcast flags or encapsulated Index: net/pfvar.h =================================================================== RCS file: /cvs/src/sys/net/pfvar.h,v retrieving revision 1.367 diff -u -p -r1.367 pfvar.h --- net/pfvar.h 26 Jul 2012 12:25:31 -0000 1.367 +++ net/pfvar.h 18 Sep 2012 09:56:01 -0000 @@ -35,6 +35,7 @@ #define _NET_PFVAR_H_ #include <sys/param.h> +#include <sys/mbuf.h> #include <sys/types.h> #include <sys/queue.h> #include <sys/tree.h> Index: net80211/ieee80211_node.c =================================================================== RCS file: /cvs/src/sys/net80211/ieee80211_node.c,v retrieving revision 1.73 diff -u -p -r1.73 ieee80211_node.c --- net80211/ieee80211_node.c 25 Aug 2012 11:34:27 -0000 1.73 +++ net80211/ieee80211_node.c 18 Sep 2012 09:56:01 -0000 @@ -1476,10 +1476,10 @@ ieee80211_node_join(struct ieee80211com #if NBRIDGE > 0 /* - * If the parent interface belongs to a bridge, learn + * If the parent interface is a bridgeport, learn * the node's address dynamically on this interface. */ - if (ic->ic_if.if_bridge != NULL) + if (ic->ic_if.if_bridgeport != NULL) bridge_update(&ic->ic_if, (struct ether_addr *)ni->ni_macaddr, 0); #endif @@ -1629,10 +1629,10 @@ ieee80211_node_leave(struct ieee80211com #if NBRIDGE > 0 /* - * If the parent interface belongs to a bridge, delete + * If the parent interface is a bridgeport, delete * any dynamically learned address for this node. */ - if (ic->ic_if.if_bridge != NULL) + if (ic->ic_if.if_bridgeport != NULL) bridge_update(&ic->ic_if, (struct ether_addr *)ni->ni_macaddr, 1); #endif Index: netinet/if_ether.c =================================================================== RCS file: /cvs/src/sys/netinet/if_ether.c,v retrieving revision 1.93 diff -u -p -r1.93 if_ether.c --- netinet/if_ether.c 18 Sep 2011 11:17:58 -0000 1.93 +++ netinet/if_ether.c 18 Sep 2012 09:56:02 -0000 @@ -63,6 +63,9 @@ #if NCARP > 0 #include <netinet/ip_carp.h> #endif +#if NBRIDGE > 0 +#include <net/if_bridge.h> +#endif #define SIN(s) ((struct sockaddr_in *)s) #define SDL(s) ((struct sockaddr_dl *)s) @@ -671,7 +674,9 @@ in_arpinput(struct mbuf *m) ac->ac_if.if_xname); goto out; } else if (rt->rt_ifp != &ac->ac_if) { +#if NCARP > 0 if (ac->ac_if.if_type != IFT_CARP) +#endif log(LOG_WARNING, "arp: attempt to overwrite entry for" " %s on %s by %s on %s\n", @@ -689,19 +694,25 @@ in_arpinput(struct mbuf *m) rt->rt_expire = 1; /* no longer static */ } } - } else if (rt->rt_ifp != &ac->ac_if && !(ac->ac_if.if_bridge && - (rt->rt_ifp->if_bridge == ac->ac_if.if_bridge)) && + } else if (rt->rt_ifp != &ac->ac_if && +#if NBRIDGE > 0 + !(SAME_BRIDGE(ac->ac_if.if_bridgeport, + rt->rt_ifp->if_bridgeport)) && +#endif +#if NCARP > 0 !(rt->rt_ifp->if_type == IFT_CARP && rt->rt_ifp->if_carpdev == &ac->ac_if) && !(ac->ac_if.if_type == IFT_CARP && - ac->ac_if.if_carpdev == rt->rt_ifp)) { - log(LOG_WARNING, - "arp: attempt to add entry for %s " - "on %s by %s on %s\n", - inet_ntoa(isaddr), rt->rt_ifp->if_xname, - ether_sprintf(ea->arp_sha), - ac->ac_if.if_xname); - goto out; + ac->ac_if.if_carpdev == rt->rt_ifp && +#endif + 1)) { + log(LOG_WARNING, + "arp: attempt to add entry for %s " + "on %s by %s on %s\n", + inet_ntoa(isaddr), rt->rt_ifp->if_xname, + ether_sprintf(ea->arp_sha), + ac->ac_if.if_xname); + goto out; } bcopy(ea->arp_sha, LLADDR(sdl), sdl->sdl_alen = sizeof(ea->arp_sha)); Index: netinet/ip_ether.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_ether.c,v retrieving revision 1.58 diff -u -p -r1.58 ip_ether.c --- netinet/ip_ether.c 4 Jul 2011 20:42:15 -0000 1.58 +++ netinet/ip_ether.c 18 Sep 2012 09:56:02 -0000 @@ -60,6 +60,9 @@ #ifdef MPLS #include <netmpls/mpls.h> #endif +#if NPF > 0 +#include <net/pfvar.h> +#endif #include "bpfilter.h" @@ -230,7 +233,7 @@ etherip_decap(struct mbuf *m, int iphlen sc = etherip_getgif(m); if (sc == NULL) return; - if (sc->gif_if.if_bridge == NULL) { + if (sc->gif_if.if_bridgeport == NULL) { DPRINTF(("etherip_input(): interface not part of bridge\n")); etheripstat.etherip_noifdrops++; m_freem(m); Index: netinet/ip_output.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_output.c,v retrieving revision 1.230 diff -u -p -r1.230 ip_output.c --- netinet/ip_output.c 16 Jul 2012 18:05:36 -0000 1.230 +++ netinet/ip_output.c 18 Sep 2012 09:56:02 -0000 @@ -740,7 +740,7 @@ sendit: if (ntohs(ip->ip_len) <= mtu) { ip->ip_sum = 0; if ((ifp->if_capabilities & IFCAP_CSUM_IPv4) && - (ifp->if_bridge == NULL)) { + (ifp->if_bridgeport == NULL)) { m->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT; ipstat.ips_outhwcsum++; } else @@ -887,7 +887,7 @@ ip_fragment(struct mbuf *m, struct ifnet mhip->ip_sum = 0; if ((ifp != NULL) && (ifp->if_capabilities & IFCAP_CSUM_IPv4) && - (ifp->if_bridge == NULL)) { + (ifp->if_bridgeport == NULL)) { m->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT; ipstat.ips_outhwcsum++; } else @@ -907,7 +907,7 @@ ip_fragment(struct mbuf *m, struct ifnet ip->ip_sum = 0; if ((ifp != NULL) && (ifp->if_capabilities & IFCAP_CSUM_IPv4) && - (ifp->if_bridge == NULL)) { + (ifp->if_bridgeport == NULL)) { m->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT; ipstat.ips_outhwcsum++; } else @@ -2150,13 +2150,13 @@ in_proto_cksum_out(struct mbuf *m, struc { if (m->m_pkthdr.csum_flags & M_TCP_CSUM_OUT) { if (!ifp || !(ifp->if_capabilities & IFCAP_CSUM_TCPv4) || - ifp->if_bridge != NULL) { + ifp->if_bridgeport != NULL) { in_delayed_cksum(m); m->m_pkthdr.csum_flags &= ~M_TCP_CSUM_OUT; /* Clear */ } } else if (m->m_pkthdr.csum_flags & M_UDP_CSUM_OUT) { if (!ifp || !(ifp->if_capabilities & IFCAP_CSUM_UDPv4) || - ifp->if_bridge != NULL) { + ifp->if_bridgeport != NULL) { in_delayed_cksum(m); m->m_pkthdr.csum_flags &= ~M_UDP_CSUM_OUT; /* Clear */ } Index: netinet6/in6.c =================================================================== RCS file: /cvs/src/sys/netinet6/in6.c,v retrieving revision 1.98 diff -u -p -r1.98 in6.c --- netinet6/in6.c 14 Jul 2012 17:23:16 -0000 1.98 +++ netinet6/in6.c 18 Sep 2012 09:56:02 -0000 @@ -85,6 +85,9 @@ #include <netinet/in.h> #include <netinet/in_var.h> #include <netinet/if_ether.h> +#if NBRIDGE > 0 +#include <net/if_bridge.h> +#endif #include <netinet/ip6.h> #include <netinet6/ip6_var.h> @@ -1907,8 +1910,7 @@ in6_ifpprefix(const struct ifnet *ifp, c if ((rt->rt_flags & (RTF_CLONING | RTF_CLONED)) == 0 || (rt->rt_ifp != ifp && #if NBRIDGE > 0 - (rt->rt_ifp->if_bridge == NULL || ifp->if_bridge == NULL || - rt->rt_ifp->if_bridge != ifp->if_bridge) && + !SAME_BRIDGE(rt->rt_ifp->if_bridgeport, ifp->if_bridgeport) && #endif #if NCARP > 0 (ifp->if_type != IFT_CARP || rt->rt_ifp != ifp->if_carpdev) && Index: sys/mbuf.h =================================================================== RCS file: /cvs/src/sys/sys/mbuf.h,v retrieving revision 1.156 diff -u -p -r1.156 mbuf.h --- sys/mbuf.h 14 Jan 2012 12:11:35 -0000 1.156 +++ sys/mbuf.h 18 Sep 2012 09:56:02 -0000 @@ -32,6 +32,9 @@ * @(#)mbuf.h 8.5 (Berkeley) 2/19/95 */ +#ifndef _SYS_MBUF_H_ +#define _SYS_MBUF_H_ + #include <sys/malloc.h> #include <sys/pool.h> #include <sys/queue.h> @@ -448,4 +451,5 @@ struct m_tag *m_tag_next(struct mbuf *, #define PACKET_TAG_PIPEX 0x0400 /* pipex context XXX */ #define PACKET_TAG_PF_REASSEMBLED 0x0800 /* pf reassembled ipv6 packet */ -#endif +#endif /* _KERNEL */ +#endif /* _SYS_MBUF_H_ */