svn commit: r257025 - user/ae/inet6/sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Thu Oct 24 00:09:18 UTC 2013
Author: ae
Date: Thu Oct 24 00:09:17 2013
New Revision: 257025
URL: http://svnweb.freebsd.org/changeset/base/257025
Log:
Scope related cleanup in nd6_ns_output():
* remove in6_setscope() and in6_clearscope calls;
* initialize sin6_scope_id before in6_selectsrc();
* use IPV6_USEROIF flag for ip6_output().
* sort variables declarations.
Modified:
user/ae/inet6/sys/netinet6/nd6_nbr.c
Modified: user/ae/inet6/sys/netinet6/nd6_nbr.c
==============================================================================
--- user/ae/inet6/sys/netinet6/nd6_nbr.c Thu Oct 24 00:00:24 2013 (r257024)
+++ user/ae/inet6/sys/netinet6/nd6_nbr.c Thu Oct 24 00:09:17 2013 (r257025)
@@ -380,15 +380,15 @@ void
nd6_ns_output(struct ifnet *ifp, const struct in6_addr *daddr6,
const struct in6_addr *taddr6, struct llentry *ln, int dad)
{
+ struct route_in6 ro;
+ struct ip6_moptions im6o;
struct mbuf *m;
struct m_tag *mtag;
struct ip6_hdr *ip6;
struct nd_neighbor_solicit *nd_ns;
- struct ip6_moptions im6o;
int icmp6len;
- int maxlen;
+ int maxlen, flags;
caddr_t mac;
- struct route_in6 ro;
if (IN6_IS_ADDR_MULTICAST(taddr6))
return;
@@ -412,7 +412,6 @@ nd6_ns_output(struct ifnet *ifp, const s
return;
bzero(&ro, sizeof(ro));
-
if (daddr6 == NULL || IN6_IS_ADDR_MULTICAST(daddr6)) {
m->m_flags |= M_MCAST;
im6o.im6o_multicast_ifp = ifp;
@@ -435,14 +434,11 @@ nd6_ns_output(struct ifnet *ifp, const s
if (daddr6)
ip6->ip6_dst = *daddr6;
else {
- ip6->ip6_dst.s6_addr16[0] = IPV6_ADDR_INT16_MLL;
- ip6->ip6_dst.s6_addr16[1] = 0;
+ ip6->ip6_dst.s6_addr32[0] = IPV6_ADDR_INT32_MLL;
ip6->ip6_dst.s6_addr32[1] = 0;
ip6->ip6_dst.s6_addr32[2] = IPV6_ADDR_INT32_ONE;
ip6->ip6_dst.s6_addr32[3] = taddr6->s6_addr32[3];
ip6->ip6_dst.s6_addr8[12] = 0xff;
- if (in6_setscope(&ip6->ip6_dst, ifp, NULL) != 0)
- goto bad;
}
if (!dad) {
struct ifaddr *ifa;
@@ -497,6 +493,8 @@ nd6_ns_output(struct ifnet *ifp, const s
dst_sa.sin6_family = AF_INET6;
dst_sa.sin6_len = sizeof(dst_sa);
dst_sa.sin6_addr = ip6->ip6_dst;
+ dst_sa.sin6_scope_id = in6_getscopezone(ifp,
+ in6_addrscope(&ip6->ip6_dst));
oifp = ifp;
error = in6_selectsrc(&dst_sa, NULL,
@@ -527,7 +525,6 @@ nd6_ns_output(struct ifnet *ifp, const s
nd_ns->nd_ns_code = 0;
nd_ns->nd_ns_reserved = 0;
nd_ns->nd_ns_target = *taddr6;
- in6_clearscope(&nd_ns->nd_ns_target); /* XXX */
/*
* Add source link-layer address option.
@@ -570,7 +567,10 @@ nd6_ns_output(struct ifnet *ifp, const s
m_tag_prepend(m, mtag);
}
- ip6_output(m, NULL, &ro, dad ? IPV6_UNSPECSRC : 0, &im6o, NULL, NULL);
+ flags = IPV6_USEROIF;
+ if (dad)
+ flags |= IPV6_UNSPECSRC;
+ ip6_output(m, NULL, &ro, flags, &im6o, &ifp, NULL);
icmp6_ifstat_inc(ifp, ifs6_out_msg);
icmp6_ifstat_inc(ifp, ifs6_out_neighborsolicit);
ICMP6STAT_INC(icp6s_outhist[ND_NEIGHBOR_SOLICIT]);
More information about the svn-src-user
mailing list