version 1.88.8.2, 2006/12/10 07:19:15 |
version 1.88.8.3, 2006/12/18 11:42:23 |
|
|
/* |
/* |
* Unicast check |
* Unicast check |
*/ |
*/ |
if (ip6_forward_rt.ro_rt != NULL && |
if (!IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, |
(ip6_forward_rt.ro_rt->rt_flags & RTF_UP) != 0 && |
|
IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, |
|
&((struct sockaddr_in6 *)(&ip6_forward_rt.ro_dst))->sin6_addr)) |
&((struct sockaddr_in6 *)(&ip6_forward_rt.ro_dst))->sin6_addr)) |
|
rtcache_free((struct route *)&ip6_forward_rt); |
|
else |
|
rtcache_check((struct route *)&ip6_forward_rt); |
|
if (ip6_forward_rt.ro_rt != NULL) { |
|
/* XXX Revalidated route is accounted wrongly. */ |
ip6stat.ip6s_forward_cachehit++; |
ip6stat.ip6s_forward_cachehit++; |
else { |
} else { |
struct sockaddr_in6 *dst6; |
struct sockaddr_in6 *dst6; |
|
|
if (ip6_forward_rt.ro_rt != NULL) { |
ip6stat.ip6s_forward_cachemiss++; |
/* route is down or destination is different */ |
|
ip6stat.ip6s_forward_cachemiss++; |
|
rtflush((struct route *)&ip6_forward_rt); |
|
} |
|
|
|
bzero(&ip6_forward_rt.ro_dst, sizeof(struct sockaddr_in6)); |
bzero(&ip6_forward_rt.ro_dst, sizeof(struct sockaddr_in6)); |
dst6 = (struct sockaddr_in6 *)&ip6_forward_rt.ro_dst; |
dst6 = (struct sockaddr_in6 *)&ip6_forward_rt.ro_dst; |
|
|
dst6->sin6_family = AF_INET6; |
dst6->sin6_family = AF_INET6; |
dst6->sin6_addr = ip6->ip6_dst; |
dst6->sin6_addr = ip6->ip6_dst; |
|
|
rtalloc((struct route *)&ip6_forward_rt); |
rtcache_init((struct route *)&ip6_forward_rt); |
} |
} |
|
|
#define rt6_key(r) ((struct sockaddr_in6 *)((r)->rt_nodes->rn_key)) |
#define rt6_key(r) ((struct sockaddr_in6 *)((r)->rt_nodes->rn_key)) |