Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Mar 2023 10:50:16 GMT
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 544f1492c026 - main - netlink: ensure genetlink control family always registers under the same ID.
Message-ID:  <202303271050.32RAoGnk001156@gitrepo.freebsd.org>

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

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

commit 544f1492c026f358507d812b63943eea08d3155d
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2023-03-27 10:48:24 +0000
Commit:     Alexander V. Chernikov <melifaro@FreeBSD.org>
CommitDate: 2023-03-27 10:48:24 +0000

    netlink: ensure genetlink control family always registers under the same ID.
    
    MFC after:      2 weeks
---
 sys/netlink/netlink_generic.c | 52 ++++++++++++++++++++++++++++++-------------
 1 file changed, 36 insertions(+), 16 deletions(-)

diff --git a/sys/netlink/netlink_generic.c b/sys/netlink/netlink_generic.c
index a2bd624f99d9..16b49d5aa9ce 100644
--- a/sys/netlink/netlink_generic.c
+++ b/sys/netlink/netlink_generic.c
@@ -47,6 +47,8 @@ __FBSDID("$FreeBSD$");
 #include <netlink/netlink_debug.h>
 _DECLARE_DEBUG(LOG_DEBUG);
 
+#define	CTRL_FAMILY_NAME	"nlctrl"
+
 #define	MAX_FAMILIES	20
 #define	MAX_GROUPS	64
 
@@ -96,6 +98,28 @@ find_family(const char *family_name)
 	return (NULL);
 }
 
+static struct genl_family *
+find_empty_family_id(const char *family_name)
+{
+	struct genl_family *gf = NULL;
+
+	if (!strcmp(family_name, CTRL_FAMILY_NAME)) {
+		gf = &families[0];
+		gf->family_id = GENL_MIN_ID;
+	} else {
+		/* Index 0 is reserved for the control family */
+		for (int i = 1; i < MAX_FAMILIES; i++) {
+			struct genl_family *gf = &families[i];
+			if (gf->family_name == NULL) {
+				gf->family_id = GENL_MIN_ID + i;
+				break;
+			}
+		}
+	}
+
+	return (gf);
+}
+
 uint32_t
 genl_register_family(const char *family_name, size_t hdrsize, int family_version,
     int max_attr_idx)
@@ -107,21 +131,18 @@ genl_register_family(const char *family_name, size_t hdrsize, int family_version
 		return (0);
 
 	GENL_LOCK();
-	for (int i = 0; i < MAX_FAMILIES; i++) {
-		struct genl_family *gf = &families[i];
-		if (gf->family_name == NULL) {
-			gf->family_name = family_name;
-			gf->family_version = family_version;
-			gf->family_hdrsize = hdrsize;
-			gf->family_attr_max = max_attr_idx;
-			gf->family_id = i + GENL_MIN_ID;
-			NL_LOG(LOG_DEBUG2, "Registered family %s id %d",
-			    gf->family_name, gf->family_id);
-			family_id = gf->family_id;
-			nlctrl_notify(gf, CTRL_CMD_NEWFAMILY);
-			break;
-		}
-	}
+
+	struct genl_family *gf = find_empty_family_id(family_name);
+	MPASS(gf != NULL);
+
+	gf->family_name = family_name;
+	gf->family_version = family_version;
+	gf->family_hdrsize = hdrsize;
+	gf->family_attr_max = max_attr_idx;
+	NL_LOG(LOG_DEBUG2, "Registered family %s id %d", gf->family_name, gf->family_id);
+	family_id = gf->family_id;
+	nlctrl_notify(gf, CTRL_CMD_NEWFAMILY);
+
 	GENL_UNLOCK();
 
 	return (family_id);
@@ -377,7 +398,6 @@ enomem:
 
 
 /* Declare ourself as a user */
-#define	CTRL_FAMILY_NAME	"nlctrl"
 
 static uint32_t ctrl_family_id;
 static uint32_t ctrl_group_id;



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