Created
February 8, 2017 20:20
-
-
Save williamtu/5a09b60a951ee5fc062328766403ab4b to your computer and use it in GitHub Desktop.
xdp7.c fails at 451: (7b) *(u64 *)(r10 -528) = r0 invalid stack off=-528 size=8
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define KBUILD_MODNAME "xdptest" | |
#include <linux/bpf.h> | |
#include "bpf_helpers.h" | |
#define load_byte(data, b) (*(u8 *)(data + (b))) | |
#define load_half(data, b) __constant_ntohs(*(u16 *)(data + (b))) | |
#define load_word(data, b) __constant_ntohl(*(u32 *)(data + (b))) | |
#define htonl(d) __constant_htonl(d) | |
#define htons(d) __constant_htons(d) | |
enum ebpf_errorCodes { | |
NoError, | |
PacketTooShort, | |
NoMatch, | |
StackOutOfBounds, | |
OverwritingHeader, | |
HeaderTooShort, | |
ParserTimeout, | |
}; | |
#define EBPF_MASK(t, w) ((((t)(1)) << (w)) - (t)1) | |
#define BYTES(w) ((w) / 8) | |
#define write_partial(a, s, v) do { u8 mask = EBPF_MASK(u8, s); *((u8*)a) = ((*((u8*)a)) & ~mask) | (((v) >> (8 - (s))) & mask); } while (0) | |
#define write_byte(base, offset, v) do { *(u8*)((base) + (offset)) = (v); } while (0) | |
struct xdp_input { | |
u32 input_port; /* bit<32> */ | |
}; | |
struct xdp_output { | |
u8 drop; /* bool */ | |
u32 output_port; /* bit<32> */ | |
}; | |
struct Ethernet { | |
char source[6]; /* bit<48> */ | |
char destination[6]; /* bit<48> */ | |
u16 protocol; /* bit<16> */ | |
u8 ebpf_valid; | |
}; | |
struct IPv4 { | |
u8 version; /* bit<4> */ | |
u8 ihl; /* bit<4> */ | |
u8 diffserv; /* bit<8> */ | |
u16 totalLen; /* bit<16> */ | |
u16 identification; /* bit<16> */ | |
u8 flags; /* bit<3> */ | |
u16 fragOffset; /* bit<13> */ | |
u8 ttl; /* bit<8> */ | |
u8 protocol; /* bit<8> */ | |
u16 hdrChecksum; /* bit<16> */ | |
u32 srcAddr; /* bit<32> */ | |
u32 dstAddr; /* bit<32> */ | |
u8 ebpf_valid; | |
}; | |
struct icmp_t { | |
u16 typeCode; /* bit<16> */ | |
u16 hdrChecksum; /* bit<16> */ | |
u8 ebpf_valid; | |
}; | |
struct tcp_t { | |
u16 srcPort; /* bit<16> */ | |
u16 dstPort; /* bit<16> */ | |
u32 seqNo; /* bit<32> */ | |
u32 ackNo; /* bit<32> */ | |
u8 dataOffset; /* bit<4> */ | |
u8 res; /* bit<4> */ | |
u8 flags; /* bit<8> */ | |
u16 window; /* bit<16> */ | |
u16 checksum; /* bit<16> */ | |
u16 urgentPtr; /* bit<16> */ | |
u8 ebpf_valid; | |
}; | |
struct udp_t { | |
u16 srcPort; /* bit<16> */ | |
u16 dstPort; /* bit<16> */ | |
u16 length_; /* bit<16> */ | |
u16 checksum; /* bit<16> */ | |
u8 ebpf_valid; | |
}; | |
struct Headers { | |
struct Ethernet ethernet; /* Ethernet */ | |
struct IPv4 ipv4; /* IPv4 */ | |
struct tcp_t tcp; /* tcp_t */ | |
struct udp_t udp; /* udp_t */ | |
struct icmp_t icmp; /* icmp_t */ | |
}; | |
struct dstmactable_key { | |
u16 field0; | |
}; | |
enum dstmactable_actions { | |
Fallback_action, | |
Drop_action, | |
}; | |
struct dstmactable_value { | |
enum dstmactable_actions action; | |
union { | |
struct { | |
} Fallback_action; | |
struct { | |
} Drop_action; | |
} u; | |
}; | |
struct bpf_map_def SEC("maps") dstmactable = { | |
.type = BPF_MAP_TYPE_HASH, | |
.key_size = sizeof(struct dstmactable_key), | |
.value_size = sizeof(struct dstmactable_value), | |
.pinning = 2, /* PIN_GLOBAL_NS */ | |
.max_entries = 64, | |
}; | |
struct bpf_map_def SEC("maps") dstmactable_defaultAction = { | |
.type = BPF_MAP_TYPE_ARRAY, | |
.key_size = sizeof(u32), | |
.value_size = sizeof(struct dstmactable_value), | |
.pinning = 2, /* PIN_GLOBAL_NS */ | |
.max_entries = 1, | |
}; | |
struct bpf_map_def SEC("maps") ebpf_outTable = { | |
.type = BPF_MAP_TYPE_PERCPU_ARRAY, | |
.key_size = sizeof(u32), | |
.value_size = sizeof(u32), | |
.pinning = 2, /* PIN_GLOBAL_NS */ | |
.max_entries = 1 /* No multicast support */ | |
}; | |
SEC("prog") | |
int ebpf_filter(struct xdp_md* skb){ | |
struct Headers hd = { | |
.ethernet = { | |
.ebpf_valid = 0 | |
}, | |
.ipv4 = { | |
.ebpf_valid = 0 | |
}, | |
.tcp = { | |
.ebpf_valid = 0 | |
}, | |
.udp = { | |
.ebpf_valid = 0 | |
}, | |
.icmp = { | |
.ebpf_valid = 0 | |
}, | |
}; | |
unsigned ebpf_packetOffsetInBits = 0; | |
enum ebpf_errorCodes ebpf_errorCode = NoError; | |
void* ebpf_packetStart = ((void*)(long)skb->data); | |
void* ebpf_packetEnd = ((void*)(long)skb->data_end); | |
u32 ebpf_zero = 0; | |
u8 ebpf_byte = 0; | |
u32 ebpf_outHeaderLength = 0; | |
struct xdp_output xout; | |
/* TODO: this should be initialized by the environment. HOW? */ | |
struct xdp_input xin; | |
goto start; | |
start: { | |
/* extract(hd.ethernet)*/ | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
ebpf_errorCode = PacketTooShort; | |
goto reject; | |
} | |
hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
ebpf_packetOffsetInBits += 48; | |
hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
ebpf_packetOffsetInBits += 48; | |
hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.ethernet.ebpf_valid = 1; | |
switch (hd.ethernet.protocol) { | |
case 2048: goto parse_ipv4; | |
default: goto accept; | |
} | |
} | |
parse_ipv4: { | |
/* extract(hd.ipv4)*/ | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
ebpf_errorCode = PacketTooShort; | |
goto reject; | |
} | |
hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
ebpf_packetOffsetInBits += 4; | |
hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
ebpf_packetOffsetInBits += 4; | |
hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 8; | |
hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
ebpf_packetOffsetInBits += 3; | |
hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
ebpf_packetOffsetInBits += 13; | |
hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 8; | |
hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 8; | |
hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 32; | |
hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 32; | |
hd.ipv4.ebpf_valid = 1; | |
switch (hd.ipv4.protocol) { | |
case 6: goto parse_tcp; | |
case 17: goto parse_udp; | |
case 1: goto parse_icmp; | |
default: goto accept; | |
} | |
} | |
parse_icmp: { | |
/* extract(hd.icmp)*/ | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
ebpf_errorCode = PacketTooShort; | |
goto reject; | |
} | |
hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.icmp.ebpf_valid = 1; | |
goto accept; | |
} | |
parse_tcp: { | |
/* extract(hd.tcp)*/ | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
ebpf_errorCode = PacketTooShort; | |
goto reject; | |
} | |
hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 32; | |
hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 32; | |
hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
ebpf_packetOffsetInBits += 4; | |
hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
ebpf_packetOffsetInBits += 4; | |
hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 8; | |
hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.ebpf_valid = 1; | |
goto accept; | |
} | |
parse_udp: { | |
/* extract(hd.udp)*/ | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
ebpf_errorCode = PacketTooShort; | |
goto reject; | |
} | |
hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
ebpf_packetOffsetInBits += 16; | |
hd.udp.ebpf_valid = 1; | |
goto accept; | |
} | |
reject: { return XDP_ABORTED; } | |
accept: | |
{ | |
u8 hit; | |
u8 xoutdrop; | |
{ | |
/* dstmactable.apply()*/ | |
{ | |
/* construct key */ | |
struct dstmactable_key key; | |
key.field0 = hd.ethernet.protocol; | |
/* value */ | |
struct dstmactable_value *value; | |
/* perform lookup */ | |
value = bpf_map_lookup_elem(&dstmactable, &key); | |
if (value == NULL) { | |
/* miss; find default action */ | |
hit = 0; | |
value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero); | |
} else { | |
hit = 1; | |
} | |
if (value != NULL) { | |
/* run action */ | |
switch (value->action) { | |
case Fallback_action: | |
{ | |
hd.ipv4.ttl = 4; | |
xoutdrop = false; | |
} | |
break; | |
case Drop_action: | |
{ | |
xoutdrop = true; | |
} | |
break; | |
default: return XDP_ABORTED; | |
} | |
} | |
else return XDP_ABORTED; | |
} | |
; | |
xout.output_port = 0; | |
xout.drop = xoutdrop; | |
} | |
} | |
/* deparser */ | |
{ | |
{ | |
if (hd.ethernet.ebpf_valid) ebpf_outHeaderLength += 112; | |
if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160; | |
if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
} | |
// bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - ebpf_outHeaderLength); | |
ebpf_packetStart = ((void*)(long)skb->data); | |
ebpf_packetEnd = ((void*)(long)skb->data_end); | |
ebpf_packetOffsetInBits = 0; | |
u8 hit_0; | |
{ | |
/* packet.emit(hd.ethernet)*/ | |
if (hd.ethernet.ebpf_valid) { | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
ebpf_errorCode = PacketTooShort; | |
goto ebpf_end; | |
} | |
ebpf_byte = ((char*)(&hd.ethernet.source))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.source))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.source))[2]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.source))[3]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.source))[4]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.source))[5]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 48; | |
ebpf_byte = ((char*)(&hd.ethernet.destination))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.destination))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.destination))[2]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.destination))[3]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.destination))[4]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.destination))[5]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 48; | |
hd.ethernet.protocol = htons(hd.ethernet.protocol); | |
ebpf_byte = ((char*)(&hd.ethernet.protocol))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ethernet.protocol))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
} | |
; | |
/* packet.emit(hd.ipv4)*/ | |
if (hd.ipv4.ebpf_valid) { | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
ebpf_errorCode = PacketTooShort; | |
goto ebpf_end; | |
} | |
ebpf_byte = ((char*)(&hd.ipv4.version))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
ebpf_packetOffsetInBits += 4; | |
ebpf_byte = ((char*)(&hd.ipv4.ihl))[0]; | |
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
ebpf_packetOffsetInBits += 4; | |
ebpf_byte = ((char*)(&hd.ipv4.diffserv))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 8; | |
hd.ipv4.totalLen = htons(hd.ipv4.totalLen); | |
ebpf_byte = ((char*)(&hd.ipv4.totalLen))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.totalLen))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.ipv4.identification = htons(hd.ipv4.identification); | |
ebpf_byte = ((char*)(&hd.ipv4.identification))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.identification))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
ebpf_byte = ((char*)(&hd.ipv4.flags))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
ebpf_packetOffsetInBits += 3; | |
ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[0]; | |
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 13; | |
ebpf_byte = ((char*)(&hd.ipv4.ttl))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 8; | |
ebpf_byte = ((char*)(&hd.ipv4.protocol))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 8; | |
hd.ipv4.hdrChecksum = htons(hd.ipv4.hdrChecksum); | |
ebpf_byte = ((char*)(&hd.ipv4.hdrChecksum))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.hdrChecksum))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.ipv4.srcAddr = htonl(hd.ipv4.srcAddr); | |
ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[2]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[3]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 32; | |
hd.ipv4.dstAddr = htonl(hd.ipv4.dstAddr); | |
ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[2]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[3]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 32; | |
} | |
; | |
/* packet.emit(hd.tcp)*/ | |
if (hd.tcp.ebpf_valid) { | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
ebpf_errorCode = PacketTooShort; | |
goto ebpf_end; | |
} | |
hd.tcp.srcPort = htons(hd.tcp.srcPort); | |
ebpf_byte = ((char*)(&hd.tcp.srcPort))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.srcPort))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.dstPort = htons(hd.tcp.dstPort); | |
ebpf_byte = ((char*)(&hd.tcp.dstPort))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.dstPort))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.seqNo = htonl(hd.tcp.seqNo); | |
ebpf_byte = ((char*)(&hd.tcp.seqNo))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.seqNo))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.seqNo))[2]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.seqNo))[3]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 32; | |
hd.tcp.ackNo = htonl(hd.tcp.ackNo); | |
ebpf_byte = ((char*)(&hd.tcp.ackNo))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.ackNo))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.ackNo))[2]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.ackNo))[3]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 32; | |
ebpf_byte = ((char*)(&hd.tcp.dataOffset))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
ebpf_packetOffsetInBits += 4; | |
ebpf_byte = ((char*)(&hd.tcp.res))[0]; | |
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
ebpf_packetOffsetInBits += 4; | |
ebpf_byte = ((char*)(&hd.tcp.flags))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 8; | |
hd.tcp.window = htons(hd.tcp.window); | |
ebpf_byte = ((char*)(&hd.tcp.window))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.window))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.checksum = htons(hd.tcp.checksum); | |
ebpf_byte = ((char*)(&hd.tcp.checksum))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.checksum))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.tcp.urgentPtr = htons(hd.tcp.urgentPtr); | |
ebpf_byte = ((char*)(&hd.tcp.urgentPtr))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.tcp.urgentPtr))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
} | |
; | |
/* packet.emit(hd.icmp)*/ | |
if (hd.icmp.ebpf_valid) { | |
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
ebpf_errorCode = PacketTooShort; | |
goto ebpf_end; | |
} | |
hd.icmp.typeCode = htons(hd.icmp.typeCode); | |
ebpf_byte = ((char*)(&hd.icmp.typeCode))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.icmp.typeCode))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
hd.icmp.hdrChecksum = htons(hd.icmp.hdrChecksum); | |
ebpf_byte = ((char*)(&hd.icmp.hdrChecksum))[0]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
ebpf_byte = ((char*)(&hd.icmp.hdrChecksum))[1]; | |
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
ebpf_packetOffsetInBits += 16; | |
} | |
; | |
} | |
} | |
ebpf_end: | |
bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
if (xout.drop) return XDP_DROP; | |
else return XDP_PASS; | |
} | |
char _license[] SEC("license") = "GPL"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
xdp7.o: file format ELF64-BPF | |
Disassembly of section prog: | |
ebpf_filter: | |
; int ebpf_filter(struct xdp_md* skb){ | |
0: r6 = r1 | |
; void* ebpf_packetEnd = ((void*)(long)skb->data_end); | |
1: r3 = *(u32 *)(r6 + 4) | |
; void* ebpf_packetStart = ((void*)(long)skb->data); | |
2: r2 = *(u32 *)(r6 + 0) | |
3: r7 = 0 | |
; u32 ebpf_zero = 0; | |
4: *(u32 *)(r10 - 4) = r7 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
5: r1 = r2 | |
6: r1 += 14 | |
7: if r1 > r3 goto 735 | |
8: r8 = 0 | |
; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
9: r1 = *(u8 *)(r2 + 11) | |
; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
10: *(u64 *)(r10 - 408) = r1 | |
11: r1 = *(u8 *)(r2 + 10) | |
; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
12: *(u64 *)(r10 - 416) = r1 | |
13: r1 = *(u8 *)(r2 + 9) | |
; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
14: *(u64 *)(r10 - 424) = r1 | |
15: r1 = *(u8 *)(r2 + 8) | |
; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
16: *(u64 *)(r10 - 432) = r1 | |
17: r1 = *(u8 *)(r2 + 7) | |
; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
18: *(u64 *)(r10 - 440) = r1 | |
19: r1 = *(u8 *)(r2 + 6) | |
; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0)); | |
20: *(u64 *)(r10 - 448) = r1 | |
21: r1 = *(u8 *)(r2 + 5) | |
; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0)); | |
22: *(u64 *)(r10 - 456) = r1 | |
23: r1 = *(u8 *)(r2 + 4) | |
; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0)); | |
24: *(u64 *)(r10 - 464) = r1 | |
25: r1 = *(u8 *)(r2 + 3) | |
; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0)); | |
26: *(u64 *)(r10 - 472) = r1 | |
27: r1 = *(u8 *)(r2 + 2) | |
; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0)); | |
28: *(u64 *)(r10 - 480) = r1 | |
29: r1 = *(u8 *)(r2 + 1) | |
; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0)); | |
30: *(u64 *)(r10 - 488) = r1 | |
31: r1 = *(u8 *)(r2 + 0) | |
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
32: *(u64 *)(r10 - 496) = r1 | |
33: r1 = *(u16 *)(r2 + 12) | |
; switch (hd.ethernet.protocol) { | |
34: r4 = r1 | |
35: r4 <<= 8 | |
36: *(u64 *)(r10 - 504) = r1 | |
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
37: r1 >>= 8 | |
38: *(u64 *)(r10 - 512) = r1 | |
; switch (hd.ethernet.protocol) { | |
39: r1 |= r4 | |
40: *(u64 *)(r10 - 32) = r1 | |
41: r4 = r1 | |
42: r4 &= 65535 | |
43: r5 = 0 | |
44: *(u64 *)(r10 - 112) = r5 | |
45: r5 = 0 | |
46: *(u64 *)(r10 - 120) = r5 | |
47: r5 = 0 | |
48: *(u64 *)(r10 - 128) = r5 | |
49: r5 = 0 | |
50: *(u64 *)(r10 - 96) = r5 | |
51: r5 = 0 | |
52: *(u64 *)(r10 - 88) = r5 | |
53: r5 = 0 | |
54: *(u64 *)(r10 - 104) = r5 | |
55: r7 = 0 | |
56: r1 = 0 | |
57: *(u64 *)(r10 - 352) = r1 | |
58: r1 = 0 | |
59: *(u64 *)(r10 - 336) = r1 | |
60: r1 = 0 | |
61: *(u64 *)(r10 - 344) = r1 | |
62: r5 = 0 | |
63: *(u64 *)(r10 - 288) = r5 | |
64: r5 = 0 | |
65: *(u64 *)(r10 - 296) = r5 | |
66: r1 = 0 | |
67: *(u64 *)(r10 - 320) = r1 | |
68: r1 = 0 | |
69: *(u64 *)(r10 - 328) = r1 | |
70: r5 = 0 | |
71: *(u64 *)(r10 - 272) = r5 | |
72: r5 = 0 | |
73: *(u64 *)(r10 - 280) = r5 | |
74: r1 = 0 | |
75: *(u64 *)(r10 - 304) = r1 | |
76: r1 = 0 | |
77: *(u64 *)(r10 - 312) = r1 | |
78: r5 = 0 | |
79: *(u64 *)(r10 - 256) = r5 | |
80: r5 = 0 | |
81: *(u64 *)(r10 - 264) = r5 | |
82: r5 = 0 | |
83: *(u64 *)(r10 - 240) = r5 | |
84: r5 = 0 | |
85: *(u64 *)(r10 - 248) = r5 | |
86: r5 = 0 | |
87: *(u64 *)(r10 - 224) = r5 | |
88: r5 = 0 | |
89: *(u64 *)(r10 - 232) = r5 | |
90: r5 = 0 | |
91: r0 = 0 | |
92: *(u64 *)(r10 - 392) = r0 | |
93: r0 = 0 | |
94: *(u64 *)(r10 - 384) = r0 | |
95: r0 = 0 | |
96: r9 = 0 | |
97: *(u64 *)(r10 - 176) = r9 | |
98: r9 = 0 | |
99: *(u64 *)(r10 - 80) = r9 | |
100: r9 = 0 | |
101: *(u64 *)(r10 - 136) = r9 | |
102: r9 = 0 | |
103: *(u64 *)(r10 - 152) = r9 | |
104: r1 = 0 | |
105: *(u64 *)(r10 - 72) = r1 | |
106: r9 = 0 | |
107: *(u64 *)(r10 - 144) = r9 | |
108: r1 = 0 | |
109: *(u64 *)(r10 - 360) = r1 | |
110: r1 = 0 | |
111: *(u64 *)(r10 - 368) = r1 | |
112: r1 = 0 | |
113: *(u64 *)(r10 - 376) = r1 | |
114: r1 = 0 | |
115: *(u64 *)(r10 - 56) = r1 | |
116: r1 = 0 | |
117: *(u64 *)(r10 - 216) = r1 | |
118: r1 = 0 | |
119: *(u64 *)(r10 - 64) = r1 | |
120: r1 = 0 | |
121: *(u64 *)(r10 - 40) = r1 | |
122: r9 = 0 | |
123: *(u64 *)(r10 - 168) = r9 | |
124: r9 = 0 | |
125: *(u64 *)(r10 - 184) = r9 | |
126: r9 = 0 | |
127: *(u64 *)(r10 - 160) = r9 | |
128: r1 = 0 | |
129: *(u64 *)(r10 - 208) = r1 | |
130: r1 = 0 | |
131: *(u64 *)(r10 - 200) = r1 | |
132: r9 = 0 | |
133: r1 = 0 | |
134: *(u64 *)(r10 - 48) = r1 | |
135: r1 = 0 | |
136: *(u64 *)(r10 - 192) = r1 | |
137: if r4 != 2048 goto 313 | |
138: r7 = 0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
139: r4 = r2 | |
140: r4 += 34 | |
141: if r4 > r3 goto 601 | |
142: r1 = 1 | |
; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
143: *(u64 *)(r10 - 56) = r1 | |
144: r1 = *(u8 *)(r2 + 22) | |
; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
145: *(u64 *)(r10 - 64) = r1 | |
146: r4 = *(u8 *)(r2 + 15) | |
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
147: *(u64 *)(r10 - 160) = r4 | |
148: r4 = *(u32 *)(r2 + 30) | |
149: r5 = r4 | |
150: bswap16 r5 | |
151: *(u64 *)(r10 - 96) = r5 | |
152: r5 = r4 | |
153: bswap32 r5 | |
154: *(u64 *)(r10 - 104) = r5 | |
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
155: r5 = *(u32 *)(r2 + 26) | |
156: r1 = r5 | |
157: bswap16 r1 | |
158: *(u64 *)(r10 - 400) = r1 | |
159: r7 = r5 | |
160: bswap32 r7 | |
161: *(u64 *)(r10 - 120) = r7 | |
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
162: r9 = *(u16 *)(r2 + 24) | |
163: r0 = r9 | |
164: bswap16 r0 | |
165: *(u64 *)(r10 - 136) = r0 | |
; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
166: r0 = *(u16 *)(r2 + 20) | |
167: r7 = r0 | |
168: r7 &= 31 | |
169: *(u64 *)(r10 - 40) = r7 | |
170: r0 >>= 8 | |
171: *(u64 *)(r10 - 144) = r0 | |
; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
172: r0 = *(u8 *)(r2 + 20) | |
173: r0 >>= 5 | |
174: *(u64 *)(r10 - 168) = r0 | |
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
175: r8 = *(u16 *)(r2 + 18) | |
176: r0 = r8 | |
177: bswap16 r0 | |
178: *(u64 *)(r10 - 184) = r0 | |
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
179: r1 = *(u16 *)(r2 + 16) | |
180: r0 = r1 | |
181: bswap16 r0 | |
182: *(u64 *)(r10 - 48) = r0 | |
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
183: r0 = *(u8 *)(r2 + 14) | |
; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
184: r7 = r0 | |
185: r7 &= 15 | |
186: *(u64 *)(r10 - 208) = r7 | |
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
187: r0 >>= 4 | |
188: *(u64 *)(r10 - 200) = r0 | |
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
189: bswap64 r4 | |
190: r7 = r4 | |
191: r7 >>= 56 | |
192: *(u64 *)(r10 - 128) = r7 | |
193: r4 >>= 40 | |
194: *(u64 *)(r10 - 88) = r4 | |
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
195: bswap64 r5 | |
196: r4 = r5 | |
197: r4 >>= 56 | |
198: *(u64 *)(r10 - 176) = r4 | |
199: r5 >>= 40 | |
200: *(u64 *)(r10 - 112) = r5 | |
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
201: bswap64 r9 | |
202: r9 >>= 56 | |
203: *(u64 *)(r10 - 152) = r9 | |
204: r9 = r8 | |
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
205: bswap64 r9 | |
206: r9 >>= 56 | |
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
207: bswap64 r1 | |
208: r1 >>= 56 | |
209: *(u64 *)(r10 - 192) = r1 | |
; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
210: r1 = *(u8 *)(r2 + 23) | |
; switch (hd.ipv4.protocol) { | |
211: *(u64 *)(r10 - 216) = r1 | |
212: if r1 == 17 goto 182 | |
213: if r1 == 6 goto 113 | |
214: r7 = 0 | |
215: r4 = 0 | |
216: *(u64 *)(r10 - 352) = r4 | |
217: r4 = 0 | |
218: *(u64 *)(r10 - 336) = r4 | |
219: r4 = 0 | |
220: *(u64 *)(r10 - 344) = r4 | |
221: r4 = 0 | |
222: *(u64 *)(r10 - 288) = r4 | |
223: r4 = 0 | |
224: *(u64 *)(r10 - 296) = r4 | |
225: r4 = 0 | |
226: *(u64 *)(r10 - 320) = r4 | |
227: r4 = 0 | |
228: *(u64 *)(r10 - 328) = r4 | |
229: r4 = 0 | |
230: *(u64 *)(r10 - 272) = r4 | |
231: r4 = 0 | |
232: *(u64 *)(r10 - 280) = r4 | |
233: r4 = 0 | |
234: *(u64 *)(r10 - 304) = r4 | |
235: r4 = 0 | |
236: *(u64 *)(r10 - 312) = r4 | |
237: r4 = 0 | |
238: *(u64 *)(r10 - 256) = r4 | |
239: r4 = 0 | |
240: *(u64 *)(r10 - 264) = r4 | |
241: r4 = 0 | |
242: *(u64 *)(r10 - 240) = r4 | |
243: r4 = 0 | |
244: *(u64 *)(r10 - 248) = r4 | |
245: r4 = 0 | |
246: *(u64 *)(r10 - 224) = r4 | |
247: r4 = 0 | |
248: *(u64 *)(r10 - 232) = r4 | |
249: r5 = 0 | |
250: r4 = 0 | |
251: *(u64 *)(r10 - 392) = r4 | |
252: r4 = 0 | |
253: *(u64 *)(r10 - 384) = r4 | |
254: r0 = 0 | |
255: r4 = 0 | |
256: *(u64 *)(r10 - 80) = r4 | |
257: r4 = 0 | |
258: *(u64 *)(r10 - 72) = r4 | |
259: r4 = 0 | |
260: *(u64 *)(r10 - 360) = r4 | |
261: r4 = 0 | |
262: *(u64 *)(r10 - 368) = r4 | |
263: r4 = 0 | |
264: *(u64 *)(r10 - 376) = r4 | |
265: r4 = *(u64 *)(r10 - 40) | |
266: r4 = *(u64 *)(r10 - 48) | |
267: r8 = *(u64 *)(r10 - 400) | |
268: if r1 != 1 goto 182 | |
269: r7 = 0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
270: r4 = r2 | |
271: r4 += 38 | |
272: if r4 > r3 goto 470 | |
273: r3 = 1 | |
274: *(u64 *)(r10 - 80) = r3 | |
275: r7 = 0 | |
; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
276: r3 = *(u16 *)(r2 + 36) | |
277: *(u64 *)(r10 - 384) = r3 | |
278: r0 = r3 | |
279: r0 >>= 8 | |
; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
280: r5 = *(u16 *)(r2 + 34) | |
281: r2 = r5 | |
282: r2 >>= 8 | |
283: *(u64 *)(r10 - 392) = r2 | |
284: r1 = 0 | |
285: *(u64 *)(r10 - 352) = r1 | |
286: r1 = 0 | |
287: *(u64 *)(r10 - 336) = r1 | |
288: r1 = 0 | |
289: *(u64 *)(r10 - 344) = r1 | |
290: r2 = 0 | |
291: *(u64 *)(r10 - 288) = r2 | |
292: r2 = 0 | |
293: *(u64 *)(r10 - 296) = r2 | |
294: r1 = 0 | |
295: *(u64 *)(r10 - 320) = r1 | |
296: r1 = 0 | |
297: *(u64 *)(r10 - 328) = r1 | |
298: r2 = 0 | |
299: *(u64 *)(r10 - 272) = r2 | |
300: r2 = 0 | |
301: *(u64 *)(r10 - 280) = r2 | |
302: r1 = 0 | |
303: *(u64 *)(r10 - 304) = r1 | |
304: r1 = 0 | |
305: *(u64 *)(r10 - 312) = r1 | |
306: r2 = 0 | |
307: *(u64 *)(r10 - 256) = r2 | |
308: r2 = 0 | |
309: *(u64 *)(r10 - 264) = r2 | |
310: r2 = 0 | |
311: *(u64 *)(r10 - 240) = r2 | |
312: r2 = 0 | |
313: *(u64 *)(r10 - 248) = r2 | |
314: r2 = 0 | |
315: *(u64 *)(r10 - 224) = r2 | |
316: r2 = 0 | |
317: *(u64 *)(r10 - 232) = r2 | |
318: r1 = 0 | |
319: *(u64 *)(r10 - 72) = r1 | |
320: r1 = 0 | |
321: *(u64 *)(r10 - 360) = r1 | |
322: r1 = 0 | |
323: *(u64 *)(r10 - 368) = r1 | |
324: r1 = 0 | |
325: *(u64 *)(r10 - 376) = r1 | |
326: goto 65 | |
LBB0_9: | |
327: r7 = 0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
328: r4 = r2 | |
329: r4 += 54 | |
330: r1 = *(u64 *)(r10 - 40) | |
331: r1 = *(u64 *)(r10 - 48) | |
332: r8 = *(u64 *)(r10 - 400) | |
333: if r4 > r3 goto 409 | |
334: r1 = 1 | |
335: *(u64 *)(r10 - 72) = r1 | |
336: r5 = 0 | |
; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
337: r1 = *(u8 *)(r2 + 47) | |
; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
338: *(u64 *)(r10 - 360) = r1 | |
339: r4 = *(u32 *)(r2 + 42) | |
; goto accept; | |
340: r3 = r4 | |
341: r3 >>= 8 | |
342: *(u64 *)(r10 - 280) = r3 | |
; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
343: r0 = *(u32 *)(r2 + 38) | |
; goto accept; | |
344: r3 = r0 | |
345: r3 >>= 8 | |
346: *(u64 *)(r10 - 296) = r3 | |
; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
347: r3 = *(u16 *)(r2 + 52) | |
348: *(u64 *)(r10 - 224) = r3 | |
349: r3 >>= 8 | |
350: *(u64 *)(r10 - 232) = r3 | |
; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
351: r3 = *(u16 *)(r2 + 50) | |
352: *(u64 *)(r10 - 240) = r3 | |
353: r3 >>= 8 | |
354: *(u64 *)(r10 - 248) = r3 | |
; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
355: r3 = *(u16 *)(r2 + 48) | |
356: *(u64 *)(r10 - 256) = r3 | |
357: r3 >>= 8 | |
358: *(u64 *)(r10 - 264) = r3 | |
; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
359: r1 = r4 | |
360: r1 >>= 24 | |
361: *(u64 *)(r10 - 312) = r1 | |
362: *(u64 *)(r10 - 272) = r4 | |
363: r4 >>= 16 | |
364: *(u64 *)(r10 - 304) = r4 | |
; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
365: r1 = r0 | |
366: r1 >>= 24 | |
367: *(u64 *)(r10 - 328) = r1 | |
368: *(u64 *)(r10 - 288) = r0 | |
369: r0 >>= 16 | |
370: *(u64 *)(r10 - 320) = r0 | |
; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
371: r1 = *(u16 *)(r2 + 36) | |
372: *(u64 *)(r10 - 336) = r1 | |
373: r1 >>= 8 | |
374: *(u64 *)(r10 - 344) = r1 | |
; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
375: r7 = *(u16 *)(r2 + 34) | |
376: r1 = r7 | |
377: r1 >>= 8 | |
378: *(u64 *)(r10 - 352) = r1 | |
; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
379: r2 = *(u8 *)(r2 + 46) | |
; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
380: r1 = r2 | |
381: r1 &= 15 | |
382: *(u64 *)(r10 - 368) = r1 | |
; goto accept; | |
383: r2 &= 240 | |
384: *(u64 *)(r10 - 376) = r2 | |
385: r2 = 0 | |
386: *(u64 *)(r10 - 392) = r2 | |
387: r2 = 0 | |
388: *(u64 *)(r10 - 384) = r2 | |
389: r0 = 0 | |
390: r2 = 0 | |
391: *(u64 *)(r10 - 80) = r2 | |
LBB0_8: | |
392: r1 = 1 | |
393: *(u64 *)(r10 - 56) = r1 | |
394: goto 56 | |
LBB0_11: | |
395: r7 = 0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) { | |
396: r2 += 42 | |
397: r1 = 0 | |
398: *(u64 *)(r10 - 352) = r1 | |
399: r1 = 0 | |
400: *(u64 *)(r10 - 336) = r1 | |
401: r1 = 0 | |
402: *(u64 *)(r10 - 344) = r1 | |
403: r4 = 0 | |
404: *(u64 *)(r10 - 288) = r4 | |
405: r4 = 0 | |
406: *(u64 *)(r10 - 296) = r4 | |
407: r1 = 0 | |
408: *(u64 *)(r10 - 320) = r1 | |
409: r1 = 0 | |
410: *(u64 *)(r10 - 328) = r1 | |
411: r4 = 0 | |
412: *(u64 *)(r10 - 272) = r4 | |
413: r4 = 0 | |
414: *(u64 *)(r10 - 280) = r4 | |
415: r1 = 0 | |
416: *(u64 *)(r10 - 304) = r1 | |
417: r1 = 0 | |
418: *(u64 *)(r10 - 312) = r1 | |
419: r4 = 0 | |
420: *(u64 *)(r10 - 256) = r4 | |
421: r4 = 0 | |
422: *(u64 *)(r10 - 264) = r4 | |
423: r4 = 0 | |
424: *(u64 *)(r10 - 240) = r4 | |
425: r4 = 0 | |
426: *(u64 *)(r10 - 248) = r4 | |
427: r4 = 0 | |
428: *(u64 *)(r10 - 224) = r4 | |
429: r4 = 0 | |
430: *(u64 *)(r10 - 232) = r4 | |
431: r5 = 0 | |
432: r4 = 0 | |
433: *(u64 *)(r10 - 392) = r4 | |
434: r4 = 0 | |
435: *(u64 *)(r10 - 384) = r4 | |
436: r0 = 0 | |
437: r4 = 0 | |
438: *(u64 *)(r10 - 80) = r4 | |
439: r1 = 0 | |
440: *(u64 *)(r10 - 72) = r1 | |
441: r1 = 0 | |
442: *(u64 *)(r10 - 360) = r1 | |
443: r1 = 0 | |
444: *(u64 *)(r10 - 368) = r1 | |
445: r1 = 0 | |
446: *(u64 *)(r10 - 376) = r1 | |
447: r1 = *(u64 *)(r10 - 40) | |
448: r1 = *(u64 *)(r10 - 48) | |
449: r8 = *(u64 *)(r10 - 400) | |
450: if r2 > r3 goto 292 | |
LBB0_12: | |
451: *(u64 *)(r10 - 528) = r0 | |
452: *(u64 *)(r10 - 400) = r8 | |
453: *(u64 *)(r10 - 520) = r5 | |
; key.field0 = hd.ethernet.protocol; | |
454: r1 = *(u64 *)(r10 - 32) | |
455: *(u16 *)(r10 - 24) = r1 | |
456: r2 = r10 | |
457: r2 += -24 | |
; value = bpf_map_lookup_elem(&dstmactable, &key); | |
458: r1 = 0ll | |
460: call 1 | |
; if (value == NULL) { | |
461: if r0 != 0 goto 6 | |
462: r2 = r10 | |
463: r2 += -4 | |
; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero); | |
464: r1 = 0ll | |
466: call 1 | |
; if (value != NULL) { | |
467: if r0 == 0 goto 274 | |
LBB0_14: | |
468: r1 = 0 | |
469: r5 = 4 | |
; switch (value->action) { | |
470: r3 = *(u32 *)(r0 + 0) | |
471: r2 = 0 | |
472: if r3 == 0 goto 3 | |
473: if r3 != 1 goto 268 | |
474: r2 = 1 | |
475: r5 = *(u64 *)(r10 - 64) | |
LBB0_17: | |
; xout.output_port = 0; | |
476: *(u32 *)(r10 - 12) = r1 | |
; xout.drop = xoutdrop; | |
477: *(u8 *)(r10 - 16) = r2 | |
; xout.output_port = 0; | |
478: r3 = r10 | |
479: r3 += -12 | |
; ebpf_packetEnd = ((void*)(long)skb->data_end); | |
480: r2 = *(u32 *)(r6 + 4) | |
; ebpf_packetStart = ((void*)(long)skb->data); | |
481: r1 = *(u32 *)(r6 + 0) | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
482: r4 = r1 | |
483: r4 += 14 | |
484: if r4 > r2 goto 245 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
485: r4 = *(u64 *)(r10 - 496) | |
486: *(u8 *)(r1 + 0) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
487: r4 = *(u64 *)(r10 - 488) | |
488: *(u8 *)(r1 + 1) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
489: r4 = *(u64 *)(r10 - 480) | |
490: *(u8 *)(r1 + 2) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
491: r4 = *(u64 *)(r10 - 472) | |
492: *(u8 *)(r1 + 3) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
493: r4 = *(u64 *)(r10 - 464) | |
494: *(u8 *)(r1 + 4) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
495: r4 = *(u64 *)(r10 - 456) | |
496: *(u8 *)(r1 + 5) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
497: r4 = *(u64 *)(r10 - 448) | |
498: *(u8 *)(r1 + 6) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
499: r4 = *(u64 *)(r10 - 440) | |
500: *(u8 *)(r1 + 7) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
501: r4 = *(u64 *)(r10 - 432) | |
502: *(u8 *)(r1 + 8) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
503: r4 = *(u64 *)(r10 - 424) | |
504: *(u8 *)(r1 + 9) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0); | |
505: r4 = *(u64 *)(r10 - 416) | |
506: *(u8 *)(r1 + 10) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0); | |
507: r4 = *(u64 *)(r10 - 408) | |
508: *(u8 *)(r1 + 11) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
509: r4 = *(u64 *)(r10 - 504) | |
510: *(u8 *)(r1 + 12) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
511: r4 = *(u64 *)(r10 - 512) | |
512: *(u8 *)(r1 + 13) = r4 | |
513: r4 = 112 | |
; if (hd.ipv4.ebpf_valid) { | |
514: r0 = *(u64 *)(r10 - 56) | |
515: if r0 == 0 goto 50 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
516: r4 = r1 | |
517: r4 += 34 | |
518: if r4 > r2 goto 211 | |
519: r4 = *(u64 *)(r10 - 200) | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
520: r4 <<= 4 | |
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
521: r0 = *(u64 *)(r10 - 208) | |
522: r4 |= r0 | |
523: *(u8 *)(r1 + 14) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
524: r4 = *(u64 *)(r10 - 160) | |
525: *(u8 *)(r1 + 15) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
526: r4 = *(u64 *)(r10 - 192) | |
527: *(u8 *)(r1 + 16) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
528: r4 = *(u64 *)(r10 - 48) | |
529: *(u8 *)(r1 + 17) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
530: *(u8 *)(r1 + 18) = r9 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
531: r4 = *(u64 *)(r10 - 184) | |
532: *(u8 *)(r1 + 19) = r4 | |
533: r0 = *(u64 *)(r10 - 168) | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
534: r0 <<= 5 | |
535: r4 = *(u64 *)(r10 - 144) | |
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
536: r4 >>= 2 | |
537: r4 &= 7 | |
538: r0 |= r4 | |
539: *(u8 *)(r1 + 20) = r0 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
540: r4 = *(u64 *)(r10 - 40) | |
541: *(u8 *)(r1 + 21) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
542: *(u8 *)(r1 + 22) = r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
543: r4 = *(u64 *)(r10 - 216) | |
544: *(u8 *)(r1 + 23) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
545: r4 = *(u64 *)(r10 - 152) | |
546: *(u8 *)(r1 + 24) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
547: r4 = *(u64 *)(r10 - 136) | |
548: *(u8 *)(r1 + 25) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
549: r4 = *(u64 *)(r10 - 176) | |
550: *(u8 *)(r1 + 26) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
551: r4 = *(u64 *)(r10 - 400) | |
552: *(u8 *)(r1 + 27) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
553: r4 = *(u64 *)(r10 - 112) | |
554: *(u8 *)(r1 + 28) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
555: r4 = *(u64 *)(r10 - 120) | |
556: *(u8 *)(r1 + 29) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
557: r4 = *(u64 *)(r10 - 128) | |
558: *(u8 *)(r1 + 30) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
559: r4 = *(u64 *)(r10 - 96) | |
560: *(u8 *)(r1 + 31) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
561: r4 = *(u64 *)(r10 - 88) | |
562: *(u8 *)(r1 + 32) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
563: r4 = *(u64 *)(r10 - 104) | |
564: *(u8 *)(r1 + 33) = r4 | |
565: r4 = 272 | |
LBB0_21: | |
; if (hd.tcp.ebpf_valid) { | |
566: r5 = *(u64 *)(r10 - 72) | |
567: if r5 == 0 goto 134 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
568: r0 = r4 | |
569: r0 += 160 | |
570: r5 = 4294967288ll | |
572: r0 &= r5 | |
573: r0 >>= 3 | |
574: r6 = r1 | |
575: r6 += r0 | |
576: if r6 > r2 goto 153 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
577: r0 = r4 | |
578: r0 &= r5 | |
579: r0 >>= 3 | |
580: r6 = r1 | |
581: r6 += r0 | |
582: *(u8 *)(r6 + 0) = r7 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
583: r0 |= 1 | |
584: r6 = r1 | |
585: r6 += r0 | |
586: r0 = *(u64 *)(r10 - 352) | |
587: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 16; | |
588: r0 = r4 | |
589: r0 += 16 | |
590: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
591: r0 >>= 3 | |
592: r6 = r1 | |
593: r6 += r0 | |
594: r7 = *(u64 *)(r10 - 336) | |
595: *(u8 *)(r6 + 0) = r7 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
596: r0 |= 1 | |
597: r6 = r1 | |
598: r6 += r0 | |
599: r0 = *(u64 *)(r10 - 344) | |
600: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 16; | |
601: r0 = r4 | |
602: r0 += 32 | |
603: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
604: r0 >>= 3 | |
605: r6 = r1 | |
606: r6 += r0 | |
607: r7 = *(u64 *)(r10 - 288) | |
608: *(u8 *)(r6 + 0) = r7 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
609: r0 |= 1 | |
610: r7 = r1 | |
611: r7 += r0 | |
612: r0 = *(u64 *)(r10 - 296) | |
613: *(u8 *)(r7 + 0) = r0 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
614: r0 = *(u64 *)(r10 - 320) | |
615: *(u8 *)(r6 + 2) = r0 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
616: r0 = *(u64 *)(r10 - 328) | |
617: *(u8 *)(r6 + 3) = r0 | |
; ebpf_packetOffsetInBits += 32; | |
618: r0 = r4 | |
619: r0 += 64 | |
620: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
621: r0 >>= 3 | |
622: r6 = r1 | |
623: r6 += r0 | |
624: r7 = *(u64 *)(r10 - 272) | |
625: *(u8 *)(r6 + 0) = r7 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
626: r0 |= 1 | |
627: r7 = r1 | |
628: r7 += r0 | |
629: r0 = *(u64 *)(r10 - 280) | |
630: *(u8 *)(r7 + 0) = r0 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
631: r0 = *(u64 *)(r10 - 304) | |
632: *(u8 *)(r6 + 2) = r0 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
633: r0 = *(u64 *)(r10 - 312) | |
634: *(u8 *)(r6 + 3) = r0 | |
; ebpf_packetOffsetInBits += 32; | |
635: r0 = r4 | |
636: r0 += 96 | |
637: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
638: r0 >>= 3 | |
639: r6 = r1 | |
640: r6 += r0 | |
641: r0 = *(u64 *)(r10 - 376) | |
642: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 4; | |
643: r0 = r4 | |
644: r0 += 100 | |
645: r0 &= r5 | |
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
646: r0 >>= 3 | |
647: r6 = r1 | |
648: r6 += r0 | |
649: r0 = *(u8 *)(r6 + 0) | |
650: r0 &= 240 | |
651: r7 = *(u64 *)(r10 - 368) | |
652: r0 |= r7 | |
653: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 4; | |
654: r0 = r4 | |
655: r0 += 104 | |
656: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
657: r0 >>= 3 | |
658: r6 = r1 | |
659: r6 += r0 | |
660: r0 = *(u64 *)(r10 - 360) | |
661: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 8; | |
662: r0 = r4 | |
663: r0 += 112 | |
664: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
665: r0 >>= 3 | |
666: r6 = r1 | |
667: r6 += r0 | |
668: r7 = *(u64 *)(r10 - 256) | |
669: *(u8 *)(r6 + 0) = r7 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
670: r0 |= 1 | |
671: r6 = r1 | |
672: r6 += r0 | |
673: r0 = *(u64 *)(r10 - 264) | |
674: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 16; | |
675: r4 |= 128 | |
676: r0 = r4 | |
677: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
678: r0 >>= 3 | |
679: r6 = r1 | |
680: r6 += r0 | |
681: r7 = *(u64 *)(r10 - 240) | |
682: *(u8 *)(r6 + 0) = r7 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
683: r0 |= 1 | |
684: r6 = r1 | |
685: r6 += r0 | |
686: r0 = *(u64 *)(r10 - 248) | |
687: *(u8 *)(r6 + 0) = r0 | |
; ebpf_packetOffsetInBits += 16; | |
688: r0 = r4 | |
689: r0 += 16 | |
690: r0 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
691: r0 >>= 3 | |
692: r5 = r1 | |
693: r5 += r0 | |
694: r6 = *(u64 *)(r10 - 224) | |
695: *(u8 *)(r5 + 0) = r6 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
696: r0 |= 1 | |
697: r5 = r1 | |
698: r5 += r0 | |
699: r0 = *(u64 *)(r10 - 232) | |
700: *(u8 *)(r5 + 0) = r0 | |
; ebpf_packetOffsetInBits += 16; | |
701: r4 += 32 | |
LBB0_24: | |
; if (hd.icmp.ebpf_valid) { | |
702: r5 = *(u64 *)(r10 - 80) | |
703: if r5 == 0 goto 26 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
704: r0 = r4 | |
705: r0 += 32 | |
706: r5 = 4294967288ll | |
708: r0 &= r5 | |
709: r0 >>= 3 | |
710: r6 = r1 | |
711: r6 += r0 | |
712: if r6 > r2 goto 17 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
713: r2 = r4 | |
714: r2 &= r5 | |
715: r2 >>= 3 | |
716: r0 = r1 | |
717: r0 += r2 | |
718: r2 = *(u64 *)(r10 - 520) | |
719: *(u8 *)(r0 + 0) = r2 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
720: r2 = *(u64 *)(r10 - 392) | |
721: *(u8 *)(r0 + 1) = r2 | |
; ebpf_packetOffsetInBits += 16; | |
722: r4 += 16 | |
723: r4 &= r5 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
724: r4 >>= 3 | |
725: r1 += r4 | |
726: r2 = *(u64 *)(r10 - 384) | |
727: *(u8 *)(r1 + 0) = r2 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
728: r2 = *(u64 *)(r10 - 528) | |
729: *(u8 *)(r1 + 1) = r2 | |
LBB0_27: | |
730: r2 = r10 | |
731: r2 += -4 | |
732: r6 = 0 | |
; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
733: r1 = 0ll | |
735: r4 = 0 | |
736: call 2 | |
737: r7 = 2 | |
; if (xout.drop) return XDP_DROP; | |
738: r1 = *(u8 *)(r10 - 16) | |
; else return XDP_PASS; | |
739: if r1 == r6 goto 3 | |
740: r7 = 1 | |
741: goto 1 | |
LBB0_30: | |
742: r7 = 0 | |
LBB0_29: | |
; } | |
743: r0 = r7 | |
744: exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment