diff --git a/src/core/inet.c b/src/core/inet.c index d87065e1..59c80ea4 100644 --- a/src/core/inet.c +++ b/src/core/inet.c @@ -46,10 +46,21 @@ #include "lwip/def.h" #include "lwip/inet.h" +#include "lwip/sys.h" +/* This is a reference implementation of the checksum algorithm + - it may not work on all architectures, and all processors, particularly + if they have issues with alignment and 16 bit access. + + - in this case you will need to port it to your architecture and + #define LWIP_CHKSUM + in your sys_arch.h +*/ +#ifndef LWIP_CHKSUM +#define LWIP_CHKSUM lwip_standard_chksum static u16_t -lwip_chksum(void *dataptr, int len) +lwip_standard_chksum(void *dataptr, int len) { u32_t acc; @@ -75,6 +86,7 @@ lwip_chksum(void *dataptr, int len) return (u16_t)acc; } +#endif /* inet_chksum_pseudo: * @@ -96,7 +108,7 @@ inet_chksum_pseudo(struct pbuf *p, for(q = p; q != NULL; q = q->next) { LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", (void *)q, (void *)q->next)); - acc += lwip_chksum(q->payload, q->len); + acc += LWIP_CHKSUM(q->payload, q->len); /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%lx \n", acc));*/ while (acc >> 16) { acc = (acc & 0xffffUL) + (acc >> 16); @@ -136,7 +148,7 @@ inet_chksum(void *dataptr, u16_t len) { u32_t acc; - acc = lwip_chksum(dataptr, len); + acc = LWIP_CHKSUM(dataptr, len); while (acc >> 16) { acc = (acc & 0xffff) + (acc >> 16); } @@ -153,7 +165,7 @@ inet_chksum_pbuf(struct pbuf *p) acc = 0; swapped = 0; for(q = p; q != NULL; q = q->next) { - acc += lwip_chksum(q->payload, q->len); + acc += LWIP_CHKSUM(q->payload, q->len); while (acc >> 16) { acc = (acc & 0xffffUL) + (acc >> 16); }