28 lines
517 B
C
28 lines
517 B
C
/*
|
|
* eth_checksum.c
|
|
*
|
|
* Created on: 13 ìàð. 2023 ã.
|
|
* Author: sychev
|
|
*/
|
|
#include "free_rtos/ethernet_ip/eth_checksum.h"
|
|
|
|
uint16_t eth_calcChksum(uint32_t sum, uint8_t * const data, uint16_t len)
|
|
{
|
|
uint16_t i;
|
|
uint16_t size = len - 1;
|
|
|
|
if ( !len )
|
|
return 0;
|
|
|
|
for ( i = 0; i < size; i+=2 )
|
|
sum += ((uint16_t)data[i] << 8) + data[i+1];
|
|
|
|
if (len & 0x01)
|
|
sum += (uint16_t)data[i] << 8;
|
|
|
|
while ( sum >> 16 )
|
|
sum = (sum & 0xFFFF) + (sum >> 16);
|
|
|
|
return ~sum;
|
|
}
|