Hi,
Can we merge the duplicate IPv4 and IPv6 checksum checking code in
udp_input() into one block?
ok?
bluhm
Index: netinet/udp_usrreq.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/udp_usrreq.c,v
retrieving revision 1.157
diff -u -p -r1.157 udp_usrreq.c
--- netinet/udp_usrreq.c 31 Mar 2013 11:18:35 -0000 1.157
+++ netinet/udp_usrreq.c 31 Mar 2013 19:57:21 -0000
@@ -259,12 +259,6 @@ udp_input(struct mbuf *m, ...)
if (ip)
save_ip = *ip;
- /*
- * Checksum extended UDP header and data.
- * from W.R.Stevens: check incoming udp cksums even if
- * udpcksum is not set.
- */
- savesum = uh->uh_sum;
#ifdef INET6
if (ip6) {
/* Be proactive about malicious use of IPv4 mapped address */
@@ -273,14 +267,25 @@ udp_input(struct mbuf *m, ...)
/* XXX stat */
goto bad;
}
+ }
+#endif /* INET6 */
+ /*
+ * Checksum extended UDP header and data.
+ * from W.R.Stevens: check incoming udp cksums even if
+ * udpcksum is not set.
+ */
+ savesum = uh->uh_sum;
+ if (uh->uh_sum == 0) {
+ udpstat.udps_nosum++;
+#ifdef INET6
/*
* In IPv6, the UDP checksum is ALWAYS used.
*/
- if (uh->uh_sum == 0) {
- udpstat.udps_nosum++;
+ if (ip6)
goto bad;
- }
+#endif /* INET6 */
+ } else {
if ((m->m_pkthdr.csum_flags & M_UDP_CSUM_IN_OK) == 0) {
if (m->m_pkthdr.csum_flags & M_UDP_CSUM_IN_BAD) {
udpstat.udps_badsum++;
@@ -288,38 +293,23 @@ udp_input(struct mbuf *m, ...)
goto bad;
}
- if ((uh->uh_sum = in6_cksum(m, IPPROTO_UDP,
- iphlen, len))) {
- udpstat.udps_badsum++;
- goto bad;
- }
- } else {
- m->m_pkthdr.csum_flags &= ~M_UDP_CSUM_IN_OK;
- udpstat.udps_inhwcsum++;
- }
- } else
+ if (ip)
+ uh->uh_sum = in4_cksum(m, IPPROTO_UDP,
+ iphlen, len);
+#ifdef INET6
+ else if (ip6)
+ uh->uh_sum = in6_cksum(m, IPPROTO_UDP,
+ iphlen, len);
#endif /* INET6 */
- if (uh->uh_sum) {
- if ((m->m_pkthdr.csum_flags & M_UDP_CSUM_IN_OK) == 0) {
- if (m->m_pkthdr.csum_flags & M_UDP_CSUM_IN_BAD) {
- udpstat.udps_badsum++;
- udpstat.udps_inhwcsum++;
- m_freem(m);
- return;
- }
-
- if ((uh->uh_sum = in4_cksum(m, IPPROTO_UDP,
- iphlen, len))) {
+ if (uh->uh_sum != 0) {
udpstat.udps_badsum++;
- m_freem(m);
- return;
+ goto bad;
}
} else {
m->m_pkthdr.csum_flags &= ~M_UDP_CSUM_IN_OK;
udpstat.udps_inhwcsum++;
}
- } else
- udpstat.udps_nosum++;
+ }
#ifdef IPSEC
if (udpencap_enable && udpencap_port &&