- typo in comment

- style
- ANSIfy
(there is no functional change.)

Obtained from:	KAME
This commit is contained in:
Hajimu UMEMOTO 2003-10-09 16:13:47 +00:00
parent 89185ee435
commit 07eb299520
10 changed files with 225 additions and 289 deletions

View File

@ -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));

View File

@ -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_ */

View File

@ -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);
}

View File

@ -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));

View File

@ -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 {

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,