From nobody Sun May 3 23:52:01 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4g81lk3549z6bvsx for ; Sun, 03 May 2026 23:52:02 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g81lj4RWfz3gq8 for ; Sun, 03 May 2026 23:52:01 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777852321; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=c99zctzhPmFHGnAgX50WB/zxOadzQ/7N7xplAklXNNM=; b=fByL70Mil6vm4SNUKk9cpuM5r4GuMCMsi5AidEtMv1czf+i73KL0cqZ8srDTGsD4AWedw8 +mApZLbL6VRU2eVHM9VQACPib/56dhCgJLM5IcerY8Z4zMthhLS7lpKYAs6sEkouVCulWa iUa/cFHR+v+VUddH4mDq1GVTTfG1p/2HMD/LozU8Daf5GjnHcrfTymKDAe+Tg/MI5Hu4Q0 0EKFeTXV99zfxCliLBIoU8ZYbs5fHPvVXjHjedD73w5Wuj7wPDR3wJN+0gFwrcsFYfx9X6 OjyDtZ+LRZ7GpXMePX3/Da1+cph89WQn3xWWq+XkuA0Kerquq8y6HjaUExsnaw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777852321; a=rsa-sha256; cv=none; b=TUHG86eLrrXCFKLGY2kzYVqG9UQWZ2pD80uNsCTPgsaoiYlu69+n9q/XpuyTA2CHLox0hr EPWwZHLXZ3ZhCQ1mMqTeFTSCenhmbX601Vj3yBaLXRXgQ7bBXgT04qc/pHQe/G+Ch6sd7C h5qTTwK9CYkhtsobxrqCZieiTIr6BUotVJeeyVxTvoXBF7XXt/p1RMFqLFH9oxa+N/Y274 Zs/J8cm339oYbXv8FYo4fBNgD77yepNG6JbvPZOq6ijZcY02omDSBfemq+tOvWHIAWwoTJ tqEdTWKLvPPIXJ26Yi40Ii1fgyCnRXFc4BEeuMhsKIgD26NMb1WgMgIq748hug== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777852321; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=c99zctzhPmFHGnAgX50WB/zxOadzQ/7N7xplAklXNNM=; b=itYuTKBAps0pI8NefRCXdCHljgJ9DmH3pogaAKwox1eFfpUc+JI3m/xN9lzeGjlgzrc3QN RU2YbPjE9LANl+ZVXq7QnvVF+uxmuDdg4zQrA0BGSTYPF/NMPe3jGDdDL/g/AEwwjybGb7 ta0A+yQZAKPPSe3MTqvhxINKq7HyXP2fVq1c/jSr5A3NIg5u+Da1SudSxheL1T/CRrjqDE cR9fPSvObEIVBBRw+dtaV1Y2So3dISk1LQnQ8lIREMmxVquWOEMqa8tw8S9TghHd6RfudF wOIsvEPCRWoYRm8q56MQuV4ILzqJOagYVdwa5hwLHHmnzFWJkZu+OxVZ1uMbVQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g81lj0fnVzvqp for ; Sun, 03 May 2026 23:52:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 31e19 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 03 May 2026 23:52:01 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mark Johnston Subject: git: 7ed46c400179 - stable/15 - ip6_mroute: Handle interface detach events List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 7ed46c40017987852ea5d6ec117dcc98488dae98 Auto-Submitted: auto-generated Date: Sun, 03 May 2026 23:52:01 +0000 Message-Id: <69f7dfa1.31e19.f6cde8c@gitrepo.freebsd.org> The branch stable/15 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=7ed46c40017987852ea5d6ec117dcc98488dae98 commit 7ed46c40017987852ea5d6ec117dcc98488dae98 Author: Mark Johnston AuthorDate: 2026-03-30 13:33:32 +0000 Commit: Mark Johnston CommitDate: 2026-05-03 23:10:43 +0000 ip6_mroute: Handle interface detach events When an interface goes away we need to make sure the v6 multicast routing tables don't carry any dangling references to the ifnet. The v4 code handles this already. Copy the approach there and use an eventhandler to purge the corresponding MIF, if one exists, and further go through all routes in the FIB and remove references to the interface. MFC after: 2 weeks Sponsored by: Stormshield Sponsored by: Klara, Inc. Differential Revision: https://reviews.freebsd.org/D55246 (cherry picked from commit a1c042a9641c9df08010e87d0928703849ff9853) --- sys/netinet6/ip6_mroute.c | 69 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/sys/netinet6/ip6_mroute.c b/sys/netinet6/ip6_mroute.c index cc2c7260ac80..c760d9d3ab2c 100644 --- a/sys/netinet6/ip6_mroute.c +++ b/sys/netinet6/ip6_mroute.c @@ -212,7 +212,7 @@ VNET_DEFINE_STATIC(struct mf6ctable *, mfctables); VNET_DEFINE_STATIC(uint32_t, nmfctables); #define V_nmfctables VNET(nmfctables) -static eventhandler_tag rtnumfibs_change_tag; +static eventhandler_tag ifdetach_tag, rtnumfibs_change_tag; static int sysctl_mfctable(SYSCTL_HANDLER_ARGS) @@ -792,6 +792,20 @@ add_m6if(struct mf6ctable *mfct, int fibnum, struct mif6ctl *mifcp) return (0); } +static void +expire_mf6c(struct mf6c *mfc) +{ + struct rtdetq *rte; + + while ((rte = mfc->mf6c_stall) != NULL) { + mfc->mf6c_stall = rte->next; + m_freem(rte->m); + free(rte, M_MRTABLE6); + } + + free(mfc, M_MRTABLE6); +} + /* * Delete a mif from the mif table */ @@ -811,9 +825,29 @@ del_m6if_locked(struct mf6ctable *mfct, mifi_t mifi) return (EINVAL); if (!(mifp->m6_flags & MIFF_REGISTER)) { - /* XXX: TODO: Maintain an ALLMULTI refcount in struct ifnet. */ ifp = mifp->m6_ifp; if_allmulti(ifp, 0); + + MFC6_LOCK(); + for (int i = 0; i < MF6CTBLSIZ; i++) { + struct mf6c *mfc, **nmfc; + + nmfc = &mfct->mfchashtbl[i]; + while ((mfc = *nmfc) != NULL) { + if (mfc->mf6c_parent == mifi) { + *nmfc = mfc->mf6c_next; + if (mfc->mf6c_expire) + mfct->nexpire[i]--; + expire_mf6c(mfc); + } else { + /* Remove this mif from the ifset */ + if (IF_ISSET(mifi, &mfc->mf6c_ifset)) + IF_CLR(mifi, &mfc->mf6c_ifset); + nmfc = &mfc->mf6c_next; + } + } + } + MFC6_UNLOCK(); } else { if (mfct->register_mif != (mifi_t)-1 && mfct->register_if != NULL) { @@ -1955,6 +1989,32 @@ pim6_input(struct mbuf *m, int off, int proto, void *arg __unused) return (rip6_input(&m, &off, proto)); } +static void +ip6_mrouter_ifdetach(void *arg __unused, struct ifnet *ifp) +{ + struct mf6ctable *mfct; + + if (!V_ip6_mrouting_enabled) + return; + for (int i = 0; i < V_nmfctables; i++) { + mfct = &V_mfctables[i]; + + MIF6_LOCK(); +restart: + for (mifi_t mifi = 0; mifi < mfct->nummifs; mifi++) { + int error __diagused; + + if (mfct->miftable[mifi].m6_ifp != ifp) + continue; + error = del_m6if_locked(mfct, mifi); + KASSERT(error == 0, + ("del_m6if_locked(%s) %d", ifp->if_xname, error)); + goto restart; + } + MIF6_UNLOCK(); + } +} + static void ip6_mroute_rtnumfibs_change(void *arg __unused, uint32_t ntables) { @@ -2011,6 +2071,9 @@ ip6_mroute_modevent(module_t mod, int type, void *unused) MFC6_LOCK_INIT(); MIF6_LOCK_INIT(); + ifdetach_tag = EVENTHANDLER_REGISTER( + ifnet_departure_event, ip6_mrouter_ifdetach, + NULL, EVENTHANDLER_PRI_ANY); rtnumfibs_change_tag = EVENTHANDLER_REGISTER( rtnumfibs_change, ip6_mroute_rtnumfibs_change, NULL, EVENTHANDLER_PRI_ANY); @@ -2036,6 +2099,8 @@ ip6_mroute_modevent(module_t mod, int type, void *unused) if (V_ip6_mrouting_enabled) return (EBUSY); + EVENTHANDLER_DEREGISTER(ifnet_departure_event, + ifdetach_tag); EVENTHANDLER_DEREGISTER(rtnumfibs_change, rtnumfibs_change_tag);