diff options
author | qingli <qingli@FreeBSD.org> | 2008-12-17 10:03:49 +0000 |
---|---|---|
committer | qingli <qingli@FreeBSD.org> | 2008-12-17 10:03:49 +0000 |
commit | c6a0a000ca142a4c7062f6f2fc0c31b888309b18 (patch) | |
tree | 5820a671a6e7553fdca713d351b0eccfc6ac4ec1 /sys | |
parent | 62ee68bb086f87555449fb796d5153418839b5cf (diff) | |
download | FreeBSD-src-c6a0a000ca142a4c7062f6f2fc0c31b888309b18.zip FreeBSD-src-c6a0a000ca142a4c7062f6f2fc0c31b888309b18.tar.gz |
in6_clsroute() was applied to prefix routes causing some
of them to expire. in6_clsroute() was only applied to
cloned routes that are no longer applicable after the
arp-v2 commit.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/netinet6/in6.c | 13 | ||||
-rw-r--r-- | sys/netinet6/in6_rmx.c | 28 | ||||
-rw-r--r-- | sys/netinet6/nd6.c | 19 | ||||
-rw-r--r-- | sys/netinet6/nd6.h | 2 | ||||
-rw-r--r-- | sys/netinet6/nd6_rtr.c | 12 |
5 files changed, 35 insertions, 39 deletions
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 6ba852c..f266d45 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -987,6 +987,13 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, } } if (!rt) { + + printf("in6_update_ifa #1: addr= %s, mask= %s, ia= %s, ifp = %s\n", + ip6_sprintf(ip6buf, &mltaddr.sin6_addr), + ip6_sprintf(ip6buf, &mltmask.sin6_addr), + ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr), + if_name(ifp)); + error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, (struct sockaddr *)&ia->ia_addr, (struct sockaddr *)&mltmask, RTF_UP, @@ -1061,6 +1068,12 @@ in6_update_ifa(struct ifnet *ifp, struct in6_aliasreq *ifra, } } if (!rt) { + printf("in6_update_ifa #2: addr= %s, mask= %s, ia= %s, ifp = %s\n", + ip6_sprintf(ip6buf, &mltaddr.sin6_addr), + ip6_sprintf(ip6buf, &mltmask.sin6_addr), + ip6_sprintf(ip6buf, &ia->ia_addr.sin6_addr), + if_name(ifp)); + error = rtrequest(RTM_ADD, (struct sockaddr *)&mltaddr, (struct sockaddr *)&ia->ia_addr, (struct sockaddr *)&mltmask, RTF_UP, diff --git a/sys/netinet6/in6_rmx.c b/sys/netinet6/in6_rmx.c index 42980f7..ade7649 100644 --- a/sys/netinet6/in6_rmx.c +++ b/sys/netinet6/in6_rmx.c @@ -220,33 +220,6 @@ SYSCTL_V_INT(V_NET, vnet_inet6, _net_inet6_ip6, IPV6CTL_RTMAXCACHE, rtmaxcache, CTLFLAG_RW, rtq_toomany6 , 0, ""); -/* - * On last reference drop, mark the route as belong to us so that it can be - * timed out. - */ -static void -in6_clsroute(struct radix_node *rn, struct radix_node_head *head) -{ - INIT_VNET_INET6(curvnet); - struct rtentry *rt = (struct rtentry *)rn; - - RT_LOCK_ASSERT(rt); - - if (!(rt->rt_flags & RTF_UP)) - return; /* prophylactic measures */ - - /* - * As requested by David Greenman: - * If rtq_reallyold6 is 0, just delete the route without - * waiting for a timeout cycle to kill it. - */ - if (V_rtq_reallyold6 != 0) { - rt->rt_flags |= RTPRF_OURS; - rt->rt_rmx.rmx_expire = time_uptime + V_rtq_reallyold6; - } else { - rtexpunge(rt); - } -} struct rtqk_arg { struct radix_node_head *rnh; @@ -469,7 +442,6 @@ in6_inithead(void **head, int off) rnh = *head; rnh->rnh_addaddr = in6_addroute; rnh->rnh_matchaddr = in6_matroute; - rnh->rnh_close = in6_clsroute; callout_init(&V_rtq_timer6, CALLOUT_MPSAFE); in6_rtqtimo(rnh); /* kick off timeout first time */ callout_init(&V_rtq_mtutimer, CALLOUT_MPSAFE); diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c index 8f268f3..e2ca9eb 100644 --- a/sys/netinet6/nd6.c +++ b/sys/netinet6/nd6.c @@ -1713,7 +1713,6 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0, { INIT_VNET_INET6(curvnet); struct mbuf *m = m0; - struct rtentry *rt = rt0; struct llentry *ln = lle; int error = 0; int flags = 0; @@ -1746,9 +1745,9 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0, flags = ((m != NULL) || (lle != NULL)) ? LLE_EXCLUSIVE : 0; if (ln == NULL) { retry: - IF_AFDATA_LOCK(rt->rt_ifp); + IF_AFDATA_LOCK(ifp); ln = lla_lookup(LLTABLE6(ifp), flags, (struct sockaddr *)dst); - IF_AFDATA_UNLOCK(rt->rt_ifp); + IF_AFDATA_UNLOCK(ifp); if ((ln == NULL) && nd6_is_addr_neighbor(dst, ifp)) { /* * Since nd6_is_addr_neighbor() internally calls nd6_lookup(), @@ -1756,9 +1755,9 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0, * it is tolerable, because this should be a rare case. */ flags = ND6_CREATE | (m ? ND6_EXCLUSIVE : 0); - IF_AFDATA_LOCK(rt->rt_ifp); + IF_AFDATA_LOCK(ifp); ln = nd6_lookup(&dst->sin6_addr, flags, ifp); - IF_AFDATA_UNLOCK(rt->rt_ifp); + IF_AFDATA_UNLOCK(ifp); } } if (ln == NULL) { @@ -1767,8 +1766,8 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0, char ip6buf[INET6_ADDRSTRLEN]; log(LOG_DEBUG, "nd6_output: can't allocate llinfo for %s " - "(ln=%p, rt=%p)\n", - ip6_sprintf(ip6buf, &dst->sin6_addr), ln, rt); + "(ln=%p)\n", + ip6_sprintf(ip6buf, &dst->sin6_addr), ln); senderr(EIO); /* XXX: good error? */ } goto sendpkt; /* send anyway */ @@ -1915,9 +1914,9 @@ nd6_output_lle(struct ifnet *ifp, struct ifnet *origifp, struct mbuf *m0, } if ((ifp->if_flags & IFF_LOOPBACK) != 0) { return ((*ifp->if_output)(origifp, m, (struct sockaddr *)dst, - rt)); + NULL)); } - error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, rt); + error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, NULL); return (error); bad: @@ -2008,7 +2007,7 @@ nd6_need_cache(struct ifnet *ifp) * the lle lock, drop here for now */ int -nd6_storelladdr(struct ifnet *ifp, struct rtentry *rt0, struct mbuf *m, +nd6_storelladdr(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst, u_char *desten, struct llentry **lle) { struct llentry *ln; diff --git a/sys/netinet6/nd6.h b/sys/netinet6/nd6.h index f4ccd07..e2007f7 100644 --- a/sys/netinet6/nd6.h +++ b/sys/netinet6/nd6.h @@ -397,7 +397,7 @@ int nd6_output_lle __P((struct ifnet *, struct ifnet *, struct mbuf *, int nd6_output_flush __P((struct ifnet *, struct ifnet *, struct mbuf *, struct sockaddr_in6 *, struct rtentry *)); int nd6_need_cache __P((struct ifnet *)); -int nd6_storelladdr __P((struct ifnet *, struct rtentry *, struct mbuf *, +int nd6_storelladdr __P((struct ifnet *, struct mbuf *, struct sockaddr *, u_char *, struct llentry **)); /* nd6_nbr.c */ diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c index 7df364e..a47a347 100644 --- a/sys/netinet6/nd6_rtr.c +++ b/sys/netinet6/nd6_rtr.c @@ -1554,6 +1554,12 @@ nd6_prefix_onlink(struct nd_prefix *pr) char ip6buf[INET6_ADDRSTRLEN]; struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK}; + + log(LOG_DEBUG, "##1 nd6_prefix_onlink: %s, vltime = %x, pltime = %x\n", + ip6_sprintf(ip6buf, &pr->ndpr_prefix.sin6_addr), + pr->ndpr_vltime, pr->ndpr_pltime); + + /* sanity check */ if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0) { nd6log((LOG_ERR, @@ -1622,6 +1628,12 @@ nd6_prefix_onlink(struct nd_prefix *pr) rtflags = ifa->ifa_flags | RTF_UP; error = rtrequest(RTM_ADD, (struct sockaddr *)&pr->ndpr_prefix, ifa->ifa_addr, (struct sockaddr *)&mask6, rtflags, &rt); + + log(LOG_DEBUG, "##2 nd6_prefix_onlink: %s, vltime = %x, pltime = %x\n", + ip6_sprintf(ip6buf, &pr->ndpr_prefix.sin6_addr), + pr->ndpr_vltime, pr->ndpr_pltime); + + if (error == 0) { if (rt != NULL) /* this should be non NULL, though */ { rnh = V_rt_tables[rt->rt_fibnum][AF_INET6]; |