version 1.54, 1999/12/22 04:03:01 |
version 1.63, 2000/03/01 12:49:42 |
|
|
in_pcbinit(&udbtable, udbhashsize, udbhashsize); |
in_pcbinit(&udbtable, udbhashsize, udbhashsize); |
} |
} |
|
|
|
#ifndef UDP6 |
void |
void |
#if __STDC__ |
#if __STDC__ |
udp_input(struct mbuf *m, ...) |
udp_input(struct mbuf *m, ...) |
Line 218 udp_input(m, va_alist) |
|
Line 219 udp_input(m, va_alist) |
|
} |
} |
#endif |
#endif |
|
|
|
/* destination port of 0 is illegal, based on RFC768. */ |
|
if (uh->uh_dport == 0) |
|
goto bad; |
|
|
/* |
/* |
* Make mbuf data length reflect UDP length. |
* Make mbuf data length reflect UDP length. |
* If not enough data to reflect UDP length, drop. |
* If not enough data to reflect UDP length, drop. |
Line 235 udp_input(m, va_alist) |
|
Line 240 udp_input(m, va_alist) |
|
* Checksum extended UDP header and data. |
* Checksum extended UDP header and data. |
*/ |
*/ |
if (uh->uh_sum) { |
if (uh->uh_sum) { |
#ifndef PULLDOWN_TEST |
|
struct ip save_ip; |
|
|
|
/* |
|
* Save a copy of the IP header in case we want restore it |
|
* for sending an ICMP error message in response. |
|
*/ |
|
save_ip = *ip; |
|
|
|
bzero(((struct ipovly *)ip)->ih_x1, |
|
sizeof ((struct ipovly *)ip)->ih_x1); |
|
((struct ipovly *)ip)->ih_len = uh->uh_ulen; |
|
if (in_cksum(m, len + sizeof (struct ip)) != 0) { |
|
udpstat.udps_badsum++; |
|
m_freem(m); |
|
return; |
|
} |
|
|
|
*ip = save_ip; |
|
#else |
|
if (in4_cksum(m, IPPROTO_UDP, iphlen, len) != 0) { |
if (in4_cksum(m, IPPROTO_UDP, iphlen, len) != 0) { |
udpstat.udps_badsum++; |
udpstat.udps_badsum++; |
m_freem(m); |
m_freem(m); |
return; |
return; |
} |
} |
#endif |
|
} |
} |
|
|
/* construct source and dst sockaddrs. */ |
/* construct source and dst sockaddrs. */ |
Line 300 udp_input(m, va_alist) |
|
Line 284 udp_input(m, va_alist) |
|
#endif |
#endif |
|
|
if (n == 0) { |
if (n == 0) { |
udpstat.udps_noport++; |
|
if (m->m_flags & (M_BCAST | M_MCAST)) { |
if (m->m_flags & (M_BCAST | M_MCAST)) { |
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
goto bad; |
goto bad; |
} |
} |
|
udpstat.udps_noport++; |
#if NIPKDB > 0 |
#if NIPKDB > 0 |
if (checkipkdb(&ip->ip_src, uh->uh_sport, uh->uh_dport, |
if (checkipkdb(&ip->ip_src, uh->uh_sport, uh->uh_dport, |
m, iphlen + sizeof(struct udphdr), |
m, iphlen + sizeof(struct udphdr), |
Line 375 udp6_input(mp, offp, proto) |
|
Line 359 udp6_input(mp, offp, proto) |
|
goto bad; |
goto bad; |
} |
} |
|
|
|
/* destination port of 0 is illegal, based on RFC768. */ |
|
if (uh->uh_dport == 0) |
|
goto bad; |
|
|
/* Be proactive about malicious use of IPv4 mapped address */ |
/* Be proactive about malicious use of IPv4 mapped address */ |
if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) || |
if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) || |
IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) { |
IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) { |
Line 424 udp6_input(mp, offp, proto) |
|
Line 412 udp6_input(mp, offp, proto) |
|
dst.sin6_port = uh->uh_dport; |
dst.sin6_port = uh->uh_dport; |
|
|
if (udp6_realinput(AF_INET6, &src, &dst, m, off) == 0) { |
if (udp6_realinput(AF_INET6, &src, &dst, m, off) == 0) { |
udp6stat.udp6s_noport++; |
|
if (m->m_flags & M_MCAST) { |
if (m->m_flags & M_MCAST) { |
udp6stat.udp6s_noportmcast++; |
udp6stat.udp6s_noportmcast++; |
goto bad; |
goto bad; |
} |
} |
|
udp6stat.udp6s_noport++; |
icmp6_error(m, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0); |
icmp6_error(m, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0); |
m = NULL; |
m = NULL; |
} |
} |
Line 629 udp4_realinput(src, dst, m, off) |
|
Line 617 udp4_realinput(src, dst, m, off) |
|
* (No need to send an ICMP Port Unreachable |
* (No need to send an ICMP Port Unreachable |
* for a broadcast or multicast datgram.) |
* for a broadcast or multicast datgram.) |
*/ |
*/ |
udpstat.udps_noport++; |
|
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
goto bad; |
goto bad; |
} |
} |
Line 646 udp4_realinput(src, dst, m, off) |
|
Line 633 udp4_realinput(src, dst, m, off) |
|
#if 0 |
#if 0 |
struct mbuf *n; |
struct mbuf *n; |
|
|
udpstat.udps_noport++; |
|
if (m->m_flags & (M_BCAST | M_MCAST)) { |
if (m->m_flags & (M_BCAST | M_MCAST)) { |
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
goto bad; |
goto bad; |
} |
} |
|
udpstat.udps_noport++; |
#if NIPKDB > 0 |
#if NIPKDB > 0 |
if (checkipkdb(src4, *sport, *dport, m, off, |
if (checkipkdb(src4, *sport, *dport, m, off, |
m->m_pkthdr.len - off)) { |
m->m_pkthdr.len - off)) { |
Line 765 udp6_realinput(af, src, dst, m, off) |
|
Line 752 udp6_realinput(af, src, dst, m, off) |
|
&& !in6_mcmatch(in6p, dst6, m->m_pkthdr.rcvif)) |
&& !in6_mcmatch(in6p, dst6, m->m_pkthdr.rcvif)) |
continue; |
continue; |
} |
} |
|
#ifndef INET6_BINDV6ONLY |
|
else { |
|
if (IN6_IS_ADDR_V4MAPPED(dst6) |
|
&& (in6p->in6p_flags & IN6P_BINDV6ONLY)) |
|
continue; |
|
} |
|
#endif |
if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) { |
if (!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_faddr)) { |
if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, src6) |
if (!IN6_ARE_ADDR_EQUAL(&in6p->in6p_faddr, src6) |
|| in6p->in6p_fport != *sport) |
|| in6p->in6p_fport != *sport) |
continue; |
continue; |
} |
} |
|
#ifndef INET6_BINDV6ONLY |
|
else { |
|
if (IN6_IS_ADDR_V4MAPPED(src6) |
|
&& (in6p->in6p_flags & IN6P_BINDV6ONLY)) |
|
continue; |
|
} |
|
#endif |
|
|
last = in6p; |
last = in6p; |
udp6_sendup(m, off, (struct sockaddr *)src, |
udp6_sendup(m, off, (struct sockaddr *)src, |
Line 798 udp6_realinput(af, src, dst, m, off) |
|
Line 799 udp6_realinput(af, src, dst, m, off) |
|
*/ |
*/ |
switch (af) { |
switch (af) { |
case AF_INET: |
case AF_INET: |
udpstat.udps_noport++; |
|
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
break; |
break; |
case AF_INET6: |
case AF_INET6: |
udp6stat.udp6s_noport++; |
|
udp6stat.udp6s_noportmcast++; |
udp6stat.udp6s_noportmcast++; |
break; |
break; |
} |
} |
Line 824 udp6_realinput(af, src, dst, m, off) |
|
Line 823 udp6_realinput(af, src, dst, m, off) |
|
n = m_copy(m, 0, M_COPYALL); |
n = m_copy(m, 0, M_COPYALL); |
switch (af) { |
switch (af) { |
case AF_INET: |
case AF_INET: |
udpstat.udps_noport++; |
|
if (m->m_flags & (M_BCAST | M_MCAST)) { |
if (m->m_flags & (M_BCAST | M_MCAST)) { |
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
goto bad; |
goto bad; |
} |
} |
|
udpstat.udps_noport++; |
if (n != NULL) |
if (n != NULL) |
icmp_error(n, ICMP_UNREACH, |
icmp_error(n, ICMP_UNREACH, |
ICMP_UNREACH_PORT, 0, 0); |
ICMP_UNREACH_PORT, 0, 0); |
break; |
break; |
case AF_INET6: |
case AF_INET6: |
udp6stat.udp6s_noport++; |
|
if (m->m_flags & M_MCAST) { |
if (m->m_flags & M_MCAST) { |
udp6stat.udp6s_noportmcast++; |
udp6stat.udp6s_noportmcast++; |
goto bad; |
goto bad; |
} |
} |
|
udp6stat.udp6s_noport++; |
if (n != NULL) |
if (n != NULL) |
icmp6_error(n, ICMP6_DST_UNREACH, |
icmp6_error(n, ICMP6_DST_UNREACH, |
ICMP6_DST_UNREACH_NOPORT, 0); |
ICMP6_DST_UNREACH_NOPORT, 0); |
|
|
} |
} |
#endif |
#endif |
|
|
#if 0 |
#else /*UDP6*/ |
|
|
void |
void |
#if __STDC__ |
#if __STDC__ |
udp_input(struct mbuf *m, ...) |
udp_input(struct mbuf *m, ...) |
Line 912 udp_input(m, va_alist) |
|
Line 912 udp_input(m, va_alist) |
|
} |
} |
uh = (struct udphdr *)((caddr_t)ip + iphlen); |
uh = (struct udphdr *)((caddr_t)ip + iphlen); |
|
|
|
/* destination port of 0 is illegal, based on RFC768. */ |
|
if (uh->uh_dport == 0) |
|
goto bad; |
|
|
/* |
/* |
* Make mbuf data length reflect UDP length. |
* Make mbuf data length reflect UDP length. |
* If not enough data to reflect UDP length, drop. |
* If not enough data to reflect UDP length, drop. |
Line 1047 udp_input(m, va_alist) |
|
Line 1051 udp_input(m, va_alist) |
|
* (No need to send an ICMP Port Unreachable |
* (No need to send an ICMP Port Unreachable |
* for a broadcast or multicast datgram.) |
* for a broadcast or multicast datgram.) |
*/ |
*/ |
udpstat.udps_noport++; |
|
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
goto bad; |
goto bad; |
} |
} |
Line 1081 udp_input(m, va_alist) |
|
Line 1084 udp_input(m, va_alist) |
|
++udpstat.udps_pcbhashmiss; |
++udpstat.udps_pcbhashmiss; |
inp = in_pcblookup_bind(&udbtable, ip->ip_dst, uh->uh_dport); |
inp = in_pcblookup_bind(&udbtable, ip->ip_dst, uh->uh_dport); |
if (inp == 0) { |
if (inp == 0) { |
udpstat.udps_noport++; |
|
if (m->m_flags & (M_BCAST | M_MCAST)) { |
if (m->m_flags & (M_BCAST | M_MCAST)) { |
udpstat.udps_noportbcast++; |
udpstat.udps_noportbcast++; |
goto bad; |
goto bad; |
} |
} |
|
udpstat.udps_noport++; |
*ip = save_ip; |
*ip = save_ip; |
#if NIPKDB > 0 |
#if NIPKDB > 0 |
if (checkipkdb(&ip->ip_src, |
if (checkipkdb(&ip->ip_src, |
|
|
if (opts) |
if (opts) |
m_freem(opts); |
m_freem(opts); |
} |
} |
#endif |
#endif /*UDP6*/ |
|
|
/* |
/* |
* Notify a udp user of an asynchronous error; |
* Notify a udp user of an asynchronous error; |
Line 1249 udp_output(m, va_alist) |
|
Line 1252 udp_output(m, va_alist) |
|
udpstat.udps_opackets++; |
udpstat.udps_opackets++; |
|
|
#ifdef IPSEC |
#ifdef IPSEC |
m->m_pkthdr.rcvif = (struct ifnet *)inp->inp_socket; |
ipsec_setsocket(m, inp->inp_socket); |
#endif /*IPSEC*/ |
#endif /*IPSEC*/ |
|
|
return (ip_output(m, inp->inp_options, &inp->inp_route, |
return (ip_output(m, inp->inp_options, &inp->inp_route, |
Line 1281 udp_usrreq(so, req, m, nam, control, p) |
|
Line 1284 udp_usrreq(so, req, m, nam, control, p) |
|
return (in_control(so, (long)m, (caddr_t)nam, |
return (in_control(so, (long)m, (caddr_t)nam, |
(struct ifnet *)control, p)); |
(struct ifnet *)control, p)); |
|
|
|
if (req == PRU_PURGEIF) { |
|
in_purgeif((struct ifnet *)control); |
|
in_pcbpurgeif(&udbtable, (struct ifnet *)control); |
|
return (0); |
|
} |
|
|
s = splsoftnet(); |
s = splsoftnet(); |
inp = sotoinpcb(so); |
inp = sotoinpcb(so); |
#ifdef DIAGNOSTIC |
#ifdef DIAGNOSTIC |
Line 1314 udp_usrreq(so, req, m, nam, control, p) |
|
Line 1323 udp_usrreq(so, req, m, nam, control, p) |
|
inp = sotoinpcb(so); |
inp = sotoinpcb(so); |
inp->inp_ip.ip_ttl = ip_defttl; |
inp->inp_ip.ip_ttl = ip_defttl; |
#ifdef IPSEC |
#ifdef IPSEC |
error = ipsec_init_policy(&inp->inp_sp); |
error = ipsec_init_policy(so, &inp->inp_sp); |
if (error != 0) { |
if (error != 0) { |
in_pcbdetach(inp); |
in_pcbdetach(inp); |
break; |
break; |