Lines 130-135
static int lagg_media_change(struct ifnet *);
Link Here
|
130 |
static void lagg_media_status(struct ifnet *, struct ifmediareq *); |
130 |
static void lagg_media_status(struct ifnet *, struct ifmediareq *); |
131 |
static struct lagg_port *lagg_link_active(struct lagg_softc *, |
131 |
static struct lagg_port *lagg_link_active(struct lagg_softc *, |
132 |
struct lagg_port *); |
132 |
struct lagg_port *); |
|
|
133 |
static void lagg_remove_pending_lladdr_changes( |
134 |
struct lagg_softc *, struct ifnet *); |
133 |
|
135 |
|
134 |
/* Simple round robin */ |
136 |
/* Simple round robin */ |
135 |
static void lagg_rr_attach(struct lagg_softc *); |
137 |
static void lagg_rr_attach(struct lagg_softc *); |
Lines 541-546
lagg_clone_destroy(struct ifnet *ifp)
Link Here
|
541 |
/* Shutdown and remove lagg ports */ |
543 |
/* Shutdown and remove lagg ports */ |
542 |
while ((lp = SLIST_FIRST(&sc->sc_ports)) != NULL) |
544 |
while ((lp = SLIST_FIRST(&sc->sc_ports)) != NULL) |
543 |
lagg_port_destroy(lp, 1); |
545 |
lagg_port_destroy(lp, 1); |
|
|
546 |
|
547 |
lagg_remove_pending_lladdr_changes(sc, ifp); |
548 |
|
544 |
/* Unhook the aggregation protocol */ |
549 |
/* Unhook the aggregation protocol */ |
545 |
lagg_proto_detach(sc); |
550 |
lagg_proto_detach(sc); |
546 |
LAGG_UNLOCK_ASSERT(sc); |
551 |
LAGG_UNLOCK_ASSERT(sc); |
Lines 877-883
lagg_port_destroy(struct lagg_port *lp, int rundelport)
Link Here
|
877 |
{ |
882 |
{ |
878 |
struct lagg_softc *sc = lp->lp_softc; |
883 |
struct lagg_softc *sc = lp->lp_softc; |
879 |
struct lagg_port *lp_ptr, *lp0; |
884 |
struct lagg_port *lp_ptr, *lp0; |
880 |
struct lagg_llq *llq; |
|
|
881 |
struct ifnet *ifp = lp->lp_ifp; |
885 |
struct ifnet *ifp = lp->lp_ifp; |
882 |
uint64_t *pval, vdiff; |
886 |
uint64_t *pval, vdiff; |
883 |
int i; |
887 |
int i; |
Lines 940-953
lagg_port_destroy(struct lagg_port *lp, int rundelport)
Link Here
|
940 |
|
944 |
|
941 |
/* Remove any pending lladdr changes from the queue */ |
945 |
/* Remove any pending lladdr changes from the queue */ |
942 |
if (lp->lp_detaching) { |
946 |
if (lp->lp_detaching) { |
943 |
SLIST_FOREACH(llq, &sc->sc_llq_head, llq_entries) { |
947 |
lagg_remove_pending_lladdr_changes(sc, ifp); |
944 |
if (llq->llq_ifp == ifp) { |
|
|
945 |
SLIST_REMOVE(&sc->sc_llq_head, llq, lagg_llq, |
946 |
llq_entries); |
947 |
free(llq, M_DEVBUF); |
948 |
break; /* Only appears once */ |
949 |
} |
950 |
} |
951 |
} |
948 |
} |
952 |
|
949 |
|
953 |
if (lp->lp_ifflags) |
950 |
if (lp->lp_ifflags) |
Lines 1868-1873
found:
Link Here
|
1868 |
return (rval); |
1865 |
return (rval); |
1869 |
} |
1866 |
} |
1870 |
|
1867 |
|
|
|
1868 |
static void |
1869 |
lagg_remove_pending_lladdr_changes(struct lagg_softc *sc, struct ifnet *ifp) |
1870 |
{ |
1871 |
struct lagg_llq *llq; |
1872 |
|
1873 |
LAGG_WLOCK_ASSERT(sc); |
1874 |
|
1875 |
SLIST_FOREACH(llq, &sc->sc_llq_head, llq_entries) { |
1876 |
if (llq->llq_ifp == ifp) { |
1877 |
SLIST_REMOVE(&sc->sc_llq_head, llq, lagg_llq, |
1878 |
llq_entries); |
1879 |
free(llq, M_DEVBUF); |
1880 |
break; /* Only appears once */ |
1881 |
} |
1882 |
} |
1883 |
} |
1884 |
|
1871 |
int |
1885 |
int |
1872 |
lagg_enqueue(struct ifnet *ifp, struct mbuf *m) |
1886 |
lagg_enqueue(struct ifnet *ifp, struct mbuf *m) |
1873 |
{ |
1887 |
{ |