diff --git a/components/free_rtos/base/swap.h b/components/free_rtos/base/swap.h index 800f90e..1827509 100644 --- a/components/free_rtos/base/swap.h +++ b/components/free_rtos/base/swap.h @@ -8,8 +8,12 @@ #ifndef FREE_RTOS_BASE_SWAP_H_ #define FREE_RTOS_BASE_SWAP_H_ -#define BASE_SWAP32(value) __builtin_bswap32(value) +#include -#define BASE_SWAP16(value) (uint16_t)__builtin_bswap16(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) #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 a434035..1feb666 100644 --- a/components/free_rtos/ethernet_ip/eth_checksum.c +++ b/components/free_rtos/ethernet_ip/eth_checksum.c @@ -7,6 +7,8 @@ #include "free_rtos/ethernet_ip/eth_checksum.h" #include "free_rtos/base/swap.h" +#include + uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len) { uint16_t i; @@ -54,44 +56,74 @@ uint16_t eth_calcChksum2(uint32_t sum, uint8_t * const hdata, uint16_t hlen, uin return ~sum; } -inline uint32_t calcSum(void * buffer, uint32_t sum, void * const data, uint16_t len) { - uint32_t * buffer_start32 = (uint32_t*)buffer; - uint32_t * data_start32 = (uint32_t*)data; - uint32_t * data_end32 = data_start32 + len/sizeof(uint32_t); - uint32_t remainder = len%sizeof(uint32_t); - uint32_t value; +union PointerConverter +{ + void * unknown; + uint64_t * octet; + uint32_t * quartet; + uint16_t * duet; + uint8_t * solo; +}; - while(data_start32 < data_end32) { - value = *data_start32++; - *buffer_start32++ = value; - value = __rev16(value); - sum += (value&0xFFFF) + (value>>16); +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; + + buffer_start.unknown = buffer; + data_start.unknown = data; + + while(len >= sizeof(uint32_t)) { + len -= sizeof(uint32_t); + + value.quartet = *data_start.quartet++; + *buffer_start.quartet++ = value.quartet; + + value.quartet = __rev16(value.quartet); + sum += value.array.duet0 + value.array.duet1; } - uint16_t * buffer_start16 = (uint16_t*)buffer_start32; - uint16_t * data_start16 = (uint16_t*)data_start32; + if(len >= sizeof(uint16_t)) { + len -= sizeof(uint16_t); - if(remainder > 1) { - value = *data_start16++; - *buffer_start16++ = value; - value = __rev16(value); - sum += value; + value.duet = *data_start.duet++; + *buffer_start.duet++ = value.duet; + + value.quartet = __rev16(value.quartet); + sum += value.duet; } - uint8_t * buffer_start8 = (uint8_t*)buffer_start16; - uint8_t * data_start8 = (uint8_t*)data_start16; + if(len >= sizeof(uint8_t)) { + len -= sizeof(uint8_t); - if(remainder == 1) { - value = *data_start8++; - *buffer_start8++ = value; - value = __rev16(value); - sum += value; + value.solo = *data_start.solo++; + *buffer_start.solo++ = value.solo; + + value.quartet = __rev16(value.quartet); + sum += value.solo; } return sum; } -uint16_t eth_calcChksum3(void * buffer, uint32_t sum, void * const hdata, uint16_t hlen, void * const data, uint16_t len) +uint16_t eth_calcChksum3(void * const buffer, uint32_t sum, void * const hdata, uint16_t hlen, void * const data, uint16_t len) { if(hdata != 0) { sum = calcSum(buffer, sum, hdata, hlen); diff --git a/components/free_rtos/ethernet_ip/eth_checksum.h b/components/free_rtos/ethernet_ip/eth_checksum.h index b861c69..0d5cd31 100644 --- a/components/free_rtos/ethernet_ip/eth_checksum.h +++ b/components/free_rtos/ethernet_ip/eth_checksum.h @@ -16,7 +16,7 @@ extern "C" { uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len); uint16_t eth_calcChksum2(uint32_t sum, uint8_t * const hdata, uint16_t hlen, uint8_t * const data, uint16_t len); -uint16_t eth_calcChksum3(void * buffer, uint32_t sum, void * const hdata, uint16_t hlen, void * const data, uint16_t len); +uint16_t eth_calcChksum3(void * const buffer, uint32_t sum, void * const hdata, uint16_t hlen, void * const data, uint16_t len); #ifdef __cplusplus } diff --git a/components/free_rtos/ethernet_ip/eth_udp_client.hpp b/components/free_rtos/ethernet_ip/eth_udp_client.hpp index f94bdb8..845867b 100644 --- a/components/free_rtos/ethernet_ip/eth_udp_client.hpp +++ b/components/free_rtos/ethernet_ip/eth_udp_client.hpp @@ -61,7 +61,7 @@ public: return 0; } - if (buff_[toggle_].size() == 0) { + if (buff_[out_toggle_].size() == 0) { if(capture_buffer() == false) { return 0; }