Index: head/sys/net/ieee8023ad_lacp.h =================================================================== --- head/sys/net/ieee8023ad_lacp.h +++ head/sys/net/ieee8023ad_lacp.h @@ -292,8 +292,10 @@ #define LACP_LOCK_ASSERT(_lsc) mtx_assert(&(_lsc)->lsc_mtx, MA_OWNED) struct mbuf *lacp_input(struct lagg_port *, struct mbuf *); -struct lagg_port *lacp_select_tx_port(struct lagg_softc *, struct mbuf *); -struct lagg_port *lacp_select_tx_port_by_hash(struct lagg_softc *, uint32_t, uint8_t); +struct lagg_port *lacp_select_tx_port(struct lagg_softc *, struct mbuf *, + int *); +struct lagg_port *lacp_select_tx_port_by_hash(struct lagg_softc *, uint32_t, + uint8_t, int *); void lacp_attach(struct lagg_softc *); void lacp_detach(void *); void lacp_init(struct lagg_softc *); Index: head/sys/net/ieee8023ad_lacp.c =================================================================== --- head/sys/net/ieee8023ad_lacp.c +++ head/sys/net/ieee8023ad_lacp.c @@ -832,7 +832,8 @@ } struct lagg_port * -lacp_select_tx_port_by_hash(struct lagg_softc *sc, uint32_t hash, uint8_t numa_domain) +lacp_select_tx_port_by_hash(struct lagg_softc *sc, uint32_t hash, + uint8_t numa_domain, int *err) { struct lacp_softc *lsc = LACP_SOFTC(sc); struct lacp_portmap *pm; @@ -842,12 +843,14 @@ if (__predict_false(lsc->lsc_suppress_distributing)) { LACP_DPRINTF((NULL, "%s: waiting transit\n", __func__)); + *err = ENOBUFS; return (NULL); } pm = &lsc->lsc_pmap[lsc->lsc_activemap]; if (pm->pm_count == 0) { LACP_DPRINTF((NULL, "%s: no active aggregator\n", __func__)); + *err = ENETDOWN; return (NULL); } @@ -879,7 +882,7 @@ } struct lagg_port * -lacp_select_tx_port(struct lagg_softc *sc, struct mbuf *m) +lacp_select_tx_port(struct lagg_softc *sc, struct mbuf *m, int *err) { struct lacp_softc *lsc = LACP_SOFTC(sc); uint32_t hash; @@ -892,7 +895,7 @@ hash = m_ether_tcpip_hash(sc->sc_flags, m, lsc->lsc_hashkey); numa_domain = m->m_pkthdr.numa_domain; - return (lacp_select_tx_port_by_hash(sc, hash, numa_domain)); + return (lacp_select_tx_port_by_hash(sc, hash, numa_domain, err)); } /* Index: head/sys/net/if_lagg.c =================================================================== --- head/sys/net/if_lagg.c +++ head/sys/net/if_lagg.c @@ -1763,6 +1763,7 @@ struct lagg_port *lp; struct lagg_lb *lb; uint32_t hash, p; + int err; sc = ifp->if_softc; @@ -1783,7 +1784,7 @@ flowtype == M_HASHTYPE_NONE) return (NULL); hash = flowid >> sc->flowid_shift; - return (lacp_select_tx_port_by_hash(sc, hash, numa_domain)); + return (lacp_select_tx_port_by_hash(sc, hash, numa_domain, &err)); default: return (NULL); } @@ -2580,12 +2581,13 @@ lagg_lacp_start(struct lagg_softc *sc, struct mbuf *m) { struct lagg_port *lp; + int err; - lp = lacp_select_tx_port(sc, m); + lp = lacp_select_tx_port(sc, m, &err); if (lp == NULL) { if_inc_counter(sc->sc_ifp, IFCOUNTER_OERRORS, 1); m_freem(m); - return (ENETDOWN); + return (err); } /* Send mbuf */