Download raw body.
common divert netstat counters
Hi,
TCP and UDP share counters for IPv4 an IPv6. Divert has duplicated
code for inet6. Is anybody interested in seprarate counters?
Otherwise count both address families in a common struct.
ok
bluhm
Index: sys/netinet6/in6_proto.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6_proto.c,v
diff -u -p -r1.129 in6_proto.c
--- sys/netinet6/in6_proto.c 16 Jun 2025 07:11:58 -0000 1.129
+++ sys/netinet6/in6_proto.c 18 Jun 2025 20:34:10 -0000
@@ -302,7 +302,6 @@ const struct protosw inet6sw[] = {
.pr_ctloutput = rip6_ctloutput,
.pr_usrreqs = &divert6_usrreqs,
.pr_init = divert6_init,
- .pr_sysctl = divert6_sysctl
},
#endif /* NPF > 0 */
#if NETHERIP > 0
Index: sys/netinet6/ip6_divert.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_divert.c,v
diff -u -p -r1.105 ip6_divert.c
--- sys/netinet6/ip6_divert.c 18 Jun 2025 17:45:07 -0000 1.105
+++ sys/netinet6/ip6_divert.c 18 Jun 2025 20:34:10 -0000
@@ -91,7 +91,7 @@ divert6_output(struct inpcb *inp, struct
goto fail;
if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
/* m_pullup() has freed the mbuf, so just return. */
- div6stat_inc(divs_errors);
+ divstat_inc(divs_errors);
return (ENOBUFS);
}
ip6 = mtod(m, struct ip6_hdr *);
@@ -166,11 +166,11 @@ divert6_output(struct inpcb *inp, struct
IP_ALLOWBROADCAST | IP_RAWOUTPUT, NULL, NULL);
}
- div6stat_inc(divs_opackets);
+ divstat_inc(divs_opackets);
return (error);
fail:
- div6stat_inc(divs_errors);
+ divstat_inc(divs_errors);
m_freem(m);
return (error ? error : EINVAL);
}
@@ -182,11 +182,11 @@ divert6_packet(struct mbuf *m, int dir,
struct socket *so;
struct sockaddr_in6 sin6;
- div6stat_inc(divs_ipackets);
+ divstat_inc(divs_ipackets);
if (m->m_len < sizeof(struct ip6_hdr) &&
(m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
- div6stat_inc(divs_errors);
+ divstat_inc(divs_errors);
goto bad;
}
@@ -199,7 +199,7 @@ divert6_packet(struct mbuf *m, int dir,
}
mtx_leave(&divb6table.inpt_mtx);
if (inp == NULL) {
- div6stat_inc(divs_noport);
+ divstat_inc(divs_noport);
goto bad;
}
@@ -213,7 +213,7 @@ divert6_packet(struct mbuf *m, int dir,
ifp = if_get(m->m_pkthdr.ph_ifidx);
if (ifp == NULL) {
- div6stat_inc(divs_errors);
+ divstat_inc(divs_errors);
goto bad;
}
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
@@ -235,7 +235,7 @@ divert6_packet(struct mbuf *m, int dir,
mtx_enter(&so->so_rcv.sb_mtx);
if (sbappendaddr(&so->so_rcv, sin6tosa(&sin6), m, NULL) == 0) {
mtx_leave(&so->so_rcv.sb_mtx);
- div6stat_inc(divs_fullsock);
+ divstat_inc(divs_fullsock);
goto bad;
}
mtx_leave(&so->so_rcv.sb_mtx);
@@ -278,25 +278,4 @@ divert6_send(struct socket *so, struct m
soassertlocked(so);
return (divert6_output(inp, m, addr, control));
-}
-
-/*
- * Sysctl for divert variables.
- */
-int
-divert6_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
- void *newp, size_t newlen)
-{
- /* All sysctl names at this level are terminal. */
- if (namelen != 1)
- return (ENOTDIR);
-
- switch (name[0]) {
- case DIVERT6CTL_STATS:
- return (divert_sysctl_divstat(div6counters, oldp, oldlenp,
- newp));
- default:
- return (EOPNOTSUPP);
- }
- /* NOTREACHED */
}
Index: sys/netinet6/ip6_divert.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_divert.h,v
diff -u -p -r1.25 ip6_divert.h
--- sys/netinet6/ip6_divert.h 18 Jun 2025 17:45:07 -0000 1.25
+++ sys/netinet6/ip6_divert.h 18 Jun 2025 20:37:48 -0000
@@ -31,7 +31,7 @@
{ 0, 0 }, \
{ NULL, 0 }, \
{ NULL, 0 }, \
- { "stats", CTLTYPE_STRUCT } \
+ { NULL, 0 } \
}
#ifdef _KERNEL
@@ -39,21 +39,12 @@
#include <sys/percpu.h>
#include <netinet/ip_divert.h>
-extern struct cpumem *div6counters;
-
-static inline void
-div6stat_inc(enum divstat_counters c)
-{
- counters_inc(div6counters, c);
-}
-
extern struct inpcbtable divb6table;
extern const struct pr_usrreqs divert6_usrreqs;
void divert6_init(void);
void divert6_packet(struct mbuf *, int, u_int16_t);
-int divert6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
int divert6_attach(struct socket *, int, int);
int divert6_send(struct socket *, struct mbuf *, struct mbuf *,
struct mbuf *);
Index: sbin/sysctl/sysctl.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sbin/sysctl/sysctl.c,v
diff -u -p -r1.266 sysctl.c
--- sbin/sysctl/sysctl.c 3 Jun 2025 09:57:57 -0000 1.266
+++ sbin/sysctl/sysctl.c 18 Jun 2025 20:59:30 -0000
@@ -75,7 +75,6 @@
#include <netinet/ip6.h>
#include <netinet/icmp6.h>
-#include <netinet6/ip6_divert.h>
#include <netmpls/mpls.h>
@@ -699,8 +698,7 @@ parse(char *string, int flags)
special |= HEX;
if ((mib[2] == IPPROTO_IPV6 && mib[3] == IPV6CTL_MRTMFC) ||
- (mib[2] == IPPROTO_IPV6 && mib[3] == IPV6CTL_MRTMIF) ||
- (mib[2] == IPPROTO_DIVERT && mib[3] == DIVERT6CTL_STATS)) {
+ (mib[2] == IPPROTO_IPV6 && mib[3] == IPV6CTL_MRTMIF)) {
if (flags == 0)
return;
warnx("use netstat to view %s information",
@@ -2169,7 +2167,6 @@ sysctl_inet(char *string, char **bufpp,
struct ctlname inet6name[] = CTL_IPV6PROTO_NAMES;
struct ctlname ip6name[] = IPV6CTL_NAMES;
struct ctlname icmp6name[] = ICMPV6CTL_NAMES;
-struct ctlname divert6name[] = DIVERT6CTL_NAMES;
struct list inet6list = { inet6name, IPV6PROTO_MAXID };
struct list inet6vars[] = {
/*0*/ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
@@ -2250,7 +2247,7 @@ struct list inet6vars[] = {
{ 0, 0 },
{ 0, 0 },
{ 0, 0 },
- { divert6name, DIVERT6CTL_MAXID },
+ { 0, 0 },
};
/*
Index: usr.bin/netstat/inet6.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/inet6.c,v
diff -u -p -r1.58 inet6.c
--- usr.bin/netstat/inet6.c 4 Jun 2025 12:37:00 -0000 1.58
+++ usr.bin/netstat/inet6.c 18 Jun 2025 21:16:44 -0000
@@ -43,11 +43,9 @@
#include <netinet/icmp6.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
-#include <netinet/ip_divert.h>
#include <netinet6/ip6_var.h>
#include <netinet6/in6_var.h>
#include <netinet6/raw_ip6.h>
-#include <netinet6/ip6_divert.h>
#include <arpa/inet.h>
#include <netdb.h>
@@ -863,37 +861,6 @@ rip6_stats(char *name)
printf("\t%llu delivered\n", (unsigned long long)delivered);
p(rip6s_opackets, "\t%llu datagram%s output\n");
#undef p
-}
-
-/*
- * Dump divert6 statistics structure.
- */
-void
-div6_stats(char *name)
-{
- struct divstat div6stat;
- int mib[] = { CTL_NET, PF_INET6, IPPROTO_DIVERT, DIVERT6CTL_STATS };
- size_t len = sizeof(div6stat);
-
- if (sysctl(mib, sizeof(mib) / sizeof(mib[0]),
- &div6stat, &len, NULL, 0) == -1) {
- if (errno != ENOPROTOOPT)
- warn("%s", name);
- return;
- }
-
- printf("%s:\n", name);
-#define p(f, m) if (div6stat.f || sflag <= 1) \
- printf(m, div6stat.f, plural(div6stat.f))
-#define p1(f, m) if (div6stat.f || sflag <= 1) \
- printf(m, div6stat.f)
- p(divs_ipackets, "\t%lu total packet%s received\n");
- p1(divs_noport, "\t%lu dropped due to no socket\n");
- p1(divs_fullsock, "\t%lu dropped due to full socket buffers\n");
- p(divs_opackets, "\t%lu packet%s output\n");
- p1(divs_errors, "\t%lu errors\n");
-#undef p
-#undef p1
}
/*
Index: usr.bin/netstat/main.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/main.c,v
diff -u -p -r1.124 main.c
--- usr.bin/netstat/main.c 23 Dec 2022 07:18:46 -0000 1.124
+++ usr.bin/netstat/main.c 18 Jun 2025 20:49:23 -0000
@@ -89,7 +89,6 @@ struct protox {
struct protox ip6protox[] = {
{ ip6_stats, "ip6", IPPROTO_IPV6 },
- { div6_stats, "divert6", IPPROTO_DIVERT },
{ icmp6_stats, "icmp6", 0 },
{ rip6_stats, "rip6", 0 },
{ NULL, NULL, 0 }
Index: usr.bin/netstat/netstat.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/netstat.h,v
diff -u -p -r1.78 netstat.h
--- usr.bin/netstat/netstat.h 18 May 2024 07:10:16 -0000 1.78
+++ usr.bin/netstat/netstat.h 18 Jun 2025 20:49:39 -0000
@@ -112,7 +112,6 @@ void rdomainpr(void);
void ip6_stats(char *);
void icmp6_stats(char *);
-void div6_stats(char *);
void rip6_stats(char *);
void mroute6pr(void);
void mrt6_stats(void);
common divert netstat counters