Module Name: src Committed By: martin Date: Mon May 13 09:04:38 UTC 2019
Modified Files: src/sys/netinet6 [netbsd-8]: nd6_nbr.c Log Message: Pull up following revision(s) (requested by roy in ticket #1262): sys/netinet6/nd6_nbr.c: revision 1.163 inet6: discard any received NA with a LL address we own This matches ARP behaviour. To generate a diff of this commit: cvs rdiff -u -r1.138.6.6 -r1.138.6.7 src/sys/netinet6/nd6_nbr.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet6/nd6_nbr.c diff -u src/sys/netinet6/nd6_nbr.c:1.138.6.6 src/sys/netinet6/nd6_nbr.c:1.138.6.7 --- src/sys/netinet6/nd6_nbr.c:1.138.6.6 Mon Apr 2 08:54:35 2018 +++ src/sys/netinet6/nd6_nbr.c Mon May 13 09:04:38 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: nd6_nbr.c,v 1.138.6.6 2018/04/02 08:54:35 martin Exp $ */ +/* $NetBSD: nd6_nbr.c,v 1.138.6.7 2019/05/13 09:04:38 martin Exp $ */ /* $KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $ */ /* @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.138.6.6 2018/04/02 08:54:35 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.138.6.7 2019/05/13 09:04:38 martin Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -630,9 +630,26 @@ nd6_na_input(struct mbuf *m, int off, in goto freeit; } - if (ndopts.nd_opts_tgt_lladdr) { + if (ndopts.nd_opts_tgt_lladdr != NULL) { + struct ifnet *ifp_ll; + struct psref psref_ll; + lladdr = (char *)(ndopts.nd_opts_tgt_lladdr + 1); lladdrlen = ndopts.nd_opts_tgt_lladdr->nd_opt_len << 3; + + if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) { + nd6log(LOG_INFO, "lladdrlen mismatch for %s " + "(if %d, NA packet %d)\n", IN6_PRINT(ip6buf, &taddr6), + ifp->if_addrlen, lladdrlen - 2); + goto bad; + } + + ifp_ll = if_get_bylla(lladdr, ifp->if_addrlen, &psref_ll); + if (ifp_ll != NULL) { + /* it's from me, ignore it. */ + if_put(ifp_ll, &psref_ll); + goto freeit; + } } ifa = (struct ifaddr *)in6ifa_ifpwithaddr_psref(ifp, &taddr6, &psref_ia); @@ -647,7 +664,8 @@ nd6_na_input(struct mbuf *m, int off, in * Otherwise, process as defined in RFC 2461. */ if (ifa - && (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_TENTATIVE)) { + && (((struct in6_ifaddr *)ifa)->ia6_flags & IN6_IFF_TENTATIVE)) + { nd6_dad_na_input(ifa); ifa_release(ifa, &psref_ia); ifa = NULL; @@ -674,13 +692,6 @@ nd6_na_input(struct mbuf *m, int off, in goto bad; } - if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) { - nd6log(LOG_INFO, "lladdrlen mismatch for %s " - "(if %d, NA packet %d)\n", IN6_PRINT(ip6buf, &taddr6), - ifp->if_addrlen, lladdrlen - 2); - goto bad; - } - /* * If no neighbor cache entry is found, NA SHOULD silently be * discarded.