/* * 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; } uint16_t eth_calcChksum2(uint32_t sum, uint8_t * const hdata, uint16_t hlen, uint8_t * const data, uint16_t len) { uint16_t i; uint16_t hsize = hlen - 1; uint16_t size = len - 1; if ( (hlen == 0) || (len == 0) ) return 0; for ( i = 0; i < hsize; i+=2 ) sum += ((uint16_t)hdata[i] << 8) + hdata[i+1]; if (hlen & 0x01) sum += (uint16_t)hdata[i] << 8; 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; }