Arbitrary payload expansion is now working. IP checksum recomputation needs a revision, it is always 0...

This commit is contained in:
h3xduck
2021-11-25 20:30:15 -05:00
parent 253c302695
commit ca23880fd4
9 changed files with 940 additions and 609 deletions

View File

@@ -2,6 +2,11 @@
#define __IP_HELPER_H__
#include <linux/ip.h>
#include <linux/types.h>
#include <linux/bpf.h>
#include <bpf/bpf_endian.h>
#include <bpf/bpf_helpers.h>
/**
* IP checksum calculation.
@@ -28,4 +33,31 @@ static __always_inline unsigned short checksum(unsigned short *addr, int nbytes)
return checksum;
}
static __always_inline uint16_t csum_fold_helper(uint32_t csum)
{
bpf_printk("csumA: %u\n", csum & 0xffff);
bpf_printk("csumB: %u\n", csum >> 16);
bpf_printk("csumA+B: %u\n", (csum & 0xffff) + (csum >> 16));
bpf_printk("csumNEG(A+B): %u\n", ~((csum & 0xffff) + (csum >> 16)));
#pragma unroll
for (int ii = 0; ii < 4; ii++) {
if (csum >> 16)
csum = (csum & 0xffff) + (csum >> 16);
}
return ~csum;
}
/**
* IP checksum calculation.
* Following RFC 1071, using BPFs.*
*/
static __always_inline void ipv4_csum(void *data_start, int data_size, uint32_t *csum)
{
bpf_printk("csum: %u\n", *csum);
*csum = bpf_csum_diff(0, 0, data_start, data_size, *csum);
bpf_printk("csum: %u\n", *csum);
*csum = csum_fold_helper(*csum);
bpf_printk("csum: %u\n", *csum);
}
#endif