Index: sys/netinet/icmp6.h =================================================================== --- sys/netinet/icmp6.h +++ sys/netinet/icmp6.h @@ -639,6 +639,8 @@ uint64_t icp6s_overflowprfx; /* Too many prefixes. */ uint64_t icp6s_overflownndp; /* Too many neighbour entries. */ uint64_t icp6s_overflowredirect;/* Too many redirects. */ + uint64_t icp6s_invlhlim; /* Invalid hop limit. */ + uint64_t icp6s_spare[32]; }; #ifdef _KERNEL Index: sys/netinet6/icmp6.c =================================================================== --- sys/netinet6/icmp6.c +++ sys/netinet6/icmp6.c @@ -2262,10 +2262,7 @@ goto bad; } if (ip6->ip6_hlim != 255) { - nd6log((LOG_ERR, - "ICMP6 redirect sent from %s rejected; " - "hlim=%d (must be 255)\n", - ip6_sprintf(ip6buf, &src6), ip6->ip6_hlim)); + ICMP6STAT_INC(icp6s_invlhlim); goto bad; } { Index: sys/netinet6/nd6_nbr.c =================================================================== --- sys/netinet6/nd6_nbr.c +++ sys/netinet6/nd6_nbr.c @@ -124,7 +124,7 @@ struct ifaddr *ifa; struct sockaddr_dl proxydl; union nd_opts ndopts; - char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; + char ip6bufs[INET6_ADDRSTRLEN]; char *lladdr; int anycast, lladdrlen, proxy, rflag, tentative, tlladdr; @@ -137,10 +137,7 @@ ifp = m->m_pkthdr.rcvif; ip6 = mtod(m, struct ip6_hdr *); if (ip6->ip6_hlim != 255) { - nd6log((LOG_ERR, - "nd6_ns_input: invalid hlim (%d) from %s to %s on %s\n", - ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src), - ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp))); + ICMP6STAT_INC(icp6s_invlhlim); goto bads; } @@ -623,7 +620,7 @@ struct sockaddr_in6 sin6; union nd_opts ndopts; u_char linkhdr[LLE_MAX_LINKHDR]; - char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; + char ip6bufs[INET6_ADDRSTRLEN]; char *lladdr; size_t linkhdrsize; int flags, is_override, is_router, is_solicited; @@ -642,10 +639,7 @@ ifp = m->m_pkthdr.rcvif; ip6 = mtod(m, struct ip6_hdr *); if (ip6->ip6_hlim != 255) { - nd6log((LOG_ERR, - "nd6_na_input: invalid hlim (%d) from %s to %s on %s\n", - ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src), - ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp))); + ICMP6STAT_INC(icp6s_invlhlim); goto bad; } Index: sys/netinet6/nd6_rtr.c =================================================================== --- sys/netinet6/nd6_rtr.c +++ sys/netinet6/nd6_rtr.c @@ -158,7 +158,7 @@ struct nd_router_solicit *nd_rs; struct in6_addr saddr6; union nd_opts ndopts; - char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; + char ip6bufs[INET6_ADDRSTRLEN]; char *lladdr; int lladdrlen; @@ -178,10 +178,7 @@ /* Sanity checks */ ip6 = mtod(m, struct ip6_hdr *); if (ip6->ip6_hlim != 255) { - nd6log((LOG_ERR, - "%s: invalid hlim (%d) from %s to %s on %s\n", __func__, - ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src), - ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp))); + ICMP6STAT_INC(icp6s_invlhlim); goto bad; } @@ -359,7 +356,7 @@ struct in6_addr saddr6; struct nd_defrouter *dr; union nd_opts ndopts; - char ip6bufs[INET6_ADDRSTRLEN], ip6bufd[INET6_ADDRSTRLEN]; + char ip6bufs[INET6_ADDRSTRLEN]; int mcast; /* @@ -377,10 +374,7 @@ ip6 = mtod(m, struct ip6_hdr *); if (ip6->ip6_hlim != 255) { - nd6log((LOG_ERR, - "%s: invalid hlim (%d) from %s to %s on %s\n", __func__, - ip6->ip6_hlim, ip6_sprintf(ip6bufs, &ip6->ip6_src), - ip6_sprintf(ip6bufd, &ip6->ip6_dst), if_name(ifp))); + ICMP6STAT_INC(icp6s_invlhlim); goto bad; } Index: usr.bin/netstat/inet6.c =================================================================== --- usr.bin/netstat/inet6.c +++ usr.bin/netstat/inet6.c @@ -1063,6 +1063,8 @@ "{N:/neighbour entries overflow%s}\n"); p(icp6s_overflowredirect, "\t{:redirect-overflows/%ju} " "{N:/redirect overflow%s}\n"); + p(icp6s_invlhlim, "\t{:dropped-invalid-hop-limit/%ju} " + "{N:/message%s with invalid hop limit}\n"); xo_close_container("errors"); p(icp6s_pmtuchg, "\t{:path-mtu-changes/%ju} {N:/path MTU change%s}\n"); #undef p