version 1.81, 1999/03/26 08:51:36 |
version 1.82.2.6, 2000/05/06 16:43:25 |
|
|
} |
} |
ip = mtod(m, struct ip *); |
ip = mtod(m, struct ip *); |
} |
} |
|
|
|
/* |
|
* RFC1122: packets with a multicast source address are |
|
* not allowed. |
|
*/ |
|
if (IN_MULTICAST(ip->ip_src.s_addr)) { |
|
/* XXX stat */ |
|
goto bad; |
|
} |
|
|
if (in_cksum(m, hlen) != 0) { |
if (in_cksum(m, hlen) != 0) { |
ipstat.ips_badsum++; |
ipstat.ips_badsum++; |
goto bad; |
goto bad; |
|
|
* 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. |
*/ |
*/ |
INADDR_TO_IA(ip->ip_dst, ia); |
INADDR_TO_IA(ip->ip_dst, ia); |
if (ia != NULL) goto ours; |
if (ia != NULL) |
|
goto ours; |
if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) { |
if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) { |
for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first; |
for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first; |
ifa != NULL; ifa = ifa->ifa_list.tqe_next) { |
ifa != NULL; ifa = ifa->ifa_list.tqe_next) { |
|
|
/* |
/* |
* Switch out to protocol's input routine. |
* Switch out to protocol's input routine. |
*/ |
*/ |
|
#if IFA_STATS |
|
ia->ia_ifa.ifa_data.ifad_inbytes += ip->ip_len; |
|
#endif |
ipstat.ips_delivered++; |
ipstat.ips_delivered++; |
(*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen); |
(*inetsw[ip_protox[ip->ip_p]].pr_input)(m, hlen); |
goto next; |
goto next; |
|
|
struct mbuf *m; |
struct mbuf *m; |
{ |
{ |
register struct ip *ip = mtod(m, struct ip *); |
register struct ip *ip = mtod(m, struct ip *); |
register u_char *cp; |
register u_char *cp, *cp0; |
register struct ip_timestamp *ipt; |
register struct ip_timestamp *ipt; |
register struct in_ifaddr *ia; |
register struct in_ifaddr *ia; |
int opt, optlen, cnt, off, code, type = ICMP_PARAMPROB, forward = 0; |
int opt, optlen, cnt, off, code, type = ICMP_PARAMPROB, forward = 0; |
struct in_addr *sin, dst; |
struct in_addr dst; |
n_time ntime; |
n_time ntime; |
|
|
dst = ip->ip_dst; |
dst = ip->ip_dst; |
|
|
break; |
break; |
} |
} |
off--; /* 0 origin */ |
off--; /* 0 origin */ |
if (off > optlen - sizeof(struct in_addr)) { |
if ((off + sizeof(struct in_addr)) > optlen) { |
/* |
/* |
* End of source route. Should be for us. |
* End of source route. Should be for us. |
*/ |
*/ |
|
|
* If no space remains, ignore. |
* If no space remains, ignore. |
*/ |
*/ |
off--; /* 0 origin */ |
off--; /* 0 origin */ |
if (off > optlen - sizeof(struct in_addr)) |
if ((off + sizeof(struct in_addr)) > optlen) |
break; |
break; |
bcopy((caddr_t)(&ip->ip_dst), (caddr_t)&ipaddr.sin_addr, |
bcopy((caddr_t)(&ip->ip_dst), (caddr_t)&ipaddr.sin_addr, |
sizeof(ipaddr.sin_addr)); |
sizeof(ipaddr.sin_addr)); |
|
|
goto bad; |
goto bad; |
break; |
break; |
} |
} |
sin = (struct in_addr *)(cp + ipt->ipt_ptr - 1); |
cp0 = (cp + ipt->ipt_ptr - 1); |
switch (ipt->ipt_flg) { |
switch (ipt->ipt_flg) { |
|
|
case IPOPT_TS_TSONLY: |
case IPOPT_TS_TSONLY: |
|
Line 1005 ip_dooptions(m) |
|
m->m_pkthdr.rcvif); |
m->m_pkthdr.rcvif); |
if (ia == 0) |
if (ia == 0) |
continue; |
continue; |
bcopy((caddr_t)&ia->ia_addr.sin_addr, |
bcopy(&ia->ia_addr.sin_addr, |
(caddr_t)sin, sizeof(struct in_addr)); |
cp0, sizeof(struct in_addr)); |
ipt->ipt_ptr += sizeof(struct in_addr); |
ipt->ipt_ptr += sizeof(struct in_addr); |
break; |
break; |
|
|
Line 1000 ip_dooptions(m) |
|
Line 1014 ip_dooptions(m) |
|
if (ipt->ipt_ptr - 1 + sizeof(n_time) + |
if (ipt->ipt_ptr - 1 + sizeof(n_time) + |
sizeof(struct in_addr) > ipt->ipt_len) |
sizeof(struct in_addr) > ipt->ipt_len) |
goto bad; |
goto bad; |
bcopy((caddr_t)sin, (caddr_t)&ipaddr.sin_addr, |
bcopy(cp0, &ipaddr.sin_addr, |
sizeof(struct in_addr)); |
sizeof(struct in_addr)); |
if (ifa_ifwithaddr((SA)&ipaddr) == 0) |
if (ifa_ifwithaddr((SA)&ipaddr) == 0) |
continue; |
continue; |
Line 1011 ip_dooptions(m) |
|
Line 1025 ip_dooptions(m) |
|
goto bad; |
goto bad; |
} |
} |
ntime = iptime(); |
ntime = iptime(); |
bcopy((caddr_t)&ntime, (caddr_t)cp + ipt->ipt_ptr - 1, |
cp0 = (u_char *) &ntime; /* XXX GCC BUG */ |
|
bcopy(cp0, (caddr_t)cp + ipt->ipt_ptr - 1, |
sizeof(n_time)); |
sizeof(n_time)); |
ipt->ipt_ptr += sizeof(n_time); |
ipt->ipt_ptr += sizeof(n_time); |
} |
} |
Line 1223 ip_forward(m, srcrt) |
|
Line 1238 ip_forward(m, srcrt) |
|
ntohl(ip->ip_src.s_addr), |
ntohl(ip->ip_src.s_addr), |
ntohl(ip->ip_dst.s_addr), ip->ip_ttl); |
ntohl(ip->ip_dst.s_addr), ip->ip_ttl); |
#endif |
#endif |
if (m->m_flags & M_BCAST || in_canforward(ip->ip_dst) == 0) { |
if (m->m_flags & (M_BCAST|M_MCAST) || in_canforward(ip->ip_dst) == 0) { |
ipstat.ips_cantforward++; |
ipstat.ips_cantforward++; |
m_freem(m); |
m_freem(m); |
return; |
return; |