diff options
| author | Roamer <Roamer@Sun.COM> | 2009-11-21 01:05:40 -0800 |
|---|---|---|
| committer | Roamer <Roamer@Sun.COM> | 2009-11-21 01:05:40 -0800 |
| commit | f30c160edf27c0e40a231331fc03b8eae12e8f40 (patch) | |
| tree | cba28f2cb506df90a828e5ae77b834ee59f224ef /usr/src | |
| parent | 9ed8ca5f777cb150e39028583c8382c30279a66d (diff) | |
| download | illumos-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.c | 11 | ||||
| -rw-r--r-- | usr/src/uts/common/io/xge/drv/xgell.c | 8 | ||||
| -rw-r--r-- | usr/src/uts/intel/ip/ip.global-objs.debug64 | 1 | ||||
| -rw-r--r-- | usr/src/uts/intel/ip/ip.global-objs.obj64 | 1 | ||||
| -rw-r--r-- | usr/src/uts/sparc/ip/ip.global-objs.debug64 | 1 | ||||
| -rw-r--r-- | usr/src/uts/sparc/ip/ip.global-objs.obj64 | 1 |
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 |
