support IPv4 & IPv6 frag reassemble
This commit is contained in:
41
src/packet/checksum.h
Normal file
41
src/packet/checksum.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef _CHECKSUM_H
|
||||
#define _CHECKSUM_H
|
||||
|
||||
#ifdef __cpluscplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// https://datatracker.ietf.org/doc/html/rfc1071
|
||||
static inline uint16_t checksum(char *data, int len)
|
||||
{
|
||||
long sum = 0;
|
||||
uint16_t *addr = (uint16_t *)data;
|
||||
|
||||
while (len > 1)
|
||||
{
|
||||
sum += *addr++;
|
||||
len -= 2;
|
||||
}
|
||||
|
||||
if (len > 0)
|
||||
{
|
||||
sum += *(unsigned char *)addr;
|
||||
}
|
||||
|
||||
// Fold 32-bit sum to 16 bits
|
||||
while (sum >> 16)
|
||||
{
|
||||
sum = (sum & 0xffff) + (sum >> 16);
|
||||
}
|
||||
|
||||
return (uint16_t)(~sum);
|
||||
}
|
||||
|
||||
#ifdef __cpluscplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user