From nobody Mon Mar 30 16:15:45 2026 X-Original-To: dev-commits-src-main@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 4fkxDy3hMpz6WyXp 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 4fkxDx6KGJz49nH 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=1774887346; 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=vleSCcxQuLYmE88I/KeCCTq3dnhzkYH+QK1tuBtetLTtqeBqEOx5o34tt7Sbz/ZNpW2j2t 8yEaxUjiuSLM2pjDmxeq6jL9V4bHiQPWcFcEFBEDMP5XYXZvcATTCiWPCKSCZ/Nt4sA8DJ m7mIeJAsf0/h0vq+zWwe1jZD5/g7mbOGlWh0TGOMcTxFC7K+z7Qzmbtypb6zZ/APT/55kO 2HHN3WbuLUWQogySQZXXm+w8+uY5OggapknbtiJKfAvtgHWRlVKroJUWKc/P717siSzLvo 1epdoNDrL7GEpzZp5DFCnhuL5nUbVtPCfxcJ73B7mHO9ZFqpXBh+/d4QnPzSVw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1774887346; a=rsa-sha256; cv=none; b=e6PDjZJbl/4J1+gQOkYgFYMp/CJWPnqMGnWZf8DYcWJUEEPWDAmdN515coV7S4/YfzxRjF KRWdsatt7lJ0ZsmHu/cmW3kgCY1hj2nxsftaobpFo15l2mSsje/9GZkL8dMQW8gh4VCwEf DVAVbYA7Dovo5/e6DKVR1B6qVJqHJeoyHM8RNycrJLZH1F3fGWpmt1UooNpytX7S/cBYj8 sB6bchOlxxsc95v1xchZRmqK0v630OnsjMQ9KtAyzNgbdMVxxWcPECIqwzta589zpnPOzC tqBtglhb3B0UoovV6B0Yfo3kDW8Ws/7/uWhGyUYrVpk/AuIuxlrrLreSpVLBaw== 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=1774887346; 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=st5xh198XUOnQP59bTgKPyQAQ/PK3y6JIJtoKK6KJ1lgvFJjuqRbHHMcCSxcZkRVWVgN4p DSijJDHMo/74CFmwied9GK06ZvaEiT+dWzEaTp/y+l0oGmRTJSbAvUIGXbS65wrTn4ZN8G m4Uwq7BVSf551PQZ7eOd2e6by+xrqhBh06yzTXIA/nt27N3dfd0yMhQv/B60YlLJzF43Nz W3jenBdr8iLobMnYW4vak+PplniM2n1p6jExmnq4DTL91pU8z74KIGS+fENcdRd6pEEGhp OPrZKxBHdMrjCKvKml1meajYVCEiRuRRcEw6254b7ewcQtVz0nM9KOBQxFcPaA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fkxDx5Lc6zqMC 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 the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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);