summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/icmp6.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet6/icmp6.c')
-rw-r--r--sys/netinet6/icmp6.c27
1 files changed, 9 insertions, 18 deletions
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index 421280690c9..9567e5cc4fd 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: icmp6.c,v 1.219 2017/10/18 17:01:14 bluhm Exp $ */
+/* $OpenBSD: icmp6.c,v 1.220 2017/11/03 14:28:57 florian Exp $ */
/* $KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $ */
/*
@@ -637,32 +637,23 @@ icmp6_input(struct mbuf **mp, int *offp, int proto, int af)
break;
case ND_ROUTER_SOLICIT:
- if (code != 0)
- goto badcode;
- if (icmp6len < sizeof(struct nd_router_solicit))
- goto badlen;
- if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) {
- /* give up local */
- nd6_rs_input(m, off, icmp6len);
- m = NULL;
- goto freeit;
- }
- nd6_rs_input(n, off, icmp6len);
- /* m stays. */
- break;
-
case ND_ROUTER_ADVERT:
if (code != 0)
goto badcode;
- if (icmp6len < sizeof(struct nd_router_advert))
+ if ((icmp6->icmp6_type == ND_ROUTER_SOLICIT && icmp6len <
+ sizeof(struct nd_router_solicit)) ||
+ (icmp6->icmp6_type == ND_ROUTER_ADVERT && icmp6len <
+ sizeof(struct nd_router_advert)))
goto badlen;
+
if ((n = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) == NULL) {
/* give up local */
- nd6_ra_input(m, off, icmp6len);
+ nd6_rtr_cache(m, off, icmp6len,
+ icmp6->icmp6_type);
m = NULL;
goto freeit;
}
- nd6_ra_input(n, off, icmp6len);
+ nd6_rtr_cache(n, off, icmp6len, icmp6->icmp6_type);
/* m stays. */
break;