[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lwip-users] lwip_chksum for H8
From: |
Paul Clarke |
Subject: |
[lwip-users] lwip_chksum for H8 |
Date: |
Tue, 14 Sep 2004 09:18:59 +0930 |
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;
}
- [lwip-users] lwip_chksum for H8,
Paul Clarke <=