version 1.59, 2000/02/01 22:52:10 |
version 1.65, 2000/03/30 02:39:37 |
|
|
*/ |
*/ |
|
|
#include "opt_ipsec.h" |
#include "opt_ipsec.h" |
|
#include "opt_ipkdb.h" |
#include "ipkdb.h" |
|
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/malloc.h> |
#include <sys/malloc.h> |
|
|
#include <netkey/key_debug.h> |
#include <netkey/key_debug.h> |
#endif /*IPSEC*/ |
#endif /*IPSEC*/ |
|
|
|
#ifdef IPKDB |
|
#include <ipkdb/ipkdb.h> |
|
#endif |
|
|
/* |
/* |
* UDP protocol implementation. |
* UDP protocol implementation. |
* Per RFC 768, August, 1980. |
* Per RFC 768, August, 1980. |
Line 240 udp_input(m, va_alist) |
|
Line 243 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 305 udp_input(m, va_alist) |
|
Line 287 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; |
} |
} |
#if NIPKDB > 0 |
udpstat.udps_noport++; |
|
#ifdef IPKDB |
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), |
m->m_pkthdr.len - iphlen - sizeof(struct udphdr))) { |
m->m_pkthdr.len - iphlen - sizeof(struct udphdr))) { |
Line 433 udp6_input(mp, offp, proto) |
|
Line 415 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 638 udp4_realinput(src, dst, m, off) |
|
Line 620 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 655 udp4_realinput(src, dst, m, off) |
|
Line 636 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; |
} |
} |
#if NIPKDB > 0 |
udpstat.udps_noport++; |
|
#ifdef IPKDB |
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 821 udp6_realinput(af, src, dst, m, off) |
|
Line 802 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 847 udp6_realinput(af, src, dst, m, off) |
|
Line 826 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); |
Line 1075 udp_input(m, va_alist) |
|
Line 1054 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 1109 udp_input(m, va_alist) |
|
Line 1087 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 |
#ifdef IPKDB |
if (checkipkdb(&ip->ip_src, |
if (checkipkdb(&ip->ip_src, |
uh->uh_sport, |
uh->uh_sport, |
uh->uh_dport, |
uh->uh_dport, |
Line 1183 udp_ctlinput(cmd, sa, v) |
|
Line 1161 udp_ctlinput(cmd, sa, v) |
|
{ |
{ |
register struct ip *ip = v; |
register struct ip *ip = v; |
register struct udphdr *uh; |
register struct udphdr *uh; |
extern int inetctlerrmap[]; |
|
void (*notify) __P((struct inpcb *, int)) = udp_notify; |
void (*notify) __P((struct inpcb *, int)) = udp_notify; |
int errno; |
int errno; |
|
|
Line 1277 udp_output(m, va_alist) |
|
Line 1254 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 1309 udp_usrreq(so, req, m, nam, control, p) |
|
Line 1286 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_PURGEADDR) { |
if (req == PRU_PURGEIF) { |
in_purgeaddr((struct ifaddr *)nam, (struct ifnet *)control); |
in_purgeif((struct ifnet *)control); |
|
in_pcbpurgeif(&udbtable, (struct ifnet *)control); |
return (0); |
return (0); |
} |
} |
|
|