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

Reply via email to