Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/netinet6 inet6: reduce silent packet discards



details:   https://anonhg.NetBSD.org/src/rev/b410374a69ac
branches:  trunk
changeset: 975381:b410374a69ac
user:      ozaki-r <ozaki-r%NetBSD.org@localhost>
date:      Fri Aug 28 06:32:24 2020 +0000

description:
inet6: reduce silent packet discards

diffstat:

 sys/netinet6/in6_src.c     |   5 +++--
 sys/netinet6/ip6_forward.c |   5 +++--
 sys/netinet6/ip6_input.c   |  19 +++++++++++++------
 sys/netinet6/ip6_output.c  |  29 ++++++++++++++++++++++-------
 sys/netinet6/ip6_var.h     |   9 +++++++--
 5 files changed, 48 insertions(+), 19 deletions(-)

diffs (truncated from 302 to 300 lines):

diff -r 1f973ab297e9 -r b410374a69ac sys/netinet6/in6_src.c
--- a/sys/netinet6/in6_src.c    Fri Aug 28 06:31:42 2020 +0000
+++ b/sys/netinet6/in6_src.c    Fri Aug 28 06:32:24 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in6_src.c,v 1.86 2019/11/13 02:51:22 ozaki-r Exp $     */
+/*     $NetBSD: in6_src.c,v 1.87 2020/08/28 06:32:24 ozaki-r Exp $     */
 /*     $KAME: in6_src.c,v 1.159 2005/10/19 01:40:32 t-momose Exp $     */
 
 /*
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.86 2019/11/13 02:51:22 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.87 2020/08/28 06:32:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -646,6 +646,7 @@
 
                /* at this moment, we only support AF_INET6 next hops */
                if (sin6_next->sin6_family != AF_INET6) {
+                       IP6_STATINC(IP6_STAT_ODROPPED);
                        error = EAFNOSUPPORT; /* or should we proceed? */
                        goto done;
                }
diff -r 1f973ab297e9 -r b410374a69ac sys/netinet6/ip6_forward.c
--- a/sys/netinet6/ip6_forward.c        Fri Aug 28 06:31:42 2020 +0000
+++ b/sys/netinet6/ip6_forward.c        Fri Aug 28 06:32:24 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip6_forward.c,v 1.101 2020/08/28 06:28:58 ozaki-r Exp $        */
+/*     $NetBSD: ip6_forward.c,v 1.102 2020/08/28 06:32:24 ozaki-r Exp $        */
 /*     $KAME: ip6_forward.c,v 1.109 2002/09/11 08:10:17 sakane Exp $   */
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.101 2020/08/28 06:28:58 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.102 2020/08/28 06:32:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_gateway.h"
@@ -287,6 +287,7 @@
        }
 
        if (m->m_pkthdr.len > rt->rt_ifp->if_mtu) {
+               IP6_STATINC(IP6_STAT_TOOBIG);
                in6_ifstat_inc(rt->rt_ifp, ifs6_in_toobig);
                if (mcopy)
                        icmp6_error(mcopy, ICMP6_PACKET_TOO_BIG, 0,
diff -r 1f973ab297e9 -r b410374a69ac sys/netinet6/ip6_input.c
--- a/sys/netinet6/ip6_input.c  Fri Aug 28 06:31:42 2020 +0000
+++ b/sys/netinet6/ip6_input.c  Fri Aug 28 06:32:24 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip6_input.c,v 1.221 2020/08/28 06:28:58 ozaki-r Exp $  */
+/*     $NetBSD: ip6_input.c,v 1.222 2020/08/28 06:32:24 ozaki-r Exp $  */
 /*     $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $     */
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.221 2020/08/28 06:28:58 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.222 2020/08/28 06:32:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_gateway.h"
@@ -227,6 +227,7 @@
                struct ifnet *rcvif = m_get_rcvif_psref(m, &psref);
 
                if (rcvif == NULL) {
+                       IP6_STATINC(IP6_STAT_IFDROP);
                        m_freem(m);
                        continue;
                }
@@ -235,6 +236,7 @@
                 */
                if ((ND_IFINFO(rcvif)->flags & ND6_IFF_IFDISABLED)) {
                        m_put_rcvif_psref(rcvif, &psref);
+                       IP6_STATINC(IP6_STAT_IFDROP);
                        m_freem(m);
                        continue;
                }
@@ -396,8 +398,10 @@
         * is not loopback.
         */
        if (__predict_false(
-           m_makewritable(&m, 0, sizeof(struct ip6_hdr), M_DONTWAIT)))
+           m_makewritable(&m, 0, sizeof(struct ip6_hdr), M_DONTWAIT))) {
+               IP6_STATINC(IP6_STAT_IDROPPED);
                goto bad;
+       }
        ip6 = mtod(m, struct ip6_hdr *);
        if (in6_clearscope(&ip6->ip6_src) || in6_clearscope(&ip6->ip6_dst)) {
                IP6_STATINC(IP6_STAT_BADSCOPE); /* XXX */
@@ -505,6 +509,7 @@
                            IN6_PRINT(ip6bufs, &ip6->ip6_src),
                            IN6_PRINT(ip6bufd, &ip6->ip6_dst));
 
