Hi, There are some places in ip and ip6 input where operations fail due to out of memory. I think a generic idropped counter is useful for those.
ok? bluhm Index: sys/netinet/ip_input.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_input.c,v retrieving revision 1.377 diff -u -p -r1.377 ip_input.c --- sys/netinet/ip_input.c 6 Aug 2022 15:57:59 -0000 1.377 +++ sys/netinet/ip_input.c 11 Aug 2022 16:14:03 -0000 @@ -1372,8 +1372,10 @@ save_rte(struct mbuf *m, u_char *option, return; mtag = m_tag_get(PACKET_TAG_SRCROUTE, sizeof(*isr), M_NOWAIT); - if (mtag == NULL) + if (mtag == NULL) { + ipstat_inc(ips_idropped); return; + } isr = (struct ip_srcrt *)(mtag + 1); memcpy(isr->isr_hdr, option, olen); @@ -1406,8 +1408,10 @@ ip_srcroute(struct mbuf *m0) if (isr->isr_nhops == 0) return (NULL); m = m_get(M_DONTWAIT, MT_SOOPTS); - if (m == NULL) + if (m == NULL) { + ipstat_inc(ips_idropped); return (NULL); + } #define OPTSIZ (sizeof(isr->isr_nop) + sizeof(isr->isr_hdr)) Index: sys/netinet/ip_var.h =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_var.h,v retrieving revision 1.95 diff -u -p -r1.95 ip_var.h --- sys/netinet/ip_var.h 4 Aug 2022 18:05:09 -0000 1.95 +++ sys/netinet/ip_var.h 11 Aug 2022 17:31:19 -0000 @@ -70,7 +70,7 @@ struct ipstat { u_long ips_noproto; /* unknown or unsupported protocol */ u_long ips_delivered; /* datagrams delivered to upper level*/ u_long ips_localout; /* total ip packets generated here */ - u_long ips_odropped; /* lost packets due to nobufs, etc. */ + u_long ips_odropped; /* lost output due to nobufs, etc. */ u_long ips_reassembled; /* total packets reassembled ok */ u_long ips_fragmented; /* datagrams successfully fragmented */ u_long ips_ofragments; /* output fragments created */ @@ -88,6 +88,7 @@ struct ipstat { u_long ips_outswcsum; /* software checksummed on output */ u_long ips_notmember; /* multicasts for unregistered groups */ u_long ips_wrongif; /* packet received on wrong interface */ + u_long ips_idropped; /* lost input due to nobufs, etc. */ }; struct ipoption { @@ -115,7 +116,7 @@ enum ipstat_counters { ips_noproto, /* unknown or unsupported protocol */ ips_delivered, /* datagrams delivered to upper level*/ ips_localout, /* total ip packets generated here */ - ips_odropped, /* lost packets due to nobufs, etc. */ + ips_odropped, /* lost output packets due to nobufs, etc. */ ips_reassembled, /* total packets reassembled ok */ ips_fragmented, /* datagrams successfully fragmented */ ips_ofragments, /* output fragments created */ @@ -133,6 +134,7 @@ enum ipstat_counters { ips_outswcsum, /* software checksummed on output */ ips_notmember, /* multicasts for unregistered groups */ ips_wrongif, /* packet received on wrong interface */ + ips_idropped, /* lost input packets due to nobufs, etc. */ ips_ncounters }; Index: sys/netinet6/ip6_input.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_input.c,v retrieving revision 1.250 diff -u -p -r1.250 ip6_input.c --- sys/netinet6/ip6_input.c 6 Aug 2022 15:57:59 -0000 1.250 +++ sys/netinet6/ip6_input.c 11 Aug 2022 16:17:30 -0000 @@ -1217,8 +1217,10 @@ ip6_pullexthdr(struct mbuf *m, size_t of n = NULL; } } - if (!n) + if (n == NULL) { + ip6stat_inc(ip6s_idropped); return NULL; + } n->m_len = 0; if (elen >= m_trailingspace(n)) { Index: sys/netinet6/ip6_var.h =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_var.h,v retrieving revision 1.93 diff -u -p -r1.93 ip6_var.h --- sys/netinet6/ip6_var.h 29 Jun 2022 22:45:24 -0000 1.93 +++ sys/netinet6/ip6_var.h 11 Aug 2022 17:31:01 -0000 @@ -153,7 +153,7 @@ struct ip6stat { u_int64_t ip6s_redirectsent; /* packets forwarded on same net */ u_int64_t ip6s_delivered; /* datagrams delivered to upper level*/ u_int64_t ip6s_localout; /* total ip packets generated here */ - u_int64_t ip6s_odropped; /* lost packets due to nobufs, etc. */ + u_int64_t ip6s_odropped; /* lost output due to nobufs, etc. */ u_int64_t ip6s_reassembled; /* total packets reassembled ok */ u_int64_t ip6s_fragmented; /* datagrams successfully fragmented */ u_int64_t ip6s_ofragments; /* output fragments created */ @@ -198,7 +198,8 @@ struct ip6stat { u_int64_t ip6s_forward_cachehit; u_int64_t ip6s_forward_cachemiss; - u_int64_t ip6s_wrongif; + u_int64_t ip6s_wrongif; /* packet received on wrong interface */ + u_int64_t ip6s_idropped; /* lost input due to nobufs, etc. */ }; #ifdef _KERNEL @@ -245,6 +246,8 @@ enum ip6stat_counters { ip6s_forward_cachehit = ip6s_sources_deprecated + 16, ip6s_forward_cachemiss, ip6s_wrongif, + ip6s_idropped, + ip6s_ncounters, }; Index: usr.bin/netstat/inet.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/inet.c,v retrieving revision 1.173 diff -u -p -r1.173 inet.c --- usr.bin/netstat/inet.c 5 Dec 2021 22:36:19 -0000 1.173 +++ usr.bin/netstat/inet.c 11 Aug 2022 16:29:17 -0000 @@ -612,6 +612,7 @@ ip_stats(char *name) p(ips_outswcsum, "\t%lu output datagram%s software-checksummed\n"); p(ips_notmember, "\t%lu multicast packet%s which we don't join\n"); p(ips_wrongif, "\t%lu packet%s received on wrong interface\n"); + p(ips_idropped, "\t%lu input packet%s dropped due to no bufs, etc.\n"); #undef p #undef p1 } Index: usr.bin/netstat/inet6.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/inet6.c,v retrieving revision 1.55 diff -u -p -r1.55 inet6.c --- usr.bin/netstat/inet6.c 26 Jan 2021 18:22:35 -0000 1.55 +++ usr.bin/netstat/inet6.c 11 Aug 2022 16:29:17 -0000 @@ -481,6 +481,8 @@ ip6_stats(char *name) p1(ip6s_forward_cachehit, "\t%llu forward cache hit\n"); p1(ip6s_forward_cachemiss, "\t%llu forward cache miss\n"); + p(ip6s_idropped, + "\t%llu input packet%s dropped due to no bufs, etc.\n"); #undef p #undef p1 }