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",

Reply via email to