Last active
April 14, 2017 18:41
-
-
Save williamtu/759eedbefa335c7dbc5700acc0c43ee9 to your computer and use it in GitHub Desktop.
xdp9.c (max BPF stack > 512), see 595: r5 = *(u64 *)(r10 - 600)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
}, |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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]; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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): |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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