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);