| 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 |