Sorry for delayed review. > @@ -410,6 +419,10 @@ > /* Tear down the routing table. */ > bridge_rtable_fini(sc); > > + > + > + softint_disestablish(sc->sc_softintr); > + > free(sc, M_DEVBUF); > > return (0);
Please trim these blank lines. > @@ -1305,124 +1318,139 @@ > * The forwarding function of the bridge. > */ > static void > -bridge_forward(struct bridge_softc *sc, struct mbuf *m) > +bridge_forward(void *v) > { > + struct bridge_softc *sc = v; > + struct mbuf *m; > struct bridge_iflist *bif; > struct ifnet *src_if, *dst_if; > struct ether_header *eh; > + int s; > I think you have to take softnet_lock, since bridge_forward() is called from softint where not lock is held. > - src_if = m->m_pkthdr.rcvif; > + if ((sc->sc_if.if_flags & IFF_RUNNING) == 0) > + return; > > - sc->sc_if.if_ipackets++; > - sc->sc_if.if_ibytes += m->m_pkthdr.len; > + s = splbio(); > + while (1) { > + IFQ_POLL(&sc->sc_if.if_snd, m); > + if (m == NULL) > + break; > + IFQ_DEQUEUE(&sc->sc_if.if_snd, m); > Why splbio(), not splnet()??? Masao