icmp: Utilize in_cksum_skip()
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 16 Nov 2014 05:55:13 +0000 (13:55 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 16 Nov 2014 05:55:13 +0000 (13:55 +0800)
This avoids unnecessary m_data and m_len adjustment before and after
in_cksum().

sys/netinet/ip_icmp.c

index b09f612..3b3b878 100644 (file)
@@ -290,15 +290,12 @@ icmp_input(struct mbuf **mp, int *offp, int proto)
                return(IPPROTO_DONE);
        }
        ip = mtod(m, struct ip *);
-       m->m_len -= hlen;
-       m->m_data += hlen;
-       icp = mtod(m, struct icmp *);
-       if (in_cksum(m, icmplen)) {
+
+       if (in_cksum_skip(m, hlen + icmplen, hlen)) {
                icmpstat.icps_checksum++;
                goto freeit;
        }
-       m->m_len += hlen;
-       m->m_data -= hlen;
+       icp = mtod(m, struct icmp *);
 
        if (m->m_pkthdr.rcvif && m->m_pkthdr.rcvif->if_type == IFT_FAITH) {
                /*