aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gallatin <gallatin@FreeBSD.org>2025-11-20 00:48:56 +0000
committerAndrew Gallatin <gallatin@FreeBSD.org>2025-11-20 00:48:56 +0000
commit896dc30bc9bc2f7407b04ca4c08f88b1c7bf9d60 (patch)
treeb5c6d580faa87c7f7a16472bc990f2ea9960f258
parenta731cb93a66271713d6ea197946e4a307e5b0837 (diff)
iflib: fix iflib_simple_transmit() when interface is down
Use the same check as iflib_if_transmit() to detect when the interface is down and return the proper error code, and also free the mbuf. This fixes an mbuf leak when a member of a lagg is brought down (and probably many other scenarios). Sponsored by: Netflix
-rw-r--r--sys/net/iflib.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index ad2be119da7c..3181bdbcb849 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -7188,9 +7188,13 @@ iflib_simple_transmit(if_t ifp, struct mbuf *m)
ctx = if_getsoftc(ifp);
- if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
- IFF_DRV_RUNNING)
- return (EBUSY);
+ if (__predict_false((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0
+ || !LINK_ACTIVE(ctx))) {
+ DBG_COUNTER_INC(tx_frees);
+ m_freem(m);
+ return (ENETDOWN);
+ }
+
txq = iflib_simple_select_queue(ctx, m);
mtx_lock(&txq->ift_mtx);
error = iflib_encap(txq, &m);