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 hidden or 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 hidden or 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