inet6: reduce silent packet discards

This commit is contained in:
ozaki-r 2020-08-28 06:32:24 +00:00
parent d511e529cc
commit 9e214c7fd5
5 changed files with 48 additions and 19 deletions

View File

@ -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 @@ in6_selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
/* 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;
}

View File

@ -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 @@ ip6_forward(struct mbuf *m, int srcrt, struct ifnet *rcvif)
}
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,

View File

@ -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 @@ ip6intr(void *arg __unused)
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 @@ ip6intr(void *arg __unused)
*/
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 @@ ip6_input(struct mbuf *m, struct ifnet *rcvif)
* 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 @@ ip6_input(struct mbuf *m, struct ifnet *rcvif)
IN6_PRINT(ip6bufs, &ip6->ip6_src),
IN6_PRINT(ip6bufd, &ip6->ip6_dst));
IP6_STATINC(IP6_STAT_IDROPPED);
goto bad_unref;
}
}
@ -662,8 +667,10 @@ hbhcheck:
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 @@ ip6_process_hopopts(struct mbuf *m, u_int8_t *opthead, int hbhlen,
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 @@ ip6_process_hopopts(struct mbuf *m, u_int8_t *opthead, int hbhlen,
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);

View File

@ -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 @@ ip6_if_output(struct ifnet * const ifp, struct ifnet * const origifp,
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 @@ ip6_output(
*/
if ((needipsec || optlen) && !hdrsplit) {
if ((error = ip6_splithdr(m, &exthdrs)) != 0) {
IP6_STATINC(IP6_STAT_ODROPPED);
m = NULL;
goto freehdrs;
}
@ -331,6 +333,7 @@ ip6_output(
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 @@ ip6_output(
}
/* 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 @@ ip6_output(
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 @@ ip6_output(
*/
error = rtcache_setdst(ro, sin6tosa(&dst_sa));
if (error) {
IP6_STATINC(IP6_STAT_ODROPPED);
goto bad;
}
}
@ -553,8 +561,10 @@ ip6_output(
*/
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 @@ ip6_output(
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 @@ ip6_output(
if (dontfrag && alwaysfrag) { /* case 4 */
/* conflicting request - can't transmit */
IP6_STATINC(IP6_STAT_CANTFRAG);
error = EMSGSIZE;
goto bad;
}
@ -813,6 +823,7 @@ ip6_output(
pfctlinput2(PRC_MSGSIZE,
rtcache_getdst(ro_pmtu), &ip6cp);
IP6_STATINC(IP6_STAT_CANTFRAG);
error = EMSGSIZE;
goto bad;
}
@ -857,6 +868,7 @@ ip6_output(
}
if (tso) {
IP6_STATINC(IP6_STAT_CANTFRAG); /* XXX */
error = EINVAL; /* XXX */
goto bad;
}
@ -866,11 +878,13 @@ ip6_output(
*/
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 @@ ip6_output(
*/
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;

View File

@ -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 @@ struct ip6_pktopts {
#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
#define IP6FLOW_HASHBITS 6 /* should not be a multiple of 8 */