+                       IP6_STATINC(IP6_STAT_IDROPPED);
                        goto bad_unref;
                }
        }
@@ -662,8 +667,10 @@
                                goto bad;
                        }
                }
-               if (!ours)
+               if (!ours) {
+                       IP6_STATINC(IP6_STAT_CANTFORWARD);
                        goto bad_unref;
+               }
        } else if (!ours) {
                rtcache_unref(rt, ro);
                rtcache_percpu_putref(ip6_forward_rt_percpu);
@@ -930,7 +937,7 @@
                                goto bad;
                        }
                        if (*(opt + 1) != IP6OPT_RTALERT_LEN - 2) {
-                               /* XXX stat */
+                               IP6_STATINC(IP6_STAT_BADOPTIONS);
                                icmp6_error(m, ICMP6_PARAM_PROB,
                                    ICMP6_PARAMPROB_HEADER,
                                    erroff + opt + 1 - opthead);
@@ -947,7 +954,7 @@
                                goto bad;
                        }
                        if (*(opt + 1) != IP6OPT_JUMBO_LEN - 2) {
-                               /* XXX stat */
+                               IP6_STATINC(IP6_STAT_BADOPTIONS);
                                icmp6_error(m, ICMP6_PARAM_PROB,
                                    ICMP6_PARAMPROB_HEADER,
                                    erroff + opt + 1 - opthead);
diff -r 1f973ab297e9 -r b410374a69ac sys/netinet6/ip6_output.c
--- a/sys/netinet6/ip6_output.c Fri Aug 28 06:31:42 2020 +0000
+++ b/sys/netinet6/ip6_output.c Fri Aug 28 06:32:24 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip6_output.c,v 1.224 2020/08/28 06:19:13 ozaki-r Exp $ */
+/*     $NetBSD: ip6_output.c,v 1.225 2020/08/28 06:32:24 ozaki-r Exp $ */
 /*     $KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $    */
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.224 2020/08/28 06:19:13 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.225 2020/08/28 06:32:24 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -165,6 +165,7 @@
        if (rt != NULL) {
                error = rt_check_reject_route(rt, ifp);
                if (error != 0) {
+                       IP6_STATINC(IP6_STAT_RTREJECT);
                        m_freem(m);
                        return error;
                }
@@ -313,6 +314,7 @@
         */
        if ((needipsec || optlen) && !hdrsplit) {
                if ((error = ip6_splithdr(m, &exthdrs)) != 0) {
+                       IP6_STATINC(IP6_STAT_ODROPPED);
                        m = NULL;
                        goto freehdrs;
                }
@@ -331,6 +333,7 @@
        if (plen > IPV6_MAXPACKET) {
                if (!hdrsplit) {
                        if ((error = ip6_splithdr(m, &exthdrs)) != 0) {
+                               IP6_STATINC(IP6_STAT_ODROPPED);
                                m = NULL;
                                goto freehdrs;
                        }
@@ -339,8 +342,10 @@
                }
                /* adjust pointer */
                ip6 = mtod(m, struct ip6_hdr *);
-               if ((error = ip6_insert_jumboopt(&exthdrs, plen)) != 0)
+               if ((error = ip6_insert_jumboopt(&exthdrs, plen)) != 0) {
+                       IP6_STATINC(IP6_STAT_ODROPPED);
                        goto freehdrs;
+               }
                optlen += 8; /* XXX JUMBOOPTLEN */
                ip6->ip6_plen = 0;
        } else
@@ -418,8 +423,10 @@
                rh = mtod(exthdrs.ip6e_rthdr, struct ip6_rthdr *);
 
                error = ip6_handle_rthdr(rh, ip6);
-               if (error != 0)
+               if (error != 0) {
+                       IP6_STATINC(IP6_STAT_ODROPPED);
                        goto bad;
+               }
        }
 
        /* Source address validation */
@@ -530,6 +537,7 @@
                 */
                error = rtcache_setdst(ro, sin6tosa(&dst_sa));
                if (error) {
+                       IP6_STATINC(IP6_STAT_ODROPPED);
                        goto bad;
                }
        }
@@ -553,8 +561,10 @@
         */
        if (ia != NULL) {
                origifp = ia->ia_ifp;
-               if (if_is_deactivated(origifp))
+               if (if_is_deactivated(origifp)) {
+                       IP6_STATINC(IP6_STAT_ODROPPED);
                        goto bad;
+               }
                if_acquire(origifp, &psref_ia);
                release_psref_ia = true;
        } else
@@ -699,8 +709,7 @@
        error = ip6_getpmtu(rt_pmtu, ifp, &mtu, &alwaysfrag);
        if (rt_pmtu != NULL && rt_pmtu != rt)
                rtcache_unref(rt_pmtu, ro_pmtu);
-       if (error != 0)
-               goto bad;
+       KASSERT(error == 0); /* ip6_getpmtu never fail if ifp is passed */
 
        /*
         * The caller of this function may specify to use the minimum MTU
@@ -792,6 +801,7 @@
 
        if (dontfrag && alwaysfrag) {   /* case 4 */
                /* conflicting request - can't transmit */
+               IP6_STATINC(IP6_STAT_CANTFRAG);
                error = EMSGSIZE;
                goto bad;
        }
