netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mark Huth <mhuth@mvista.com>
To: "David S. Miller" <davem@redhat.com>
Cc: Joe Perches <joe@perches.com>, netdev@oss.sgi.com
Subject: Re: [IPX]: Fix checksum computation.
Date: Fri, 31 Oct 2003 16:29:45 -0700	[thread overview]
Message-ID: <3FA2F069.4070005@mvista.com> (raw)
In-Reply-To: 20031031132331.35a9aaca.davem@redhat.com



David S. Miller wrote:

>On Fri, 31 Oct 2003 13:24:06 -0800
>Joe Perches <joe@perches.com> wrote:
>
>  
>
>>Why is this a "fix"?  Performance?
>>It seems more like someone's idea of code neatening.
>>    
>>
>
>IPC checksums were being miscomputed in the original code,
>we're as mystified as you are as to why it is that:
>
>	if (sum & 0x10000) {
>		sum++;
>		sum &= 0xffff;
>	}
>
>works while:
>
>	sum = ((sym >> 16) + sum) & 0xffff;
>
>does not.  The theory was that it might be some x86 gcc bug,
>but looking at the assembler diff Arnaldo Carvalho de Melo
>(the appletalk maintainer) showed me between the before and
>after:
>
Nah, they are different algorithms, as the assembler code clearly 
demonstrates.  The above snippet is incomplete, with the crucial 
multiply by 2 or the shift left omitted.  The assembler code reveals 
this crucial piece of information.

>
> 	xorl	%eax, %eax
>-	decl	%ecx
> 	movb	(%ebx), %al
>-	incl	%ebx
> 	addl	%eax, %edx
> 	addl	%edx, %edx
>-	movl	%edx, %eax
>-	shrl	$16, %eax
>-	addl	%edx, %eax
>
The previous instruction adds 0, 1, or 2 to the checksum accumulation. 
 That's because in the case where
the byte added to the accumulation (addl %eax, %edx) causes the 16 bit 
to set, then when multiplied by 2 (addl %edx, %edx) the 17 bit is set 
and the 16 bit is clear.

>-	movzwl	%ax,%edx
>+	testl	$65536, %edx
>+	je	.L982
>
This version adds one to the accumulation iff bit 16 is set following 
the multiply.  The results are clearly different. This latter version 
would be a correct implementation of  feedback shiftregister algorithm, 
assuming that is what is being computed instead of a simple checksum. 
 Not knowing the specification for the algorithm offhand, I can't say 
which is correct.

They will, however, _sometimes_ give the same results.  That probably 
explains the rest of the comments in this thread.

>+	incl	%edx
>+	andl	$65535, %edx
>+.L982:
>+	decl	%ecx
>+	incl	%ebx
> 	cmpl	$-1, %ecx
>
>we still can't see what's wrong.
>
>He did confirm that the change in question makes IPX compute checksums
>correctly.
>
>
>
>  
>

  parent reply	other threads:[~2003-10-31 23:29 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <200310312006.h9VK62Hh005910@hera.kernel.org>
2003-10-31 21:24 ` [IPX]: Fix checksum computation Joe Perches
2003-10-31 21:23   ` David S. Miller
2003-10-31 21:34     ` Arnaldo Carvalho de Melo
2003-10-31 21:50     ` Joe Perches
2003-10-31 21:53       ` David S. Miller
2003-10-31 22:21         ` Stephen Hemminger
2003-10-31 22:46           ` Arnaldo Carvalho de Melo
2003-11-01  0:25           ` David S. Miller
2003-10-31 21:56       ` Arnaldo Carvalho de Melo
2003-10-31 23:29     ` Mark Huth [this message]
2003-11-01  0:31       ` Joe Perches
2003-11-01  0:31         ` David S. Miller
2003-10-31 21:31   ` Arnaldo Carvalho de Melo
2003-11-01  0:38     ` Stephen Hemminger
2003-11-01  1:13       ` Arnaldo Carvalho de Melo
2003-11-01  1:19         ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3FA2F069.4070005@mvista.com \
    --to=mhuth@mvista.com \
    --cc=davem@redhat.com \
    --cc=joe@perches.com \
    --cc=netdev@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).