Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet6/mld6.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet6/mld6.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.13.2.6 retrieving revision 1.15 diff -u -p -r1.13.2.6 -r1.15 --- src/sys/netinet6/mld6.c 2002/06/20 03:49:27 1.13.2.6 +++ src/sys/netinet6/mld6.c 2001/10/18 09:09:26 1.15 @@ -1,4 +1,4 @@ -/* $NetBSD: mld6.c,v 1.13.2.6 2002/06/20 03:49:27 nathanw Exp $ */ +/* $NetBSD: mld6.c,v 1.15 2001/10/18 09:09:26 itojun Exp $ */ /* $KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $ */ /* @@ -69,9 +69,6 @@ * @(#)igmp.c 8.1 (Berkeley) 7/19/93 */ -#include -__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.13.2.6 2002/06/20 03:49:27 nathanw Exp $"); - #include "opt_inet.h" #include @@ -150,16 +147,15 @@ mld6_start_listening(in6m) * (reserved) or 1 (node-local). */ mld6_all_nodes_linklocal.s6_addr16[1] = - htons(in6m->in6m_ifp->if_index); /* XXX */ + htons(in6m->in6m_ifp->if_index); /* XXX */ if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &mld6_all_nodes_linklocal) || IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) < IPV6_ADDR_SCOPE_LINKLOCAL) { in6m->in6m_timer = 0; in6m->in6m_state = MLD6_OTHERLISTENER; } else { mld6_sendpkt(in6m, MLD6_LISTENER_REPORT, NULL); - in6m->in6m_timer = - MLD6_RANDOM_DELAY(MLD6_UNSOLICITED_REPORT_INTERVAL * - PR_FASTHZ); + in6m->in6m_timer = MLD6_RANDOM_DELAY( + MLD6_UNSOLICITED_REPORT_INTERVAL * PR_FASTHZ); in6m->in6m_state = MLD6_IREPORTEDLAST; mld6_timers_are_running = 1; } @@ -171,15 +167,15 @@ mld6_stop_listening(in6m) struct in6_multi *in6m; { mld6_all_nodes_linklocal.s6_addr16[1] = - htons(in6m->in6m_ifp->if_index); /* XXX */ + htons(in6m->in6m_ifp->if_index); /* XXX */ mld6_all_routers_linklocal.s6_addr16[1] = - htons(in6m->in6m_ifp->if_index); /* XXX: necessary when mrouting */ + htons(in6m->in6m_ifp->if_index); /* XXX: necessary when mrouting */ if (in6m->in6m_state == MLD6_IREPORTEDLAST && (!IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr, &mld6_all_nodes_linklocal)) && IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) > IPV6_ADDR_SCOPE_NODELOCAL) mld6_sendpkt(in6m, MLD6_LISTENER_DONE, - &mld6_all_routers_linklocal); + &mld6_all_routers_linklocal); } void @@ -208,12 +204,10 @@ mld6_input(m, off) /* source address validation */ ip6 = mtod(m, struct ip6_hdr *);/* in case mpullup */ if (!IN6_IS_ADDR_LINKLOCAL(&ip6->ip6_src)) { -#if 0 log(LOG_ERR, "mld6_input: src %s is not link-local (grp=%s)\n", ip6_sprintf(&ip6->ip6_src), ip6_sprintf(&mldh->mld6_addr)); -#endif /* * spec (RFC2710) does not explicitly * specify to discard the packet from a non link-local @@ -235,7 +229,7 @@ mld6_input(m, off) * we have heard a report from another member, or MLD6_IREPORTEDLAST * if we sent the last report. */ - switch (mldh->mld6_type) { + switch(mldh->mld6_type) { case MLD6_LISTENER_QUERY: if (ifp->if_flags & IFF_LOOPBACK) break; @@ -245,7 +239,7 @@ mld6_input(m, off) break; /* print error or log stat? */ if (IN6_IS_ADDR_MC_LINKLOCAL(&mldh->mld6_addr)) mldh->mld6_addr.s6_addr16[1] = - htons(ifp->if_index); /* XXX */ + htons(ifp->if_index); /* XXX */ /* * - Start the timers in all of our membership records @@ -272,7 +266,7 @@ mld6_input(m, off) timer = 1; mld6_all_nodes_linklocal.s6_addr16[1] = htons(ifp->if_index); /* XXX */ - + for (in6m = ia->ia6_multiaddrs.lh_first; in6m; in6m = in6m->in6m_entry.le_next) @@ -290,14 +284,14 @@ mld6_input(m, off) if (timer == 0) { /* send a report immediately */ mld6_sendpkt(in6m, MLD6_LISTENER_REPORT, - NULL); + NULL); in6m->in6m_timer = 0; /* reset timer */ in6m->in6m_state = MLD6_IREPORTEDLAST; } else if (in6m->in6m_timer == 0 || /*idle state*/ - in6m->in6m_timer > timer) { + in6m->in6m_timer > timer) { in6m->in6m_timer = - MLD6_RANDOM_DELAY(timer); + MLD6_RANDOM_DELAY(timer); mld6_timers_are_running = 1; } } @@ -339,14 +333,7 @@ mld6_input(m, off) mldh->mld6_addr.s6_addr16[1] = 0; /* XXX */ break; default: /* this is impossible */ -#if 0 - /* - * this case should be impossible because of filtering in - * icmp6_input(). But we explicitly disabled this part - * just in case. - */ log(LOG_ERR, "mld6_input: illegal type(%d)", mldh->mld6_type); -#endif break; } @@ -359,6 +346,7 @@ mld6_fasttimeo() struct in6_multi *in6m; struct in6_multistep step; int s; + /* * Quick check to see if any work needs to be done, in order * to minimize the overhead of fasttimo processing. @@ -395,19 +383,14 @@ mld6_sendpkt(in6m, type, dst) struct ip6_moptions im6o; struct in6_ifaddr *ia; struct ifnet *ifp = in6m->in6m_ifp; - int ignflags; /* * At first, find a link local address on the outgoing interface * to use as the source address of the MLD packet. - * We do not reject tentative addresses for MLD report to deal with - * the case where we first join a link-local address. */ - ignflags = (IN6_IFF_NOTREADY|IN6_IFF_ANYCAST) & ~IN6_IFF_TENTATIVE; - if ((ia = in6ifa_ifpforlinklocal(ifp, ignflags)) == NULL) + if ((ia = in6ifa_ifpforlinklocal(ifp, IN6_IFF_NOTREADY|IN6_IFF_ANYCAST)) + == NULL) return; - if ((ia->ia6_flags & IN6_IFF_TENTATIVE)) - ia = NULL; /* * Allocate mbufs to store ip6 header and MLD header. @@ -424,7 +407,6 @@ 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)); @@ -437,7 +419,7 @@ mld6_sendpkt(in6m, type, dst) /* ip6_plen will be set later */ ip6->ip6_nxt = IPPROTO_ICMPV6; /* ip6_hlim will be set by im6o.im6o_multicast_hlim */ - ip6->ip6_src = ia ? ia->ia_addr.sin6_addr : in6addr_any; + ip6->ip6_src = ia->ia_addr.sin6_addr; ip6->ip6_dst = dst ? *dst : in6m->in6m_addr; /* fill in the MLD header */ @@ -454,7 +436,7 @@ mld6_sendpkt(in6m, type, dst) mldh->mld6_addr.s6_addr16[1] = 0; /* XXX */ mldh->mld6_cksum = in6_cksum(mh, IPPROTO_ICMPV6, sizeof(struct ip6_hdr), - sizeof(struct mld6_hdr)); + sizeof(struct mld6_hdr)); /* construct multicast option */ bzero(&im6o, sizeof(im6o)); @@ -469,8 +451,10 @@ mld6_sendpkt(in6m, type, dst) /* increment output statictics */ icmp6stat.icp6s_outhist[type]++; + + ip6_output(mh, &ip6_opts, NULL, 0, &im6o, NULL); icmp6_ifstat_inc(ifp, ifs6_out_msg); - switch (type) { + switch(type) { case MLD6_LISTENER_QUERY: icmp6_ifstat_inc(ifp, ifs6_out_mldquery); break; @@ -481,6 +465,4 @@ mld6_sendpkt(in6m, type, dst) icmp6_ifstat_inc(ifp, ifs6_out_mlddone); break; } - - ip6_output(mh, &ip6_opts, NULL, ia ? 0 : IPV6_UNSPECSRC, &im6o, NULL); }