| version 1.124, 2004/09/03 18:14:09 |
version 1.125, 2004/12/15 04:25:20 |
| Line 141 int udpcksum = 1; |
|
| Line 141 int udpcksum = 1; |
|
| #else |
#else |
| int udpcksum = 0; /* XXX */ |
int udpcksum = 0; /* XXX */ |
| #endif |
#endif |
| |
int udp_do_loopback_cksum = 0; |
| |
|
| struct inpcbtable udbtable; |
struct inpcbtable udbtable; |
| struct udpstat udpstat; |
struct udpstat udpstat; |
| Line 287 udp_input(struct mbuf *m, ...) |
|
| Line 288 udp_input(struct mbuf *m, ...) |
|
| break; |
break; |
| |
|
| default: |
default: |
| /* Need to compute it ourselves. */ |
/* |
| UDP_CSUM_COUNTER_INCR(&udp_swcsum); |
* Need to compute it ourselves. Maybe skip checksum |
| if (in4_cksum(m, IPPROTO_UDP, iphlen, len) != 0) |
* on loopback interfaces. |
| goto badcsum; |
*/ |
| |
if (__predict_true(!(m->m_pkthdr.rcvif->if_flags & |
| |
IFF_LOOPBACK) || |
| |
udp_do_loopback_cksum)) { |
| |
UDP_CSUM_COUNTER_INCR(&udp_swcsum); |
| |
if (in4_cksum(m, IPPROTO_UDP, iphlen, len) != 0) |
| |
goto badcsum; |
| |
} |
| break; |
break; |
| } |
} |
| } |
} |
| Line 419 udp6_input(struct mbuf **mp, int *offp, |
|
| Line 427 udp6_input(struct mbuf **mp, int *offp, |
|
| } |
} |
| |
|
| /* |
/* |
| * Checksum extended UDP header and data. |
* Checksum extended UDP header and data. Maybe skip checksum |
| |
* on loopback interfaces. |
| */ |
*/ |
| if (uh->uh_sum == 0) { |
if (__predict_true(!(m->m_pkthdr.rcvif->if_flags & |
| udp6stat.udp6s_nosum++; |
IFF_LOOPBACK) || |
| goto bad; |
udp_do_loopback_cksum)) { |
| } |
if (uh->uh_sum == 0) { |
| if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { |
udp6stat.udp6s_nosum++; |
| udp6stat.udp6s_badsum++; |
goto bad; |
| goto bad; |
} |
| |
if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { |
| |
udp6stat.udp6s_badsum++; |
| |
goto bad; |
| |
} |
| } |
} |
| |
|
| /* |
/* |
| Line 830 udp_output(struct mbuf *m, ...) |
|
| Line 843 udp_output(struct mbuf *m, ...) |
|
| { |
{ |
| struct inpcb *inp; |
struct inpcb *inp; |
| struct udpiphdr *ui; |
struct udpiphdr *ui; |
| |
struct route *ro; |
| int len = m->m_pkthdr.len; |
int len = m->m_pkthdr.len; |
| int error = 0; |
int error = 0; |
| va_list ap; |
va_list ap; |
| Line 870 udp_output(struct mbuf *m, ...) |
|
| Line 884 udp_output(struct mbuf *m, ...) |
|
| ui->ui_dport = inp->inp_fport; |
ui->ui_dport = inp->inp_fport; |
| ui->ui_ulen = htons((u_int16_t)len + sizeof(struct udphdr)); |
ui->ui_ulen = htons((u_int16_t)len + sizeof(struct udphdr)); |
| |
|
| |
ro = &inp->inp_route; |
| |
|
| /* |
/* |
| * Set up checksum and output datagram. |
* Set up checksum and output datagram. |
| */ |
*/ |
| Line 877 udp_output(struct mbuf *m, ...) |
|
| Line 893 udp_output(struct mbuf *m, ...) |
|
| /* |
/* |
| * XXX Cache pseudo-header checksum part for |
* XXX Cache pseudo-header checksum part for |
| * XXX "connected" UDP sockets. |
* XXX "connected" UDP sockets. |
| |
* Maybe skip checksums on loopback interfaces. |
| */ |
*/ |
| ui->ui_sum = in_cksum_phdr(ui->ui_src.s_addr, |
ui->ui_sum = in_cksum_phdr(ui->ui_src.s_addr, |
| ui->ui_dst.s_addr, htons((u_int16_t)len + |
ui->ui_dst.s_addr, htons((u_int16_t)len + |
| sizeof(struct udphdr) + IPPROTO_UDP)); |
sizeof(struct udphdr) + IPPROTO_UDP)); |
| m->m_pkthdr.csum_flags = M_CSUM_UDPv4; |
if (__predict_true(ro->ro_rt == NULL || |
| |
!(ro->ro_rt->rt_ifp->if_flags & |
| |
IFF_LOOPBACK) || |
| |
udp_do_loopback_cksum)) |
| |
m->m_pkthdr.csum_flags = M_CSUM_UDPv4; |
| |
else |
| |
m->m_pkthdr.csum_flags = 0; |
| m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); |
m->m_pkthdr.csum_data = offsetof(struct udphdr, uh_sum); |
| } else |
} else |
| ui->ui_sum = 0; |
ui->ui_sum = 0; |
| Line 890 udp_output(struct mbuf *m, ...) |
|
| Line 913 udp_output(struct mbuf *m, ...) |
|
| ((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.udps_opackets++; |
| |
|
| return (ip_output(m, inp->inp_options, &inp->inp_route, |
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), |
| inp->inp_moptions, inp->inp_socket)); |
inp->inp_moptions, inp->inp_socket)); |
| |
|
| Line 1117 SYSCTL_SETUP(sysctl_net_inet_udp_setup, |
|
| Line 1140 SYSCTL_SETUP(sysctl_net_inet_udp_setup, |
|
| NULL, 0, &udp_recvspace, 0, |
NULL, 0, &udp_recvspace, 0, |
| CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE, |
CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_RECVSPACE, |
| CTL_EOL); |
CTL_EOL); |
| |
sysctl_createv(clog, 0, NULL, NULL, |
| |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
| |
CTLTYPE_INT, "do_loopback_cksum", |
| |
SYSCTL_DESCR("Perform UDP checksum on loopback"), |
| |
NULL, 0, &udp_do_loopback_cksum, 0, |
| |
CTL_NET, PF_INET, IPPROTO_UDP, UDPCTL_LOOPBACKCKSUM, |
| |
CTL_EOL); |
| } |
} |
| #endif |
#endif |