version 1.124, 2004/09/03 18:14:09 |
version 1.128, 2004/12/19 06:42:24 |
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_flags & M_LOOP) == 0 || |
udp6stat.udp6s_nosum++; |
udp_do_loopback_cksum)) { |
goto bad; |
if (uh->uh_sum == 0) { |
} |
udp6stat.udp6s_nosum++; |
if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { |
goto bad; |
udp6stat.udp6s_badsum++; |
} |
goto bad; |
if (in6_cksum(m, IPPROTO_UDP, off, ulen) != 0) { |
|
udp6stat.udp6s_badsum++; |
|
goto bad; |
|
} |
} |
} |
|
|
/* |
/* |
Line 830 udp_output(struct mbuf *m, ...) |
|
Line 842 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 883 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 892 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 912 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 1139 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 |