mirror of
https://github.com/h3xduck/TripleCross.git
synced 2026-01-03 15:03:07 +08:00
Arbitrary payload expansion is now working. IP checksum recomputation needs a revision, it is always 0...
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user