Created
February 3, 2017 03:15
-
-
Save williamtu/3e308a14c5795c82d516f934be0560cc to your computer and use it in GitHub Desktop.
xdp3.S
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
xdp3.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: r4 = *(u32 *)(r6 + 4) | |
; void* ebpf_packetStart = ((void*)(long)skb->data); | |
2: r3 = *(u32 *)(r6 + 0) | |
3: r0 = 0 | |
; u32 ebpf_zero = 0; | |
4: *(u32 *)(r10 - 4) = r0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 112)) { | |
5: r1 = r3 | |
6: r1 += 14 | |
7: if r1 > r4 goto 295 | |
8: r2 = 14 | |
9: r0 = 0 | |
; hd.ethernet.protocol = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
10: r1 = *(u16 *)(r3 + 12) | |
; switch (hd.ethernet.protocol) { | |
11: bswap16 r1 | |
12: r5 = 0 | |
13: *(u64 *)(r10 - 152) = r5 | |
14: r5 = 0 | |
15: *(u64 *)(r10 - 112) = r5 | |
16: r5 = 0 | |
17: *(u64 *)(r10 - 104) = r5 | |
18: r5 = 0 | |
19: *(u64 *)(r10 - 120) = r5 | |
20: r5 = 0 | |
21: *(u64 *)(r10 - 136) = r5 | |
22: r5 = 0 | |
23: *(u64 *)(r10 - 88) = r5 | |
24: r7 = 0 | |
25: r5 = 0 | |
26: *(u64 *)(r10 - 96) = r5 | |
27: r5 = 0 | |
28: *(u64 *)(r10 - 24) = r5 | |
29: r5 = 0 | |
30: *(u64 *)(r10 - 72) = r5 | |
31: r5 = 0 | |
32: *(u64 *)(r10 - 40) = r5 | |
33: r9 = 0 | |
34: r5 = 0 | |
35: *(u64 *)(r10 - 80) = r5 | |
36: r5 = 0 | |
37: *(u64 *)(r10 - 56) = r5 | |
38: r5 = 0 | |
39: *(u64 *)(r10 - 64) = r5 | |
40: r5 = 0 | |
41: *(u64 *)(r10 - 32) = r5 | |
42: r8 = 0 | |
43: *(u64 *)(r10 - 128) = r8 | |
44: r5 = 0 | |
45: *(u64 *)(r10 - 168) = r5 | |
46: r5 = 0 | |
47: *(u64 *)(r10 - 176) = r5 | |
48: r8 = 0 | |
49: *(u64 *)(r10 - 144) = r8 | |
50: r5 = 0 | |
51: *(u64 *)(r10 - 200) = r5 | |
52: r5 = 0 | |
53: *(u64 *)(r10 - 192) = r5 | |
54: r5 = 0 | |
55: *(u64 *)(r10 - 160) = r5 | |
56: r5 = 0 | |
57: *(u64 *)(r10 - 48) = r5 | |
58: r8 = 0 | |
59: *(u64 *)(r10 - 184) = r8 | |
60: r8 = 0 | |
61: *(u64 *)(r10 - 216) = r8 | |
62: r8 = 0 | |
63: *(u64 *)(r10 - 208) = r8 | |
64: r8 = 0 | |
65: if r1 != 2048 goto 111 | |
66: r0 = 0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
67: r2 = r3 | |
68: r2 += 34 | |
69: if r2 > r4 goto 233 | |
70: r2 = 1 | |
71: *(u64 *)(r10 - 56) = r2 | |
72: r2 = 0 | |
; hd.ipv4.ttl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
73: *(u64 *)(r10 - 24) = r2 | |
74: r2 = *(u8 *)(r3 + 22) | |
; hd.ipv4.diffserv = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
75: *(u64 *)(r10 - 32) = r2 | |
76: r5 = *(u8 *)(r3 + 15) | |
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
77: *(u64 *)(r10 - 144) = r5 | |
78: r7 = *(u32 *)(r3 + 30) | |
79: r8 = r7 | |
80: bswap16 r8 | |
81: *(u64 *)(r10 - 88) = r8 | |
82: r8 = r7 | |
83: bswap32 r8 | |
84: *(u64 *)(r10 - 96) = r8 | |
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
85: r5 = *(u32 *)(r3 + 26) | |
86: r8 = r5 | |
87: bswap16 r8 | |
88: *(u64 *)(r10 - 112) = r8 | |
89: r8 = r5 | |
90: bswap32 r8 | |
91: *(u64 *)(r10 - 120) = r8 | |
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
92: r9 = *(u16 *)(r3 + 24) | |
93: r8 = r9 | |
94: bswap16 r8 | |
95: *(u64 *)(r10 - 128) = r8 | |
; hd.ipv4.fragOffset = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u16, 13)); | |
96: r0 = *(u16 *)(r3 + 20) | |
97: r2 = r0 | |
98: r2 &= 31 | |
99: *(u64 *)(r10 - 48) = r2 | |
100: r0 >>= 8 | |
101: *(u64 *)(r10 - 160) = r0 | |
; hd.ipv4.flags = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 5) & EBPF_MASK(u8, 3)); | |
102: r0 = *(u8 *)(r3 + 20) | |
103: r0 >>= 5 | |
104: *(u64 *)(r10 - 168) = r0 | |
105: r2 = r1 | |
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
106: r1 = *(u16 *)(r3 + 18) | |
107: r0 = r1 | |
108: bswap16 r0 | |
109: *(u64 *)(r10 - 184) = r0 | |
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
110: r0 = *(u16 *)(r3 + 16) | |
111: *(u64 *)(r10 - 224) = r0 | |
112: bswap16 r0 | |
113: *(u64 *)(r10 - 208) = r0 | |
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
114: r8 = *(u8 *)(r3 + 14) | |
; hd.ipv4.ihl = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits))) & EBPF_MASK(u8, 4)); | |
115: r0 = r8 | |
116: r0 &= 15 | |
117: *(u64 *)(r10 - 200) = r0 | |
; hd.ipv4.version = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)) >> 4) & EBPF_MASK(u8, 4)); | |
118: r8 >>= 4 | |
119: *(u64 *)(r10 - 192) = r8 | |
120: r8 = r1 | |
121: r1 = r2 | |
122: r2 = 34 | |
; hd.ipv4.dstAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
123: bswap64 r7 | |
124: r0 = r7 | |
125: r0 >>= 56 | |
126: *(u64 *)(r10 - 136) = r0 | |
127: r7 >>= 40 | |
; hd.ipv4.srcAddr = (u32)((load_word(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
128: bswap64 r5 | |
129: r0 = r5 | |
130: r0 >>= 56 | |
131: *(u64 *)(r10 - 152) = r0 | |
132: r5 >>= 40 | |
133: *(u64 *)(r10 - 104) = r5 | |
; hd.ipv4.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
134: bswap64 r9 | |
135: r9 >>= 56 | |
136: *(u64 *)(r10 - 176) = r9 | |
; hd.ipv4.identification = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
137: bswap64 r8 | |
138: r8 >>= 56 | |
139: *(u64 *)(r10 - 216) = r8 | |
140: r8 = *(u64 *)(r10 - 224) | |
; hd.ipv4.totalLen = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
141: bswap64 r8 | |
142: r8 >>= 56 | |
; hd.ipv4.protocol = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
143: r5 = *(u8 *)(r3 + 23) | |
144: *(u64 *)(r10 - 64) = r5 | |
145: r5 = 0 | |
146: *(u64 *)(r10 - 72) = r5 | |
147: r5 = *(u64 *)(r10 - 48) | |
148: r0 = 0 | |
149: *(u64 *)(r10 - 40) = r0 | |
150: r9 = 0 | |
151: r0 = 0 | |
152: *(u64 *)(r10 - 80) = r0 | |
153: r0 = 0 | |
154: r5 = *(u64 *)(r10 - 64) | |
; switch (hd.ipv4.protocol) { | |
155: if r5 != 1 goto 21 | |
156: *(u64 *)(r10 - 232) = r7 | |
157: r0 = 0 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
158: r2 = r3 | |
159: r2 += 38 | |
160: if r2 > r4 goto 142 | |
161: r2 = 38 | |
162: r4 = 1 | |
; hd.icmp.code = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
163: *(u64 *)(r10 - 40) = r4 | |
164: r9 = *(u8 *)(r3 + 35) | |
; hd.icmp.type_ = (u8)((load_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
165: r4 = *(u8 *)(r3 + 34) | |
; hd.icmp.hdrChecksum = (u16)((load_half(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits)))); | |
166: *(u64 *)(r10 - 80) = r4 | |
167: r3 = *(u16 *)(r3 + 36) | |
168: *(u64 *)(r10 - 24) = r3 | |
169: r3 >>= 8 | |
170: *(u64 *)(r10 - 72) = r3 | |
171: r3 = 1 | |
172: *(u64 *)(r10 - 56) = r3 | |
173: r3 = 1 | |
174: *(u64 *)(r10 - 64) = r3 | |
175: r7 = *(u64 *)(r10 - 232) | |
176: r0 = 0 | |
LBB0_6: | |
177: *(u64 *)(r10 - 224) = r8 | |
178: *(u64 *)(r10 - 240) = r9 | |
; if (hd.ipv4.ebpf_valid) ebpf_outHeaderLength += 160; | |
179: r4 = 160 | |
180: r8 = *(u64 *)(r10 - 56) | |
181: if r8 != r0 goto 1 | |
182: r4 = 0 | |
LBB0_8: | |
183: r9 = *(u64 *)(r10 - 48) | |
184: r3 = *(u64 *)(r10 - 32) | |
185: *(u64 *)(r10 - 32) = r3 | |
186: r3 = *(u64 *)(r10 - 24) | |
187: *(u64 *)(r10 - 24) = r3 | |
; if (hd.icmp.ebpf_valid) ebpf_outHeaderLength += 32; | |
188: r3 = r4 | |
189: r3 += 32 | |
190: r5 = *(u64 *)(r10 - 40) | |
191: if r5 != r0 goto 1 | |
192: r3 = r4 | |
LBB0_10: | |
193: *(u64 *)(r10 - 232) = r7 | |
; tmp_0 = (hd.ethernet.protocol != 2048); | |
194: r4 = 1 | |
195: r5 = 2048 | |
196: if r1 != r5 goto 1 | |
197: r4 = 0 | |
LBB0_12: | |
198: r7 = 0 | |
; xout.output_port = 0; | |
199: *(u32 *)(r10 - 12) = r0 | |
; xout.drop = tmp_0; | |
200: *(u8 *)(r10 - 16) = r4 | |
; bpf_xdp_adjust_head(skb, BYTES(ebpf_packetOffsetInBits) - ebpf_outHeaderLength); | |
201: r2 -= r3 | |
202: r1 = r6 | |
203: call 44 | |
; xout.output_port = 0; | |
204: r3 = r10 | |
205: r3 += -12 | |
; ebpf_packetEnd = ((void*)(long)skb->data_end); | |
206: r2 = *(u32 *)(r6 + 4) | |
; ebpf_packetStart = ((void*)(long)skb->data); | |
207: r1 = *(u32 *)(r6 + 0) | |
; if (hd.ipv4.ebpf_valid) { | |
208: if r8 == 0 goto 51 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 160)) { | |
209: r4 = r1 | |
210: r4 += 20 | |
211: if r4 > r2 goto 80 | |
212: r4 = *(u64 *)(r10 - 192) | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 4); | |
213: r4 <<= 4 | |
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 4, (ebpf_byte) << 4); | |
214: r5 = *(u64 *)(r10 - 200) | |
215: r4 |= r5 | |
216: *(u8 *)(r1 + 0) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
217: r4 = *(u64 *)(r10 - 144) | |
218: *(u8 *)(r1 + 1) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
219: r4 = *(u64 *)(r10 - 224) | |
220: *(u8 *)(r1 + 2) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
221: r4 = *(u64 *)(r10 - 208) | |
222: *(u8 *)(r1 + 3) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
223: r4 = *(u64 *)(r10 - 216) | |
224: *(u8 *)(r1 + 4) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
225: r4 = *(u64 *)(r10 - 184) | |
226: *(u8 *)(r1 + 5) = r4 | |
227: r5 = *(u64 *)(r10 - 168) | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 5); | |
228: r5 <<= 5 | |
229: r4 = *(u64 *)(r10 - 160) | |
; write_partial(ebpf_packetStart + BYTES(ebpf_packetOffsetInBits) + 0, 3, (ebpf_byte) << 3); | |
230: r4 >>= 2 | |
231: r4 &= 7 | |
232: r4 |= r5 | |
233: *(u8 *)(r1 + 6) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
234: *(u8 *)(r1 + 7) = r9 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
235: r4 = *(u64 *)(r10 - 32) | |
236: *(u8 *)(r1 + 8) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
237: r4 = *(u64 *)(r10 - 64) | |
238: *(u8 *)(r1 + 9) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
239: r4 = *(u64 *)(r10 - 176) | |
240: *(u8 *)(r1 + 10) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
241: r4 = *(u64 *)(r10 - 128) | |
242: *(u8 *)(r1 + 11) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
243: r4 = *(u64 *)(r10 - 152) | |
244: *(u8 *)(r1 + 12) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
245: r4 = *(u64 *)(r10 - 112) | |
246: *(u8 *)(r1 + 13) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
247: r4 = *(u64 *)(r10 - 104) | |
248: *(u8 *)(r1 + 14) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
249: r4 = *(u64 *)(r10 - 120) | |
250: *(u8 *)(r1 + 15) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
251: r4 = *(u64 *)(r10 - 136) | |
252: *(u8 *)(r1 + 16) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
253: r4 = *(u64 *)(r10 - 88) | |
254: *(u8 *)(r1 + 17) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 2, (ebpf_byte) << 0); | |
255: r4 = *(u64 *)(r10 - 232) | |
256: *(u8 *)(r1 + 18) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 3, (ebpf_byte) << 0); | |
257: r4 = *(u64 *)(r10 - 96) | |
258: *(u8 *)(r1 + 19) = r4 | |
259: r7 = 160 | |
LBB0_15: | |
260: r0 = r7 | |
; if (hd.icmp.ebpf_valid) { | |
261: r4 = *(u64 *)(r10 - 40) | |
262: if r4 == 0 goto 29 | |
; if (ebpf_packetEnd < ebpf_packetStart + BYTES(ebpf_packetOffsetInBits + 32)) { | |
263: r4 = r0 | |
264: r4 += 32 | |
265: r4 >>= 3 | |
266: r5 = r1 | |
267: r5 += r4 | |
268: if r5 > r2 goto 23 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
269: r2 = r0 | |
270: r2 >>= 3 | |
271: r4 = r1 | |
272: r4 += r2 | |
273: r2 = *(u64 *)(r10 - 80) | |
274: *(u8 *)(r4 + 0) = r2 | |
; ebpf_packetOffsetInBits += 8; | |
275: r0 |= 8 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
276: r2 = r0 | |
277: r2 >>= 3 | |
278: r4 = r1 | |
279: r4 += r2 | |
280: r2 = *(u64 *)(r10 - 240) | |
281: *(u8 *)(r4 + 0) = r2 | |
; ebpf_packetOffsetInBits += 8; | |
282: r0 += 8 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 0, (ebpf_byte) << 0); | |
283: r0 >>= 3 | |
284: r2 = r1 | |
285: r2 += r0 | |
286: r4 = *(u64 *)(r10 - 24) | |
287: *(u8 *)(r2 + 0) = r4 | |
; write_byte(ebpf_packetStart, BYTES(ebpf_packetOffsetInBits) + 1, (ebpf_byte) << 0); | |
288: r0 |= 1 | |
289: r1 += r0 | |
290: r2 = *(u64 *)(r10 - 72) | |
291: *(u8 *)(r1 + 0) = r2 | |
LBB0_18: | |
292: r2 = r10 | |
293: r2 += -4 | |
294: r6 = 0 | |
; bpf_map_update_elem(&ebpf_outTable, &ebpf_zero, &xout.output_port, BPF_ANY); | |
295: r1 = 0ll | |
297: r4 = 0 | |
298: call 2 | |
299: r0 = 2 | |
; if (xout.drop) return XDP_DROP; | |
300: r1 = *(u8 *)(r10 - 16) | |
; else return XDP_PASS; | |
301: if r1 == r6 goto 1 | |
302: r0 = 1 | |
LBB0_20: | |
; } | |
303: exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment