diff options
| author | Ruslan Ermilov <ru@FreeBSD.org> | 2001-11-30 10:40:28 +0000 |
|---|---|---|
| committer | Ruslan Ermilov <ru@FreeBSD.org> | 2001-11-30 10:40:28 +0000 |
| commit | bd7142087b4414d3a7cba92781e9fe0ee419534c (patch) | |
| tree | 82b53760121aef4c5d76f4488915d6330e0edb1b /sys/netinet/ip_input.c | |
| parent | 6759374681c5d1e9dc731a81ed1bc4f3bd3bf885 (diff) | |
Notes
Diffstat (limited to 'sys/netinet/ip_input.c')
| -rw-r--r-- | sys/netinet/ip_input.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c index 17e3103f44bb..475b837829fd 100644 --- a/sys/netinet/ip_input.c +++ b/sys/netinet/ip_input.c @@ -219,7 +219,6 @@ static struct mbuf *ip_reass __P((struct mbuf *, struct ipqhead *, struct ipq *, #else static struct mbuf *ip_reass __P((struct mbuf *, struct ipqhead *, struct ipq *)); #endif -static struct in_ifaddr *ip_rtaddr __P((struct in_addr)); static void ipintr __P((void)); /* @@ -1273,7 +1272,7 @@ nosourcerouting: if ((ia = (INA)ifa_ifwithdstaddr((SA)&ipaddr)) == 0) ia = (INA)ifa_ifwithnet((SA)&ipaddr); } else - ia = ip_rtaddr(ipaddr.sin_addr); + ia = ip_rtaddr(ipaddr.sin_addr, &ipforward_rt); if (ia == 0) { type = ICMP_UNREACH; code = ICMP_UNREACH_SRCFAIL; @@ -1311,7 +1310,8 @@ nosourcerouting: * use the incoming interface (should be same). */ if ((ia = (INA)ifa_ifwithaddr((SA)&ipaddr)) == 0 && - (ia = ip_rtaddr(ipaddr.sin_addr)) == 0) { + (ia = ip_rtaddr(ipaddr.sin_addr, + &ipforward_rt)) == 0) { type = ICMP_UNREACH; code = ICMP_UNREACH_HOST; goto bad; @@ -1399,30 +1399,31 @@ bad: * Given address of next destination (final or next hop), * return internet address info of interface to be used to get there. */ -static struct in_ifaddr * -ip_rtaddr(dst) - struct in_addr dst; +struct in_ifaddr * +ip_rtaddr(dst, rt) + struct in_addr dst; + struct route *rt; { register struct sockaddr_in *sin; - sin = (struct sockaddr_in *) &ipforward_rt.ro_dst; + sin = (struct sockaddr_in *)&rt->ro_dst; - if (ipforward_rt.ro_rt == 0 || - !(ipforward_rt.ro_rt->rt_flags & RTF_UP) || + if (rt->ro_rt == 0 || + !(rt->ro_rt->rt_flags & RTF_UP) || dst.s_addr != sin->sin_addr.s_addr) { - if (ipforward_rt.ro_rt) { - RTFREE(ipforward_rt.ro_rt); - ipforward_rt.ro_rt = 0; + if (rt->ro_rt) { + RTFREE(rt->ro_rt); + rt->ro_rt = 0; } sin->sin_family = AF_INET; sin->sin_len = sizeof(*sin); sin->sin_addr = dst; - rtalloc_ign(&ipforward_rt, RTF_PRCLONING); + rtalloc_ign(rt, RTF_PRCLONING); } - if (ipforward_rt.ro_rt == 0) + if (rt->ro_rt == 0) return ((struct in_ifaddr *)0); - return (ifatoia(ipforward_rt.ro_rt->rt_ifa)); + return (ifatoia(rt->ro_rt->rt_ifa)); } /* @@ -1608,7 +1609,7 @@ ip_forward(m, srcrt) } #endif - if (ip_rtaddr(ip->ip_dst) == 0) { + if (ip_rtaddr(ip->ip_dst, &ipforward_rt) == 0) { icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_HOST, dest, 0); return; } else |