@@ -813,6 +823,7 @@
                pfctlinput2(PRC_MSGSIZE,
                    rtcache_getdst(ro_pmtu), &ip6cp);
 
+               IP6_STATINC(IP6_STAT_CANTFRAG);
                error = EMSGSIZE;
                goto bad;
        }
@@ -857,6 +868,7 @@
        }
 
        if (tso) {
+               IP6_STATINC(IP6_STAT_CANTFRAG); /* XXX */
                error = EINVAL; /* XXX */
                goto bad;
        }
@@ -866,11 +878,13 @@
         */
        if (mtu < IPV6_MMTU) {
                /* path MTU cannot be less than IPV6_MMTU */
+               IP6_STATINC(IP6_STAT_CANTFRAG);
                error = EMSGSIZE;
                in6_ifstat_inc(ifp, ifs6_out_fragfail);
                goto bad;
        } else if (ip6->ip6_plen == 0) {
                /* jumbo payload cannot be fragmented */
+               IP6_STATINC(IP6_STAT_CANTFRAG);
                error = EMSGSIZE;
                in6_ifstat_inc(ifp, ifs6_out_fragfail);
                goto bad;
@@ -889,6 +903,7 @@
                 */
                len = (mtu - hlen - sizeof(struct ip6_frag)) & ~7;
                if (len < 8) {
+                       IP6_STATINC(IP6_STAT_CANTFRAG);
                        error = EMSGSIZE;
                        in6_ifstat_inc(ifp, ifs6_out_fragfail);
                        goto bad;
diff -r 1f973ab297e9 -r b410374a69ac sys/netinet6/ip6_var.h
--- a/sys/netinet6/ip6_var.h    Fri Aug 28 06:31:42 2020 +0000
+++ b/sys/netinet6/ip6_var.h    Fri Aug 28 06:32:24 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip6_var.h,v 1.86 2020/08/28 06:28:58 ozaki-r Exp $     */
+/*     $NetBSD: ip6_var.h,v 1.87 2020/08/28 06:32:24 ozaki-r Exp $     */
 /*     $KAME: ip6_var.h,v 1.33 2000/06/11 14:59:20 jinmei Exp $        */
 
 /*
@@ -190,8 +190,13 @@
 #define        IP6_STAT_PFILDROP_OUT   404     /* dropped by pfil (PFIL_OUT) */
 #define        IP6_STAT_IPSECDROP_IN   405     /* dropped by IPsec SP check */
 #define        IP6_STAT_IPSECDROP_OUT  406     /* dropped by IPsec SP check */
+#define        IP6_STAT_IFDROP         407     /* dropped due to inteface state */
+#define        IP6_STAT_IDROPPED       408     /* lost packets due to nobufs, etc. */
+#define        IP6_STAT_TIMXCEED       409     /* hop limit exceeded */
+#define        IP6_STAT_TOOBIG         410     /* packet bigger than MTU */
+#define        IP6_STAT_RTREJECT       411     /* rejected by route */
 
-#define        IP6_NSTATS              407
+#define        IP6_NSTATS              412
 



Home | Main Index | Thread Index | Old Index