lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [lwip-users] lwip_chksum for H8


From: Jan Hyla [Home]
Subject: RE: [lwip-users] lwip_chksum for H8
Date: Thu, 16 Sep 2004 13:36:51 +0100

Hi Paul,

I got a compiler error with your code. I had to change the line

OddStart = (u8_t)dataptr & 0x01;

To

OddStart=(u32_t)dataptr & 0x01;

Cheers

Jan


-----Original Message-----
From: Paul Clarke [mailto:address@hidden
Sent: 14 September 2004 00:49
To: address@hidden
Subject: [lwip-users] lwip_chksum for H8


Heres my fix for the lwip_chksum of odd address data, it uses word access
so it should be as fast as the original lwip_chksum code and faster than the
byte access code posted earlier.

Paul


static u16_t
lwip_chksum(void *dataptr, int len)
{
  u32_t acc;
  u8_t  OddStart;

  OddStart = (u8_t)dataptr & 0x01;
  if (OddStart)
  {
    acc =  *(u8_t *)dataptr;
    dataptr = (void *)((u8_t *)dataptr + 1);
    len--;
  } else
  {
    acc = 0;
  }

  LWIP_DEBUGF(INET_DEBUG, ("lwip_chksum(%p, %d)\n", (void *)dataptr,
  len));
  for( ; len > 1; len -= 2) {
      /*    acc = acc + *((u16_t *)dataptr)++;*/
    acc += *(u16_t *)dataptr;
    dataptr = (void *)((u16_t *)dataptr + 1);
  }

  /* add up any odd byte */
  if (len == 1) {
    acc += htons((u16_t)((*(u8_t *)dataptr) & 0xff) << 8);
    LWIP_DEBUGF(INET_DEBUG, ("inet: chksum: odd byte %d\n", (unsigned
    int)(*(u8_t *)dataptr)));
  } else {
    LWIP_DEBUGF(INET_DEBUG, ("inet: chksum: no odd byte\n"));
  }
  acc = (acc >> 16) + (acc & 0xffffUL);

  if ((acc & 0xffff0000) != 0) {
    acc = (acc >> 16) + (acc & 0xffffUL);
  }

  if (OddStart) {
    acc = ((acc & 0xff00)>>8) | ((acc & 0x00ff)<<8);
  }

  return (u16_t)acc;
}










reply via email to

[Prev in Thread] Current Thread [Next in Thread]