View | Details | Raw Unified | Return to bug 211689 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/net/if_lagg.c (-9 / +23 lines)
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
{

Return to bug 211689