From nobody Fri Jan 23 22:36:43 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 4dyXq0498gz6PspV for ; Fri, 23 Jan 2026 22:36:44 +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" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4dyXq00Smkz3qYv for ; Fri, 23 Jan 2026 22:36:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769207804; 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=/Inv1thfOz9u1DIlmQkYdglv1sQvH/YBD2Q4iAIxdcw=; b=tPrMjo5LNiYtb9jbAPL6lShjdBy9F834WjKxBs+9hW1Atgtuz3UWYWUpUxvFw+yLA+kv1j k6iLsH3ds72IfbIpoYw9UhKBZPWPYtJjNznd1EEqbSlGzlKVXBzGfYrqDZ+QktsX4QrOEC mj0E29jP1Jo6nopIC06jTbOtNrzTZso0j3naLEVXPsEcUHFFSgki93zW3P87c7rVDFHR1e k2vS2DrJ5uluvow+A3dvpxkOl6grDsa9+ydpnPyps2v10pCra8rjoiMIvPGOFqVwZy6vr7 JCVgpkIu5oEwrU64bG14/MvWqa8ZQUFStr7TeE8gkWNDB1ype2TxurGuGotE1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769207804; 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=/Inv1thfOz9u1DIlmQkYdglv1sQvH/YBD2Q4iAIxdcw=; b=S6J382MTkXMO1BKyMFh3WQ7HDjmYcQ0T526z9Y0ta4kYEjBsPfLRuGEcgAkRMnGhQ0Er/1 VMRpc8tI22t+agimJLNS6jLc4CZdttV3peUxF04Y2fYFfzNp/48dNLX7sywCBwl7C3LpWe 0U5WQtRxrFKYppobFDRLUYlhSHWabqXuEMmlJVp7XPuODJfDHLh3bLiDH+nZTnEDrP2KMs 2ZX2m4qFcbQj6kyM6nR6Yo0J7YXBzpVee6+IbHlc9Jb2hcdy4Y+GjMzjr8MSiEfIX2Vn3j wOb2W9DexZgUwxFK691THpg2CSrVpmRjue8We+x/+npGB0aW2TivcSZmfwZbkA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1769207804; a=rsa-sha256; cv=none; b=l8RKUQYE1cmJmSdlZxB59LwTg8v8B5BLiR/HK/nDbhu8ZvQxB+jOMVOg0+B80DwrBcMf3e ZjmCJ5fNEDKHIoZodvWTonw95rjXdlY4Mn8EBYT1chuTiWj41/KkIyuRiGkQeKuhX2ix4k 6mJhePg6SGn538EiWqYxakpMtw7zbeT9uo3OFqorE2McJkvvXCcKR/mqH1IwTldSUTdivZ lDyRnxI6V25WZFGjXMX8G7NZ4PkkG/zkEDz78CbsRNvGW9EVhk2T8r4Dsz7g9rYGfF/2wf 71rDjRosEcvlRHKsy05xCQSYmxUGUP0nopH3dciaH88xZXM4HJ4Nuf/Sd1nOIQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4dyXpz6ZHfzfL2 for ; Fri, 23 Jan 2026 22:36:43 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 38546 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 23 Jan 2026 22:36:43 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Gleb Smirnoff Subject: git: cba9f88105c2 - main - netinet6: embed struct mld_ifsoftc into struct in6_ifextra 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: glebius X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: cba9f88105c268f73fa2a92ca4479cc15b8a3338 Auto-Submitted: auto-generated Date: Fri, 23 Jan 2026 22:36:43 +0000 Message-Id: <6973f7fb.38546.527474d0@gitrepo.freebsd.org> The branch main has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=cba9f88105c268f73fa2a92ca4479cc15b8a3338 commit cba9f88105c268f73fa2a92ca4479cc15b8a3338 Author: Gleb Smirnoff AuthorDate: 2026-01-23 22:18:12 +0000 Commit: Gleb Smirnoff CommitDate: 2026-01-23 22:18:12 +0000 netinet6: embed struct mld_ifsoftc into struct in6_ifextra In mld_domifdetach() don't search the global list. Reviewed by: tuexen Differential Revision: https://reviews.freebsd.org/D54727 --- sys/netinet6/in6.c | 3 +-- sys/netinet6/in6_var.h | 16 +++++++++++++- sys/netinet6/ip6_input.c | 1 - sys/netinet6/mld6.c | 54 ++++++++++++------------------------------------ sys/netinet6/mld6_var.h | 22 ++------------------ 5 files changed, 31 insertions(+), 65 deletions(-) diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 45a7256cfc9e..e1504400d55b 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -2613,11 +2613,10 @@ in6_ifarrival(void *arg __unused, struct ifnet *ifp) COUNTER_ARRAY_ALLOC(ext->icmp6_ifstat, sizeof(struct icmp6_ifstat) / sizeof(uint64_t), M_WAITOK); nd6_ifattach(ifp); + mld_domifattach(ifp); scope6_ifattach(ifp); ext->lltable = in6_lltattach(ifp); - - ext->mld_ifinfo = mld_domifattach(ifp); } EVENTHANDLER_DEFINE(ifnet_arrival_event, in6_ifarrival, NULL, EVENTHANDLER_PRI_ANY); diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h index a8ae343ffaed..894628b796d1 100644 --- a/sys/netinet6/in6_var.h +++ b/sys/netinet6/in6_var.h @@ -506,6 +506,21 @@ struct in6_ifextra { u_int nd_dad_failures; uint8_t nd_curhoplimit; + struct mld_ifsoftc { + /* Timers and invervals measured in seconds. */ + LIST_ENTRY(mld_ifsoftc) mli_link; + struct ifnet *mli_ifp; /* interface this instance belongs to */ + uint32_t mli_version; /* MLDv1 Host Compatibility Mode */ + uint32_t mli_v1_timer; /* MLDv1 Querier Present timer */ + uint32_t mli_v2_timer; /* MLDv2 General Query timer */ + uint32_t mli_flags; /* MLD per-interface flags */ + uint32_t mli_rv; /* MLDv2 Robustness Variable */ + uint32_t mli_qi; /* MLDv2 Query Interval */ + uint32_t mli_qri; /* MLDv2 Query Response Interval */ + uint32_t mli_uri; /* MLDv2 Unsolicited Report Interval */ + struct mbufq mli_gq; /* queue of general query responses */ + } mld_ifsoftc; + struct scope6_id { /* * 16 is correspondent to 4bit multicast scope field. i.e. from @@ -516,7 +531,6 @@ struct in6_ifextra { } scope6_id; struct lltable *lltable; - struct mld_ifsoftc *mld_ifinfo; }; #define LLTABLE6(ifp) ((ifp)->if_inet6->lltable) diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c index 62e03a189650..d914bfbcbdbf 100644 --- a/sys/netinet6/ip6_input.c +++ b/sys/netinet6/ip6_input.c @@ -390,7 +390,6 @@ ip6_destroy(void *unused __unused) } /* IF_ADDR_UNLOCK(ifp); */ in6_ifdetach_destroy(ifp); - mld_domifdetach(ifp); } IFNET_RUNLOCK(); diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c index 8e2bbf8adc01..f14d2c76ffda 100644 --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -99,7 +99,6 @@ #define KTR_MLD KTR_INET6 #endif -static void mli_delete_locked(struct ifnet *); static void mld_dispatch_packet(struct mbuf *); static void mld_dispatch_queue(struct mbufq *, int); static void mld_final_leave(struct in6_multi *, struct mld_ifsoftc *); @@ -465,21 +464,21 @@ mld_is_addr_reported(const struct in6_addr *addr) * Attach MLD when PF_INET6 is attached to an interface. Assumes that the * current VNET is set by the caller. */ -struct mld_ifsoftc * +void mld_domifattach(struct ifnet *ifp) { - struct mld_ifsoftc *mli; + struct mld_ifsoftc *mli = MLD_IFINFO(ifp); CTR3(KTR_MLD, "%s: called for ifp %p(%s)", __func__, ifp, if_name(ifp)); - mli = malloc(sizeof(struct mld_ifsoftc), M_MLD, M_WAITOK | M_ZERO); - mli->mli_ifp = ifp; - mli->mli_version = MLD_VERSION_2; - mli->mli_flags = 0; - mli->mli_rv = MLD_RV_INIT; - mli->mli_qi = MLD_QI_INIT; - mli->mli_qri = MLD_QRI_INIT; - mli->mli_uri = MLD_URI_INIT; + *mli = (struct mld_ifsoftc){ + .mli_ifp = ifp, + .mli_version = MLD_VERSION_2, + .mli_rv = MLD_RV_INIT, + .mli_qi = MLD_QI_INIT, + .mli_qri = MLD_QRI_INIT, + .mli_uri = MLD_URI_INIT, + }; mbufq_init(&mli->mli_gq, MLD_MAX_RESPONSE_PACKETS); if ((ifp->if_flags & IFF_MULTICAST) == 0) mli->mli_flags |= MLIF_SILENT; @@ -489,8 +488,6 @@ mld_domifattach(struct ifnet *ifp) MLD_LOCK(); LIST_INSERT_HEAD(&V_mli_head, mli, mli_link); MLD_UNLOCK(); - - return (mli); } /* @@ -552,44 +549,19 @@ mld_ifdetach(struct ifnet *ifp, struct in6_multi_head *inmh) /* * Hook for domifdetach. * Runs after link-layer cleanup; free MLD state. - * - * SMPng: Normally called with LLTABLE_LOCK held. */ void mld_domifdetach(struct ifnet *ifp) { + struct mld_ifsoftc *mli = MLD_IFINFO(ifp); CTR3(KTR_MLD, "%s: called for ifp %p(%s)", __func__, ifp, if_name(ifp)); MLD_LOCK(); - mli_delete_locked(ifp); + LIST_REMOVE(mli, mli_link); MLD_UNLOCK(); -} - -static void -mli_delete_locked(struct ifnet *ifp) -{ - struct mld_ifsoftc *mli, *tmli; - - CTR3(KTR_MLD, "%s: freeing mld_ifsoftc for ifp %p(%s)", - __func__, ifp, if_name(ifp)); - - MLD_LOCK_ASSERT(); - - LIST_FOREACH_SAFE(mli, &V_mli_head, mli_link, tmli) { - if (mli->mli_ifp == ifp) { - /* - * Free deferred General Query responses. - */ - mbufq_drain(&mli->mli_gq); - - LIST_REMOVE(mli, mli_link); - - free(mli, M_MLD); - return; - } - } + mbufq_drain(&mli->mli_gq); } /* diff --git a/sys/netinet6/mld6_var.h b/sys/netinet6/mld6_var.h index d75ac2450c10..a063771f4dc8 100644 --- a/sys/netinet6/mld6_var.h +++ b/sys/netinet6/mld6_var.h @@ -120,23 +120,6 @@ struct mld_ifinfo { }; #ifdef _KERNEL -/* - * Per-link MLD state. - */ -struct mld_ifsoftc { - LIST_ENTRY(mld_ifsoftc) mli_link; - struct ifnet *mli_ifp; /* interface this instance belongs to */ - uint32_t mli_version; /* MLDv1 Host Compatibility Mode */ - uint32_t mli_v1_timer; /* MLDv1 Querier Present timer (s) */ - uint32_t mli_v2_timer; /* MLDv2 General Query (interface) timer (s)*/ - uint32_t mli_flags; /* MLD per-interface flags */ - uint32_t mli_rv; /* MLDv2 Robustness Variable */ - uint32_t mli_qi; /* MLDv2 Query Interval (s) */ - uint32_t mli_qri; /* MLDv2 Query Response Interval (s) */ - uint32_t mli_uri; /* MLDv2 Unsolicited Report Interval (s) */ - struct mbufq mli_gq; /* queue of general query responses */ -}; - #define MLD_RANDOM_DELAY(X) (arc4random() % (X) + 1) #define MLD_MAX_STATE_CHANGES 24 /* Max pending changes per group */ @@ -155,12 +138,11 @@ struct mld_ifsoftc { /* * Per-link MLD context. */ -#define MLD_IFINFO(ifp) ((ifp)->if_inet6->mld_ifinfo) +#define MLD_IFINFO(ifp) (&(ifp)->if_inet6->mld_ifsoftc) struct in6_multi_head; int mld_change_state(struct in6_multi *, const int); -struct mld_ifsoftc * - mld_domifattach(struct ifnet *); +void mld_domifattach(struct ifnet *); void mld_domifdetach(struct ifnet *); void mld_ifdetach(struct ifnet *, struct in6_multi_head *); int mld_input(struct mbuf **, int, int);