Skip to content

Instantly share code, notes, and snippets.

@williamtu
Created February 3, 2017 03:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save williamtu/3e308a14c5795c82d516f934be0560cc to your computer and use it in GitHub Desktop.
Save williamtu/3e308a14c5795c82d516f934be0560cc to your computer and use it in GitHub Desktop.
xdp3.S
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