Download raw body.
common divert netstat counters
On Thu, Jun 19, 2025 at 07:14:40PM +0200, Alexander Bluhm wrote:
> 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
>
reads ok by me.
> 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