From nobody Mon Jan 23 22:11:58 2023 X-Original-To: dev-commits-src-branches@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 4P148G4QjGz2t0SM; Mon, 23 Jan 2023 22:11:58 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4P148G2XGnz3LFF; Mon, 23 Jan 2023 22:11:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674511918; 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=tyLdJ9L8GGNX9Dfx2GGfXIHyrMj+QjQjCnR+HlbQMUo=; b=buj6V2HDxux3+K03LneGOAeW5ZTJmletWOu6eTUQvb1QZjgfsmu35dzi1I23t7vJGCMzAx saQWiysb4CR55uipr7Twe7otKD9++hDzl2Yu4w5G2YkTdwzTVsRaDlFhF6zAnw9zUgTIKC feZjRFhZGXyXIKSobREZkmHuyMgjCFzCz32k3EE4Mbz08d2Ym8uHzv23iHxNUlS4IZ2ORW 8V+V8r389vSOmGfXnUIIk9qk0YBPPlzUNCzbP7gZu6J0etPSYNAY3r0VdCecD0QyeAeOtr EAknPfe8jBcZKzEy8jbVMDlsWVH+7G562HTU3s2+nIei8IOJmPStZenA3YRqpw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674511918; 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=tyLdJ9L8GGNX9Dfx2GGfXIHyrMj+QjQjCnR+HlbQMUo=; b=OiqKnve2eLuZiJcocXYgHo8fzj6Hg/EjR8Nd5wg8x+hKh92R/kD3Vz2wUAzIsCzwWCT8Vc rdSvdQ065XDGD9UiVlbR6it0xcGqL4NinSLlIW7too4MT1jrgjjyFmIwxV3+XBgXv2I273 29QqecgV3ZmkxSG78RWGgiCjp3ezY3Q+OCf5eSaKo0+g25aqThs2TLXEt7WTkb31O0TLD4 QfXhJNhJbak1IK7MDmVbF1i/ysi1Gyd/zdBfk/Np0/r2nCttYfhMIQ7Gcu/ABL4wlDk8+I UbGgOlpOPKk5z6lm851edFfepKI4GIqsUGQU7SV41wRsjD5HFbBLHvhnNYb1Gg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674511918; a=rsa-sha256; cv=none; b=vYPRuFdfZrqpfju0vygd4aaybCcyV9OEx/SKuBflVvQ4cpQtj0FGAZTG1+Awe/HkT6IXaB T2bgZuYAi9hvb2kaFyEQsEgoioXBWsqPEzdxpvHezllUVi2IA2UeEivjt8vkoR8re6ZeCG RlXC7ZutqAz0BnJn0gLKyqxvE680T3hwpSqLBpON6O1ZDl+YrqQaZJ/y1tUwHgMq6LhaVy Av4UTcej+Z2hqbQLtnG90xlK7uwaJjx6jcGTDD8iArneCnvziymTkBGAa2VNu13mR9zgaj mjuZLtwoQHM+6P/PlvDQs5xdL7bGZO/Wdee3ZZCmUpAF5qTLQ43UYEM7c7Cc2w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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 did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4P148G1ZVVzltj; Mon, 23 Jan 2023 22:11:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30NMBw87012798; Mon, 23 Jan 2023 22:11:58 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30NMBwaP012797; Mon, 23 Jan 2023 22:11:58 GMT (envelope-from git) Date: Mon, 23 Jan 2023 22:11:58 GMT Message-Id: <202301232211.30NMBwaP012797@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 286b49d4ea3a - stable/13 - netlink: allow more than 64 groups per netlink socket. List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 286b49d4ea3a4dda6627d7f6cea90d41d880f076 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=286b49d4ea3a4dda6627d7f6cea90d41d880f076 commit 286b49d4ea3a4dda6627d7f6cea90d41d880f076 Author: Alexander V. Chernikov AuthorDate: 2022-11-03 16:44:07 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-01-23 22:04:03 +0000 netlink: allow more than 64 groups per netlink socket. (cherry picked from commit 4dfd380e06c515349c5cc55a1f05effbf3a44ba1) --- sys/netlink/netlink_domain.c | 71 ++++++++++++++++++++++++++++++++----------- sys/netlink/netlink_generic.c | 2 +- sys/netlink/netlink_var.h | 4 ++- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/sys/netlink/netlink_domain.c b/sys/netlink/netlink_domain.c index 44b5fb732896..b0ff84401c84 100644 --- a/sys/netlink/netlink_domain.c +++ b/sys/netlink/netlink_domain.c @@ -55,6 +55,10 @@ #include _DECLARE_DEBUG(LOG_DEBUG); +_Static_assert((NLP_MAX_GROUPS % 64) == 0, + "NLP_MAX_GROUPS has to be multiple of 64"); +_Static_assert(NLP_MAX_GROUPS >= 64, + "NLP_MAX_GROUPS has to be at least 64"); #define NLCTL_TRACKER struct rm_priotracker nl_tracker #define NLCTL_RLOCK(_ctl) rm_rlock(&((_ctl)->ctl_lock), &nl_tracker) @@ -97,12 +101,43 @@ nl_port_lookup(uint32_t port_id) } static void -nl_update_groups_locked(struct nlpcb *nlp, uint64_t nl_groups) +nl_add_group_locked(struct nlpcb *nlp, unsigned int group_id) { - /* Update group mask */ - NL_LOG(LOG_DEBUG2, "socket %p, groups 0x%X -> 0x%X", - nlp->nl_socket, (uint32_t)nlp->nl_groups, (uint32_t)nl_groups); - nlp->nl_groups = nl_groups; + MPASS(group_id <= NLP_MAX_GROUPS); + --group_id; + + nlp->nl_groups[group_id / 64] |= (uint64_t)1 << (group_id % 64); +} + +static void +nl_del_group_locked(struct nlpcb *nlp, unsigned int group_id) +{ + MPASS(group_id <= NLP_MAX_GROUPS); + --group_id; + + nlp->nl_groups[group_id / 64] &= ~((uint64_t)1 << (group_id % 64)); +} + +static bool +nl_isset_group_locked(struct nlpcb *nlp, unsigned int group_id) +{ + MPASS(group_id <= NLP_MAX_GROUPS); + --group_id; + + return (nlp->nl_groups[group_id / 64] & ((uint64_t)1 << (group_id % 64))); +} + +static uint32_t +nl_get_groups_compat(struct nlpcb *nlp) +{ + uint32_t groups_mask = 0; + + for (int i = 0; i < 32; i++) { + if (nl_isset_group_locked(nlp, i + 1)) + groups_mask |= (1 << i); + } + + return (groups_mask); } /* @@ -134,10 +169,9 @@ nl_send_group(struct mbuf *m, int num_messages, int proto, int group_id) NLCTL_RLOCK(ctl); int io_flags = NL_IOF_UNTRANSLATED; - uint64_t groups_mask = 1 << ((uint64_t)group_id - 1); CK_LIST_FOREACH(nlp, &ctl->ctl_pcb_head, nl_next) { - if (nlp->nl_groups & groups_mask && nlp->nl_proto == proto) { + if (nl_isset_group_locked(nlp, group_id) && nlp->nl_proto == proto) { if (nlp_last != NULL) { struct mbuf *m_copy; m_copy = m_copym(m, 0, M_COPYALL, M_NOWAIT); @@ -213,7 +247,12 @@ nl_bind_locked(struct nlpcb *nlp, struct sockaddr_nl *snl) nlp->nl_bound = true; CK_LIST_INSERT_HEAD(&V_nl_ctl->ctl_port_head, nlp, nl_port_next); } - nl_update_groups_locked(nlp, snl->nl_groups); + for (int i = 0; i < 32; i++) { + if (snl->nl_groups & ((uint32_t)1 << i)) + nl_add_group_locked(nlp, i + 1); + else + nl_del_group_locked(nlp, i + 1); + } return (0); } @@ -324,7 +363,7 @@ nl_assign_port(struct nlpcb *nlp, uint32_t port_id) NLCTL_WLOCK(ctl); NLP_LOCK(nlp); - snl.nl_groups = nlp->nl_groups; + snl.nl_groups = nl_get_groups_compat(nlp); error = nl_bind_locked(nlp, &snl); NLP_UNLOCK(nlp); NLCTL_WUNLOCK(ctl); @@ -562,7 +601,6 @@ nl_ctloutput(struct socket *so, struct sockopt *sopt) struct nl_control *ctl = atomic_load_ptr(&V_nl_ctl); struct nlpcb *nlp = sotonlpcb(so); uint32_t flag; - uint64_t groups, group_mask; int optval, error = 0; NLCTL_TRACKER; @@ -575,20 +613,17 @@ nl_ctloutput(struct socket *so, struct sockopt *sopt) case NETLINK_ADD_MEMBERSHIP: case NETLINK_DROP_MEMBERSHIP: sooptcopyin(sopt, &optval, sizeof(optval), sizeof(optval)); - if (optval <= 0 || optval >= 64) { + if (optval <= 0 || optval >= NLP_MAX_GROUPS) { error = ERANGE; break; } - group_mask = (uint64_t)1 << (optval - 1); - NL_LOG(LOG_DEBUG2, "ADD/DEL group %d mask (%X)", - (uint32_t)optval, (uint32_t)group_mask); + NL_LOG(LOG_DEBUG2, "ADD/DEL group %d", (uint32_t)optval); NLCTL_WLOCK(ctl); if (sopt->sopt_name == NETLINK_ADD_MEMBERSHIP) - groups = nlp->nl_groups | group_mask; + nl_add_group_locked(nlp, optval); else - groups = nlp->nl_groups & ~group_mask; - nl_update_groups_locked(nlp, groups); + nl_del_group_locked(nlp, optval); NLCTL_WUNLOCK(ctl); break; case NETLINK_CAP_ACK: @@ -613,7 +648,7 @@ nl_ctloutput(struct socket *so, struct sockopt *sopt) switch (sopt->sopt_name) { case NETLINK_LIST_MEMBERSHIPS: NLCTL_RLOCK(ctl); - optval = nlp->nl_groups; + optval = nl_get_groups_compat(nlp); NLCTL_RUNLOCK(ctl); error = sooptcopyout(sopt, &optval, sizeof(optval)); break; diff --git a/sys/netlink/netlink_generic.c b/sys/netlink/netlink_generic.c index 5d074640ad60..de45048ff519 100644 --- a/sys/netlink/netlink_generic.c +++ b/sys/netlink/netlink_generic.c @@ -47,7 +47,7 @@ __FBSDID("$FreeBSD$"); _DECLARE_DEBUG(LOG_DEBUG3); #define MAX_FAMILIES 20 -#define MAX_GROUPS 20 +#define MAX_GROUPS 64 #define MIN_GROUP_NUM 48 diff --git a/sys/netlink/netlink_var.h b/sys/netlink/netlink_var.h index 130f3d40a1a3..ed19008248e9 100644 --- a/sys/netlink/netlink_var.h +++ b/sys/netlink/netlink_var.h @@ -47,9 +47,11 @@ struct nl_io_queue { int hiwat; }; +#define NLP_MAX_GROUPS 128 + struct nlpcb { struct socket *nl_socket; - uint64_t nl_groups; + uint64_t nl_groups[NLP_MAX_GROUPS / 64]; uint32_t nl_port; uint32_t nl_flags; uint32_t nl_process_id;