| version 1.163, 2007/11/27 22:45:30 |
version 1.164, 2008/04/06 20:17:27 |
| Line 143 int udpcksum = 1; |
|
| Line 143 int udpcksum = 1; |
|
| int udp_do_loopback_cksum = 0; |
int udp_do_loopback_cksum = 0; |
| |
|
| struct inpcbtable udbtable; |
struct inpcbtable udbtable; |
| struct udpstat udpstat; |
|
| |
uint64_t udpstat[UDP_NSTATS]; |
| |
|
| #ifdef INET |
#ifdef INET |
| #ifdef IPSEC_NAT_T |
#ifdef IPSEC_NAT_T |
| Line 324 udp4_input_checksum(struct mbuf *m, cons |
|
| Line 325 udp4_input_checksum(struct mbuf *m, cons |
|
| return 0; |
return 0; |
| |
|
| badcsum: |
badcsum: |
| udpstat.udps_badsum++; |
udpstat[UDP_STAT_BADSUM]++; |
| return -1; |
return -1; |
| } |
} |
| |
|
| Line 346 udp_input(struct mbuf *m, ...) |
|
| Line 347 udp_input(struct mbuf *m, ...) |
|
| va_end(ap); |
va_end(ap); |
| |
|
| MCLAIM(m, &udp_rx_mowner); |
MCLAIM(m, &udp_rx_mowner); |
| udpstat.udps_ipackets++; |
udpstat[UDP_STAT_IPACKETS]++; |
| |
|
| /* |
/* |
| * Get IP and UDP header together in first mbuf. |
* Get IP and UDP header together in first mbuf. |
| Line 354 udp_input(struct mbuf *m, ...) |
|
| Line 355 udp_input(struct mbuf *m, ...) |
|
| ip = mtod(m, struct ip *); |
ip = mtod(m, struct ip *); |
| IP6_EXTHDR_GET(uh, struct udphdr *, m, iphlen, sizeof(struct udphdr)); |
IP6_EXTHDR_GET(uh, struct udphdr *, m, iphlen, sizeof(struct udphdr)); |
| if (uh == NULL) { |
if (uh == NULL) { |
| udpstat.udps_hdrops++; |
udpstat[UDP_STAT_HDROPS]++; |
| return; |
return; |
| } |
} |
| KASSERT(UDP_HDR_ALIGNED_P(uh)); |
KASSERT(UDP_HDR_ALIGNED_P(uh)); |
| Line 371 udp_input(struct mbuf *m, ...) |
|
| Line 372 udp_input(struct mbuf *m, ...) |
|
| len = ntohs((u_int16_t)uh->uh_ulen); |
len = ntohs((u_int16_t)uh->uh_ulen); |
| if (ip_len != iphlen + len) { |
if (ip_len != iphlen + len) { |
| if (ip_len < iphlen + len || len < sizeof(struct udphdr)) { |
if (ip_len < iphlen + len || len < sizeof(struct udphdr)) { |
| udpstat.udps_badlen++; |
udpstat[UDP_STAT_BADLEN]++; |
| goto bad; |
goto bad; |
| } |
} |
| m_adj(m, iphlen + len - ip_len); |
m_adj(m, iphlen + len - ip_len); |
| Line 388 udp_input(struct mbuf *m, ...) |
|
| Line 389 udp_input(struct mbuf *m, ...) |
|
| sockaddr_in_init(&dst, &ip->ip_dst, uh->uh_dport); |
sockaddr_in_init(&dst, &ip->ip_dst, uh->uh_dport); |
| |
|
| if ((n = udp4_realinput(&src, &dst, &m, iphlen)) == -1) { |
if ((n = udp4_realinput(&src, &dst, &m, iphlen)) == -1) { |
| udpstat.udps_hdrops++; |
udpstat[UDP_STAT_HDROPS]++; |
| return; |
return; |
| } |
} |
| #ifdef INET6 |
#ifdef INET6 |
| Line 416 udp_input(struct mbuf *m, ...) |
|
| Line 417 udp_input(struct mbuf *m, ...) |
|
| |
|
| if (n == 0) { |
if (n == 0) { |
| if (m->m_flags & (M_BCAST | M_MCAST)) { |
if (m->m_flags & (M_BCAST | M_MCAST)) { |
| udpstat.udps_noportbcast++; |
udpstat[UDP_STAT_NOPORTBCAST]++; |
| goto bad; |
goto bad; |
| } |
} |
| udpstat.udps_noport++; |
udpstat[UDP_STAT_NOPORT]++; |
| #ifdef IPKDB |
#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), |
| Line 638 udp4_sendup(struct mbuf *m, int off /* o |
|
| Line 639 udp4_sendup(struct mbuf *m, int off /* o |
|
| if (opts) |
if (opts) |
| m_freem(opts); |
m_freem(opts); |
| so->so_rcv.sb_overflowed++; |
so->so_rcv.sb_overflowed++; |
| udpstat.udps_fullsock++; |
udpstat[UDP_STAT_FULLSOCK]++; |
| } else |
} else |
| sorwakeup(so); |
sorwakeup(so); |
| } |
} |
| Line 778 udp4_realinput(struct sockaddr_in *src, |
|
| Line 779 udp4_realinput(struct sockaddr_in *src, |
|
| */ |
*/ |
| inp = in_pcblookup_connect(&udbtable, *src4, *sport, *dst4, *dport); |
inp = in_pcblookup_connect(&udbtable, *src4, *sport, *dst4, *dport); |
| if (inp == 0) { |
if (inp == 0) { |
| ++udpstat.udps_pcbhashmiss; |
udpstat[UDP_STAT_PCBHASHMISS]++; |
| inp = in_pcblookup_bind(&udbtable, *dst4, *dport); |
inp = in_pcblookup_bind(&udbtable, *dst4, *dport); |
| if (inp == 0) |
if (inp == 0) |
| return rcvcnt; |
return rcvcnt; |
| Line 926 udp6_realinput(int af, struct sockaddr_i |
|
| Line 927 udp6_realinput(int af, struct sockaddr_i |
|
| in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6, |
in6p = in6_pcblookup_connect(&udbtable, &src6, sport, dst6, |
| dport, 0); |
dport, 0); |
| if (in6p == 0) { |
if (in6p == 0) { |
| ++udpstat.udps_pcbhashmiss; |
udpstat[UDP_STAT_PCBHASHMISS]++; |
| in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0); |
in6p = in6_pcblookup_bind(&udbtable, dst6, dport, 0); |
| if (in6p == 0) |
if (in6p == 0) |
| return rcvcnt; |
return rcvcnt; |
| Line 1142 udp_output(struct mbuf *m, ...) |
|
| Line 1143 udp_output(struct mbuf *m, ...) |
|
| ((struct ip *)ui)->ip_len = htons(sizeof (struct udpiphdr) + len); |
((struct ip *)ui)->ip_len = htons(sizeof (struct udpiphdr) + len); |
| ((struct ip *)ui)->ip_ttl = inp->inp_ip.ip_ttl; /* XXX */ |
((struct ip *)ui)->ip_ttl = inp->inp_ip.ip_ttl; /* XXX */ |
| ((struct ip *)ui)->ip_tos = inp->inp_ip.ip_tos; /* XXX */ |
((struct ip *)ui)->ip_tos = inp->inp_ip.ip_tos; /* XXX */ |
| udpstat.udps_opackets++; |
udpstat[UDP_STAT_OPACKETS]++; |
| |
|
| return (ip_output(m, inp->inp_options, ro, |
return (ip_output(m, inp->inp_options, ro, |
| inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST), |
inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST), |
| Line 1391 SYSCTL_SETUP(sysctl_net_inet_udp_setup, |
|
| Line 1392 SYSCTL_SETUP(sysctl_net_inet_udp_setup, |
|
| CTLFLAG_PERMANENT, |
CTLFLAG_PERMANENT, |
| CTLTYPE_STRUCT, "stats", |
CTLTYPE_STRUCT, "stats", |
| SYSCTL_DESCR("UDP statistics"), |
SYSCTL_DESCR("UDP statistics"), |
| NULL, 0, &udpstat, sizeof(udpstat), |
NULL, 0, udpstat, sizeof(udpstat), |
| CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_STATS, |
CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_STATS, |
| CTL_EOL); |
CTL_EOL); |
| } |
} |