57# define LWIP_CHKSUM lwip_standard_chksum
58# ifndef LWIP_CHKSUM_ALGORITHM
59# define LWIP_CHKSUM_ALGORITHM 2
61u16_t lwip_standard_chksum(
const void *dataptr,
int len);
64#ifndef LWIP_CHKSUM_ALGORITHM
65# define LWIP_CHKSUM_ALGORITHM 0
68#if (LWIP_CHKSUM_ALGORITHM == 1)
80lwip_standard_chksum(
const void *dataptr,
int len)
88 octetptr = (
const u8_t *)dataptr;
92 src = (*octetptr) << 8;
102 src = (*octetptr) << 8;
106 acc = (acc >> 16) + (acc & 0x0000ffffUL);
107 if ((acc & 0xffff0000UL) != 0) {
108 acc = (acc >> 16) + (acc & 0x0000ffffUL);
113 return lwip_htons((u16_t)acc);
117#if (LWIP_CHKSUM_ALGORITHM == 2)
133lwip_standard_chksum(
const void *dataptr,
int len)
135 const u8_t *pb = (
const u8_t *)dataptr;
139 int odd = ((mem_ptr_t)pb & 1);
142 if (odd && len > 0) {
143 ((u8_t *)&t)[1] = *pb++;
148 ps = (
const u16_t *)(
const void *)pb;
156 ((u8_t *)&t)[0] = *(
const u8_t *)ps;
176#if (LWIP_CHKSUM_ALGORITHM == 3)
189lwip_standard_chksum(
const void *dataptr,
int len)
191 const u8_t *pb = (
const u8_t *)dataptr;
197 int odd = ((mem_ptr_t)pb & 1);
199 if (odd && len > 0) {
200 ((u8_t *)&t)[1] = *pb++;
204 ps = (
const u16_t *)(
const void *)pb;
206 if (((mem_ptr_t)ps & 3) && len > 1) {
211 pl = (
const u32_t *)(
const void *)ps;
230 ps = (
const u16_t *)pl;
240 ((u8_t *)&t)[0] = *(
const u8_t *)ps;
260inet_cksum_pseudo_base(
struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc)
266 for (q = p; q != NULL; q = q->next) {
267 LWIP_DEBUGF(
INET_DEBUG, (
"inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n",
268 (
void *)q, (
void *)q->next));
269 acc += LWIP_CHKSUM(q->payload, q->len);
274 if (q->len % 2 != 0) {
285 acc += (u32_t)lwip_htons((u16_t)proto);
286 acc += (u32_t)lwip_htons(proto_len);
292 LWIP_DEBUGF(
INET_DEBUG, (
"inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F
"\n", acc));
293 return (u16_t)~(acc & 0xffffUL);
310inet_chksum_pseudo(
struct pbuf *p, u8_t proto, u16_t proto_len,
317 acc = (addr & 0xffffUL);
318 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
320 acc = (u32_t)(acc + (addr & 0xffffUL));
321 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
326 return inet_cksum_pseudo_base(p, proto, proto_len, acc);
343ip6_chksum_pseudo(
struct pbuf *p, u8_t proto, u16_t proto_len,
350 for (addr_part = 0; addr_part < 4; addr_part++) {
351 addr = src->addr[addr_part];
352 acc = (u32_t)(acc + (addr & 0xffffUL));
353 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
354 addr = dest->addr[addr_part];
355 acc = (u32_t)(acc + (addr & 0xffffUL));
356 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
362 return inet_cksum_pseudo_base(p, proto, proto_len, acc);
379ip_chksum_pseudo(
struct pbuf *p, u8_t proto, u16_t proto_len,
380 const ip_addr_t *src,
const ip_addr_t *dest)
383 if (IP_IS_V6(dest)) {
384 return ip6_chksum_pseudo(p, proto, proto_len, ip_2_ip6(src), ip_2_ip6(dest));
387#if LWIP_IPV4 && LWIP_IPV6
392 return inet_chksum_pseudo(p, proto, proto_len, ip_2_ip4(src), ip_2_ip4(dest));
399inet_cksum_pseudo_partial_base(
struct pbuf *p, u8_t proto, u16_t proto_len,
400 u16_t chksum_len, u32_t acc)
407 for (q = p; (q != NULL) && (chksum_len > 0); q = q->next) {
408 LWIP_DEBUGF(
INET_DEBUG, (
"inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n",
409 (
void *)q, (
void *)q->next));
411 if (chklen > chksum_len) {
414 acc += LWIP_CHKSUM(q->payload, chklen);
415 chksum_len = (u16_t)(chksum_len - chklen);
416 LWIP_ASSERT(
"delete me", chksum_len < 0x7fff);
420 if (q->len % 2 != 0) {
431 acc += (u32_t)lwip_htons((u16_t)proto);
432 acc += (u32_t)lwip_htons(proto_len);
438 LWIP_DEBUGF(
INET_DEBUG, (
"inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F
"\n", acc));
439 return (u16_t)~(acc & 0xffffUL);
456inet_chksum_pseudo_partial(
struct pbuf *p, u8_t proto, u16_t proto_len,
463 acc = (addr & 0xffffUL);
464 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
466 acc = (u32_t)(acc + (addr & 0xffffUL));
467 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
472 return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc);
491ip6_chksum_pseudo_partial(
struct pbuf *p, u8_t proto, u16_t proto_len,
498 for (addr_part = 0; addr_part < 4; addr_part++) {
499 addr = src->addr[addr_part];
500 acc = (u32_t)(acc + (addr & 0xffffUL));
501 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
502 addr = dest->addr[addr_part];
503 acc = (u32_t)(acc + (addr & 0xffffUL));
504 acc = (u32_t)(acc + ((addr >> 16) & 0xffffUL));
510 return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc);
526ip_chksum_pseudo_partial(
struct pbuf *p, u8_t proto, u16_t proto_len,
527 u16_t chksum_len,
const ip_addr_t *src,
const ip_addr_t *dest)
530 if (IP_IS_V6(dest)) {
531 return ip6_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ip_2_ip6(src), ip_2_ip6(dest));
534#if LWIP_IPV4 && LWIP_IPV6
539 return inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ip_2_ip4(src), ip_2_ip4(dest));
555inet_chksum(
const void *dataptr, u16_t
len)
557 return (u16_t)~(
unsigned int)LWIP_CHKSUM(dataptr,
len);
575 for (q = p; q != NULL; q = q->next) {
576 acc += LWIP_CHKSUM(q->payload, q->len);
578 if (q->len % 2 != 0) {
587 return (u16_t)~(acc & 0xffffUL);
597#if (LWIP_CHKSUM_COPY_ALGORITHM == 1)
603lwip_chksum_copy(
void *dst,
const void *src, u16_t
len)
606 return LWIP_CHKSUM(dst,
len);
struct ip6_addr ip6_addr_t
#define ip4_addr_get_u32(src_ipaddr)
#define MEMCPY(dst, src, len)
#define SWAP_BYTES_IN_WORD(w)
u16_t inet_chksum_pbuf(struct pbuf *p)
struct ip4_addr ip4_addr_t