From: Alexander Bluhm Subject: common divert netstat counters To: tech@openbsd.org Date: Thu, 19 Jun 2025 19:14:40 +0200 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 #include -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 #include -#include #include @@ -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 #include #include -#include #include #include #include -#include #include #include @@ -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);