summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/mld6.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet6/mld6.c')
-rw-r--r--sys/netinet6/mld6.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c
index 4739856..27b8480 100644
--- a/sys/netinet6/mld6.c
+++ b/sys/netinet6/mld6.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: mld6.c,v 1.19 2000/05/05 11:01:03 sumikawa Exp $ */
+/* $KAME: mld6.c,v 1.27 2001/04/04 05:17:30 itojun Exp $ */
/*
* Copyright (C) 1998 WIDE Project.
@@ -129,9 +129,8 @@ mld6_init()
hbh_buf[5] = IP6OPT_RTALERT_LEN - 2;
bcopy((caddr_t)&rtalert_code, &hbh_buf[6], sizeof(u_int16_t));
+ init_ip6pktopts(&ip6_opts);
ip6_opts.ip6po_hbh = hbh;
- /* We will specify the hoplimit by a multicast option. */
- ip6_opts.ip6po_hlim = -1;
}
void
@@ -192,31 +191,34 @@ mld6_input(m, off)
struct ifmultiaddr *ifma;
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.
*
@@ -234,7 +236,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] =
@@ -343,7 +345,7 @@ mld6_input(m, off)
void
mld6_fasttimeo()
{
- register struct in6_multi *in6m;
+ struct in6_multi *in6m;
struct in6_multistep step;
int s;
@@ -408,6 +410,7 @@ mld6_sendpkt(in6m, type, dst)
}
mh->m_next = md;
+ mh->m_pkthdr.rcvif = NULL;
mh->m_pkthdr.len = sizeof(struct ip6_hdr) + sizeof(struct mld6_hdr);
mh->m_len = sizeof(struct ip6_hdr);
MH_ALIGN(mh, sizeof(struct ip6_hdr));
@@ -455,16 +458,16 @@ mld6_sendpkt(in6m, type, dst)
ip6_output(mh, &ip6_opts, NULL, 0, &im6o, &outif);
if (outif) {
icmp6_ifstat_inc(outif, ifs6_out_msg);
- switch(type) {
- case MLD6_LISTENER_QUERY:
- icmp6_ifstat_inc(outif, ifs6_out_mldquery);
- break;
- case MLD6_LISTENER_REPORT:
- icmp6_ifstat_inc(outif, ifs6_out_mldreport);
- break;
- case MLD6_LISTENER_DONE:
- icmp6_ifstat_inc(outif, ifs6_out_mlddone);
- break;
+ switch (type) {
+ case MLD6_LISTENER_QUERY:
+ icmp6_ifstat_inc(outif, ifs6_out_mldquery);
+ break;
+ case MLD6_LISTENER_REPORT:
+ icmp6_ifstat_inc(outif, ifs6_out_mldreport);
+ break;
+ case MLD6_LISTENER_DONE:
+ icmp6_ifstat_inc(outif, ifs6_out_mlddone);
+ break;
}
}
}
OpenPOWER on IntegriCloud