summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorRoamer <Roamer@Sun.COM>2009-11-21 01:05:40 -0800
committerRoamer <Roamer@Sun.COM>2009-11-21 01:05:40 -0800
commitf30c160edf27c0e40a231331fc03b8eae12e8f40 (patch)
treecba28f2cb506df90a828e5ae77b834ee59f224ef /usr/src
parent9ed8ca5f777cb150e39028583c8382c30279a66d (diff)
downloadillumos-joyent-f30c160edf27c0e40a231331fc03b8eae12e8f40.tar.gz
6898088 Wrongly set start and end values for partial checksum
6902567 Should not rely on partial checksum value when IP packet has options
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/inet/ip/ip_input.c11
-rw-r--r--usr/src/uts/common/io/xge/drv/xgell.c8
-rw-r--r--usr/src/uts/intel/ip/ip.global-objs.debug641
-rw-r--r--usr/src/uts/intel/ip/ip.global-objs.obj641
-rw-r--r--usr/src/uts/sparc/ip/ip.global-objs.debug641
-rw-r--r--usr/src/uts/sparc/ip/ip.global-objs.obj641
6 files changed, 11 insertions, 12 deletions
diff --git a/usr/src/uts/common/inet/ip/ip_input.c b/usr/src/uts/common/inet/ip/ip_input.c
index 3d7d4282d0..38a7ded7c1 100644
--- a/usr/src/uts/common/inet/ip/ip_input.c
+++ b/usr/src/uts/common/inet/ip/ip_input.c
@@ -1759,6 +1759,13 @@ ip_input_local_v4(ire_t *ire, mblk_t *mp, ipha_t *ipha, ip_recv_attr_t *ira)
/* Error has been sent and mp consumed */
return;
}
+ /*
+ * Some old hardware does partial checksum by including the
+ * whole IP header, so the partial checksum value might have
+ * become invalid if any option in the packet have been
+ * updated. Always clear partial checksum flag here.
+ */
+ DB_CKSUMFLAGS(mp) &= ~HCK_PARTIALCKSUM;
}
/*
@@ -2139,9 +2146,6 @@ ip_input_sw_cksum_v4(mblk_t *mp, ipha_t *ipha, ip_recv_attr_t *ira)
return (B_FALSE);
}
-/* There are drivers that can't do partial checksum with IP options */
-int eri_cksum_workaround = 1;
-
/*
* Verify the ULP checksums.
* Returns B_TRUE if ok, or if the ULP doesn't have a well-defined checksum
@@ -2245,7 +2249,6 @@ ip_input_cksum_v4(iaflags_t iraflags, mblk_t *mp, ipha_t *ipha,
if ((hck_flags & HCK_PARTIALCKSUM) &&
(mp1 == NULL || mp1->b_cont == NULL) &&
ip_hdr_length >= DB_CKSUMSTART(mp) &&
- (!eri_cksum_workaround || ip_hdr_length == IP_SIMPLE_HDR_LENGTH) &&
((len = ip_hdr_length - DB_CKSUMSTART(mp)) & 1) == 0) {
uint32_t adj;
uchar_t *cksum_start;
diff --git a/usr/src/uts/common/io/xge/drv/xgell.c b/usr/src/uts/common/io/xge/drv/xgell.c
index 4ec1117750..d1b85d74f2 100644
--- a/usr/src/uts/common/io/xge/drv/xgell.c
+++ b/usr/src/uts/common/io/xge/drv/xgell.c
@@ -20,12 +20,12 @@
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
- * Copyright (c) 2002-2008 Neterion, Inc.
+ * Copyright (c) 2002-2009 Neterion, Inc.
* All right Reserved.
*
* FileName : xgell.c
@@ -635,9 +635,9 @@ xgell_rx_hcksum_assoc(mblk_t *mp, char *vaddr, int pkt_length,
if (ext_info->proto & XGE_HAL_FRAME_PROTO_IPV4) {
struct ip *ip =
(struct ip *)(vaddr + ip_off);
- start = ip->ip_hl * 4 + ip_off;
+ start = ip->ip_hl * 4;
} else {
- start = ip_off + 40;
+ start = 40;
}
cksum_flags |= HCK_PARTIALCKSUM;
(void) hcksum_assoc(mp, NULL, NULL, start, 0,
diff --git a/usr/src/uts/intel/ip/ip.global-objs.debug64 b/usr/src/uts/intel/ip/ip.global-objs.debug64
index 07e9aaedde..cc6e4c2c57 100644
--- a/usr/src/uts/intel/ip/ip.global-objs.debug64
+++ b/usr/src/uts/intel/ip/ip.global-objs.debug64
@@ -312,5 +312,4 @@ udp_winit
udpinfov4
udpinfov6
winit_arp
-eri_cksum_workaround
nxge_cksum_workaround
diff --git a/usr/src/uts/intel/ip/ip.global-objs.obj64 b/usr/src/uts/intel/ip/ip.global-objs.obj64
index 526e907ab5..480312cbe4 100644
--- a/usr/src/uts/intel/ip/ip.global-objs.obj64
+++ b/usr/src/uts/intel/ip/ip.global-objs.obj64
@@ -309,5 +309,4 @@ udp_winit
udpinfov4
udpinfov6
winit_arp
-eri_cksum_workaround
nxge_cksum_workaround
diff --git a/usr/src/uts/sparc/ip/ip.global-objs.debug64 b/usr/src/uts/sparc/ip/ip.global-objs.debug64
index 07e9aaedde..cc6e4c2c57 100644
--- a/usr/src/uts/sparc/ip/ip.global-objs.debug64
+++ b/usr/src/uts/sparc/ip/ip.global-objs.debug64
@@ -312,5 +312,4 @@ udp_winit
udpinfov4
udpinfov6
winit_arp
-eri_cksum_workaround
nxge_cksum_workaround
diff --git a/usr/src/uts/sparc/ip/ip.global-objs.obj64 b/usr/src/uts/sparc/ip/ip.global-objs.obj64
index 526e907ab5..480312cbe4 100644
--- a/usr/src/uts/sparc/ip/ip.global-objs.obj64
+++ b/usr/src/uts/sparc/ip/ip.global-objs.obj64
@@ -309,5 +309,4 @@ udp_winit
udpinfov4
udpinfov6
winit_arp
-eri_cksum_workaround
nxge_cksum_workaround