Lines Matching refs:sc

222 #define BRIDGE_BPF_MTAP_INPUT(sc, m)					\
223 if (sc->sc_bpf_input) \
224 bridge_bpf_input(sc->sc_ifp, m)
469 static int bridge_ioctl_purge(struct bridge_softc *sc, void *arg);
765 bridge_lock(struct bridge_softc *sc)
769 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_NOTOWNED);
771 lck_mtx_lock(sc->sc_mtx);
773 sc->lock_lr[sc->next_lock_lr] = lr_saved;
774 sc->next_lock_lr = (sc->next_lock_lr+1) % SO_LCKDBG_MAX;
778 bridge_unlock(struct bridge_softc *sc)
782 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_OWNED);
784 sc->unlock_lr[sc->next_unlock_lr] = lr_saved;
785 sc->next_unlock_lr = (sc->next_unlock_lr+1) % SO_LCKDBG_MAX;
787 lck_mtx_unlock(sc->sc_mtx);
791 bridge_lock2ref(struct bridge_softc *sc)
796 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_OWNED);
798 if (sc->sc_iflist_xcnt > 0)
801 sc->sc_iflist_ref++;
803 sc->unlock_lr[sc->next_unlock_lr] = lr_saved;
804 sc->next_unlock_lr = (sc->next_unlock_lr+1) % SO_LCKDBG_MAX;
805 lck_mtx_unlock(sc->sc_mtx);
811 bridge_unref(struct bridge_softc *sc)
815 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_NOTOWNED);
817 lck_mtx_lock(sc->sc_mtx);
818 sc->lock_lr[sc->next_lock_lr] = lr_saved;
819 sc->next_lock_lr = (sc->next_lock_lr+1) % SO_LCKDBG_MAX;
821 sc->sc_iflist_ref--;
823 sc->unlock_lr[sc->next_unlock_lr] = lr_saved;
824 sc->next_unlock_lr = (sc->next_unlock_lr+1) % SO_LCKDBG_MAX;
825 if ((sc->sc_iflist_xcnt > 0) && (sc->sc_iflist_ref == 0)) {
826 lck_mtx_unlock(sc->sc_mtx);
827 wakeup(&sc->sc_cv);
829 lck_mtx_unlock(sc->sc_mtx);
833 bridge_xlock(struct bridge_softc *sc)
837 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_OWNED);
839 sc->sc_iflist_xcnt++;
840 while (sc->sc_iflist_ref > 0) {
841 sc->unlock_lr[sc->next_unlock_lr] = lr_saved;
842 sc->next_unlock_lr = (sc->next_unlock_lr+1) % SO_LCKDBG_MAX;
844 msleep(&sc->sc_cv, sc->sc_mtx, PZERO, "BRIDGE_XLOCK", NULL);
846 sc->lock_lr[sc->next_lock_lr] = lr_saved;
847 sc->next_lock_lr = (sc->next_lock_lr+1) % SO_LCKDBG_MAX;
852 bridge_xdrop(struct bridge_softc *sc)
854 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_OWNED);
856 sc->sc_iflist_xcnt--;
1043 struct bridge_softc *sc;
1051 sc = _MALLOC(sizeof (*sc), M_DEVBUF, M_WAITOK);
1052 memset(sc, 0, sizeof (*sc));
1054 sc->sc_mtx = lck_mtx_alloc_init(bridge_lock_grp, bridge_lock_attr);
1055 sc->sc_brtmax = BRIDGE_RTABLE_MAX;
1056 sc->sc_brttimeout = BRIDGE_RTABLE_TIMEOUT;
1057 sc->sc_filter_flags = IFBF_FILT_DEFAULT;
1064 sc->sc_filter_flags &= ~IFBF_FILT_USEIPF;
1068 error = bridge_rtable_init(sc);
1074 TAILQ_INIT(&sc->sc_iflist);
1075 TAILQ_INIT(&sc->sc_spanlist);
1078 snprintf(sc->sc_if_xname, sizeof (sc->sc_if_xname), "%s%d",
1089 init_params.uniqueid = sc->sc_if_xname;
1090 init_params.uniqueid_len = strlen(sc->sc_if_xname);
1101 init_params.softc = sc;
1112 sc->sc_ifp = ifp;
1187 sdl->sdl_nlen = strlen(sc->sc_if_xname);
1190 memcpy(sdl->sdl_data, sc->sc_if_xname, sdl->sdl_nlen);
1226 bstp_attach(&sc->sc_stp, &bridge_ops);
1230 LIST_INSERT_HEAD(&bridge_list, sc, sc_list);
1254 struct bridge_softc *sc = ifp->if_softc;
1258 BRIDGE_LOCK(sc);
1259 if ((sc->sc_flags & SCF_DETACHING)) {
1260 BRIDGE_UNLOCK(sc);
1263 sc->sc_flags |= SCF_DETACHING;
1272 while ((bif = TAILQ_FIRST(&sc->sc_iflist)) != NULL)
1273 bridge_delete_member(sc, bif, 0);
1275 while ((bif = TAILQ_FIRST(&sc->sc_spanlist)) != NULL) {
1276 bridge_delete_span(sc, bif);
1279 BRIDGE_UNLOCK(sc);
1285 if ((sc = (struct bridge_softc *)ifnet_softc(ifp)) != NULL) {
1286 BRIDGE_LOCK(sc);
1287 sc->sc_flags &= ~SCF_DETACHING;
1288 BRIDGE_UNLOCK(sc);
1333 BRIDGE_LOCK(sc); \
1334 error = (*bc->bc_func)(sc, &args); \
1335 BRIDGE_UNLOCK(sc); \
1352 struct bridge_softc *sc = ifp->if_softc;
1356 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_NOTOWNED);
1426 BRIDGE_LOCK(sc);
1428 BRIDGE_UNLOCK(sc);
1435 BRIDGE_LOCK(sc);
1437 BRIDGE_UNLOCK(sc);
1467 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_NOTOWNED);
1479 bridge_mutecaps(struct bridge_softc *sc)
1487 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) {
1492 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) {
1499 bridge_set_ifcap(sc, bif, enabled);
1505 bridge_set_ifcap(struct bridge_softc *sc, struct bridge_iflist *bif, int set)
1520 "on %s\n", __func__, ifnet_name(sc->sc_ifp),
1521 ifnet_unit(sc->sc_ifp), ifp->if_xname);
1532 bridge_lookup_member(struct bridge_softc *sc, const char *name)
1538 BRIDGE_LOCK_ASSERT(sc);
1540 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) {
1557 bridge_lookup_member_if(struct bridge_softc *sc, struct ifnet *member_ifp)
1561 BRIDGE_LOCK_ASSERT(sc);
1563 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) {
1577 struct bridge_softc *sc = bif->bif_sc;
1593 "frmlen %lu\n", __func__, ifnet_name(sc->sc_ifp),
1594 ifnet_unit(sc->sc_ifp), ifnet_name(ifp), ifnet_unit(ifp),
1634 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_NOTOWNED);
1646 struct bridge_softc *sc = bif->bif_sc;
1655 ifnet_name(sc->sc_ifp), ifnet_unit(sc->sc_ifp),
1660 error = bridge_member_output(sc, ifp, m);
1667 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_NOTOWNED);
1790 bridge_delete_member(struct bridge_softc *sc, struct bridge_iflist *bif,
1795 BRIDGE_LOCK_ASSERT(sc);
1820 bridge_set_ifcap(sc, bif, bif->bif_savedcaps);
1826 BRIDGE_UNLOCK(sc);
1828 BRIDGE_LOCK(sc);
1836 BRIDGE_XLOCK(sc);
1837 TAILQ_REMOVE(&sc->sc_iflist, bif, bif_next);
1838 BRIDGE_XDROP(sc);
1843 bridge_mutecaps(sc); /* recalcuate now this interface is removed */
1845 bridge_rtdelete(sc, ifs, IFBF_FLUSHALL);
1850 BRIDGE_UNLOCK(sc);
1852 BRIDGE_LOCK(sc);
1857 BRIDGE_UNLOCK(sc);
1859 BRIDGE_LOCK(sc);
1871 bridge_delete_span(struct bridge_softc *sc, struct bridge_iflist *bif)
1873 BRIDGE_LOCK_ASSERT(sc);
1880 TAILQ_REMOVE(&sc->sc_spanlist, bif, bif_next);
1885 bridge_ioctl_add(struct bridge_softc *sc, void *arg)
1900 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next)
1906 if (TAILQ_EMPTY(&sc->sc_iflist))
1907 sc->sc_ifp->if_mtu = ifs->if_mtu;
1908 else if (sc->sc_ifp->if_mtu != ifs->if_mtu) {
1910 ifnet_name(sc->sc_ifp), ifnet_unit(sc->sc_ifp),
1916 if (ifs->if_bridge == sc)
1931 bif->bif_sc = sc;
1935 ifs->if_bridge = sc;
1937 bstp_create(&sc->sc_stp, &bif->bif_stp, bif->bif_ifp);
1942 TAILQ_INSERT_TAIL(&sc->sc_iflist, bif, bif_next);
1946 bridge_mutecaps(sc);
1978 BRIDGE_UNLOCK(sc);
1995 BRIDGE_LOCK(sc);
2007 BRIDGE_LOCK(sc);
2013 BRIDGE_LOCK(sc);
2017 bridge_delete_member(sc, bif, 1);
2023 bridge_ioctl_del(struct bridge_softc *sc, void *arg)
2028 bif = bridge_lookup_member(sc, req->ifbr_ifsname);
2032 bridge_delete_member(sc, bif, 0);
2038 bridge_ioctl_purge(__unused struct bridge_softc *sc, __unused void *arg)
2044 bridge_ioctl_gifflags(struct bridge_softc *sc, void *arg)
2050 bif = bridge_lookup_member(sc, req->ifbr_ifsname);
2084 bridge_ioctl_sifflags(struct bridge_softc *sc, void *arg)
2093 bif = bridge_lookup_member(sc, req->ifbr_ifsname);
2133 bridge_ioctl_scache(struct bridge_softc *sc, void *arg)
2137 sc->sc_brtmax = param->ifbrp_csize;
2138 bridge_rttrim(sc);
2144 bridge_ioctl_gcache(struct bridge_softc *sc, void *arg)
2148 param->ifbrp_csize = sc->sc_brtmax;
2161 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) \
2163 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next) \
2171 BRIDGE_UNLOCK(sc); \
2173 BRIDGE_LOCK(sc); \
2179 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) { \
2187 error = bridge_ioctl_gifflags(sc, &breq); \
2195 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next) { \
2210 BRIDGE_UNLOCK(sc); \
2213 BRIDGE_LOCK(sc); \
2218 bridge_ioctl_gifs64(struct bridge_softc *sc, void *arg)
2229 bridge_ioctl_gifs32(struct bridge_softc *sc, void *arg)
2250 LIST_FOREACH(brt, &sc->sc_rtlist, brt_list) \
2254 BRIDGE_UNLOCK(sc); \
2256 BRIDGE_LOCK(sc); \
2262 LIST_FOREACH(brt, &sc->sc_rtlist, brt_list) { \
2285 BRIDGE_UNLOCK(sc); \
2288 BRIDGE_LOCK(sc); \
2294 bridge_ioctl_rts64(struct bridge_softc *sc, void *arg)
2306 bridge_ioctl_rts32(struct bridge_softc *sc, void *arg)
2318 bridge_ioctl_saddr32(struct bridge_softc *sc, void *arg)
2324 bif = bridge_lookup_member(sc, req->ifba_ifsname);
2328 error = bridge_rtupdate(sc, req->ifba_dst, req->ifba_vlan, bif, 1,
2335 bridge_ioctl_saddr64(struct bridge_softc *sc, void *arg)
2341 bif = bridge_lookup_member(sc, req->ifba_ifsname);
2345 error = bridge_rtupdate(sc, req->ifba_dst, req->ifba_vlan, bif, 1,
2352 bridge_ioctl_sto(struct bridge_softc *sc, void *arg)
2356 sc->sc_brttimeout = param->ifbrp_ctime;
2361 bridge_ioctl_gto(struct bridge_softc *sc, void *arg)
2365 param->ifbrp_ctime = sc->sc_brttimeout;
2370 bridge_ioctl_daddr32(struct bridge_softc *sc, void *arg)
2374 return (bridge_rtdaddr(sc, req->ifba_dst, req->ifba_vlan));
2378 bridge_ioctl_daddr64(struct bridge_softc *sc, void *arg)
2382 return (bridge_rtdaddr(sc, req->ifba_dst, req->ifba_vlan));
2386 bridge_ioctl_flush(struct bridge_softc *sc, void *arg)
2390 bridge_rtflush(sc, req->ifbr_ifsflags);
2395 bridge_ioctl_gpri(struct bridge_softc *sc, void *arg)
2398 struct bstp_state *bs = &sc->sc_stp;
2405 bridge_ioctl_spri(struct bridge_softc *sc, void *arg)
2410 return (bstp_set_priority(&sc->sc_stp, param->ifbrp_prio));
2412 #pragma unused(sc, arg)
2418 bridge_ioctl_ght(struct bridge_softc *sc, void *arg)
2421 struct bstp_state *bs = &sc->sc_stp;
2428 bridge_ioctl_sht(struct bridge_softc *sc, void *arg)
2433 return (bstp_set_htime(&sc->sc_stp, param->ifbrp_hellotime));
2435 #pragma unused(sc, arg)
2441 bridge_ioctl_gfd(struct bridge_softc *sc, void *arg)
2444 struct bstp_state *bs = &sc->sc_stp;
2451 bridge_ioctl_sfd(struct bridge_softc *sc, void *arg)
2456 return (bstp_set_fdelay(&sc->sc_stp, param->ifbrp_fwddelay));
2458 #pragma unused(sc, arg)
2464 bridge_ioctl_gma(struct bridge_softc *sc, void *arg)
2467 struct bstp_state *bs = &sc->sc_stp;
2474 bridge_ioctl_sma(struct bridge_softc *sc, void *arg)
2479 return (bstp_set_maxage(&sc->sc_stp, param->ifbrp_maxage));
2481 #pragma unused(sc, arg)
2487 bridge_ioctl_sifprio(struct bridge_softc *sc, void *arg)
2493 bif = bridge_lookup_member(sc, req->ifbr_ifsname);
2499 #pragma unused(sc, arg)
2505 bridge_ioctl_sifcost(struct bridge_softc *sc, void *arg)
2511 bif = bridge_lookup_member(sc, req->ifbr_ifsname);
2517 #pragma unused(sc, arg)
2523 bridge_ioctl_gfilt(struct bridge_softc *sc, void *arg)
2527 param->ifbrp_filter = sc->sc_filter_flags;
2533 bridge_ioctl_sfilt(struct bridge_softc *sc, void *arg)
2545 sc->sc_filter_flags = param->ifbrp_filter;
2551 bridge_ioctl_sifmaxaddr(struct bridge_softc *sc, void *arg)
2556 bif = bridge_lookup_member(sc, req->ifbr_ifsname);
2565 bridge_ioctl_addspan(struct bridge_softc *sc, void *arg)
2575 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next)
2600 TAILQ_INSERT_HEAD(&sc->sc_spanlist, bif, bif_next);
2606 bridge_ioctl_delspan(struct bridge_softc *sc, void *arg)
2616 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next)
2623 bridge_delete_span(sc, bif);
2629 struct bstp_state *bs = &sc->sc_stp; \
2654 bridge_ioctl_gbparam32(struct bridge_softc *sc, void *arg)
2664 bridge_ioctl_gbparam64(struct bridge_softc *sc, void *arg)
2674 bridge_ioctl_grte(struct bridge_softc *sc, void *arg)
2678 param->ifbrp_cexceeded = sc->sc_brtexceeded;
2690 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) { \
2701 BRIDGE_UNLOCK(sc); \
2703 BRIDGE_LOCK(sc); \
2709 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) { \
2730 BRIDGE_UNLOCK(sc); \
2733 BRIDGE_LOCK(sc); \
2739 bridge_ioctl_gifsstp32(struct bridge_softc *sc, void *arg)
2750 bridge_ioctl_gifsstp64(struct bridge_softc *sc, void *arg)
2761 bridge_ioctl_sproto(struct bridge_softc *sc, void *arg)
2766 return (bstp_set_protocol(&sc->sc_stp, param->ifbrp_proto));
2768 #pragma unused(sc, arg)
2774 bridge_ioctl_stxhc(struct bridge_softc *sc, void *arg)
2779 return (bstp_set_holdcount(&sc->sc_stp, param->ifbrp_txhc));
2781 #pragma unused(sc, arg)
2795 struct bridge_softc *sc = ifp->if_bridge;
2802 if (sc != NULL) {
2803 BRIDGE_LOCK(sc);
2805 bif = bridge_lookup_member_if(sc, ifp);
2807 bridge_delete_member(sc, bif, 1);
2809 BRIDGE_UNLOCK(sc);
2815 LIST_FOREACH(sc, &bridge_list, sc_list) {
2816 BRIDGE_LOCK(sc);
2817 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next)
2819 bridge_delete_span(sc, bif);
2823 BRIDGE_UNLOCK(sc);
2836 struct bridge_softc *sc = (struct bridge_softc *)ifp->if_softc;
2840 BRIDGE_LOCK_ASSERT(sc);
2847 bsd_timeout(bridge_timer, sc, &ts);
2852 bstp_init(&sc->sc_stp); /* Initialize Spanning Tree */
2866 struct bridge_softc *sc = ifp->if_softc;
2868 BRIDGE_LOCK_ASSERT(sc);
2873 bsd_untimeout(bridge_timer, sc);
2875 bstp_stop(&sc->sc_stp);
2878 bridge_rtflush(sc, IFBF_FLUSHDYN);
2890 bridge_enqueue(struct bridge_softc *sc, struct ifnet *dst_ifp, struct mbuf *m)
2947 (void) ifnet_stat_increment_out(sc->sc_ifp, 1, len, 0);
2949 (void) ifnet_stat_increment_out(sc->sc_ifp, 0, 0, 1);
2968 struct bridge_softc *sc;
2970 sc = ifp->if_bridge;
2977 if (sc == NULL) {
2987 if (bridge_pfil(&m, sc->sc_ifp, ifp, PFIL_OUT) != 0)
2993 (void) bridge_enqueue(sc, ifp, m);
3014 struct bridge_softc *sc;
3030 sc = ifp->if_bridge;
3033 BRIDGE_LOCK(sc);
3050 if ((sc->sc_ifp->if_flags & IFF_RUNNING) == 0) {
3062 dst_if = bridge_rtlookup(sc, eh->ether_dhost, vlan);
3068 bridge_span(sc, m);
3070 BRIDGE_LOCK2REF(sc, error);
3076 TAILQ_FOREACH(bif, &sc->sc_iflist, bif_next) {
3101 sc->sc_ifp, 0, 0, 1);
3106 (void) bridge_enqueue(sc, dst_if, mc);
3110 BRIDGE_UNREF(sc);
3119 bridge_span(sc, m);
3122 BRIDGE_UNLOCK(sc);
3126 BRIDGE_UNLOCK(sc);
3127 (void) bridge_enqueue(sc, dst_if, m);
3436 struct bridge_softc *sc = ifnet_softc(ifp);
3444 BRIDGE_LOCK(sc);
3446 dst_if = bridge_rtlookup(sc, eh->ether_dhost, 0);
3463 BRIDGE_UNLOCK(sc);
3478 if (sc->sc_bpf_output)
3484 bridge_broadcast(sc, ifp, m, 0);
3486 BRIDGE_UNLOCK(sc);
3487 error = bridge_enqueue(sc, dst_if, m);
3526 bridge_forward(struct bridge_softc *sc, struct bridge_iflist *sbif,
3536 lck_mtx_assert(sc->sc_mtx, LCK_MTX_ASSERT_OWNED);
3540 printf("%s: %s%d m%p\n", __func__, ifnet_name(sc->sc_ifp),
3541 ifnet_unit(sc->sc_ifp), m);
3545 ifp = sc->sc_ifp;
3560 error = bridge_rtupdate(sc, eh->ether_shost, vlan,
3584 dst_if = bridge_rtlookup(sc, dst, vlan);
3618 if (sc->sc_bpf_input)
3630 BRIDGE_UNLOCK(sc);
3635 BRIDGE_LOCK(sc);
3645 bridge_broadcast(sc, src_if, m, 1);
3657 dbif = bridge_lookup_member_if(sc, dst_if);
3675 ++sc->sc_sc.sc_ifp.if_xdhcpra;
3681 BRIDGE_UNLOCK(sc);
3701 (void) bridge_enqueue(sc, dst_if, m);
3705 BRIDGE_UNLOCK(sc);
3733 struct bridge_softc *sc = ifp->if_bridge;
3744 ifnet_name(sc->sc_ifp), ifnet_unit(sc->sc_ifp),
3748 if ((sc->sc_ifp->if_flags & IFF_RUNNING) == 0) {
3752 __func__, ifnet_name(sc->sc_ifp),
3753 ifnet_unit(sc->sc_ifp));
3758 bifp = sc->sc_ifp;
3770 BRIDGE_BPF_MTAP_INPUT(sc, m);
3784 BRIDGE_LOCK(sc);
3785 bif = bridge_lookup_member_if(sc, ifp);
3787 BRIDGE_UNLOCK(sc);
3791 __func__, ifnet_name(sc->sc_ifp),
3792 ifnet_unit(sc->sc_ifp));
3799 bridge_span(sc, m);
3824 BRIDGE_UNLOCK(sc);
3831 BRIDGE_UNLOCK(sc);
3842 BRIDGE_UNLOCK(sc);
3851 bridge_forward(sc, bif, mc);
3873 if (sc->sc_bpf_input)
3887 ifnet_name(sc->sc_ifp),
3888 ifnet_unit(sc->sc_ifp));
3900 BRIDGE_UNLOCK(sc);
3924 #define PFIL_PHYS(sc, ifp, m) do { \
3929 BRIDGE_UNLOCK(sc); \
3935 #define PFIL_PHYS(sc, ifp, m)
3945 BRIDGE_BPF_MTAP_INPUT(sc, m); \
3947 PFIL_PHYS(sc, iface, m); \
3950 error = bridge_rtupdate(sc, eh->ether_shost, \
3953 BRIDGE_UNLOCK(sc); \
3958 BRIDGE_UNLOCK(sc); \
3965 BRIDGE_UNLOCK(sc); \
3994 (void) bridge_rtupdate(sc, eh->ether_shost,
3998 BRIDGE_BPF_MTAP_INPUT(sc, m);
4006 BRIDGE_UNLOCK(sc);
4011 ifnet_name(sc->sc_ifp), ifnet_unit(sc->sc_ifp));
4038 BRIDGE_UNLOCK(sc);
4043 TAILQ_FOREACH(bif2, &sc->sc_iflist, bif_next) {
4057 bridge_forward(sc, bif, m);
4072 bridge_broadcast(struct bridge_softc *sc, struct ifnet *src_if,
4083 sbif = bridge_lookup_member_if(sc, src_if);
4085 BRIDGE_LOCK2REF(sc, error);
4098 if (bridge_pfil(&m, sc->sc_ifp, NULL, PFIL_OUT) != 0)
4105 TAILQ_FOREACH(dbif, &sc->sc_iflist, bif_next) {
4131 (void) ifnet_stat_increment_out(sc->sc_ifp,
4154 sc->sc_ifp, 0, 0, 1);
4165 (void) bridge_enqueue(sc, dst_if, mc);
4174 BRIDGE_UNREF(sc);
4184 bridge_span(struct bridge_softc *sc, struct mbuf *m)
4190 if (TAILQ_EMPTY(&sc->sc_spanlist))
4193 TAILQ_FOREACH(bif, &sc->sc_spanlist, bif_next) {
4201 (void) ifnet_stat_increment_out(sc->sc_ifp, 0, 0, 1);
4205 (void) bridge_enqueue(sc, dst_if, mc);
4217 bridge_rtupdate(struct bridge_softc *sc, const uint8_t *dst, uint16_t vlan,
4223 BRIDGE_LOCK_ASSERT(sc);
4240 if ((brt = bridge_rtnode_lookup(sc, dst, vlan)) == NULL) {
4241 if (sc->sc_brtcnt >= sc->sc_brtmax) {
4242 sc->sc_brtexceeded++;
4269 if ((error = bridge_rtnode_insert(sc, brt)) != 0) {
4288 brt->brt_expire = now.tv_sec + sc->sc_brttimeout;
4303 bridge_rtlookup(struct bridge_softc *sc, const uint8_t *addr, uint16_t vlan)
4307 BRIDGE_LOCK_ASSERT(sc);
4309 if ((brt = bridge_rtnode_lookup(sc, addr, vlan)) == NULL)
4323 bridge_rttrim(struct bridge_softc *sc)
4327 BRIDGE_LOCK_ASSERT(sc);
4330 if (sc->sc_brtcnt <= sc->sc_brtmax)
4334 bridge_rtage(sc);
4335 if (sc->sc_brtcnt <= sc->sc_brtmax)
4338 LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) {
4340 bridge_rtnode_destroy(sc, brt);
4341 if (sc->sc_brtcnt <= sc->sc_brtmax)
4355 struct bridge_softc *sc = arg;
4357 BRIDGE_LOCK(sc);
4359 bridge_rtage(sc);
4361 BRIDGE_UNLOCK(sc);
4363 if (sc->sc_ifp->if_flags & IFF_RUNNING) {
4368 bsd_timeout(bridge_timer, sc, &ts);
4378 bridge_rtage(struct bridge_softc *sc)
4382 BRIDGE_LOCK_ASSERT(sc);
4384 LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) {
4390 bridge_rtnode_destroy(sc, brt);
4401 bridge_rtflush(struct bridge_softc *sc, int full)
4405 BRIDGE_LOCK_ASSERT(sc);
4407 LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) {
4409 bridge_rtnode_destroy(sc, brt);
4419 bridge_rtdaddr(struct bridge_softc *sc, const uint8_t *addr, uint16_t vlan)
4424 BRIDGE_LOCK_ASSERT(sc);
4430 while ((brt = bridge_rtnode_lookup(sc, addr, vlan)) != NULL) {
4431 bridge_rtnode_destroy(sc, brt);
4444 bridge_rtdelete(struct bridge_softc *sc, struct ifnet *ifp, int full)
4448 BRIDGE_LOCK_ASSERT(sc);
4450 LIST_FOREACH_SAFE(brt, &sc->sc_rtlist, brt_list, nbrt) {
4453 bridge_rtnode_destroy(sc, brt);
4463 bridge_rtable_init(struct bridge_softc *sc)
4467 sc->sc_rthash = _MALLOC(sizeof (*sc->sc_rthash) * BRIDGE_RTHASH_SIZE,
4469 if (sc->sc_rthash == NULL)
4473 LIST_INIT(&sc->sc_rthash[i]);
4475 sc->sc_rthash_key = random();
4477 LIST_INIT(&sc->sc_rtlist);
4488 bridge_rtable_fini(struct bridge_softc *sc)
4491 KASSERT(sc->sc_brtcnt == 0,
4492 ("%s: %d bridge routes referenced", __func__, sc->sc_brtcnt));
4493 _FREE(sc->sc_rthash, M_DEVBUF);
4514 bridge_rthash(struct bridge_softc *sc, const uint8_t *addr)
4516 uint32_t a = 0x9e3779b9, b = 0x9e3779b9, c = sc->sc_rthash_key;
4551 bridge_rtnode_lookup(struct bridge_softc *sc, const uint8_t *addr,
4558 BRIDGE_LOCK_ASSERT(sc);
4560 hash = bridge_rthash(sc, addr);
4561 LIST_FOREACH(brt, &sc->sc_rthash[hash], brt_hash) {
4579 bridge_rtnode_insert(struct bridge_softc *sc, struct bridge_rtnode *brt)
4585 BRIDGE_LOCK_ASSERT(sc);
4587 hash = bridge_rthash(sc, brt->brt_addr);
4589 lbrt = LIST_FIRST(&sc->sc_rthash[hash]);
4591 LIST_INSERT_HEAD(&sc->sc_rthash[hash], brt, brt_hash);
4615 LIST_INSERT_HEAD(&sc->sc_rtlist, brt, brt_list);
4616 sc->sc_brtcnt++;
4627 bridge_rtnode_destroy(struct bridge_softc *sc, struct bridge_rtnode *brt)
4629 BRIDGE_LOCK_ASSERT(sc);
4634 sc->sc_brtcnt--;
4648 struct bridge_softc *sc = ifp->if_bridge;
4651 BRIDGE_LOCK(sc);
4658 bridge_rtdelete(sc, ifp, IFBF_FLUSHDYN);
4660 LIST_FOREACH(brt, &sc->sc_rtlist, brt_list) {
4672 BRIDGE_UNLOCK(sc);
4683 struct bridge_softc *sc = ifp->if_bridge;
4695 ifnet_name(sc->sc_ifp), ifnet_unit(sc->sc_ifp),
5205 struct bridge_softc *sc = (struct bridge_softc *)ifnet_softc(ifp);
5208 if (sc == NULL || (sc->sc_flags & SCF_DETACHING)) {
5214 sc->sc_bpf_input = sc->sc_bpf_output = NULL;
5218 sc->sc_bpf_input = bpf_callback;
5222 sc->sc_bpf_output = bpf_callback;
5226 sc->sc_bpf_input = sc->sc_bpf_output = bpf_callback;
5239 struct bridge_softc *sc = (struct bridge_softc *)ifnet_softc(ifp);
5242 bstp_detach(&sc->sc_stp);
5246 bridge_rtable_fini(sc);
5249 LIST_REMOVE(sc, sc_list);
5254 lck_mtx_free(sc->sc_mtx, bridge_lock_grp);
5256 _FREE(sc, M_DEVBUF);
5262 struct bridge_softc *sc = (struct bridge_softc *)ifnet_softc(ifp);
5264 if (sc->sc_bpf_input) {
5269 (*sc->sc_bpf_input)(ifp, m);
5277 struct bridge_softc *sc = (struct bridge_softc *)ifnet_softc(ifp);
5279 if (sc->sc_bpf_output) {
5280 (*sc->sc_bpf_output)(ifp, m);