From owner-freebsd-hackers Mon Nov 22 21:57: 1 1999 Delivered-To: freebsd-hackers@freebsd.org Received: from alpo.whistle.com (alpo.whistle.com [207.76.204.38]) by hub.freebsd.org (Postfix) with ESMTP id 2130414A04 for ; Mon, 22 Nov 1999 21:56:57 -0800 (PST) (envelope-from julian@whistle.com) Received: from current1.whiste.com (current1.whistle.com [207.76.205.22]) by alpo.whistle.com (8.9.1a/8.9.1) with ESMTP id VAA47647; Mon, 22 Nov 1999 21:56:27 -0800 (PST) Date: Mon, 22 Nov 1999 21:56:27 -0800 (PST) From: Julian Elischer To: "Parthasarathy M. Aji" Cc: freebsd-hackers@FreeBSD.ORG, Clinton Xavier Berni Subject: Re: ip checksum In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG How many bytes have you changed? is it possible that some of the values have already been ntohs()'d or something similar? rather than recalculate the whole packet, just update the exisitng value. there is an rfc for this but it took me a while to get the code right in C on a 386. The trick is getting the 1s complement arithmetic right. #define FIXSUM16(c, op, np) \ do { \ (c) -= (u_int16_t) ~*((u_int16_t *) (op)); \ if ((c) < 0) { \ (c) += 0xffff; \ } \ (c) -= (u_int16_t) *((u_int16_t *) (np)); \ if ((c) < 0) { \ (c) += 0xffff; \ } \ } while (0) /* * IpsumReplaceShort() * * Replace a 16 bit aligned (relative to the checksum) 16 bit value * in a packet and change the IP/TCP/UDP checksum at the same time. * * Works with both big and little endian machines(!) * * If for some wierd reason you want to replace a nonaligned value, * you need to byteswap it and the old value before doing the * subtractions. */ void IpsumReplaceShort(u_int16_t *cksump, u_int16_t *oldvalp, u_int16_t newval) { register int cksum; cksum = *cksump; FIXSUM16(cksum, oldvalp, &newval); *cksump = cksum; *oldvalp = newval; } On Tue, 23 Nov 1999, Parthasarathy M. Aji wrote: > Hey, > > I am trying to recompute the checksum of an IP packet. I use > netinet/in_chksum.c to do this. The values returned are not correct. I've > reset the ip_sum field to 0 before doing the sum. Is there something > missing? > > thanks > > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-hackers" in the body of the message > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message