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 &&