There are some places in ip and ip6 input where operations fail due
authorbluhm <bluhm@openbsd.org>
Fri, 12 Aug 2022 14:49:15 +0000 (14:49 +0000)
committerbluhm <bluhm@openbsd.org>
Fri, 12 Aug 2022 14:49:15 +0000 (14:49 +0000)
to out of memory.  Use a generic idropped counter for those.
OK mvs@

sys/netinet/ip_input.c
sys/netinet/ip_var.h
sys/netinet6/ip6_input.c
sys/netinet6/ip6_var.h
usr.bin/netstat/inet.c
usr.bin/netstat/inet6.c

index adab687..4ff6882 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip_input.c,v 1.377 2022/08/06 15:57:59 bluhm Exp $    */
+/*     $OpenBSD: ip_input.c,v 1.378 2022/08/12 14:49:15 bluhm Exp $    */
 /*     $NetBSD: ip_input.c,v 1.30 1996/03/16 23:53:58 christos Exp $   */
 
 /*
@@ -1372,8 +1372,10 @@ save_rte(struct mbuf *m, u_char *option, struct in_addr dst)
                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 2eb8c6f..43e0799 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip_var.h,v 1.95 2022/08/04 18:05:09 bluhm Exp $       */
+/*     $OpenBSD: ip_var.h,v 1.96 2022/08/12 14:49:15 bluhm Exp $       */
 /*     $NetBSD: ip_var.h,v 1.16 1996/02/13 23:43:20 christos Exp $     */
 
 /*
@@ -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 d71441d..045fb00 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip6_input.c,v 1.251 2022/08/12 12:08:54 bluhm Exp $   */
+/*     $OpenBSD: ip6_input.c,v 1.252 2022/08/12 14:49:15 bluhm Exp $   */
 /*     $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $     */
 
 /*
@@ -1219,8 +1219,10 @@ ip6_pullexthdr(struct mbuf *m, size_t off, int nxt)
                        n = NULL;
                }
        }
-       if (!n)
+       if (n == NULL) {
+               ip6stat_inc(ip6s_idropped);
                return NULL;
+       }
 
        n->m_len = 0;
        if (elen >= m_trailingspace(n)) {
index 9ea94ff..021f7f0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ip6_var.h,v 1.93 2022/06/29 22:45:24 bluhm Exp $      */
+/*     $OpenBSD: ip6_var.h,v 1.94 2022/08/12 14:49:15 bluhm Exp $      */
 /*     $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $        */
 
 /*
@@ -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 98994cb..2157946 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: inet.c,v 1.173 2021/12/05 22:36:19 deraadt Exp $      */
+/*     $OpenBSD: inet.c,v 1.174 2022/08/12 14:49:15 bluhm Exp $        */
 /*     $NetBSD: inet.c,v 1.14 1995/10/03 21:42:37 thorpej Exp $        */
 
 /*
@@ -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 6f307e6..38d6398 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: inet6.c,v 1.55 2021/01/26 18:22:35 deraadt Exp $      */
+/*     $OpenBSD: inet6.c,v 1.56 2022/08/12 14:49:15 bluhm Exp $        */
 /*     BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp   */
 /*
  * Copyright (c) 1983, 1988, 1993
@@ -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
 }