Skip to content

Instantly share code, notes, and snippets.

@williamtu
Created February 17, 2017 16:39
Show Gist options
  • Save williamtu/97fcfe025ada712d91881fac53a9d1e3 to your computer and use it in GitHub Desktop.
Save williamtu/97fcfe025ada712d91881fac53a9d1e3 to your computer and use it in GitHub Desktop.
xdp12 Verifier: cannot add integer value with 0 upper zero bits to ptr_to_packet
/* Automatically generated by p4c-xdp from xdp12.p4 on Fri Feb 17 08:32:10 2017
*/
#include "xdp12.h"
#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 *)((u8*)(data) + (b)))
#define load_word(data, b) __constant_ntohl(*(u32 *)((u8*)(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)
void* memcpy(void* dest, const void* src, size_t num);
inline u16 ebpf_ipv4_checksum(u8 version, u8 ihl, u8 diffserv,
u16 totalLen, u16 identification, u8 flags,
u16 fragOffset, u8 ttl, u8 protocol,
u32 srcAddr, u32 dstAddr) {
u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv);
checksum += htons(totalLen);
checksum += htons(identification);
checksum += htons(((u16)flags << 13) | fragOffset);
checksum += htons(((u16)ttl << 8) | (u16)protocol);
srcAddr = htonl(srcAddr);
dstAddr = htonl(dstAddr);
checksum += (srcAddr >> 16) + (u16)srcAddr;
checksum += (dstAddr >> 16) + (u16)dstAddr;
// Fields in 'struct Headers' are host byte order. Deparser converts to network byte-order
return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16)));
}
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
},
.vlan_tag = {
.ebpf_valid = 0
},
.ipv6 = {
.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 33024: goto parse_vlan_tag;
case 37120: goto parse_vlan_tag;
case 34525: goto parse_ipv6;
default: goto accept;
}
}
parse_vlan_tag: {
/* extract(hd.vlan_tag)*/
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
ebpf_errorCode = PacketTooShort;
goto reject;
}
hd.vlan_tag.pcp = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3));
ebpf_packetOffsetInBits += 3;
hd.vlan_tag.cfi = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 1));
ebpf_packetOffsetInBits += 1;
hd.vlan_tag.vid = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 12));
ebpf_packetOffsetInBits += 12;
hd.vlan_tag.etherType = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
ebpf_packetOffsetInBits += 16;
hd.vlan_tag.ebpf_valid = 1;
switch (hd.vlan_tag.etherType) {
case 34525: goto parse_ipv6;
default: goto accept;
}
}
parse_ipv6: {
/* extract(hd.ipv6)*/
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 320)) {
ebpf_errorCode = PacketTooShort;
goto reject;
}
hd.ipv6.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
ebpf_packetOffsetInBits += 4;
hd.ipv6.trafficClass = (u8)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 8));
ebpf_packetOffsetInBits += 8;
hd.ipv6.flowLabel = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 8) & EBPF_MASK(u32, 20));
ebpf_packetOffsetInBits += 20;
hd.ipv6.payloadLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
ebpf_packetOffsetInBits += 16;
hd.ipv6.nextHdr = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
ebpf_packetOffsetInBits += 8;
hd.ipv6.hopLimit = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
ebpf_packetOffsetInBits += 8;
hd.ipv6.srcAddr[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
hd.ipv6.srcAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
hd.ipv6.srcAddr[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
hd.ipv6.srcAddr[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
hd.ipv6.srcAddr[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
hd.ipv6.srcAddr[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
hd.ipv6.srcAddr[6] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6) >> 0));
hd.ipv6.srcAddr[7] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7) >> 0));
hd.ipv6.srcAddr[8] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8) >> 0));
hd.ipv6.srcAddr[9] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9) >> 0));
hd.ipv6.srcAddr[10] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10) >> 0));
hd.ipv6.srcAddr[11] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11) >> 0));
hd.ipv6.srcAddr[12] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12) >> 0));
hd.ipv6.srcAddr[13] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13) >> 0));
hd.ipv6.srcAddr[14] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14) >> 0));
hd.ipv6.srcAddr[15] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15) >> 0));
ebpf_packetOffsetInBits += 128;
hd.ipv6.dstAddr[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
hd.ipv6.dstAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
hd.ipv6.dstAddr[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
hd.ipv6.dstAddr[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
hd.ipv6.dstAddr[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
hd.ipv6.dstAddr[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
hd.ipv6.dstAddr[6] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6) >> 0));
hd.ipv6.dstAddr[7] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7) >> 0));
hd.ipv6.dstAddr[8] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8) >> 0));
hd.ipv6.dstAddr[9] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9) >> 0));
hd.ipv6.dstAddr[10] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10) >> 0));
hd.ipv6.dstAddr[11] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11) >> 0));
hd.ipv6.dstAddr[12] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12) >> 0));
hd.ipv6.dstAddr[13] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13) >> 0));
hd.ipv6.dstAddr[14] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14) >> 0));
hd.ipv6.dstAddr[15] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15) >> 0));
ebpf_packetOffsetInBits += 128;
hd.ipv6.ebpf_valid = 1;
goto accept;
}
reject: { return XDP_ABORTED; }
accept:
{
u8 hit;
u8 tmp_1;
enum xdp_action tmp_2;
{
xout.output_port = 0;
tmp_1 = (hd.ipv6.version != 6);
if (tmp_1)
tmp_2 = XDP_DROP;
else
tmp_2 = XDP_PASS;
xout.output_action = tmp_2;
}
}
/* deparser */
{
{
if (hd.ethernet.ebpf_valid) ebpf_outHeaderLength += 112;
if (hd.vlan_tag.ebpf_valid) ebpf_outHeaderLength += 32;
if (hd.ipv6.ebpf_valid) ebpf_outHeaderLength += 320;
}
//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;
return XDP_ABORTED;
}
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.vlan_tag)*/
if (hd.vlan_tag.ebpf_valid) {
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
ebpf_errorCode = PacketTooShort;
return XDP_ABORTED;
}
ebpf_byte = ((char*)(&hd.vlan_tag.pcp))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5);
ebpf_packetOffsetInBits += 3;
ebpf_byte = ((char*)(&hd.vlan_tag.cfi))[0];
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 7);
ebpf_packetOffsetInBits += 1;
ebpf_byte = ((char*)(&hd.vlan_tag.vid))[0];
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
ebpf_byte = ((char*)(&hd.vlan_tag.vid))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 12;
hd.vlan_tag.etherType = htons(hd.vlan_tag.etherType);
ebpf_byte = ((char*)(&hd.vlan_tag.etherType))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.vlan_tag.etherType))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 16;
}
;
/* packet.emit(hd.ipv6)*/
if (hd.ipv6.ebpf_valid) {
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 320)) {
ebpf_errorCode = PacketTooShort;
return XDP_ABORTED;
}
ebpf_byte = ((char*)(&hd.ipv6.version))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
ebpf_packetOffsetInBits += 4;
ebpf_byte = ((char*)(&hd.ipv6.trafficClass))[0];
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 8;
ebpf_byte = ((char*)(&hd.ipv6.flowLabel))[0];
write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
ebpf_byte = ((char*)(&hd.ipv6.flowLabel))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.flowLabel))[2];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 20;
hd.ipv6.payloadLen = htons(hd.ipv6.payloadLen);
ebpf_byte = ((char*)(&hd.ipv6.payloadLen))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.payloadLen))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 16;
ebpf_byte = ((char*)(&hd.ipv6.nextHdr))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 8;
ebpf_byte = ((char*)(&hd.ipv6.hopLimit))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 8;
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[2];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[3];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[4];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[5];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[6];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[7];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[8];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[9];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[10];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[11];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[12];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[13];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[14];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.srcAddr))[15];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 128;
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[2];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[3];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[4];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[5];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[6];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[7];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[8];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[9];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[10];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[11];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[12];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[13];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[14];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.ipv6.dstAddr))[15];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 128;
}
;
}
}
ebpf_end:
bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY);
return xout.output_action;
}
char _license[] SEC("license") = "GPL";
xdp12.o: file format ELF64-BPF
Disassembly of section prog:
ebpf_filter:
; int ebpf_filter(struct xdp_md* skb){
0: r8 = r1
; void* ebpf_packetEnd = ((void*)(long)skb->data_end);
1: r5 = *(u32 *)(r8 + 4)
; void* ebpf_packetStart = ((void*)(long)skb->data);
2: r9 = *(u32 *)(r8 + 0)
3: r0 = 0
; u32 ebpf_zero = 0;
4: *(u32 *)(r10 - 4) = r0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
5: r1 = r9
6: r1 += 14
7: if r1 > r5 goto 598
; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
8: r1 = *(u8 *)(r9 + 11)
; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
9: *(u64 *)(r10 - 24) = r1
10: r1 = *(u8 *)(r9 + 10)
; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
11: *(u64 *)(r10 - 72) = r1
12: r1 = *(u8 *)(r9 + 9)
; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
13: *(u64 *)(r10 - 80) = r1
14: r1 = *(u8 *)(r9 + 8)
; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
15: *(u64 *)(r10 - 88) = r1
16: r1 = *(u8 *)(r9 + 7)
; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
17: *(u64 *)(r10 - 96) = r1
18: r1 = *(u8 *)(r9 + 6)
; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
19: *(u64 *)(r10 - 104) = r1
20: r1 = *(u8 *)(r9 + 5)
; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
21: *(u64 *)(r10 - 128) = r1
22: r1 = *(u8 *)(r9 + 4)
; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
23: *(u64 *)(r10 - 136) = r1
24: r1 = *(u8 *)(r9 + 3)
; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
25: *(u64 *)(r10 - 144) = r1
26: r1 = *(u8 *)(r9 + 2)
; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
27: *(u64 *)(r10 - 152) = r1
28: r1 = *(u8 *)(r9 + 1)
; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
29: *(u64 *)(r10 - 160) = r1
30: r1 = *(u8 *)(r9 + 0)
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
31: *(u64 *)(r10 - 168) = r1
32: r1 = *(u16 *)(r9 + 12)
33: r3 = r1
34: r3 >>= 8
35: *(u64 *)(r10 - 112) = r1
; switch (hd.ethernet.protocol) {
36: r0 = r1
37: r0 <<= 8
38: *(u64 *)(r10 - 120) = r3
39: r0 |= r3
40: r0 &= 65535
41: if r0 == 37120 goto 105
42: r6 = 112
43: r1 = 0
44: *(u64 *)(r10 - 176) = r1
45: r4 = 0
46: r1 = 0
47: *(u64 *)(r10 - 40) = r1
48: r1 = 0
49: *(u64 *)(r10 - 56) = r1
50: r1 = 0
51: *(u64 *)(r10 - 32) = r1
52: r1 = 0
53: *(u64 *)(r10 - 48) = r1
54: if r0 == 34525 goto 197
55: r1 = 0
56: *(u64 *)(r10 - 312) = r1
57: r1 = 0
58: *(u64 *)(r10 - 384) = r1
59: r1 = 0
60: *(u64 *)(r10 - 184) = r1
61: r1 = 0
62: *(u64 *)(r10 - 192) = r1
63: r1 = 0
64: *(u64 *)(r10 - 200) = r1
65: r1 = 0
66: *(u64 *)(r10 - 208) = r1
67: r1 = 0
68: *(u64 *)(r10 - 216) = r1
69: r1 = 0
70: *(u64 *)(r10 - 224) = r1
71: r1 = 0
72: *(u64 *)(r10 - 232) = r1
73: r1 = 0
74: *(u64 *)(r10 - 240) = r1
75: r1 = 0
76: *(u64 *)(r10 - 248) = r1
77: r1 = 0
78: *(u64 *)(r10 - 256) = r1
79: r1 = 0
80: *(u64 *)(r10 - 264) = r1
81: r1 = 0
82: *(u64 *)(r10 - 272) = r1
83: r1 = 0
84: *(u64 *)(r10 - 280) = r1
85: r1 = 0
86: *(u64 *)(r10 - 288) = r1
87: r1 = 0
88: *(u64 *)(r10 - 296) = r1
89: r1 = 0
90: *(u64 *)(r10 - 336) = r1
91: r1 = 0
92: *(u64 *)(r10 - 304) = r1
93: r1 = 0
94: *(u64 *)(r10 - 320) = r1
95: r1 = 0
96: *(u64 *)(r10 - 328) = r1
97: r1 = 0
98: *(u64 *)(r10 - 344) = r1
99: r1 = 0
100: *(u64 *)(r10 - 352) = r1
101: r1 = 0
102: *(u64 *)(r10 - 360) = r1
103: r1 = 0
104: *(u64 *)(r10 - 368) = r1
105: r1 = 0
106: *(u64 *)(r10 - 376) = r1
107: r1 = 0
108: *(u64 *)(r10 - 392) = r1
109: r1 = 0
110: *(u64 *)(r10 - 400) = r1
111: r1 = 0
112: *(u64 *)(r10 - 408) = r1
113: r1 = 0
114: *(u64 *)(r10 - 416) = r1
115: r1 = 0
116: *(u64 *)(r10 - 424) = r1
117: r1 = 0
118: *(u64 *)(r10 - 432) = r1
119: r1 = 0
120: *(u64 *)(r10 - 440) = r1
121: r1 = 0
122: *(u64 *)(r10 - 456) = r1
123: r1 = 0
124: *(u64 *)(r10 - 448) = r1
125: r1 = 0
126: *(u64 *)(r10 - 464) = r1
127: r1 = 0
128: *(u64 *)(r10 - 472) = r1
129: r7 = 0
130: r1 = 0
131: *(u64 *)(r10 - 480) = r1
132: r1 = 0
133: *(u64 *)(r10 - 64) = r1
134: r1 = 0
135: *(u64 *)(r10 - 488) = r1
136: r4 = 0
137: r3 = 0
138: r1 = 0
139: *(u64 *)(r10 - 40) = r1
140: r1 = 0
141: *(u64 *)(r10 - 56) = r1
142: r1 = 0
143: *(u64 *)(r10 - 32) = r1
144: r1 = 0
145: *(u64 *)(r10 - 48) = r1
146: if r0 != 33024 goto 255
LBB0_4:
147: r0 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
148: r1 = r9
149: r1 += 18
150: if r1 > r5 goto 455
151: r1 = 0
152: *(u64 *)(r10 - 312) = r1
153: r6 = 144
154: r1 = 1
; hd.vlan_tag.vid = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 12));
155: *(u64 *)(r10 - 176) = r1
156: r1 = *(u16 *)(r9 + 14)
157: r3 = r1
158: r3 &= 15
159: *(u64 *)(r10 - 48) = r3
160: r1 >>= 8
161: *(u64 *)(r10 - 32) = r1
; hd.vlan_tag.pcp = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3));
162: r4 = *(u8 *)(r9 + 14)
163: r4 >>= 5
; hd.vlan_tag.etherType = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
164: r0 = *(u16 *)(r9 + 16)
165: r1 = r0
166: bswap64 r1
167: r1 >>= 56
168: *(u64 *)(r10 - 56) = r1
169: bswap16 r0
170: r1 = 0
171: *(u64 *)(r10 - 384) = r1
172: r1 = 0
173: *(u64 *)(r10 - 184) = r1
174: r1 = 0
175: *(u64 *)(r10 - 192) = r1
176: r1 = 0
177: *(u64 *)(r10 - 200) = r1
178: r1 = 0
179: *(u64 *)(r10 - 208) = r1
180: r1 = 0
181: *(u64 *)(r10 - 216) = r1
182: r1 = 0
183: *(u64 *)(r10 - 224) = r1
184: r1 = 0
185: *(u64 *)(r10 - 232) = r1
186: r1 = 0
187: *(u64 *)(r10 - 240) = r1
188: r1 = 0
189: *(u64 *)(r10 - 248) = r1
190: r1 = 0
191: *(u64 *)(r10 - 256) = r1
192: r1 = 0
193: *(u64 *)(r10 - 264) = r1
194: r1 = 0
195: *(u64 *)(r10 - 272) = r1
196: r1 = 0
197: *(u64 *)(r10 - 280) = r1
198: r1 = 0
199: *(u64 *)(r10 - 288) = r1
200: r1 = 0
201: *(u64 *)(r10 - 296) = r1
202: r1 = 0
203: *(u64 *)(r10 - 336) = r1
204: r1 = 0
205: *(u64 *)(r10 - 304) = r1
206: r1 = 0
207: *(u64 *)(r10 - 320) = r1
208: r1 = 0
209: *(u64 *)(r10 - 328) = r1
210: r1 = 0
211: *(u64 *)(r10 - 344) = r1
212: r1 = 0
213: *(u64 *)(r10 - 352) = r1
214: r1 = 0
215: *(u64 *)(r10 - 360) = r1
216: r1 = 0
217: *(u64 *)(r10 - 368) = r1
218: r1 = 0
219: *(u64 *)(r10 - 376) = r1
220: r1 = 0
221: *(u64 *)(r10 - 392) = r1
222: r1 = 0
223: *(u64 *)(r10 - 400) = r1
224: r1 = 0
225: *(u64 *)(r10 - 408) = r1
226: r1 = 0
227: *(u64 *)(r10 - 416) = r1
228: r1 = 0
229: *(u64 *)(r10 - 424) = r1
230: r1 = 0
231: *(u64 *)(r10 - 432) = r1
232: r1 = 0
233: *(u64 *)(r10 - 440) = r1
234: r1 = 0
235: *(u64 *)(r10 - 456) = r1
236: r1 = 0
237: *(u64 *)(r10 - 448) = r1
238: r1 = 0
239: *(u64 *)(r10 - 464) = r1
240: r1 = 0
241: *(u64 *)(r10 - 472) = r1
242: r7 = 0
243: r1 = 0
244: *(u64 *)(r10 - 480) = r1
245: r1 = 0
246: *(u64 *)(r10 - 64) = r1
247: r1 = 0
248: *(u64 *)(r10 - 488) = r1
249: r3 = 0
250: *(u64 *)(r10 - 40) = r0
; switch (hd.vlan_tag.etherType) {
251: if r0 != 34525 goto 150
LBB0_6:
252: *(u64 *)(r10 - 496) = r4
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 320)) {
253: r1 = r6
254: r1 += 320
255: r1 >>= 3
256: r3 = r9
257: r3 += r1
258: r0 = 0
259: if r3 > r5 goto 346
; ebpf_packetOffsetInBits += 8;
260: r5 = r6
261: r5 |= 12
; ebpf_packetOffsetInBits += 8;
262: r1 = r5
263: r1 += 44
; hd.ipv6.hopLimit = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
264: r1 >>= 3
265: *(u64 *)(r10 - 64) = r1
; ebpf_packetOffsetInBits += 16;
266: r7 = r5
267: r7 += 36
; hd.ipv6.nextHdr = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
268: r7 >>= 3
; ebpf_packetOffsetInBits += 20;
269: r0 = r5
270: r0 += 20
; hd.ipv6.payloadLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
271: r0 >>= 3
; ebpf_packetOffsetInBits += 8;
272: r1 = r5
273: r1 += 52
; hd.ipv6.srcAddr[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
274: r1 >>= 3
; hd.ipv6.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
275: r6 >>= 3
276: r2 = *(u64 *)(r10 - 24)
; hd.ipv6.flowLabel = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 8) & EBPF_MASK(u32, 20));
277: r2 = r5
278: r2 >>= 3
279: *(u64 *)(r10 - 184) = r2
; ebpf_packetOffsetInBits += 128;
280: r5 += 180
; hd.ipv6.dstAddr[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
281: r5 >>= 3
282: r4 = r9
283: r4 += r5
; hd.ipv6.dstAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
284: r5 |= 1
; hd.ipv6.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
285: r3 = r9
286: r3 += r6
287: r6 = r9
288: r6 += r1
; hd.ipv6.srcAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
289: r1 |= 1
; hd.ipv6.payloadLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
290: r2 = r9
291: r2 += r0
292: *(u64 *)(r10 - 312) = r2
; hd.ipv6.flowLabel = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 8) & EBPF_MASK(u32, 20));
293: r2 = r9
294: r0 = *(u64 *)(r10 - 184)
295: r2 += r0
296: *(u64 *)(r10 - 336) = r2
; hd.ipv6.nextHdr = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
297: r2 = r9
298: r2 += r7
; hd.ipv6.hopLimit = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
299: r0 = r9
300: r7 = *(u64 *)(r10 - 64)
301: r0 += r7
; hd.ipv6.srcAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
302: r7 = r9
303: r7 += r1
; hd.ipv6.dstAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
304: r9 += r5
305: r1 = 1
306: *(u64 *)(r10 - 184) = r1
307: r5 = *(u32 *)(r8 + 4)
308: r1 = *(u32 *)(r8 + 0)
; goto accept;
309: r8 = *(u16 *)(r3 + 0)
310: r8 &= 15
311: *(u64 *)(r10 - 480) = r8
; hd.ipv6.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
312: r3 = *(u8 *)(r3 + 0)
313: r3 >>= 4
314: *(u64 *)(r10 - 64) = r3
; hd.ipv6.dstAddr[15] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15) >> 0));
315: r3 = *(u8 *)(r4 + 15)
; hd.ipv6.dstAddr[14] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14) >> 0));
316: *(u64 *)(r10 - 192) = r3
317: r3 = *(u8 *)(r4 + 14)
; hd.ipv6.dstAddr[13] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13) >> 0));
318: *(u64 *)(r10 - 200) = r3
319: r3 = *(u8 *)(r4 + 13)
; hd.ipv6.dstAddr[12] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12) >> 0));
320: *(u64 *)(r10 - 208) = r3
321: r3 = *(u8 *)(r4 + 12)
; hd.ipv6.dstAddr[11] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11) >> 0));
322: *(u64 *)(r10 - 216) = r3
323: r3 = *(u8 *)(r4 + 11)
; hd.ipv6.dstAddr[10] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10) >> 0));
324: *(u64 *)(r10 - 224) = r3
325: r3 = *(u8 *)(r4 + 10)
; hd.ipv6.dstAddr[9] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9) >> 0));
326: *(u64 *)(r10 - 232) = r3
327: r3 = *(u8 *)(r4 + 9)
; hd.ipv6.dstAddr[8] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8) >> 0));
328: *(u64 *)(r10 - 240) = r3
329: r3 = *(u8 *)(r4 + 8)
; hd.ipv6.dstAddr[7] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7) >> 0));
330: *(u64 *)(r10 - 248) = r3
331: r3 = *(u8 *)(r4 + 7)
; hd.ipv6.dstAddr[6] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6) >> 0));
332: *(u64 *)(r10 - 256) = r3
333: r3 = *(u8 *)(r4 + 6)
; hd.ipv6.dstAddr[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
334: *(u64 *)(r10 - 264) = r3
335: r3 = *(u8 *)(r4 + 5)
; hd.ipv6.dstAddr[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
336: *(u64 *)(r10 - 272) = r3
337: r3 = *(u8 *)(r4 + 4)
; hd.ipv6.dstAddr[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
338: *(u64 *)(r10 - 280) = r3
339: r3 = *(u8 *)(r4 + 3)
; hd.ipv6.dstAddr[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
340: *(u64 *)(r10 - 288) = r3
341: r3 = *(u8 *)(r4 + 2)
; hd.ipv6.dstAddr[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
342: *(u64 *)(r10 - 296) = r3
343: r3 = *(u8 *)(r4 + 0)
; hd.ipv6.srcAddr[15] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15) >> 0));
344: *(u64 *)(r10 - 304) = r3
345: r3 = *(u8 *)(r6 + 15)
; hd.ipv6.srcAddr[14] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14) >> 0));
346: *(u64 *)(r10 - 320) = r3
347: r3 = *(u8 *)(r6 + 14)
; hd.ipv6.srcAddr[13] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13) >> 0));
348: *(u64 *)(r10 - 328) = r3
349: r3 = *(u8 *)(r6 + 13)
; hd.ipv6.srcAddr[12] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12) >> 0));
350: *(u64 *)(r10 - 344) = r3
351: r3 = *(u8 *)(r6 + 12)
; hd.ipv6.srcAddr[11] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11) >> 0));
352: *(u64 *)(r10 - 352) = r3
353: r3 = *(u8 *)(r6 + 11)
; hd.ipv6.srcAddr[10] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10) >> 0));
354: *(u64 *)(r10 - 360) = r3
355: r3 = *(u8 *)(r6 + 10)
; hd.ipv6.srcAddr[9] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9) >> 0));
356: *(u64 *)(r10 - 368) = r3
357: r3 = *(u8 *)(r6 + 9)
; hd.ipv6.srcAddr[8] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8) >> 0));
358: *(u64 *)(r10 - 376) = r3
359: r3 = *(u8 *)(r6 + 8)
; hd.ipv6.srcAddr[7] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7) >> 0));
360: *(u64 *)(r10 - 392) = r3
361: r3 = *(u8 *)(r6 + 7)
; hd.ipv6.srcAddr[6] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6) >> 0));
362: *(u64 *)(r10 - 400) = r3
363: r3 = *(u8 *)(r6 + 6)
; hd.ipv6.srcAddr[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
364: *(u64 *)(r10 - 408) = r3
365: r3 = *(u8 *)(r6 + 5)
; hd.ipv6.srcAddr[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
366: *(u64 *)(r10 - 416) = r3
367: r3 = *(u8 *)(r6 + 4)
; hd.ipv6.srcAddr[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
368: *(u64 *)(r10 - 424) = r3
369: r3 = *(u8 *)(r6 + 3)
; hd.ipv6.srcAddr[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
370: *(u64 *)(r10 - 432) = r3
371: r3 = *(u8 *)(r6 + 2)
; hd.ipv6.srcAddr[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
372: *(u64 *)(r10 - 440) = r3
373: r3 = *(u8 *)(r6 + 0)
; hd.ipv6.hopLimit = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
374: *(u64 *)(r10 - 448) = r3
375: r3 = *(u8 *)(r0 + 0)
; hd.ipv6.nextHdr = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
376: *(u64 *)(r10 - 464) = r3
377: r3 = *(u8 *)(r2 + 0)
378: *(u64 *)(r10 - 472) = r3
379: r2 = *(u64 *)(r10 - 24)
; hd.ipv6.flowLabel = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 8) & EBPF_MASK(u32, 20));
380: r2 = *(u64 *)(r10 - 336)
381: r3 = *(u32 *)(r2 + 0)
382: r4 = r3
383: bswap16 r4
384: *(u64 *)(r10 - 488) = r4
; hd.ipv6.payloadLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
385: r2 = *(u64 *)(r10 - 312)
386: r4 = *(u16 *)(r2 + 0)
387: *(u64 *)(r10 - 312) = r4
388: r4 >>= 8
389: *(u64 *)(r10 - 384) = r4
; hd.ipv6.dstAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
390: r2 = *(u8 *)(r9 + 0)
; hd.ipv6.srcAddr[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
391: *(u64 *)(r10 - 336) = r2
392: r2 = *(u8 *)(r7 + 0)
; hd.ipv6.flowLabel = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 8) & EBPF_MASK(u32, 20));
393: *(u64 *)(r10 - 456) = r2
394: bswap64 r3
395: r7 = r3
396: r7 >>= 40
; goto accept;
397: r7 &= 15
; hd.ipv6.flowLabel = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 8) & EBPF_MASK(u32, 20));
398: r3 >>= 56
399: r3 &= 15
; ebpf_packetStart = ((void*)(long)skb->data);
400: r9 = r1
401: r4 = *(u64 *)(r10 - 496)
LBB0_8:
402: r6 = r4
403: r1 = 2
; tmp_1 = (hd.ipv6.version != 6);
404: r4 = 6
405: r8 = *(u64 *)(r10 - 64)
406: if r8 == r4 goto 1
407: r1 = 1
LBB0_10:
408: r0 = 0
; xout.output_port = 0;
409: *(u32 *)(r10 - 12) = r0
; xout.output_action = tmp_2;
410: *(u32 *)(r10 - 16) = r1
; ebpf_packetEnd = ((void*)(long)skb->data_end);
411: r5 <<= 32
412: r5 >>= 32
; ebpf_packetStart = ((void*)(long)skb->data);
413: r9 <<= 32
414: r9 >>= 32
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
415: r1 = r9
416: r1 += 14
417: if r1 > r5 goto 188
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
418: r1 = *(u64 *)(r10 - 168)
419: *(u8 *)(r9 + 0) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
420: r1 = *(u64 *)(r10 - 160)
421: *(u8 *)(r9 + 1) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
422: r1 = *(u64 *)(r10 - 152)
423: *(u8 *)(r9 + 2) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
424: r1 = *(u64 *)(r10 - 144)
425: *(u8 *)(r9 + 3) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
426: r1 = *(u64 *)(r10 - 136)
427: *(u8 *)(r9 + 4) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
428: r1 = *(u64 *)(r10 - 128)
429: *(u8 *)(r9 + 5) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
430: r1 = *(u64 *)(r10 - 104)
431: *(u8 *)(r9 + 6) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
432: r1 = *(u64 *)(r10 - 96)
433: *(u8 *)(r9 + 7) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
434: r1 = *(u64 *)(r10 - 88)
435: *(u8 *)(r9 + 8) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
436: r1 = *(u64 *)(r10 - 80)
437: *(u8 *)(r9 + 9) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
438: r1 = *(u64 *)(r10 - 72)
439: *(u8 *)(r9 + 10) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
440: r1 = *(u64 *)(r10 - 24)
441: *(u8 *)(r9 + 11) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
442: r1 = *(u64 *)(r10 - 112)
443: *(u8 *)(r9 + 12) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
444: r1 = *(u64 *)(r10 - 120)
445: *(u8 *)(r9 + 13) = r1
446: r1 = 112
; if (hd.vlan_tag.ebpf_valid) {
447: r4 = *(u64 *)(r10 - 176)
448: if r4 == 0 goto 15
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
449: r1 = r9
450: r1 += 18
451: if r1 > r5 goto 154
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5);
452: r6 <<= 5
453: r1 = *(u64 *)(r10 - 32)
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
454: r1 &= 15
455: r1 |= r6
456: *(u8 *)(r9 + 14) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
457: r1 = *(u64 *)(r10 - 48)
458: *(u8 *)(r9 + 15) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
459: r1 = *(u64 *)(r10 - 56)
460: *(u8 *)(r9 + 16) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
461: r1 = *(u64 *)(r10 - 40)
462: *(u8 *)(r9 + 17) = r1
463: r1 = 144
LBB0_14:
; if (hd.ipv6.ebpf_valid) {
464: r4 = *(u64 *)(r10 - 184)
465: if r4 == 0 goto 131
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 320)) {
466: r4 = r1
467: r4 += 320
468: r4 >>= 3
469: r6 = r9
470: r6 += r4
471: if r6 > r5 goto 134
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
472: r8 <<= 4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 0);
473: r4 = *(u64 *)(r10 - 480)
474: r8 |= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
475: r4 = r1
476: r4 >>= 3
477: r5 = r9
478: r5 += r4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 0);
479: *(u8 *)(r5 + 0) = r8
; ebpf_packetOffsetInBits += 8;
480: r1 |= 12
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
481: r4 = r1
482: r4 >>= 3
483: r5 = r9
484: r5 += r4
485: r4 = *(u8 *)(r5 + 0)
486: r4 &= 240
487: r7 |= r4
488: *(u8 *)(r5 + 0) = r7
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
489: r4 = *(u64 *)(r10 - 488)
490: *(u8 *)(r5 + 1) = r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
491: *(u8 *)(r5 + 2) = r3
; ebpf_packetOffsetInBits += 20;
492: r3 = r1
493: r3 += 20
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
494: r3 >>= 3
495: r4 = r9
496: r4 += r3
497: r5 = *(u64 *)(r10 - 312)
498: *(u8 *)(r4 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
499: r3 |= 1
500: r4 = r9
501: r4 += r3
502: r3 = *(u64 *)(r10 - 384)
503: *(u8 *)(r4 + 0) = r3
; ebpf_packetOffsetInBits += 16;
504: r3 = r1
505: r3 += 36
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
506: r3 >>= 3
507: r4 = r9
508: r4 += r3
509: r3 = *(u64 *)(r10 - 472)
510: *(u8 *)(r4 + 0) = r3
; ebpf_packetOffsetInBits += 8;
511: r3 = r1
512: r3 += 44
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
513: r3 >>= 3
514: r4 = r9
515: r4 += r3
516: r3 = *(u64 *)(r10 - 464)
517: *(u8 *)(r4 + 0) = r3
; ebpf_packetOffsetInBits += 8;
518: r3 = r1
519: r3 += 52
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
520: r3 >>= 3
521: r4 = r9
522: r4 += r3
523: r5 = *(u64 *)(r10 - 448)
524: *(u8 *)(r4 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
525: r3 |= 1
526: r5 = r9
527: r5 += r3
528: r3 = *(u64 *)(r10 - 456)
529: *(u8 *)(r5 + 0) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
530: r3 = *(u64 *)(r10 - 440)
531: *(u8 *)(r4 + 2) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
532: r3 = *(u64 *)(r10 - 432)
533: *(u8 *)(r4 + 3) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
534: r3 = *(u64 *)(r10 - 424)
535: *(u8 *)(r4 + 4) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
536: r3 = *(u64 *)(r10 - 416)
537: *(u8 *)(r4 + 5) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6, (ebpf_byte) << 0);
538: r3 = *(u64 *)(r10 - 408)
539: *(u8 *)(r4 + 6) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7, (ebpf_byte) << 0);
540: r3 = *(u64 *)(r10 - 400)
541: *(u8 *)(r4 + 7) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8, (ebpf_byte) << 0);
542: r3 = *(u64 *)(r10 - 392)
543: *(u8 *)(r4 + 8) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9, (ebpf_byte) << 0);
544: r3 = *(u64 *)(r10 - 376)
545: *(u8 *)(r4 + 9) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10, (ebpf_byte) << 0);
546: r3 = *(u64 *)(r10 - 368)
547: *(u8 *)(r4 + 10) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11, (ebpf_byte) << 0);
548: r3 = *(u64 *)(r10 - 360)
549: *(u8 *)(r4 + 11) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12, (ebpf_byte) << 0);
550: r3 = *(u64 *)(r10 - 352)
551: *(u8 *)(r4 + 12) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13, (ebpf_byte) << 0);
552: r3 = *(u64 *)(r10 - 344)
553: *(u8 *)(r4 + 13) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14, (ebpf_byte) << 0);
554: r3 = *(u64 *)(r10 - 328)
555: *(u8 *)(r4 + 14) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15, (ebpf_byte) << 0);
556: r3 = *(u64 *)(r10 - 320)
557: *(u8 *)(r4 + 15) = r3
; ebpf_packetOffsetInBits += 128;
558: r1 += 180
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
559: r1 >>= 3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
560: r3 = r1
561: r3 |= 1
562: r4 = r9
563: r4 += r3
564: r9 += r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
565: r1 = *(u64 *)(r10 - 304)
566: *(u8 *)(r9 + 0) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
567: r1 = *(u64 *)(r10 - 336)
568: *(u8 *)(r4 + 0) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
569: r1 = *(u64 *)(r10 - 296)
570: *(u8 *)(r9 + 2) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
571: r1 = *(u64 *)(r10 - 288)
572: *(u8 *)(r9 + 3) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
573: r1 = *(u64 *)(r10 - 280)
574: *(u8 *)(r9 + 4) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
575: r1 = *(u64 *)(r10 - 272)
576: *(u8 *)(r9 + 5) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 6, (ebpf_byte) << 0);
577: r1 = *(u64 *)(r10 - 264)
578: *(u8 *)(r9 + 6) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 7, (ebpf_byte) << 0);
579: r1 = *(u64 *)(r10 - 256)
580: *(u8 *)(r9 + 7) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 8, (ebpf_byte) << 0);
581: r1 = *(u64 *)(r10 - 248)
582: *(u8 *)(r9 + 8) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 9, (ebpf_byte) << 0);
583: r1 = *(u64 *)(r10 - 240)
584: *(u8 *)(r9 + 9) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 10, (ebpf_byte) << 0);
585: r1 = *(u64 *)(r10 - 232)
586: *(u8 *)(r9 + 10) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 11, (ebpf_byte) << 0);
587: r1 = *(u64 *)(r10 - 224)
588: *(u8 *)(r9 + 11) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 12, (ebpf_byte) << 0);
589: r1 = *(u64 *)(r10 - 216)
590: *(u8 *)(r9 + 12) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 13, (ebpf_byte) << 0);
591: r1 = *(u64 *)(r10 - 208)
592: *(u8 *)(r9 + 13) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 14, (ebpf_byte) << 0);
593: r1 = *(u64 *)(r10 - 200)
594: *(u8 *)(r9 + 14) = r1
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 15, (ebpf_byte) << 0);
595: r1 = *(u64 *)(r10 - 192)
596: *(u8 *)(r9 + 15) = r1
LBB0_17:
; xout.output_port = 0;
597: r3 = r10
598: r3 += -12
599: r2 = r10
600: r2 += -4
; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY);
601: r1 = 0ll
603: r4 = 0
604: call 2
; return xout.output_action;
605: r0 = *(u32 *)(r10 - 16)
LBB0_18:
; }
606: exit
#include "xdp_model.p4"
header ethernet_t {
bit<48> source;
bit<48> destination;
bit<16> protocol;
}
header vlan_tag_t {
bit<3> pcp;
bit<1> cfi;
bit<12> vid;
bit<16> etherType;
}
header ipv6_t {
bit<4> version;
bit<8> trafficClass;
bit<20> flowLabel;
bit<16> payloadLen;
bit<8> nextHdr;
bit<8> hopLimit;
bit<128> srcAddr;
bit<128> dstAddr;
}
struct Headers {
ethernet_t ethernet;
vlan_tag_t vlan_tag;
ipv6_t ipv6;
}
parser Parser(packet_in packet, out Headers hd) {
state start {
packet.extract(hd.ethernet);
transition select(hd.ethernet.protocol) {
16w0x8100: parse_vlan_tag;
16w0x9100: parse_vlan_tag;
16w0x86dd: parse_ipv6;
default: accept;
}
}
state parse_vlan_tag {
packet.extract(hd.vlan_tag);
transition select(hd.vlan_tag.etherType) {
16w0x86dd: parse_ipv6;
default: accept;
}
}
state parse_ipv6 {
packet.extract(hd.ipv6);
transition accept;
}
}
control Ingress(inout Headers hdr, in xdp_input xin, out xdp_output xout) {
apply {
xout.output_port = 0;
xout.output_action = (hdr.ipv6.version != 0x6) ? xdp_action.XDP_DROP : xdp_action.XDP_PASS;
}
}
control Deparser(in Headers hdrs, packet_out packet) {
apply {
packet.emit(hdrs.ethernet);
packet.emit(hdrs.vlan_tag);
packet.emit(hdrs.ipv6);
}
}
xdp(Parser(), Ingress(), Deparser()) main;
root@prmh-nsx-perf-server139:~/p4c-clone/extensions/p4c-xdp/tests# make
clang \
-D__KERNEL__ -D__ASM_SYSREG_H -Wno-unused-value -Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-tautological-compare \
-O2 -emit-llvm -g -c xdp12.c -o -| llc -march=bpf -filetype=obj -o xdp12.o
./bpfloader xdp12.o
bpf_prog_load() err=13
0: (bf) r8 = r1
1: (61) r5 = *(u32 *)(r8 +4)
2: (61) r9 = *(u32 *)(r8 +0)
3: (b7) r0 = 0
4: (63) *(u32 *)(r10 -4) = r0
5: (bf) r1 = r9
6: (07) r1 += 14
7: (2d) if r1 > r5 goto pc+598
R0=imm0,min_value=0,max_value=0 R1=pkt(id=0,off=14,r=14) R5=pkt_end R8=ctx R9=pkt(id=0,off=0,r=14) R10=fp
8: (71) r1 = *(u8 *)(r9 +11)
9: (7b) *(u64 *)(r10 -24) = r1
10: (71) r1 = *(u8 *)(r9 +10)
11: (7b) *(u64 *)(r10 -72) = r1
12: (71) r1 = *(u8 *)(r9 +9)
13: (7b) *(u64 *)(r10 -80) = r1
14: (71) r1 = *(u8 *)(r9 +8)
15: (7b) *(u64 *)(r10 -88) = r1
16: (71) r1 = *(u8 *)(r9 +7)
17: (7b) *(u64 *)(r10 -96) = r1
18: (71) r1 = *(u8 *)(r9 +6)
19: (7b) *(u64 *)(r10 -104) = r1
20: (71) r1 = *(u8 *)(r9 +5)
21: (7b) *(u64 *)(r10 -128) = r1
22: (71) r1 = *(u8 *)(r9 +4)
23: (7b) *(u64 *)(r10 -136) = r1
24: (71) r1 = *(u8 *)(r9 +3)
25: (7b) *(u64 *)(r10 -144) = r1
26: (71) r1 = *(u8 *)(r9 +2)
27: (7b) *(u64 *)(r10 -152) = r1
28: (71) r1 = *(u8 *)(r9 +1)
29: (7b) *(u64 *)(r10 -160) = r1
30: (71) r1 = *(u8 *)(r9 +0)
31: (7b) *(u64 *)(r10 -168) = r1
32: (69) r1 = *(u16 *)(r9 +12)
33: (bf) r3 = r1
34: (77) r3 >>= 8
35: (7b) *(u64 *)(r10 -112) = r1
36: (bf) r0 = r1
37: (67) r0 <<= 8
38: (7b) *(u64 *)(r10 -120) = r3
39: (4f) r0 |= r3
40: (57) r0 &= 65535
41: (15) if r0 == 0x9100 goto pc+105
R0=inv48,min_value=0,max_value=65535 R1=inv48 R3=inv56 R5=pkt_end R8=ctx R9=pkt(id=0,off=0,r=14) R10=fp
42: (b7) r6 = 112
43: (b7) r1 = 0
44: (7b) *(u64 *)(r10 -176) = r1
45: (b7) r4 = 0
46: (b7) r1 = 0
47: (7b) *(u64 *)(r10 -40) = r1
48: (b7) r1 = 0
49: (7b) *(u64 *)(r10 -56) = r1
50: (b7) r1 = 0
51: (7b) *(u64 *)(r10 -32) = r1
52: (b7) r1 = 0
53: (7b) *(u64 *)(r10 -48) = r1
54: (15) if r0 == 0x86dd goto pc+197
R0=inv48,min_value=0,max_value=65535 R1=imm0,min_value=0,max_value=0 R3=inv56 R4=imm0,min_value=0,max_value=0 R5=pkt_end R6=imm112,min_value=112,max_value=112 R8=ctx R9=pkt(id=0,off=0,r=14) R10=fp
55: (b7) r1 = 0
56: (7b) *(u64 *)(r10 -312) = r1
57: (b7) r1 = 0
58: (7b) *(u64 *)(r10 -384) = r1
59: (b7) r1 = 0
60: (7b) *(u64 *)(r10 -184) = r1
61: (b7) r1 = 0
62: (7b) *(u64 *)(r10 -192) = r1
63: (b7) r1 = 0
64: (7b) *(u64 *)(r10 -200) = r1
65: (b7) r1 = 0
66: (7b) *(u64 *)(r10 -208) = r1
67: (b7) r1 = 0
68: (7b) *(u64 *)(r10 -216) = r1
69: (b7) r1 = 0
70: (7b) *(u64 *)(r10 -224) = r1
71: (b7) r1 = 0
72: (7b) *(u64 *)(r10 -232) = r1
73: (b7) r1 = 0
74: (7b) *(u64 *)(r10 -240) = r1
75: (b7) r1 = 0
76: (7b) *(u64 *)(r10 -248) = r1
77: (b7) r1 = 0
78: (7b) *(u64 *)(r10 -256) = r1
79: (b7) r1 = 0
80: (7b) *(u64 *)(r10 -264) = r1
81: (b7) r1 = 0
82: (7b) *(u64 *)(r10 -272) = r1
83: (b7) r1 = 0
84: (7b) *(u64 *)(r10 -280) = r1
85: (b7) r1 = 0
86: (7b) *(u64 *)(r10 -288) = r1
87: (b7) r1 = 0
88: (7b) *(u64 *)(r10 -296) = r1
89: (b7) r1 = 0
90: (7b) *(u64 *)(r10 -336) = r1
91: (b7) r1 = 0
92: (7b) *(u64 *)(r10 -304) = r1
93: (b7) r1 = 0
94: (7b) *(u64 *)(r10 -320) = r1
95: (b7) r1 = 0
96: (7b) *(u64 *)(r10 -328) = r1
97: (b7) r1 = 0
98: (7b) *(u64 *)(r10 -344) = r1
99: (b7) r1 = 0
100: (7b) *(u64 *)(r10 -352) = r1
101: (b7) r1 = 0
102: (7b) *(u64 *)(r10 -360) = r1
103: (b7) r1 = 0
104: (7b) *(u64 *)(r10 -368) = r1
105: (b7) r1 = 0
106: (7b) *(u64 *)(r10 -376) = r1
107: (b7) r1 = 0
108: (7b) *(u64 *)(r10 -392) = r1
109: (b7) r1 = 0
110: (7b) *(u64 *)(r10 -400) = r1
111: (b7) r1 = 0
112: (7b) *(u64 *)(r10 -408) = r1
113: (b7) r1 = 0
114: (7b) *(u64 *)(r10 -416) = r1
115: (b7) r1 = 0
116: (7b) *(u64 *)(r10 -424) = r1
117: (b7) r1 = 0
118: (7b) *(u64 *)(r10 -432) = r1
119: (b7) r1 = 0
120: (7b) *(u64 *)(r10 -440) = r1
121: (b7) r1 = 0
122: (7b) *(u64 *)(r10 -456) = r1
123: (b7) r1 = 0
124: (7b) *(u64 *)(r10 -448) = r1
125: (b7) r1 = 0
126: (7b) *(u64 *)(r10 -464) = r1
127: (b7) r1 = 0
128: (7b) *(u64 *)(r10 -472) = r1
129: (b7) r7 = 0
130: (b7) r1 = 0
131: (7b) *(u64 *)(r10 -480) = r1
132: (b7) r1 = 0
133: (7b) *(u64 *)(r10 -64) = r1
134: (b7) r1 = 0
135: (7b) *(u64 *)(r10 -488) = r1
136: (b7) r4 = 0
137: (b7) r3 = 0
138: (b7) r1 = 0
139: (7b) *(u64 *)(r10 -40) = r1
140: (b7) r1 = 0
141: (7b) *(u64 *)(r10 -56) = r1
142: (b7) r1 = 0
143: (7b) *(u64 *)(r10 -32) = r1
144: (b7) r1 = 0
145: (7b) *(u64 *)(r10 -48) = r1
146: (55) if r0 != 0x8100 goto pc+255
R0=inv48,min_value=33024,max_value=33024 R1=imm0,min_value=0,max_value=0 R3=imm0,min_value=0,max_value=0 R4=imm0,min_value=0,max_value=0 R5=pkt_end R6=imm112,min_value=112,max_value=112 R7=imm0,min_value=0,max_value=0 R8=ctx R9=pkt(id=0,off=0,r=14) R10=fp
147: (b7) r0 = 0
148: (bf) r1 = r9
149: (07) r1 += 18
150: (2d) if r1 > r5 goto pc+455
R0=imm0,min_value=0,max_value=0 R1=pkt(id=0,off=18,r=18) R3=imm0,min_value=0,max_value=0 R4=imm0,min_value=0,max_value=0 R5=pkt_end R6=imm112,min_value=112,max_value=112 R7=imm0,min_value=0,max_value=0 R8=ctx R9=pkt(id=0,off=0,r=18) R10=fp
151: (b7) r1 = 0
152: (7b) *(u64 *)(r10 -312) = r1
153: (b7) r6 = 144
154: (b7) r1 = 1
155: (7b) *(u64 *)(r10 -176) = r1
156: (69) r1 = *(u16 *)(r9 +14)
157: (bf) r3 = r1
158: (57) r3 &= 15
159: (7b) *(u64 *)(r10 -48) = r3
160: (77) r1 >>= 8
161: (7b) *(u64 *)(r10 -32) = r1
162: (71) r4 = *(u8 *)(r9 +14)
163: (77) r4 >>= 5
164: (69) r0 = *(u16 *)(r9 +16)
165: (bf) r1 = r0
166: (dc) (u32) r1 endian (u32) r0
167: (77) r1 >>= 56
168: (7b) *(u64 *)(r10 -56) = r1
169: (dc) (u32) r0 endian (u32) r0
170: (b7) r1 = 0
171: (7b) *(u64 *)(r10 -384) = r1
172: (b7) r1 = 0
173: (7b) *(u64 *)(r10 -184) = r1
174: (b7) r1 = 0
175: (7b) *(u64 *)(r10 -192) = r1
176: (b7) r1 = 0
177: (7b) *(u64 *)(r10 -200) = r1
178: (b7) r1 = 0
179: (7b) *(u64 *)(r10 -208) = r1
180: (b7) r1 = 0
181: (7b) *(u64 *)(r10 -216) = r1
182: (b7) r1 = 0
183: (7b) *(u64 *)(r10 -224) = r1
184: (b7) r1 = 0
185: (7b) *(u64 *)(r10 -232) = r1
186: (b7) r1 = 0
187: (7b) *(u64 *)(r10 -240) = r1
188: (b7) r1 = 0
189: (7b) *(u64 *)(r10 -248) = r1
190: (b7) r1 = 0
191: (7b) *(u64 *)(r10 -256) = r1
192: (b7) r1 = 0
193: (7b) *(u64 *)(r10 -264) = r1
194: (b7) r1 = 0
195: (7b) *(u64 *)(r10 -272) = r1
196: (b7) r1 = 0
197: (7b) *(u64 *)(r10 -280) = r1
198: (b7) r1 = 0
199: (7b) *(u64 *)(r10 -288) = r1
200: (b7) r1 = 0
201: (7b) *(u64 *)(r10 -296) = r1
202: (b7) r1 = 0
203: (7b) *(u64 *)(r10 -336) = r1
204: (b7) r1 = 0
205: (7b) *(u64 *)(r10 -304) = r1
206: (b7) r1 = 0
207: (7b) *(u64 *)(r10 -320) = r1
208: (b7) r1 = 0
209: (7b) *(u64 *)(r10 -328) = r1
210: (b7) r1 = 0
211: (7b) *(u64 *)(r10 -344) = r1
212: (b7) r1 = 0
213: (7b) *(u64 *)(r10 -352) = r1
214: (b7) r1 = 0
215: (7b) *(u64 *)(r10 -360) = r1
216: (b7) r1 = 0
217: (7b) *(u64 *)(r10 -368) = r1
218: (b7) r1 = 0
219: (7b) *(u64 *)(r10 -376) = r1
220: (b7) r1 = 0
221: (7b) *(u64 *)(r10 -392) = r1
222: (b7) r1 = 0
223: (7b) *(u64 *)(r10 -400) = r1
224: (b7) r1 = 0
225: (7b) *(u64 *)(r10 -408) = r1
226: (b7) r1 = 0
227: (7b) *(u64 *)(r10 -416) = r1
228: (b7) r1 = 0
229: (7b) *(u64 *)(r10 -424) = r1
230: (b7) r1 = 0
231: (7b) *(u64 *)(r10 -432) = r1
232: (b7) r1 = 0
233: (7b) *(u64 *)(r10 -440) = r1
234: (b7) r1 = 0
235: (7b) *(u64 *)(r10 -456) = r1
236: (b7) r1 = 0
237: (7b) *(u64 *)(r10 -448) = r1
238: (b7) r1 = 0
239: (7b) *(u64 *)(r10 -464) = r1
240: (b7) r1 = 0
241: (7b) *(u64 *)(r10 -472) = r1
242: (b7) r7 = 0
243: (b7) r1 = 0
244: (7b) *(u64 *)(r10 -480) = r1
245: (b7) r1 = 0
246: (7b) *(u64 *)(r10 -64) = r1
247: (b7) r1 = 0
248: (7b) *(u64 *)(r10 -488) = r1
249: (b7) r3 = 0
250: (7b) *(u64 *)(r10 -40) = r0
251: (55) if r0 != 0x86dd goto pc+150
R0=inv,min_value=34525,max_value=34525 R1=imm0,min_value=0,max_value=0 R3=imm0,min_value=0,max_value=0 R4=inv61 R5=pkt_end R6=imm144,min_value=144,max_value=144 R7=imm0,min_value=0,max_value=0 R8=ctx R9=pkt(id=0,off=0,r=18) R10=fp
252: (7b) *(u64 *)(r10 -496) = r4
253: (bf) r1 = r6
254: (07) r1 += 320
255: (77) r1 >>= 3
256: (bf) r3 = r9
257: (0f) r3 += r1
258: (b7) r0 = 0
259: (2d) if r3 > r5 goto pc+346
R0=imm0,min_value=0,max_value=0 R1=imm58,min_value=58,max_value=58 R3=pkt(id=0,off=58,r=58) R4=inv61 R5=pkt_end R6=imm144,min_value=144,max_value=144 R7=imm0,min_value=0,max_value=0 R8=ctx R9=pkt(id=0,off=0,r=58) R10=fp
260: (bf) r5 = r6
261: (47) r5 |= 12
262: (bf) r1 = r5
263: (07) r1 += 44
264: (77) r1 >>= 3
265: (7b) *(u64 *)(r10 -64) = r1
266: (bf) r7 = r5
267: (07) r7 += 36
268: (77) r7 >>= 3
269: (bf) r0 = r5
270: (07) r0 += 20
271: (77) r0 >>= 3
272: (bf) r1 = r5
273: (07) r1 += 52
274: (77) r1 >>= 3
275: (77) r6 >>= 3
276: (79) r2 = *(u64 *)(r10 -24)
277: (bf) r2 = r5
278: (77) r2 >>= 3
279: (7b) *(u64 *)(r10 -184) = r2
280: (07) r5 += 180
281: (77) r5 >>= 3
282: (bf) r4 = r9
283: (0f) r4 += r5
284: (47) r5 |= 1
285: (bf) r3 = r9
286: (0f) r3 += r6
287: (bf) r6 = r9
288: (0f) r6 += r1
289: (47) r1 |= 1
290: (bf) r2 = r9
291: (0f) r2 += r0
292: (7b) *(u64 *)(r10 -312) = r2
293: (bf) r2 = r9
294: (79) r0 = *(u64 *)(r10 -184)
295: (0f) r2 += r0
cannot add integer value with 0 upper zero bits to ptr_to_packet
FAILED: 0: (bf) r8 = r1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment