From nobody Thu Sep 24 03:33:31 2026 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 4hqzvH6HNxz6tShh for ; Thu, 24 Sep 2026 03:33:31 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hqzvH4hgmz4mCb for ; Thu, 24 Sep 2026 03:33:31 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790220811; 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=Re6IzK2vkymSLTjTYyPN5JQkpf1fGQdskVDs+MX70FA=; b=AeyVeCCcuoh9JVFLN5rfvogA1Xou4rkRdQkfM4G5j5CaQCxQk+oL1137+h3aWAh69kcZ4Q 24Az7+kmSDpP3nPX0Y9KxsVinE6l0HmIkRbZfr3hIg17o2O8x6JLYUXPk3pJCX80wC5FkD AQpQESb3pWvYCMESHVIA4Pk4WEcFFeDL3rdocFLZF8udNOrE+HuViDEOu5LZqXvz8/pvCR ndUsu7s1LufrEpHtcYSKHgHyRim+PzfNIPrEsrQXmPOSGH8encc9lzMp3TBO4jKIEqsXiy sDm2a92u9rMDbpIQvEbuJKJDo+h1yPG6W2W8hlYelAqiWtbITi0Pe3Lxvlyk3w== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1790220811; b=KtzRlEHhNLHVBp+JOCBIfN311lmhcRuAuBbDP8k5MloS3ebNsB4ZMob+XGaNid6o95cLmB dvtAwbc7FVGvH5ptLr+XccIYdnfpGOU/OWn4orl4RYduxncIKqR9hgC7BcDXoDXLC3GRZS mw+FmrsR359b+Yu2fv/FizEOmDYQwJou2VZNJiDk6VPRfhfrblNvq+C6Al7XLZYcYlN83a 50uBJ5QUp2eRNKQ4fgKpW98hGBUHSMr5OCKdPsoI+tXxIR3LSb+r0E+IctAQbofYkJWpuV nG1U6+3yOLQFq82e9bxF3Zl6JTxU8vF/tA2OKMlzgNGjFk5RFuKAS6a/gR+pqA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790220811; 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=Re6IzK2vkymSLTjTYyPN5JQkpf1fGQdskVDs+MX70FA=; b=mzvn5sZIQyZ3vCePOaqP0FJI8f5zEWyhLLECQerz+3/w03IG4Vk4WVKiFrXPBX+vG+oowe VIKp2yc4BeE5d/odETebW71tW7/Uwkuepg3LcmXl/8p2ligrZvtUz3t1vkfOImAzocUHnY 77CvlhsNH2J1bzdUH2qMSLCkdziFCIZLga0n60ajUAFOTYEdvpQDrhWmCLydP9sd+H1jWR 2jFuzJmSRjSPZTR4NMEmvpF/7YtymY9siAMogPs2MJ6MaCbkzHQPCkGnE9oDHNcIa/Q/Ai SjjoGNAftygio/0DuhFGSd8it6/1+gQGK4XeZdd6DId8Ifr7eZaE5KWRnMuG9Q== 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 4hqzvH3mQPz1LdJ for ; Thu, 24 Sep 2026 03:33:31 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3b0e4 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 24 Sep 2026 03:33:31 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Gleb Smirnoff Subject: git: 8359e00444d2 - stable/15 - ng_ipfw: provide a tree for faster hook lookup 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: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list 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/stable/15 X-Git-Reftype: branch X-Git-Commit: 8359e00444d26cb0936f38de33d74f706f4a142f Auto-Submitted: auto-generated Date: Thu, 24 Sep 2026 03:33:31 +0000 Message-Id: <6ab49a0b.3b0e4.632b8ce4@gitrepo.freebsd.org> The branch stable/15 has been updated by glebius: URL: https://cgit.FreeBSD.org/src/commit/?id=8359e00444d26cb0936f38de33d74f706f4a142f commit 8359e00444d26cb0936f38de33d74f706f4a142f Author: Gleb Smirnoff AuthorDate: 2026-08-03 21:55:14 +0000 Commit: Gleb Smirnoff CommitDate: 2026-09-24 03:31:04 +0000 ng_ipfw: provide a tree for faster hook lookup This should assist setups that connect a lot of nodes to ipfw: and then distribute traffic with ipfw(4) tablearg feature. Reviewed by: pouria Differential Revision: https://reviews.freebsd.org/D58547 (cherry picked from commit d3a0bf0a79efb0a28d85d48c88d14bc5d89ab00a) --- sys/netgraph/ng_ipfw.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/sys/netgraph/ng_ipfw.c b/sys/netgraph/ng_ipfw.c index 9a6bb90412fa..f79b968f7ccb 100644 --- a/sys/netgraph/ng_ipfw.c +++ b/sys/netgraph/ng_ipfw.c @@ -93,14 +93,28 @@ MODULE_DEPEND(ng_ipfw, ipfw, 3, 3, 3); /* Information we store for each hook */ struct ng_ipfw_hook_priv { - hook_p hook; + RB_ENTRY(ng_ipfw_hook_priv) entry; + hook_p hook; uint32_t cookie; }; typedef struct ng_ipfw_hook_priv *hpriv_p; +/* Per-node private data */ +struct ngipfw { + RB_HEAD(ngipfw_tree, ng_ipfw_hook_priv) hooks; +}; + +static inline int +ng_ipfw_hook_compare(const hpriv_p a, const hpriv_p b) +{ + return ((a->cookie > b->cookie) - (a->cookie < b->cookie)); +} +RB_GENERATE_STATIC(ngipfw_tree, ng_ipfw_hook_priv, entry, ng_ipfw_hook_compare); + static int ng_ipfw_mod_event(module_t mod, int event, void *data) { + struct ngipfw *priv; int error = 0; switch (event) { @@ -111,14 +125,16 @@ ng_ipfw_mod_event(module_t mod, int event, void *data) break; } - /* Setup node without any private data */ if ((error = ng_make_node_common(&ng_ipfw_typestruct, &fw_node)) != 0) { log(LOG_ERR, "%s: can't create ng_ipfw node", __func__); break; } - /* Try to name node */ + priv = malloc(sizeof(*priv), M_NETGRAPH, M_WAITOK); + RB_INIT(&priv->hooks); + NG_NODE_SET_PRIVATE(fw_node, priv); + if (ng_name_node(fw_node, "ipfw") != 0) log(LOG_WARNING, "%s: failed to name node \"ipfw\"", __func__); @@ -151,6 +167,7 @@ ng_ipfw_constructor(node_p node) static int ng_ipfw_newhook(node_p node, hook_p hook, const char *name) { + struct ngipfw *priv = NG_NODE_PRIVATE(node); hpriv_p hpriv; uint32_t cookie; const char *cp; @@ -180,7 +197,10 @@ ng_ipfw_newhook(node_p node, hook_p hook, const char *name) NG_HOOK_SET_PRIVATE(hook, hpriv); - return(0); + hpriv = RB_INSERT(ngipfw_tree, &priv->hooks, hpriv); + MPASS(hpriv == NULL); + + return (0); } /* @@ -211,14 +231,12 @@ ng_ipfw_findhook(node_p node, const char *name) static hook_p ng_ipfw_findhook1(node_p node, uint32_t cookie) { - hook_p hook; - hpriv_p hpriv; + struct ngipfw *priv = NG_NODE_PRIVATE(node); + struct ng_ipfw_hook_priv key = { .cookie = cookie }, *hpriv; - LIST_FOREACH(hook, &node->nd_hooks, hk_hooks) { - hpriv = NG_HOOK_PRIVATE(hook); - if (NG_HOOK_IS_VALID(hook) && (hpriv->cookie == cookie)) - return (hook); - } + hpriv = RB_FIND(ngipfw_tree, &priv->hooks, &key); + if (hpriv != NULL && NG_HOOK_IS_VALID(hpriv->hook)) + return (hpriv->hook); return (NULL); } @@ -334,6 +352,7 @@ ng_ipfw_input(struct mbuf **m0, struct ip_fw_args *fwa, bool tee) static int ng_ipfw_shutdown(node_p node) { + struct ngipfw *priv = NG_NODE_PRIVATE(node); /* * After our single node has been removed, @@ -342,14 +361,20 @@ ng_ipfw_shutdown(node_p node) */ ng_ipfw_input_p = NULL; NG_NODE_UNREF(node); + + MPASS(RB_EMPTY(&priv->hooks)); + free(priv, M_NETGRAPH); + return (0); } static int ng_ipfw_disconnect(hook_p hook) { + struct ngipfw *priv = NG_NODE_PRIVATE(NG_HOOK_NODE(hook)); const hpriv_p hpriv = NG_HOOK_PRIVATE(hook); + RB_REMOVE(ngipfw_tree, &priv->hooks, hpriv); free(hpriv, M_NETGRAPH); NG_HOOK_SET_PRIVATE(hook, NULL);