Skip to content

Instantly share code, notes, and snippets.

@williamtu
Created February 8, 2017 20:20
Show Gist options
  • Save williamtu/5a09b60a951ee5fc062328766403ab4b to your computer and use it in GitHub Desktop.
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
#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";
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