-/* $OpenBSD: if_bridge.c,v 1.308 2018/04/19 22:31:25 dlg Exp $ */
+/* $OpenBSD: if_bridge.c,v 1.309 2018/09/19 13:17:21 mpi Exp $ */
/*
* Copyright (c) 1999, 2000 Jason L. Wright (jason@thought.net)
}
int
-bridge_delete(struct bridge_softc *sc, struct bridge_iflist *p)
+bridge_delete(struct bridge_softc *sc, struct bridge_iflist *bif)
{
int error;
- if (p->bif_flags & IFBIF_STP)
- bstp_delete(p->bif_stp);
+ if (bif->bif_flags & IFBIF_STP)
+ bstp_delete(bif->bif_stp);
- p->ifp->if_bridgeport = NULL;
- error = ifpromisc(p->ifp, 0);
- hook_disestablish(p->ifp->if_detachhooks, p->bif_dhcookie);
+ bif->ifp->if_bridgeport = NULL;
+ error = ifpromisc(bif->ifp, 0);
+ hook_disestablish(bif->ifp->if_detachhooks, bif->bif_dhcookie);
- if_ih_remove(p->ifp, bridge_input, NULL);
- TAILQ_REMOVE(&sc->sc_iflist, p, next);
- bridge_rtdelete(sc, p->ifp, 0);
- bridge_flushrule(p);
- free(p, M_DEVBUF, sizeof *p);
+ if_ih_remove(bif->ifp, bridge_input, NULL);
+ TAILQ_REMOVE(&sc->sc_iflist, bif, next);
+ bridge_rtdelete(sc, bif->ifp, 0);
+ bridge_flushrule(bif);
+ free(bif, M_DEVBUF, sizeof *bif);
return (error);
}
struct ifbreq *req = (struct ifbreq *)data;
struct ifbropreq *brop = (struct ifbropreq *)data;
struct ifnet *ifs;
- struct bridge_iflist *p;
+ struct bridge_iflist *bif;
struct bstp_port *bp;
struct bstp_state *bs = sc->sc_stp;
int error = 0;
}
if (ifs->if_bridgeport != NULL) {
- p = (struct bridge_iflist *)ifs->if_bridgeport;
- if (p->bridge_sc == sc)
+ bif = (struct bridge_iflist *)ifs->if_bridgeport;
+ if (bif->bridge_sc == sc)
error = EEXIST;
else
error = EBUSY;
}
/* If it's in the span list, it can't be a member. */
- TAILQ_FOREACH(p, &sc->sc_spanlist, next)
- if (p->ifp == ifs)
+ TAILQ_FOREACH(bif, &sc->sc_spanlist, next)
+ if (bif->ifp == ifs)
break;
- if (p != NULL) {
+ if (bif != NULL) {
error = EBUSY;
break;
}
break;
}
- p = malloc(sizeof(*p), M_DEVBUF, M_NOWAIT|M_ZERO);
- if (p == NULL) {
+ bif = malloc(sizeof(*bif), M_DEVBUF, M_NOWAIT|M_ZERO);
+ if (bif == NULL) {
if (ifs->if_type == IFT_ETHER)
ifpromisc(ifs, 0);
error = ENOMEM;
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_bridgeport = (caddr_t)p;
- p->bif_dhcookie = hook_establish(ifs->if_detachhooks, 0,
+ bif->bridge_sc = sc;
+ bif->ifp = ifs;
+ bif->bif_flags = IFBIF_LEARNING | IFBIF_DISCOVER;
+ SIMPLEQ_INIT(&bif->bif_brlin);
+ SIMPLEQ_INIT(&bif->bif_brlout);
+ ifs->if_bridgeport = (caddr_t)bif;
+ bif->bif_dhcookie = hook_establish(ifs->if_detachhooks, 0,
bridge_ifdetach, ifs);
- if_ih_insert(p->ifp, bridge_input, NULL);
- TAILQ_INSERT_TAIL(&sc->sc_iflist, p, next);
+ if_ih_insert(bif->ifp, bridge_input, NULL);
+ TAILQ_INSERT_TAIL(&sc->sc_iflist, bif, next);
break;
case SIOCBRDGDEL:
if ((error = suser(curproc)) != 0)
error = ENOENT;
break;
}
- p = (struct bridge_iflist *)ifs->if_bridgeport;
- if (p == NULL || p->bridge_sc != sc) {
+ bif = (struct bridge_iflist *)ifs->if_bridgeport;
+ if (bif == NULL || bif->bridge_sc != sc) {
error = ESRCH;
break;
}
- error = bridge_delete(sc, p);
+ error = bridge_delete(sc, bif);
break;
case SIOCBRDGIFS:
error = bridge_bifconf(sc, (struct ifbifconf *)data);
error = EBUSY;
break;
}
- TAILQ_FOREACH(p, &sc->sc_spanlist, next) {
- if (p->ifp == ifs)
+ TAILQ_FOREACH(bif, &sc->sc_spanlist, next) {
+ if (bif->ifp == ifs)
break;
}
- if (p != NULL) {
+ if (bif != NULL) {
error = EEXIST;
break;
}
- p = malloc(sizeof(*p), M_DEVBUF, M_NOWAIT|M_ZERO);
- if (p == NULL) {
+ bif = malloc(sizeof(*bif), M_DEVBUF, M_NOWAIT|M_ZERO);
+ if (bif == NULL) {
error = ENOMEM;
break;
}
- p->ifp = ifs;
- p->bif_flags = IFBIF_SPAN;
- p->bridge_sc = sc;
- p->bif_dhcookie = hook_establish(ifs->if_detachhooks, 0,
- bridge_spandetach, p);
- SIMPLEQ_INIT(&p->bif_brlin);
- SIMPLEQ_INIT(&p->bif_brlout);
- TAILQ_INSERT_TAIL(&sc->sc_spanlist, p, next);
+ bif->ifp = ifs;
+ bif->bif_flags = IFBIF_SPAN;
+ bif->bridge_sc = sc;
+ bif->bif_dhcookie = hook_establish(ifs->if_detachhooks, 0,
+ bridge_spandetach, bif);
+ SIMPLEQ_INIT(&bif->bif_brlin);
+ SIMPLEQ_INIT(&bif->bif_brlout);
+ TAILQ_INSERT_TAIL(&sc->sc_spanlist, bif, next);
break;
case SIOCBRDGDELS:
if ((error = suser(curproc)) != 0)
break;
- TAILQ_FOREACH(p, &sc->sc_spanlist, next) {
- if (strncmp(p->ifp->if_xname, req->ifbr_ifsname,
- sizeof(p->ifp->if_xname)) == 0) {
- bridge_spandetach(p);
+ TAILQ_FOREACH(bif, &sc->sc_spanlist, next) {
+ if (strncmp(bif->ifp->if_xname, req->ifbr_ifsname,
+ sizeof(bif->ifp->if_xname)) == 0) {
+ bridge_spandetach(bif);
break;
}
}
- if (p == NULL) {
+ if (bif == NULL) {
error = ENOENT;
break;
}
error = ENOENT;
break;
}
- p = (struct bridge_iflist *)ifs->if_bridgeport;
- if (p == NULL || p->bridge_sc != sc) {
+ bif = (struct bridge_iflist *)ifs->if_bridgeport;
+ if (bif == NULL || bif->bridge_sc != sc) {
error = ESRCH;
break;
}
- req->ifbr_ifsflags = p->bif_flags;
- req->ifbr_portno = p->ifp->if_index & 0xfff;
- req->ifbr_protected = p->bif_protected;
- if (p->bif_flags & IFBIF_STP) {
- bp = p->bif_stp;
+ req->ifbr_ifsflags = bif->bif_flags;
+ req->ifbr_portno = bif->ifp->if_index & 0xfff;
+ req->ifbr_protected = bif->bif_protected;
+ if (bif->bif_flags & IFBIF_STP) {
+ bp = bif->bif_stp;
req->ifbr_state = bstp_getstate(bs, bp);
req->ifbr_priority = bp->bp_priority;
req->ifbr_path_cost = bp->bp_path_cost;
error = ENOENT;
break;
}
- p = (struct bridge_iflist *)ifs->if_bridgeport;
- if (p == NULL || p->bridge_sc != sc) {
+ bif = (struct bridge_iflist *)ifs->if_bridgeport;
+ if (bif == NULL || bif->bridge_sc != sc) {
error = ESRCH;
break;
}
break;
}
if (req->ifbr_ifsflags & IFBIF_STP) {
- if ((p->bif_flags & IFBIF_STP) == 0) {
+ if ((bif->bif_flags & IFBIF_STP) == 0) {
/* Enable STP */
- if ((p->bif_stp = bstp_add(sc->sc_stp,
- p->ifp)) == NULL) {
+ if ((bif->bif_stp = bstp_add(sc->sc_stp,
+ bif->ifp)) == NULL) {
error = ENOMEM;
break;
}
} else {
/* Update STP flags */
- bstp_ifsflags(p->bif_stp, req->ifbr_ifsflags);
+ bstp_ifsflags(bif->bif_stp, req->ifbr_ifsflags);
}
- } else if (p->bif_flags & IFBIF_STP) {
- bstp_delete(p->bif_stp);
- p->bif_stp = NULL;
+ } else if (bif->bif_flags & IFBIF_STP) {
+ bstp_delete(bif->bif_stp);
+ bif->bif_stp = NULL;
}
- p->bif_flags = req->ifbr_ifsflags;
+ bif->bif_flags = req->ifbr_ifsflags;
break;
case SIOCSIFFLAGS:
if ((ifp->if_flags & IFF_UP) == IFF_UP)
error = ENOENT;
break;
}
- p = (struct bridge_iflist *)ifs->if_bridgeport;
- if (p == NULL || p->bridge_sc != sc) {
+ bif = (struct bridge_iflist *)ifs->if_bridgeport;
+ if (bif == NULL || bif->bridge_sc != sc) {
error = ESRCH;
break;
}
- p->bif_protected = req->ifbr_protected;
+ bif->bif_protected = req->ifbr_protected;
break;
case SIOCBRDGRTS:
case SIOCBRDGGCACHE:
void
bridge_spandetach(void *arg)
{
- struct bridge_iflist *p = (struct bridge_iflist *)arg;
- struct bridge_softc *sc = p->bridge_sc;
+ struct bridge_iflist *bif = (struct bridge_iflist *)arg;
+ struct bridge_softc *sc = bif->bridge_sc;
- hook_disestablish(p->ifp->if_detachhooks, p->bif_dhcookie);
- TAILQ_REMOVE(&sc->sc_spanlist, p, next);
- free(p, M_DEVBUF, sizeof(*p));
+ hook_disestablish(bif->ifp->if_detachhooks, bif->bif_dhcookie);
+ TAILQ_REMOVE(&sc->sc_spanlist, bif, next);
+ free(bif, M_DEVBUF, sizeof(*bif));
}
int
bridge_bifconf(struct bridge_softc *sc, struct ifbifconf *bifc)
{
- struct bridge_iflist *p;
+ struct bridge_iflist *bif;
struct bstp_port *bp;
struct bstp_state *bs = sc->sc_stp;
u_int32_t total = 0, i = 0;
int error = 0;
struct ifbreq *breq = NULL;
- TAILQ_FOREACH(p, &sc->sc_iflist, next)
+ TAILQ_FOREACH(bif, &sc->sc_iflist, next)
total++;
- TAILQ_FOREACH(p, &sc->sc_spanlist, next)
+ TAILQ_FOREACH(bif, &sc->sc_spanlist, next)
total++;
if (bifc->ifbic_len == 0) {
malloc(sizeof(*breq), M_DEVBUF, M_NOWAIT)) == NULL)
goto done;
- TAILQ_FOREACH(p, &sc->sc_iflist, next) {
+ TAILQ_FOREACH(bif, &sc->sc_iflist, next) {
bzero(breq, sizeof(*breq));
if (bifc->ifbic_len < sizeof(*breq))
break;
strlcpy(breq->ifbr_name, sc->sc_if.if_xname, IFNAMSIZ);
- strlcpy(breq->ifbr_ifsname, p->ifp->if_xname, IFNAMSIZ);
- breq->ifbr_ifsflags = p->bif_flags;
- breq->ifbr_portno = p->ifp->if_index & 0xfff;
- breq->ifbr_protected = p->bif_protected;
- if (p->bif_flags & IFBIF_STP) {
- bp = p->bif_stp;
+ strlcpy(breq->ifbr_ifsname, bif->ifp->if_xname, IFNAMSIZ);
+ breq->ifbr_ifsflags = bif->bif_flags;
+ breq->ifbr_portno = bif->ifp->if_index & 0xfff;
+ breq->ifbr_protected = bif->bif_protected;
+ if (bif->bif_flags & IFBIF_STP) {
+ bp = bif->bif_stp;
breq->ifbr_state = bstp_getstate(sc->sc_stp, bp);
breq->ifbr_priority = bp->bp_priority;
breq->ifbr_path_cost = bp->bp_path_cost;
i++;
bifc->ifbic_len -= sizeof(*breq);
}
- TAILQ_FOREACH(p, &sc->sc_spanlist, next) {
+ TAILQ_FOREACH(bif, &sc->sc_spanlist, next) {
bzero(breq, sizeof(*breq));
if (bifc->ifbic_len < sizeof(*breq))
break;
strlcpy(breq->ifbr_name, sc->sc_if.if_xname, IFNAMSIZ);
- strlcpy(breq->ifbr_ifsname, p->ifp->if_xname, IFNAMSIZ);
- breq->ifbr_ifsflags = p->bif_flags | IFBIF_SPAN;
- breq->ifbr_portno = p->ifp->if_index & 0xfff;
+ strlcpy(breq->ifbr_ifsname, bif->ifp->if_xname, IFNAMSIZ);
+ breq->ifbr_ifsflags = bif->bif_flags | IFBIF_SPAN;
+ breq->ifbr_portno = bif->ifp->if_index & 0xfff;
error = copyout((caddr_t)breq,
(caddr_t)(bifc->ifbic_req + i), sizeof(*breq));
if (error)
if ((dst_p = bridge_rtlookup(sc, dst)) != NULL)
dst_if = dst_p->brt_if;
if (dst_if == NULL || ETHER_IS_MULTICAST(eh->ether_dhost)) {
- struct bridge_iflist *p;
+ struct bridge_iflist *bif;
struct mbuf *mc;
int used = 0;
bridge_span(sc, m);
- TAILQ_FOREACH(p, &sc->sc_iflist, next) {
- dst_if = p->ifp;
+ TAILQ_FOREACH(bif, &sc->sc_iflist, next) {
+ dst_if = bif->ifp;
if ((dst_if->if_flags & IFF_RUNNING) == 0)
continue;
* allows forwarding.
*/
if (dst_if != ifp &&
- (p->bif_flags & IFBIF_STP) &&
- (p->bif_state == BSTP_IFSTATE_DISCARDING))
+ (bif->bif_flags & IFBIF_STP) &&
+ (bif->bif_state == BSTP_IFSTATE_DISCARDING))
continue;
#if NMPW > 0
/*
dst_if->if_type == IFT_MPLSTUNNEL)
continue;
#endif /* NMPW */
- if ((p->bif_flags & IFBIF_DISCOVER) == 0 &&
+ if ((bif->bif_flags & IFBIF_DISCOVER) == 0 &&
(m->m_flags & (M_BCAST | M_MCAST)) == 0)
continue;
- if (TAILQ_NEXT(p, next) == NULL) {
+ if (TAILQ_NEXT(bif, next) == NULL) {
used = 1;
mc = m;
} else {
bridge_broadcast(struct bridge_softc *sc, struct ifnet *ifp,
struct ether_header *eh, struct mbuf *m)
{
- struct bridge_iflist *p;
+ struct bridge_iflist *bif;
struct mbuf *mc;
struct ifnet *dst_if;
int len, used = 0;
u_int32_t protected;
- p = (struct bridge_iflist *)ifp->if_bridgeport;
- protected = p->bif_protected;
+ bif = (struct bridge_iflist *)ifp->if_bridgeport;
+ protected = bif->bif_protected;
- TAILQ_FOREACH(p, &sc->sc_iflist, next) {
- dst_if = p->ifp;
+ TAILQ_FOREACH(bif, &sc->sc_iflist, next) {
+ dst_if = bif->ifp;
if ((dst_if->if_flags & IFF_RUNNING) == 0)
continue;
- if ((p->bif_flags & IFBIF_STP) &&
- (p->bif_state == BSTP_IFSTATE_DISCARDING))
+ if ((bif->bif_flags & IFBIF_STP) &&
+ (bif->bif_state == BSTP_IFSTATE_DISCARDING))
continue;
- if ((p->bif_flags & IFBIF_DISCOVER) == 0 &&
+ if ((bif->bif_flags & IFBIF_DISCOVER) == 0 &&
(m->m_flags & (M_BCAST | M_MCAST)) == 0)
continue;
/* Drop non-IP frames if the appropriate flag is set. */
- if (p->bif_flags & IFBIF_BLOCKNONIP &&
+ if (bif->bif_flags & IFBIF_BLOCKNONIP &&
bridge_blocknonip(eh, m))
continue;
* Do not transmit if both ports are part of the same
* protected domain.
*/
- if (protected != 0 && (protected & p->bif_protected))
+ if (protected != 0 && (protected & bif->bif_protected))
continue;
- if (bridge_filterrule(&p->bif_brlout, eh, m) == BRL_ACTION_BLOCK)
+ if (bridge_filterrule(&bif->bif_brlout, eh, m) == BRL_ACTION_BLOCK)
continue;
/*
#endif /* NMPW */
/* If last one, reuse the passed-in mbuf */
- if (TAILQ_NEXT(p, next) == NULL) {
+ if (TAILQ_NEXT(bif, next) == NULL) {
mc = m;
used = 1;
} else {
void
bridge_span(struct bridge_softc *sc, struct mbuf *m)
{
- struct bridge_iflist *p;
+ struct bridge_iflist *bif;
struct ifnet *ifp;
struct mbuf *mc;
int error;
- TAILQ_FOREACH(p, &sc->sc_spanlist, next) {
- ifp = p->ifp;
+ TAILQ_FOREACH(bif, &sc->sc_spanlist, next) {
+ ifp = bif->ifp;
if ((ifp->if_flags & IFF_RUNNING) == 0)
continue;