Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 1 May 2025 08:24:05 GMT
From:      Kristof Provost <kp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: d2c2d6d6b09e - main - igmp: apply net.inet.igmp.default_version to existing interfaces
Message-ID:  <202505010824.5418O5dV079763@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=d2c2d6d6b09e8a059dffd6b6c7513d0925a8753d

commit d2c2d6d6b09e8a059dffd6b6c7513d0925a8753d
Author:     Olivier BLANC <etihwo@outlook.com>
AuthorDate: 2025-03-14 18:55:55 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2025-05-01 07:31:21 +0000

    igmp: apply net.inet.igmp.default_version to existing interfaces
    
    IGMP requires hosts to use the lowest version they have seen on the network.
    When net.inet.igmp.default_version is changed, we do not change IGMP
    version used by interface even if the interface use an higher version than
    V_igmp_default_version. So we could send IGMPv3 even if the user has requested
    IGMPv2 or IGMPv1 via the sysctl.
    
    Change IGMP version for each interface when V_igmp_default_version is smaller
    than the version used by the interface.
    
    Pull Request:   https://github.com/freebsd/freebsd-src/pull/1615
    Differential Revision:  https://reviews.freebsd.org/D50071
---
 sys/netinet/igmp.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/sys/netinet/igmp.c b/sys/netinet/igmp.c
index 5082b6294ebb..299f3c2e02bb 100644
--- a/sys/netinet/igmp.c
+++ b/sys/netinet/igmp.c
@@ -402,32 +402,43 @@ out:
 static int
 sysctl_igmp_default_version(SYSCTL_HANDLER_ARGS)
 {
+	struct epoch_tracker	 et;
 	int	 error;
 	int	 new;
+	struct igmp_ifsoftc *igi;
 
 	error = sysctl_wire_old_buffer(req, sizeof(int));
 	if (error)
 		return (error);
 
-	IGMP_LOCK();
-
 	new = V_igmp_default_version;
 
 	error = sysctl_handle_int(oidp, &new, 0, req);
 	if (error || !req->newptr)
-		goto out_locked;
+		return (error);
 
-	if (new < IGMP_VERSION_1 || new > IGMP_VERSION_3) {
-		error = EINVAL;
-		goto out_locked;
-	}
+	if (new < IGMP_VERSION_1 || new > IGMP_VERSION_3)
+		return (EINVAL);
+
+	IN_MULTI_LIST_LOCK();
+	IGMP_LOCK();
+	NET_EPOCH_ENTER(et);
 
-	CTR2(KTR_IGMPV3, "change igmp_default_version from %d to %d",
-	     V_igmp_default_version, new);
+	if (V_igmp_default_version != new) {
+		CTR2(KTR_IGMPV3, "change igmp_default_version from %d to %d",
+			V_igmp_default_version, new);
 
-	V_igmp_default_version = new;
+		V_igmp_default_version = new;
 
-out_locked:
+		LIST_FOREACH(igi, &V_igi_head, igi_link) {
+			if (igi->igi_version > V_igmp_default_version){
+				igmp_set_version(igi, V_igmp_default_version);
+			}
+		}
+	}
+
+	NET_EPOCH_EXIT(et);
+	IN_MULTI_LIST_UNLOCK();
 	IGMP_UNLOCK();
 	return (error);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505010824.5418O5dV079763>