Skip to content

Instantly share code, notes, and snippets.

@takehaya
Created January 4, 2021 10:23
Show Gist options
  • Save takehaya/a4cdf65ae2aca7ab4c9ad908a2fe931a to your computer and use it in GitHub Desktop.
Save takehaya/a4cdf65ae2aca7ab4c9ad908a2fe931a to your computer and use it in GitHub Desktop.
srv6_bpf.o: file format ELF64-BPF
Disassembly of section xdp_prog:
0000000000000000 srv6_handler:
; {
0: r6 = r1
; void *data_end = (void *)(long)xdp->data_end;
1: r2 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
2: r1 = *(u32 *)(r6 + 0)
; if (iph + 1 > data_end)
3: r3 = r1
4: r3 += 14
; if (v6h + 1 > data_end)
5: r4 = r1
6: r4 += 54
7: r7 = 0
8: r8 = 0
9: if r4 > r2 goto +1 <LBB0_2>
10: r8 = r3
0000000000000058 LBB0_2:
; if (iph + 1 > data_end)
11: r4 = r1
12: r4 += 34
13: if r4 > r2 goto +1 <LBB0_4>
14: r7 = r3
0000000000000078 LBB0_4:
; if (data + sizeof(*eth) > data_end)
15: if r2 >= r3 goto +1 <LBB0_6>
16: goto +2 <LBB0_8>
0000000000000088 LBB0_6:
; if (!iph || !v6h)
17: if r7 == 0 goto +1 <LBB0_8>
18: if r8 != 0 goto +8 <LBB0_10>
0000000000000098 LBB0_8:
19: r8 = 2
20: r1 = r6
21: r2 = 0 ll
23: r3 = 2
00000000000000c0 LBB0_9:
24: call 12
; }
25: r0 = r8
26: exit
00000000000000d8 LBB0_10:
; h_proto = eth->h_proto;
27: r2 = *(u8 *)(r1 + 12)
28: r1 = *(u8 *)(r1 + 13)
29: r1 <<= 8
30: r1 |= r2
; if (h_proto == bpf_htons(ETH_P_IP))
31: if r1 == 56710 goto +229 <LBB0_159>
32: if r1 != 8 goto -14 <LBB0_8>
33: r1 = 32
; v4key.prefixlen = 32;
34: *(u32 *)(r10 - 160) = r1
; v4key.addr = iph->daddr;
35: r1 = *(u32 *)(r7 + 16)
36: *(u32 *)(r10 - 156) = r1
37: r2 = r10
; v4key.prefixlen = 32;
38: r2 += -160
; tb = bpf_map_lookup_elem(&transit_table_v4, &v4key);
39: r1 = 0 ll
41: call 1
; if (tb)
42: if r0 == 0 goto -24 <LBB0_8>
; switch (tb->action)
43: r1 = *(u32 *)(r0 + 44)
44: if r1 == 5 goto +570 <LBB0_76>
45: if r1 != 1 goto -27 <LBB0_8>
46: *(u64 *)(r10 - 168) = r0
; srh_len = sizeof(struct srhhdr) + sizeof(struct in6_addr) * tb->segment_length;
47: r9 = *(u32 *)(r0 + 40)
48: r9 <<= 4
49: r9 |= 8
; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len)))
50: r1 = r9
51: r1 &= 248
52: r2 = -40
53: r2 -= r1
; return xdpcap_exit(xdp, &xdpcap_hook, transit_encap(xdp, tb, IPPROTO_IPIP, bpf_ntohs(iph->tot_len)));
54: r7 = *(u16 *)(r7 + 2)
; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len)))
55: r1 = r6
56: call 44
57: r8 = 2
58: r0 <<= 32
59: r0 >>= 32
60: if r0 != 0 goto +1803 <LBB0_75>
; data_end = (void *)(long)xdp->data_end;
61: r2 = *(u32 *)(r6 + 4)
; data = (void *)(long)xdp->data;
62: r1 = *(u32 *)(r6 + 0)
; if ((void *)((long)new_eth + sizeof(struct ethhdr)) > data_end)
63: r3 = r1
64: r3 += 14
65: if r3 > r2 goto +1798 <LBB0_75>
66: r3 = 221
; new_eth->h_proto = bpf_htons(ETH_P_IPV6);
67: *(u8 *)(r1 + 13) = r3
68: r3 = 134
69: *(u8 *)(r1 + 12) = r3
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) > data_end)
70: r3 = r1
71: r3 += 54
72: if r3 > r2 goto +1791 <LBB0_75>
73: r7 >>= 8
74: r3 = 16427
; v6h->nexthdr = NEXTHDR_ROUTING;
75: *(u16 *)(r1 + 20) = r3
76: r3 = 96
; v6h->priority = 0;
77: *(u8 *)(r1 + 14) = r3
78: r3 = r9
79: r3 &= 255
80: r7 += r3
81: r7 = be16 r7
; v6h->payload_len = bpf_htons(srh_len + innerlen);
82: *(u16 *)(r1 + 18) = r7
83: r4 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&v6h->saddr, &tb->saddr, sizeof(struct in6_addr));
84: r3 = *(u32 *)(r4 + 12)
85: *(u32 *)(r1 + 34) = r3
86: r3 = *(u32 *)(r4 + 8)
87: *(u32 *)(r1 + 30) = r3
88: r3 = *(u32 *)(r4 + 4)
89: *(u32 *)(r1 + 26) = r3
90: r3 = *(u32 *)(r4 + 0)
91: *(u32 *)(r1 + 22) = r3
; if (tb->segment_length == 0 || tb->segment_length > MAX_SEGMENTS)
92: r3 = *(u32 *)(r4 + 40)
93: r3 += -1
94: r3 <<= 32
95: r3 >>= 32
96: if r3 > 4 goto +1767 <LBB0_75>
; __builtin_memcpy(&v6h->daddr, &tb->segments[tb->segment_length - 1], sizeof(struct in6_addr));
97: r3 <<= 4
98: r4 = *(u64 *)(r10 - 168)
99: r4 += r3
100: r3 = *(u32 *)(r4 + 60)
101: *(u32 *)(r1 + 50) = r3
102: r3 = *(u32 *)(r4 + 56)
103: *(u32 *)(r1 + 46) = r3
104: r3 = *(u32 *)(r4 + 52)
105: *(u32 *)(r1 + 42) = r3
106: r3 = *(u32 *)(r4 + 48)
107: *(u32 *)(r1 + 38) = r3
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr)) > data_end)
108: r3 = r1
109: r3 += 62
110: if r3 > r2 goto +1753 <LBB0_75>
111: r4 = 4
; srh->routingType = 4;
112: *(u8 *)(r1 + 56) = r4
; srh->nextHdr = nexthdr;
113: *(u8 *)(r1 + 54) = r4
; srh->hdrExtLen = ((srh_len / 8) - 1);
114: r9 &= 255
115: r9 >>= 3
116: r9 += -1
117: *(u8 *)(r1 + 55) = r9
; srh->segmentsLeft = tb->segment_length - 1;
118: r4 = *(u64 *)(r10 - 168)
119: r4 = *(u32 *)(r4 + 40)
120: r5 = 0
; srh->tag = 0;
121: *(u16 *)(r1 + 60) = r5
; srh->flags = 0;
122: *(u8 *)(r1 + 59) = r5
; srh->segmentsLeft = tb->segment_length - 1;
123: r5 = r4
124: r5 += -1
; srh->lastEntry = tb->segment_length - 1;
125: *(u8 *)(r1 + 58) = r5
; srh->segmentsLeft = tb->segment_length - 1;
126: *(u8 *)(r1 + 57) = r5
; if (i >= tb->segment_length)
127: if r4 == 0 goto +72 <LBB0_31>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
128: r4 = r1
129: r4 += 79
130: if r4 > r2 goto +1733 <LBB0_75>
131: r5 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
132: r4 = *(u32 *)(r5 + 60)
133: *(u32 *)(r3 + 12) = r4
134: r4 = *(u32 *)(r5 + 56)
135: *(u32 *)(r3 + 8) = r4
136: r4 = *(u32 *)(r5 + 52)
137: *(u32 *)(r3 + 4) = r4
138: r4 = *(u32 *)(r5 + 48)
139: *(u32 *)(r3 + 0) = r4
; if (i >= tb->segment_length)
140: r3 = *(u32 *)(r5 + 40)
141: r8 = 2
142: if r8 > r3 goto +57 <LBB0_31>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
143: r3 = r1
144: r3 += 95
145: if r3 > r2 goto +1718 <LBB0_75>
146: r4 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
147: r3 = *(u32 *)(r4 + 76)
148: *(u32 *)(r1 + 90) = r3
149: r3 = *(u32 *)(r4 + 72)
150: *(u32 *)(r1 + 86) = r3
151: r3 = *(u32 *)(r4 + 68)
152: *(u32 *)(r1 + 82) = r3
153: r3 = *(u32 *)(r4 + 64)
154: *(u32 *)(r1 + 78) = r3
; if (i >= tb->segment_length)
155: r3 = *(u32 *)(r4 + 40)
156: r4 = 3
157: if r4 > r3 goto +42 <LBB0_31>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
158: r3 = r1
159: r3 += 111
160: if r3 > r2 goto +1703 <LBB0_75>
161: r4 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
162: r3 = *(u32 *)(r4 + 92)
163: *(u32 *)(r1 + 106) = r3
164: r3 = *(u32 *)(r4 + 88)
165: *(u32 *)(r1 + 102) = r3
166: r3 = *(u32 *)(r4 + 84)
167: *(u32 *)(r1 + 98) = r3
168: r3 = *(u32 *)(r4 + 80)
169: *(u32 *)(r1 + 94) = r3
; if (i >= tb->segment_length)
170: r3 = *(u32 *)(r4 + 40)
171: r4 = 4
172: if r4 > r3 goto +27 <LBB0_31>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
173: r3 = r1
174: r3 += 127
175: if r3 > r2 goto +1688 <LBB0_75>
176: r4 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
177: r3 = *(u32 *)(r4 + 108)
178: *(u32 *)(r1 + 122) = r3
179: r3 = *(u32 *)(r4 + 104)
180: *(u32 *)(r1 + 118) = r3
181: r3 = *(u32 *)(r4 + 100)
182: *(u32 *)(r1 + 114) = r3
183: r3 = *(u32 *)(r4 + 96)
184: *(u32 *)(r1 + 110) = r3
; if (i >= tb->segment_length)
185: r3 = *(u32 *)(r4 + 40)
186: r4 = 5
187: if r4 > r3 goto +12 <LBB0_31>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
188: r3 = r1
189: r3 += 143
190: if r3 > r2 goto +1673 <LBB0_75>
191: r3 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
192: r2 = *(u32 *)(r3 + 124)
193: *(u32 *)(r1 + 138) = r2
194: r2 = *(u32 *)(r3 + 120)
195: *(u32 *)(r1 + 134) = r2
196: r2 = *(u32 *)(r3 + 116)
197: *(u32 *)(r1 + 130) = r2
198: r2 = *(u32 *)(r3 + 112)
199: *(u32 *)(r1 + 126) = r2
0000000000000640 LBB0_31:
; void *data_end = (void *)(long)xdp->data_end;
200: r1 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
201: r7 = *(u32 *)(r6 + 0)
; if (data + sizeof(*eth) > data_end)
202: r2 = r7
203: r2 += 14
204: r8 = 2
205: if r2 > r1 goto +1658 <LBB0_75>
; if (iph + 1 > data_end)
206: r4 = r7
207: r4 += 34
; if (v6h + 1 > data_end)
208: r5 = r7
209: r5 += 54
210: r3 = 0
211: r9 = 0
212: if r5 > r1 goto +1 <LBB0_34>
213: r9 = r2
00000000000006b0 LBB0_34:
; if (iph + 1 > data_end)
214: r5 = 0
215: if r4 > r1 goto +1 <LBB0_36>
216: r5 = r2
00000000000006c8 LBB0_36:
; struct bpf_fib_lookup fib_params = {};
217: *(u64 *)(r10 - 8) = r3
218: *(u64 *)(r10 - 16) = r3
219: *(u64 *)(r10 - 24) = r3
220: *(u64 *)(r10 - 32) = r3
221: *(u64 *)(r10 - 40) = r3
222: *(u64 *)(r10 - 48) = r3
223: *(u64 *)(r10 - 56) = r3
224: *(u64 *)(r10 - 64) = r3
; if (!iph || !v6h)
225: if r5 == 0 goto +1625 <LBB0_74>
226: if r9 == 0 goto +1624 <LBB0_74>
227: *(u64 *)(r10 - 168) = r5
; h_proto = eth->h_proto;
228: r1 = *(u8 *)(r7 + 12)
229: r8 = *(u8 *)(r7 + 13)
230: r2 = 0
; __builtin_memset(&fib_params, 0, sizeof(fib_params));
231: *(u64 *)(r10 - 8) = r2
232: *(u64 *)(r10 - 16) = r2
233: *(u64 *)(r10 - 24) = r2
234: *(u64 *)(r10 - 32) = r2
235: *(u64 *)(r10 - 40) = r2
236: *(u64 *)(r10 - 48) = r2
237: *(u64 *)(r10 - 56) = r2
238: *(u64 *)(r10 - 64) = r2
; h_proto = eth->h_proto;
239: r8 <<= 8
240: r8 |= r1
; switch (h_proto)
241: if r8 == 56710 goto +747 <LBB0_41>
242: r3 = *(u64 *)(r10 - 168)
243: if r8 != 8 goto +1607 <LBB0_74>
244: r1 = 2
; fib_params.family = AF_INET;
245: *(u8 *)(r10 - 64) = r1
; fib_params.tos = iph->tos;
246: r1 = *(u8 *)(r3 + 1)
247: *(u8 *)(r10 - 52) = r1
; fib_params.l4_protocol = iph->protocol;
248: r1 = *(u8 *)(r3 + 9)
249: r2 = 0
; fib_params.dport = 0;
250: *(u16 *)(r10 - 60) = r2
; fib_params.sport = 0;
251: *(u16 *)(r10 - 62) = r2
; fib_params.l4_protocol = iph->protocol;
252: *(u8 *)(r10 - 63) = r1
; fib_params.tot_len = bpf_ntohs(iph->tot_len);
253: r1 = *(u16 *)(r3 + 2)
254: r1 = be16 r1
255: *(u16 *)(r10 - 58) = r1
; fib_params.ipv4_src = iph->saddr;
256: r1 = *(u32 *)(r3 + 12)
257: *(u32 *)(r10 - 48) = r1
; fib_params.ipv4_dst = iph->daddr;
258: r1 = *(u32 *)(r3 + 16)
259: *(u32 *)(r10 - 32) = r1
260: goto +767 <LBB0_43>
0000000000000828 LBB0_159:
261: r1 = 128
; v6key.prefixlen = 128;
262: *(u32 *)(r10 - 160) = r1
; v6key.addr = v6h->daddr;
263: r1 = *(u32 *)(r8 + 36)
264: *(u32 *)(r10 - 144) = r1
265: r1 = *(u32 *)(r8 + 32)
266: *(u32 *)(r10 - 148) = r1
267: r1 = *(u32 *)(r8 + 28)
268: *(u32 *)(r10 - 152) = r1
269: r1 = *(u32 *)(r8 + 24)
270: *(u32 *)(r10 - 156) = r1
; if (v6h->nexthdr == NEXTHDR_ROUTING)
271: r1 = *(u8 *)(r8 + 6)
272: if r1 != 43 goto +123 <LBB0_246>
273: r2 = r10
; ef_table = bpf_map_lookup_elem(&function_table, &v6key);
274: r2 += -160
275: r1 = 0 ll
277: call 1
278: r7 = r0
; if (ef_table)
279: if r7 == 0 goto -261 <LBB0_8>
; switch (ef_table->function)
280: r1 = *(u32 *)(r7 + 32)
281: if r1 == 6 goto +479 <LBB0_206>
282: if r1 != 1 goto -264 <LBB0_8>
283: r1 = 2925175077039727 ll
; bpf_printk("run action_end\n");
285: *(u64 *)(r10 - 56) = r1
286: r1 = 7598807740087956850 ll
288: *(u64 *)(r10 - 64) = r1
289: r1 = r10
290: r1 += -64
291: r2 = 16
292: call 6
293: r1 = 0
; void *data_end = (void *)(long)xdp->data_end;
294: r3 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
295: r4 = *(u32 *)(r6 + 0)
; if (srh + 1 > data_end)
296: r5 = r4
297: r5 += 54
298: r2 = 0
; if (!srh)
299: if r5 == 0 goto +8 <LBB0_167>
300: r0 = r4
301: r0 += 62
302: r2 = 0
303: if r0 > r3 goto +4 <LBB0_167>
; if (srh->segmentsLeft == 0)
304: r0 = *(u8 *)(r4 + 57)
305: r2 = 0
306: if r0 == 0 goto +1 <LBB0_167>
307: r2 = r5
00000000000009a0 LBB0_167:
; if (v6h + 1 > data_end)
308: if r5 > r3 goto +2 <LBB0_169>
309: r4 += 14
310: r1 = r4
00000000000009b8 LBB0_169:
311: r8 = 2
; if (!srhdr || !v6h)
312: if r1 == 0 goto +1551 <LBB0_75>
313: if r2 == 0 goto +1550 <LBB0_75>
; srh->segmentsLeft--;
314: r4 = *(u8 *)(r2 + 3)
315: r4 += -1
316: *(u8 *)(r2 + 3) = r4
; if ((void *)(long)srh + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (srh->segmentsLeft + 1) > data_end)
317: r4 &= 255
318: r4 <<= 4
319: r5 = r4
320: r5 += r2
321: r5 += 24
322: if r5 > r3 goto +1541 <LBB0_75>
; addr = srh->segments + srh->segmentsLeft;
323: r2 += r4
; if (addr + 1 > data_end)
324: r4 = r2
325: r4 += 24
326: if r4 > r3 goto +1537 <LBB0_75>
327: r1 += 24
328: r2 += 8
; *daddr = *addr;
329: r3 = *(u32 *)(r2 + 12)
330: *(u32 *)(r1 + 12) = r3
331: r3 = *(u32 *)(r2 + 8)
332: *(u32 *)(r1 + 8) = r3
333: r3 = *(u32 *)(r2 + 4)
334: *(u32 *)(r1 + 4) = r3
335: r2 = *(u32 *)(r2 + 0)
336: *(u32 *)(r1 + 0) = r2
; void *data_end = (void *)(long)xdp->data_end;
337: r1 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
338: r7 = *(u32 *)(r6 + 0)
; if (data + sizeof(*eth) > data_end)
339: r2 = r7
340: r2 += 14
341: if r2 > r1 goto +1522 <LBB0_75>
; if (iph + 1 > data_end)
342: r4 = r7
343: r4 += 34
; if (v6h + 1 > data_end)
344: r5 = r7
345: r5 += 54
346: r3 = 0
347: r9 = 0
348: if r5 > r1 goto +1 <LBB0_176>
349: r9 = r2
0000000000000af0 LBB0_176:
; if (iph + 1 > data_end)
350: r5 = 0
351: if r4 > r1 goto +1 <LBB0_178>
352: r5 = r2
0000000000000b08 LBB0_178:
; struct bpf_fib_lookup fib_params = {};
353: *(u64 *)(r10 - 8) = r3
354: *(u64 *)(r10 - 16) = r3
355: *(u64 *)(r10 - 24) = r3
356: *(u64 *)(r10 - 32) = r3
357: *(u64 *)(r10 - 40) = r3
358: *(u64 *)(r10 - 48) = r3
359: *(u64 *)(r10 - 56) = r3
360: *(u64 *)(r10 - 64) = r3
; if (!iph || !v6h)
361: if r5 == 0 goto +1489 <LBB0_74>
362: if r9 == 0 goto +1488 <LBB0_74>
; h_proto = eth->h_proto;
363: r1 = *(u8 *)(r7 + 12)
364: r8 = *(u8 *)(r7 + 13)
365: r2 = 0
; __builtin_memset(&fib_params, 0, sizeof(fib_params));
366: *(u64 *)(r10 - 8) = r2
367: *(u64 *)(r10 - 16) = r2
368: *(u64 *)(r10 - 24) = r2
369: *(u64 *)(r10 - 32) = r2
370: *(u64 *)(r10 - 40) = r2
371: *(u64 *)(r10 - 48) = r2
372: *(u64 *)(r10 - 56) = r2
373: *(u64 *)(r10 - 64) = r2
; h_proto = eth->h_proto;
374: r8 <<= 8
375: r8 |= r1
; switch (h_proto)
376: if r8 == 56710 goto +488 <LBB0_183>
377: if r8 != 8 goto +1473 <LBB0_74>
378: r1 = 2
; fib_params.family = AF_INET;
379: *(u8 *)(r10 - 64) = r1
; fib_params.tos = iph->tos;
380: r1 = *(u8 *)(r5 + 1)
381: *(u8 *)(r10 - 52) = r1
; fib_params.l4_protocol = iph->protocol;
382: r1 = *(u8 *)(r5 + 9)
383: r2 = 0
; fib_params.dport = 0;
384: *(u16 *)(r10 - 60) = r2
; fib_params.sport = 0;
385: *(u16 *)(r10 - 62) = r2
; fib_params.l4_protocol = iph->protocol;
386: *(u8 *)(r10 - 63) = r1
; fib_params.tot_len = bpf_ntohs(iph->tot_len);
387: r1 = *(u16 *)(r5 + 2)
388: r1 = be16 r1
389: *(u16 *)(r10 - 58) = r1
; fib_params.ipv4_src = iph->saddr;
390: r1 = *(u32 *)(r5 + 12)
391: *(u32 *)(r10 - 48) = r1
392: *(u64 *)(r10 - 168) = r5
; fib_params.ipv4_dst = iph->daddr;
393: r1 = *(u32 *)(r5 + 16)
394: *(u32 *)(r10 - 32) = r1
395: goto +509 <LBB0_185>
0000000000000c60 LBB0_246:
396: r2 = r10
; tb = bpf_map_lookup_elem(&transit_table_v6, &v6key);
397: r2 += -160
398: r1 = 0 ll
400: call 1
401: r7 = r0
; if (tb)
402: if r7 == 0 goto -384 <LBB0_8>
; switch (tb->action)
403: r1 = *(u32 *)(r7 + 44)
404: if r1 != 1 goto -386 <LBB0_8>
; srh_len = sizeof(struct srhhdr) + sizeof(struct in6_addr) * tb->segment_length;
405: r9 = *(u32 *)(r7 + 40)
406: r9 <<= 4
407: r9 |= 8
; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len)))
408: r1 = r9
409: r1 &= 248
410: r2 = -40
411: r2 -= r1
; return xdpcap_exit(xdp, &xdpcap_hook, transit_encap(xdp, tb, IPPROTO_IPV6, v6h->payload_len));
412: r1 = *(u16 *)(r8 + 4)
; if (bpf_xdp_adjust_head(xdp, 0 - (int)(sizeof(struct ipv6hdr) + srh_len)))
413: *(u64 *)(r10 - 168) = r1
414: r1 = r6
415: call 44
416: r8 = 2
417: r0 <<= 32
418: r0 >>= 32
419: if r0 != 0 goto +1444 <LBB0_75>
; data_end = (void *)(long)xdp->data_end;
420: r2 = *(u32 *)(r6 + 4)
; data = (void *)(long)xdp->data;
421: r1 = *(u32 *)(r6 + 0)
; if ((void *)((long)new_eth + sizeof(struct ethhdr)) > data_end)
422: r3 = r1
423: r3 += 14
424: if r3 > r2 goto +1439 <LBB0_75>
425: r3 = 221
; new_eth->h_proto = bpf_htons(ETH_P_IPV6);
426: *(u8 *)(r1 + 13) = r3
427: r3 = 134
428: *(u8 *)(r1 + 12) = r3
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) > data_end)
429: r3 = r1
430: r3 += 54
431: if r3 > r2 goto +1432 <LBB0_75>
432: r4 = *(u64 *)(r10 - 168)
433: r4 &= 255
434: r3 = 16427
; v6h->nexthdr = NEXTHDR_ROUTING;
435: *(u16 *)(r1 + 20) = r3
436: r3 = 96
; v6h->priority = 0;
437: *(u8 *)(r1 + 14) = r3
438: r3 = r9
439: r3 &= 255
440: r4 += r3
441: r4 = be16 r4
; v6h->payload_len = bpf_htons(srh_len + innerlen);
442: *(u16 *)(r1 + 18) = r4
; __builtin_memcpy(&v6h->saddr, &tb->saddr, sizeof(struct in6_addr));
443: r3 = *(u32 *)(r7 + 12)
444: *(u32 *)(r1 + 34) = r3
445: r3 = *(u32 *)(r7 + 8)
446: *(u32 *)(r1 + 30) = r3
447: r3 = *(u32 *)(r7 + 4)
448: *(u32 *)(r1 + 26) = r3
449: r3 = *(u32 *)(r7 + 0)
450: *(u32 *)(r1 + 22) = r3
; if (tb->segment_length == 0 || tb->segment_length > MAX_SEGMENTS)
451: r3 = *(u32 *)(r7 + 40)
452: r3 += -1
453: r3 <<= 32
454: r3 >>= 32
455: if r3 > 4 goto +1408 <LBB0_75>
; __builtin_memcpy(&v6h->daddr, &tb->segments[tb->segment_length - 1], sizeof(struct in6_addr));
456: r3 <<= 4
457: r4 = r7
458: r4 += r3
459: r3 = *(u32 *)(r4 + 60)
460: *(u32 *)(r1 + 50) = r3
461: r3 = *(u32 *)(r4 + 56)
462: *(u32 *)(r1 + 46) = r3
463: r3 = *(u32 *)(r4 + 52)
464: *(u32 *)(r1 + 42) = r3
465: r3 = *(u32 *)(r4 + 48)
466: *(u32 *)(r1 + 38) = r3
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr)) > data_end)
467: r3 = r1
468: r3 += 62
469: if r3 > r2 goto +1394 <LBB0_75>
470: r4 = 4
; srh->routingType = 4;
471: *(u8 *)(r1 + 56) = r4
472: r4 = 41
; srh->nextHdr = nexthdr;
473: *(u8 *)(r1 + 54) = r4
; srh->hdrExtLen = ((srh_len / 8) - 1);
474: r9 &= 255
475: r9 >>= 3
476: r9 += -1
477: *(u8 *)(r1 + 55) = r9
; srh->segmentsLeft = tb->segment_length - 1;
478: r4 = *(u32 *)(r7 + 40)
479: r5 = 0
; srh->tag = 0;
480: *(u16 *)(r1 + 60) = r5
; srh->flags = 0;
481: *(u8 *)(r1 + 59) = r5
; srh->segmentsLeft = tb->segment_length - 1;
482: r5 = r4
483: r5 += -1
; srh->lastEntry = tb->segment_length - 1;
484: *(u8 *)(r1 + 58) = r5
; srh->segmentsLeft = tb->segment_length - 1;
485: *(u8 *)(r1 + 57) = r5
; if (i >= tb->segment_length)
486: if r4 == 0 goto +67 <LBB0_264>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
487: r4 = r1
488: r4 += 79
489: if r4 > r2 goto +1374 <LBB0_75>
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
490: r4 = *(u32 *)(r7 + 60)
491: *(u32 *)(r3 + 12) = r4
492: r4 = *(u32 *)(r7 + 56)
493: *(u32 *)(r3 + 8) = r4
494: r4 = *(u32 *)(r7 + 52)
495: *(u32 *)(r3 + 4) = r4
496: r4 = *(u32 *)(r7 + 48)
497: *(u32 *)(r3 + 0) = r4
; if (i >= tb->segment_length)
498: r3 = *(u32 *)(r7 + 40)
499: r8 = 2
500: if r8 > r3 goto +53 <LBB0_264>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
501: r3 = r1
502: r3 += 95
503: if r3 > r2 goto +1360 <LBB0_75>
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
504: r3 = *(u32 *)(r7 + 76)
505: *(u32 *)(r1 + 90) = r3
506: r3 = *(u32 *)(r7 + 72)
507: *(u32 *)(r1 + 86) = r3
508: r3 = *(u32 *)(r7 + 68)
509: *(u32 *)(r1 + 82) = r3
510: r3 = *(u32 *)(r7 + 64)
511: *(u32 *)(r1 + 78) = r3
; if (i >= tb->segment_length)
512: r3 = *(u32 *)(r7 + 40)
513: r4 = 3
514: if r4 > r3 goto +39 <LBB0_264>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
515: r3 = r1
516: r3 += 111
517: if r3 > r2 goto +1346 <LBB0_75>
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
518: r3 = *(u32 *)(r7 + 92)
519: *(u32 *)(r1 + 106) = r3
520: r3 = *(u32 *)(r7 + 88)
521: *(u32 *)(r1 + 102) = r3
522: r3 = *(u32 *)(r7 + 84)
523: *(u32 *)(r1 + 98) = r3
524: r3 = *(u32 *)(r7 + 80)
525: *(u32 *)(r1 + 94) = r3
; if (i >= tb->segment_length)
526: r3 = *(u32 *)(r7 + 40)
527: r4 = 4
528: if r4 > r3 goto +25 <LBB0_264>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
529: r3 = r1
530: r3 += 127
531: if r3 > r2 goto +1332 <LBB0_75>
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
532: r3 = *(u32 *)(r7 + 108)
533: *(u32 *)(r1 + 122) = r3
534: r3 = *(u32 *)(r7 + 104)
535: *(u32 *)(r1 + 118) = r3
536: r3 = *(u32 *)(r7 + 100)
537: *(u32 *)(r1 + 114) = r3
538: r3 = *(u32 *)(r7 + 96)
539: *(u32 *)(r1 + 110) = r3
; if (i >= tb->segment_length)
540: r3 = *(u32 *)(r7 + 40)
541: r4 = 5
542: if r4 > r3 goto +11 <LBB0_264>
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 1) + 1) > data_end)
543: r3 = r1
544: r3 += 143
545: if r3 > r2 goto +1318 <LBB0_75>
; __builtin_memcpy(&srh->segments[i], &tb->segments[i], sizeof(struct in6_addr));
546: r2 = *(u32 *)(r7 + 124)
547: *(u32 *)(r1 + 138) = r2
548: r2 = *(u32 *)(r7 + 120)
549: *(u32 *)(r1 + 134) = r2
550: r2 = *(u32 *)(r7 + 116)
551: *(u32 *)(r1 + 130) = r2
552: r2 = *(u32 *)(r7 + 112)
553: *(u32 *)(r1 + 126) = r2
0000000000001150 LBB0_264:
; void *data_end = (void *)(long)xdp->data_end;
554: r1 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
555: r7 = *(u32 *)(r6 + 0)
; if (data + sizeof(*eth) > data_end)
556: r2 = r7
557: r2 += 14
558: r8 = 2
559: if r2 > r1 goto +1304 <LBB0_75>
; if (iph + 1 > data_end)
560: r4 = r7
561: r4 += 34
; if (v6h + 1 > data_end)
562: r5 = r7
563: r5 += 54
564: r3 = 0
565: r9 = 0
566: if r5 > r1 goto +1 <LBB0_267>
567: r9 = r2
00000000000011c0 LBB0_267:
; if (iph + 1 > data_end)
568: r5 = 0
569: if r4 > r1 goto +1 <LBB0_269>
570: r5 = r2
00000000000011d8 LBB0_269:
; struct bpf_fib_lookup fib_params = {};
571: *(u64 *)(r10 - 8) = r3
572: *(u64 *)(r10 - 16) = r3
573: *(u64 *)(r10 - 24) = r3
574: *(u64 *)(r10 - 32) = r3
575: *(u64 *)(r10 - 40) = r3
576: *(u64 *)(r10 - 48) = r3
577: *(u64 *)(r10 - 56) = r3
578: *(u64 *)(r10 - 64) = r3
579: *(u64 *)(r10 - 168) = r5
; if (!iph || !v6h)
580: if r5 == 0 goto +1270 <LBB0_74>
581: if r9 == 0 goto +1269 <LBB0_74>
; h_proto = eth->h_proto;
582: r1 = *(u8 *)(r7 + 12)
583: r8 = *(u8 *)(r7 + 13)
584: r2 = 0
; __builtin_memset(&fib_params, 0, sizeof(fib_params));
585: *(u64 *)(r10 - 8) = r2
586: *(u64 *)(r10 - 16) = r2
587: *(u64 *)(r10 - 24) = r2
588: *(u64 *)(r10 - 32) = r2
589: *(u64 *)(r10 - 40) = r2
590: *(u64 *)(r10 - 48) = r2
591: *(u64 *)(r10 - 56) = r2
592: *(u64 *)(r10 - 64) = r2
; h_proto = eth->h_proto;
593: r8 <<= 8
594: r8 |= r1
; switch (h_proto)
595: if r8 == 56710 goto +455 <LBB0_274>
596: if r8 != 8 goto +1254 <LBB0_74>
597: r1 = 2
; fib_params.family = AF_INET;
598: *(u8 *)(r10 - 64) = r1
599: r3 = *(u64 *)(r10 - 168)
; fib_params.tos = iph->tos;
600: r1 = *(u8 *)(r3 + 1)
601: *(u8 *)(r10 - 52) = r1
; fib_params.l4_protocol = iph->protocol;
602: r1 = *(u8 *)(r3 + 9)
603: r2 = 0
; fib_params.dport = 0;
604: *(u16 *)(r10 - 60) = r2
; fib_params.sport = 0;
605: *(u16 *)(r10 - 62) = r2
; fib_params.l4_protocol = iph->protocol;
606: *(u8 *)(r10 - 63) = r1
; fib_params.tot_len = bpf_ntohs(iph->tot_len);
607: r1 = *(u16 *)(r3 + 2)
608: r1 = be16 r1
609: *(u16 *)(r10 - 58) = r1
; fib_params.ipv4_src = iph->saddr;
610: r1 = *(u32 *)(r3 + 12)
611: *(u32 *)(r10 - 48) = r1
; fib_params.ipv4_dst = iph->daddr;
612: r1 = *(u32 *)(r3 + 16)
613: *(u32 *)(r10 - 32) = r1
614: goto +475 <LBB0_276>
0000000000001338 LBB0_76:
; void *data = (void *)(unsigned long)xdp->data;
615: r1 = *(u32 *)(r6 + 0)
616: r8 = 2
; if (!iph)
617: if r1 == -14 goto +1246 <LBB0_75>
618: r2 = *(u32 *)(r6 + 4)
619: r3 = r1
620: r3 += 34
621: r8 = 2
622: if r3 > r2 goto +1241 <LBB0_75>
623: r3 = r1
624: r3 += 50
625: r8 = 2
; if (iph->protocol != IPPROTO_UDP)
626: if r3 > r2 goto +1237 <LBB0_75>
627: r2 = *(u8 *)(r1 + 23)
628: r8 = 2
629: if r2 != 17 goto +1234 <LBB0_75>
; __builtin_memmove(&outer_saddr, &iph->saddr, sizeof(__u32));
630: r2 = *(u32 *)(r1 + 26)
631: *(u32 *)(r10 - 72) = r2
; __builtin_memmove(&outer_daddr, &iph->daddr, sizeof(__u32));
632: r2 = *(u32 *)(r1 + 30)
633: *(u32 *)(r10 - 76) = r2
; type = gtp1h->type;
634: r2 = *(u8 *)(r1 + 43)
635: r8 = 1
; if (type != GTPV1_GPDU)
636: if r2 != 255 goto +1227 <LBB0_75>
; if (tb->s_prefixlen == 0 || tb->d_prefixlen == 0 ||
637: r2 = *(u32 *)(r0 + 32)
638: r8 = 1
639: if r2 == 0 goto +1224 <LBB0_75>
640: r8 = 1
641: if r2 > 96 goto +1222 <LBB0_75>
642: r2 = *(u32 *)(r0 + 36)
643: r2 += -1
644: r2 <<= 32
645: r2 >>= 32
646: r8 = 1
647: if r2 > 55 goto +1216 <LBB0_75>
648: r2 = *(u32 *)(r1 + 46)
649: *(u64 *)(r10 - 176) = r2
650: r9 = *(u16 *)(r1 + 44)
; __u32 seg_len = tb->segment_length + 1;
651: r7 = *(u32 *)(r0 + 40)
; if (bpf_xdp_adjust_head(xdp, (int)(decap_len)))
652: r1 = r6
653: r2 = 36
654: *(u64 *)(r10 - 168) = r0
655: call 44
656: r0 <<= 32
657: r0 >>= 32
658: r8 = 2
659: if r0 != 0 goto +1204 <LBB0_75>
660: r7 += 1
661: r1 = r7
662: r1 <<= 4
663: r1 |= 8
664: *(u64 *)(r10 - 184) = r1
; encap_len = sizeof(struct ipv6hdr) + srh_len;
665: r1 &= 255
666: r2 = -40
; if (bpf_xdp_adjust_head(xdp, 0 - (int)(encap_len)))
667: r2 -= r1
668: r1 = r6
669: call 44
670: r3 = *(u64 *)(r10 - 168)
671: r0 <<= 32
672: r0 >>= 32
673: r8 = 2
674: if r0 != 0 goto +1189 <LBB0_75>
; data_end = (void *)(long)xdp->data_end;
675: r1 = *(u32 *)(r6 + 4)
; data = (void *)(long)xdp->data;
676: r5 = *(u32 *)(r6 + 0)
; if ((void *)((long)new_eth + sizeof(struct ethhdr)) > data_end)
677: r2 = r5
678: r2 += 14
679: r8 = 1
680: if r2 > r1 goto +1183 <LBB0_75>
681: r2 = 221
; new_eth->h_proto = bpf_htons(ETH_P_IPV6);
682: *(u8 *)(r5 + 13) = r2
683: r2 = 134
684: *(u8 *)(r5 + 12) = r2
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr)) > data_end)
685: r2 = r5
686: r2 += 54
687: r8 = 1
688: if r2 > r1 goto +1175 <LBB0_75>
689: r9 = be16 r9
690: r7 &= 65535
691: r2 = 16427
; v6h->nexthdr = NEXTHDR_ROUTING;
692: *(u16 *)(r5 + 20) = r2
693: r2 = 96
; v6h->priority = 0;
694: *(u8 *)(r5 + 14) = r2
695: r2 = *(u64 *)(r10 - 184)
696: r2 &= 255
697: r9 += r2
698: r9 = be16 r9
; v6h->payload_len = bpf_htons(srh_len + innerlen);
699: *(u16 *)(r5 + 18) = r9
; __builtin_memcpy(&v6h->saddr, &tb->saddr, sizeof(struct in6_addr));
700: r2 = *(u32 *)(r3 + 4)
701: *(u32 *)(r5 + 26) = r2
702: r2 = *(u32 *)(r3 + 0)
703: *(u32 *)(r5 + 22) = r2
704: r2 = *(u32 *)(r3 + 12)
705: *(u32 *)(r5 + 34) = r2
706: r2 = *(u32 *)(r3 + 8)
707: *(u32 *)(r5 + 30) = r2
; if (seg_len < 1 || MAX_SEGMENTS < seg_len)
708: r2 = r7
709: r2 += -1
710: *(u64 *)(r10 - 200) = r2
711: r2 <<= 32
712: r2 >>= 32
713: r8 = 1
714: if r2 > 4 goto +1149 <LBB0_75>
715: *(u64 *)(r10 - 192) = r7
; __builtin_memcpy(&v6h->daddr, &tb->segments[seg_len - 1], sizeof(struct in6_addr));
716: r2 <<= 4
717: r0 = r3
718: r0 += 48
719: *(u64 *)(r10 - 208) = r0
720: r0 += r2
721: r2 = *(u32 *)(r0 + 12)
722: *(u32 *)(r5 + 50) = r2
723: r2 = *(u32 *)(r0 + 8)
724: *(u32 *)(r5 + 46) = r2
725: r2 = *(u32 *)(r0 + 4)
726: *(u32 *)(r5 + 42) = r2
727: r2 = *(u32 *)(r0 + 0)
728: *(u32 *)(r5 + 38) = r2
; s_offset = tb->s_prefixlen / 8;
729: r0 = *(u32 *)(r3 + 32)
; d_offset = tb->d_prefixlen / 8;
730: r2 = *(u32 *)(r3 + 36)
; args.session.pdu_session_id = tid;
731: *(u64 *)(r10 - 216) = r2
732: r3 = *(u64 *)(r10 - 176)
733: r2 = r3
734: r2 >>= 24
735: *(u8 *)(r10 - 84) = r2
736: r2 = r3
737: r2 >>= 16
738: *(u8 *)(r10 - 85) = r2
739: r2 = r3
740: r2 >>= 8
741: *(u8 *)(r10 - 86) = r2
742: *(u8 *)(r10 - 87) = r3
743: r2 = 0
; args.u = 0;
744: *(u8 *)(r10 - 88) = r2
745: r2 = r0
746: r2 &= 524256
; if (sizeof(struct in6_addr) <= offset ||
747: if r2 > 88 goto +565 <LBB0_99>
748: r7 = r0
749: r7 >>= 3
750: r7 &= 65535
751: if r7 > 15 goto +561 <LBB0_99>
752: r0 &= 7
; if (shift == 0)
753: if r0 == 0 goto +540 <LBB0_94>
; for (__u16 index = 0; index < sizeof(struct in6_addr); index++)
754: r3 = r5
755: r3 += r7
756: r2 = 8
757: r2 -= r0
758: *(u64 *)(r10 - 176) = r2
759: r9 = 0
760: goto +615 <LBB0_93>
00000000000017c8 LBB0_206:
; void *data_end = (void *)(long)xdp->data_end;
761: r1 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
762: r4 = *(u32 *)(r6 + 0)
; if (srh + 1 > data_end)
763: r3 = r4
764: r3 += 54
765: r5 = r4
766: r5 += 62
767: r2 = 0
768: if r5 > r1 goto +1 <LBB0_208>
769: r2 = r3
0000000000001810 LBB0_208:
770: r8 = 2
; if (!srh || !v6h)
771: if r4 == -14 goto +1092 <LBB0_75>
772: r8 = 2
773: if r3 > r1 goto +1090 <LBB0_75>
774: r8 = 2
775: if r2 == 0 goto +1088 <LBB0_75>
; if (bpf_xdp_adjust_head(xdp, (int)(sizeof(struct ipv6hdr) + (srh->hdrExtLen + 1) * 8)))
776: r2 = *(u8 *)(r2 + 1)
777: r2 <<= 3
778: r2 += 48
779: r1 = r6
780: call 44
781: r0 <<= 32
782: r0 >>= 32
783: r8 = 2
784: if r0 != 0 goto +1079 <LBB0_75>
785: r8 = 1
; data_end = (void *)(unsigned long)xdp->data_end;
786: r1 = *(u32 *)(r6 + 4)
; data = (void *)(unsigned long)xdp->data;
787: r9 = *(u32 *)(r6 + 0)
; if (new_eth + 1 > data_end)
788: r2 = r9
789: r2 += 14
790: if r2 > r1 goto +1073 <LBB0_75>
791: r3 = 0
; new_eth->h_proto = bpf_htons(proto);
792: *(u8 *)(r9 + 13) = r3
793: r3 = 8
794: *(u8 *)(r9 + 12) = r3
795: r8 = 2
; if (!iph)
796: if r2 == 0 goto +1067 <LBB0_75>
797: r3 = r9
798: r3 += 34
799: r8 = 2
800: if r3 > r1 goto +1063 <LBB0_75>
; iph->daddr = ef->nexthop.v4.addr;
801: r3 = *(u32 *)(r7 + 16)
802: *(u32 *)(r9 + 30) = r3
803: r3 = 0
; iph->check = 0;
804: *(u16 *)(r9 + 24) = r3
805: r4 = 14
0000000000001930 LBB0_216:
; csum += *next_iph_u16++;
806: r5 = r9
807: r5 += r4
808: r5 = *(u16 *)(r5 + 0)
809: r3 += r5
; for (i = 0; i < (sizeof(*iph) >> 1); i++)
810: r4 += 2
811: r5 = r4
812: r5 <<= 32
813: r5 >>= 32
814: if r5 != 34 goto -9 <LBB0_216>
; iph->check = ~((csum & 0xffff) + (csum >> 16));
815: r4 = r3
816: r4 >>= 16
817: r4 += r3
818: r4 ^= -1
819: *(u16 *)(r9 + 24) = r4
820: r8 = 2
; if (data + sizeof(*eth) > data_end)
821: if r2 > r1 goto +1042 <LBB0_75>
822: r2 = 0
; struct bpf_fib_lookup fib_params = {};
823: *(u64 *)(r10 - 8) = r2
824: *(u64 *)(r10 - 16) = r2
825: *(u64 *)(r10 - 24) = r2
826: *(u64 *)(r10 - 32) = r2
827: *(u64 *)(r10 - 40) = r2
828: *(u64 *)(r10 - 48) = r2
829: *(u64 *)(r10 - 56) = r2
830: *(u64 *)(r10 - 64) = r2
; if (v6h + 1 > data_end)
831: r3 = r9
832: r3 += 54
; if (!iph || !v6h)
833: if r3 > r1 goto +1017 <LBB0_74>
; h_proto = eth->h_proto;
834: r1 = *(u8 *)(r9 + 12)
835: r7 = *(u8 *)(r9 + 13)
; __builtin_memset(&fib_params, 0, sizeof(fib_params));
836: *(u64 *)(r10 - 8) = r2
837: *(u64 *)(r10 - 16) = r2
838: *(u64 *)(r10 - 24) = r2
839: *(u64 *)(r10 - 32) = r2
840: *(u64 *)(r10 - 40) = r2
841: *(u64 *)(r10 - 48) = r2
842: *(u64 *)(r10 - 56) = r2
843: *(u64 *)(r10 - 64) = r2
; h_proto = eth->h_proto;
844: r7 <<= 8
845: r7 |= r1
; switch (h_proto)
846: if r7 == 56710 goto +81 <LBB0_222>
847: if r7 != 8 goto +1003 <LBB0_74>
848: r1 = 2
; fib_params.family = AF_INET;
849: *(u8 *)(r10 - 64) = r1
; fib_params.tos = iph->tos;
850: r1 = *(u8 *)(r9 + 15)
851: *(u8 *)(r10 - 52) = r1
; fib_params.l4_protocol = iph->protocol;
852: r1 = *(u8 *)(r9 + 23)
853: r2 = 0
; fib_params.dport = 0;
854: *(u16 *)(r10 - 60) = r2
; fib_params.sport = 0;
855: *(u16 *)(r10 - 62) = r2
; fib_params.l4_protocol = iph->protocol;
856: *(u8 *)(r10 - 63) = r1
; fib_params.tot_len = bpf_ntohs(iph->tot_len);
857: r1 = *(u16 *)(r9 + 16)
858: r1 = be16 r1
859: *(u16 *)(r10 - 58) = r1
; fib_params.ipv4_src = iph->saddr;
860: r1 = *(u32 *)(r9 + 26)
861: *(u32 *)(r10 - 48) = r1
; fib_params.ipv4_dst = iph->daddr;
862: r1 = *(u32 *)(r9 + 30)
863: *(u32 *)(r10 - 32) = r1
864: goto +102 <LBB0_224>
0000000000001b08 LBB0_183:
; if (v6h->hop_limit <= 1)
865: r1 = *(u8 *)(r9 + 7)
866: r2 = 2
867: if r2 > r1 goto +983 <LBB0_74>
868: *(u64 *)(r10 - 168) = r5
869: r1 = 10
; fib_params.family = AF_INET6;
870: *(u8 *)(r10 - 64) = r1
871: r1 = 0
; fib_params.tos = 0;
872: *(u8 *)(r10 - 52) = r1
; fib_params.flowinfo = *(__be32 *)v6h & IPV6_FLOWINFO_MASK;
873: r2 = *(u32 *)(r9 + 0)
874: r3 = 4294967055 ll
876: r2 &= r3
877: *(u32 *)(r10 - 52) = r2
; fib_params.l4_protocol = v6h->nexthdr;
878: r2 = *(u8 *)(r9 + 6)
; fib_params.dport = 0;
879: *(u16 *)(r10 - 60) = r1
; fib_params.sport = 0;
880: *(u16 *)(r10 - 62) = r1
; fib_params.l4_protocol = v6h->nexthdr;
881: *(u8 *)(r10 - 63) = r2
; fib_params.tot_len = bpf_ntohs(v6h->payload_len);
882: r1 = *(u16 *)(r9 + 4)
883: r1 = be16 r1
884: *(u16 *)(r10 - 58) = r1
; *src = v6h->saddr;
885: r1 = *(u32 *)(r9 + 12)
886: r1 <<= 32
887: r2 = *(u32 *)(r9 + 8)
888: r1 |= r2
889: *(u64 *)(r10 - 48) = r1
890: r1 = *(u32 *)(r9 + 20)
891: r1 <<= 32
892: r2 = *(u32 *)(r9 + 16)
893: r1 |= r2
894: *(u64 *)(r10 - 40) = r1
; *dst = v6h->daddr;
895: r1 = *(u32 *)(r9 + 36)
896: r1 <<= 32
897: r2 = *(u32 *)(r9 + 32)
898: r1 |= r2
899: *(u64 *)(r10 - 24) = r1
900: r1 = *(u32 *)(r9 + 24)
901: r2 = *(u32 *)(r9 + 28)
902: r2 <<= 32
903: r2 |= r1
904: *(u64 *)(r10 - 32) = r2
0000000000001c48 LBB0_185:
; fib_params.ifindex = xdp->ingress_ifindex;
905: r1 = *(u32 *)(r6 + 12)
906: *(u32 *)(r10 - 56) = r1
907: r2 = r10
908: r2 += -64
; int rc = bpf_fib_lookup(xdp, &fib_params, sizeof(fib_params), flag);
909: r1 = r6
910: r3 = 64
911: r4 = 0
912: call 69
; switch (rc)
913: r0 <<= 32
914: r0 >>= 32
915: if r0 s> 3 goto +4 <LBB0_191>
916: if r0 s> 1 goto +65 <LBB0_189>
917: if r0 == 0 goto +194 <LBB0_197>
918: if r0 == 1 goto +186 <LBB0_60>
919: goto +931 <LBB0_74>
0000000000001cc0 LBB0_191:
920: if r0 s> 5 goto +3 <LBB0_194>
921: if r0 == 4 goto +858 <LBB0_293>
922: if r0 == 5 goto +208 <LBB0_72>
923: goto +927 <LBB0_74>
0000000000001ce0 LBB0_194:
924: if r0 == 6 goto +876 <LBB0_294>
925: if r0 == 7 goto +890 <LBB0_295>
926: if r0 == 8 goto +232 <LBB0_296>
927: goto +923 <LBB0_74>
0000000000001d00 LBB0_222:
; if (v6h->hop_limit <= 1)
928: r1 = *(u8 *)(r9 + 21)
929: r2 = 2
930: if r2 > r1 goto +920 <LBB0_74>
931: r1 = 10
; fib_params.family = AF_INET6;
932: *(u8 *)(r10 - 64) = r1
933: r1 = 0
; fib_params.tos = 0;
934: *(u8 *)(r10 - 52) = r1
; fib_params.flowinfo = *(__be32 *)v6h & IPV6_FLOWINFO_MASK;
935: r2 = *(u32 *)(r9 + 14)
936: r3 = 4294967055 ll
938: r2 &= r3
939: *(u32 *)(r10 - 52) = r2
; fib_params.l4_protocol = v6h->nexthdr;
940: r2 = *(u8 *)(r9 + 20)
; fib_params.dport = 0;
941: *(u16 *)(r10 - 60) = r1
; fib_params.sport = 0;
942: *(u16 *)(r10 - 62) = r1
; fib_params.l4_protocol = v6h->nexthdr;
943: *(u8 *)(r10 - 63) = r2
; fib_params.tot_len = bpf_ntohs(v6h->payload_len);
944: r1 = *(u16 *)(r9 + 18)
945: r1 = be16 r1
946: *(u16 *)(r10 - 58) = r1
; *src = v6h->saddr;
947: r1 = *(u32 *)(r9 + 26)
948: r1 <<= 32
949: r2 = *(u32 *)(r9 + 22)
950: r1 |= r2
951: *(u64 *)(r10 - 48) = r1
952: r1 = *(u32 *)(r9 + 34)
953: r1 <<= 32
954: r2 = *(u32 *)(r9 + 30)
955: r1 |= r2
956: *(u64 *)(r10 - 40) = r1
; *dst = v6h->daddr;
957: r1 = *(u32 *)(r9 + 50)
958: r1 <<= 32
959: r2 = *(u32 *)(r9 + 46)
960: r1 |= r2
961: *(u64 *)(r10 - 24) = r1
962: r1 = *(u32 *)(r9 + 38)
963: r2 = *(u32 *)(r9 + 42)
964: r2 <<= 32
965: r2 |= r1
966: *(u64 *)(r10 - 32) = r2
0000000000001e38 LBB0_224:
; fib_params.ifindex = xdp->ingress_ifindex;
967: r1 = *(u32 *)(r6 + 12)
968: *(u32 *)(r10 - 56) = r1
969: r2 = r10
970: r2 += -64
; int rc = bpf_fib_lookup(xdp, &fib_params, sizeof(fib_params), flag);
971: r1 = r6
972: r3 = 64
973: r4 = 0
974: call 69
; switch (rc)
975: r0 <<= 32
976: r0 >>= 32
977: if r0 s> 3 goto +7 <LBB0_230>
978: if r0 s> 1 goto +169 <LBB0_228>
979: if r0 == 0 goto +189 <LBB0_236>
980: if r0 == 1 goto +124 <LBB0_60>
981: goto +869 <LBB0_74>
0000000000001eb0 LBB0_189:
982: if r0 == 2 goto +851 <LBB0_62>
983: if r0 == 3 goto +201 <LBB0_64>
984: goto +866 <LBB0_74>
0000000000001ec8 LBB0_230:
985: if r0 s> 5 goto +57 <LBB0_233>
986: if r0 == 4 goto +793 <LBB0_293>
987: if r0 == 5 goto +143 <LBB0_72>
988: goto +862 <LBB0_74>
0000000000001ee8 LBB0_41:
; if (v6h->hop_limit <= 1)
989: r1 = *(u8 *)(r9 + 7)
990: r2 = 2
991: if r2 > r1 goto +859 <LBB0_74>
992: r1 = 10
; fib_params.family = AF_INET6;
993: *(u8 *)(r10 - 64) = r1
994: r1 = 0
; fib_params.tos = 0;
995: *(u8 *)(r10 - 52) = r1
; fib_params.flowinfo = *(__be32 *)v6h & IPV6_FLOWINFO_MASK;
996: r2 = *(u32 *)(r9 + 0)
997: r3 = 4294967055 ll
999: r2 &= r3
1000: *(u32 *)(r10 - 52) = r2
; fib_params.l4_protocol = v6h->nexthdr;
1001: r2 = *(u8 *)(r9 + 6)
; fib_params.dport = 0;
1002: *(u16 *)(r10 - 60) = r1
; fib_params.sport = 0;
1003: *(u16 *)(r10 - 62) = r1
; fib_params.l4_protocol = v6h->nexthdr;
1004: *(u8 *)(r10 - 63) = r2
; fib_params.tot_len = bpf_ntohs(v6h->payload_len);
1005: r1 = *(u16 *)(r9 + 4)
1006: r1 = be16 r1
1007: *(u16 *)(r10 - 58) = r1
; *src = v6h->saddr;
1008: r1 = *(u32 *)(r9 + 12)
1009: r1 <<= 32
1010: r2 = *(u32 *)(r9 + 8)
1011: r1 |= r2
1012: *(u64 *)(r10 - 48) = r1
1013: r1 = *(u32 *)(r9 + 20)
1014: r1 <<= 32
1015: r2 = *(u32 *)(r9 + 16)
1016: r1 |= r2
1017: *(u64 *)(r10 - 40) = r1
; *dst = v6h->daddr;
1018: r1 = *(u32 *)(r9 + 36)
1019: r1 <<= 32
1020: r2 = *(u32 *)(r9 + 32)
1021: r1 |= r2
1022: *(u64 *)(r10 - 24) = r1
1023: r1 = *(u32 *)(r9 + 24)
1024: r2 = *(u32 *)(r9 + 28)
1025: r2 <<= 32
1026: r2 |= r1
1027: *(u64 *)(r10 - 32) = r2
0000000000002020 LBB0_43:
; fib_params.ifindex = xdp->ingress_ifindex;
1028: r1 = *(u32 *)(r6 + 12)
1029: *(u32 *)(r10 - 56) = r1
1030: r2 = r10
1031: r2 += -64
; int rc = bpf_fib_lookup(xdp, &fib_params, sizeof(fib_params), flag);
1032: r1 = r6
1033: r3 = 64
1034: r4 = 2
1035: call 69
; switch (rc)
1036: r0 <<= 32
1037: r0 >>= 32
1038: if r0 s> 3 goto +8 <LBB0_49>
1039: if r0 s> 1 goto +126 <LBB0_47>
1040: if r0 == 0 goto +186 <LBB0_55>
1041: if r0 == 1 goto +63 <LBB0_60>
1042: goto +808 <LBB0_74>
0000000000002098 LBB0_233:
1043: if r0 == 6 goto +757 <LBB0_294>
1044: if r0 == 7 goto +771 <LBB0_295>
1045: if r0 == 8 goto +113 <LBB0_296>
1046: goto +804 <LBB0_74>
00000000000020b8 LBB0_49:
1047: if r0 s> 5 goto +103 <LBB0_52>
1048: if r0 == 4 goto +731 <LBB0_293>
1049: if r0 == 5 goto +81 <LBB0_72>
1050: goto +800 <LBB0_74>
00000000000020d8 LBB0_274:
; if (v6h->hop_limit <= 1)
1051: r1 = *(u8 *)(r9 + 7)
1052: r2 = 2
1053: if r2 > r1 goto +797 <LBB0_74>
1054: r1 = 10
; fib_params.family = AF_INET6;
1055: *(u8 *)(r10 - 64) = r1
1056: r1 = 0
; fib_params.tos = 0;
1057: *(u8 *)(r10 - 52) = r1
; fib_params.flowinfo = *(__be32 *)v6h & IPV6_FLOWINFO_MASK;
1058: r2 = *(u32 *)(r9 + 0)
1059: r3 = 4294967055 ll
1061: r2 &= r3
1062: *(u32 *)(r10 - 52) = r2
; fib_params.l4_protocol = v6h->nexthdr;
1063: r2 = *(u8 *)(r9 + 6)
; fib_params.dport = 0;
1064: *(u16 *)(r10 - 60) = r1
; fib_params.sport = 0;
1065: *(u16 *)(r10 - 62) = r1
; fib_params.l4_protocol = v6h->nexthdr;
1066: *(u8 *)(r10 - 63) = r2
; fib_params.tot_len = bpf_ntohs(v6h->payload_len);
1067: r1 = *(u16 *)(r9 + 4)
1068: r1 = be16 r1
1069: *(u16 *)(r10 - 58) = r1
; *src = v6h->saddr;
1070: r1 = *(u32 *)(r9 + 12)
1071: r1 <<= 32
1072: r2 = *(u32 *)(r9 + 8)
1073: r1 |= r2
1074: *(u64 *)(r10 - 48) = r1
1075: r1 = *(u32 *)(r9 + 20)
1076: r1 <<= 32
1077: r2 = *(u32 *)(r9 + 16)
1078: r1 |= r2
1079: *(u64 *)(r10 - 40) = r1
; *dst = v6h->daddr;
1080: r1 = *(u32 *)(r9 + 36)
1081: r1 <<= 32
1082: r2 = *(u32 *)(r9 + 32)
1083: r1 |= r2
1084: *(u64 *)(r10 - 24) = r1
1085: r1 = *(u32 *)(r9 + 24)
1086: r2 = *(u32 *)(r9 + 28)
1087: r2 <<= 32
1088: r2 |= r1
1089: *(u64 *)(r10 - 32) = r2
0000000000002210 LBB0_276:
; fib_params.ifindex = xdp->ingress_ifindex;
1090: r1 = *(u32 *)(r6 + 12)
1091: *(u32 *)(r10 - 56) = r1
1092: r2 = r10
1093: r2 += -64
; int rc = bpf_fib_lookup(xdp, &fib_params, sizeof(fib_params), flag);
1094: r1 = r6
1095: r3 = 64
1096: r4 = 2
1097: call 69
; switch (rc)
1098: r0 <<= 32
1099: r0 >>= 32
1100: if r0 s> 3 goto +26 <LBB0_282>
1101: if r0 s> 1 goto +80 <LBB0_280>
1102: if r0 == 0 goto +139 <LBB0_288>
1103: if r0 == 1 goto +1 <LBB0_60>
1104: goto +746 <LBB0_74>
0000000000002288 LBB0_60:
1105: r1 = 0
1106: *(u8 *)(r10 - 94) = r1
1107: r1 = 17740
1108: *(u16 *)(r10 - 96) = r1
1109: r1 = 5712898879549882975 ll
1111: goto +674 <LBB0_61>
00000000000022c0 LBB0_197:
; if (h_proto == bpf_htons(ETH_P_IP))
1112: if r8 == 56710 goto +77 <LBB0_202>
1113: if r8 != 8 goto +79 <LBB0_203>
1114: r2 = *(u64 *)(r10 - 168)
; return --iph->ttl;
1115: r1 = *(u8 *)(r2 + 8)
1116: r1 += -1
1117: *(u8 *)(r2 + 8) = r1
1118: r3 = r2
; __u32 check = (__u32)iph->check;
1119: r1 = *(u16 *)(r2 + 10)
1120: r2 = 1
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1121: if r1 > 65533 goto +1 <LBB0_201>
1122: r2 = 0
0000000000002318 LBB0_201:
; check += (__u32)bpf_htons(0x0100);
1123: r1 += r2
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1124: r1 += 1
1125: *(u16 *)(r3 + 10) = r1
1126: goto +66 <LBB0_203>
0000000000002338 LBB0_282:
; switch (rc)
1127: if r0 s> 5 goto +27 <LBB0_285>
1128: if r0 == 4 goto +651 <LBB0_293>
1129: if r0 == 5 goto +1 <LBB0_72>
1130: goto +720 <LBB0_74>
0000000000002358 LBB0_72:
1131: r1 = 68
1132: *(u16 *)(r10 - 92) = r1
1133: r1 = 1162625601
1134: *(u32 *)(r10 - 96) = r1
1135: r1 = 6001403154407048799 ll
1137: *(u64 *)(r10 - 104) = r1
1138: r1 = 6072350241902119756 ll
1140: *(u64 *)(r10 - 112) = r1
1141: r1 = 6864129348661039170 ll
1143: *(u64 *)(r10 - 120) = r1
1144: r1 = r10
1145: r1 += -120
1146: r2 = 30
1147: goto +702 <LBB0_73>
00000000000023e0 LBB0_228:
1148: if r0 == 2 goto +685 <LBB0_62>
1149: if r0 == 3 goto +35 <LBB0_64>
1150: goto +700 <LBB0_74>
00000000000023f8 LBB0_52:
1151: if r0 == 6 goto +649 <LBB0_294>
1152: if r0 == 7 goto +663 <LBB0_295>
1153: if r0 == 8 goto +5 <LBB0_296>
1154: goto +696 <LBB0_74>
0000000000002418 LBB0_285:
1155: if r0 == 6 goto +645 <LBB0_294>
1156: if r0 == 7 goto +659 <LBB0_295>
1157: if r0 == 8 goto +1 <LBB0_296>
1158: goto +692 <LBB0_74>
0000000000002438 LBB0_296:
1159: r1 = 0
1160: *(u8 *)(r10 - 92) = r1
1161: r1 = 1145390149
1162: *(u32 *)(r10 - 96) = r1
1163: r1 = 4994033796443686495 ll
1165: goto +674 <LBB0_63>
0000000000002470 LBB0_47:
1166: if r0 == 2 goto +667 <LBB0_62>
1167: if r0 == 3 goto +17 <LBB0_64>
1168: goto +682 <LBB0_74>
0000000000002488 LBB0_236:
; if (h_proto == bpf_htons(ETH_P_IP))
1169: if r7 == 56710 goto +87 <LBB0_241>
1170: if r7 != 8 goto +89 <LBB0_242>
; return --iph->ttl;
1171: r1 = *(u8 *)(r9 + 22)
1172: r1 += -1
1173: *(u8 *)(r9 + 22) = r1
; __u32 check = (__u32)iph->check;
1174: r1 = *(u16 *)(r9 + 24)
1175: r2 = 1
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1176: if r1 > 65533 goto +1 <LBB0_240>
1177: r2 = 0
00000000000024d0 LBB0_240:
; check += (__u32)bpf_htons(0x0100);
1178: r1 += r2
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1179: r1 += 1
1180: *(u16 *)(r9 + 24) = r1
1181: goto +78 <LBB0_242>
00000000000024f0 LBB0_280:
; switch (rc)
1182: if r0 == 2 goto +651 <LBB0_62>
1183: if r0 == 3 goto +1 <LBB0_64>
1184: goto +666 <LBB0_74>
0000000000002508 LBB0_64:
1185: r1 = 84
1186: *(u16 *)(r10 - 96) = r1
1187: r1 = 5278862288148910175 ll
1189: goto +630 <LBB0_65>
0000000000002530 LBB0_202:
; v6h->hop_limit--;
1190: r1 = *(u8 *)(r9 + 7)
1191: r1 += -1
1192: *(u8 *)(r9 + 7) = r1
0000000000002548 LBB0_203:
; *ifindex = fib_params.ifindex;
1193: r1 = *(u32 *)(r10 - 56)
1194: *(u32 *)(r10 - 88) = r1
; __builtin_memcpy(source, fib_params.smac, ETH_ALEN);
1195: r1 = *(u32 *)(r10 - 12)
1196: *(u32 *)(r10 - 128) = r1
1197: r1 = *(u16 *)(r10 - 8)
1198: *(u16 *)(r10 - 124) = r1
; __builtin_memcpy(dest, fib_params.dmac, ETH_ALEN);
1199: r1 = *(u16 *)(r10 - 4)
1200: r2 = r1
1201: r2 <<= 16
1202: r3 = *(u16 *)(r10 - 6)
1203: r2 |= r3
1204: *(u32 *)(r10 - 136) = r2
1205: r2 = *(u16 *)(r10 - 2)
1206: *(u16 *)(r10 - 132) = r2
; __builtin_memcpy(p, dest, ETH_ALEN);
1207: *(u16 *)(r7 + 4) = r2
1208: *(u16 *)(r7 + 2) = r1
1209: *(u16 *)(r7 + 0) = r3
; __builtin_memcpy(p + 3, source, ETH_ALEN);
1210: r1 = *(u16 *)(r10 - 124)
1211: *(u16 *)(r7 + 10) = r1
1212: r1 = *(u32 *)(r10 - 128)
1213: *(u16 *)(r7 + 6) = r1
1214: r1 >>= 16
1215: *(u16 *)(r7 + 8) = r1
1216: r2 = r10
; *ifindex = fib_params.ifindex;
1217: r2 += -88
; if (!bpf_map_lookup_elem(&tx_port, &ifindex))
1218: r1 = 0 ll
1220: call 1
1221: r8 = 2
1222: if r0 == 0 goto +641 <LBB0_75>
; if (xdp->ingress_ifindex == ifindex)
1223: r1 = *(u32 *)(r6 + 12)
1224: r2 = *(u32 *)(r10 - 88)
1225: if r1 != r2 goto +273 <LBB0_70>
1226: goto +223 <LBB0_69>
0000000000002658 LBB0_55:
; if (h_proto == bpf_htons(ETH_P_IP))
1227: if r8 == 56710 goto +186 <LBB0_66>
1228: if r8 != 8 goto +188 <LBB0_67>
1229: r2 = *(u64 *)(r10 - 168)
; return --iph->ttl;
1230: r1 = *(u8 *)(r2 + 8)
1231: r1 += -1
1232: *(u8 *)(r2 + 8) = r1
; __u32 check = (__u32)iph->check;
1233: r1 = *(u16 *)(r2 + 10)
1234: r2 = 1
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1235: if r1 > 65533 goto +1 <LBB0_59>
1236: r2 = 0
00000000000026a8 LBB0_59:
; check += (__u32)bpf_htons(0x0100);
1237: r1 += r2
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1238: r1 += 1
1239: r2 = *(u64 *)(r10 - 168)
1240: *(u16 *)(r2 + 10) = r1
1241: goto +175 <LBB0_67>
00000000000026d0 LBB0_288:
; if (h_proto == bpf_htons(ETH_P_IP))
1242: if r8 == 56710 goto +219 <LBB0_297>
1243: if r8 != 8 goto +221 <LBB0_298>
1244: r2 = *(u64 *)(r10 - 168)
; return --iph->ttl;
1245: r1 = *(u8 *)(r2 + 8)
1246: r1 += -1
1247: *(u8 *)(r2 + 8) = r1
; __u32 check = (__u32)iph->check;
1248: r1 = *(u16 *)(r2 + 10)
1249: r2 = 1
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1250: if r1 > 65533 goto +1 <LBB0_292>
1251: r2 = 0
0000000000002720 LBB0_292:
; check += (__u32)bpf_htons(0x0100);
1252: r1 += r2
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1253: r1 += 1
1254: r2 = *(u64 *)(r10 - 168)
1255: *(u16 *)(r2 + 10) = r1
1256: goto +208 <LBB0_298>
0000000000002748 LBB0_241:
; v6h->hop_limit--;
1257: r1 = *(u8 *)(r9 + 21)
1258: r1 += -1
1259: *(u8 *)(r9 + 21) = r1
0000000000002760 LBB0_242:
; *ifindex = fib_params.ifindex;
1260: r1 = *(u32 *)(r10 - 56)
1261: *(u32 *)(r10 - 120) = r1
; __builtin_memcpy(source, fib_params.smac, ETH_ALEN);
1262: r1 = *(u32 *)(r10 - 12)
1263: *(u32 *)(r10 - 128) = r1
1264: r1 = *(u16 *)(r10 - 8)
1265: *(u16 *)(r10 - 124) = r1
; __builtin_memcpy(dest, fib_params.dmac, ETH_ALEN);
1266: r1 = *(u16 *)(r10 - 4)
1267: r2 = r1
1268: r2 <<= 16
1269: r3 = *(u16 *)(r10 - 6)
1270: r2 |= r3
1271: *(u32 *)(r10 - 136) = r2
1272: r2 = *(u16 *)(r10 - 2)
1273: *(u16 *)(r10 - 132) = r2
; __builtin_memcpy(p, dest, ETH_ALEN);
1274: *(u16 *)(r9 + 4) = r2
1275: *(u16 *)(r9 + 2) = r1
1276: *(u16 *)(r9 + 0) = r3
; __builtin_memcpy(p + 3, source, ETH_ALEN);
1277: r1 = *(u16 *)(r10 - 124)
1278: *(u16 *)(r9 + 10) = r1
1279: r1 = *(u32 *)(r10 - 128)
1280: *(u16 *)(r9 + 6) = r1
1281: r1 >>= 16
1282: *(u16 *)(r9 + 8) = r1
1283: r2 = r10
; *ifindex = fib_params.ifindex;
1284: r2 += -120
; if (!bpf_map_lookup_elem(&tx_port, &ifindex))
1285: r1 = 0 ll
1287: call 1
1288: r8 = 2
1289: if r0 == 0 goto +574 <LBB0_75>
; if (xdp->ingress_ifindex == ifindex)
1290: r1 = *(u32 *)(r6 + 12)
1291: r2 = *(u32 *)(r10 - 120)
1292: if r1 != r2 goto +106 <LBB0_245>
1293: goto +156 <LBB0_69>
0000000000002870 LBB0_94:
1294: r2 = r5
1295: r2 += 22
1296: r2 += r7
; if ((void *)v6addr + offset + py_size > data_end)
1297: r0 = r2
1298: r0 += 4
1299: if r0 > r1 goto +13 <LBB0_99>
; __builtin_memcpy(&v6addr->in6_u.u6_addr8[offset], pyload, py_size);
1300: r0 = *(u32 *)(r10 - 72)
1301: r7 = r0
1302: r7 >>= 24
1303: *(u8 *)(r2 + 3) = r7
1304: r7 = r0
1305: r7 >>= 16
1306: *(u8 *)(r2 + 2) = r7
1307: *(u8 *)(r2 + 0) = r0
1308: r0 >>= 8
1309: *(u8 *)(r2 + 1) = r0
1310: goto +2 <LBB0_99>
00000000000028f8 LBB0_98:
; for (__u16 index = 0; index < sizeof(struct in6_addr); index++)
1311: r9 += 1
1312: if r9 != 4 goto +63 <LBB0_93>
0000000000002908 LBB0_99:
1313: r8 = 2
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr)) > data_end)
1314: r2 = r5
1315: r2 += 62
1316: if r2 > r1 goto +547 <LBB0_75>
1317: r3 = 0
; srh->tag = 0;
1318: *(u16 *)(r5 + 60) = r3
; srh->flags = 0;
1319: *(u8 *)(r5 + 59) = r3
1320: r3 = *(u64 *)(r10 - 200)
; srh->lastEntry = seg_len - 1;
1321: *(u8 *)(r5 + 58) = r3
; srh->segmentsLeft = seg_len - 1;
1322: *(u8 *)(r5 + 57) = r3
1323: r3 = 4
; srh->routingType = 4;
1324: *(u8 *)(r5 + 56) = r3
; srh->nextHdr = IPPROTO_IPIP;
1325: *(u8 *)(r5 + 54) = r3
1326: r3 = *(u64 *)(r10 - 184)
; srh->hdrExtLen = ((srh_len / 8) - 1);
1327: r3 &= 255
1328: r3 >>= 3
1329: r3 += -1
1330: *(u8 *)(r5 + 55) = r3
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) + 1) > data_end)
1331: r3 = r5
1332: r3 += 79
1333: if r3 > r1 goto +530 <LBB0_75>
1334: r3 = r5
1335: r3 += 38
1336: r7 = *(u64 *)(r10 - 216)
1337: r4 = r7
1338: r4 &= 7
1339: *(u64 *)(r10 - 176) = r4
1340: r4 = r7
1341: r4 >>= 3
1342: *(u64 *)(r10 - 200) = r4
1343: r4 = *(u64 *)(r10 - 208)
; __builtin_memcpy(&v6h->daddr, &tb->segments[0], sizeof(struct in6_addr));
1344: r0 = *(u32 *)(r4 + 12)
1345: *(u32 *)(r3 + 12) = r0
1346: r0 = *(u32 *)(r4 + 8)
1347: *(u32 *)(r3 + 8) = r0
1348: r0 = *(u32 *)(r4 + 4)
1349: *(u32 *)(r3 + 4) = r0
1350: r0 = *(u32 *)(r4 + 0)
1351: *(u32 *)(r3 + 0) = r0
1352: r4 = *(u64 *)(r10 - 168)
; __builtin_memcpy(&srh->segments[0], &tb->daddr, sizeof(struct in6_addr));
1353: r3 = *(u32 *)(r4 + 24)
1354: *(u32 *)(r2 + 8) = r3
1355: r3 = *(u32 *)(r4 + 28)
1356: *(u32 *)(r2 + 12) = r3
1357: r3 = *(u32 *)(r4 + 16)
1358: *(u32 *)(r2 + 0) = r3
1359: r3 = *(u32 *)(r4 + 20)
1360: *(u32 *)(r2 + 4) = r3
1361: r7 &= 524256
; if (sizeof(struct in6_addr) <= offset ||
1362: if r7 > 88 goto +174 <LBB0_111>
1363: r0 = *(u64 *)(r10 - 200)
1364: r0 &= 65535
1365: if r0 > 15 goto +171 <LBB0_111>
; if (shift == 0)
1366: r3 = *(u64 *)(r10 - 176)
1367: if r3 == 0 goto +151 <LBB0_106>
; for (__u16 index = 0; index < sizeof(struct in6_addr); index++)
1368: r8 = r5
1369: r8 += r0
1370: r4 = 8
1371: r3 = *(u64 *)(r10 - 176)
1372: r4 -= r3
1373: *(u64 *)(r10 - 184) = r4
1374: r7 = 0
1375: goto +176 <LBB0_105>
0000000000002b00 LBB0_93:
; __u8 *v6val2 = (__u8 *)(void *)v6addr + offset + index + 1;
1376: r2 = r3
1377: r2 += r9
; if (v6val1 + 1 <= data_end && v6val2 + 1 <= data_end)
1378: r7 = r2
1379: r7 += 23
1380: if r7 > r1 goto -70 <LBB0_98>
1381: r7 = r2
1382: r7 += 24
1383: if r7 > r1 goto -73 <LBB0_98>
1384: r7 = r10
; *v6val1 |= pyload[index] >> shift;
1385: r7 += -72
1386: r7 += r9
1387: r4 = *(u8 *)(r7 + 0)
1388: r4 >>= r0
1389: r8 = *(u8 *)(r2 + 22)
1390: r8 |= r4
1391: *(u8 *)(r2 + 22) = r8
; *v6val2 |= pyload[index] << (8 - shift);
1392: r4 = *(u8 *)(r7 + 0)
1393: r7 = *(u64 *)(r10 - 176)
1394: r4 <<= r7
1395: r7 = *(u8 *)(r2 + 23)
1396: r7 |= r4
1397: *(u8 *)(r2 + 23) = r7
1398: goto -88 <LBB0_98>
0000000000002bb8 LBB0_245:
1399: r1 = 29795
; bpf_printk("go to redirect");
1400: *(u16 *)(r10 - 52) = r1
1401: r1 = 1701996900
1402: *(u32 *)(r10 - 56) = r1
1403: r1 = 7309940808237477735 ll
1405: *(u64 *)(r10 - 64) = r1
1406: r1 = 0
1407: *(u8 *)(r10 - 50) = r1
1408: r1 = r10
1409: r1 += -64
1410: r2 = 15
1411: call 6
; return bpf_redirect_map(&tx_port, ifindex, 0);
1412: r2 = *(u32 *)(r10 - 120)
1413: goto +99 <LBB0_71>
0000000000002c30 LBB0_66:
; v6h->hop_limit--;
1414: r1 = *(u8 *)(r9 + 7)
1415: r1 += -1
1416: *(u8 *)(r9 + 7) = r1
0000000000002c48 LBB0_67:
; *ifindex = fib_params.ifindex;
1417: r1 = *(u32 *)(r10 - 56)
1418: *(u32 *)(r10 - 88) = r1
; __builtin_memcpy(source, fib_params.smac, ETH_ALEN);
1419: r1 = *(u32 *)(r10 - 12)
1420: *(u32 *)(r10 - 128) = r1
1421: r1 = *(u16 *)(r10 - 8)
1422: *(u16 *)(r10 - 124) = r1
; __builtin_memcpy(dest, fib_params.dmac, ETH_ALEN);
1423: r1 = *(u16 *)(r10 - 4)
1424: r2 = r1
1425: r2 <<= 16
1426: r3 = *(u16 *)(r10 - 6)
1427: r2 |= r3
1428: *(u32 *)(r10 - 136) = r2
1429: r2 = *(u16 *)(r10 - 2)
1430: *(u16 *)(r10 - 132) = r2
; __builtin_memcpy(p, dest, ETH_ALEN);
1431: *(u16 *)(r7 + 4) = r2
1432: *(u16 *)(r7 + 2) = r1
1433: *(u16 *)(r7 + 0) = r3
; __builtin_memcpy(p + 3, source, ETH_ALEN);
1434: r1 = *(u16 *)(r10 - 124)
1435: *(u16 *)(r7 + 10) = r1
1436: r1 = *(u32 *)(r10 - 128)
1437: *(u16 *)(r7 + 6) = r1
1438: r1 >>= 16
1439: *(u16 *)(r7 + 8) = r1
1440: r2 = r10
; *ifindex = fib_params.ifindex;
1441: r2 += -88
; if (!bpf_map_lookup_elem(&tx_port, &ifindex))
1442: r1 = 0 ll
1444: call 1
1445: r8 = 2
1446: if r0 == 0 goto +417 <LBB0_75>
; if (xdp->ingress_ifindex == ifindex)
1447: r1 = *(u32 *)(r6 + 12)
1448: r2 = *(u32 *)(r10 - 88)
1449: if r1 != r2 goto +49 <LBB0_70>
0000000000002d50 LBB0_69:
1450: r1 = 0
1451: *(u8 *)(r10 - 58) = r1
1452: r1 = 30836
1453: *(u16 *)(r10 - 60) = r1
1454: r1 = 544109938
1455: *(u32 *)(r10 - 64) = r1
1456: r1 = r10
1457: r1 += -64
1458: r2 = 7
1459: call 6
1460: r8 = 3
1461: goto +402 <LBB0_75>
0000000000002db0 LBB0_297:
; v6h->hop_limit--;
1462: r1 = *(u8 *)(r9 + 7)
1463: r1 += -1
1464: *(u8 *)(r9 + 7) = r1
0000000000002dc8 LBB0_298:
; *ifindex = fib_params.ifindex;
1465: r1 = *(u32 *)(r10 - 56)
1466: *(u32 *)(r10 - 88) = r1
; __builtin_memcpy(source, fib_params.smac, ETH_ALEN);
1467: r1 = *(u32 *)(r10 - 12)
1468: *(u32 *)(r10 - 128) = r1
1469: r1 = *(u16 *)(r10 - 8)
1470: *(u16 *)(r10 - 124) = r1
; __builtin_memcpy(dest, fib_params.dmac, ETH_ALEN);
1471: r1 = *(u16 *)(r10 - 4)
1472: r2 = r1
1473: r2 <<= 16
1474: r3 = *(u16 *)(r10 - 6)
1475: r2 |= r3
1476: *(u32 *)(r10 - 136) = r2
1477: r2 = *(u16 *)(r10 - 2)
1478: *(u16 *)(r10 - 132) = r2
; __builtin_memcpy(p, dest, ETH_ALEN);
1479: *(u16 *)(r7 + 4) = r2
1480: *(u16 *)(r7 + 2) = r1
1481: *(u16 *)(r7 + 0) = r3
; __builtin_memcpy(p + 3, source, ETH_ALEN);
1482: r1 = *(u16 *)(r10 - 124)
1483: *(u16 *)(r7 + 10) = r1
1484: r1 = *(u32 *)(r10 - 128)
1485: *(u16 *)(r7 + 6) = r1
1486: r1 >>= 16
1487: *(u16 *)(r7 + 8) = r1
1488: r2 = r10
; *ifindex = fib_params.ifindex;
1489: r2 += -88
; if (!bpf_map_lookup_elem(&tx_port, &ifindex))
1490: r1 = 0 ll
1492: call 1
1493: r8 = 2
1494: if r0 == 0 goto +369 <LBB0_75>
; if (xdp->ingress_ifindex == ifindex)
1495: r1 = *(u32 *)(r6 + 12)
1496: r2 = *(u32 *)(r10 - 88)
1497: if r1 != r2 goto +1 <LBB0_70>
1498: goto -49 <LBB0_69>
0000000000002ed8 LBB0_70:
1499: r1 = 29795
1500: *(u16 *)(r10 - 52) = r1
1501: r1 = 1701996900
1502: *(u32 *)(r10 - 56) = r1
1503: r1 = 7309940808237477735 ll
1505: *(u64 *)(r10 - 64) = r1
1506: r1 = 0
1507: *(u8 *)(r10 - 50) = r1
1508: r1 = r10
1509: r1 += -64
1510: r2 = 15
1511: call 6
1512: r2 = *(u32 *)(r10 - 88)
0000000000002f48 LBB0_71:
1513: r1 = 0 ll
1515: r3 = 0
1516: call 51
1517: r8 = r0
1518: goto +345 <LBB0_75>
0000000000002f78 LBB0_106:
1519: r3 = r2
1520: r3 += r0
; if ((void *)v6addr + offset + py_size > data_end)
1521: r0 = r3
1522: r0 += 4
1523: if r0 > r1 goto +13 <LBB0_111>
; __builtin_memcpy(&v6addr->in6_u.u6_addr8[offset], pyload, py_size);
1524: r0 = *(u32 *)(r10 - 76)
1525: r7 = r0
1526: r7 >>= 24
1527: *(u8 *)(r3 + 3) = r7
1528: r7 = r0
1529: r7 >>= 16
1530: *(u8 *)(r3 + 2) = r7
1531: *(u8 *)(r3 + 0) = r0
1532: r0 >>= 8
1533: *(u8 *)(r3 + 1) = r0
1534: goto +2 <LBB0_111>
0000000000002ff8 LBB0_110:
; for (__u16 index = 0; index < sizeof(struct in6_addr); index++)
1535: r7 += 1
1536: if r7 != 4 goto +15 <LBB0_105>
0000000000003008 LBB0_111:
1537: r3 = *(u64 *)(r10 - 200)
; d_offset += sizeof(__u32);
1538: r3 += 4
1539: r3 &= 65535
1540: r0 = r3
; if (sizeof(struct in6_addr) <= offset ||
1541: if r3 > 10 goto +54 <LBB0_120>
; if (shift == 0)
1542: r3 = *(u64 *)(r10 - 176)
1543: if r3 == 0 goto +32 <LBB0_115>
; for (__u16 index = 0; index < sizeof(struct in6_addr); index++)
1544: r3 = r5
1545: r3 += r0
1546: r0 = 8
1547: r4 = *(u64 *)(r10 - 176)
1548: r0 -= r4
1549: *(u64 *)(r10 - 184) = r0
1550: r7 = 0
1551: goto +52 <LBB0_114>
0000000000003080 LBB0_105:
; __u8 *v6val2 = (__u8 *)(void *)v6addr + offset + index + 1;
1552: r3 = r8
1553: r3 += r7
; if (v6val1 + 1 <= data_end && v6val2 + 1 <= data_end)
1554: r9 = r3
1555: r9 += 63
1556: if r9 > r1 goto -22 <LBB0_110>
1557: r9 = r3
1558: r9 += 64
1559: if r9 > r1 goto -25 <LBB0_110>
1560: r9 = r10
; *v6val1 |= pyload[index] >> shift;
1561: r9 += -76
1562: r9 += r7
1563: r4 = *(u8 *)(r9 + 0)
1564: r0 = *(u64 *)(r10 - 176)
1565: r4 >>= r0
1566: r0 = *(u8 *)(r3 + 62)
1567: r0 |= r4
1568: *(u8 *)(r3 + 62) = r0
; *v6val2 |= pyload[index] << (8 - shift);
1569: r4 = *(u8 *)(r9 + 0)
1570: r0 = *(u64 *)(r10 - 184)
1571: r4 <<= r0
1572: r0 = *(u8 *)(r3 + 63)
1573: r0 |= r4
1574: *(u8 *)(r3 + 63) = r0
1575: goto -41 <LBB0_110>
0000000000003140 LBB0_115:
1576: r4 = r2
1577: r4 += r0
; if ((void *)v6addr + offset + py_size > data_end)
1578: r3 = r4
1579: r3 += 5
1580: if r3 > r1 goto +15 <LBB0_120>
; __builtin_memcpy(&v6addr->in6_u.u6_addr8[offset], pyload, py_size);
1581: r3 = *(u8 *)(r10 - 84)
1582: *(u8 *)(r4 + 4) = r3
1583: r3 = *(u32 *)(r10 - 88)
1584: r0 = r3
1585: r0 >>= 24
1586: *(u8 *)(r4 + 3) = r0
1587: r0 = r3
1588: r0 >>= 16
1589: *(u8 *)(r4 + 2) = r0
1590: *(u8 *)(r4 + 0) = r3
1591: r3 >>= 8
1592: *(u8 *)(r4 + 1) = r3
1593: goto +2 <LBB0_120>
00000000000031d0 LBB0_119:
; for (__u16 index = 0; index < sizeof(struct in6_addr); index++)
1594: r7 += 1
1595: if r7 != 5 goto +8 <LBB0_114>
00000000000031e0 LBB0_120:
1596: r8 = 2
; for (__u16 i = 1; i < MAX_SEGMENTS; i++)
1597: r3 = *(u64 *)(r10 - 192)
1598: if r8 > r3 goto +62 <LBB0_125>
1599: r4 = 1
1600: r5 += 63
1601: r3 = -4294967296 ll
1603: goto +24 <LBB0_122>
0000000000003220 LBB0_114:
; __u8 *v6val2 = (__u8 *)(void *)v6addr + offset + index + 1;
1604: r8 = r3
1605: r8 += r7
; if (v6val1 + 1 <= data_end && v6val2 + 1 <= data_end)
1606: r4 = r8
1607: r4 += 63
1608: if r4 > r1 goto -15 <LBB0_119>
1609: r4 = r8
1610: r4 += 64
1611: if r4 > r1 goto -18 <LBB0_119>
1612: r4 = r10
; *v6val1 |= pyload[index] >> shift;
1613: r4 += -88
1614: r4 += r7
1615: r9 = *(u8 *)(r4 + 0)
1616: r0 = *(u64 *)(r10 - 176)
1617: r9 >>= r0
1618: r0 = *(u8 *)(r8 + 62)
1619: r0 |= r9
1620: *(u8 *)(r8 + 62) = r0
; *v6val2 |= pyload[index] << (8 - shift);
1621: r4 = *(u8 *)(r4 + 0)
1622: r0 = *(u64 *)(r10 - 184)
1623: r4 <<= r0
1624: r0 = *(u8 *)(r8 + 63)
1625: r0 |= r4
1626: *(u8 *)(r8 + 63) = r0
1627: goto -34 <LBB0_119>
00000000000032e0 LBB0_122:
; if ((void *)(data + sizeof(struct ethhdr) + sizeof(struct ipv6hdr) + sizeof(struct srhhdr) + sizeof(struct in6_addr) * (i + 2) + 1) > data_end)
1628: r0 = r4
1629: r0 <<= 4
1630: r0 += 32
1631: r0 <<= 32
1632: r0 >>= 32
1633: r7 = r5
1634: r7 += r0
1635: if r7 > r1 goto +228 <LBB0_75>
; __builtin_memcpy(&srh->segments[i], &tb->segments[i - 1], sizeof(struct in6_addr));
1636: r0 = r4
1637: r0 <<= 32
1638: r7 = r0
1639: r7 >>= 32
1640: r7 <<= 4
1641: r9 = r2
1642: r9 += r7
1643: r0 += r3
1644: r0 s>>= 32
1645: r0 <<= 4
1646: r7 = *(u64 *)(r10 - 168)
1647: r7 += r0
1648: r0 = *(u32 *)(r7 + 60)
1649: *(u32 *)(r9 + 12) = r0
1650: r0 = *(u32 *)(r7 + 56)
1651: *(u32 *)(r9 + 8) = r0
1652: r0 = *(u32 *)(r7 + 52)
1653: *(u32 *)(r9 + 4) = r0
1654: r0 = *(u32 *)(r7 + 48)
1655: *(u32 *)(r9 + 0) = r0
; for (__u16 i = 1; i < MAX_SEGMENTS; i++)
1656: r4 += 1
1657: r4 &= 65535
1658: if r4 > 4 goto +2 <LBB0_125>
1659: r0 = *(u64 *)(r10 - 192)
1660: if r0 > r4 goto -33 <LBB0_122>
00000000000033e8 LBB0_125:
; void *data_end = (void *)(long)xdp->data_end;
1661: r1 = *(u32 *)(r6 + 4)
; void *data = (void *)(long)xdp->data;
1662: r7 = *(u32 *)(r6 + 0)
; if (data + sizeof(*eth) > data_end)
1663: r2 = r7
1664: r2 += 14
1665: if r2 > r1 goto +198 <LBB0_75>
; if (iph + 1 > data_end)
1666: r4 = r7
1667: r4 += 34
; if (v6h + 1 > data_end)
1668: r5 = r7
1669: r5 += 54
1670: r3 = 0
1671: r9 = 0
1672: if r5 > r1 goto +1 <LBB0_128>
1673: r9 = r2
0000000000003450 LBB0_128:
; if (iph + 1 > data_end)
1674: r5 = 0
1675: *(u64 *)(r10 - 168) = r5
1676: if r4 > r1 goto +1 <LBB0_130>
1677: *(u64 *)(r10 - 168) = r2
0000000000003470 LBB0_130:
; struct bpf_fib_lookup fib_params = {};
1678: *(u64 *)(r10 - 8) = r3
1679: *(u64 *)(r10 - 16) = r3
1680: *(u64 *)(r10 - 24) = r3
1681: *(u64 *)(r10 - 32) = r3
1682: *(u64 *)(r10 - 40) = r3
1683: *(u64 *)(r10 - 48) = r3
1684: *(u64 *)(r10 - 56) = r3
1685: *(u64 *)(r10 - 64) = r3
; if (!iph || !v6h)
1686: r1 = *(u64 *)(r10 - 168)
1687: if r1 == 0 goto +163 <LBB0_74>
1688: if r9 == 0 goto +162 <LBB0_74>
; h_proto = eth->h_proto;
1689: r1 = *(u8 *)(r7 + 12)
1690: r8 = *(u8 *)(r7 + 13)
1691: r2 = 0
; __builtin_memset(&fib_params, 0, sizeof(fib_params));
1692: *(u64 *)(r10 - 8) = r2
1693: *(u64 *)(r10 - 16) = r2
1694: *(u64 *)(r10 - 24) = r2
1695: *(u64 *)(r10 - 32) = r2
1696: *(u64 *)(r10 - 40) = r2
1697: *(u64 *)(r10 - 48) = r2
1698: *(u64 *)(r10 - 56) = r2
1699: *(u64 *)(r10 - 64) = r2
; h_proto = eth->h_proto;
1700: r8 <<= 8
1701: r8 |= r1
; switch (h_proto)
1702: if r8 == 56710 goto +19 <LBB0_135>
1703: if r8 != 8 goto +147 <LBB0_74>
1704: r1 = 2
; fib_params.family = AF_INET;
1705: *(u8 *)(r10 - 64) = r1
1706: r3 = *(u64 *)(r10 - 168)
; fib_params.tos = iph->tos;
1707: r1 = *(u8 *)(r3 + 1)
1708: *(u8 *)(r10 - 52) = r1
; fib_params.l4_protocol = iph->protocol;
1709: r1 = *(u8 *)(r3 + 9)
1710: r2 = 0
; fib_params.dport = 0;
1711: *(u16 *)(r10 - 60) = r2
; fib_params.sport = 0;
1712: *(u16 *)(r10 - 62) = r2
; fib_params.l4_protocol = iph->protocol;
1713: *(u8 *)(r10 - 63) = r1
; fib_params.tot_len = bpf_ntohs(iph->tot_len);
1714: r1 = *(u16 *)(r3 + 2)
1715: r1 = be16 r1
1716: *(u16 *)(r10 - 58) = r1
; fib_params.ipv4_src = iph->saddr;
1717: r1 = *(u32 *)(r3 + 12)
1718: *(u32 *)(r10 - 48) = r1
; fib_params.ipv4_dst = iph->daddr;
1719: r1 = *(u32 *)(r3 + 16)
1720: *(u32 *)(r10 - 32) = r1
1721: goto +39 <LBB0_137>
00000000000035d0 LBB0_135:
; if (v6h->hop_limit <= 1)
1722: r1 = *(u8 *)(r9 + 7)
1723: r2 = 2
1724: if r2 > r1 goto +126 <LBB0_74>
1725: r1 = 10
; fib_params.family = AF_INET6;
1726: *(u8 *)(r10 - 64) = r1
1727: r1 = 0
; fib_params.tos = 0;
1728: *(u8 *)(r10 - 52) = r1
; fib_params.flowinfo = *(__be32 *)v6h & IPV6_FLOWINFO_MASK;
1729: r2 = *(u32 *)(r9 + 0)
1730: r3 = 4294967055 ll
1732: r2 &= r3
1733: *(u32 *)(r10 - 52) = r2
; fib_params.l4_protocol = v6h->nexthdr;
1734: r2 = *(u8 *)(r9 + 6)
; fib_params.dport = 0;
1735: *(u16 *)(r10 - 60) = r1
; fib_params.sport = 0;
1736: *(u16 *)(r10 - 62) = r1
; fib_params.l4_protocol = v6h->nexthdr;
1737: *(u8 *)(r10 - 63) = r2
; fib_params.tot_len = bpf_ntohs(v6h->payload_len);
1738: r1 = *(u16 *)(r9 + 4)
1739: r1 = be16 r1
1740: *(u16 *)(r10 - 58) = r1
; *src = v6h->saddr;
1741: r1 = *(u32 *)(r9 + 12)
1742: r1 <<= 32
1743: r2 = *(u32 *)(r9 + 8)
1744: r1 |= r2
1745: *(u64 *)(r10 - 48) = r1
1746: r1 = *(u32 *)(r9 + 20)
1747: r1 <<= 32
1748: r2 = *(u32 *)(r9 + 16)
1749: r1 |= r2
1750: *(u64 *)(r10 - 40) = r1
; *dst = v6h->daddr;
1751: r1 = *(u32 *)(r9 + 36)
1752: r1 <<= 32
1753: r2 = *(u32 *)(r9 + 32)
1754: r1 |= r2
1755: *(u64 *)(r10 - 24) = r1
1756: r1 = *(u32 *)(r9 + 24)
1757: r2 = *(u32 *)(r9 + 28)
1758: r2 <<= 32
1759: r2 |= r1
1760: *(u64 *)(r10 - 32) = r2
0000000000003708 LBB0_137:
; fib_params.ifindex = xdp->ingress_ifindex;
1761: r1 = *(u32 *)(r6 + 12)
1762: *(u32 *)(r10 - 56) = r1
1763: r2 = r10
1764: r2 += -64
; int rc = bpf_fib_lookup(xdp, &fib_params, sizeof(fib_params), flag);
1765: r1 = r6
1766: r3 = 64
1767: r4 = 2
1768: call 69
; switch (rc)
1769: r0 <<= 32
1770: r0 >>= 32
1771: if r0 s> 3 goto +4 <LBB0_143>
1772: if r0 s> 1 goto +58 <LBB0_141>
1773: if r0 == 0 goto +95 <LBB0_149>
1774: if r0 == 1 goto -670 <LBB0_60>
1775: goto +75 <LBB0_74>
0000000000003780 LBB0_143:
1776: if r0 s> 5 goto +20 <LBB0_146>
1777: if r0 == 4 goto +2 <LBB0_293>
1778: if r0 == 5 goto -648 <LBB0_72>
1779: goto +71 <LBB0_74>
00000000000037a0 LBB0_293:
1780: r1 = 0
1781: *(u8 *)(r10 - 94) = r1
1782: r1 = 17477
1783: *(u16 *)(r10 - 96) = r1
1784: r1 = 4924482092803247711 ll
00000000000037d0 LBB0_61:
1786: *(u64 *)(r10 - 104) = r1
1787: r1 = 6072350241902119756 ll
1789: *(u64 *)(r10 - 112) = r1
1790: r1 = 6864129348661039170 ll
1792: *(u64 *)(r10 - 120) = r1
1793: r1 = r10
1794: r1 += -120
1795: r2 = 27
1796: goto +53 <LBB0_73>
0000000000003828 LBB0_146:
1797: if r0 == 6 goto +3 <LBB0_294>
1798: if r0 == 7 goto +17 <LBB0_295>
1799: if r0 == 8 goto -641 <LBB0_296>
1800: goto +50 <LBB0_74>
0000000000003848 LBB0_294:
1801: r1 = 5527372
1802: *(u32 *)(r10 - 96) = r1
1803: r1 = 6868077759140091231 ll
1805: *(u64 *)(r10 - 104) = r1
1806: r1 = 6072350241902119756 ll
1808: *(u64 *)(r10 - 112) = r1
1809: r1 = 6864129348661039170 ll
1811: *(u64 *)(r10 - 120) = r1
1812: r1 = r10
1813: r1 += -120
1814: r2 = 28
1815: goto +34 <LBB0_73>
00000000000038c0 LBB0_295:
1816: r1 = 72
1817: *(u16 *)(r10 - 96) = r1
1818: r1 = 5136713052901559903 ll
00000000000038e0 LBB0_65:
1820: *(u64 *)(r10 - 104) = r1
1821: r1 = 6072350241902119756 ll
1823: *(u64 *)(r10 - 112) = r1
1824: r1 = 6864129348661039170 ll
1826: *(u64 *)(r10 - 120) = r1
1827: r1 = r10
1828: r1 += -120
1829: r2 = 26
1830: goto +19 <LBB0_73>
0000000000003938 LBB0_141:
1831: if r0 == 2 goto +2 <LBB0_62>
1832: if r0 == 3 goto -648 <LBB0_64>
1833: goto +17 <LBB0_74>
0000000000003950 LBB0_62:
1834: r1 = 0
1835: *(u8 *)(r10 - 92) = r1
1836: r1 = 1162625601
1837: *(u32 *)(r10 - 96) = r1
1838: r1 = 5207077360159839583 ll
0000000000003980 LBB0_63:
1840: *(u64 *)(r10 - 104) = r1
1841: r1 = 6072350241902119756 ll
1843: *(u64 *)(r10 - 112) = r1
1844: r1 = 6864129348661039170 ll
1846: *(u64 *)(r10 - 120) = r1
1847: r1 = r10
1848: r1 += -120
1849: r2 = 29
00000000000039d0 LBB0_73:
1850: call 6
00000000000039d8 LBB0_74:
1851: r1 = 7368552
1852: *(u32 *)(r10 - 48) = r1
1853: r1 = 7935454094086535013 ll
1855: *(u64 *)(r10 - 56) = r1
1856: r1 = 8223683306351845734 ll
1858: *(u64 *)(r10 - 64) = r1
1859: r1 = r10
1860: r1 += -64
1861: r2 = 20
1862: call 6
1863: r8 = 2
0000000000003a40 LBB0_75:
1864: r1 = r6
1865: r2 = 0 ll
1867: r3 = r8
1868: goto -1845 <LBB0_9>
0000000000003a68 LBB0_149:
; if (h_proto == bpf_htons(ETH_P_IP))
1869: if r8 == 56710 goto +14 <LBB0_154>
1870: if r8 != 8 goto +16 <LBB0_155>
1871: r2 = *(u64 *)(r10 - 168)
; return --iph->ttl;
1872: r1 = *(u8 *)(r2 + 8)
1873: r1 += -1
1874: *(u8 *)(r2 + 8) = r1
; __u32 check = (__u32)iph->check;
1875: r1 = *(u16 *)(r2 + 10)
1876: r2 = 1
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1877: if r1 > 65533 goto +1 <LBB0_153>
1878: r2 = 0
0000000000003ab8 LBB0_153:
; check += (__u32)bpf_htons(0x0100);
1879: r1 += r2
; iph->check = (__sum16)(check + (check >= 0xFFFF));
1880: r1 += 1
1881: r2 = *(u64 *)(r10 - 168)
1882: *(u16 *)(r2 + 10) = r1
1883: goto +3 <LBB0_155>
0000000000003ae0 LBB0_154:
; v6h->hop_limit--;
1884: r1 = *(u8 *)(r9 + 7)
1885: r1 += -1
1886: *(u8 *)(r9 + 7) = r1
0000000000003af8 LBB0_155:
; *ifindex = fib_params.ifindex;
1887: r1 = *(u32 *)(r10 - 56)
1888: *(u32 *)(r10 - 68) = r1
; __builtin_memcpy(source, fib_params.smac, ETH_ALEN);
1889: r1 = *(u32 *)(r10 - 12)
1890: *(u32 *)(r10 - 128) = r1
1891: r1 = *(u16 *)(r10 - 8)
1892: *(u16 *)(r10 - 124) = r1
; __builtin_memcpy(dest, fib_params.dmac, ETH_ALEN);
1893: r1 = *(u16 *)(r10 - 4)
1894: r2 = r1
1895: r2 <<= 16
1896: r3 = *(u16 *)(r10 - 6)
1897: r2 |= r3
1898: *(u32 *)(r10 - 136) = r2
1899: r2 = *(u16 *)(r10 - 2)
1900: *(u16 *)(r10 - 132) = r2
; __builtin_memcpy(p, dest, ETH_ALEN);
1901: *(u16 *)(r7 + 4) = r2
1902: *(u16 *)(r7 + 2) = r1
1903: *(u16 *)(r7 + 0) = r3
; __builtin_memcpy(p + 3, source, ETH_ALEN);
1904: r1 = *(u16 *)(r10 - 124)
1905: *(u16 *)(r7 + 10) = r1
1906: r1 = *(u32 *)(r10 - 128)
1907: *(u16 *)(r7 + 6) = r1
1908: r1 >>= 16
1909: *(u16 *)(r7 + 8) = r1
1910: r2 = r10
; *ifindex = fib_params.ifindex;
1911: r2 += -68
; if (!bpf_map_lookup_elem(&tx_port, &ifindex))
1912: r1 = 0 ll
1914: call 1
1915: r8 = 2
1916: if r0 == 0 goto -53 <LBB0_75>
; if (xdp->ingress_ifindex == ifindex)
1917: r1 = *(u32 *)(r6 + 12)
1918: r2 = *(u32 *)(r10 - 68)
1919: if r1 != r2 goto +1 <LBB0_158>
1920: goto -471 <LBB0_69>
0000000000003c08 LBB0_158:
1921: r1 = 29795
; bpf_printk("go to redirect");
1922: *(u16 *)(r10 - 52) = r1
1923: r1 = 1701996900
1924: *(u32 *)(r10 - 56) = r1
1925: r1 = 7309940808237477735 ll
1927: *(u64 *)(r10 - 64) = r1
1928: r1 = 0
1929: *(u8 *)(r10 - 50) = r1
1930: r1 = r10
1931: r1 += -64
1932: r2 = 15
1933: call 6
; return bpf_redirect_map(&tx_port, ifindex, 0);
1934: r2 = *(u32 *)(r10 - 68)
1935: goto -423 <LBB0_71>
Disassembly of section xdp_pass:
0000000000000000 xdp_pass_func:
; return XDP_PASS;
0: r0 = 2
1: exit
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment