Date: Mon, 13 Nov 2000 10:38:53 +0200 From: Ruslan Ermilov <ru@FreeBSD.ORG> To: Charles Mott <cmott@scientech.com> Cc: Archie Cobbs <archie@dellroad.org>, net@FreeBSD.ORG, Ari Suutari <ari@suutari.iki.fi> Subject: Re: libalias: Incremental Update of Internet Checksum Message-ID: <20001113103852.E34671@sunbay.com> In-Reply-To: <Pine.BSF.4.21.0011130015100.50906-100000@carcassonne.scientech.com>; from cmott@scientech.com on Mon, Nov 13, 2000 at 12:29:32AM -0700 References: <Pine.BSF.4.21.0011122254240.50684-100000@carcassonne.scientech.com> <Pine.BSF.4.21.0011130015100.50906-100000@carcassonne.scientech.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--IS0zKkzwUGydFO0o Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Nov 13, 2000 at 12:29:32AM -0700, Charles Mott wrote: > Ok, ok -- Ruslan is mathematically correct, but > the problem is really neglible, because of how checksums > are commonly verified. Even if DifferentialChecksum() > incorrectly produces a 0xffff instead of 0x0000, this error > does not affect the verification sum computed by a recipient > machine. > > To quote from RF 1624: > > If an end system verifies the checksum by including the checksum > field itself in the one's complement sum and then comparing the > result against -0, as recommended by RFC 1071, it does not matter if > an intermediate system generated a -0 instead of +0 due to the RFC > 1141 property described here. > That's true but it does not mean that there is no problem. The checksum value of 0xffff is incorrect, because one's complement sum is guaranteed to be a non-zero if at least one item is non-zero (which is the case for IP header -- protocol field is non-zero). Actually I do not understand at all how DifferentialChecksum() works currently. What mathematica it is based on? > It would be interesting to do some network surveillance > to see how often 0xffff shows up in checksum fields. > I don't think too often, but it doesn't matter. The bug is there, and should be fixed. I am actually going to commit another patch to libalias(3). It uses the formula 3 from the above mentioned RFC, and is more straightforward to understand. It also has the plus in that you can freely change the signedness of accumulator without affecting the end result. I am attaching the patch here for those interested. Cheers, -- Ruslan Ermilov Oracle Developer/DBA, ru@sunbay.com Sunbay Software AG, ru@FreeBSD.org FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age --IS0zKkzwUGydFO0o Content-Type: message/rfc822 Content-Disposition: inline Date: Thu, 9 Nov 2000 17:36:29 +0200 From: Ruslan Ermilov <ru@FreeBSD.org> To: Brian Somers <brian@FreeBSD.org>, Ari Suutari <ari@suutari.iki.fi> Cc: Charles Mott <cmott@scientech.com>, Erik Salander <erik@whistle.com> Subject: Re: libalias: Incremental Update of Internet Checksum Message-ID: <20001109173629.A72896@sunbay.com> References: <20001108200359.A38693@sunbay.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="BXVAT5kNtrzKuDFl" Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20001108200359.A38693@sunbay.com>; from ru@FreeBSD.org on Wed, Nov 08, 2000 at 08:03:59PM +0200 --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Nov 08, 2000 at 08:03:59PM +0200, Ruslan Ermilov wrote: > Hi! > > The DifferentialChecksum() function in libalias(3) is used > to efficiently recompute the checksum for altered packets. > Unfortunately, the implementation suffers from the problem > described in RFC 1624. I have implemented the replacement > for it, using the final formula [4] from the RFC. > I am going to commit the following patch to libalias(3) on Monday until I get any objections or "wait" requests from you till that time. It uses the fomula 3 (rather than 4) from the above mentioned RFC. Cheers, -- Ruslan Ermilov Oracle Developer/DBA, ru@sunbay.com Sunbay Software AG, ru@FreeBSD.org FreeBSD committer, +380.652.512.251 Simferopol, Ukraine http://www.FreeBSD.org The Power To Serve http://www.oracle.com Enabling The Information Age --BXVAT5kNtrzKuDFl Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p Index: alias_util.c =================================================================== RCS file: /home/ncvs/src/lib/libalias/alias_util.c,v retrieving revision 1.5 diff -u -p -r1.5 alias_util.c --- alias_util.c 2000/04/05 07:45:39 1.5 +++ alias_util.c 2000/11/09 15:18:59 @@ -34,7 +34,7 @@ purposes); u_short PacketAliasInternetChecksum(u_short *ptr, int nbytes) { - int sum, oddbyte; + u_int sum, oddbyte; sum = 0; while (nbytes > 1) @@ -68,7 +68,7 @@ TcpChecksum(struct ip *pip) u_short *ptr; struct tcphdr *tc; int nhdr, ntcp, nbytes; - int sum, oddbyte; + u_int sum, oddbyte; nhdr = pip->ip_hl << 2; ntcp = ntohs(pip->ip_len) - nhdr; @@ -111,31 +111,23 @@ TcpChecksum(struct ip *pip) } +/* + * Incremental Update of Internet Checksum using [Eqn. 3] from RFC 1624. + */ void DifferentialChecksum(u_short *cksum, u_short *new, u_short *old, int n) { int i; - int accumulate; + u_int accumulate; - accumulate = *cksum; + accumulate = (u_short)~*cksum; for (i=0; i<n; i++) { - accumulate -= *new++; - accumulate += *old++; + accumulate += *new++; + accumulate += (u_short)~*old++; } - if (accumulate < 0) - { - accumulate = -accumulate; - accumulate = (accumulate >> 16) + (accumulate & 0xffff); - accumulate += accumulate >> 16; - *cksum = (u_short) ~accumulate; - } - else - { - accumulate = (accumulate >> 16) + (accumulate & 0xffff); - accumulate += accumulate >> 16; - *cksum = (u_short) accumulate; - } + accumulate = (accumulate >> 16) + (accumulate & 0xffff); + accumulate += accumulate >> 16; + *cksum = (u_short)~accumulate; } - Index: alias_local.h =================================================================== RCS file: /home/ncvs/src/lib/libalias/alias_local.h,v retrieving revision 1.18 diff -u -p -r1.18 alias_local.h --- alias_local.h 2000/10/30 17:24:12 1.18 +++ alias_local.h 2000/11/09 15:18:59 @@ -28,29 +28,19 @@ */ /* - The following macro is used to update an - internet checksum. "delta" is a 32-bit - accumulation of all the changes to the - checksum (adding in new 16-bit words and - subtracting out old words), and "cksum" - is the checksum value to be updated. -*/ + * The following macro is used to update an internet checksum. + * "acc" is a 32-bit accumulation of all the changes to the checksum + * (adding in all new 16-bit words and 16-bit one's complements of + * old 16-bit words), and "cksum" is the checksum value to be updated. + */ #define ADJUST_CHECKSUM(acc, cksum) { \ - acc += cksum; \ - if (acc < 0) \ - { \ - acc = -acc; \ - acc = (acc >> 16) + (acc & 0xffff); \ - acc += acc >> 16; \ - cksum = (u_short) ~acc; \ - } \ - else \ - { \ - acc = (acc >> 16) + (acc & 0xffff); \ - acc += acc >> 16; \ - cksum = (u_short) acc; \ - } \ + (acc) += (u_short)~(cksum); \ + (acc) = ((acc) >> 16) + ((acc) & 0xffff); \ + (acc) += (acc) >> 16; \ + (cksum) = (u_short)~(acc); \ } +#define NEW(new) ((u_short) (new)) +#define OLD(old) ((u_short)~(old)) /* Index: alias.c =================================================================== RCS file: /home/ncvs/src/lib/libalias/alias.c,v retrieving revision 1.27 diff -u -p -r1.27 alias.c --- alias.c 2000/10/30 17:24:12 1.27 +++ alias.c 2000/11/09 15:18:59 @@ -259,8 +259,8 @@ IcmpAliasIn1(struct ip *pip) original_id = GetOriginalPort(link); /* Adjust ICMP checksum */ - accumulate = ic->icmp_id; - accumulate -= original_id; + accumulate = OLD(ic->icmp_id); + accumulate += NEW(original_id); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* Put original sequence number back in */ @@ -333,13 +333,13 @@ IcmpAliasIn2(struct ip *pip) /* Adjust ICMP checksum */ sptr = (u_short *) &(ip->ip_src); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &original_address; - accumulate -= *sptr++; - accumulate -= *sptr; - accumulate += ud->uh_sport; - accumulate -= original_port; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); + accumulate += OLD(ud->uh_sport); + accumulate += NEW(original_port); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* Un-alias address in IP header */ @@ -366,13 +366,13 @@ fragment contained in ICMP data section /* Adjust ICMP checksum */ sptr = (u_short *) &(ip->ip_src); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &original_address; - accumulate -= *sptr++; - accumulate -= *sptr; - accumulate += ic2->icmp_id; - accumulate -= original_id; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); + accumulate += OLD(ic2->icmp_id); + accumulate += NEW(original_id); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* Un-alias address in IP header */ @@ -452,8 +452,8 @@ IcmpAliasOut1(struct ip *pip) alias_id = GetAliasPort(link); /* Since data field is being modified, adjust ICMP checksum */ - accumulate = ic->icmp_id; - accumulate -= alias_id; + accumulate = OLD(ic->icmp_id); + accumulate += NEW(alias_id); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* Alias sequence number */ @@ -527,13 +527,13 @@ IcmpAliasOut2(struct ip *pip) /* Adjust ICMP checksum */ sptr = (u_short *) &(ip->ip_dst); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &alias_address; - accumulate -= *sptr++; - accumulate -= *sptr; - accumulate += ud->uh_dport; - accumulate -= alias_port; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); + accumulate += OLD(ud->uh_dport); + accumulate += NEW(alias_port); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* @@ -565,13 +565,13 @@ fragment contained in ICMP data section /* Adjust ICMP checksum */ sptr = (u_short *) &(ip->ip_dst); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &alias_address; - accumulate -= *sptr++; - accumulate -= *sptr; - accumulate += ic2->icmp_id; - accumulate -= alias_id; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); + accumulate += OLD(ic2->icmp_id); + accumulate += NEW(alias_id); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* @@ -748,14 +748,14 @@ UdpAliasIn(struct ip *pip) /* is being unaliased and destination address is being altered. */ if (ud->uh_sum != 0) { - accumulate = alias_port; - accumulate -= ud->uh_dport; + accumulate = OLD(alias_port); + accumulate += NEW(ud->uh_dport); sptr = (u_short *) &alias_address; - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &original_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); ADJUST_CHECKSUM(accumulate, ud->uh_sum) } @@ -819,14 +819,14 @@ UdpAliasOut(struct ip *pip) int accumulate; u_short *sptr; - accumulate = ud->uh_sport; - accumulate -= alias_port; + accumulate = OLD(ud->uh_sport); + accumulate += NEW(alias_port); sptr = (u_short *) &(pip->ip_src); - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &alias_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); ADJUST_CHECKSUM(accumulate, ud->uh_sum) } @@ -883,29 +883,29 @@ TcpAliasIn(struct ip *pip) /* Adjust TCP checksum since destination port is being unaliased */ /* and destination port is being altered. */ - accumulate = alias_port; - accumulate -= tc->th_dport; + accumulate = OLD(alias_port); + accumulate += NEW(tc->th_dport); sptr = (u_short *) &alias_address; - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &original_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); /* If this is a proxy, then modify the TCP source port and checksum accumulation */ if (proxy_port != 0) { - accumulate += tc->th_sport; + accumulate += OLD(tc->th_sport); tc->th_sport = proxy_port; - accumulate -= tc->th_sport; + accumulate += NEW(tc->th_sport); sptr = (u_short *) &pip->ip_src; - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &proxy_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); } /* See if ACK number needs to be modified */ @@ -917,12 +917,12 @@ TcpAliasIn(struct ip *pip) if (delta != 0) { sptr = (u_short *) &tc->th_ack; - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); tc->th_ack = htonl(ntohl(tc->th_ack) - delta); sptr = (u_short *) &tc->th_ack; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); } } @@ -930,24 +930,24 @@ TcpAliasIn(struct ip *pip) /* Restore original IP address */ sptr = (u_short *) &pip->ip_dst; - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); pip->ip_dst = original_address; sptr = (u_short *) &pip->ip_dst; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); /* If this is a transparent proxy packet, then modify the source address */ if (proxy_address.s_addr != 0) { sptr = (u_short *) &pip->ip_src; - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); pip->ip_src = proxy_address; sptr = (u_short *) &pip->ip_src; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); } ADJUST_CHECKSUM(accumulate, pip->ip_sum); @@ -987,26 +987,26 @@ TcpAliasOut(struct ip *pip, int maxpacke int accumulate; u_short *sptr; - accumulate = tc->th_dport; + accumulate = OLD(tc->th_dport); tc->th_dport = proxy_server_port; - accumulate -= tc->th_dport; + accumulate += NEW(tc->th_dport); sptr = (u_short *) &(pip->ip_dst); - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &proxy_server_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); ADJUST_CHECKSUM(accumulate, tc->th_sum); sptr = (u_short *) &(pip->ip_dst); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); pip->ip_dst = proxy_server_address; sptr = (u_short *) &(pip->ip_dst); - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); ADJUST_CHECKSUM(accumulate, pip->ip_sum); } @@ -1055,16 +1055,16 @@ TcpAliasOut(struct ip *pip, int maxpacke /* Adjust TCP checksum since source port is being aliased */ /* and source address is being altered */ - accumulate = tc->th_sport; + accumulate = OLD(tc->th_sport); tc->th_sport = alias_port; - accumulate -= tc->th_sport; + accumulate += NEW(tc->th_sport); sptr = (u_short *) &(pip->ip_src); - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &alias_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); /* Modify sequence number if necessary */ if (GetAckModified(link) == 1) @@ -1075,12 +1075,12 @@ TcpAliasOut(struct ip *pip, int maxpacke if (delta != 0) { sptr = (u_short *) &tc->th_seq; - accumulate += *sptr++; - accumulate += *sptr; + accumulate += OLD(*sptr++); + accumulate += OLD(*sptr); tc->th_seq = htonl(ntohl(tc->th_seq) + delta); sptr = (u_short *) &tc->th_seq; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); } } @@ -1088,12 +1088,12 @@ TcpAliasOut(struct ip *pip, int maxpacke /* Change source address */ sptr = (u_short *) &(pip->ip_src); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); pip->ip_src = alias_address; sptr = (u_short *) &(pip->ip_src); - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); ADJUST_CHECKSUM(accumulate, pip->ip_sum) @@ -1466,19 +1466,19 @@ PacketUnaliasOut(char *ptr, /* /* Adjust TCP/UDP checksum */ sptr = (u_short *) &(pip->ip_src); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &original_address; - accumulate -= *sptr++; - accumulate -= *sptr; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); if (pip->ip_p == IPPROTO_UDP) { - accumulate += ud->uh_sport; - accumulate -= original_port; + accumulate += OLD(ud->uh_sport); + accumulate += NEW(original_port); ADJUST_CHECKSUM(accumulate, ud->uh_sum) } else { - accumulate += tc->th_sport; - accumulate -= original_port; + accumulate += OLD(tc->th_sport); + accumulate += NEW(original_port); ADJUST_CHECKSUM(accumulate, tc->th_sum) } @@ -1509,13 +1509,13 @@ PacketUnaliasOut(char *ptr, /* /* Adjust ICMP checksum */ sptr = (u_short *) &(pip->ip_src); - accumulate = *sptr++; - accumulate += *sptr; + accumulate = OLD(*sptr++); + accumulate += OLD(*sptr); sptr = (u_short *) &original_address; - accumulate -= *sptr++; - accumulate -= *sptr; - accumulate += ic->icmp_id; - accumulate -= original_id; + accumulate += NEW(*sptr++); + accumulate += NEW(*sptr); + accumulate += OLD(ic->icmp_id); + accumulate += NEW(original_id); ADJUST_CHECKSUM(accumulate, ic->icmp_cksum) /* Adjust IP checksum */ Index: alias_nbt.c =================================================================== RCS file: /home/ncvs/src/lib/libalias/alias_nbt.c,v retrieving revision 1.5 diff -u -p -r1.5 alias_nbt.c --- alias_nbt.c 2000/08/31 12:54:55 1.5 +++ alias_nbt.c 2000/11/09 15:18:59 @@ -233,14 +233,14 @@ int AliasHandleUdpNbt( if ( uh->uh_sum != 0 ) { int acc; u_short *sptr; - acc = ndh->source_port; - acc -= alias_port; + acc = OLD(ndh->source_port); + acc += NEW(alias_port); sptr = (u_short *) &(ndh->source_ip); - acc += *sptr++; - acc += *sptr; + acc += OLD(*sptr++); + acc += OLD(*sptr); sptr = (u_short *) alias_address; - acc -= *sptr++; - acc -= *sptr; + acc += NEW(*sptr++); + acc += NEW(*sptr); ADJUST_CHECKSUM(acc, uh->uh_sum) } ndh->source_ip = *alias_address; @@ -353,11 +353,11 @@ AliasHandleResourceNB( u_short *sptr; sptr = (u_short *) &(nb->addr); - acc = *sptr++; - acc += *sptr; + acc = OLD(*sptr++); + acc += OLD(*sptr); sptr = (u_short *) &(nbtarg->newaddr); - acc -= *sptr++; - acc -= *sptr; + acc += NEW(*sptr++); + acc += NEW(*sptr); ADJUST_CHECKSUM(acc, *nbtarg->uh_sum) } @@ -421,11 +421,11 @@ AliasHandleResourceA( u_short *sptr; sptr = (u_short *) &(a->addr); /* Old */ - acc = *sptr++; - acc += *sptr; + acc = OLD(*sptr++); + acc += OLD(*sptr); sptr = (u_short *) &nbtarg->newaddr; /* New */ - acc -= *sptr++; - acc -= *sptr; + acc += NEW(*sptr++); + acc += NEW(*sptr); ADJUST_CHECKSUM(acc, *nbtarg->uh_sum) } Index: alias_pptp.c =================================================================== RCS file: /home/ncvs/src/lib/libalias/alias_pptp.c,v retrieving revision 1.4 diff -u -p -r1.4 alias_pptp.c --- alias_pptp.c 2000/10/30 12:39:41 1.4 +++ alias_pptp.c 2000/11/09 15:19:00 @@ -177,14 +177,14 @@ AliasHandlePptpOut(struct ip *pip, / } if (pptp_link != NULL) { - int accumulate = cptr->cid1; + int accumulate = OLD(cptr->cid1); /* alias the Call Id */ cptr->cid1 = GetAliasPort(pptp_link); /* Compute TCP checksum for revised packet */ tc = (struct tcphdr *) ((char *) pip + (pip->ip_hl << 2)); - accumulate -= cptr->cid1; + accumulate += NEW(cptr->cid1); ADJUST_CHECKSUM(accumulate, tc->th_sum); switch (ctl_type) { @@ -247,14 +247,14 @@ AliasHandlePptpIn(struct ip *pip, /* *pcall_id); if (pptp_link != NULL) { - int accumulate = *pcall_id; + int accumulate = OLD(*pcall_id); /* De-alias the Peer's Call Id. */ *pcall_id = GetOriginalPort(pptp_link); /* Compute TCP checksum for modified packet */ tc = (struct tcphdr *) ((char *) pip + (pip->ip_hl << 2)); - accumulate -= *pcall_id; + accumulate += NEW(*pcall_id); ADJUST_CHECKSUM(accumulate, tc->th_sum); if (ctl_type == PPTP_OutCallReply || ctl_type == PPTP_InCallReply) { Index: alias_proxy.c =================================================================== RCS file: /home/ncvs/src/lib/libalias/alias_proxy.c,v retrieving revision 1.5 diff -u -p -r1.5 alias_proxy.c --- alias_proxy.c 2000/08/29 21:34:55 1.5 +++ alias_proxy.c 2000/11/09 15:19:00 @@ -326,9 +326,9 @@ ProxyEncodeTcpStream(struct alias_link * { int accumulate; - accumulate = pip->ip_len; + accumulate = OLD(pip->ip_len); pip->ip_len = htons(ntohs(pip->ip_len) + slen); - accumulate -= pip->ip_len; + accumulate += NEW(pip->ip_len); ADJUST_CHECKSUM(accumulate, pip->ip_sum); } @@ -385,18 +385,18 @@ ProxyEncodeIpHeader(struct ip *pip, u_short *sptr; sptr = (u_short *) option; - accumulate = 0; + accumulate = OLD(0); for (i=0; i<OPTION_LEN_INT16; i++) - accumulate -= *(sptr++); + accumulate += NEW(*(sptr++)); sptr = (u_short *) pip; - accumulate += *sptr; + accumulate += OLD(*sptr); pip->ip_hl += OPTION_LEN_INT32; - accumulate -= *sptr; + accumulate += NEW(*sptr); - accumulate += pip->ip_len; + accumulate += OLD(pip->ip_len); pip->ip_len = htons(ntohs(pip->ip_len) + OPTION_LEN_BYTES); - accumulate -= pip->ip_len; + accumulate += NEW(pip->ip_len); ADJUST_CHECKSUM(accumulate, pip->ip_sum); } --BXVAT5kNtrzKuDFl-- --IS0zKkzwUGydFO0o-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001113103852.E34671>