diff --git a/components/free_rtos/base/swap.h b/components/free_rtos/base/swap.h index 1827509..153ee80 100644 --- a/components/free_rtos/base/swap.h +++ b/components/free_rtos/base/swap.h @@ -10,10 +10,10 @@ #include -//#define BASE_SWAP32(value) __builtin_bswap32(value) -#define BASE_SWAP32(value) __rev(value) +#define BASE_SWAP32(value) __builtin_bswap32(value) +//#define BASE_SWAP32(value) __rev(value) -//#define BASE_SWAP16(value) (uint16_t)__builtin_bswap16(value) -#define BASE_SWAP16(value) (uint16_t)__rev16(value) +#define BASE_SWAP16(value) (uint16_t)__builtin_bswap16(value) +//#define BASE_SWAP16(value) (uint16_t)__rev16(value) #endif /* FREE_RTOS_BASE_SWAP_H_ */ diff --git a/components/free_rtos/ethernet_ip/eth_checksum.c b/components/free_rtos/ethernet_ip/eth_checksum.c index 1feb666..a6307cd 100644 --- a/components/free_rtos/ethernet_ip/eth_checksum.c +++ b/components/free_rtos/ethernet_ip/eth_checksum.c @@ -8,6 +8,7 @@ #include "free_rtos/base/swap.h" #include +#include uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len) { @@ -56,69 +57,60 @@ uint16_t eth_calcChksum2(uint32_t sum, uint8_t * const hdata, uint16_t hlen, uin return ~sum; } -union PointerConverter -{ - void * unknown; - uint64_t * octet; - uint32_t * quartet; - uint16_t * duet; - uint8_t * solo; -}; - -struct Array { - uint16_t duet0; - uint16_t duet1; - uint16_t duet2; - uint16_t duet3; -}; - -union ValueConverter -{ - uint64_t octet; - uint32_t quartet; - uint16_t duet; - uint8_t solo; - struct Array array; -}; - uint32_t calcSum(void * const buffer, uint32_t sum, void * const data, uint16_t len) { - union PointerConverter buffer_start; - union PointerConverter data_start; - union ValueConverter value; + uint8_t* buffer_start; + uint8_t* data_start; + uint32_t value; - buffer_start.unknown = buffer; - data_start.unknown = data; + buffer_start = (uint8_t*)buffer; + data_start = (uint8_t*)data; + value = 0x00000000; - while(len >= sizeof(uint32_t)) { - len -= sizeof(uint32_t); + #define SIZE sizeof(uint32_t) + while(len >= SIZE) { + len -= SIZE; - value.quartet = *data_start.quartet++; - *buffer_start.quartet++ = value.quartet; + memcpy(&value, data_start, SIZE); + data_start += SIZE; - value.quartet = __rev16(value.quartet); - sum += value.array.duet0 + value.array.duet1; + memcpy(buffer_start, &value, SIZE); + buffer_start += SIZE; + + value = __rev16(value); + sum += (value&0xFFFF) + (value>>16); } + #undef SIZE - if(len >= sizeof(uint16_t)) { - len -= sizeof(uint16_t); + #define SIZE sizeof(uint16_t) + if(len >= SIZE) { + len -= SIZE; + value = 0x00000000; - value.duet = *data_start.duet++; - *buffer_start.duet++ = value.duet; + memcpy(&value, data_start, SIZE); + data_start += SIZE; - value.quartet = __rev16(value.quartet); - sum += value.duet; + memcpy(buffer_start, &value, SIZE); + buffer_start += SIZE; + + sum += __rev16(value); } + #undef SIZE - if(len >= sizeof(uint8_t)) { - len -= sizeof(uint8_t); + #define SIZE sizeof(uint8_t) + if(len >= SIZE) { + len -= SIZE; + value = 0x00000000; - value.solo = *data_start.solo++; - *buffer_start.solo++ = value.solo; + memcpy(&value, data_start, SIZE); + data_start += SIZE; - value.quartet = __rev16(value.quartet); - sum += value.solo; + memcpy(buffer_start, &value, SIZE); + buffer_start += SIZE; + + sum += __rev16(value); } + #undef SIZE return sum; }