Created
January 4, 2021 10:23
-
-
Save takehaya/a4cdf65ae2aca7ab4c9ad908a2fe931a to your computer and use it in GitHub Desktop.
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
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