- typo in comment
- style - ANSIfy (there is no functional change.) Obtained from: KAME
This commit is contained in:
parent
89185ee435
commit
07eb299520
@ -108,7 +108,7 @@ static int mld6_timers_are_running;
|
||||
static struct in6_addr mld6_all_nodes_linklocal = IN6ADDR_LINKLOCAL_ALLNODES_INIT;
|
||||
static struct in6_addr mld6_all_routers_linklocal = IN6ADDR_LINKLOCAL_ALLROUTERS_INIT;
|
||||
|
||||
static void mld6_sendpkt __P((struct in6_multi *, int, const struct in6_addr *));
|
||||
static void mld6_sendpkt(struct in6_multi *, int, const struct in6_addr *);
|
||||
|
||||
void
|
||||
mld6_init()
|
||||
@ -203,7 +203,7 @@ mld6_input(m, off)
|
||||
#endif
|
||||
|
||||
/* source address validation */
|
||||
ip6 = mtod(m, struct ip6_hdr *);/* in case mpullup */
|
||||
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 (grp=%s)\n",
|
||||
@ -262,17 +262,17 @@ mld6_input(m, off)
|
||||
* the calculated value equals to zero when Max Response
|
||||
* Delay is positive.
|
||||
*/
|
||||
timer = ntohs(mldh->mld_maxdelay)*PR_FASTHZ/MLD6_TIMER_SCALE;
|
||||
timer = ntohs(mldh->mld_maxdelay) * PR_FASTHZ / MLD6_TIMER_SCALE;
|
||||
if (timer == 0 && mldh->mld_maxdelay)
|
||||
timer = 1;
|
||||
mld6_all_nodes_linklocal.s6_addr16[1] =
|
||||
htons(ifp->if_index); /* XXX */
|
||||
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
{
|
||||
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_INET6)
|
||||
continue;
|
||||
in6m = (struct in6_multi *)ifma->ifma_protospec;
|
||||
|
||||
if (IN6_ARE_ADDR_EQUAL(&in6m->in6m_addr,
|
||||
&mld6_all_nodes_linklocal) ||
|
||||
IPV6_ADDR_MC_SCOPE(&in6m->in6m_addr) <
|
||||
@ -302,6 +302,7 @@ mld6_input(m, off)
|
||||
if (IN6_IS_ADDR_MC_LINKLOCAL(&mldh->mld_addr))
|
||||
mldh->mld_addr.s6_addr16[1] = 0; /* XXX */
|
||||
break;
|
||||
|
||||
case MLD_LISTENER_REPORT:
|
||||
/*
|
||||
* For fast leave to work, we have to know that we are the
|
||||
@ -357,6 +358,7 @@ mld6_fasttimeo()
|
||||
return;
|
||||
|
||||
s = splnet();
|
||||
|
||||
mld6_timers_are_running = 0;
|
||||
IN6_FIRST_MULTI(step, in6m);
|
||||
while (in6m != NULL) {
|
||||
@ -370,6 +372,7 @@ mld6_fasttimeo()
|
||||
}
|
||||
IN6_NEXT_MULTI(step, in6m);
|
||||
}
|
||||
|
||||
splx(s);
|
||||
}
|
||||
|
||||
@ -438,9 +441,8 @@ mld6_sendpkt(in6m, type, dst)
|
||||
mldh->mld_addr = in6m->in6m_addr;
|
||||
if (IN6_IS_ADDR_MC_LINKLOCAL(&mldh->mld_addr))
|
||||
mldh->mld_addr.s6_addr16[1] = 0; /* XXX */
|
||||
mldh->mld_cksum = in6_cksum(mh, IPPROTO_ICMPV6,
|
||||
sizeof(struct ip6_hdr),
|
||||
sizeof(struct mld_hdr));
|
||||
mldh->mld_cksum = in6_cksum(mh, IPPROTO_ICMPV6, sizeof(struct ip6_hdr),
|
||||
sizeof(struct mld_hdr));
|
||||
|
||||
/* construct multicast option */
|
||||
bzero(&im6o, sizeof(im6o));
|
||||
|
@ -43,11 +43,11 @@
|
||||
#define MLD6_OTHERLISTENER 0
|
||||
#define MLD6_IREPORTEDLAST 1
|
||||
|
||||
void mld6_init __P((void));
|
||||
void mld6_input __P((struct mbuf *, int));
|
||||
void mld6_start_listening __P((struct in6_multi *));
|
||||
void mld6_stop_listening __P((struct in6_multi *));
|
||||
void mld6_fasttimeo __P((void));
|
||||
void mld6_init(void);
|
||||
void mld6_input(struct mbuf *, int);
|
||||
void mld6_start_listening(struct in6_multi *);
|
||||
void mld6_stop_listening(struct in6_multi *);
|
||||
void mld6_fasttimeo(void);
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#endif /* _NETINET6_MLD6_VAR_H_ */
|
||||
|
@ -30,14 +30,6 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* XXX
|
||||
* KAME 970409 note:
|
||||
* BSD/OS version heavily modifies this code, related to llinfo.
|
||||
* Since we don't have BSD/OS version of net/route.c in our hand,
|
||||
* I left the code mostly as it was in 970310. -- itojun
|
||||
*/
|
||||
|
||||
#include "opt_inet.h"
|
||||
#include "opt_inet6.h"
|
||||
#include "opt_mac.h"
|
||||
@ -275,6 +267,7 @@ nd6_option_init(opt, icmp6len, ndopts)
|
||||
int icmp6len;
|
||||
union nd_opts *ndopts;
|
||||
{
|
||||
|
||||
bzero(ndopts, sizeof(*ndopts));
|
||||
ndopts->nd_opts_search = (struct nd_opt_hdr *)opt;
|
||||
ndopts->nd_opts_last
|
||||
@ -432,10 +425,10 @@ nd6_timer(ignored_arg)
|
||||
struct ifnet *ifp;
|
||||
struct in6_ifaddr *ia6, *nia6;
|
||||
struct in6_addrlifetime *lt6;
|
||||
|
||||
|
||||
s = splnet();
|
||||
callout_reset(&nd6_timer_ch, nd6_prune * hz,
|
||||
nd6_timer, NULL);
|
||||
nd6_timer, NULL);
|
||||
|
||||
ln = llinfo_nd6.ln_next;
|
||||
while (ln && ln != &llinfo_nd6) {
|
||||
@ -540,7 +533,7 @@ nd6_timer(ignored_arg)
|
||||
}
|
||||
ln = next;
|
||||
}
|
||||
|
||||
|
||||
/* expire default router list */
|
||||
dr = TAILQ_FIRST(&nd_defrouter);
|
||||
while (dr) {
|
||||
@ -576,7 +569,7 @@ nd6_timer(ignored_arg)
|
||||
* addresses. Although we may have to restart the
|
||||
* loop (see below), it must be after purging the
|
||||
* address. Otherwise, we'd see an infinite loop of
|
||||
* regeneration.
|
||||
* regeneration.
|
||||
*/
|
||||
if (ip6_use_tempaddr &&
|
||||
(ia6->ia6_flags & IN6_IFF_TEMPORARY) != 0) {
|
||||
@ -612,7 +605,7 @@ nd6_timer(ignored_arg)
|
||||
* would not cause disaster (because
|
||||
* it's not a deletion, but an
|
||||
* addition,) we'd rather restart the
|
||||
* loop just for safety. Or does this
|
||||
* loop just for safety. Or does this
|
||||
* significantly reduce performance??
|
||||
*/
|
||||
goto addrloop;
|
||||
@ -662,8 +655,7 @@ regen_tmpaddr(ia6)
|
||||
|
||||
ifp = ia6->ia_ifa.ifa_ifp;
|
||||
for (ifa = ifp->if_addrlist.tqh_first; ifa;
|
||||
ifa = ifa->ifa_list.tqe_next)
|
||||
{
|
||||
ifa = ifa->ifa_list.tqe_next) {
|
||||
struct in6_ifaddr *it6;
|
||||
|
||||
if (ifa->ifa_addr->sa_family != AF_INET6)
|
||||
@ -836,7 +828,7 @@ nd6_lookup(addr6, create, ifp)
|
||||
* be covered by our own prefix.
|
||||
*/
|
||||
struct ifaddr *ifa =
|
||||
ifaof_ifpforaddr((struct sockaddr *)&sin6, ifp);
|
||||
ifaof_ifpforaddr((struct sockaddr *)&sin6, ifp);
|
||||
if (ifa == NULL)
|
||||
return (NULL);
|
||||
|
||||
@ -847,21 +839,19 @@ nd6_lookup(addr6, create, ifp)
|
||||
* called in rtrequest via ifa->ifa_rtrequest.
|
||||
*/
|
||||
if ((e = rtrequest(RTM_ADD, (struct sockaddr *)&sin6,
|
||||
ifa->ifa_addr,
|
||||
(struct sockaddr *)&all1_sa,
|
||||
(ifa->ifa_flags |
|
||||
RTF_HOST | RTF_LLINFO) &
|
||||
~RTF_CLONING,
|
||||
&rt)) != 0)
|
||||
ifa->ifa_addr, (struct sockaddr *)&all1_sa,
|
||||
(ifa->ifa_flags | RTF_HOST | RTF_LLINFO) &
|
||||
~RTF_CLONING, &rt)) != 0) {
|
||||
log(LOG_ERR,
|
||||
"nd6_lookup: failed to add route for a "
|
||||
"neighbor(%s), errno=%d\n",
|
||||
ip6_sprintf(addr6), e);
|
||||
}
|
||||
if (rt == NULL)
|
||||
return (NULL);
|
||||
if (rt->rt_llinfo) {
|
||||
struct llinfo_nd6 *ln =
|
||||
(struct llinfo_nd6 *)rt->rt_llinfo;
|
||||
(struct llinfo_nd6 *)rt->rt_llinfo;
|
||||
ln->ln_state = ND6_LLINFO_NOSTATE;
|
||||
}
|
||||
} else
|
||||
@ -878,14 +868,16 @@ nd6_lookup(addr6, create, ifp)
|
||||
* it might be the loopback interface if the entry is for our
|
||||
* own address on a non-loopback interface. Instead, we should
|
||||
* use rt->rt_ifa->ifa_ifp, which would specify the REAL
|
||||
* interface.
|
||||
* interface.
|
||||
*/
|
||||
if ((rt->rt_flags & RTF_GATEWAY) || (rt->rt_flags & RTF_LLINFO) == 0 ||
|
||||
rt->rt_gateway->sa_family != AF_LINK || rt->rt_llinfo == NULL ||
|
||||
(ifp && rt->rt_ifa->ifa_ifp != ifp)) {
|
||||
if (create) {
|
||||
log(LOG_DEBUG, "nd6_lookup: failed to lookup %s (if = %s)\n",
|
||||
ip6_sprintf(addr6), ifp ? if_name(ifp) : "unspec");
|
||||
log(LOG_DEBUG,
|
||||
"nd6_lookup: failed to lookup %s (if = %s)\n",
|
||||
ip6_sprintf(addr6),
|
||||
ifp ? if_name(ifp) : "unspec");
|
||||
/* xxx more logs... kazu */
|
||||
}
|
||||
return (NULL);
|
||||
@ -921,10 +913,8 @@ nd6_is_addr_neighbor(addr, ifp)
|
||||
* If the address matches one of our addresses,
|
||||
* it should be a neighbor.
|
||||
*/
|
||||
for (ifa = ifp->if_addrlist.tqh_first;
|
||||
ifa;
|
||||
ifa = ifa->ifa_list.tqe_next)
|
||||
{
|
||||
for (ifa = ifp->if_addrlist.tqh_first; ifa;
|
||||
ifa = ifa->ifa_list.tqe_next) {
|
||||
if (ifa->ifa_addr->sa_family != AF_INET6)
|
||||
next: continue;
|
||||
|
||||
@ -961,7 +951,7 @@ nd6_free(rt)
|
||||
struct nd_defrouter *dr;
|
||||
|
||||
/*
|
||||
* we used to have pfctlinput(PRC_HOSTDEAD) here.
|
||||
* we used to have pfctlinput(PRC_HOSTDEAD) here.
|
||||
* even though it is not harmful, it was not really necessary.
|
||||
*/
|
||||
|
||||
@ -969,7 +959,7 @@ nd6_free(rt)
|
||||
int s;
|
||||
s = splnet();
|
||||
dr = defrouter_lookup(&((struct sockaddr_in6 *)rt_key(rt))->sin6_addr,
|
||||
rt->rt_ifp);
|
||||
rt->rt_ifp);
|
||||
|
||||
if (ln->ln_router || dr) {
|
||||
/*
|
||||
@ -1035,7 +1025,7 @@ nd6_free(rt)
|
||||
* cached routes.
|
||||
*/
|
||||
rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
|
||||
rt_mask(rt), 0, (struct rtentry **)0);
|
||||
rt_mask(rt), 0, (struct rtentry **)0);
|
||||
|
||||
return (next);
|
||||
}
|
||||
@ -1106,7 +1096,7 @@ nd6_rtrequest(req, rt, info)
|
||||
|
||||
RT_LOCK_ASSERT(rt);
|
||||
|
||||
if ((rt->rt_flags & RTF_GATEWAY))
|
||||
if ((rt->rt_flags & RTF_GATEWAY) != 0)
|
||||
return;
|
||||
|
||||
if (nd6_need_cache(ifp) == 0 && (rt->rt_flags & RTF_HOST) == 0) {
|
||||
@ -1164,17 +1154,11 @@ nd6_rtrequest(req, rt, info)
|
||||
SDL(gate)->sdl_index = ifp->if_index;
|
||||
if (ln)
|
||||
ln->ln_expire = time_second;
|
||||
#if 1
|
||||
if (ln && ln->ln_expire == 0) {
|
||||
/* kludge for desktops */
|
||||
#if 0
|
||||
printf("nd6_rtequest: time.tv_sec is zero; "
|
||||
"treat it as 1\n");
|
||||
#endif
|
||||
ln->ln_expire = 1;
|
||||
}
|
||||
#endif
|
||||
if ((rt->rt_flags & RTF_CLONING))
|
||||
if ((rt->rt_flags & RTF_CLONING) != 0)
|
||||
break;
|
||||
}
|
||||
/*
|
||||
@ -1265,7 +1249,7 @@ nd6_rtrequest(req, rt, info)
|
||||
* to the interface.
|
||||
*/
|
||||
ifa = (struct ifaddr *)in6ifa_ifpwithaddr(rt->rt_ifp,
|
||||
&SIN6(rt_key(rt))->sin6_addr);
|
||||
&SIN6(rt_key(rt))->sin6_addr);
|
||||
if (ifa) {
|
||||
caddr_t macp = nd6_ifptomac(ifp);
|
||||
ln->ln_expire = 0;
|
||||
@ -1511,7 +1495,7 @@ nd6_ioctl(cmd, data, ifp)
|
||||
/* xxx sumikawa: flush prefix list */
|
||||
break;
|
||||
case SIOCSPFXFLUSH_IN6:
|
||||
{
|
||||
{
|
||||
/* flush all the prefix advertised by routers */
|
||||
struct nd_prefix *pr, *next;
|
||||
|
||||
@ -1539,9 +1523,9 @@ nd6_ioctl(cmd, data, ifp)
|
||||
}
|
||||
splx(s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case SIOCSRTRFLUSH_IN6:
|
||||
{
|
||||
{
|
||||
/* flush all the default routers */
|
||||
struct nd_defrouter *dr, *next;
|
||||
|
||||
@ -1559,9 +1543,9 @@ nd6_ioctl(cmd, data, ifp)
|
||||
}
|
||||
splx(s);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case SIOCGNBRINFO_IN6:
|
||||
{
|
||||
{
|
||||
struct llinfo_nd6 *ln;
|
||||
struct in6_addr nb_addr = nbi->addr; /* make local for safety */
|
||||
|
||||
@ -1589,22 +1573,21 @@ nd6_ioctl(cmd, data, ifp)
|
||||
nbi->isrouter = ln->ln_router;
|
||||
nbi->expire = ln->ln_expire;
|
||||
splx(s);
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
case SIOCGDEFIFACE_IN6: /* XXX: should be implemented as a sysctl? */
|
||||
ndif->ifindex = nd6_defifindex;
|
||||
break;
|
||||
case SIOCSDEFIFACE_IN6: /* XXX: should be implemented as a sysctl? */
|
||||
return (nd6_setdefaultiface(ndif->ifindex));
|
||||
break;
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create neighbor cache entry and cache link-layer address,
|
||||
* on reception of inbound ND6 packets. (RS/RA/NS/redirect)
|
||||
* on reception of inbound ND6 packets. (RS/RA/NS/redirect)
|
||||
*/
|
||||
struct rtentry *
|
||||
nd6_cache_lladdr(ifp, from, lladdr, lladdrlen, type, code)
|
||||
@ -1706,8 +1689,8 @@ nd6_cache_lladdr(ifp, from, lladdr, lladdrlen, type, code)
|
||||
}
|
||||
|
||||
if (!is_newentry) {
|
||||
if ((!olladdr && lladdr) /* (3) */
|
||||
|| (olladdr && lladdr && llchange)) { /* (5) */
|
||||
if ((!olladdr && lladdr) || /* (3) */
|
||||
(olladdr && lladdr && llchange)) { /* (5) */
|
||||
do_update = 1;
|
||||
newstate = ND6_LLINFO_STALE;
|
||||
} else /* (1-2,4) */
|
||||
@ -1741,8 +1724,7 @@ nd6_cache_lladdr(ifp, from, lladdr, lladdrlen, type, code)
|
||||
* set the 2nd argument as the 1st one.
|
||||
*/
|
||||
nd6_output(ifp, ifp, ln->ln_hold,
|
||||
(struct sockaddr_in6 *)rt_key(rt),
|
||||
rt);
|
||||
(struct sockaddr_in6 *)rt_key(rt), rt);
|
||||
ln->ln_hold = NULL;
|
||||
}
|
||||
} else if (ln->ln_state == ND6_LLINFO_INCOMPLETE) {
|
||||
@ -1791,8 +1773,8 @@ nd6_cache_lladdr(ifp, from, lladdr, lladdrlen, type, code)
|
||||
case ND_REDIRECT:
|
||||
/*
|
||||
* If the icmp is a redirect to a better router, always set the
|
||||
* is_router flag. Otherwise, if the entry is newly created,
|
||||
* clear the flag. [RFC 2461, sec 8.3]
|
||||
* is_router flag. Otherwise, if the entry is newly created,
|
||||
* clear the flag. [RFC 2461, sec 8.3]
|
||||
*/
|
||||
if (code == ND_REDIRECT_ROUTER)
|
||||
ln->ln_router = 1;
|
||||
@ -1809,8 +1791,8 @@ nd6_cache_lladdr(ifp, from, lladdr, lladdrlen, type, code)
|
||||
/*
|
||||
* Mark an entry with lladdr as a router.
|
||||
*/
|
||||
if ((!is_newentry && (olladdr || lladdr)) /* (2-5) */
|
||||
|| (is_newentry && lladdr)) { /* (7) */
|
||||
if ((!is_newentry && (olladdr || lladdr)) || /* (2-5) */
|
||||
(is_newentry && lladdr)) { /* (7) */
|
||||
ln->ln_router = 1;
|
||||
}
|
||||
break;
|
||||
@ -1899,7 +1881,7 @@ nd6_output(ifp, origifp, m0, dst, rt0)
|
||||
if (rt->rt_ifp != ifp) {
|
||||
/* XXX: loop care? */
|
||||
return nd6_output(ifp, origifp, m0,
|
||||
dst, rt);
|
||||
dst, rt);
|
||||
}
|
||||
} else
|
||||
senderr(EHOSTUNREACH);
|
||||
@ -1933,7 +1915,8 @@ nd6_output(ifp, origifp, m0, dst, rt0)
|
||||
goto lookup;
|
||||
if (((rt = rt->rt_gwroute)->rt_flags & RTF_UP) == 0) {
|
||||
rtfree(rt); rt = rt0;
|
||||
lookup: rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1, 0UL);
|
||||
lookup:
|
||||
rt->rt_gwroute = rtalloc1(rt->rt_gateway, 1, 0UL);
|
||||
if ((rt = rt->rt_gwroute) == 0)
|
||||
senderr(EHOSTUNREACH);
|
||||
RT_UNLOCK(rt);
|
||||
@ -2026,7 +2009,7 @@ nd6_output(ifp, origifp, m0, dst, rt0)
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
|
||||
|
||||
sendpkt:
|
||||
|
||||
#ifdef MAC
|
||||
@ -2034,7 +2017,7 @@ nd6_output(ifp, origifp, m0, dst, rt0)
|
||||
#endif
|
||||
if ((ifp->if_flags & IFF_LOOPBACK) != 0) {
|
||||
return ((*ifp->if_output)(origifp, m, (struct sockaddr *)dst,
|
||||
rt));
|
||||
rt));
|
||||
}
|
||||
return ((*ifp->if_output)(ifp, m, (struct sockaddr *)dst, rt));
|
||||
|
||||
@ -2042,7 +2025,7 @@ nd6_output(ifp, origifp, m0, dst, rt0)
|
||||
if (m)
|
||||
m_freem(m);
|
||||
return (error);
|
||||
}
|
||||
}
|
||||
#undef senderr
|
||||
|
||||
int
|
||||
@ -2160,8 +2143,7 @@ nd6_sysctl_drlist(SYSCTL_HANDLER_ARGS)
|
||||
return EPERM;
|
||||
error = 0;
|
||||
|
||||
for (dr = TAILQ_FIRST(&nd_defrouter);
|
||||
dr;
|
||||
for (dr = TAILQ_FIRST(&nd_defrouter); dr;
|
||||
dr = TAILQ_NEXT(dr, dr_entry)) {
|
||||
d = (struct in6_defrouter *)buf;
|
||||
de = (struct in6_defrouter *)(buf + sizeof(buf));
|
||||
@ -2187,7 +2169,8 @@ nd6_sysctl_drlist(SYSCTL_HANDLER_ARGS)
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
return error;
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -2231,11 +2214,9 @@ nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS)
|
||||
p->flags = pr->ndpr_stateflags;
|
||||
p->origin = PR_ORIG_RA;
|
||||
advrtrs = 0;
|
||||
for (pfr = pr->ndpr_advrtrs.lh_first;
|
||||
pfr;
|
||||
for (pfr = pr->ndpr_advrtrs.lh_first; pfr;
|
||||
pfr = pfr->pfr_next) {
|
||||
if ((void *)&sin6[advrtrs + 1] >
|
||||
(void *)pe) {
|
||||
if ((void *)&sin6[advrtrs + 1] > (void *)pe) {
|
||||
advrtrs++;
|
||||
continue;
|
||||
}
|
||||
@ -2243,8 +2224,7 @@ nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS)
|
||||
bzero(s6, sizeof(*s6));
|
||||
s6->sin6_family = AF_INET6;
|
||||
s6->sin6_len = sizeof(*sin6);
|
||||
if (in6_recoverscope(s6,
|
||||
&pfr->router->rtaddr,
|
||||
if (in6_recoverscope(s6, &pfr->router->rtaddr,
|
||||
pfr->router->ifp) != 0)
|
||||
log(LOG_ERR,
|
||||
"scope error in "
|
||||
@ -2253,7 +2233,7 @@ nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS)
|
||||
advrtrs++;
|
||||
}
|
||||
p->advrtrs = advrtrs;
|
||||
} else
|
||||
} else
|
||||
panic("buffer too short");
|
||||
|
||||
advance = sizeof(*p) + sizeof(*sin6) * advrtrs;
|
||||
@ -2261,5 +2241,6 @@ nd6_sysctl_prlist(SYSCTL_HANDLER_ARGS)
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
return error;
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
@ -297,7 +297,7 @@ extern struct nd_drhead nd_defrouter;
|
||||
extern struct nd_prhead nd_prefix;
|
||||
extern int nd6_debug;
|
||||
|
||||
#define nd6log(x) do { if (nd6_debug) log x; } while (0)
|
||||
#define nd6log(x) do { if (nd6_debug) log x; } while (/*CONSTCOND*/ 0)
|
||||
|
||||
extern struct callout nd6_timer_ch;
|
||||
|
||||
@ -352,16 +352,16 @@ void nd6_timer __P((void *));
|
||||
void nd6_purge __P((struct ifnet *));
|
||||
struct llinfo_nd6 *nd6_free __P((struct rtentry *));
|
||||
void nd6_nud_hint __P((struct rtentry *, struct in6_addr *, int));
|
||||
int nd6_resolve __P((struct ifnet *, struct rtentry *,
|
||||
struct mbuf *, struct sockaddr *, u_char *));
|
||||
int nd6_resolve __P((struct ifnet *, struct rtentry *, struct mbuf *,
|
||||
struct sockaddr *, u_char *));
|
||||
void nd6_rtrequest __P((int, struct rtentry *, struct rt_addrinfo *));
|
||||
int nd6_ioctl __P((u_long, caddr_t, struct ifnet *));
|
||||
struct rtentry *nd6_cache_lladdr __P((struct ifnet *, struct in6_addr *,
|
||||
char *, int, int, int));
|
||||
int nd6_output __P((struct ifnet *, struct ifnet *, struct mbuf *,
|
||||
struct sockaddr_in6 *, struct rtentry *));
|
||||
struct sockaddr_in6 *, struct rtentry *));
|
||||
int nd6_storelladdr __P((struct ifnet *, struct rtentry *, struct mbuf *,
|
||||
struct sockaddr *, u_char *));
|
||||
struct sockaddr *, u_char *));
|
||||
int nd6_need_cache __P((struct ifnet *));
|
||||
|
||||
/* nd6_nbr.c */
|
||||
@ -386,16 +386,15 @@ void defrouter_select __P((void));
|
||||
void defrtrlist_del __P((struct nd_defrouter *));
|
||||
void prelist_remove __P((struct nd_prefix *));
|
||||
int prelist_update __P((struct nd_prefix *, struct nd_defrouter *,
|
||||
struct mbuf *));
|
||||
struct mbuf *));
|
||||
int nd6_prelist_add __P((struct nd_prefix *, struct nd_defrouter *,
|
||||
struct nd_prefix **));
|
||||
struct nd_prefix **));
|
||||
int nd6_prefix_onlink __P((struct nd_prefix *));
|
||||
int nd6_prefix_offlink __P((struct nd_prefix *));
|
||||
void pfxlist_onlink_check __P((void));
|
||||
struct nd_defrouter *defrouter_lookup __P((struct in6_addr *,
|
||||
struct ifnet *));
|
||||
struct nd_defrouter *defrouter_lookup __P((struct in6_addr *, struct ifnet *));
|
||||
struct nd_prefix *nd6_prefix_lookup __P((struct nd_prefix *));
|
||||
int in6_init_prefix_ltimes __P((struct nd_prefix *ndpr));
|
||||
int in6_init_prefix_ltimes __P((struct nd_prefix *));
|
||||
void rt6_flush __P((struct in6_addr *, struct ifnet *));
|
||||
int nd6_setdefaultiface __P((int));
|
||||
int in6_tmpifadd __P((const struct in6_ifaddr *, int));
|
||||
|
@ -132,15 +132,15 @@ nd6_ns_input(m, off, icmp6len)
|
||||
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&saddr6)) {
|
||||
/* dst has to be solicited node multicast address. */
|
||||
if (daddr6.s6_addr16[0] == IPV6_ADDR_INT16_MLL
|
||||
if (daddr6.s6_addr16[0] == IPV6_ADDR_INT16_MLL &&
|
||||
/* don't check ifindex portion */
|
||||
&& daddr6.s6_addr32[1] == 0
|
||||
&& daddr6.s6_addr32[2] == IPV6_ADDR_INT32_ONE
|
||||
&& daddr6.s6_addr8[12] == 0xff) {
|
||||
daddr6.s6_addr32[1] == 0 &&
|
||||
daddr6.s6_addr32[2] == IPV6_ADDR_INT32_ONE &&
|
||||
daddr6.s6_addr8[12] == 0xff) {
|
||||
; /* good */
|
||||
} else {
|
||||
nd6log((LOG_INFO, "nd6_ns_input: bad DAD packet "
|
||||
"(wrong ip6 dst)\n"));
|
||||
"(wrong ip6 dst)\n"));
|
||||
goto bad;
|
||||
}
|
||||
}
|
||||
@ -166,7 +166,7 @@ nd6_ns_input(m, off, icmp6len)
|
||||
lladdr = (char *)(ndopts.nd_opts_src_lladdr + 1);
|
||||
lladdrlen = ndopts.nd_opts_src_lladdr->nd_opt_len << 3;
|
||||
}
|
||||
|
||||
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_src) && lladdr) {
|
||||
nd6log((LOG_INFO, "nd6_ns_input: bad DAD packet "
|
||||
"(link-layer address option)\n"));
|
||||
@ -244,17 +244,16 @@ nd6_ns_input(m, off, icmp6len)
|
||||
goto freeit;
|
||||
|
||||
if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) {
|
||||
nd6log((LOG_INFO,
|
||||
"nd6_ns_input: lladdrlen mismatch for %s "
|
||||
nd6log((LOG_INFO, "nd6_ns_input: lladdrlen mismatch for %s "
|
||||
"(if %d, NS packet %d)\n",
|
||||
ip6_sprintf(&taddr6), ifp->if_addrlen, lladdrlen - 2));
|
||||
ip6_sprintf(&taddr6),
|
||||
ifp->if_addrlen, lladdrlen - 2));
|
||||
goto bad;
|
||||
}
|
||||
|
||||
if (IN6_ARE_ADDR_EQUAL(&myaddr6, &saddr6)) {
|
||||
nd6log((LOG_INFO,
|
||||
"nd6_ns_input: duplicate IP6 address %s\n",
|
||||
ip6_sprintf(&saddr6)));
|
||||
nd6log((LOG_INFO, "nd6_ns_input: duplicate IP6 address %s\n",
|
||||
ip6_sprintf(&saddr6)));
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
@ -296,20 +295,19 @@ nd6_ns_input(m, off, icmp6len)
|
||||
saddr6 = in6addr_linklocal_allnodes;
|
||||
saddr6.s6_addr16[1] = htons(ifp->if_index);
|
||||
nd6_na_output(ifp, &saddr6, &taddr6,
|
||||
((anycast || proxy || !tlladdr)
|
||||
? 0 : ND_NA_FLAG_OVERRIDE)
|
||||
| (ip6_forwarding ? ND_NA_FLAG_ROUTER : 0),
|
||||
tlladdr, (struct sockaddr *)proxydl);
|
||||
((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
|
||||
(ip6_forwarding ? ND_NA_FLAG_ROUTER : 0),
|
||||
tlladdr, (struct sockaddr *)proxydl);
|
||||
goto freeit;
|
||||
}
|
||||
|
||||
nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen, ND_NEIGHBOR_SOLICIT, 0);
|
||||
nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen,
|
||||
ND_NEIGHBOR_SOLICIT, 0);
|
||||
|
||||
nd6_na_output(ifp, &saddr6, &taddr6,
|
||||
((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE)
|
||||
| (ip6_forwarding ? ND_NA_FLAG_ROUTER : 0)
|
||||
| ND_NA_FLAG_SOLICITED,
|
||||
tlladdr, (struct sockaddr *)proxydl);
|
||||
((anycast || proxy || !tlladdr) ? 0 : ND_NA_FLAG_OVERRIDE) |
|
||||
(ip6_forwarding ? ND_NA_FLAG_ROUTER : 0) | ND_NA_FLAG_SOLICITED,
|
||||
tlladdr, (struct sockaddr *)proxydl);
|
||||
freeit:
|
||||
m_freem(m);
|
||||
return;
|
||||
@ -347,7 +345,7 @@ nd6_ns_output(ifp, daddr6, taddr6, ln, dad)
|
||||
int maxlen;
|
||||
caddr_t mac;
|
||||
struct ifnet *outif = NULL;
|
||||
|
||||
|
||||
if (IN6_IS_ADDR_MULTICAST(taddr6))
|
||||
return;
|
||||
|
||||
@ -404,20 +402,6 @@ nd6_ns_output(ifp, daddr6, taddr6, ln, dad)
|
||||
ip6->ip6_dst.s6_addr8[12] = 0xff;
|
||||
}
|
||||
if (!dad) {
|
||||
#if 0 /* KAME way, exact address scope match */
|
||||
/*
|
||||
* Select a source whose scope is the same as that of the dest.
|
||||
* Typically, the dest is link-local solicitation multicast
|
||||
* (i.e. neighbor discovery) or link-local/global unicast
|
||||
* (i.e. neighbor un-reachability detection).
|
||||
*/
|
||||
ia = in6_ifawithifp(ifp, &ip6->ip6_dst);
|
||||
if (ia == NULL) {
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
ip6->ip6_src = ia->ia_addr.sin6_addr;
|
||||
#else /* spec-wise correct */
|
||||
/*
|
||||
* RFC2461 7.2.2:
|
||||
* "If the source address of the packet prompting the
|
||||
@ -455,7 +439,6 @@ nd6_ns_output(ifp, daddr6, taddr6, ln, dad)
|
||||
}
|
||||
ip6->ip6_src = ia->ia_addr.sin6_addr;
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
/*
|
||||
* Source address for DAD packet must always be IPv6
|
||||
@ -489,7 +472,7 @@ nd6_ns_output(ifp, daddr6, taddr6, ln, dad)
|
||||
struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)(nd_ns + 1);
|
||||
/* 8 byte alignments... */
|
||||
optlen = (optlen + 7) & ~7;
|
||||
|
||||
|
||||
m->m_pkthdr.len += optlen;
|
||||
m->m_len += optlen;
|
||||
icmp6len += optlen;
|
||||
@ -501,8 +484,8 @@ nd6_ns_output(ifp, daddr6, taddr6, ln, dad)
|
||||
|
||||
ip6->ip6_plen = htons((u_short)icmp6len);
|
||||
nd_ns->nd_ns_cksum = 0;
|
||||
nd_ns->nd_ns_cksum
|
||||
= in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6), icmp6len);
|
||||
nd_ns->nd_ns_cksum =
|
||||
in6_cksum(m, IPPROTO_ICMPV6, sizeof(*ip6), icmp6len);
|
||||
|
||||
ip6_output(m, NULL, NULL, dad ? IPV6_DADOUTPUT : 0, &im6o, &outif, NULL);
|
||||
if (outif) {
|
||||
@ -530,9 +513,6 @@ nd6_na_input(m, off, icmp6len)
|
||||
struct ifnet *ifp = m->m_pkthdr.rcvif;
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct nd_neighbor_advert *nd_na;
|
||||
#if 0
|
||||
struct in6_addr saddr6 = ip6->ip6_src;
|
||||
#endif
|
||||
struct in6_addr daddr6 = ip6->ip6_dst;
|
||||
struct in6_addr taddr6;
|
||||
int flags;
|
||||
@ -627,15 +607,15 @@ nd6_na_input(m, off, icmp6len)
|
||||
}
|
||||
|
||||
if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) {
|
||||
nd6log((LOG_INFO,
|
||||
"nd6_na_input: lladdrlen mismatch for %s "
|
||||
"(if %d, NA packet %d)\n",
|
||||
ip6_sprintf(&taddr6), ifp->if_addrlen, lladdrlen - 2));
|
||||
nd6log((LOG_INFO, "nd6_na_input: lladdrlen mismatch for %s "
|
||||
"(if %d, NA packet %d)\n", ip6_sprintf(&taddr6),
|
||||
ifp->if_addrlen, lladdrlen - 2));
|
||||
goto bad;
|
||||
}
|
||||
|
||||
/*
|
||||
* If no neighbor cache entry is found, NA SHOULD silently be discarded.
|
||||
* If no neighbor cache entry is found, NA SHOULD silently be
|
||||
* discarded.
|
||||
*/
|
||||
rt = nd6_lookup(&taddr6, 0, ifp);
|
||||
if ((rt == NULL) ||
|
||||
@ -659,9 +639,10 @@ nd6_na_input(m, off, icmp6len)
|
||||
if (is_solicited) {
|
||||
ln->ln_state = ND6_LLINFO_REACHABLE;
|
||||
ln->ln_byhint = 0;
|
||||
if (ln->ln_expire)
|
||||
if (ln->ln_expire) {
|
||||
ln->ln_expire = time_second +
|
||||
nd_ifinfo[rt->rt_ifp->if_index].reachable;
|
||||
}
|
||||
} else {
|
||||
ln->ln_state = ND6_LLINFO_STALE;
|
||||
ln->ln_expire = time_second + nd6_gctimer;
|
||||
@ -768,7 +749,7 @@ nd6_na_input(m, off, icmp6len)
|
||||
* Lock to protect the default router list.
|
||||
* XXX: this might be unnecessary, since this function
|
||||
* is only called under the network software interrupt
|
||||
* context. However, we keep it just for safety.
|
||||
* context. However, we keep it just for safety.
|
||||
*/
|
||||
s = splnet();
|
||||
dr = defrouter_lookup(in6, rt->rt_ifp);
|
||||
@ -797,7 +778,7 @@ nd6_na_input(m, off, icmp6len)
|
||||
*/
|
||||
nd6_output(ifp, ifp, ln->ln_hold,
|
||||
(struct sockaddr_in6 *)rt_key(rt), rt);
|
||||
ln->ln_hold = 0;
|
||||
ln->ln_hold = NULL;
|
||||
}
|
||||
|
||||
freeit:
|
||||
@ -928,7 +909,7 @@ nd6_na_output(ifp, daddr6, taddr6, flags, tlladdr, sdl0)
|
||||
if (tlladdr && mac) {
|
||||
int optlen = sizeof(struct nd_opt_hdr) + ifp->if_addrlen;
|
||||
struct nd_opt_hdr *nd_opt = (struct nd_opt_hdr *)(nd_na + 1);
|
||||
|
||||
|
||||
/* roundup to 8 bytes alignment! */
|
||||
optlen = (optlen + 7) & ~7;
|
||||
|
||||
@ -946,7 +927,7 @@ nd6_na_output(ifp, daddr6, taddr6, flags, tlladdr, sdl0)
|
||||
nd_na->nd_na_flags_reserved = flags;
|
||||
nd_na->nd_na_cksum = 0;
|
||||
nd_na->nd_na_cksum =
|
||||
in6_cksum(m, IPPROTO_ICMPV6, sizeof(struct ip6_hdr), icmp6len);
|
||||
in6_cksum(m, IPPROTO_ICMPV6, sizeof(struct ip6_hdr), icmp6len);
|
||||
|
||||
ip6_output(m, NULL, NULL, 0, &im6o, &outif, NULL);
|
||||
if (outif) {
|
||||
@ -973,7 +954,6 @@ nd6_ifptomac(ifp)
|
||||
#endif
|
||||
case IFT_ISO88025:
|
||||
return ((caddr_t)(ifp + 1));
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@ -1065,8 +1045,9 @@ nd6_dad_start(ifa, tick)
|
||||
}
|
||||
if (!ifa->ifa_ifp)
|
||||
panic("nd6_dad_start: ifa->ifa_ifp == NULL");
|
||||
if (!(ifa->ifa_ifp->if_flags & IFF_UP))
|
||||
if (!(ifa->ifa_ifp->if_flags & IFF_UP)) {
|
||||
return;
|
||||
}
|
||||
if (nd6_dad_find(ifa) != NULL) {
|
||||
/* DAD already in progress */
|
||||
return;
|
||||
@ -1177,7 +1158,7 @@ nd6_dad_timer(ifa)
|
||||
/* timeouted with IFF_{RUNNING,UP} check */
|
||||
if (dp->dad_ns_tcount > dad_maxtry) {
|
||||
nd6log((LOG_INFO, "%s: could not run DAD, driver problem?\n",
|
||||
if_name(ifa->ifa_ifp)));
|
||||
if_name(ifa->ifa_ifp)));
|
||||
|
||||
TAILQ_REMOVE(&dadq, (struct dadq *)dp, dad_list);
|
||||
free(dp, M_IP6NDP);
|
||||
@ -1192,7 +1173,7 @@ nd6_dad_timer(ifa)
|
||||
* We have more NS to go. Send NS packet for DAD.
|
||||
*/
|
||||
nd6_dad_ns_output(dp, ifa);
|
||||
nd6_dad_starttimer(dp,
|
||||
nd6_dad_starttimer(dp,
|
||||
nd_ifinfo[ifa->ifa_ifp->if_index].retrans * hz / 1000);
|
||||
} else {
|
||||
/*
|
||||
@ -1226,9 +1207,9 @@ nd6_dad_timer(ifa)
|
||||
&& dp->dad_ns_icount == dp->dad_count
|
||||
&& dp->dad_na_icount == 0) {
|
||||
log(LOG_INFO, "DAD questionable for %s(%s): "
|
||||
"network card loops back multicast?\n",
|
||||
ip6_sprintf(&ia->ia_addr.sin6_addr),
|
||||
if_name(ifa->ifa_ifp));
|
||||
"network card loops back multicast?\n",
|
||||
ip6_sprintf(&ia->ia_addr.sin6_addr),
|
||||
if_name(ifa->ifa_ifp));
|
||||
/* XXX consider it a duplicate or not? */
|
||||
/* duplicate++; */
|
||||
} else {
|
||||
|
@ -76,8 +76,8 @@ static struct nd_pfxrouter *find_pfxlist_reachable_router
|
||||
static void defrouter_addifreq __P((struct ifnet *));
|
||||
static void nd6_rtmsg __P((int, struct rtentry *));
|
||||
|
||||
static void in6_init_address_ltimes __P((struct nd_prefix *ndpr,
|
||||
struct in6_addrlifetime *lt6));
|
||||
static void in6_init_address_ltimes __P((struct nd_prefix *,
|
||||
struct in6_addrlifetime *));
|
||||
|
||||
static int rt6_deleteroute __P((struct radix_node *, void *));
|
||||
|
||||
@ -114,9 +114,6 @@ nd6_rs_input(m, off, icmp6len)
|
||||
struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
|
||||
struct nd_router_solicit *nd_rs;
|
||||
struct in6_addr saddr6 = ip6->ip6_src;
|
||||
#if 0
|
||||
struct in6_addr daddr6 = ip6->ip6_dst;
|
||||
#endif
|
||||
char *lladdr = NULL;
|
||||
int lladdrlen = 0;
|
||||
#if 0
|
||||
@ -176,7 +173,8 @@ nd6_rs_input(m, off, icmp6len)
|
||||
nd6log((LOG_INFO,
|
||||
"nd6_rs_input: lladdrlen mismatch for %s "
|
||||
"(if %d, RS packet %d)\n",
|
||||
ip6_sprintf(&saddr6), ifp->if_addrlen, lladdrlen - 2));
|
||||
ip6_sprintf(&saddr6),
|
||||
ifp->if_addrlen, lladdrlen - 2));
|
||||
goto bad;
|
||||
}
|
||||
|
||||
@ -350,17 +348,14 @@ nd6_ra_input(m, off, icmp6len)
|
||||
pr.ndpr_ifp = (struct ifnet *)m->m_pkthdr.rcvif;
|
||||
|
||||
pr.ndpr_raf_onlink = (pi->nd_opt_pi_flags_reserved &
|
||||
ND_OPT_PI_FLAG_ONLINK) ? 1 : 0;
|
||||
ND_OPT_PI_FLAG_ONLINK) ? 1 : 0;
|
||||
pr.ndpr_raf_auto = (pi->nd_opt_pi_flags_reserved &
|
||||
ND_OPT_PI_FLAG_AUTO) ? 1 : 0;
|
||||
ND_OPT_PI_FLAG_AUTO) ? 1 : 0;
|
||||
pr.ndpr_plen = pi->nd_opt_pi_prefix_len;
|
||||
pr.ndpr_vltime = ntohl(pi->nd_opt_pi_valid_time);
|
||||
pr.ndpr_pltime =
|
||||
ntohl(pi->nd_opt_pi_preferred_time);
|
||||
|
||||
pr.ndpr_pltime = ntohl(pi->nd_opt_pi_preferred_time);
|
||||
if (in6_init_prefix_ltimes(&pr))
|
||||
continue; /* prefix lifetime init failed */
|
||||
|
||||
(void)prelist_update(&pr, dr, m);
|
||||
}
|
||||
}
|
||||
@ -369,7 +364,9 @@ nd6_ra_input(m, off, icmp6len)
|
||||
* MTU
|
||||
*/
|
||||
if (ndopts.nd_opts_mtu && ndopts.nd_opts_mtu->nd_opt_mtu_len == 1) {
|
||||
u_int32_t mtu = ntohl(ndopts.nd_opts_mtu->nd_opt_mtu_mtu);
|
||||
u_int32_t mtu;
|
||||
|
||||
mtu = ntohl(ndopts.nd_opts_mtu->nd_opt_mtu_mtu);
|
||||
|
||||
/* lower bound */
|
||||
if (mtu < IPV6_MMTU) {
|
||||
@ -403,14 +400,14 @@ nd6_ra_input(m, off, icmp6len)
|
||||
}
|
||||
|
||||
skip:
|
||||
|
||||
|
||||
/*
|
||||
* Source link layer address
|
||||
*/
|
||||
{
|
||||
char *lladdr = NULL;
|
||||
int lladdrlen = 0;
|
||||
|
||||
|
||||
if (ndopts.nd_opts_src_lladdr) {
|
||||
lladdr = (char *)(ndopts.nd_opts_src_lladdr + 1);
|
||||
lladdrlen = ndopts.nd_opts_src_lladdr->nd_opt_len << 3;
|
||||
@ -419,12 +416,13 @@ nd6_ra_input(m, off, icmp6len)
|
||||
if (lladdr && ((ifp->if_addrlen + 2 + 7) & ~7) != lladdrlen) {
|
||||
nd6log((LOG_INFO,
|
||||
"nd6_ra_input: lladdrlen mismatch for %s "
|
||||
"(if %d, RA packet %d)\n",
|
||||
ip6_sprintf(&saddr6), ifp->if_addrlen, lladdrlen - 2));
|
||||
"(if %d, RA packet %d)\n", ip6_sprintf(&saddr6),
|
||||
ifp->if_addrlen, lladdrlen - 2));
|
||||
goto bad;
|
||||
}
|
||||
|
||||
nd6_cache_lladdr(ifp, &saddr6, lladdr, lladdrlen, ND_ROUTER_ADVERT, 0);
|
||||
nd6_cache_lladdr(ifp, &saddr6, lladdr,
|
||||
lladdrlen, ND_ROUTER_ADVERT, 0);
|
||||
|
||||
/*
|
||||
* Installing a link-layer address might change the state of the
|
||||
@ -477,14 +475,14 @@ defrouter_addreq(new)
|
||||
Bzero(&mask, sizeof(mask));
|
||||
Bzero(&gate, sizeof(gate));
|
||||
|
||||
def.sin6_len = mask.sin6_len = gate.sin6_len
|
||||
= sizeof(struct sockaddr_in6);
|
||||
def.sin6_len = mask.sin6_len = gate.sin6_len =
|
||||
sizeof(struct sockaddr_in6);
|
||||
def.sin6_family = mask.sin6_family = gate.sin6_family = AF_INET6;
|
||||
gate.sin6_addr = new->rtaddr;
|
||||
|
||||
(void)rtrequest(RTM_ADD, (struct sockaddr *)&def,
|
||||
(struct sockaddr *)&gate, (struct sockaddr *)&mask,
|
||||
RTF_GATEWAY, &newrt);
|
||||
(struct sockaddr *)&gate, (struct sockaddr *)&mask,
|
||||
RTF_GATEWAY, &newrt);
|
||||
if (newrt) {
|
||||
RT_LOCK(newrt);
|
||||
nd6_rtmsg(RTM_ADD, newrt); /* tell user process */
|
||||
@ -524,7 +522,7 @@ defrouter_addifreq(ifp)
|
||||
|
||||
flags = ifa->ifa_flags;
|
||||
error = rtrequest(RTM_ADD, (struct sockaddr *)&def, ifa->ifa_addr,
|
||||
(struct sockaddr *)&mask, flags, &newrt);
|
||||
(struct sockaddr *)&mask, flags, &newrt);
|
||||
if (error != 0) {
|
||||
nd6log((LOG_ERR,
|
||||
"defrouter_addifreq: failed to install a route to "
|
||||
@ -568,15 +566,14 @@ defrouter_delreq(dr, dofree)
|
||||
Bzero(&mask, sizeof(mask));
|
||||
Bzero(&gate, sizeof(gate));
|
||||
|
||||
def.sin6_len = mask.sin6_len = gate.sin6_len
|
||||
= sizeof(struct sockaddr_in6);
|
||||
def.sin6_len = mask.sin6_len = gate.sin6_len =
|
||||
sizeof(struct sockaddr_in6);
|
||||
def.sin6_family = mask.sin6_family = gate.sin6_family = AF_INET6;
|
||||
gate.sin6_addr = dr->rtaddr;
|
||||
|
||||
rtrequest(RTM_DELETE, (struct sockaddr *)&def,
|
||||
(struct sockaddr *)&gate,
|
||||
(struct sockaddr *)&mask,
|
||||
RTF_GATEWAY, &oldrt);
|
||||
(struct sockaddr *)&gate,
|
||||
(struct sockaddr *)&mask, RTF_GATEWAY, &oldrt);
|
||||
if (oldrt) {
|
||||
nd6_rtmsg(RTM_DELETE, oldrt);
|
||||
RTFREE(oldrt);
|
||||
@ -597,10 +594,8 @@ defrtrlist_del(dr)
|
||||
* Flush all the routing table entries that use the router
|
||||
* as a next hop.
|
||||
*/
|
||||
if (!ip6_forwarding && ip6_accept_rtadv) {
|
||||
/* above is a good condition? */
|
||||
if (!ip6_forwarding && ip6_accept_rtadv) /* XXX: better condition? */
|
||||
rt6_flush(&dr->rtaddr, dr->ifp);
|
||||
}
|
||||
|
||||
if (dr == TAILQ_FIRST(&nd_defrouter))
|
||||
deldr = dr; /* The router is primary. */
|
||||
@ -755,7 +750,7 @@ defrtrlist_update(new)
|
||||
if (TAILQ_FIRST(&nd_defrouter) == n)
|
||||
defrouter_select();
|
||||
splx(s);
|
||||
|
||||
|
||||
return (n);
|
||||
}
|
||||
|
||||
@ -765,7 +760,7 @@ pfxrtr_lookup(pr, dr)
|
||||
struct nd_defrouter *dr;
|
||||
{
|
||||
struct nd_pfxrouter *search;
|
||||
|
||||
|
||||
for (search = pr->ndpr_advrtrs.lh_first; search; search = search->pfr_next) {
|
||||
if (search->router == dr)
|
||||
break;
|
||||
@ -810,9 +805,7 @@ nd6_prefix_lookup(pr)
|
||||
if (pr->ndpr_ifp == search->ndpr_ifp &&
|
||||
pr->ndpr_plen == search->ndpr_plen &&
|
||||
in6_are_prefix_equal(&pr->ndpr_prefix.sin6_addr,
|
||||
&search->ndpr_prefix.sin6_addr,
|
||||
pr->ndpr_plen)
|
||||
) {
|
||||
&search->ndpr_prefix.sin6_addr, pr->ndpr_plen)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -830,19 +823,19 @@ nd6_prelist_add(pr, dr, newp)
|
||||
|
||||
new = (struct nd_prefix *)malloc(sizeof(*new), M_IP6NDP, M_NOWAIT);
|
||||
if (new == NULL)
|
||||
return ENOMEM;
|
||||
return(ENOMEM);
|
||||
bzero(new, sizeof(*new));
|
||||
*new = *pr;
|
||||
if (newp != NULL)
|
||||
*newp = new;
|
||||
|
||||
/* initilization */
|
||||
/* initialization */
|
||||
LIST_INIT(&new->ndpr_advrtrs);
|
||||
in6_prefixlen2mask(&new->ndpr_mask, new->ndpr_plen);
|
||||
/* make prefix in the canonical form */
|
||||
for (i = 0; i < 4; i++)
|
||||
new->ndpr_prefix.sin6_addr.s6_addr32[i] &=
|
||||
new->ndpr_mask.s6_addr32[i];
|
||||
new->ndpr_mask.s6_addr32[i];
|
||||
|
||||
s = splnet();
|
||||
/* link ndpr_entry to nd_prefix list */
|
||||
@ -862,9 +855,8 @@ nd6_prelist_add(pr, dr, newp)
|
||||
}
|
||||
}
|
||||
|
||||
if (dr) {
|
||||
if (dr)
|
||||
pfxrtr_add(new, dr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -940,12 +932,11 @@ prelist_update(new, dr, m)
|
||||
* both IP header and IP datagrams, doesn't it ?
|
||||
*/
|
||||
#if defined(M_AUTHIPHDR) && defined(M_AUTHIPDGM)
|
||||
auth = (m->m_flags & M_AUTHIPHDR
|
||||
&& m->m_flags & M_AUTHIPDGM) ? 1 : 0;
|
||||
auth = ((m->m_flags & M_AUTHIPHDR) &&
|
||||
(m->m_flags & M_AUTHIPDGM));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
if ((pr = nd6_prefix_lookup(new)) != NULL) {
|
||||
/*
|
||||
* nd6_prefix_lookup() ensures that pr and new have the same
|
||||
@ -1003,8 +994,8 @@ prelist_update(new, dr, m)
|
||||
"nd6_prelist_add failed for %s/%d on %s "
|
||||
"errno=%d, returnpr=%p\n",
|
||||
ip6_sprintf(&new->ndpr_prefix.sin6_addr),
|
||||
new->ndpr_plen, if_name(new->ndpr_ifp),
|
||||
error, newpr));
|
||||
new->ndpr_plen, if_name(new->ndpr_ifp),
|
||||
error, newpr));
|
||||
goto end; /* we should just give up in this case. */
|
||||
}
|
||||
|
||||
@ -1012,7 +1003,7 @@ prelist_update(new, dr, m)
|
||||
* XXX: from the ND point of view, we can ignore a prefix
|
||||
* with the on-link bit being zero. However, we need a
|
||||
* prefix structure for references from autoconfigured
|
||||
* addresses. Thus, we explicitly make suret that the prefix
|
||||
* addresses. Thus, we explicitly make sure that the prefix
|
||||
* itself expires now.
|
||||
*/
|
||||
if (newpr->ndpr_raf_onlink == 0) {
|
||||
@ -1049,8 +1040,7 @@ prelist_update(new, dr, m)
|
||||
* form an address. Note that even a manually configured address
|
||||
* should reject autoconfiguration of a new address.
|
||||
*/
|
||||
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list)
|
||||
{
|
||||
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
|
||||
struct in6_ifaddr *ifa6;
|
||||
int ifa_plen;
|
||||
u_int32_t storedlifetime;
|
||||
@ -1067,12 +1057,11 @@ prelist_update(new, dr, m)
|
||||
*/
|
||||
if ((ifa6->ia6_flags & IN6_IFF_ANYCAST) != 0)
|
||||
continue;
|
||||
|
||||
|
||||
ifa_plen = in6_mask2len(&ifa6->ia_prefixmask.sin6_addr, NULL);
|
||||
if (ifa_plen != new->ndpr_plen ||
|
||||
!in6_are_prefix_equal(&ifa6->ia_addr.sin6_addr,
|
||||
&new->ndpr_prefix.sin6_addr,
|
||||
ifa_plen))
|
||||
&new->ndpr_prefix.sin6_addr, ifa_plen))
|
||||
continue;
|
||||
|
||||
if (ia6_match == NULL) /* remember the first one */
|
||||
@ -1140,13 +1129,13 @@ prelist_update(new, dr, m)
|
||||
lt6_tmp.ia6t_expire >
|
||||
ifa6->ia6_lifetime.ia6t_expire) {
|
||||
lt6_tmp.ia6t_expire =
|
||||
ifa6->ia6_lifetime.ia6t_expire;
|
||||
ifa6->ia6_lifetime.ia6t_expire;
|
||||
}
|
||||
if (lt6_tmp.ia6t_preferred == 0 || /* no expire */
|
||||
lt6_tmp.ia6t_preferred >
|
||||
ifa6->ia6_lifetime.ia6t_preferred) {
|
||||
lt6_tmp.ia6t_preferred =
|
||||
ifa6->ia6_lifetime.ia6t_preferred;
|
||||
ifa6->ia6_lifetime.ia6t_preferred;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1164,11 +1153,6 @@ prelist_update(new, dr, m)
|
||||
pr->ndpr_refcnt++;
|
||||
ia6->ia6_ndpr = pr;
|
||||
|
||||
#if 0
|
||||
/* XXXYYY Don't do this, according to Jinmei. */
|
||||
pr->ndpr_addr = new->ndpr_addr;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* RFC 3041 3.3 (2).
|
||||
* When a new public address is created as described
|
||||
@ -1226,14 +1210,13 @@ find_pfxlist_reachable_router(pr)
|
||||
for (pfxrtr = LIST_FIRST(&pr->ndpr_advrtrs); pfxrtr;
|
||||
pfxrtr = LIST_NEXT(pfxrtr, pfr_entry)) {
|
||||
if ((rt = nd6_lookup(&pfxrtr->router->rtaddr, 0,
|
||||
pfxrtr->router->ifp)) &&
|
||||
pfxrtr->router->ifp)) &&
|
||||
(ln = (struct llinfo_nd6 *)rt->rt_llinfo) &&
|
||||
ND6_IS_LLINFO_PROBREACH(ln))
|
||||
break; /* found */
|
||||
}
|
||||
|
||||
return (pfxrtr);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1352,7 +1335,7 @@ pfxlist_onlink_check()
|
||||
* The precise detection logic is same as the one for prefixes.
|
||||
*/
|
||||
for (ifa = in6_ifaddr; ifa; ifa = ifa->ia_next) {
|
||||
if ((ifa->ia6_flags & IN6_IFF_AUTOCONF) == 0)
|
||||
if (!(ifa->ia6_flags & IN6_IFF_AUTOCONF))
|
||||
continue;
|
||||
|
||||
if (ifa->ia6_ndpr == NULL) {
|
||||
@ -1427,22 +1410,19 @@ nd6_prefix_onlink(pr)
|
||||
|
||||
if (opr->ndpr_plen == pr->ndpr_plen &&
|
||||
in6_are_prefix_equal(&pr->ndpr_prefix.sin6_addr,
|
||||
&opr->ndpr_prefix.sin6_addr,
|
||||
pr->ndpr_plen))
|
||||
&opr->ndpr_prefix.sin6_addr, pr->ndpr_plen))
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* We prefer link-local addresses as the associated interface address.
|
||||
* We prefer link-local addresses as the associated interface address.
|
||||
*/
|
||||
/* search for a link-local addr */
|
||||
ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp,
|
||||
IN6_IFF_NOTREADY|
|
||||
IN6_IFF_ANYCAST);
|
||||
IN6_IFF_NOTREADY | IN6_IFF_ANYCAST);
|
||||
if (ifa == NULL) {
|
||||
/* XXX: freebsd does not have ifa_ifwithaf */
|
||||
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list)
|
||||
{
|
||||
TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
|
||||
if (ifa->ifa_addr->sa_family == AF_INET6)
|
||||
break;
|
||||
}
|
||||
@ -1481,14 +1461,12 @@ nd6_prefix_onlink(pr)
|
||||
rtflags &= ~RTF_CLONING;
|
||||
}
|
||||
error = rtrequest(RTM_ADD, (struct sockaddr *)&pr->ndpr_prefix,
|
||||
ifa->ifa_addr, (struct sockaddr *)&mask6,
|
||||
rtflags, &rt);
|
||||
ifa->ifa_addr, (struct sockaddr *)&mask6, rtflags, &rt);
|
||||
if (error == 0) {
|
||||
if (rt != NULL) /* this should be non NULL, though */
|
||||
nd6_rtmsg(RTM_ADD, rt);
|
||||
pr->ndpr_stateflags |= NDPRF_ONLINK;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
nd6log((LOG_ERR, "nd6_prefix_onlink: failed to add route for a"
|
||||
" prefix (%s/%d) on %s, gw=%s, mask=%s, flags=%lx "
|
||||
"errno = %d\n",
|
||||
@ -1529,13 +1507,13 @@ nd6_prefix_offlink(pr)
|
||||
sa6.sin6_family = AF_INET6;
|
||||
sa6.sin6_len = sizeof(sa6);
|
||||
bcopy(&pr->ndpr_prefix.sin6_addr, &sa6.sin6_addr,
|
||||
sizeof(struct in6_addr));
|
||||
sizeof(struct in6_addr));
|
||||
bzero(&mask6, sizeof(mask6));
|
||||
mask6.sin6_family = AF_INET6;
|
||||
mask6.sin6_len = sizeof(sa6);
|
||||
bcopy(&pr->ndpr_mask, &mask6.sin6_addr, sizeof(struct in6_addr));
|
||||
error = rtrequest(RTM_DELETE, (struct sockaddr *)&sa6, NULL,
|
||||
(struct sockaddr *)&mask6, 0, &rt);
|
||||
(struct sockaddr *)&mask6, 0, &rt);
|
||||
if (error == 0) {
|
||||
pr->ndpr_stateflags &= ~NDPRF_ONLINK;
|
||||
|
||||
@ -1566,8 +1544,7 @@ nd6_prefix_offlink(pr)
|
||||
|
||||
if (opr->ndpr_plen == pr->ndpr_plen &&
|
||||
in6_are_prefix_equal(&pr->ndpr_prefix.sin6_addr,
|
||||
&opr->ndpr_prefix.sin6_addr,
|
||||
pr->ndpr_plen)) {
|
||||
&opr->ndpr_prefix.sin6_addr, pr->ndpr_plen)) {
|
||||
int e;
|
||||
|
||||
if ((e = nd6_prefix_onlink(opr)) != 0) {
|
||||
@ -1581,8 +1558,7 @@ nd6_prefix_offlink(pr)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* XXX: can we still set the NDPRF_ONLINK flag? */
|
||||
nd6log((LOG_ERR,
|
||||
"nd6_prefix_offlink: failed to delete route: "
|
||||
@ -1591,8 +1567,9 @@ nd6_prefix_offlink(pr)
|
||||
error));
|
||||
}
|
||||
|
||||
if (rt != NULL)
|
||||
if (rt != NULL) {
|
||||
RTFREE(rt);
|
||||
}
|
||||
|
||||
return (error);
|
||||
}
|
||||
@ -1624,7 +1601,7 @@ in6_ifadd(pr, ifid)
|
||||
* (2) RFC2462 5.4 suggesting the use of the same interface identifier
|
||||
* for multiple addresses on a single interface, and possible shortcut
|
||||
* of DAD. we omitted DAD for this reason in the past.
|
||||
* (3) a user can prevent autoconfiguration of global address
|
||||
* (3) a user can prevent autoconfiguration of global address
|
||||
* by removing link-local address by hand (this is partly because we
|
||||
* don't have other way to control the use of IPv6 on an interface.
|
||||
* this has been our design choice - cf. NRL's "ifconfig auto").
|
||||
@ -1636,7 +1613,7 @@ in6_ifadd(pr, ifid)
|
||||
* ID. This is to not break connections when moving addresses between
|
||||
* interfaces.
|
||||
*/
|
||||
ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp, 0);/* 0 is OK? */
|
||||
ifa = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp, 0); /* 0 is OK? */
|
||||
if (ifa)
|
||||
ib = (struct in6_ifaddr *)ifa;
|
||||
else
|
||||
@ -1671,7 +1648,7 @@ in6_ifadd(pr, ifid)
|
||||
ifra.ifra_addr.sin6_len = sizeof(struct sockaddr_in6);
|
||||
/* prefix */
|
||||
bcopy(&pr->ndpr_prefix.sin6_addr, &ifra.ifra_addr.sin6_addr,
|
||||
sizeof(ifra.ifra_addr.sin6_addr));
|
||||
sizeof(ifra.ifra_addr.sin6_addr));
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[0] &= mask.s6_addr32[0];
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[1] &= mask.s6_addr32[1];
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[2] &= mask.s6_addr32[2];
|
||||
@ -1680,25 +1657,25 @@ in6_ifadd(pr, ifid)
|
||||
/* interface ID */
|
||||
if (ifid == NULL || IN6_IS_ADDR_UNSPECIFIED(ifid))
|
||||
ifid = &ib->ia_addr.sin6_addr;
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[0]
|
||||
|= (ifid->s6_addr32[0] & ~mask.s6_addr32[0]);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[1]
|
||||
|= (ifid->s6_addr32[1] & ~mask.s6_addr32[1]);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[2]
|
||||
|= (ifid->s6_addr32[2] & ~mask.s6_addr32[2]);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[3]
|
||||
|= (ifid->s6_addr32[3] & ~mask.s6_addr32[3]);
|
||||
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[0] |=
|
||||
(ifid->s6_addr32[0] & ~mask.s6_addr32[0]);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[1] |=
|
||||
(ifid->s6_addr32[1] & ~mask.s6_addr32[1]);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[2] |=
|
||||
(ifid->s6_addr32[2] & ~mask.s6_addr32[2]);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[3] |=
|
||||
(ifid->s6_addr32[3] & ~mask.s6_addr32[3]);
|
||||
|
||||
/* new prefix mask. */
|
||||
ifra.ifra_prefixmask.sin6_len = sizeof(struct sockaddr_in6);
|
||||
ifra.ifra_prefixmask.sin6_family = AF_INET6;
|
||||
bcopy(&mask, &ifra.ifra_prefixmask.sin6_addr,
|
||||
sizeof(ifra.ifra_prefixmask.sin6_addr));
|
||||
sizeof(ifra.ifra_prefixmask.sin6_addr));
|
||||
|
||||
/*
|
||||
* lifetime.
|
||||
* XXX: in6_init_address_ltimes would override these values later.
|
||||
* We should reconsider this logic.
|
||||
* We should reconsider this logic.
|
||||
*/
|
||||
ifra.ifra_lifetime.ia6t_vltime = pr->ndpr_vltime;
|
||||
ifra.ifra_lifetime.ia6t_pltime = pr->ndpr_pltime;
|
||||
@ -1731,7 +1708,7 @@ in6_ifadd(pr, ifid)
|
||||
|
||||
ia = in6ifa_ifpwithaddr(ifp, &ifra.ifra_addr.sin6_addr);
|
||||
|
||||
return (ia); /* this must NOT be NULL. */
|
||||
return (ia); /* this is always non-NULL */
|
||||
}
|
||||
|
||||
int
|
||||
@ -1754,18 +1731,17 @@ in6_tmpifadd(ia0, forcegen)
|
||||
ifra.ifra_prefixmask = ia0->ia_prefixmask;
|
||||
/* clear the old IFID */
|
||||
for (i = 0; i < 4; i++) {
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[i]
|
||||
&= ifra.ifra_prefixmask.sin6_addr.s6_addr32[i];
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[i] &=
|
||||
ifra.ifra_prefixmask.sin6_addr.s6_addr32[i];
|
||||
}
|
||||
|
||||
again:
|
||||
in6_get_tmpifid(ifp, (u_int8_t *)randid,
|
||||
(const u_int8_t *)&ia0->ia_addr.sin6_addr.s6_addr[8],
|
||||
forcegen);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[2]
|
||||
|= (randid[0] & ~(ifra.ifra_prefixmask.sin6_addr.s6_addr32[2]));
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[3]
|
||||
|= (randid[1] & ~(ifra.ifra_prefixmask.sin6_addr.s6_addr32[3]));
|
||||
(const u_int8_t *)&ia0->ia_addr.sin6_addr.s6_addr[8], forcegen);
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[2] |=
|
||||
(randid[0] & ~(ifra.ifra_prefixmask.sin6_addr.s6_addr32[2]));
|
||||
ifra.ifra_addr.sin6_addr.s6_addr32[3] |=
|
||||
(randid[1] & ~(ifra.ifra_prefixmask.sin6_addr.s6_addr32[3]));
|
||||
|
||||
/*
|
||||
* If by chance the new temporary address is the same as an address
|
||||
@ -1792,17 +1768,17 @@ in6_tmpifadd(ia0, forcegen)
|
||||
*/
|
||||
if (ia0->ia6_lifetime.ia6t_expire != 0) {
|
||||
vltime0 = IFA6_IS_INVALID(ia0) ? 0 :
|
||||
(ia0->ia6_lifetime.ia6t_expire - time_second);
|
||||
(ia0->ia6_lifetime.ia6t_expire - time_second);
|
||||
if (vltime0 > ip6_temp_valid_lifetime)
|
||||
vltime0 = ip6_temp_valid_lifetime;
|
||||
} else
|
||||
vltime0 = ip6_temp_valid_lifetime;
|
||||
if (ia0->ia6_lifetime.ia6t_preferred != 0) {
|
||||
pltime0 = IFA6_IS_DEPRECATED(ia0) ? 0 :
|
||||
(ia0->ia6_lifetime.ia6t_preferred - time_second);
|
||||
(ia0->ia6_lifetime.ia6t_preferred - time_second);
|
||||
if (pltime0 > ip6_temp_preferred_lifetime - ip6_desync_factor){
|
||||
pltime0 = ip6_temp_preferred_lifetime -
|
||||
ip6_desync_factor;
|
||||
ip6_desync_factor;
|
||||
}
|
||||
} else
|
||||
pltime0 = ip6_temp_preferred_lifetime - ip6_desync_factor;
|
||||
@ -1845,7 +1821,7 @@ in6_tmpifadd(ia0, forcegen)
|
||||
pfxlist_onlink_check();
|
||||
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
in6_init_prefix_ltimes(struct nd_prefix *ndpr)
|
||||
@ -1928,8 +1904,9 @@ rt6_deleteroute(rn, arg)
|
||||
if (rt->rt_gateway == NULL || rt->rt_gateway->sa_family != AF_INET6)
|
||||
return (0);
|
||||
|
||||
if (!IN6_ARE_ADDR_EQUAL(gate, &SIN6(rt->rt_gateway)->sin6_addr))
|
||||
if (!IN6_ARE_ADDR_EQUAL(gate, &SIN6(rt->rt_gateway)->sin6_addr)) {
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not delete a static route.
|
||||
@ -1946,8 +1923,8 @@ rt6_deleteroute(rn, arg)
|
||||
if ((rt->rt_flags & RTF_HOST) == 0)
|
||||
return (0);
|
||||
|
||||
return (rtrequest(RTM_DELETE, rt_key(rt),
|
||||
rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0));
|
||||
return (rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
|
||||
rt_mask(rt), rt->rt_flags, 0));
|
||||
#undef SIN6
|
||||
}
|
||||
|
||||
|
@ -323,9 +323,9 @@ rip6_output(m, va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
struct mbuf *control;
|
||||
struct socket *so;
|
||||
struct sockaddr_in6 *dstsock;
|
||||
struct mbuf *control;
|
||||
struct in6_addr *dst;
|
||||
struct ip6_hdr *ip6;
|
||||
struct inpcb *in6p;
|
||||
@ -403,13 +403,13 @@ rip6_output(m, va_alist)
|
||||
ip6->ip6_dst.s6_addr16[1] = htons(oifp->if_index);
|
||||
} else if (dstsock->sin6_scope_id) {
|
||||
/* boundary check */
|
||||
if (dstsock->sin6_scope_id < 0
|
||||
|| if_index < dstsock->sin6_scope_id) {
|
||||
if (dstsock->sin6_scope_id < 0 ||
|
||||
if_index < dstsock->sin6_scope_id) {
|
||||
error = ENXIO; /* XXX EINVAL? */
|
||||
goto bad;
|
||||
}
|
||||
ip6->ip6_dst.s6_addr16[1]
|
||||
= htons(dstsock->sin6_scope_id & 0xffff);/*XXX*/
|
||||
ip6->ip6_dst.s6_addr16[1] =
|
||||
htons(dstsock->sin6_scope_id & 0xffff); /* XXX */
|
||||
}
|
||||
}
|
||||
|
||||
@ -419,11 +419,8 @@ rip6_output(m, va_alist)
|
||||
{
|
||||
struct in6_addr *in6a;
|
||||
|
||||
if ((in6a = in6_selectsrc(dstsock, optp,
|
||||
in6p->in6p_moptions,
|
||||
&in6p->in6p_route,
|
||||
&in6p->in6p_laddr,
|
||||
&error)) == 0) {
|
||||
if ((in6a = in6_selectsrc(dstsock, optp, in6p->in6p_moptions,
|
||||
&in6p->in6p_route, &in6p->in6p_laddr, &error)) == 0) {
|
||||
if (error == 0)
|
||||
error = EADDRNOTAVAIL;
|
||||
goto bad;
|
||||
@ -632,7 +629,6 @@ rip6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
|
||||
if (nam->sa_len != sizeof(*addr))
|
||||
return EINVAL;
|
||||
|
||||
if (TAILQ_EMPTY(&ifnet) || addr->sin6_family != AF_INET6)
|
||||
return EADDRNOTAVAIL;
|
||||
#ifdef ENABLE_DEFAULT_SCOPE
|
||||
|
@ -4,7 +4,7 @@
|
||||
/*
|
||||
* Copyright (C) 2000 WIDE Project.
|
||||
* All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
@ -16,7 +16,7 @@
|
||||
* 3. Neither the name of the project nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
@ -125,7 +125,7 @@ scope6_set(ifp, idlist)
|
||||
|
||||
/*
|
||||
* TODO(XXX): after setting, we should reflect the changes to
|
||||
* interface addresses, routing table entries, PCB entries...
|
||||
* interface addresses, routing table entries, PCB entries...
|
||||
*/
|
||||
|
||||
s = splnet();
|
||||
@ -178,7 +178,7 @@ scope6_get(ifp, idlist)
|
||||
*/
|
||||
int
|
||||
in6_addrscope(addr)
|
||||
struct in6_addr *addr;
|
||||
struct in6_addr *addr;
|
||||
{
|
||||
int scope;
|
||||
|
||||
@ -277,9 +277,9 @@ scope6_setdefault(ifp)
|
||||
if (ifp) {
|
||||
scope6_ids[0].s6id_list[IPV6_ADDR_SCOPE_LINKLOCAL] =
|
||||
ifp->if_index;
|
||||
}
|
||||
else
|
||||
} else {
|
||||
scope6_ids[0].s6id_list[IPV6_ADDR_SCOPE_LINKLOCAL] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -4,7 +4,7 @@
|
||||
/*
|
||||
* Copyright (C) 2000 WIDE Project.
|
||||
* All rights reserved.
|
||||
*
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
@ -16,7 +16,7 @@
|
||||
* 3. Neither the name of the project nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
|
@ -286,7 +286,7 @@ udp6_input(mp, offp, proto)
|
||||
|| last->in6p_socket->so_options & SO_TIMESTAMP)
|
||||
ip6_savecontrol(last, &opts,
|
||||
ip6, n);
|
||||
|
||||
|
||||
m_adj(n, off + sizeof(struct udphdr));
|
||||
if (sbappendaddr(&last->in6p_socket->so_rcv,
|
||||
(struct sockaddr *)&udp_in6,
|
||||
|
Loading…
Reference in New Issue
Block a user