Module Name: src
Committed By: thorpej
Date: Fri Sep 2 03:50:00 UTC 2022
Modified Files:
src/sys/net: if.c pktqueue.c pktqueue.h
src/sys/netinet: ip_input.c
src/sys/netinet6: ip6_input.c
Log Message:
pktqueue: Re-factor sysctl handling.
Provide a new pktq_sysctl_setup() function that attaches standard
pktq sysctl nodes below a specified parent node, with either a
fixed node ID or CTL_CREATE to dynamically assign node IDs. Make
all of the sysctl handlers private to pktqueue.c, and remove the
INET- and INET6-specific pktqueue sysctl code from net/if.c.
To generate a diff of this commit:
cvs rdiff -u -r1.520 -r1.521 src/sys/net/if.c
cvs rdiff -u -r1.18 -r1.19 src/sys/net/pktqueue.c
cvs rdiff -u -r1.6 -r1.7 src/sys/net/pktqueue.h
cvs rdiff -u -r1.401 -r1.402 src/sys/netinet/ip_input.c
cvs rdiff -u -r1.224 -r1.225 src/sys/netinet6/ip6_input.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.520 src/sys/net/if.c:1.521
--- src/sys/net/if.c:1.520 Sun Aug 21 12:34:39 2022
+++ src/sys/net/if.c Fri Sep 2 03:50:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if.c,v 1.520 2022/08/21 12:34:39 skrll Exp $ */
+/* $NetBSD: if.c,v 1.521 2022/09/02 03:50:00 thorpej Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.520 2022/08/21 12:34:39 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.521 2022/09/02 03:50:00 thorpej Exp $");
#if defined(_KERNEL_OPT)
#include "opt_inet.h"
@@ -270,10 +270,6 @@ struct if_slowtimo_data {
bool isd_trigger;
};
-#if defined(INET) || defined(INET6)
-static void sysctl_net_pktq_setup(struct sysctllog **, int);
-#endif
-
/*
* Hook for if_vlan - needed by if_agr
*/
@@ -4095,103 +4091,6 @@ bad:
return;
}
-#if defined(INET) || defined(INET6)
-
-#define SYSCTL_NET_PKTQ(q, cn, c) \
- static int \
- sysctl_net_##q##_##cn(SYSCTLFN_ARGS) \
- { \
- return sysctl_pktq_count(SYSCTLFN_CALL(rnode), q, c); \
- }
-
-#if defined(INET)
-static int
-sysctl_net_ip_pktq_maxlen(SYSCTLFN_ARGS)
-{
- return sysctl_pktq_maxlen(SYSCTLFN_CALL(rnode), ip_pktq);
-}
-SYSCTL_NET_PKTQ(ip_pktq, items, PKTQ_NITEMS)
-SYSCTL_NET_PKTQ(ip_pktq, drops, PKTQ_DROPS)
-#endif
-
-#if defined(INET6)
-static int
-sysctl_net_ip6_pktq_maxlen(SYSCTLFN_ARGS)
-{
- return sysctl_pktq_maxlen(SYSCTLFN_CALL(rnode), ip6_pktq);
-}
-SYSCTL_NET_PKTQ(ip6_pktq, items, PKTQ_NITEMS)
-SYSCTL_NET_PKTQ(ip6_pktq, drops, PKTQ_DROPS)
-#endif
-
-static void
-sysctl_net_pktq_setup(struct sysctllog **clog, int pf)
-{
- sysctlfn len_func = NULL, maxlen_func = NULL, drops_func = NULL;
- const char *pfname = NULL, *ipname = NULL;
- int ipn = 0, qid = 0;
-
- switch (pf) {
-#if defined(INET)
- case PF_INET:
- len_func = sysctl_net_ip_pktq_items;
- maxlen_func = sysctl_net_ip_pktq_maxlen;
- drops_func = sysctl_net_ip_pktq_drops;
- pfname = "inet", ipn = IPPROTO_IP;
- ipname = "ip", qid = IPCTL_IFQ;
- break;
-#endif
-#if defined(INET6)
- case PF_INET6:
- len_func = sysctl_net_ip6_pktq_items;
- maxlen_func = sysctl_net_ip6_pktq_maxlen;
- drops_func = sysctl_net_ip6_pktq_drops;
- pfname = "inet6", ipn = IPPROTO_IPV6;
- ipname = "ip6", qid = IPV6CTL_IFQ;
- break;
-#endif
- default:
- KASSERT(false);
- }
-
- sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, pfname, NULL,
- NULL, 0, NULL, 0,
- CTL_NET, pf, CTL_EOL);
- sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, ipname, NULL,
- NULL, 0, NULL, 0,
- CTL_NET, pf, ipn, CTL_EOL);
- sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, "ifq",
- SYSCTL_DESCR("Protocol input queue controls"),
- NULL, 0, NULL, 0,
- CTL_NET, pf, ipn, qid, CTL_EOL);
-
- sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_QUAD, "len",
- SYSCTL_DESCR("Current input queue length"),
- len_func, 0, NULL, 0,
- CTL_NET, pf, ipn, qid, IFQCTL_LEN, CTL_EOL);
- sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
- CTLTYPE_INT, "maxlen",
- SYSCTL_DESCR("Maximum allowed input queue length"),
- maxlen_func, 0, NULL, 0,
- CTL_NET, pf, ipn, qid, IFQCTL_MAXLEN, CTL_EOL);
- sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_QUAD, "drops",
- SYSCTL_DESCR("Packets dropped due to full input queue"),
- drops_func, 0, NULL, 0,
- CTL_NET, pf, ipn, qid, IFQCTL_DROPS, CTL_EOL);
-}
-#endif /* INET || INET6 */
-
static int
if_sdl_sysctl(SYSCTLFN_ARGS)
{
@@ -4242,12 +4141,4 @@ if_sysctl_setup(struct sysctllog **clog)
SYSCTL_DESCR("Get active link-layer address"),
if_sdl_sysctl, 0, NULL, 0,
CTL_NET, CTL_CREATE, CTL_EOL);
-
-#if defined(INET)
- sysctl_net_pktq_setup(NULL, PF_INET);
-#endif
-#ifdef INET6
- if (in6_present)
- sysctl_net_pktq_setup(NULL, PF_INET6);
-#endif
}
Index: src/sys/net/pktqueue.c
diff -u src/sys/net/pktqueue.c:1.18 src/sys/net/pktqueue.c:1.19
--- src/sys/net/pktqueue.c:1.18 Thu Sep 1 05:04:22 2022
+++ src/sys/net/pktqueue.c Fri Sep 2 03:50:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: pktqueue.c,v 1.18 2022/09/01 05:04:22 thorpej Exp $ */
+/* $NetBSD: pktqueue.c,v 1.19 2022/09/02 03:50:00 thorpej Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pktqueue.c,v 1.18 2022/09/01 05:04:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pktqueue.c,v 1.19 2022/09/02 03:50:00 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_net_mpsafe.h"
@@ -201,7 +201,7 @@ pktq_collect_counts(void *mem, void *arg
splx(s);
}
-uint64_t
+static uint64_t
pktq_get_count(pktqueue_t *pq, pktq_count_t c)
{
pktq_counters_t sum;
@@ -585,11 +585,12 @@ pktq_set_maxlen(pktqueue_t *pq, size_t m
return 0;
}
-int
-sysctl_pktq_maxlen(SYSCTLFN_ARGS, pktqueue_t *pq)
+static int
+sysctl_pktq_maxlen(SYSCTLFN_ARGS)
{
- u_int nmaxlen = pktq_get_count(pq, PKTQ_MAXLEN);
struct sysctlnode node = *rnode;
+ pktqueue_t * const pq = node.sysctl_data;
+ u_int nmaxlen = pktq_get_count(pq, PKTQ_MAXLEN);
int error;
node.sysctl_data = &nmaxlen;
@@ -599,12 +600,71 @@ sysctl_pktq_maxlen(SYSCTLFN_ARGS, pktque
return pktq_set_maxlen(pq, nmaxlen);
}
-int
-sysctl_pktq_count(SYSCTLFN_ARGS, pktqueue_t *pq, u_int count_id)
+static int
+sysctl_pktq_count(SYSCTLFN_ARGS, u_int count_id)
{
- uint64_t count = pktq_get_count(pq, count_id);
struct sysctlnode node = *rnode;
+ pktqueue_t * const pq = node.sysctl_data;
+ uint64_t count = pktq_get_count(pq, count_id);
node.sysctl_data = &count;
return sysctl_lookup(SYSCTLFN_CALL(&node));
}
+
+static int
+sysctl_pktq_nitems(SYSCTLFN_ARGS)
+{
+ return sysctl_pktq_count(SYSCTLFN_CALL(rnode), PKTQ_NITEMS);
+}
+
+static int
+sysctl_pktq_drops(SYSCTLFN_ARGS)
+{
+ return sysctl_pktq_count(SYSCTLFN_CALL(rnode), PKTQ_DROPS);
+}
+
+/*
+ * pktqueue_sysctl_setup: set up the sysctl nodes for a pktqueue
+ * using standardized names at the specified parent node and
+ * node ID (or CTL_CREATE).
+ */
+void
+pktq_sysctl_setup(pktqueue_t * const pq, struct sysctllog ** const clog,
+ const struct sysctlnode * const parent_node, const int qid)
+{
+ const struct sysctlnode *rnode = parent_node, *cnode;
+
+ KASSERT(pq != NULL);
+ KASSERT(parent_node != NULL);
+ KASSERT(qid == CTL_CREATE || qid >= 0);
+
+ /* Create the "ifq" node below the parent node. */
+ sysctl_createv(clog, 0, &rnode, &cnode,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_NODE, "ifq",
+ SYSCTL_DESCR("Protocol input queue controls"),
+ NULL, 0, NULL, 0,
+ qid, CTL_EOL);
+
+ /* Now create the standard child nodes below "ifq". */
+ rnode = cnode;
+
+ sysctl_createv(clog, 0, &rnode, &cnode,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_QUAD, "len",
+ SYSCTL_DESCR("Current input queue length"),
+ sysctl_pktq_nitems, 0, (void *)pq, 0,
+ IFQCTL_LEN, CTL_EOL);
+ sysctl_createv(clog, 0, &rnode, &cnode,
+ CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
+ CTLTYPE_INT, "maxlen",
+ SYSCTL_DESCR("Maximum allowed input queue length"),
+ sysctl_pktq_maxlen, 0, (void *)pq, 0,
+ IFQCTL_MAXLEN, CTL_EOL);
+ sysctl_createv(clog, 0, &rnode, &cnode,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_QUAD, "drops",
+ SYSCTL_DESCR("Packets dropped due to full input queue"),
+ sysctl_pktq_drops, 0, (void *)pq, 0,
+ IFQCTL_DROPS, CTL_EOL);
+}
Index: src/sys/net/pktqueue.h
diff -u src/sys/net/pktqueue.h:1.6 src/sys/net/pktqueue.h:1.7
--- src/sys/net/pktqueue.h:1.6 Thu Sep 1 05:04:22 2022
+++ src/sys/net/pktqueue.h Fri Sep 2 03:50:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: pktqueue.h,v 1.6 2022/09/01 05:04:22 thorpej Exp $ */
+/* $NetBSD: pktqueue.h,v 1.7 2022/09/02 03:50:00 thorpej Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -60,11 +60,9 @@ uint32_t pktq_rps_hash(const pktq_rps_ha
const struct mbuf *);
extern const pktq_rps_hash_func_t pktq_rps_hash_default;
-uint64_t pktq_get_count(pktqueue_t *, pktq_count_t);
+void pktq_sysctl_setup(pktqueue_t *, struct sysctllog **,
+ const struct sysctlnode *, const int);
int sysctl_pktq_rps_hash_handler(SYSCTLFN_PROTO);
-int sysctl_pktq_maxlen(SYSCTLFN_PROTO, pktqueue_t *);
-int sysctl_pktq_count(SYSCTLFN_PROTO, pktqueue_t *, u_int);
-
#endif
Index: src/sys/netinet/ip_input.c
diff -u src/sys/netinet/ip_input.c:1.401 src/sys/netinet/ip_input.c:1.402
--- src/sys/netinet/ip_input.c:1.401 Mon Mar 8 18:03:25 2021
+++ src/sys/netinet/ip_input.c Fri Sep 2 03:50:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_input.c,v 1.401 2021/03/08 18:03:25 christos Exp $ */
+/* $NetBSD: ip_input.c,v 1.402 2022/09/02 03:50:00 thorpej Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.401 2021/03/08 18:03:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.402 2022/09/02 03:50:00 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -270,15 +270,15 @@ ip_init(void)
{
const struct protosw *pr;
+ ip_pktq = pktq_create(IFQ_MAXLEN, ipintr, NULL);
+ KASSERT(ip_pktq != NULL);
+
in_init();
sysctl_net_inet_ip_setup(NULL);
pr = pffindproto(PF_INET, IPPROTO_RAW, SOCK_RAW);
KASSERT(pr != NULL);
- ip_pktq = pktq_create(IFQ_MAXLEN, ipintr, NULL);
- KASSERT(ip_pktq != NULL);
-
for (u_int i = 0; i < IPPROTO_MAX; i++) {
ip_protox[i] = pr - inetsw;
}
@@ -1616,13 +1616,15 @@ sysctl_net_inet_ip_stats(SYSCTLFN_ARGS)
static void
sysctl_net_inet_ip_setup(struct sysctllog **clog)
{
+ const struct sysctlnode *ip_node;
+
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT,
CTLTYPE_NODE, "inet",
SYSCTL_DESCR("PF_INET related settings"),
NULL, 0, NULL, 0,
CTL_NET, PF_INET, CTL_EOL);
- sysctl_createv(clog, 0, NULL, NULL,
+ sysctl_createv(clog, 0, NULL, &ip_node,
CTLFLAG_PERMANENT,
CTLTYPE_NODE, "ip",
SYSCTL_DESCR("IPv4 related settings"),
@@ -1736,6 +1738,9 @@ sysctl_net_inet_ip_setup(struct sysctllo
NULL, 0, &ip_checkinterface, 0,
CTL_NET, PF_INET, IPPROTO_IP,
IPCTL_CHECKINTERFACE, CTL_EOL);
+
+ pktq_sysctl_setup(ip_pktq, clog, ip_node, IPCTL_IFQ);
+
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
CTLTYPE_INT, "random_id",
Index: src/sys/netinet6/ip6_input.c
diff -u src/sys/netinet6/ip6_input.c:1.224 src/sys/netinet6/ip6_input.c:1.225
--- src/sys/netinet6/ip6_input.c:1.224 Fri Feb 19 14:52:00 2021
+++ src/sys/netinet6/ip6_input.c Fri Sep 2 03:50:00 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ip6_input.c,v 1.224 2021/02/19 14:52:00 christos Exp $ */
+/* $NetBSD: ip6_input.c,v 1.225 2022/09/02 03:50:00 thorpej Exp $ */
/* $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.224 2021/02/19 14:52:00 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.225 2022/09/02 03:50:00 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_gateway.h"
@@ -182,6 +182,9 @@ ip6_init(void)
in6_init();
+ ip6_pktq = pktq_create(IFQ_MAXLEN, ip6intr, NULL);
+ KASSERT(ip6_pktq != NULL);
+
sysctl_net_inet6_ip6_setup(NULL);
pr = (const struct ip6protosw *)pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW);
if (pr == 0)
@@ -194,9 +197,6 @@ ip6_init(void)
pr->pr_protocol && pr->pr_protocol != IPPROTO_RAW)
ip6_protox[pr->pr_protocol] = pr - inet6sw;
- ip6_pktq = pktq_create(IFQ_MAXLEN, ip6intr, NULL);
- KASSERT(ip6_pktq != NULL);
-
scope6_init();
addrsel_policy_init();
nd6_init();
@@ -1559,6 +1559,7 @@ sysctl_net_inet6_ip6_stats(SYSCTLFN_ARGS
static void
sysctl_net_inet6_ip6_setup(struct sysctllog **clog)
{
+ const struct sysctlnode *ip6_node;
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT,
@@ -1566,7 +1567,7 @@ sysctl_net_inet6_ip6_setup(struct sysctl
SYSCTL_DESCR("PF_INET6 related settings"),
NULL, 0, NULL, 0,
CTL_NET, PF_INET6, CTL_EOL);
- sysctl_createv(clog, 0, NULL, NULL,
+ sysctl_createv(clog, 0, NULL, &ip6_node,
CTLFLAG_PERMANENT,
CTLTYPE_NODE, "ip6",
SYSCTL_DESCR("IPv6 related settings"),
@@ -1602,6 +1603,9 @@ sysctl_net_inet6_ip6_setup(struct sysctl
NULL, 0, &ip6_maxfragpackets, 0,
CTL_NET, PF_INET6, IPPROTO_IPV6,
IPV6CTL_MAXFRAGPACKETS, CTL_EOL);
+
+ pktq_sysctl_setup(ip6_pktq, clog, ip6_node, IPV6CTL_IFQ);
+
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
CTLTYPE_INT, "keepfaith",