From nobody Mon Mar 30 16:15:45 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 4fkxDy3hbQz6WyKF for ; Mon, 30 Mar 2026 16:15:46 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fkxDx61Tcz49nG for ; Mon, 30 Mar 2026 16:15:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1774887345; 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=lht8sjD/RbZUEW15F5rufW6BSUF2D/1a4FLiq8KlnoY=; b=EoGBSAikAGotZqSCxWE5yrzM8EeHqFKkBsfR5Qu2Ye7KC0OFZkXtou3uwelN/KjXY9gWB5 pQ3Ax+8O7TKiTNr5JZHYbVCGscYpUqudK9c5/T70Cri/0q6h0z7qg7Tf+HXE2G1QIGpwCt uujqYGrmXippIzuyi50V518RhPToGGoug3H/5pS9W8qW9wWlgvZlyffj48kdYb3JDjjhXt lGcC/Nvp21tUMWPyA/ytL1BiSjkDviP1NKgwHukUt86G5BRbpqNCo76TovSVN8/uWEGwFl +Vrk2X5+B/TxuQoAd6azsDkabxmF3LCqW+b6OBNaEAqMARkwwEb2ZCKjveO6iw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1774887345; a=rsa-sha256; cv=none; b=bVw2Za2CzcDyk8NwzHCsJahoei/N15O+2oC7HvRrZpTB0AWWKZaw9s6E2ZfTifQ2PNkZU/ uXB+ar7QQB6aNfUqvSUCSyKctECtKqmhDSFeyVXjw0iIsLbFRR5zzZCEstC4OtCNNWs/pn livL05wxmYyGwzpHpAROTPpei+70vTOFxkVoKXHgMpITvUS+vHwvSNE44uq0/k8SrSEUVQ qABmekr6Y7FnJq0RNnUQk8TS+4xZjxr00WFZjBLJEb2W8ausWYwFA/Lh0t2/tJaORh3EXO ihbymBQr0GM2LsLJ4bPrxiuWjf8z8LLpi81sJ4FYZ2KjWBsJetW33dwjqltVKQ== 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=1774887345; 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=lht8sjD/RbZUEW15F5rufW6BSUF2D/1a4FLiq8KlnoY=; b=kHNDUsnr6tJ4asVrhz7ADlxx+TQvcQnvqt6iybYS+J53H8sfnoj69s6Lh8Get7C7D8p1ev OBebzaAAmX/fdu7bDF3mpc3toel4IBvG4zpspGlV+mSvtU5T7ys9CYGy8bmiov7gIL+/CN 1vBT00eiGyBaEJlpISBe2VKwzlzIs6vo/vD0M9wp9xXYNRd9kiEgjKtDdH9UR5ZZDVOnxd 0SLzVC4F/pP1gQQO+eruajGwir2j9KUxJSVerbtJqkado4roQaqVH7+lYPPuVdeHEeDZMp /iUhOE2fu7zIVZEQmFk0rmw9Qf2DKEfdTa+uOWryAeyAnpF3KhVWkKnmLBVshw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fkxDx5LdkzqWV for ; Mon, 30 Mar 2026 16:15:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3b8ac by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 30 Mar 2026 16:15:45 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: a1c042a9641c - main - 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 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/main X-Git-Reftype: branch X-Git-Commit: a1c042a9641c9df08010e87d0928703849ff9853 Auto-Submitted: auto-generated Date: Mon, 30 Mar 2026 16:15:45 +0000 Message-Id: <69caa1b1.3b8ac.5985faa4@gitrepo.freebsd.org> The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=a1c042a9641c9df08010e87d0928703849ff9853 commit a1c042a9641c9df08010e87d0928703849ff9853 Author: Mark Johnston AuthorDate: 2026-03-30 13:33:32 +0000 Commit: Mark Johnston CommitDate: 2026-03-30 16:08:21 +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 --- 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 f9541203a747..9a7f611b8b4c 100644 --- a/sys/netinet6/ip6_mroute.c +++ b/sys/netinet6/ip6_mroute.c @@ -211,7 +211,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) @@ -791,6 +791,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 */ @@ -810,9 +824,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) { @@ -1954,6 +1988,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) { @@ -2010,6 +2070,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); @@ -2035,6 +2098,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);