version 1.18, 1995/06/01 21:36:27 |
version 1.19, 1995/06/04 05:07:03 |
|
|
* Check our list of addresses, to see if the packet is for us. |
* Check our list of addresses, to see if the packet is for us. |
*/ |
*/ |
for (ia = in_ifaddr; ia; ia = ia->ia_next) { |
for (ia = in_ifaddr; ia; ia = ia->ia_next) { |
#define satosin(sa) ((struct sockaddr_in *)(sa)) |
|
|
|
if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr) |
if (IA_SIN(ia)->sin_addr.s_addr == ip->ip_dst.s_addr) |
goto ours; |
goto ours; |
if ( |
if ( |
|
|
} |
} |
goto ours; |
goto ours; |
} |
} |
if (ip->ip_dst.s_addr == INADDR_BROADCAST) |
if (ip->ip_dst.s_addr == INADDR_BROADCAST || |
goto ours; |
ip->ip_dst.s_addr == INADDR_ANY) |
if (ip->ip_dst.s_addr == INADDR_ANY) |
|
goto ours; |
goto ours; |
|
|
/* |
/* |
|
|
goto bad; |
goto bad; |
} |
} |
ipaddr.sin_addr = ip->ip_dst; |
ipaddr.sin_addr = ip->ip_dst; |
ia = (struct in_ifaddr *) |
ia = ifatoia(ifa_ifwithaddr(sintosa(&ipaddr))); |
ifa_ifwithaddr((struct sockaddr *)&ipaddr); |
|
if (ia == 0) { |
if (ia == 0) { |
if (opt == IPOPT_SSRR) { |
if (opt == IPOPT_SSRR) { |
type = ICMP_UNREACH; |
type = ICMP_UNREACH; |
|
|
{ |
{ |
register struct sockaddr_in *sin; |
register struct sockaddr_in *sin; |
|
|
sin = (struct sockaddr_in *) &ipforward_rt.ro_dst; |
sin = satosin(&ipforward_rt.ro_dst); |
|
|
if (ipforward_rt.ro_rt == 0 || dst.s_addr != sin->sin_addr.s_addr) { |
if (ipforward_rt.ro_rt == 0 || dst.s_addr != sin->sin_addr.s_addr) { |
if (ipforward_rt.ro_rt) { |
if (ipforward_rt.ro_rt) { |
|
|
} |
} |
if (ipforward_rt.ro_rt == 0) |
if (ipforward_rt.ro_rt == 0) |
return ((struct in_ifaddr *)0); |
return ((struct in_ifaddr *)0); |
return ((struct in_ifaddr *) ipforward_rt.ro_rt->rt_ifa); |
return (ifatoia(ipforward_rt.ro_rt->rt_ifa)); |
} |
} |
|
|
/* |
/* |
Line 1036 ip_forward(m, srcrt) |
|
Line 1032 ip_forward(m, srcrt) |
|
} |
} |
ip->ip_ttl -= IPTTLDEC; |
ip->ip_ttl -= IPTTLDEC; |
|
|
sin = (struct sockaddr_in *)&ipforward_rt.ro_dst; |
sin = satosin(&ipforward_rt.ro_dst); |
if ((rt = ipforward_rt.ro_rt) == 0 || |
if ((rt = ipforward_rt.ro_rt) == 0 || |
ip->ip_dst.s_addr != sin->sin_addr.s_addr) { |
ip->ip_dst.s_addr != sin->sin_addr.s_addr) { |
if (ipforward_rt.ro_rt) { |
if (ipforward_rt.ro_rt) { |
Line 1073 ip_forward(m, srcrt) |
|
Line 1069 ip_forward(m, srcrt) |
|
* Also, don't send redirect if forwarding using a default route |
* Also, don't send redirect if forwarding using a default route |
* or a route modified by a redirect. |
* or a route modified by a redirect. |
*/ |
*/ |
#define satosin(sa) ((struct sockaddr_in *)(sa)) |
|
if (rt->rt_ifp == m->m_pkthdr.rcvif && |
if (rt->rt_ifp == m->m_pkthdr.rcvif && |
(rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 && |
(rt->rt_flags & (RTF_DYNAMIC|RTF_MODIFIED)) == 0 && |
satosin(rt_key(rt))->sin_addr.s_addr != 0 && |
satosin(rt_key(rt))->sin_addr.s_addr != 0 && |
ipsendredirects && !srcrt) { |
ipsendredirects && !srcrt) { |
#define RTA(rt) ((struct in_ifaddr *)(rt->rt_ifa)) |
if (rt->rt_ifa && |
if (RTA(rt) && |
(ip->ip_src.s_addr & ifatoia(rt->rt_ifa)->ia_subnetmask) == |
(ip->ip_src.s_addr & RTA(rt)->ia_subnetmask) == |
ifatoia(rt->rt_ifa)->ia_subnet) { |
RTA(rt)->ia_subnet) { |
|
if (rt->rt_flags & RTF_GATEWAY) |
if (rt->rt_flags & RTF_GATEWAY) |
dest = satosin(rt->rt_gateway)->sin_addr.s_addr; |
dest = satosin(rt->rt_gateway)->sin_addr.s_addr; |
else |
else |