diff options
author | thompsa <thompsa@FreeBSD.org> | 2007-11-25 06:30:46 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2007-11-25 06:30:46 +0000 |
commit | b9948f58e5682dd01b7b25698701bb1c2f2987b7 (patch) | |
tree | 070d0393b107947a4c2ada7fe0c55931b5acded3 /sys/net | |
parent | ae9f8ed2e217e3cc36fdcc04df8fc6500fe70265 (diff) | |
download | FreeBSD-src-b9948f58e5682dd01b7b25698701bb1c2f2987b7.zip FreeBSD-src-b9948f58e5682dd01b7b25698701bb1c2f2987b7.tar.gz |
Have the lagg interface generate link up/down events, the interface is marked
as up if at least one of its ports also has a link up. This fixes using
carp+lagg together and any other system that relies on linkstate events.
PR: kern/113956
MFC after: 3 days
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/if_lagg.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c index 0a44cf8..c9c7ee6 100644 --- a/sys/net/if_lagg.c +++ b/sys/net/if_lagg.c @@ -88,6 +88,7 @@ static void lagg_port_setlladdr(void *, int); static int lagg_port_create(struct lagg_softc *, struct ifnet *); static int lagg_port_destroy(struct lagg_port *, int); static struct mbuf *lagg_input(struct ifnet *, struct mbuf *); +static void lagg_linkstate(struct lagg_softc *); static void lagg_port_state(struct ifnet *, int); static int lagg_port_ioctl(struct ifnet *, u_long, caddr_t); static int lagg_port_output(struct ifnet *, struct mbuf *, @@ -491,6 +492,7 @@ lagg_port_create(struct lagg_softc *sc, struct ifnet *ifp) /* Update lagg capabilities */ lagg_capabilities(sc); + lagg_linkstate(sc); /* Add multicast addresses and interface flags to this port */ lagg_ether_cmdmulti(lp, 1); @@ -596,6 +598,7 @@ lagg_port_destroy(struct lagg_port *lp, int runpd) /* Update lagg capabilities */ lagg_capabilities(sc); + lagg_linkstate(sc); return (0); } @@ -1188,6 +1191,22 @@ lagg_media_status(struct ifnet *ifp, struct ifmediareq *imr) } static void +lagg_linkstate(struct lagg_softc *sc) +{ + struct lagg_port *lp; + int new_link = LINK_STATE_DOWN; + + /* Our link is considered up if at least one of our ports is active */ + SLIST_FOREACH(lp, &sc->sc_ports, lp_entries) { + if (lp->lp_link_state == LINK_STATE_UP) { + new_link = LINK_STATE_UP; + break; + } + } + if_link_state_change(sc->sc_ifp, new_link); +} + +static void lagg_port_state(struct ifnet *ifp, int state) { struct lagg_port *lp = (struct lagg_port *)ifp->if_lagg; @@ -1199,6 +1218,7 @@ lagg_port_state(struct ifnet *ifp, int state) return; LAGG_WLOCK(sc); + lagg_linkstate(sc); if (sc->sc_linkstate != NULL) (*sc->sc_linkstate)(lp); LAGG_WUNLOCK(sc); |