fix(): Исправлена ошибка вычисления контрольной суммы

This commit is contained in:
algin 2024-07-02 14:05:02 +03:00
parent 998279b54d
commit 03c81dc004
4 changed files with 66 additions and 30 deletions

View File

@ -8,8 +8,12 @@
#ifndef FREE_RTOS_BASE_SWAP_H_ #ifndef FREE_RTOS_BASE_SWAP_H_
#define FREE_RTOS_BASE_SWAP_H_ #define FREE_RTOS_BASE_SWAP_H_
#define BASE_SWAP32(value) __builtin_bswap32(value) #include <arm_acle.h>
#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_ */ #endif /* FREE_RTOS_BASE_SWAP_H_ */

View File

@ -7,6 +7,8 @@
#include "free_rtos/ethernet_ip/eth_checksum.h" #include "free_rtos/ethernet_ip/eth_checksum.h"
#include "free_rtos/base/swap.h" #include "free_rtos/base/swap.h"
#include <arm_acle.h>
uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len) uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len)
{ {
uint16_t i; uint16_t i;
@ -54,44 +56,74 @@ uint16_t eth_calcChksum2(uint32_t sum, uint8_t * const hdata, uint16_t hlen, uin
return ~sum; return ~sum;
} }
inline uint32_t calcSum(void * buffer, uint32_t sum, void * const data, uint16_t len) { union PointerConverter
uint32_t * buffer_start32 = (uint32_t*)buffer; {
uint32_t * data_start32 = (uint32_t*)data; void * unknown;
uint32_t * data_end32 = data_start32 + len/sizeof(uint32_t); uint64_t * octet;
uint32_t remainder = len%sizeof(uint32_t); uint32_t * quartet;
uint32_t value; uint16_t * duet;
uint8_t * solo;
};
while(data_start32 < data_end32) { struct Array {
value = *data_start32++; uint16_t duet0;
*buffer_start32++ = value; uint16_t duet1;
value = __rev16(value); uint16_t duet2;
sum += (value&0xFFFF) + (value>>16); 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; if(len >= sizeof(uint16_t)) {
uint16_t * data_start16 = (uint16_t*)data_start32; len -= sizeof(uint16_t);
if(remainder > 1) { value.duet = *data_start.duet++;
value = *data_start16++; *buffer_start.duet++ = value.duet;
*buffer_start16++ = value;
value = __rev16(value); value.quartet = __rev16(value.quartet);
sum += value; sum += value.duet;
} }
uint8_t * buffer_start8 = (uint8_t*)buffer_start16; if(len >= sizeof(uint8_t)) {
uint8_t * data_start8 = (uint8_t*)data_start16; len -= sizeof(uint8_t);
if(remainder == 1) { value.solo = *data_start.solo++;
value = *data_start8++; *buffer_start.solo++ = value.solo;
*buffer_start8++ = value;
value = __rev16(value); value.quartet = __rev16(value.quartet);
sum += value; sum += value.solo;
} }
return sum; 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) { if(hdata != 0) {
sum = calcSum(buffer, sum, hdata, hlen); sum = calcSum(buffer, sum, hdata, hlen);

View File

@ -16,7 +16,7 @@ extern "C" {
uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len); 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_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 #ifdef __cplusplus
} }

View File

@ -61,7 +61,7 @@ public:
return 0; return 0;
} }
if (buff_[toggle_].size() == 0) { if (buff_[out_toggle_].size() == 0) {
if(capture_buffer() == false) { if(capture_buffer() == false) {
return 0; return 0;
} }