| version 1.231.2.2, 2006/12/10 07:19:10 |
version 1.231.2.3, 2006/12/18 11:42:21 |
| Line 1679 ip_rtaddr(struct in_addr dst) |
|
| Line 1679 ip_rtaddr(struct in_addr dst) |
|
| |
|
| sin = satosin(&ipforward_rt.ro_dst); |
sin = satosin(&ipforward_rt.ro_dst); |
| |
|
| if (ipforward_rt.ro_rt == NULL || !in_hosteq(dst, sin->sin_addr)) { |
if (!in_hosteq(dst, sin->sin_addr)) |
| if (ipforward_rt.ro_rt != NULL) |
rtcache_free(&ipforward_rt); |
| rtflush(&ipforward_rt); |
else |
| |
rtcache_check(&ipforward_rt); |
| |
if (ipforward_rt.ro_rt == NULL) { |
| sin->sin_family = AF_INET; |
sin->sin_family = AF_INET; |
| sin->sin_len = sizeof(*sin); |
sin->sin_len = sizeof(*sin); |
| sin->sin_addr = dst; |
sin->sin_addr = dst; |
| |
|
| rtalloc(&ipforward_rt); |
rtcache_init(&ipforward_rt); |
| |
if (ipforward_rt.ro_rt == NULL) |
| |
return NULL; |
| } |
} |
| if (ipforward_rt.ro_rt == NULL) |
return (ifatoia(ipforward_rt.ro_rt->rt_ifa)); |
| return NULL; |
|
| return ifatoia(ipforward_rt.ro_rt->rt_ifa); |
|
| } |
} |
| |
|
| /* |
/* |
| Line 1871 ip_forward(struct mbuf *m, int srcrt) |
|
| Line 1873 ip_forward(struct mbuf *m, int srcrt) |
|
| } |
} |
| |
|
| sin = satosin(&ipforward_rt.ro_dst); |
sin = satosin(&ipforward_rt.ro_dst); |
| if ((rt = ipforward_rt.ro_rt) == NULL || |
if (!in_hosteq(ip->ip_dst, sin->sin_addr)) |
| !in_hosteq(ip->ip_dst, sin->sin_addr)) { |
rtcache_free(&ipforward_rt); |
| if (ipforward_rt.ro_rt != NULL) |
else |
| rtflush(&ipforward_rt); |
rtcache_check(&ipforward_rt); |
| |
if (ipforward_rt.ro_rt == NULL) { |
| sin->sin_family = AF_INET; |
sin->sin_family = AF_INET; |
| sin->sin_len = sizeof(struct sockaddr_in); |
sin->sin_len = sizeof(struct sockaddr_in); |
| sin->sin_addr = ip->ip_dst; |
sin->sin_addr = ip->ip_dst; |
| |
|
| rtalloc(&ipforward_rt); |
rtcache_init(&ipforward_rt); |
| if (ipforward_rt.ro_rt == NULL) { |
if (ipforward_rt.ro_rt == NULL) { |
| icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); |
icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); |
| return; |
return; |
| } |
} |
| rt = ipforward_rt.ro_rt; |
|
| } |
} |
| |
rt = ipforward_rt.ro_rt; |
| |
|
| /* |
/* |
| * Save at most 68 bytes of the packet in case |
* Save at most 68 bytes of the packet in case |