Module Name:    src
Committed By:   tsutsui
Date:           Thu Apr 16 14:39:11 UTC 2009

Modified Files:
        src/sys/dev/ic: hme.c

Log Message:
Some cosmetics in rxcsum code.  Tested on i386.


To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/dev/ic/hme.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/hme.c
diff -u src/sys/dev/ic/hme.c:1.75 src/sys/dev/ic/hme.c:1.76
--- src/sys/dev/ic/hme.c:1.75	Thu Apr 16 14:08:18 2009
+++ src/sys/dev/ic/hme.c	Thu Apr 16 14:39:11 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: hme.c,v 1.75 2009/04/16 14:08:18 tsutsui Exp $	*/
+/*	$NetBSD: hme.c,v 1.76 2009/04/16 14:39:11 tsutsui Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.75 2009/04/16 14:08:18 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hme.c,v 1.76 2009/04/16 14:39:11 tsutsui Exp $");
 
 /* #define HMEDEBUG */
 
@@ -675,6 +675,9 @@
 	struct mbuf *m, *m0, *newm;
 	char *bp;
 	int len, totlen;
+#ifdef INET
+	int csum_flags;
+#endif
 
 	totlen = HME_XD_DECODE_RSIZE(flags);
 	MGETHDR(m0, M_DONTWAIT, MT_DATA);
@@ -719,6 +722,7 @@
 
 #ifdef INET
 	/* hardware checksum */
+	csum_flags = 0;
 	if (ifp->if_csum_flags_rx & (M_CSUM_TCPv4 | M_CSUM_UDPv4)) {
 		struct ether_header *eh;
 		struct ether_vlan_header *evh;
@@ -726,7 +730,7 @@
 		struct udphdr *uh;
 		uint16_t *opts;
 		int32_t hlen, pktlen;
-		uint32_t temp;
+		uint32_t csum_data;
 
 		eh = mtod(m0, struct ether_header *);
 		if (ntohs(eh->ether_type) == ETHERTYPE_IP) {
@@ -755,20 +759,22 @@
 		 * bail if too short, has random trailing garbage, truncated,
 		 * fragment, or has ethernet pad.
 		 */
-		if ((ntohs(ip->ip_len) < hlen) || (ntohs(ip->ip_len) != pktlen)
-		    || (ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)))
+		if (ntohs(ip->ip_len) < hlen ||
+		    ntohs(ip->ip_len) != pktlen ||
+		    (ntohs(ip->ip_off) & (IP_MF | IP_OFFMASK)) != 0)
 			goto swcsum;
 
 		switch (ip->ip_p) {
 		case IPPROTO_TCP:
-			if (! (ifp->if_csum_flags_rx & M_CSUM_TCPv4))
+			if ((ifp->if_csum_flags_rx & M_CSUM_TCPv4) == 0)
 				goto swcsum;
 			if (pktlen < (hlen + sizeof(struct tcphdr)))
 				goto swcsum;
-			m0->m_pkthdr.csum_flags = M_CSUM_TCPv4;
+			csum_flags =
+			    M_CSUM_TCPv4 | M_CSUM_DATA | M_CSUM_NO_PSEUDOHDR;
 			break;
 		case IPPROTO_UDP:
-			if (! (ifp->if_csum_flags_rx & M_CSUM_UDPv4))
+			if ((ifp->if_csum_flags_rx & M_CSUM_UDPv4) == 0)
 				goto swcsum;
 			if (pktlen < (hlen + sizeof(struct udphdr)))
 				goto swcsum;
@@ -776,48 +782,47 @@
 			/* no checksum */
 			if (uh->uh_sum == 0)
 				goto swcsum;
-			m0->m_pkthdr.csum_flags = M_CSUM_UDPv4;
+			csum_flags =
+			    M_CSUM_UDPv4 | M_CSUM_DATA | M_CSUM_NO_PSEUDOHDR;
 			break;
 		default:
 			goto swcsum;
 		}
 
 		/* w/ M_CSUM_NO_PSEUDOHDR, the uncomplemented sum is expected */
-		m0->m_pkthdr.csum_data = (~flags) & HME_XD_RXCKSUM;
+		csum_data = ~flags & HME_XD_RXCKSUM;
 
 		/*
 		 * If data offset is different from RX cksum start offset,
 		 * we have to deduct them.
 		 */
-		temp = ((char *)ip + hlen) -
+		hlen = ((char *)ip + hlen) -
 		    ((char *)eh + ETHER_HDR_LEN + sizeof(struct ip));
-		if (temp > 1) {
+		if (hlen > 1) {
 			uint32_t optsum;
 
 			optsum = 0;
 			opts = (uint16_t *)((char *)eh +
 			    ETHER_HDR_LEN + sizeof(struct ip));
 
-			while (temp > 1) {
+			while (hlen > 1) {
 				optsum += ntohs(*opts++);
-				temp -= 2;
+				hlen -= 2;
 			}
 			while (optsum >> 16)
 				optsum = (optsum >> 16) + (optsum & 0xffff);
 
 			/* Deduct the ip opts sum from the hwsum. */
-			m0->m_pkthdr.csum_data += (uint16_t)~optsum;
+			csum_data += (uint16_t)~optsum;
 
-			while (m0->m_pkthdr.csum_data >> 16)
-				m0->m_pkthdr.csum_data =
-					(m0->m_pkthdr.csum_data >> 16) +
-					(m0->m_pkthdr.csum_data & 0xffff);
+			while (csum_data >> 16)
+				csum_data =
+				    (csum_data >> 16) + (csum_data & 0xffff);
 		}
-
-		m0->m_pkthdr.csum_flags |= M_CSUM_DATA | M_CSUM_NO_PSEUDOHDR;
-	} else
+		m0->m_pkthdr.csum_data = csum_data;
+	}
 swcsum:
-		m0->m_pkthdr.csum_flags = 0;
+	m0->m_pkthdr.csum_flags = csum_flags;
 #endif
 
 	return (m0);

Reply via email to