Skip to content

Instantly share code, notes, and snippets.

@williamtu
Last active April 14, 2017 18:41
Show Gist options
  • Save williamtu/759eedbefa335c7dbc5700acc0c43ee9 to your computer and use it in GitHub Desktop.
Save williamtu/759eedbefa335c7dbc5700acc0c43ee9 to your computer and use it in GitHub Desktop.
xdp9.c (max BPF stack > 512), see 595: r5 = *(u64 *)(r10 - 600)
diff --git a/tmp/xdp9.c b/tests/xdp9.c
index 0845fd5..9964d15 100644
--- a/tmp/xdp9.c
+++ b/tests/xdp9.c
@@ -1,4 +1,4 @@
-/* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 10:34:12 2017
+/* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 11:14:09 2017
*/
#include "xdp9.h"
#define KBUILD_MODNAME "xdptest"
@@ -116,7 +116,7 @@ struct bpf_map_def SEC("maps") ebpf_outTable = {
SEC("prog")
int ebpf_filter(struct xdp_md* skb){
- struct Headers hd = {
+ volatile struct Headers hd = {
.ethernet = {
.ebpf_valid = 0
},
//666: (07) r5 += 104
BPF program is too large. Processed 65537 insn
Error fetching program/map!
///
xdp9.o: file format ELF64-BPF
Disassembly of section prog:
ebpf_filter:
; int ebpf_filter(struct xdp_md* skb){
0: r6 = r1
1: r7 = 0
; volatile struct Headers hd = {
2: *(u8 *)(r10 - 4) = r7
3: *(u8 *)(r10 - 5) = r7
4: *(u8 *)(r10 - 6) = r7
5: *(u8 *)(r10 - 7) = r7
6: *(u8 *)(r10 - 8) = r7
7: *(u8 *)(r10 - 9) = r7
8: *(u8 *)(r10 - 10) = r7
9: *(u8 *)(r10 - 11) = r7
10: *(u8 *)(r10 - 12) = r7
11: *(u8 *)(r10 - 13) = r7
12: *(u8 *)(r10 - 14) = r7
13: *(u8 *)(r10 - 15) = r7
14: *(u16 *)(r10 - 20) = r7
15: *(u8 *)(r10 - 22) = r7
16: *(u8 *)(r10 - 23) = r7
17: *(u8 *)(r10 - 24) = r7
18: *(u8 *)(r10 - 25) = r7
19: *(u8 *)(r10 - 26) = r7
20: *(u8 *)(r10 - 27) = r7
21: *(u16 *)(r10 - 32) = r7
22: *(u16 *)(r10 - 34) = r7
23: *(u8 *)(r10 - 36) = r7
24: *(u8 *)(r10 - 37) = r7
25: *(u16 *)(r10 - 40) = r7
26: *(u8 *)(r10 - 44) = r7
27: *(u8 *)(r10 - 45) = r7
28: *(u16 *)(r10 - 48) = r7
29: *(u32 *)(r10 - 52) = r7
30: *(u32 *)(r10 - 56) = r7
31: *(u8 *)(r10 - 60) = r7
32: *(u8 *)(r10 - 62) = r7
33: *(u16 *)(r10 - 64) = r7
34: *(u16 *)(r10 - 68) = r7
35: *(u16 *)(r10 - 70) = r7
36: *(u32 *)(r10 - 76) = r7
37: *(u32 *)(r10 - 80) = r7
38: *(u8 *)(r10 - 84) = r7
39: *(u8 *)(r10 - 85) = r7
40: *(u8 *)(r10 - 86) = r7
41: *(u8 *)(r10 - 87) = r7
42: *(u16 *)(r10 - 92) = r7
43: *(u16 *)(r10 - 94) = r7
44: *(u16 *)(r10 - 96) = r7
45: *(u8 *)(r10 - 98) = r7
46: *(u8 *)(r10 - 99) = r7
47: *(u16 *)(r10 - 104) = r7
48: *(u16 *)(r10 - 106) = r7
49: *(u16 *)(r10 - 108) = r7
50: *(u16 *)(r10 - 110) = r7
51: *(u8 *)(r10 - 112) = r7
52: *(u8 *)(r10 - 113) = r7
53: *(u16 *)(r10 - 116) = r7
54: *(u16 *)(r10 - 120) = r7
55: *(u8 *)(r10 - 122) = r7
56: *(u8 *)(r10 - 123) = r7
; void* ebpf_packetEnd = ((void*)(long)skb->data_end);
57: r2 = *(u32 *)(r6 + 4)
; void* ebpf_packetStart = ((void*)(long)skb->data);
58: r1 = *(u32 *)(r6 + 0)
; u32 ebpf_zero = 0;
59: *(u32 *)(r10 - 128) = r7
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
60: r3 = r1
61: r3 += 14
62: if r3 > r2 goto 784
; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
63: r3 = *(u8 *)(r1 + 0)
64: *(u8 *)(r10 - 4) = r3
; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
65: r3 = *(u8 *)(r1 + 1)
66: *(u8 *)(r10 - 5) = r3
; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
67: r3 = *(u8 *)(r1 + 2)
68: *(u8 *)(r10 - 6) = r3
; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
69: r3 = *(u8 *)(r1 + 3)
70: *(u8 *)(r10 - 7) = r3
; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
71: r3 = *(u8 *)(r1 + 4)
72: *(u8 *)(r10 - 8) = r3
; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
73: r3 = *(u8 *)(r1 + 5)
74: *(u8 *)(r10 - 9) = r3
; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
75: r3 = *(u8 *)(r1 + 6)
76: *(u8 *)(r10 - 10) = r3
; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
77: r3 = *(u8 *)(r1 + 7)
78: *(u8 *)(r10 - 11) = r3
; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
79: r3 = *(u8 *)(r1 + 8)
80: *(u8 *)(r10 - 12) = r3
; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
81: r3 = *(u8 *)(r1 + 9)
82: *(u8 *)(r10 - 13) = r3
; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
83: r3 = *(u8 *)(r1 + 10)
84: *(u8 *)(r10 - 14) = r3
; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
85: r3 = *(u8 *)(r1 + 11)
86: *(u8 *)(r10 - 15) = r3
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
87: r3 = *(u16 *)(r1 + 12)
88: bswap16 r3
89: *(u16 *)(r10 - 20) = r3
90: r3 = 1
; hd.ethernet.ebpf_valid = 1;
91: *(u8 *)(r10 - 22) = r3
92: r8 = 14
; switch (hd.ethernet.protocol) {
93: r3 = *(u16 *)(r10 - 20)
94: if r3 != 2048 goto 114
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
95: r3 = r1
96: r3 += 34
97: if r3 > r2 goto 749
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
98: r3 = *(u8 *)(r1 + 14)
99: r3 >>= 4
100: *(u8 *)(r10 - 24) = r3
; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4));
101: r3 = *(u8 *)(r1 + 14)
102: r3 &= 15
103: *(u8 *)(r10 - 25) = r3
; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
104: r3 = *(u8 *)(r1 + 15)
105: *(u8 *)(r10 - 26) = r3
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
106: r3 = *(u16 *)(r1 + 16)
107: bswap16 r3
108: *(u16 *)(r10 - 32) = r3
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
109: r3 = *(u16 *)(r1 + 18)
110: bswap16 r3
111: *(u16 *)(r10 - 34) = r3
; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3));
112: r3 = *(u8 *)(r1 + 20)
113: r3 >>= 5
114: *(u8 *)(r10 - 36) = r3
; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13));
115: r3 = *(u16 *)(r1 + 20)
116: r4 = r3
117: r4 >>= 8
118: r3 <<= 8
119: r3 &= 7936
120: r3 |= r4
121: *(u16 *)(r10 - 40) = r3
; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
122: r3 = *(u8 *)(r1 + 22)
123: *(u8 *)(r10 - 44) = r3
; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
124: r3 = *(u8 *)(r1 + 23)
125: *(u8 *)(r10 - 45) = r3
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
126: r3 = *(u16 *)(r1 + 24)
127: bswap16 r3
128: *(u16 *)(r10 - 48) = r3
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
129: r3 = *(u32 *)(r1 + 26)
130: bswap32 r3
131: *(u32 *)(r10 - 52) = r3
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
132: r3 = *(u32 *)(r1 + 30)
133: bswap32 r3
134: *(u32 *)(r10 - 56) = r3
; hd.ipv4.ebpf_valid = 1;
135: r3 = 1
136: *(u8 *)(r10 - 60) = r3
; switch (hd.ipv4.protocol) {
137: r3 = *(u8 *)(r10 - 45)
138: if r3 == 17 goto 16
139: if r3 == 6 goto 34
140: r8 = 34
141: if r3 != 1 goto 67
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
142: r3 = r1
143: r3 += 38
144: if r3 > r2 goto 702
; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
145: r2 = *(u16 *)(r1 + 34)
146: bswap16 r2
147: *(u16 *)(r10 - 116) = r2
; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
148: r1 = *(u16 *)(r1 + 36)
149: bswap16 r1
150: *(u16 *)(r10 - 120) = r1
; hd.icmp.ebpf_valid = 1;
151: r1 = 1
152: *(u8 *)(r10 - 122) = r1
153: r8 = 38
154: goto 54
LBB0_10:
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
155: r3 = r1
156: r3 += 42
157: if r3 > r2 goto 689
; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
158: r2 = *(u16 *)(r1 + 34)
159: bswap16 r2
160: *(u16 *)(r10 - 104) = r2
; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
161: r2 = *(u16 *)(r1 + 36)
162: bswap16 r2
163: *(u16 *)(r10 - 106) = r2
; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
164: r2 = *(u16 *)(r1 + 38)
165: bswap16 r2
166: *(u16 *)(r10 - 108) = r2
; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
167: r1 = *(u16 *)(r1 + 40)
168: bswap16 r1
169: *(u16 *)(r10 - 110) = r1
; hd.udp.ebpf_valid = 1;
170: r1 = 1
171: *(u8 *)(r10 - 112) = r1
172: r8 = 42
173: goto 35
LBB0_8:
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
174: r3 = r1
175: r3 += 54
176: if r3 > r2 goto 670
; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
177: r2 = *(u16 *)(r1 + 34)
178: bswap16 r2
179: *(u16 *)(r10 - 68) = r2
; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
180: r2 = *(u16 *)(r1 + 36)
181: bswap16 r2
182: *(u16 *)(r10 - 70) = r2
; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
183: r2 = *(u32 *)(r1 + 38)
184: bswap32 r2
185: *(u32 *)(r10 - 76) = r2
; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
186: r2 = *(u32 *)(r1 + 42)
187: bswap32 r2
188: *(u32 *)(r10 - 80) = r2
; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
189: r2 = *(u8 *)(r1 + 46)
190: r3 = r2
191: r3 >>= 4
192: *(u8 *)(r10 - 84) = r3
; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4));
193: r2 &= 15
194: *(u8 *)(r10 - 85) = r2
; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
195: r2 = *(u8 *)(r1 + 47)
196: *(u8 *)(r10 - 86) = r2
; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
197: r2 = *(u16 *)(r1 + 48)
198: bswap16 r2
199: *(u16 *)(r10 - 92) = r2
; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
200: r2 = *(u16 *)(r1 + 50)
201: bswap16 r2
202: *(u16 *)(r10 - 94) = r2
; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
203: r1 = *(u16 *)(r1 + 52)
204: bswap16 r1
205: *(u16 *)(r10 - 96) = r1
; hd.tcp.ebpf_valid = 1;
206: r1 = 1
207: *(u8 *)(r10 - 98) = r1
208: r8 = 54
LBB0_12:
; key.field0 = hd.ethernet.protocol;
209: r1 = *(u16 *)(r10 - 20)
210: *(u16 *)(r10 - 136) = r1
211: r2 = r10
212: r2 += -136
; value = bpf_map_lookup_elem(&dstmactable, &key);
213: r1 = 0ll
215: call 1
; if (value == NULL) {
216: if r0 != 0 goto 6
217: r2 = r10
; u8 hit;
218: r2 += -128
; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero);
219: r1 = 0ll
221: call 1
; if (value != NULL) {
222: if r0 == 0 goto 624
LBB0_14:
223: r1 = 1
; switch (value->action) {
224: r2 = *(u32 *)(r0 + 0)
225: if r2 == 1 goto 56
226: if r2 != 0 goto 620
227: r1 = 4
; hd.ipv4.ttl = 4;
228: *(u8 *)(r10 - 44) = r1
; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv);
229: r2 = *(u8 *)(r10 - 24)
230: r2 <<= 4
231: r2 &= 240
232: r1 = *(u8 *)(r10 - 25)
233: r2 |= r1
234: r1 = *(u8 *)(r10 - 26)
235: r1 <<= 8
236: r2 |= r1
; checksum += htons(totalLen);
237: r1 = *(u16 *)(r10 - 32)
238: bswap16 r1
239: r1 += r2
; checksum += htons(identification);
240: r5 = *(u16 *)(r10 - 34)
; checksum += htons(((u16)flags << 13) | fragOffset);
241: r2 = *(u8 *)(r10 - 36)
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
242: r3 = *(u16 *)(r10 - 40)
; checksum += htons(((u16)ttl << 8) | (u16)protocol);
243: r0 = *(u8 *)(r10 - 44)
244: r4 = *(u8 *)(r10 - 45)
245: r4 <<= 8
246: r4 |= r0
; checksum += htons(identification);
247: bswap16 r5
248: r1 += r5
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
249: r5 = *(u32 *)(r10 - 52)
; checksum += (srcAddr >> 16) + (u16)srcAddr;
250: r0 = r5
251: r0 &= -65536
252: bswap32 r0
; checksum += htons(((u16)flags << 13) | fragOffset);
253: r1 += r0
; checksum += (srcAddr >> 16) + (u16)srcAddr;
254: bswap16 r5
; checksum += htons(((u16)ttl << 8) | (u16)protocol);
255: r1 += r5
; checksum += htons(((u16)flags << 13) | fragOffset);
256: r2 <<= 13
257: r2 |= r3
; checksum += (srcAddr >> 16) + (u16)srcAddr;
258: r1 += r4
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
259: r3 = *(u32 *)(r10 - 56)
; checksum += (dstAddr >> 16) + (u16)dstAddr;
260: r4 = r3
261: r4 &= -65536
262: bswap32 r4
; checksum += (srcAddr >> 16) + (u16)srcAddr;
263: r1 += r4
; checksum += (dstAddr >> 16) + (u16)dstAddr;
264: bswap16 r3
265: r1 += r3
; checksum += htons(((u16)flags << 13) | fragOffset);
266: bswap16 r2
; checksum += (dstAddr >> 16) + (u16)dstAddr;
267: r1 += r2
268: r2 = 4294901760ll
270: r3 = r1
271: r3 &= r2
; return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16)));
272: r3 >>= 16
273: r3 += r1
274: r3 ^= -1
275: r1 = r3
276: r1 <<= 8
277: r3 &= 65280
278: r3 >>= 8
279: r1 |= r3
; hd.ipv4.hdrChecksum = tmp_1;
280: *(u16 *)(r10 - 48) = r1
281: r1 = 2
LBB0_17:
282: r9 = 0
; xout.output_port = 0;
283: *(u32 *)(r10 - 132) = r9
; xout.output_action = tmp_2;
284: *(u32 *)(r10 - 136) = r1
; if (hd.ethernet.ebpf_valid) ebpf_outHeaderLength += 112;
285: r2 = *(u8 *)(r10 - 22)
286: r1 = 0
287: if r2 == r9 goto 1
288: r1 = 112
LBB0_19:
; if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160;
289: r2 = *(u8 *)(r10 - 60)
290: if r2 == r9 goto 1
291: r1 += 160
LBB0_21:
; if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160;
292: r2 = *(u8 *)(r10 - 98)
293: if r2 == r9 goto 1
294: r1 += 160
LBB0_23:
; if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64;
295: r2 = *(u8 *)(r10 - 112)
296: if r2 == r9 goto 1
297: r1 += 64
LBB0_25:
; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
298: r2 = *(u8 *)(r10 - 122)
299: if r2 == r9 goto 1
300: r1 += 32
LBB0_27:
301: r2 = 4294967288ll
303: r1 &= r2
; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength));
304: r1 >>= 3
305: r8 -= r1
306: r1 = r6
307: r2 = r8
308: call 44
; ebpf_packetEnd = ((void*)(long)skb->data_end);
309: r2 = *(u32 *)(r6 + 4)
; ebpf_packetStart = ((void*)(long)skb->data);
310: r1 = *(u32 *)(r6 + 0)
; if (hd.ethernet.ebpf_valid) {
311: r3 = *(u8 *)(r10 - 22)
312: if r3 == 0 goto 39
313: r7 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
314: r3 = r1
315: r3 += 14
316: if r3 > r2 goto 530
; ebpf_byte = ((char*)(&hd.ethernet.destination))[0];
317: r3 = *(u8 *)(r10 - 4)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
318: *(u8 *)(r1 + 0) = r3
; ebpf_byte = ((char*)(&hd.ethernet.destination))[1];
319: r3 = *(u8 *)(r10 - 5)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
320: *(u8 *)(r1 + 1) = r3
; ebpf_byte = ((char*)(&hd.ethernet.destination))[2];
321: r3 = *(u8 *)(r10 - 6)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
322: *(u8 *)(r1 + 2) = r3
; ebpf_byte = ((char*)(&hd.ethernet.destination))[3];
323: r3 = *(u8 *)(r10 - 7)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
324: *(u8 *)(r1 + 3) = r3
; ebpf_byte = ((char*)(&hd.ethernet.destination))[4];
325: r3 = *(u8 *)(r10 - 8)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
326: *(u8 *)(r1 + 4) = r3
; ebpf_byte = ((char*)(&hd.ethernet.destination))[5];
327: r3 = *(u8 *)(r10 - 9)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
328: *(u8 *)(r1 + 5) = r3
; ebpf_byte = ((char*)(&hd.ethernet.source))[0];
329: r3 = *(u8 *)(r10 - 10)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
330: *(u8 *)(r1 + 6) = r3
; ebpf_byte = ((char*)(&hd.ethernet.source))[1];
331: r3 = *(u8 *)(r10 - 11)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
332: *(u8 *)(r1 + 7) = r3
; ebpf_byte = ((char*)(&hd.ethernet.source))[2];
333: r3 = *(u8 *)(r10 - 12)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
334: *(u8 *)(r1 + 8) = r3
; ebpf_byte = ((char*)(&hd.ethernet.source))[3];
335: r3 = *(u8 *)(r10 - 13)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
336: *(u8 *)(r1 + 9) = r3
; ebpf_byte = ((char*)(&hd.ethernet.source))[4];
337: r3 = *(u8 *)(r10 - 14)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
338: *(u8 *)(r1 + 10) = r3
; ebpf_byte = ((char*)(&hd.ethernet.source))[5];
339: r3 = *(u8 *)(r10 - 15)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
340: *(u8 *)(r1 + 11) = r3
; hd.ethernet.protocol = htons(hd.ethernet.protocol);
341: r3 = *(u16 *)(r10 - 20)
342: r3 <<= 8
343: r4 = *(u16 *)(r10 - 20)
344: r4 >>= 8
345: r5 = r4
346: r5 |= r3
347: *(u16 *)(r10 - 20) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
348: *(u8 *)(r1 + 12) = r4
; ebpf_byte = ((char*)(&hd.ethernet.protocol))[1];
349: r3 = *(u8 *)(r10 - 19)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
350: *(u8 *)(r1 + 13) = r3
351: r9 = 112
LBB0_30:
; if (hd.ipv4.ebpf_valid) {
352: r3 = *(u8 *)(r10 - 60)
353: if r3 == 0 goto 192
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
354: r4 = r9
355: r4 += 160
356: r3 = 4294967288ll
358: r4 &= r3
359: r4 >>= 3
360: r5 = r1
361: r5 += r4
362: r7 = 0
363: if r5 > r2 goto 483
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
364: r4 = r9
365: r4 &= r3
366: r4 >>= 3
367: r5 = r1
368: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.version))[0];
369: r4 = *(u8 *)(r10 - 24)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
370: r4 <<= 4
371: *(u8 *)(r5 + 0) = r4
; ebpf_byte = ((char*)(&hd.ipv4.ihl))[0];
372: r0 = *(u8 *)(r10 - 25)
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
373: r0 &= 15
374: r0 |= r4
375: *(u8 *)(r5 + 0) = r0
; ebpf_packetOffsetInBits += 4;
376: r9 |= 4
; ebpf_packetOffsetInBits += 4;
377: r4 = r9
378: r4 += 4
379: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
380: r4 >>= 3
381: r5 = r1
382: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.diffserv))[0];
383: r4 = *(u8 *)(r10 - 26)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
384: *(u8 *)(r5 + 0) = r4
; hd.ipv4.totalLen = htons(hd.ipv4.totalLen);
385: r4 = *(u16 *)(r10 - 32)
386: r4 <<= 8
387: r5 = *(u16 *)(r10 - 32)
388: r5 >>= 8
389: r0 = r5
390: r0 |= r4
391: *(u16 *)(r10 - 32) = r0
; ebpf_packetOffsetInBits += 8;
392: r4 = r9
393: r4 += 12
394: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
395: r4 >>= 3
396: r0 = r1
397: r0 += r4
398: *(u8 *)(r0 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
399: r4 |= 1
400: r5 = r1
401: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.totalLen))[1];
402: r4 = *(u8 *)(r10 - 31)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
403: *(u8 *)(r5 + 0) = r4
; hd.ipv4.identification = htons(hd.ipv4.identification);
404: r4 = *(u16 *)(r10 - 34)
405: r4 <<= 8
406: r5 = *(u16 *)(r10 - 34)
407: r5 >>= 8
408: r0 = r5
409: r0 |= r4
410: *(u16 *)(r10 - 34) = r0
; ebpf_packetOffsetInBits += 16;
411: r4 = r9
412: r4 += 28
413: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
414: r4 >>= 3
415: r0 = r1
416: r0 += r4
417: *(u8 *)(r0 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
418: r4 |= 1
419: r5 = r1
420: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.identification))[1];
421: r4 = *(u8 *)(r10 - 33)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
422: *(u8 *)(r5 + 0) = r4
; ebpf_packetOffsetInBits += 16;
423: r4 = r9
424: r4 += 44
425: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5);
426: r4 >>= 3
427: r5 = r1
428: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.flags))[0];
429: r4 = *(u8 *)(r10 - 36)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5);
430: r4 <<= 5
431: *(u8 *)(r5 + 0) = r4
; ebpf_packetOffsetInBits += 3;
432: r4 = r9
433: r4 += 47
434: r4 &= r3
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3);
435: r4 >>= 3
436: r5 = r1
437: r5 += r4
438: r0 = *(u8 *)(r5 + 0)
439: r0 &= 248
; ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[0];
440: r6 = *(u8 *)(r10 - 40)
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3);
441: r6 >>= 2
442: r6 &= 7
443: r6 |= r0
444: *(u8 *)(r5 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
445: r4 |= 1
446: r5 = r1
447: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.fragOffset))[1];
448: r4 = *(u8 *)(r10 - 39)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
449: *(u8 *)(r5 + 0) = r4
; ebpf_packetOffsetInBits += 13;
450: r4 = r9
451: r4 += 60
452: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
453: r4 >>= 3
454: r5 = r1
455: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.ttl))[0];
456: r4 = *(u8 *)(r10 - 44)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
457: *(u8 *)(r5 + 0) = r4
; ebpf_packetOffsetInBits += 8;
458: r4 = r9
459: r4 += 68
460: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
461: r4 >>= 3
462: r5 = r1
463: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.protocol))[0];
464: r4 = *(u8 *)(r10 - 45)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
465: *(u8 *)(r5 + 0) = r4
; hd.ipv4.hdrChecksum = htons(hd.ipv4.hdrChecksum);
466: r4 = *(u16 *)(r10 - 48)
467: r4 <<= 8
468: r5 = *(u16 *)(r10 - 48)
469: r5 >>= 8
470: r0 = r5
471: r0 |= r4
472: *(u16 *)(r10 - 48) = r0
; ebpf_packetOffsetInBits += 8;
473: r4 = r9
474: r4 += 76
475: r4 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
476: r4 >>= 3
477: r0 = r1
478: r0 += r4
479: *(u8 *)(r0 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
480: r4 |= 1
481: r5 = r1
482: r5 += r4
; ebpf_byte = ((char*)(&hd.ipv4.hdrChecksum))[1];
483: r4 = *(u8 *)(r10 - 47)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
484: *(u8 *)(r5 + 0) = r4
; hd.ipv4.srcAddr = htonl(hd.ipv4.srcAddr);
485: r4 = *(u32 *)(r10 - 52)
486: r4 <<= 24
487: r5 = *(u32 *)(r10 - 52)
488: r5 <<= 8
489: r5 &= 16711680
490: r5 |= r4
491: r4 = *(u32 *)(r10 - 52)
492: r4 >>= 8
493: r4 &= 65280
494: r5 |= r4
495: r4 = *(u32 *)(r10 - 52)
496: r4 >>= 24
497: r5 |= r4
498: *(u32 *)(r10 - 52) = r5
; ebpf_packetOffsetInBits += 16;
499: r5 = r9
500: r5 += 92
501: r5 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
502: r5 >>= 3
503: r0 = r1
504: r0 += r5
505: *(u8 *)(r0 + 0) = r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
506: r5 |= 1
507: r4 = r1
508: r4 += r5
; ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[1];
509: r5 = *(u8 *)(r10 - 51)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
510: *(u8 *)(r4 + 0) = r5
; ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[2];
511: r4 = *(u8 *)(r10 - 50)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
512: *(u8 *)(r0 + 2) = r4
; ebpf_byte = ((char*)(&hd.ipv4.srcAddr))[3];
513: r4 = *(u8 *)(r10 - 49)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
514: *(u8 *)(r0 + 3) = r4
; ebpf_packetOffsetInBits += 32;
515: r5 = r9
516: r5 += 124
517: r5 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
518: r5 >>= 3
519: r3 = r1
520: r3 += r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
521: r5 |= 1
522: r4 = r1
523: r4 += r5
; hd.ipv4.dstAddr = htonl(hd.ipv4.dstAddr);
524: r5 = *(u32 *)(r10 - 56)
525: r5 <<= 24
526: r0 = *(u32 *)(r10 - 56)
527: r0 <<= 8
528: r0 &= 16711680
529: r0 |= r5
530: r5 = *(u32 *)(r10 - 56)
531: r5 >>= 8
532: r5 &= 65280
533: r0 |= r5
534: r5 = *(u32 *)(r10 - 56)
535: r5 >>= 24
536: r0 |= r5
537: *(u32 *)(r10 - 56) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
538: *(u8 *)(r3 + 0) = r5
; ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[1];
539: r5 = *(u8 *)(r10 - 55)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
540: *(u8 *)(r4 + 0) = r5
; ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[2];
541: r4 = *(u8 *)(r10 - 54)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
542: *(u8 *)(r3 + 2) = r4
; ebpf_byte = ((char*)(&hd.ipv4.dstAddr))[3];
543: r4 = *(u8 *)(r10 - 53)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
544: *(u8 *)(r3 + 3) = r4
; ebpf_packetOffsetInBits += 32;
545: r9 += 156
LBB0_33:
; if (hd.tcp.ebpf_valid) {
546: r3 = *(u8 *)(r10 - 98)
547: if r3 == 0 goto 173
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
548: r3 = r9
549: r3 += 160
550: r4 = 4294967288ll
552: r5 = r3
553: r5 &= r4
554: r5 >>= 3
555: r0 = r1
556: r0 += r5
557: r7 = 0
558: if r0 > r2 goto 288
; hd.tcp.srcPort = htons(hd.tcp.srcPort);
559: r5 = *(u16 *)(r10 - 68)
560: r5 <<= 8
561: r0 = *(u16 *)(r10 - 68)
562: r0 >>= 8
563: r6 = r0
564: r6 |= r5
565: *(u16 *)(r10 - 68) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
566: r5 = r9
567: r5 &= r4
568: r5 >>= 3
569: r6 = r1
570: r6 += r5
571: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.tcp.srcPort))[1];
572: r5 = *(u8 *)(r10 - 67)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
573: *(u8 *)(r6 + 1) = r5
; hd.tcp.dstPort = htons(hd.tcp.dstPort);
574: r5 = *(u16 *)(r10 - 70)
575: r5 <<= 8
576: r0 = *(u16 *)(r10 - 70)
577: r0 >>= 8
578: r6 = r0
579: r6 |= r5
580: *(u16 *)(r10 - 70) = r6
; ebpf_packetOffsetInBits += 16;
581: r5 = r9
582: r5 += 16
583: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
584: r5 >>= 3
585: r6 = r1
586: r6 += r5
587: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.tcp.dstPort))[1];
588: r5 = *(u8 *)(r10 - 69)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
589: *(u8 *)(r6 + 1) = r5
; hd.tcp.seqNo = htonl(hd.tcp.seqNo);
590: r5 = *(u32 *)(r10 - 76)
591: r5 <<= 24
592: r0 = *(u32 *)(r10 - 76)
593: r0 <<= 8
594: r0 &= 16711680
595: r0 |= r5
596: r5 = *(u32 *)(r10 - 76)
597: r5 >>= 8
598: r5 &= 65280
599: r0 |= r5
600: r5 = *(u32 *)(r10 - 76)
601: r5 >>= 24
602: r0 |= r5
603: *(u32 *)(r10 - 76) = r0
; ebpf_packetOffsetInBits += 16;
604: r0 = r9
605: r0 += 32
606: r0 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
607: r0 >>= 3
608: r6 = r1
609: r6 += r0
610: *(u8 *)(r6 + 0) = r5
; ebpf_byte = ((char*)(&hd.tcp.seqNo))[1];
611: r5 = *(u8 *)(r10 - 75)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
612: *(u8 *)(r6 + 1) = r5
; ebpf_byte = ((char*)(&hd.tcp.seqNo))[2];
613: r5 = *(u8 *)(r10 - 74)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
614: *(u8 *)(r6 + 2) = r5
; ebpf_byte = ((char*)(&hd.tcp.seqNo))[3];
615: r5 = *(u8 *)(r10 - 73)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
616: *(u8 *)(r6 + 3) = r5
; hd.tcp.ackNo = htonl(hd.tcp.ackNo);
617: r5 = *(u32 *)(r10 - 80)
618: r5 <<= 24
619: r0 = *(u32 *)(r10 - 80)
620: r0 <<= 8
621: r0 &= 16711680
622: r0 |= r5
623: r5 = *(u32 *)(r10 - 80)
624: r5 >>= 8
625: r5 &= 65280
626: r0 |= r5
627: r5 = *(u32 *)(r10 - 80)
628: r5 >>= 24
629: r0 |= r5
630: *(u32 *)(r10 - 80) = r0
; ebpf_packetOffsetInBits += 32;
631: r0 = r9
632: r0 += 64
633: r0 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
634: r0 >>= 3
635: r6 = r1
636: r6 += r0
637: *(u8 *)(r6 + 0) = r5
; ebpf_byte = ((char*)(&hd.tcp.ackNo))[1];
638: r5 = *(u8 *)(r10 - 79)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
639: *(u8 *)(r6 + 1) = r5
; ebpf_byte = ((char*)(&hd.tcp.ackNo))[2];
640: r5 = *(u8 *)(r10 - 78)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
641: *(u8 *)(r6 + 2) = r5
; ebpf_byte = ((char*)(&hd.tcp.ackNo))[3];
642: r5 = *(u8 *)(r10 - 77)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
643: *(u8 *)(r6 + 3) = r5
; ebpf_packetOffsetInBits += 32;
644: r5 = r9
645: r5 += 96
646: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
647: r5 >>= 3
648: r0 = r1
649: r0 += r5
; ebpf_byte = ((char*)(&hd.tcp.dataOffset))[0];
650: r5 = *(u8 *)(r10 - 84)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
651: r5 <<= 4
652: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 4;
653: r5 = r9
654: r5 += 100
655: r5 &= r4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
656: r5 >>= 3
657: r0 = r1
658: r0 += r5
659: r5 = *(u8 *)(r0 + 0)
660: r5 &= 240
; ebpf_byte = ((char*)(&hd.tcp.res))[0];
661: r6 = *(u8 *)(r10 - 85)
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
662: r6 &= 15
663: r5 |= r6
664: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 4;
665: r5 = r9
666: r5 += 104
667: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
668: r5 >>= 3
669: r0 = r1
670: r0 += r5
; ebpf_byte = ((char*)(&hd.tcp.flags))[0];
671: r5 = *(u8 *)(r10 - 86)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
672: *(u8 *)(r0 + 0) = r5
; hd.tcp.window = htons(hd.tcp.window);
673: r5 = *(u16 *)(r10 - 92)
674: r5 <<= 8
675: r0 = *(u16 *)(r10 - 92)
676: r0 >>= 8
677: r6 = r0
678: r6 |= r5
679: *(u16 *)(r10 - 92) = r6
; ebpf_packetOffsetInBits += 8;
680: r5 = r9
681: r5 += 112
682: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
683: r5 >>= 3
684: r6 = r1
685: r6 += r5
686: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.tcp.window))[1];
687: r5 = *(u8 *)(r10 - 91)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
688: *(u8 *)(r6 + 1) = r5
; hd.tcp.checksum = htons(hd.tcp.checksum);
689: r5 = *(u16 *)(r10 - 94)
690: r5 <<= 8
691: r0 = *(u16 *)(r10 - 94)
692: r0 >>= 8
693: r6 = r0
694: r6 |= r5
695: *(u16 *)(r10 - 94) = r6
; ebpf_packetOffsetInBits += 16;
696: r5 = r9
697: r5 += 128
698: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
699: r5 >>= 3
700: r6 = r1
701: r6 += r5
702: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.tcp.checksum))[1];
703: r5 = *(u8 *)(r10 - 93)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
704: *(u8 *)(r6 + 1) = r5
; ebpf_packetOffsetInBits += 16;
705: r9 += 144
706: r9 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
707: r9 >>= 3
708: r4 = r1
709: r4 += r9
; hd.tcp.urgentPtr = htons(hd.tcp.urgentPtr);
710: r5 = *(u16 *)(r10 - 96)
711: r5 <<= 8
712: r0 = *(u16 *)(r10 - 96)
713: r0 >>= 8
714: r6 = r0
715: r6 |= r5
716: *(u16 *)(r10 - 96) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
717: *(u8 *)(r4 + 0) = r0
; ebpf_byte = ((char*)(&hd.tcp.urgentPtr))[1];
718: r5 = *(u8 *)(r10 - 95)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
719: *(u8 *)(r4 + 1) = r5
720: r9 = r3
LBB0_36:
; if (hd.udp.ebpf_valid) {
721: r3 = *(u8 *)(r10 - 112)
722: if r3 == 0 goto 74
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
723: r3 = r9
724: r3 += 64
725: r4 = 4294967288ll
727: r5 = r3
728: r5 &= r4
729: r5 >>= 3
730: r0 = r1
731: r0 += r5
732: r7 = 0
733: if r0 > r2 goto 113
; hd.udp.srcPort = htons(hd.udp.srcPort);
734: r5 = *(u16 *)(r10 - 104)
735: r5 <<= 8
736: r0 = *(u16 *)(r10 - 104)
737: r0 >>= 8
738: r6 = r0
739: r6 |= r5
740: *(u16 *)(r10 - 104) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
741: r5 = r9
742: r5 &= r4
743: r5 >>= 3
744: r6 = r1
745: r6 += r5
746: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.udp.srcPort))[1];
747: r5 = *(u8 *)(r10 - 103)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
748: *(u8 *)(r6 + 1) = r5
; hd.udp.dstPort = htons(hd.udp.dstPort);
749: r5 = *(u16 *)(r10 - 106)
750: r5 <<= 8
751: r0 = *(u16 *)(r10 - 106)
752: r0 >>= 8
753: r6 = r0
754: r6 |= r5
755: *(u16 *)(r10 - 106) = r6
; ebpf_packetOffsetInBits += 16;
756: r5 = r9
757: r5 += 16
758: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
759: r5 >>= 3
760: r6 = r1
761: r6 += r5
762: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.udp.dstPort))[1];
763: r5 = *(u8 *)(r10 - 105)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
764: *(u8 *)(r6 + 1) = r5
; hd.udp.length_ = htons(hd.udp.length_);
765: r5 = *(u16 *)(r10 - 108)
766: r5 <<= 8
767: r0 = *(u16 *)(r10 - 108)
768: r0 >>= 8
769: r6 = r0
770: r6 |= r5
771: *(u16 *)(r10 - 108) = r6
; ebpf_packetOffsetInBits += 16;
772: r5 = r9
773: r5 += 32
774: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
775: r5 >>= 3
776: r6 = r1
777: r6 += r5
778: *(u8 *)(r6 + 0) = r0
; ebpf_byte = ((char*)(&hd.udp.length_))[1];
779: r5 = *(u8 *)(r10 - 107)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
780: *(u8 *)(r6 + 1) = r5
; ebpf_packetOffsetInBits += 16;
781: r9 += 48
782: r9 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
783: r9 >>= 3
784: r4 = r1
785: r4 += r9
; hd.udp.checksum = htons(hd.udp.checksum);
786: r5 = *(u16 *)(r10 - 110)
787: r5 <<= 8
788: r0 = *(u16 *)(r10 - 110)
789: r0 >>= 8
790: r6 = r0
791: r6 |= r5
792: *(u16 *)(r10 - 110) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
793: *(u8 *)(r4 + 0) = r0
; ebpf_byte = ((char*)(&hd.udp.checksum))[1];
794: r5 = *(u8 *)(r10 - 109)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
795: *(u8 *)(r4 + 1) = r5
796: r9 = r3
LBB0_39:
; if (hd.icmp.ebpf_valid) {
797: r3 = *(u8 *)(r10 - 122)
798: if r3 == 0 goto 39
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
799: r4 = r9
800: r4 += 32
801: r3 = 4294967288ll
803: r4 &= r3
804: r4 >>= 3
805: r5 = r1
806: r5 += r4
807: r7 = 0
808: if r5 > r2 goto 38
; hd.icmp.typeCode = htons(hd.icmp.typeCode);
809: r2 = *(u16 *)(r10 - 116)
810: r2 <<= 8
811: r4 = *(u16 *)(r10 - 116)
812: r4 >>= 8
813: r5 = r4
814: r5 |= r2
815: *(u16 *)(r10 - 116) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
816: r2 = r9
817: r2 &= r3
818: r2 >>= 3
819: r5 = r1
820: r5 += r2
821: *(u8 *)(r5 + 0) = r4
; ebpf_byte = ((char*)(&hd.icmp.typeCode))[1];
822: r2 = *(u8 *)(r10 - 115)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
823: *(u8 *)(r5 + 1) = r2
; ebpf_packetOffsetInBits += 16;
824: r9 += 16
825: r9 &= r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
826: r9 >>= 3
827: r1 += r9
; hd.icmp.hdrChecksum = htons(hd.icmp.hdrChecksum);
828: r2 = *(u16 *)(r10 - 120)
829: r2 <<= 8
830: r3 = *(u16 *)(r10 - 120)
831: r3 >>= 8
832: r4 = r3
833: r4 |= r2
834: *(u16 *)(r10 - 120) = r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
835: *(u8 *)(r1 + 0) = r3
; ebpf_byte = ((char*)(&hd.icmp.hdrChecksum))[1];
836: r2 = *(u8 *)(r10 - 119)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
837: *(u8 *)(r1 + 1) = r2
LBB0_42:
; xout.output_port = 0;
838: r3 = r10
839: r3 += -132
840: r2 = r10
841: r2 += -128
; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY);
842: r1 = 0ll
844: r4 = 0
845: call 2
; return xout.output_action;
846: r7 = *(u32 *)(r10 - 136)
LBB0_43:
; }
847: r0 = r7
848: exit
// MAX stack 384
// 782: r3 = *(u64 *)(r10 - 384)
diff --git a/tmp/xdp9.c b/tests/xdp9.c
index 0845fd5..9343145 100644
--- a/tmp/xdp9.c
+++ b/tests/xdp9.c
@@ -133,6 +133,7 @@ int ebpf_filter(struct xdp_md* skb){
.ebpf_valid = 0
},
};
+ struct Headers hd__;
unsigned ebpf_packetOffsetInBits = 0;
enum ebpf_errorCodes ebpf_errorCode = NoError;
void* ebpf_packetStart = ((void*)(long)skb->data);
@@ -362,14 +363,15 @@ int ebpf_filter(struct xdp_md* skb){
xout.output_action = tmp_2;
}
}
+ hd__ = hd;
/* 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.udp.ebpf_valid) ebpf_outHeaderLength += 64;
- if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
+ 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__.udp.ebpf_valid) ebpf_outHeaderLength += 64;
+ if (hd__.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
}
bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength));
ebpf_packetStart = ((void*)(long)skb->data);
@@ -377,236 +379,237 @@ int ebpf_filter(struct xdp_md* skb){
ebpf_packetOffsetInBits = 0;
u8 hit_0;
{
- /* packet.emit(hd.ethernet)*/
- if (hd.ethernet.ebpf_valid) {
+ /* 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.destination))[0];
+ 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];
+ 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];
+ 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];
+ 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];
+ 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];
+ ebpf_byte = ((char*)(&hd__.ethernet.destination))[5];
xdp9.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: r2 = *(u32 *)(r6 + 4)
; void* ebpf_packetStart = ((void*)(long)skb->data);
2: r1 = *(u32 *)(r6 + 0)
3: r8 = 0
; u32 ebpf_zero = 0;
4: *(u32 *)(r10 - 4) = r8
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
5: r3 = r1
6: r3 += 14
7: if r3 > r2 goto 790
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
8: r7 = *(u16 *)(r1 + 12)
9: r3 = 14
10: *(u64 *)(r10 - 80) = r3
11: r3 = 0
; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
12: *(u64 *)(r10 - 120) = r3
13: r3 = *(u8 *)(r1 + 11)
; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
14: *(u64 *)(r10 - 272) = r3
15: r3 = *(u8 *)(r1 + 10)
; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
16: *(u64 *)(r10 - 280) = r3
17: r3 = *(u8 *)(r1 + 9)
; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
18: *(u64 *)(r10 - 288) = r3
19: r3 = *(u8 *)(r1 + 8)
; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
20: *(u64 *)(r10 - 296) = r3
21: r3 = *(u8 *)(r1 + 7)
; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
22: *(u64 *)(r10 - 304) = r3
23: r3 = *(u8 *)(r1 + 6)
; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
24: *(u64 *)(r10 - 312) = r3
25: r3 = *(u8 *)(r1 + 5)
; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
26: *(u64 *)(r10 - 320) = r3
27: r3 = *(u8 *)(r1 + 4)
; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
28: *(u64 *)(r10 - 328) = r3
29: r3 = *(u8 *)(r1 + 3)
; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
30: *(u64 *)(r10 - 336) = r3
31: r3 = *(u8 *)(r1 + 2)
; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
32: *(u64 *)(r10 - 344) = r3
33: r3 = *(u8 *)(r1 + 1)
; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
34: *(u64 *)(r10 - 352) = r3
35: r3 = *(u8 *)(r1 + 0)
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
36: *(u64 *)(r10 - 360) = r3
37: r3 = r7
38: bswap16 r3
39: r4 = 0
40: *(u64 *)(r10 - 152) = r4
41: r4 = 0
42: *(u64 *)(r10 - 104) = r4
43: r4 = 0
44: *(u64 *)(r10 - 136) = r4
45: r4 = 0
46: *(u64 *)(r10 - 128) = r4
47: r4 = 0
48: *(u64 *)(r10 - 112) = r4
49: r4 = 0
50: *(u64 *)(r10 - 168) = r4
51: r4 = 0
52: *(u64 *)(r10 - 40) = r4
53: r4 = 0
54: *(u64 *)(r10 - 160) = r4
55: r4 = 0
56: *(u64 *)(r10 - 96) = r4
57: r4 = 0
58: *(u64 *)(r10 - 88) = r4
59: r4 = 0
60: *(u64 *)(r10 - 48) = r4
61: r4 = 0
62: *(u64 *)(r10 - 224) = r4
63: r4 = 0
64: *(u64 *)(r10 - 248) = r4
65: r4 = 0
66: *(u64 *)(r10 - 240) = r4
67: r4 = 0
68: *(u64 *)(r10 - 232) = r4
69: r4 = 0
70: *(u64 *)(r10 - 216) = r4
71: r4 = 0
72: *(u64 *)(r10 - 208) = r4
73: r4 = 0
74: *(u64 *)(r10 - 200) = r4
75: r4 = 0
76: *(u64 *)(r10 - 192) = r4
77: r4 = 0
78: *(u64 *)(r10 - 184) = r4
79: r4 = 0
80: *(u64 *)(r10 - 176) = r4
81: r4 = 0
82: *(u64 *)(r10 - 56) = r4
83: r4 = 0
84: *(u64 *)(r10 - 32) = r4
85: r4 = 0
86: *(u64 *)(r10 - 264) = r4
87: r4 = 0
88: *(u64 *)(r10 - 256) = r4
89: r0 = 0
90: r4 = 0
91: *(u64 *)(r10 - 64) = r4
92: r5 = 0
93: r4 = 0
94: r8 = 0
95: *(u64 *)(r10 - 72) = r8
96: r8 = 0
97: r9 = 0
; switch (hd.ethernet.protocol) {
98: *(u64 *)(r10 - 144) = r9
99: if r3 != 2048 goto 231
100: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
101: r3 = r1
102: r3 += 34
103: if r3 > r2 goto 694
; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
104: r3 = *(u8 *)(r1 + 22)
; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
105: *(u64 *)(r10 - 168) = r3
106: r3 = *(u8 *)(r1 + 15)
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
107: *(u64 *)(r10 - 104) = r3
108: r3 = *(u32 *)(r1 + 30)
109: bswap32 r3
110: *(u64 *)(r10 - 88) = r3
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
111: r3 = *(u32 *)(r1 + 26)
112: bswap32 r3
113: *(u64 *)(r10 - 96) = r3
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
114: r3 = *(u16 *)(r1 + 24)
115: bswap16 r3
116: *(u64 *)(r10 - 160) = r3
; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13));
117: r8 = *(u16 *)(r1 + 20)
118: r3 = r8
119: r3 &= 31
120: *(u64 *)(r10 - 144) = r3
121: r8 >>= 8
; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3));
122: r3 = *(u8 *)(r1 + 20)
123: r3 >>= 5
124: *(u64 *)(r10 - 112) = r3
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
125: r3 = *(u16 *)(r1 + 18)
126: bswap16 r3
127: *(u64 *)(r10 - 128) = r3
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
128: r3 = *(u16 *)(r1 + 16)
129: bswap16 r3
130: *(u64 *)(r10 - 136) = r3
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
131: r3 = *(u8 *)(r1 + 14)
; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4));
132: r4 = r3
133: r4 &= 15
134: *(u64 *)(r10 - 152) = r4
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
135: r3 >>= 4
136: *(u64 *)(r10 - 120) = r3
; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
137: r9 = *(u8 *)(r1 + 23)
; switch (hd.ipv4.protocol) {
138: if r9 == 17 goto 90
139: if r9 == 6 goto 135
140: r3 = 34
141: *(u64 *)(r10 - 80) = r3
142: r3 = 0
143: *(u64 *)(r10 - 224) = r3
144: r3 = 1
145: *(u64 *)(r10 - 48) = r3
146: r3 = 0
147: *(u64 *)(r10 - 248) = r3
148: r3 = 0
149: *(u64 *)(r10 - 240) = r3
150: r3 = 0
151: *(u64 *)(r10 - 232) = r3
152: r3 = 0
153: *(u64 *)(r10 - 216) = r3
154: r3 = 0
155: *(u64 *)(r10 - 208) = r3
156: r3 = 0
157: *(u64 *)(r10 - 200) = r3
158: r3 = 0
159: *(u64 *)(r10 - 192) = r3
160: r3 = 0
161: *(u64 *)(r10 - 184) = r3
162: r3 = 0
163: *(u64 *)(r10 - 176) = r3
164: r3 = 0
165: *(u64 *)(r10 - 56) = r3
166: r3 = 0
167: *(u64 *)(r10 - 32) = r3
168: r3 = 0
169: *(u64 *)(r10 - 264) = r3
170: r3 = 0
171: *(u64 *)(r10 - 256) = r3
172: r0 = 0
173: r3 = 0
174: *(u64 *)(r10 - 64) = r3
175: r5 = 0
176: r4 = 0
177: r3 = 0
178: *(u64 *)(r10 - 72) = r3
179: *(u64 *)(r10 - 40) = r9
180: if r9 != 1 goto 150
181: *(u64 *)(r10 - 368) = r8
182: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
183: r3 = r1
184: r3 += 38
185: if r3 > r2 goto 612
186: r2 = 38
187: *(u64 *)(r10 - 80) = r2
188: r2 = 0
189: *(u64 *)(r10 - 224) = r2
190: r2 = 1
; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
191: *(u64 *)(r10 - 40) = r2
192: r4 = *(u16 *)(r1 + 36)
193: bswap16 r4
; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
194: r5 = *(u16 *)(r1 + 34)
195: bswap16 r5
196: r1 = 1
197: *(u64 *)(r10 - 48) = r1
198: r1 = 0
199: *(u64 *)(r10 - 248) = r1
200: r1 = 0
201: *(u64 *)(r10 - 240) = r1
202: r1 = 0
203: *(u64 *)(r10 - 232) = r1
204: r1 = 0
205: *(u64 *)(r10 - 216) = r1
206: r1 = 0
207: *(u64 *)(r10 - 208) = r1
208: r1 = 0
209: *(u64 *)(r10 - 200) = r1
210: r1 = 0
211: *(u64 *)(r10 - 192) = r1
212: r1 = 0
213: *(u64 *)(r10 - 184) = r1
214: r1 = 0
215: *(u64 *)(r10 - 176) = r1
216: r1 = 0
217: *(u64 *)(r10 - 56) = r1
218: r1 = 0
219: *(u64 *)(r10 - 32) = r1
220: r1 = 0
221: *(u64 *)(r10 - 264) = r1
222: r1 = 0
223: *(u64 *)(r10 - 256) = r1
224: r0 = 0
225: r1 = 0
226: *(u64 *)(r10 - 64) = r1
227: r1 = 1
228: goto 100
LBB0_10:
229: *(u64 *)(r10 - 368) = r8
230: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
231: r3 = r1
232: r3 += 42
233: if r3 > r2 goto 564
234: r2 = 42
235: *(u64 *)(r10 - 80) = r2
236: r2 = 0
237: *(u64 *)(r10 - 224) = r2
238: r2 = 1
239: *(u64 *)(r10 - 48) = r2
240: r2 = 17
; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
241: *(u64 *)(r10 - 40) = r2
242: r0 = *(u16 *)(r1 + 40)
243: bswap16 r0
; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
244: r2 = *(u16 *)(r1 + 38)
245: bswap16 r2
246: *(u64 *)(r10 - 256) = r2
; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
247: r2 = *(u16 *)(r1 + 36)
248: bswap16 r2
249: *(u64 *)(r10 - 264) = r2
; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
250: r1 = *(u16 *)(r1 + 34)
251: bswap16 r1
252: *(u64 *)(r10 - 32) = r1
253: r1 = 0
254: *(u64 *)(r10 - 248) = r1
255: r1 = 0
256: *(u64 *)(r10 - 240) = r1
257: r1 = 0
258: *(u64 *)(r10 - 232) = r1
259: r1 = 0
260: *(u64 *)(r10 - 216) = r1
261: r1 = 0
262: *(u64 *)(r10 - 208) = r1
263: r1 = 0
264: *(u64 *)(r10 - 200) = r1
265: r1 = 0
266: *(u64 *)(r10 - 192) = r1
267: r1 = 0
268: *(u64 *)(r10 - 184) = r1
269: r1 = 0
270: *(u64 *)(r10 - 176) = r1
271: r1 = 0
272: *(u64 *)(r10 - 56) = r1
273: r1 = 1
274: goto 50
LBB0_8:
275: *(u64 *)(r10 - 368) = r8
276: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
277: r3 = r1
278: r3 += 54
279: if r3 > r2 goto 518
280: r2 = 54
281: *(u64 *)(r10 - 80) = r2
282: r2 = 0
283: *(u64 *)(r10 - 32) = r2
284: r2 = 1
285: *(u64 *)(r10 - 48) = r2
286: r2 = 6
; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
287: *(u64 *)(r10 - 40) = r2
288: r2 = *(u8 *)(r1 + 47)
; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
289: *(u64 *)(r10 - 200) = r2
290: r3 = *(u8 *)(r1 + 46)
; goto accept;
291: r2 = r3
292: r2 &= 240
293: *(u64 *)(r10 - 216) = r2
; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
294: r2 = *(u16 *)(r1 + 52)
295: bswap16 r2
296: *(u64 *)(r10 - 176) = r2
; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
297: r2 = *(u16 *)(r1 + 50)
298: bswap16 r2
299: *(u64 *)(r10 - 184) = r2
; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
300: r2 = *(u16 *)(r1 + 48)
301: bswap16 r2
302: *(u64 *)(r10 - 192) = r2
; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4));
303: r3 &= 15
304: *(u64 *)(r10 - 208) = r3
; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
305: r2 = *(u32 *)(r1 + 42)
306: bswap32 r2
307: *(u64 *)(r10 - 232) = r2
; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
308: r2 = *(u32 *)(r1 + 38)
309: bswap32 r2
310: *(u64 *)(r10 - 240) = r2
; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
311: r2 = *(u16 *)(r1 + 36)
312: bswap16 r2
313: *(u64 *)(r10 - 248) = r2
; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
314: r1 = *(u16 *)(r1 + 34)
315: bswap16 r1
316: *(u64 *)(r10 - 224) = r1
317: r1 = 1
318: *(u64 *)(r10 - 56) = r1
319: r1 = 0
320: *(u64 *)(r10 - 264) = r1
321: r1 = 0
322: *(u64 *)(r10 - 256) = r1
323: r0 = 0
324: r1 = 0
LBB0_12:
325: *(u64 *)(r10 - 64) = r1
326: r5 = 0
327: r4 = 0
328: r1 = 0
LBB0_13:
329: *(u64 *)(r10 - 72) = r1
330: r8 = *(u64 *)(r10 - 368)
LBB0_14:
331: *(u64 *)(r10 - 376) = r0
332: *(u64 *)(r10 - 392) = r5
333: *(u64 *)(r10 - 384) = r4
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
334: r1 = r7
335: r1 >>= 8
336: r2 = r7
337: r2 <<= 8
338: r2 |= r1
; key.field0 = hd.ethernet.protocol;
339: *(u16 *)(r10 - 24) = r2
340: r2 = r10
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
341: r2 += -24
; value = bpf_map_lookup_elem(&dstmactable, &key);
342: r1 = 0ll
344: call 1
345: r9 = *(u64 *)(r10 - 40)
; if (value == NULL) {
346: if r0 != 0 goto 6
347: r2 = r10
; u8 hit;
348: r2 += -4
; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero);
349: r1 = 0ll
351: call 1
; if (value != NULL) {
352: if r0 == 0 goto 444
LBB0_16:
353: r1 = 1
; switch (value->action) {
354: r2 = *(u32 *)(r0 + 0)
355: if r2 == 1 goto 62
356: if r2 != 0 goto 440
; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv);
357: r1 = *(u64 *)(r10 - 120)
358: r1 <<= 4
359: r2 = *(u64 *)(r10 - 152)
360: r1 |= r2
361: r1 &= 255
362: r2 = *(u64 *)(r10 - 104)
363: r2 &= 255
364: r2 <<= 8
365: r2 |= r1
; checksum += htons(totalLen);
366: r1 = *(u64 *)(r10 - 136)
367: bswap16 r1
368: r1 += r2
; checksum += htons(identification);
369: r2 = *(u64 *)(r10 - 128)
370: bswap16 r2
371: r1 += r2
; checksum += htons(((u16)ttl << 8) | (u16)protocol);
372: r2 = r9
373: r2 <<= 8
374: r2 |= 4
; checksum += htons(((u16)flags << 13) | fragOffset);
375: r1 += r2
376: r2 = 4294901760ll
378: r5 = *(u64 *)(r10 - 96)
; checksum += (srcAddr >> 16) + (u16)srcAddr;
379: r3 = r5
380: r3 &= r2
381: bswap32 r3
; checksum += htons(((u16)ttl << 8) | (u16)protocol);
382: r1 += r3
; checksum += htons(((u16)flags << 13) | fragOffset);
383: r3 = *(u64 *)(r10 - 112)
384: r3 <<= 5
385: r4 = *(u64 *)(r10 - 144)
386: r4 |= r3
; checksum += (srcAddr >> 16) + (u16)srcAddr;
387: r3 = r5
388: bswap16 r3
389: r1 += r3
390: r5 = *(u64 *)(r10 - 88)
; checksum += (dstAddr >> 16) + (u16)dstAddr;
391: r3 = r5
392: r3 &= r2
393: bswap32 r3
; checksum += (srcAddr >> 16) + (u16)srcAddr;
394: r1 += r3
; checksum += htons(((u16)flags << 13) | fragOffset);
395: r4 &= 255
396: r3 = r8
397: r3 <<= 8
398: r3 |= r4
; checksum += (dstAddr >> 16) + (u16)dstAddr;
399: r4 = r5
400: bswap16 r4
401: r1 += r4
402: r1 += r3
403: r3 = r1
404: r3 &= r2
; return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16)));
405: r3 >>= 16
406: r3 += r1
407: r3 ^= -1
408: r1 = r3
409: r1 &= 65280
410: r1 >>= 8
411: r3 &= 65535
412: r3 <<= 8
413: r3 |= r1
414: *(u64 *)(r10 - 160) = r3
415: r1 = 2
416: r2 = 4
; break;
417: *(u64 *)(r10 - 168) = r2
LBB0_19:
418: *(u64 *)(r10 - 368) = r8
419: r2 = *(u64 *)(r10 - 32)
420: *(u64 *)(r10 - 32) = r2
; if (hd__.ipv4.ebpf_valid) ebpf_outHeaderLength += 160;
421: r2 = 272
422: r8 = 0
423: r3 = *(u64 *)(r10 - 48)
424: if r3 != r8 goto 1
425: r2 = 112
LBB0_21:
; if (hd__.tcp.ebpf_valid) ebpf_outHeaderLength += 160;
426: r3 = r2
427: r3 += 160
428: r4 = *(u64 *)(r10 - 56)
429: if r4 != r8 goto 1
430: r3 = r2
LBB0_23:
; if (hd__.udp.ebpf_valid) ebpf_outHeaderLength += 64;
431: r4 = r3
432: r4 += 64
433: r2 = *(u64 *)(r10 - 64)
434: if r2 != r8 goto 1
435: r4 = r3
LBB0_25:
; if (hd__.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
436: r5 = r4
437: r5 += 32
438: r3 = *(u64 *)(r10 - 72)
439: if r3 != r8 goto 1
440: r5 = r4
LBB0_27:
; xout.output_port = 0;
441: *(u32 *)(r10 - 12) = r8
; xout.output_action = tmp_2;
442: *(u32 *)(r10 - 16) = r1
; if (hd__.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
443: r1 = 4294967288ll
445: r5 &= r1
; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength));
446: r5 >>= 3
447: r2 = *(u64 *)(r10 - 80)
448: r2 -= r5
449: r1 = r6
450: call 44
; ebpf_packetEnd = ((void*)(long)skb->data_end);
451: r2 = *(u32 *)(r6 + 4)
; ebpf_packetStart = ((void*)(long)skb->data);
452: r1 = *(u32 *)(r6 + 0)
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
453: r3 = r1
454: r3 += 14
455: if r3 > r2 goto 342
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
456: r3 = *(u64 *)(r10 - 360)
457: *(u8 *)(r1 + 0) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
458: r3 = *(u64 *)(r10 - 352)
459: *(u8 *)(r1 + 1) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
460: r3 = *(u64 *)(r10 - 344)
461: *(u8 *)(r1 + 2) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
462: r3 = *(u64 *)(r10 - 336)
463: *(u8 *)(r1 + 3) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
464: r3 = *(u64 *)(r10 - 328)
465: *(u8 *)(r1 + 4) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
466: r3 = *(u64 *)(r10 - 320)
467: *(u8 *)(r1 + 5) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
468: r3 = *(u64 *)(r10 - 312)
469: *(u8 *)(r1 + 6) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
470: r3 = *(u64 *)(r10 - 304)
471: *(u8 *)(r1 + 7) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
472: r3 = *(u64 *)(r10 - 296)
473: *(u8 *)(r1 + 8) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
474: r3 = *(u64 *)(r10 - 288)
475: *(u8 *)(r1 + 9) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
476: r3 = *(u64 *)(r10 - 280)
477: *(u8 *)(r1 + 10) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
478: r3 = *(u64 *)(r10 - 272)
479: *(u8 *)(r1 + 11) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
480: *(u8 *)(r1 + 12) = r7
; hd__.ethernet.protocol = htons(hd__.ethernet.protocol);
481: r7 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
482: *(u8 *)(r1 + 13) = r7
483: r3 = 112
; if (hd__.ipv4.ebpf_valid) {
484: r4 = *(u64 *)(r10 - 48)
485: if r4 == 0 goto 64
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
486: r3 = r1
487: r3 += 34
488: if r3 > r2 goto 309
489: r3 = *(u64 *)(r10 - 120)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
490: r3 <<= 4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
491: r4 = *(u64 *)(r10 - 152)
492: r3 |= r4
493: *(u8 *)(r1 + 14) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
494: r3 = *(u64 *)(r10 - 104)
495: *(u8 *)(r1 + 15) = r3
496: r4 = *(u64 *)(r10 - 136)
; hd__.ipv4.totalLen = htons(hd__.ipv4.totalLen);
497: r3 = r4
498: r3 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
499: *(u8 *)(r1 + 16) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
500: *(u8 *)(r1 + 17) = r4
501: r4 = *(u64 *)(r10 - 128)
; hd__.ipv4.identification = htons(hd__.ipv4.identification);
502: r3 = r4
503: r3 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
504: *(u8 *)(r1 + 18) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
505: *(u8 *)(r1 + 19) = r4
506: r3 = *(u64 *)(r10 - 112)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5);
507: r3 <<= 5
508: r4 = *(u64 *)(r10 - 368)
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3);
509: r4 >>= 2
510: r4 &= 7
511: r4 |= r3
512: *(u8 *)(r1 + 20) = r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
513: r3 = *(u64 *)(r10 - 144)
514: *(u8 *)(r1 + 21) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
515: r3 = *(u64 *)(r10 - 168)
516: *(u8 *)(r1 + 22) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
517: *(u8 *)(r1 + 23) = r9
518: r4 = *(u64 *)(r10 - 160)
; hd__.ipv4.hdrChecksum = htons(hd__.ipv4.hdrChecksum);
519: r3 = r4
520: r3 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
521: *(u8 *)(r1 + 24) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
522: *(u8 *)(r1 + 25) = r4
523: r5 = *(u64 *)(r10 - 96)
; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr);
524: r3 = r5
525: bswap32 r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
526: *(u8 *)(r1 + 26) = r3
; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr);
527: r3 = r5
528: bswap64 r3
529: r4 = r3
530: r4 >>= 40
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
531: *(u8 *)(r1 + 27) = r4
; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr);
532: bswap16 r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
533: *(u8 *)(r1 + 28) = r5
; hd__.ipv4.srcAddr = htonl(hd__.ipv4.srcAddr);
534: r3 >>= 56
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
535: *(u8 *)(r1 + 29) = r3
536: r5 = *(u64 *)(r10 - 88)
; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr);
537: r3 = r5
538: bswap32 r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
539: *(u8 *)(r1 + 30) = r3
; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr);
540: r3 = r5
541: bswap64 r3
542: r4 = r3
543: r4 >>= 40
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
544: *(u8 *)(r1 + 31) = r4
; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr);
545: bswap16 r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
546: *(u8 *)(r1 + 32) = r5
; hd__.ipv4.dstAddr = htonl(hd__.ipv4.dstAddr);
547: r3 >>= 56
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
548: *(u8 *)(r1 + 33) = r3
549: r3 = 272
LBB0_31:
; if (hd__.tcp.ebpf_valid) {
550: r4 = *(u64 *)(r10 - 56)
551: if r4 == 0 goto 150
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
552: r5 = r3
553: r5 += 160
554: r4 = 4294967288ll
556: r5 &= r4
557: r5 >>= 3
558: r0 = r1
559: r0 += r5
560: if r0 > r2 goto 237
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
561: r5 = r3
562: r5 &= r4
563: r5 >>= 3
564: r0 = r1
565: r0 += r5
566: r7 = *(u64 *)(r10 - 224)
; hd__.tcp.srcPort = htons(hd__.tcp.srcPort);
567: r6 = r7
568: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
569: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
570: r5 |= 1
571: r0 = r1
572: r0 += r5
573: *(u8 *)(r0 + 0) = r7
; ebpf_packetOffsetInBits += 16;
574: r5 = r3
575: r5 += 16
576: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
577: r5 >>= 3
578: r0 = r1
579: r0 += r5
580: r7 = *(u64 *)(r10 - 248)
; hd__.tcp.dstPort = htons(hd__.tcp.dstPort);
581: r6 = r7
582: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
583: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
584: r5 |= 1
585: r0 = r1
586: r0 += r5
587: *(u8 *)(r0 + 0) = r7
; ebpf_packetOffsetInBits += 16;
588: r5 = r3
589: r5 += 32
590: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
591: r5 >>= 3
592: r0 = r1
593: r0 += r5
594: r9 = *(u64 *)(r10 - 240)
; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo);
595: r6 = r9
596: bswap32 r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
597: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
598: r5 |= 1
599: r6 = r1
600: r6 += r5
; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo);
601: r5 = r9
602: bswap64 r5
603: r7 = r5
604: r7 >>= 40
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
605: *(u8 *)(r6 + 0) = r7
; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo);
606: bswap16 r9
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
607: *(u8 *)(r0 + 2) = r9
; hd__.tcp.seqNo = htonl(hd__.tcp.seqNo);
608: r5 >>= 56
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
609: *(u8 *)(r0 + 3) = r5
; ebpf_packetOffsetInBits += 32;
610: r5 = r3
611: r5 += 64
612: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
613: r5 >>= 3
614: r0 = r1
615: r0 += r5
616: r9 = *(u64 *)(r10 - 232)
; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo);
617: r6 = r9
618: bswap32 r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
619: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
620: r5 |= 1
621: r6 = r1
622: r6 += r5
; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo);
623: r5 = r9
624: bswap64 r5
625: r7 = r5
626: r7 >>= 40
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
627: *(u8 *)(r6 + 0) = r7
; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo);
628: bswap16 r9
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
629: *(u8 *)(r0 + 2) = r9
; hd__.tcp.ackNo = htonl(hd__.tcp.ackNo);
630: r5 >>= 56
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
631: *(u8 *)(r0 + 3) = r5
; ebpf_packetOffsetInBits += 32;
632: r5 = r3
633: r5 += 96
634: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
635: r5 >>= 3
636: r0 = r1
637: r0 += r5
638: r5 = *(u64 *)(r10 - 216)
639: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 4;
640: r5 = r3
641: r5 += 100
642: r5 &= r4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
643: r5 >>= 3
644: r0 = r1
645: r0 += r5
646: r5 = *(u8 *)(r0 + 0)
647: r5 &= 240
648: r6 = *(u64 *)(r10 - 208)
649: r5 |= r6
650: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 4;
651: r5 = r3
652: r5 += 104
653: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
654: r5 >>= 3
655: r0 = r1
656: r0 += r5
657: r5 = *(u64 *)(r10 - 200)
658: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 8;
659: r5 = r3
660: r5 += 112
661: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
662: r5 >>= 3
663: r0 = r1
664: r0 += r5
665: r7 = *(u64 *)(r10 - 192)
; hd__.tcp.window = htons(hd__.tcp.window);
666: r6 = r7
667: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
668: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
669: r5 |= 1
670: r0 = r1
671: r0 += r5
672: *(u8 *)(r0 + 0) = r7
; ebpf_packetOffsetInBits += 16;
673: r3 |= 128
674: r5 = r3
675: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
676: r5 >>= 3
677: r0 = r1
678: r0 += r5
679: r7 = *(u64 *)(r10 - 184)
; hd__.tcp.checksum = htons(hd__.tcp.checksum);
680: r6 = r7
681: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
682: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
683: r5 |= 1
684: r0 = r1
685: r0 += r5
686: *(u8 *)(r0 + 0) = r7
; ebpf_packetOffsetInBits += 16;
687: r5 = r3
688: r5 += 16
689: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
690: r5 >>= 3
691: r4 = r1
692: r4 += r5
693: r6 = *(u64 *)(r10 - 176)
; hd__.tcp.urgentPtr = htons(hd__.tcp.urgentPtr);
694: r0 = r6
695: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
696: *(u8 *)(r4 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
697: r5 |= 1
698: r4 = r1
699: r4 += r5
700: *(u8 *)(r4 + 0) = r6
; ebpf_packetOffsetInBits += 16;
701: r3 += 32
LBB0_34:
; if (hd__.udp.ebpf_valid) {
702: r4 = *(u64 *)(r10 - 64)
703: if r4 == 0 goto 53
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
704: r4 = r3
705: r4 += 64
706: r5 = 4294967288ll
708: r0 = r4
709: r0 &= r5
710: r0 >>= 3
711: r6 = r1
712: r6 += r0
713: if r6 > r2 goto 84
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
714: r0 = r3
715: r0 &= r5
716: r0 >>= 3
717: r6 = r1
718: r6 += r0
719: r7 = *(u64 *)(r10 - 32)
; hd__.udp.srcPort = htons(hd__.udp.srcPort);
720: r0 = r7
721: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
722: *(u8 *)(r6 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
723: *(u8 *)(r6 + 1) = r7
; ebpf_packetOffsetInBits += 16;
724: r0 = r3
725: r0 += 16
726: r0 &= r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
727: r0 >>= 3
728: r6 = r1
729: r6 += r0
730: r7 = *(u64 *)(r10 - 264)
; hd__.udp.dstPort = htons(hd__.udp.dstPort);
731: r0 = r7
732: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
733: *(u8 *)(r6 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
734: *(u8 *)(r6 + 1) = r7
; ebpf_packetOffsetInBits += 16;
735: r0 = r3
736: r0 += 32
737: r0 &= r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
738: r0 >>= 3
739: r6 = r1
740: r6 += r0
741: r7 = *(u64 *)(r10 - 256)
; hd__.udp.length_ = htons(hd__.udp.length_);
742: r0 = r7
743: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
744: *(u8 *)(r6 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
745: *(u8 *)(r6 + 1) = r7
; ebpf_packetOffsetInBits += 16;
746: r3 += 48
747: r3 &= r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
748: r3 >>= 3
749: r5 = r1
750: r5 += r3
751: r0 = *(u64 *)(r10 - 376)
; hd__.udp.checksum = htons(hd__.udp.checksum);
752: r3 = r0
753: r3 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
754: *(u8 *)(r5 + 0) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
755: *(u8 *)(r5 + 1) = r0
756: r3 = r4
LBB0_37:
; if (hd__.icmp.ebpf_valid) {
757: r4 = *(u64 *)(r10 - 72)
758: if r4 == 0 goto 28
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
759: r5 = r3
760: r5 += 32
761: r4 = 4294967288ll
763: r5 &= r4
764: r5 >>= 3
765: r0 = r1
766: r0 += r5
767: if r0 > r2 goto 30
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
768: r2 = r3
769: r2 &= r4
770: r2 >>= 3
771: r5 = r1
772: r5 += r2
773: r0 = *(u64 *)(r10 - 392)
; hd__.icmp.typeCode = htons(hd__.icmp.typeCode);
774: r2 = r0
775: r2 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
776: *(u8 *)(r5 + 0) = r2
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
777: *(u8 *)(r5 + 1) = r0
; ebpf_packetOffsetInBits += 16;
778: r3 += 16
779: r3 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
780: r3 >>= 3
781: r1 += r3
782: r3 = *(u64 *)(r10 - 384)
; hd__.icmp.hdrChecksum = htons(hd__.icmp.hdrChecksum);
783: r2 = r3
784: r2 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
785: *(u8 *)(r1 + 0) = r2
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
786: *(u8 *)(r1 + 1) = r3
LBB0_40:
; xout.output_port = 0;
787: r3 = r10
788: r3 += -12
789: r2 = r10
790: r2 += -4
; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY);
791: r1 = 0ll
793: r4 = 0
794: call 2
; return xout.output_action;
795: r8 = *(u32 *)(r10 - 16)
796: goto 1
LBB0_42:
797: r8 = 0
LBB0_41:
; }
798: r0 = r8
799: exit
// use map instead of local variable.
@@ -114,25 +114,18 @@ struct bpf_map_def SEC("maps") ebpf_outTable = {
.max_entries = 1 /* No multicast support */
};
+
+struct bpf_map_def SEC("maps") Headers = {
+ .type = BPF_MAP_TYPE_PERCPU_ARRAY,
+ .key_size = sizeof(u32),
+ .value_size = sizeof(struct Headers),
+ .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
- },
- };
+ struct Headers hd_zero, *hd;
unsigned ebpf_packetOffsetInBits = 0;
enum ebpf_errorCodes ebpf_errorCode = NoError;
void* ebpf_packetStart = ((void*)(long)skb->data);
@@ -144,84 +137,90 @@ int ebpf_filter(struct xdp_md* skb){
/* TODO: this should be initialized by the environment. HOW? */
struct xdp_input xin;
+ __builtin_memset(&hd_zero, 0, sizeof(hd_zero));
+ bpf_map_update_elem(&Headers, &ebpf_zero, &hd_zero, BPF_ANY);
+ hd = bpf_map_lookup_elem(&Headers, &ebpf_zero);
+ if (!hd)
+ return XDP_ABORTED;
+
goto start;
start: {
- /* extract(hd.ethernet)*/
+ /* extract(hd->ethernet)*/
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
ebpf_errorCode = PacketTooShort;
goto reject;
}
- 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));
+ hd->ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0):
/* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 10:34:12 2017
*/
#include "xdp9.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);
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,
};
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)));
}
inline u16 csum16_add(u16 csum, u16 addend) {
u16 res = csum;
res += addend;
return (res + (res < addend));
}
inline u16 csum16_sub(u16 csum, u16 addend) {
return csum16_add(csum, ~addend);
}
inline u16 csum_replace2(u16 csum, u16 old, u16 new) {
return (~csum16_add(csum16_sub(~csum, old), new));
}
inline u16 csum_fold(u32 csum) {
u32 r = csum << 16 | csum >> 16;
csum = ~csum;
csum -= r;
return (u16)(csum >> 16);
}
inline u32 csum_unfold(u16 csum) {
return (u32)csum;
}
inline u32 csum32_add(u32 csum, u32 addend) {
u32 res = csum;
res += addend;
return (res + (res < addend));
}
inline u32 csum32_sub(u32 csum, u32 addend) {
return csum32_add(csum, ~addend);
}
inline u16 csum_replace4(u16 csum, u32 from, u32 to) {
u32 tmp = csum32_sub(~csum_unfold(csum), from);
return csum_fold(csum32_add(tmp, to));
}
struct bpf_map_def SEC("maps") perf_event = {
.type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
.key_size = sizeof(u32),
.value_size = sizeof(u32),
.pinning = 2,
.max_entries = 2,
};
#define BPF_PERF_EVENT_OUTPUT() do {\
int pktsize = (int)(skb->data_end - skb->data);\
bpf_perf_event_output(skb, &perf_event, ((u64)pktsize << 32), &pktsize, 4);\
} while(0);
#define BPF_KTIME_GET_NS() ({\
u32 ___ts = (u32)bpf_ktime_get_ns(); ___ts; })\
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.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.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.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;
u16 tmp_1;
enum xdp_action tmp_2;
{
/* 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;
tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
hd.ipv4.hdrChecksum = tmp_1;
xoutdrop = false;
}
break;
case Drop_action:
{
xoutdrop = true;
}
break;
default: return XDP_ABORTED;
}
}
else return XDP_ABORTED;
}
;
xout.output_port = 0;
if (xoutdrop)
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.ipv4.ebpf_valid) ebpf_outHeaderLength += 160;
if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160;
if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64;
if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
}
bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(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.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;
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;
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;
return XDP_ABORTED;
}
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;
return XDP_ABORTED;
}
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.udp)*/
if (hd.udp.ebpf_valid) {
if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
ebpf_errorCode = PacketTooShort;
return XDP_ABORTED;
}
hd.udp.srcPort = htons(hd.udp.srcPort);
ebpf_byte = ((char*)(&hd.udp.srcPort))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.udp.srcPort))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 16;
hd.udp.dstPort = htons(hd.udp.dstPort);
ebpf_byte = ((char*)(&hd.udp.dstPort))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.udp.dstPort))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 16;
hd.udp.length_ = htons(hd.udp.length_);
ebpf_byte = ((char*)(&hd.udp.length_))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.udp.length_))[1];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
ebpf_packetOffsetInBits += 16;
hd.udp.checksum = htons(hd.udp.checksum);
ebpf_byte = ((char*)(&hd.udp.checksum))[0];
write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
ebpf_byte = ((char*)(&hd.udp.checksum))[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;
return XDP_ABORTED;
}
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);
return xout.output_action;
}
char _license[] SEC("license") = "GPL";
/* Automatically generated by p4c-xdp from xdp9.p4 on Fri Apr 14 11:14:09 2017
*/
#ifndef _P4_GEN_HEADER_
#define _P4_GEN_HEADER_
#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)
#define MAP_PATH "/sys/fs/bpf/xdp/globals"
struct xdp_input {
u32 input_port; /* bit<32> */
};
struct xdp_output {
enum xdp_action output_action; /* xdp_action */
u32 output_port; /* bit<32> */
};
struct Ethernet {
u8 destination[6]; /* bit<48> */
u8 source[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; /* hd.ethernet.protocol */
};
enum dstmactable_actions {
Fallback_action,
Drop_action,
};
struct dstmactable_value {
enum dstmactable_actions action;
union {
struct {
} Fallback_action;
struct {
} Drop_action;
} u;
};
#if CONTROL_PLANE
void initialize_tables()
{
u32 ebpf_zero = 0;
{
int tableFileDescriptor = bpf_obj_get(MAP_PATH "/dstmactable_defaultAction");
if (tableFileDescriptor < 0) { fprintf(stderr, "map dstmactable_defaultAction not loaded"); exit(1); }
struct dstmactable_value value = {
.action = Fallback_action,
};
int ok = bpf_update_elem(tableFileDescriptor, &ebpf_zero, &value, BPF_ANY);
if (ok != 0) { perror("Could not write in dstmactable_defaultAction"); exit(1); }
}
}
#endif
#endif
xdp9.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: r8 = 0
; u32 ebpf_zero = 0;
4: *(u32 *)(r10 - 4) = r8
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
5: r1 = r2
6: r1 += 14
7: if r1 > r3 goto 1048
8: r1 = 14
9: *(u64 *)(r10 - 72) = r1
10: r8 = 0
; hd.ethernet.source[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
11: r1 = *(u8 *)(r2 + 11)
; hd.ethernet.source[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
12: *(u64 *)(r10 - 480) = r1
13: r1 = *(u8 *)(r2 + 10)
; hd.ethernet.source[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
14: *(u64 *)(r10 - 488) = r1
15: r1 = *(u8 *)(r2 + 9)
; hd.ethernet.source[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
16: *(u64 *)(r10 - 496) = r1
17: r1 = *(u8 *)(r2 + 8)
; hd.ethernet.source[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
18: *(u64 *)(r10 - 504) = r1
19: r1 = *(u8 *)(r2 + 7)
; hd.ethernet.source[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
20: *(u64 *)(r10 - 512) = r1
21: r1 = *(u8 *)(r2 + 6)
; hd.ethernet.destination[5] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5) >> 0));
22: *(u64 *)(r10 - 520) = r1
23: r1 = *(u8 *)(r2 + 5)
; hd.ethernet.destination[4] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4) >> 0));
24: *(u64 *)(r10 - 536) = r1
25: r1 = *(u8 *)(r2 + 4)
; hd.ethernet.destination[3] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3) >> 0));
26: *(u64 *)(r10 - 544) = r1
27: r1 = *(u8 *)(r2 + 3)
; hd.ethernet.destination[2] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2) >> 0));
28: *(u64 *)(r10 - 552) = r1
29: r1 = *(u8 *)(r2 + 2)
; hd.ethernet.destination[1] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1) >> 0));
30: *(u64 *)(r10 - 560) = r1
31: r1 = *(u8 *)(r2 + 1)
; hd.ethernet.destination[0] = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0) >> 0));
32: *(u64 *)(r10 - 568) = r1
33: r1 = *(u8 *)(r2 + 0)
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
34: *(u64 *)(r10 - 576) = r1
35: r1 = *(u16 *)(r2 + 12)
36: r4 = r1
37: r4 >>= 8
38: *(u64 *)(r10 - 528) = r1
; switch (hd.ethernet.protocol) {
39: r1 <<= 8
40: *(u64 *)(r10 - 584) = r4
41: r1 |= r4
42: r4 = r1
43: r4 &= 65535
44: r5 = 0
45: *(u64 *)(r10 - 88) = r5
46: r5 = 0
47: *(u64 *)(r10 - 96) = r5
48: r0 = 0
49: r5 = 0
50: r7 = 0
51: *(u64 *)(r10 - 80) = r7
52: r7 = 0
53: *(u64 *)(r10 - 216) = r7
54: r7 = 0
55: *(u64 *)(r10 - 352) = r7
56: r7 = 0
57: *(u64 *)(r10 - 336) = r7
58: r7 = 0
59: *(u64 *)(r10 - 344) = r7
60: r7 = 0
61: *(u64 *)(r10 - 304) = r7
62: r7 = 0
63: *(u64 *)(r10 - 312) = r7
64: r7 = 0
65: *(u64 *)(r10 - 320) = r7
66: r7 = 0
67: *(u64 *)(r10 - 328) = r7
68: r7 = 0
69: *(u64 *)(r10 - 272) = r7
70: r7 = 0
71: *(u64 *)(r10 - 280) = r7
72: r7 = 0
73: *(u64 *)(r10 - 288) = r7
74: r7 = 0
75: *(u64 *)(r10 - 296) = r7
76: r7 = 0
77: *(u64 *)(r10 - 256) = r7
78: r7 = 0
79: *(u64 *)(r10 - 264) = r7
80: r7 = 0
81: *(u64 *)(r10 - 240) = r7
82: r7 = 0
83: *(u64 *)(r10 - 248) = r7
84: r7 = 0
85: *(u64 *)(r10 - 224) = r7
86: r7 = 0
87: *(u64 *)(r10 - 232) = r7
88: r7 = 0
89: *(u64 *)(r10 - 384) = r7
90: r7 = 0
91: *(u64 *)(r10 - 440) = r7
92: r7 = 0
93: *(u64 *)(r10 - 424) = r7
94: r7 = 0
95: *(u64 *)(r10 - 432) = r7
96: r7 = 0
97: *(u64 *)(r10 - 408) = r7
98: r7 = 0
99: *(u64 *)(r10 - 416) = r7
100: r7 = 0
101: *(u64 *)(r10 - 392) = r7
102: r7 = 0
103: *(u64 *)(r10 - 400) = r7
104: r7 = 0
105: *(u64 *)(r10 - 464) = r7
106: r7 = 0
107: *(u64 *)(r10 - 472) = r7
108: r7 = 0
109: *(u64 *)(r10 - 448) = r7
110: r7 = 0
111: *(u64 *)(r10 - 456) = r7
112: r7 = 0
113: *(u64 *)(r10 - 104) = r7
114: r7 = 0
115: *(u64 *)(r10 - 64) = r7
116: r7 = 0
117: *(u64 *)(r10 - 144) = r7
118: r7 = 0
119: *(u64 *)(r10 - 56) = r7
120: r7 = 0
121: r9 = 0
122: *(u64 *)(r10 - 48) = r9
123: r9 = 0
124: *(u64 *)(r10 - 208) = r9
125: r9 = 0
126: *(u64 *)(r10 - 360) = r9
127: r9 = 0
128: *(u64 *)(r10 - 368) = r9
129: r9 = 0
130: *(u64 *)(r10 - 376) = r9
131: r9 = 0
132: *(u64 *)(r10 - 40) = r9
133: r9 = 0
134: *(u64 *)(r10 - 32) = r9
135: r9 = 0
136: *(u64 *)(r10 - 200) = r9
137: r9 = 0
138: *(u64 *)(r10 - 120) = r9
139: r9 = 0
140: *(u64 *)(r10 - 136) = r9
141: r9 = 0
142: *(u64 *)(r10 - 128) = r9
143: r9 = 0
144: *(u64 *)(r10 - 112) = r9
145: r9 = 0
146: *(u64 *)(r10 - 192) = r9
147: r9 = 0
148: *(u64 *)(r10 - 184) = r9
149: r9 = 0
150: *(u64 *)(r10 - 160) = r9
151: r9 = 0
152: *(u64 *)(r10 - 152) = r9
153: r9 = 0
154: *(u64 *)(r10 - 176) = r9
155: r9 = 0
156: *(u64 *)(r10 - 168) = r9
157: if r4 != 2048 goto 439
158: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
159: r4 = r2
160: r4 += 34
161: if r4 > r3 goto 894
; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
162: r4 = *(u8 *)(r2 + 22)
; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
163: *(u64 *)(r10 - 200) = r4
164: r4 = *(u8 *)(r2 + 15)
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
165: *(u64 *)(r10 - 112) = r4
166: r5 = *(u32 *)(r2 + 30)
167: r0 = r5
168: bswap16 r0
169: r4 = r5
170: bswap32 r4
171: *(u64 *)(r10 - 80) = r4
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
172: r8 = *(u32 *)(r2 + 26)
173: r4 = r8
174: bswap16 r4
175: *(u64 *)(r10 - 104) = r4
176: r4 = r8
177: bswap32 r4
178: *(u64 *)(r10 - 88) = r4
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
179: r7 = *(u16 *)(r2 + 24)
180: *(u64 *)(r10 - 208) = r7
181: r7 >>= 8
; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13));
182: r4 = *(u16 *)(r2 + 20)
183: r9 = r4
184: r9 &= 31
185: *(u64 *)(r10 - 128) = r9
186: r4 >>= 8
187: *(u64 *)(r10 - 120) = r4
; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3));
188: r4 = *(u8 *)(r2 + 20)
189: r4 >>= 5
190: *(u64 *)(r10 - 136) = r4
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
191: r9 = *(u16 *)(r2 + 18)
192: *(u64 *)(r10 - 152) = r9
193: r9 >>= 8
194: *(u64 *)(r10 - 160) = r9
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
195: r9 = *(u16 *)(r2 + 16)
196: *(u64 *)(r10 - 168) = r9
197: r9 >>= 8
198: *(u64 *)(r10 - 176) = r9
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
199: r4 = *(u8 *)(r2 + 14)
; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4));
200: r9 = r4
201: r9 &= 15
202: *(u64 *)(r10 - 192) = r9
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
203: r4 >>= 4
204: *(u64 *)(r10 - 184) = r4
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
205: bswap64 r5
206: r4 = r5
207: r4 >>= 56
208: *(u64 *)(r10 - 96) = r4
209: r5 >>= 40
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
210: bswap64 r8
211: r4 = r8
212: r4 >>= 56
213: *(u64 *)(r10 - 144) = r4
214: r8 >>= 40
; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
215: r9 = *(u8 *)(r2 + 23)
; switch (hd.ipv4.protocol) {
216: if r9 == 17 goto 171
217: if r9 == 6 goto 270
218: r4 = 34
219: *(u64 *)(r10 - 72) = r4
220: r4 = 1
221: *(u64 *)(r10 - 40) = r4
222: r4 = 0
223: *(u64 *)(r10 - 216) = r4
224: r4 = 0
225: *(u64 *)(r10 - 352) = r4
226: r4 = 0
227: *(u64 *)(r10 - 336) = r4
228: r4 = 0
229: *(u64 *)(r10 - 344) = r4
230: r4 = 0
231: *(u64 *)(r10 - 304) = r4
232: r4 = 0
233: *(u64 *)(r10 - 312) = r4
234: r4 = 0
235: *(u64 *)(r10 - 320) = r4
236: r4 = 0
237: *(u64 *)(r10 - 328) = r4
238: r4 = 0
239: *(u64 *)(r10 - 272) = r4
240: r4 = 0
241: *(u64 *)(r10 - 280) = r4
242: r4 = 0
243: *(u64 *)(r10 - 288) = r4
244: r4 = 0
245: *(u64 *)(r10 - 296) = r4
246: r4 = 0
247: *(u64 *)(r10 - 256) = r4
248: r4 = 0
249: *(u64 *)(r10 - 264) = r4
250: r4 = 0
251: *(u64 *)(r10 - 240) = r4
252: r4 = 0
253: *(u64 *)(r10 - 248) = r4
254: r4 = 0
255: *(u64 *)(r10 - 224) = r4
256: r4 = 0
257: *(u64 *)(r10 - 232) = r4
258: r4 = 0
259: *(u64 *)(r10 - 384) = r4
260: r4 = 0
261: *(u64 *)(r10 - 440) = r4
262: r4 = 0
263: *(u64 *)(r10 - 424) = r4
264: r4 = 0
265: *(u64 *)(r10 - 432) = r4
266: r4 = 0
267: *(u64 *)(r10 - 408) = r4
268: r4 = 0
269: *(u64 *)(r10 - 416) = r4
270: r4 = 0
271: *(u64 *)(r10 - 392) = r4
272: r4 = 0
273: *(u64 *)(r10 - 400) = r4
274: r4 = 0
275: *(u64 *)(r10 - 464) = r4
276: r4 = 0
277: *(u64 *)(r10 - 472) = r4
278: r4 = 0
279: *(u64 *)(r10 - 448) = r4
280: r4 = 0
281: *(u64 *)(r10 - 456) = r4
282: r4 = 0
283: *(u64 *)(r10 - 64) = r4
284: r4 = 0
285: *(u64 *)(r10 - 56) = r4
286: r4 = 0
287: *(u64 *)(r10 - 48) = r4
288: r4 = 0
289: *(u64 *)(r10 - 360) = r4
290: r4 = 0
291: *(u64 *)(r10 - 368) = r4
292: r4 = 0
293: *(u64 *)(r10 - 376) = r4
294: *(u64 *)(r10 - 32) = r9
295: if r9 != 1 goto 301
296: *(u64 *)(r10 - 592) = r0
297: r0 = r5
298: r5 = r8
299: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
300: r4 = r2
301: r4 += 38
302: if r4 > r3 goto 753
303: r3 = 38
304: *(u64 *)(r10 - 72) = r3
305: r3 = 1
306: *(u64 *)(r10 - 64) = r3
307: r3 = 0
; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
308: *(u64 *)(r10 - 216) = r3
309: r3 = *(u16 *)(r2 + 36)
310: r4 = r3
311: r4 >>= 8
312: *(u64 *)(r10 - 456) = r4
; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
313: r2 = *(u16 *)(r2 + 34)
314: r4 = r2
315: r4 >>= 8
316: *(u64 *)(r10 - 472) = r4
; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
317: r3 <<= 8
318: r3 &= 65280
319: *(u64 *)(r10 - 448) = r3
; hd.icmp.typeCode = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
320: r2 <<= 8
321: r2 &= 65280
322: *(u64 *)(r10 - 464) = r2
323: r2 = 0
324: *(u64 *)(r10 - 352) = r2
325: r2 = 0
326: *(u64 *)(r10 - 336) = r2
327: r2 = 0
328: *(u64 *)(r10 - 344) = r2
329: r2 = 0
330: *(u64 *)(r10 - 304) = r2
331: r2 = 0
332: *(u64 *)(r10 - 312) = r2
333: r2 = 0
334: *(u64 *)(r10 - 320) = r2
335: r2 = 0
336: *(u64 *)(r10 - 328) = r2
337: r2 = 0
338: *(u64 *)(r10 - 272) = r2
339: r2 = 0
340: *(u64 *)(r10 - 280) = r2
341: r2 = 0
342: *(u64 *)(r10 - 288) = r2
343: r2 = 0
344: *(u64 *)(r10 - 296) = r2
345: r2 = 0
346: *(u64 *)(r10 - 256) = r2
347: r2 = 0
348: *(u64 *)(r10 - 264) = r2
349: r2 = 0
350: *(u64 *)(r10 - 240) = r2
351: r2 = 0
352: *(u64 *)(r10 - 248) = r2
353: r2 = 0
354: *(u64 *)(r10 - 224) = r2
355: r2 = 0
356: *(u64 *)(r10 - 232) = r2
357: r2 = 0
358: *(u64 *)(r10 - 384) = r2
359: r2 = 0
360: *(u64 *)(r10 - 440) = r2
361: r2 = 0
362: *(u64 *)(r10 - 424) = r2
363: r2 = 0
364: *(u64 *)(r10 - 432) = r2
365: r2 = 0
366: *(u64 *)(r10 - 408) = r2
367: r2 = 0
368: *(u64 *)(r10 - 416) = r2
369: r2 = 0
370: *(u64 *)(r10 - 392) = r2
371: r2 = 0
372: *(u64 *)(r10 - 400) = r2
373: r2 = 0
374: *(u64 *)(r10 - 56) = r2
375: r2 = 0
376: *(u64 *)(r10 - 48) = r2
377: r2 = 0
378: *(u64 *)(r10 - 360) = r2
379: r2 = 0
380: *(u64 *)(r10 - 368) = r2
381: r2 = 0
382: *(u64 *)(r10 - 376) = r2
383: r2 = 1
384: *(u64 *)(r10 - 40) = r2
385: r2 = 1
386: *(u64 *)(r10 - 32) = r2
387: goto 97
LBB0_10:
388: *(u64 *)(r10 - 592) = r0
389: r0 = r5
390: r5 = r8
391: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
392: r4 = r2
393: r4 += 42
394: if r4 > r3 goto 661
395: r3 = 42
396: *(u64 *)(r10 - 72) = r3
397: r3 = 17
398: *(u64 *)(r10 - 32) = r3
399: r3 = 1
400: *(u64 *)(r10 - 56) = r3
401: r3 = 0
; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
402: *(u64 *)(r10 - 216) = r3
403: r3 = *(u16 *)(r2 + 40)
404: r4 = r3
405: r4 >>= 8
406: *(u64 *)(r10 - 400) = r4
; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
407: r4 = *(u16 *)(r2 + 38)
408: r8 = r4
409: r8 >>= 8
410: *(u64 *)(r10 - 416) = r8
; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
411: r8 = *(u16 *)(r2 + 36)
412: r9 = r8
413: r9 >>= 8
414: *(u64 *)(r10 - 432) = r9
; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
415: r2 = *(u16 *)(r2 + 34)
416: r9 = r2
417: r9 >>= 8
418: *(u64 *)(r10 - 440) = r9
; hd.udp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
419: r3 <<= 8
420: r3 &= 65280
421: *(u64 *)(r10 - 392) = r3
; hd.udp.length_ = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
422: r4 <<= 8
423: r4 &= 65280
424: *(u64 *)(r10 - 408) = r4
; hd.udp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
425: r8 <<= 8
426: r8 &= 65280
427: *(u64 *)(r10 - 424) = r8
; hd.udp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
428: r2 <<= 8
429: r2 &= 65280
430: *(u64 *)(r10 - 384) = r2
431: r2 = 0
432: *(u64 *)(r10 - 352) = r2
433: r2 = 0
434: *(u64 *)(r10 - 336) = r2
435: r2 = 0
436: *(u64 *)(r10 - 344) = r2
437: r2 = 0
438: *(u64 *)(r10 - 304) = r2
439: r2 = 0
440: *(u64 *)(r10 - 312) = r2
441: r2 = 0
442: *(u64 *)(r10 - 320) = r2
443: r2 = 0
444: *(u64 *)(r10 - 328) = r2
445: r2 = 0
446: *(u64 *)(r10 - 272) = r2
447: r2 = 0
448: *(u64 *)(r10 - 280) = r2
449: r2 = 0
450: *(u64 *)(r10 - 288) = r2
451: r2 = 0
452: *(u64 *)(r10 - 296) = r2
453: r2 = 0
454: *(u64 *)(r10 - 256) = r2
455: r2 = 0
456: *(u64 *)(r10 - 264) = r2
457: r2 = 0
458: *(u64 *)(r10 - 240) = r2
459: r2 = 0
460: *(u64 *)(r10 - 248) = r2
461: r2 = 0
462: *(u64 *)(r10 - 224) = r2
463: r2 = 0
464: *(u64 *)(r10 - 232) = r2
465: r2 = 0
466: *(u64 *)(r10 - 464) = r2
467: r2 = 0
468: *(u64 *)(r10 - 472) = r2
469: r2 = 0
470: *(u64 *)(r10 - 448) = r2
471: r2 = 0
472: *(u64 *)(r10 - 456) = r2
473: r2 = 0
474: *(u64 *)(r10 - 64) = r2
475: r2 = 0
476: *(u64 *)(r10 - 48) = r2
477: r2 = 0
478: *(u64 *)(r10 - 360) = r2
479: r2 = 0
480: *(u64 *)(r10 - 368) = r2
481: r2 = 0
482: *(u64 *)(r10 - 376) = r2
483: r2 = 1
484: *(u64 *)(r10 - 40) = r2
LBB0_12:
485: r8 = r5
486: r5 = r0
487: goto 108
LBB0_8:
488: *(u64 *)(r10 - 592) = r0
489: *(u64 *)(r10 - 600) = r5
490: r5 = r8
491: r8 = 0
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
492: r4 = r2
493: r4 += 54
494: if r4 > r3 goto 561
495: r3 = 54
496: *(u64 *)(r10 - 72) = r3
497: r3 = 6
498: *(u64 *)(r10 - 32) = r3
499: r3 = 1
500: *(u64 *)(r10 - 48) = r3
501: r3 = 0
; hd.tcp.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
502: *(u64 *)(r10 - 384) = r3
503: r3 = *(u8 *)(r2 + 47)
; hd.tcp.ackNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
504: *(u64 *)(r10 - 360) = r3
505: r3 = *(u32 *)(r2 + 42)
506: r4 = r3
507: r4 >>= 24
508: *(u64 *)(r10 - 296) = r4
509: r4 = r3
510: r4 >>= 16
511: *(u64 *)(r10 - 288) = r4
512: *(u64 *)(r10 - 272) = r3
; goto accept;
513: r3 >>= 8
514: *(u64 *)(r10 - 280) = r3
; hd.tcp.seqNo = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
515: r3 = *(u32 *)(r2 + 38)
516: r4 = r3
517: r4 >>= 24
518: *(u64 *)(r10 - 328) = r4
519: r4 = r3
520: r4 >>= 16
521: *(u64 *)(r10 - 320) = r4
522: *(u64 *)(r10 - 304) = r3
; goto accept;
523: r3 >>= 8
524: *(u64 *)(r10 - 312) = r3
; hd.tcp.dataOffset = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4));
525: r0 = *(u8 *)(r2 + 46)
; goto accept;
526: r3 = r0
527: r3 &= 240
528: *(u64 *)(r10 - 376) = r3
; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
529: r3 = *(u16 *)(r2 + 52)
530: r4 = r3
531: r4 >>= 8
532: *(u64 *)(r10 - 232) = r4
; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
533: r4 = *(u16 *)(r2 + 50)
534: r8 = r4
535: r8 >>= 8
536: *(u64 *)(r10 - 248) = r8
; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
537: r8 = *(u16 *)(r2 + 48)
538: r9 = r8
539: r9 >>= 8
540: *(u64 *)(r10 - 264) = r9
; hd.tcp.res = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4));
541: r0 &= 15
542: *(u64 *)(r10 - 368) = r0
; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
543: r0 = *(u16 *)(r2 + 36)
544: r9 = r0
545: r9 >>= 8
546: *(u64 *)(r10 - 344) = r9
; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
547: r2 = *(u16 *)(r2 + 34)
548: r9 = r2
549: r9 >>= 8
550: *(u64 *)(r10 - 352) = r9
; hd.tcp.urgentPtr = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
551: r3 <<= 8
552: r3 &= 65280
553: *(u64 *)(r10 - 224) = r3
; hd.tcp.checksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
554: r4 <<= 8
555: r4 &= 65280
556: *(u64 *)(r10 - 240) = r4
; hd.tcp.window = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
557: r8 <<= 8
558: r8 &= 65280
559: *(u64 *)(r10 - 256) = r8
; hd.tcp.dstPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
560: r0 <<= 8
561: r0 &= 65280
562: *(u64 *)(r10 - 336) = r0
; hd.tcp.srcPort = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))));
563: r2 <<= 8
564: r2 &= 65280
565: *(u64 *)(r10 - 216) = r2
566: r2 = 0
567: *(u64 *)(r10 - 440) = r2
568: r2 = 0
569: *(u64 *)(r10 - 424) = r2
570: r2 = 0
571: *(u64 *)(r10 - 432) = r2
572: r2 = 0
573: *(u64 *)(r10 - 408) = r2
574: r2 = 0
575: *(u64 *)(r10 - 416) = r2
576: r2 = 0
577: *(u64 *)(r10 - 392) = r2
578: r2 = 0
579: *(u64 *)(r10 - 400) = r2
580: r2 = 0
581: *(u64 *)(r10 - 464) = r2
582: r2 = 0
583: *(u64 *)(r10 - 472) = r2
584: r2 = 0
585: *(u64 *)(r10 - 448) = r2
586: r2 = 0
587: *(u64 *)(r10 - 456) = r2
588: r2 = 0
589: *(u64 *)(r10 - 64) = r2
590: r2 = 0
591: *(u64 *)(r10 - 56) = r2
592: r2 = 1
593: *(u64 *)(r10 - 40) = r2
594: r8 = r5
595: r5 = *(u64 *)(r10 - 600)
LBB0_13:
596: r0 = *(u64 *)(r10 - 592)
LBB0_14:
597: *(u64 *)(r10 - 592) = r0
598: *(u64 *)(r10 - 600) = r5
; key.field0 = hd.ethernet.protocol;
599: *(u16 *)(r10 - 24) = r1
600: r2 = r10
601: r2 += -24
; value = bpf_map_lookup_elem(&dstmactable, &key);
602: r1 = 0ll
604: call 1
605: r9 = *(u64 *)(r10 - 32)
; if (value == NULL) {
606: if r0 != 0 goto 6
607: r2 = r10
; u8 hit;
608: r2 += -4
; value = bpf_map_lookup_elem(&dstmactable_defaultAction, &ebpf_zero);
609: r1 = 0ll
611: call 1
; if (value != NULL) {
612: if r0 == 0 goto 442
LBB0_16:
613: r1 = 1
; switch (value->action) {
614: r2 = *(u32 *)(r0 + 0)
615: if r2 == 1 goto 85
616: if r2 != 0 goto 438
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
617: r1 = *(u64 *)(r10 - 96)
618: r1 <<= 24
619: r2 = *(u64 *)(r10 - 592)
620: r2 &= 255
621: r2 <<= 16
622: r2 |= r1
623: r3 = *(u64 *)(r10 - 600)
624: r3 &= 255
625: r3 <<= 8
626: r1 = r2
627: r1 |= r3
628: r3 = *(u64 *)(r10 - 80)
629: r3 &= 255
630: r1 |= r3
; checksum += (dstAddr >> 16) + (u16)dstAddr;
631: bswap32 r2
632: bswap16 r1
; checksum += htons(totalLen);
633: r1 += r2
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
634: r2 = *(u64 *)(r10 - 88)
635: r2 &= 255
636: r3 = r8
637: r3 &= 255
638: r3 <<= 8
639: r3 |= r2
640: r2 = *(u64 *)(r10 - 144)
641: r2 <<= 24
642: r4 = *(u64 *)(r10 - 104)
643: r4 &= 255
644: r4 <<= 16
645: r2 |= r4
646: r3 |= r2
; checksum += (srcAddr >> 16) + (u16)srcAddr;
647: bswap32 r2
; checksum += htons(identification);
648: r1 += r2
; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv);
649: r5 = *(u64 *)(r10 - 184)
650: r5 <<= 4
651: r2 = *(u64 *)(r10 - 192)
652: r5 |= r2
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
653: r4 = *(u64 *)(r10 - 168)
654: r4 &= 255
; checksum += htons(totalLen);
655: r2 = *(u64 *)(r10 - 176)
656: r2 <<= 8
657: r2 |= r4
; tmp_1 = ebpf_ipv4_checksum(hd.ipv4.version, hd.ipv4.ihl, hd.ipv4.diffserv, hd.ipv4.totalLen, hd.ipv4.identification, hd.ipv4.flags, hd.ipv4.fragOffset, hd.ipv4.ttl, hd.ipv4.protocol, hd.ipv4.srcAddr, hd.ipv4.dstAddr);
658: r0 = *(u64 *)(r10 - 152)
659: r0 &= 255
; checksum += htons(identification);
660: r4 = *(u64 *)(r10 - 160)
661: r4 <<= 8
662: r4 |= r0
; checksum += (srcAddr >> 16) + (u16)srcAddr;
663: bswap16 r3
; checksum += htons(((u16)flags << 13) | fragOffset);
664: r1 += r3
; checksum += htons(((u16)ttl << 8) | (u16)protocol);
665: r3 = r9
666: r3 <<= 8
667: r3 |= 4
668: r1 += r3
; u32 checksum = htons(((u16)version << 12) | ((u16)ihl << 8) | (u16)diffserv);
669: r5 &= 255
670: r3 = *(u64 *)(r10 - 112)
671: r3 &= 255
672: r3 <<= 8
673: r3 |= r5
; checksum += htons(((u16)flags << 13) | fragOffset);
674: r5 = *(u64 *)(r10 - 136)
675: r5 <<= 5
676: r0 = *(u64 *)(r10 - 128)
677: r5 |= r0
678: r5 &= 255
679: r0 = *(u64 *)(r10 - 120)
680: r0 <<= 8
681: r0 |= r5
; checksum += (srcAddr >> 16) + (u16)srcAddr;
682: r1 += r0
683: r1 += r3
; checksum += (dstAddr >> 16) + (u16)dstAddr;
684: r1 += r4
685: r1 += r2
686: r2 = 4294901760ll
688: r7 = r1
689: r7 &= r2
; return __constant_ntohs(~((checksum & 0xFFFF) + (checksum >> 16)));
690: r7 >>= 16
691: r7 += r1
692: r1 = 2
693: r2 = 4
694: *(u64 *)(r10 - 200) = r2
695: r7 ^= -1
696: r2 = r7
697: r2 &= 65535
698: *(u64 *)(r10 - 208) = r2
699: r7 &= 65280
700: r7 >>= 8
LBB0_19:
701: *(u64 *)(r10 - 608) = r8
; if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160;
702: r2 = 272
703: r8 = 0
704: r3 = *(u64 *)(r10 - 40)
705: if r3 != r8 goto 1
706: r2 = 112
LBB0_21:
; if (hd.tcp.ebpf_valid) ebpf_outHeaderLength += 160;
707: r3 = r2
708: r3 += 160
709: r4 = *(u64 *)(r10 - 48)
710: if r4 != r8 goto 1
711: r3 = r2
LBB0_23:
; if (hd.udp.ebpf_valid) ebpf_outHeaderLength += 64;
712: r4 = r3
713: r4 += 64
714: r2 = *(u64 *)(r10 - 56)
715: if r2 != r8 goto 1
716: r4 = r3
LBB0_25:
; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
717: r3 = r4
718: r3 += 32
719: r2 = *(u64 *)(r10 - 64)
720: if r2 != r8 goto 1
721: r3 = r4
LBB0_27:
; xout.output_port = 0;
722: *(u32 *)(r10 - 12) = r8
; xout.output_action = tmp_2;
723: *(u32 *)(r10 - 16) = r1
; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32;
724: r1 = 4294967288ll
726: r3 &= r1
; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - BYTES(ebpf_outHeaderLength));
727: r3 >>= 3
728: r2 = *(u64 *)(r10 - 72)
729: r2 -= r3
730: r1 = r6
731: call 44
; ebpf_packetEnd = ((void*)(long)skb->data_end);
732: r2 = *(u32 *)(r6 + 4)
; ebpf_packetStart = ((void*)(long)skb->data);
733: r1 = *(u32 *)(r6 + 0)
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) {
734: r3 = r1
735: r3 += 14
736: if r3 > r2 goto 319
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
737: r3 = *(u64 *)(r10 - 576)
738: *(u8 *)(r1 + 0) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
739: r3 = *(u64 *)(r10 - 568)
740: *(u8 *)(r1 + 1) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
741: r3 = *(u64 *)(r10 - 560)
742: *(u8 *)(r1 + 2) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
743: r3 = *(u64 *)(r10 - 552)
744: *(u8 *)(r1 + 3) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
745: r3 = *(u64 *)(r10 - 544)
746: *(u8 *)(r1 + 4) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
747: r3 = *(u64 *)(r10 - 536)
748: *(u8 *)(r1 + 5) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
749: r3 = *(u64 *)(r10 - 520)
750: *(u8 *)(r1 + 6) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
751: r3 = *(u64 *)(r10 - 512)
752: *(u8 *)(r1 + 7) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
753: r3 = *(u64 *)(r10 - 504)
754: *(u8 *)(r1 + 8) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
755: r3 = *(u64 *)(r10 - 496)
756: *(u8 *)(r1 + 9) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 4, (ebpf_byte) << 0);
757: r3 = *(u64 *)(r10 - 488)
758: *(u8 *)(r1 + 10) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 5, (ebpf_byte) << 0);
759: r3 = *(u64 *)(r10 - 480)
760: *(u8 *)(r1 + 11) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
761: r3 = *(u64 *)(r10 - 528)
762: *(u8 *)(r1 + 12) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
763: r3 = *(u64 *)(r10 - 584)
764: *(u8 *)(r1 + 13) = r3
765: r3 = 112
; if (hd.ipv4.ebpf_valid) {
766: r4 = *(u64 *)(r10 - 40)
767: if r4 == 0 goto 50
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
768: r3 = r1
769: r3 += 34
770: if r3 > r2 goto 285
771: r3 = *(u64 *)(r10 - 184)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
772: r3 <<= 4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
773: r4 = *(u64 *)(r10 - 192)
774: r3 |= r4
775: *(u8 *)(r1 + 14) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
776: r3 = *(u64 *)(r10 - 112)
777: *(u8 *)(r1 + 15) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
778: r3 = *(u64 *)(r10 - 168)
779: *(u8 *)(r1 + 16) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
780: r3 = *(u64 *)(r10 - 176)
781: *(u8 *)(r1 + 17) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
782: r3 = *(u64 *)(r10 - 152)
783: *(u8 *)(r1 + 18) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
784: r3 = *(u64 *)(r10 - 160)
785: *(u8 *)(r1 + 19) = r3
786: r4 = *(u64 *)(r10 - 136)
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5);
787: r4 <<= 5
788: r3 = *(u64 *)(r10 - 120)
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3);
789: r3 >>= 2
790: r3 &= 7
791: r3 |= r4
792: *(u8 *)(r1 + 20) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
793: r3 = *(u64 *)(r10 - 128)
794: *(u8 *)(r1 + 21) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
795: r3 = *(u64 *)(r10 - 200)
796: *(u8 *)(r1 + 22) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
797: *(u8 *)(r1 + 23) = r9
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
798: r3 = *(u64 *)(r10 - 208)
799: *(u8 *)(r1 + 24) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
800: *(u8 *)(r1 + 25) = r7
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
801: r3 = *(u64 *)(r10 - 144)
802: *(u8 *)(r1 + 26) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
803: r3 = *(u64 *)(r10 - 104)
804: *(u8 *)(r1 + 27) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
805: r3 = *(u64 *)(r10 - 608)
806: *(u8 *)(r1 + 28) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
807: r3 = *(u64 *)(r10 - 88)
808: *(u8 *)(r1 + 29) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
809: r3 = *(u64 *)(r10 - 96)
810: *(u8 *)(r1 + 30) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
811: r3 = *(u64 *)(r10 - 592)
812: *(u8 *)(r1 + 31) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
813: r3 = *(u64 *)(r10 - 600)
814: *(u8 *)(r1 + 32) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
815: r3 = *(u64 *)(r10 - 80)
816: *(u8 *)(r1 + 33) = r3
817: r3 = 272
LBB0_31:
; if (hd.tcp.ebpf_valid) {
818: r4 = *(u64 *)(r10 - 48)
819: if r4 == 0 goto 140
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) {
820: r5 = r3
821: r5 += 160
822: r4 = 4294967288ll
824: r5 &= r4
825: r5 >>= 3
826: r0 = r1
827: r0 += r5
828: if r0 > r2 goto 227
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
829: r5 = r3
830: r5 &= r4
831: r5 >>= 3
832: r6 = *(u64 *)(r10 - 216)
; hd.tcp.srcPort = htons(hd.tcp.srcPort);
833: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
834: r0 = r1
835: r0 += r5
836: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
837: r5 |= 1
838: r0 = r1
839: r0 += r5
840: r5 = *(u64 *)(r10 - 352)
841: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 16;
842: r5 = r3
843: r5 += 16
844: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
845: r5 >>= 3
846: r6 = *(u64 *)(r10 - 336)
; hd.tcp.dstPort = htons(hd.tcp.dstPort);
847: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
848: r0 = r1
849: r0 += r5
850: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
851: r5 |= 1
852: r0 = r1
853: r0 += r5
854: r5 = *(u64 *)(r10 - 344)
855: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 16;
856: r5 = r3
857: r5 += 32
858: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
859: r5 >>= 3
860: r0 = r1
861: r0 += r5
862: r6 = *(u64 *)(r10 - 304)
863: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
864: r5 |= 1
865: r6 = r1
866: r6 += r5
867: r5 = *(u64 *)(r10 - 312)
868: *(u8 *)(r6 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
869: r5 = *(u64 *)(r10 - 320)
870: *(u8 *)(r0 + 2) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
871: r5 = *(u64 *)(r10 - 328)
872: *(u8 *)(r0 + 3) = r5
; ebpf_packetOffsetInBits += 32;
873: r5 = r3
874: r5 += 64
875: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
876: r5 >>= 3
877: r0 = r1
878: r0 += r5
879: r6 = *(u64 *)(r10 - 272)
880: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
881: r5 |= 1
882: r6 = r1
883: r6 += r5
884: r5 = *(u64 *)(r10 - 280)
885: *(u8 *)(r6 + 0) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0);
886: r5 = *(u64 *)(r10 - 288)
887: *(u8 *)(r0 + 2) = r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0);
888: r5 = *(u64 *)(r10 - 296)
889: *(u8 *)(r0 + 3) = r5
; ebpf_packetOffsetInBits += 32;
890: r5 = r3
891: r5 += 96
892: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4);
893: r5 >>= 3
894: r0 = r1
895: r0 += r5
896: r5 = *(u64 *)(r10 - 376)
897: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 4;
898: r5 = r3
899: r5 += 100
900: r5 &= r4
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4);
901: r5 >>= 3
902: r0 = r1
903: r0 += r5
904: r5 = *(u8 *)(r0 + 0)
905: r5 &= 240
906: r6 = *(u64 *)(r10 - 368)
907: r5 |= r6
908: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 4;
909: r5 = r3
910: r5 += 104
911: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
912: r5 >>= 3
913: r0 = r1
914: r0 += r5
915: r5 = *(u64 *)(r10 - 360)
916: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 8;
917: r5 = r3
918: r5 += 112
919: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
920: r5 >>= 3
921: r6 = *(u64 *)(r10 - 256)
; hd.tcp.window = htons(hd.tcp.window);
922: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
923: r0 = r1
924: r0 += r5
925: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
926: r5 |= 1
927: r0 = r1
928: r0 += r5
929: r5 = *(u64 *)(r10 - 264)
930: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 16;
931: r3 |= 128
932: r5 = r3
933: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
934: r5 >>= 3
935: r6 = *(u64 *)(r10 - 240)
; hd.tcp.checksum = htons(hd.tcp.checksum);
936: r6 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
937: r0 = r1
938: r0 += r5
939: *(u8 *)(r0 + 0) = r6
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
940: r5 |= 1
941: r0 = r1
942: r0 += r5
943: r5 = *(u64 *)(r10 - 248)
944: *(u8 *)(r0 + 0) = r5
; ebpf_packetOffsetInBits += 16;
945: r5 = r3
946: r5 += 16
947: r5 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
948: r5 >>= 3
949: r0 = *(u64 *)(r10 - 224)
; hd.tcp.urgentPtr = htons(hd.tcp.urgentPtr);
950: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
951: r4 = r1
952: r4 += r5
953: *(u8 *)(r4 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
954: r5 |= 1
955: r4 = r1
956: r4 += r5
957: r5 = *(u64 *)(r10 - 232)
958: *(u8 *)(r4 + 0) = r5
; ebpf_packetOffsetInBits += 16;
959: r3 += 32
LBB0_34:
; if (hd.udp.ebpf_valid) {
960: r4 = *(u64 *)(r10 - 56)
961: if r4 == 0 goto 53
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 64)) {
962: r4 = r3
963: r4 += 64
964: r5 = 4294967288ll
966: r0 = r4
967: r0 &= r5
968: r0 >>= 3
969: r6 = r1
970: r6 += r0
971: if r6 > r2 goto 84
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
972: r0 = r3
973: r0 &= r5
974: r0 >>= 3
975: r6 = r1
976: r6 += r0
977: r0 = *(u64 *)(r10 - 384)
; hd.udp.srcPort = htons(hd.udp.srcPort);
978: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
979: *(u8 *)(r6 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
980: r0 = *(u64 *)(r10 - 440)
981: *(u8 *)(r6 + 1) = r0
; ebpf_packetOffsetInBits += 16;
982: r0 = r3
983: r0 += 16
984: r0 &= r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
985: r0 >>= 3
986: r6 = r1
987: r6 += r0
988: r0 = *(u64 *)(r10 - 424)
; hd.udp.dstPort = htons(hd.udp.dstPort);
989: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
990: *(u8 *)(r6 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
991: r0 = *(u64 *)(r10 - 432)
992: *(u8 *)(r6 + 1) = r0
; ebpf_packetOffsetInBits += 16;
993: r0 = r3
994: r0 += 32
995: r0 &= r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
996: r0 >>= 3
997: r6 = r1
998: r6 += r0
999: r0 = *(u64 *)(r10 - 408)
; hd.udp.length_ = htons(hd.udp.length_);
1000: r0 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1001: *(u8 *)(r6 + 0) = r0
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
1002: r0 = *(u64 *)(r10 - 416)
1003: *(u8 *)(r6 + 1) = r0
; ebpf_packetOffsetInBits += 16;
1004: r3 += 48
1005: r3 &= r5
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1006: r3 >>= 3
1007: r5 = r1
1008: r5 += r3
1009: r3 = *(u64 *)(r10 - 392)
; hd.udp.checksum = htons(hd.udp.checksum);
1010: r3 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1011: *(u8 *)(r5 + 0) = r3
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
1012: r3 = *(u64 *)(r10 - 400)
1013: *(u8 *)(r5 + 1) = r3
1014: r3 = r4
LBB0_37:
; if (hd.icmp.ebpf_valid) {
1015: r4 = *(u64 *)(r10 - 64)
1016: if r4 == 0 goto 28
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) {
1017: r5 = r3
1018: r5 += 32
1019: r4 = 4294967288ll
1021: r5 &= r4
1022: r5 >>= 3
1023: r0 = r1
1024: r0 += r5
1025: if r0 > r2 goto 30
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1026: r2 = r3
1027: r2 &= r4
1028: r2 >>= 3
1029: r5 = r1
1030: r5 += r2
1031: r2 = *(u64 *)(r10 - 464)
; hd.icmp.typeCode = htons(hd.icmp.typeCode);
1032: r2 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1033: *(u8 *)(r5 + 0) = r2
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
1034: r2 = *(u64 *)(r10 - 472)
1035: *(u8 *)(r5 + 1) = r2
; ebpf_packetOffsetInBits += 16;
1036: r3 += 16
1037: r3 &= r4
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1038: r3 >>= 3
1039: r1 += r3
1040: r2 = *(u64 *)(r10 - 448)
; hd.icmp.hdrChecksum = htons(hd.icmp.hdrChecksum);
1041: r2 >>= 8
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0);
1042: *(u8 *)(r1 + 0) = r2
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0);
1043: r2 = *(u64 *)(r10 - 456)
1044: *(u8 *)(r1 + 1) = r2
LBB0_40:
; xout.output_port = 0;
1045: r3 = r10
1046: r3 += -12
1047: r2 = r10
1048: r2 += -4
; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY);
1049: r1 = 0ll
1051: r4 = 0
1052: call 2
; return xout.output_action;
1053: r8 = *(u32 *)(r10 - 16)
1054: goto 1
LBB0_42:
1055: r8 = 0
LBB0_41:
; }
1056: r0 = r8
1057: exit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment