summaryrefslogtreecommitdiff
path: root/sys/netinet6/mld6.c
diff options
context:
space:
mode:
authorJun-ichiro itojun Hagino <itojun@cvs.openbsd.org>2001-02-16 16:01:01 +0000
committerJun-ichiro itojun Hagino <itojun@cvs.openbsd.org>2001-02-16 16:01:01 +0000
commitecd82efc92808a3b9161e0fb0fb90d746ce8a310 (patch)
tree265dd7dea85ff82beafdb73a72622554ddc95020 /sys/netinet6/mld6.c
parentadcce09577c48aeb228910c0f7e4f83726f03ff2 (diff)
pull in new pcb notification code from kame. better handling of scope address.
Diffstat (limited to 'sys/netinet6/mld6.c')
-rw-r--r--sys/netinet6/mld6.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c
index 5a8dba7b6ac..badc566b512 100644
--- a/sys/netinet6/mld6.c
+++ b/sys/netinet6/mld6.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: mld6.c,v 1.8 2001/02/16 08:48:06 itojun Exp $ */
-/* $KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $ */
+/* $OpenBSD: mld6.c,v 1.9 2001/02/16 16:00:58 itojun Exp $ */
+/* $KAME: mld6.c,v 1.26 2001/02/16 14:50:35 itojun Exp $ */
/*
* Copyright (C) 1998 WIDE Project.
@@ -189,31 +189,34 @@ mld6_input(m, off)
struct in6_ifaddr *ia;
int timer; /* timer value in the MLD query header */
+#ifndef PULLDOWN_TEST
+ IP6_EXTHDR_CHECK(m, off, sizeof(*mldh),);
+ mldh = (struct mld6_hdr *)(mtod(m, caddr_t) + off);
+#else
+ IP6_EXTHDR_GET(mldh, struct mld6_hdr *, m, off, sizeof(*mldh));
+ if (mldh == NULL) {
+ icmp6stat.icp6s_tooshort++;
+ return;
+ }
+#endif
+
/* source address validation */
+ ip6 = mtod(m, struct ip6_hdr *);/* in case mpullup */
if (!IN6_IS_ADDR_LINKLOCAL(&ip6->ip6_src)) {
log(LOG_ERR,
- "mld6_input: src %s is not link-local\n",
- ip6_sprintf(&ip6->ip6_src));
+ "mld6_input: src %s is not link-local (grp=%s)\n",
+ ip6_sprintf(&ip6->ip6_src),
+ ip6_sprintf(&mldh->mld6_addr));
/*
* spec (RFC2710) does not explicitly
* specify to discard the packet from a non link-local
* source address. But we believe it's expected to do so.
+ * XXX: do we have to allow :: as source?
*/
m_freem(m);
return;
}
-#ifndef PULLDOWN_TEST
- IP6_EXTHDR_CHECK(m, off, sizeof(*mldh),);
- mldh = (struct mld6_hdr *)(mtod(m, caddr_t) + off);
-#else
- IP6_EXTHDR_GET(mldh, struct mld6_hdr *, m, off, sizeof(*mldh));
- if (mldh == NULL) {
- icmp6stat.icp6s_tooshort++;
- return;
- }
-#endif
-
/*
* In the MLD6 specification, there are 3 states and a flag.
*
@@ -231,7 +234,7 @@ mld6_input(m, off)
break;
if (!IN6_IS_ADDR_UNSPECIFIED(&mldh->mld6_addr) &&
- !IN6_IS_ADDR_MULTICAST(&mldh->mld6_addr))
+ !IN6_IS_ADDR_MULTICAST(&mldh->mld6_addr))
break; /* print error or log stat? */
if (IN6_IS_ADDR_MC_LINKLOCAL(&mldh->mld6_addr))
mldh->mld6_addr.s6_addr16[1] =