Last active
February 14, 2017 02:03
-
-
Save williamtu/939238014d4f71d12b9a89186c0020a6 to your computer and use it in GitHub Desktop.
xdp tx tunnel fails verifier
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
root@osboxes:~/net-next/samples/bpf# ./xdp_tx_iptunnel -i 2 -a 10.1.1.1 -p 10.2.2.2 -s 10.2.2.9 -d 10.1.2.3 -m 1:2:3:4:5:6 | |
bpf_load_program() err=13 | |
0: (b7) r2 = 1 | |
1: (bf) r3 = r1 | |
2: (07) r3 += 4 | |
3: (bf) r4 = r1 | |
4: (bf) r5 = r1 | |
5: (61) r0 = *(u32 *)(r1 +4) | |
6: (61) r1 = *(u32 *)(r1 +0) | |
7: (bf) r6 = r1 | |
8: (bf) r7 = r1 | |
9: (07) r7 += 14 | |
10: (7b) *(u64 *)(r10 -72) = r0 | |
11: (7b) *(u64 *)(r10 -80) = r2 | |
12: (7b) *(u64 *)(r10 -88) = r3 | |
13: (7b) *(u64 *)(r10 -96) = r4 | |
14: (7b) *(u64 *)(r10 -104) = r5 | |
15: (7b) *(u64 *)(r10 -112) = r1 | |
16: (7b) *(u64 *)(r10 -120) = r6 | |
17: (2d) if r7 > r0 goto pc+464 | |
R0=pkt_end R1=pkt(id=0,off=0,r=14) R2=imm1,min_value=1,max_value=1 R3=inv R4=ctx R5=ctx R6=pkt(id=0,off=0,r=14) R7=pkt(id=0,off=14,r=14) R10=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
18: (05) goto pc+0 | |
19: (79) r1 = *(u64 *)(r10 -120) | |
20: (71) r2 = *(u8 *)(r1 +12) | |
21: (71) r3 = *(u8 *)(r1 +13) | |
22: (67) r3 <<= 8 | |
23: (4f) r3 |= r2 | |
24: (b7) r2 = 2 | |
25: (7b) *(u64 *)(r10 -128) = r3 | |
26: (7b) *(u64 *)(r10 -136) = r2 | |
27: (15) if r3 == 0xdd86 goto pc+231 | |
R0=pkt_end R1=pkt(id=0,off=0,r=14) R2=imm2,min_value=2,max_value=2 R3=inv R4=ctx R5=ctx R6=pkt(id=0,off=0,r=14) R7=pkt(id=0,off=14,r=14) R10=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
28: (05) goto pc+0 | |
29: (79) r1 = *(u64 *)(r10 -136) | |
30: (79) r2 = *(u64 *)(r10 -128) | |
31: (7b) *(u64 *)(r10 -80) = r1 | |
32: (55) if r2 != 0x8 goto pc+449 | |
R0=pkt_end R1=inv R2=inv,min_value=8,max_value=8 R3=inv R4=ctx R5=ctx R6=pkt(id=0,off=0,r=14) R7=pkt(id=0,off=14,r=14) R10=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
33: (05) goto pc+0 | |
34: (b7) r1 = 0 | |
35: (7b) *(u64 *)(r10 -48) = r1 | |
36: (7b) *(u64 *)(r10 -56) = r1 | |
37: (7b) *(u64 *)(r10 -64) = r1 | |
38: (b7) r1 = 1 | |
39: (bf) r2 = r10 | |
40: (07) r2 += -64 | |
41: (79) r3 = *(u64 *)(r10 -112) | |
42: (79) r4 = *(u64 *)(r10 -112) | |
43: (07) r4 += 34 | |
44: (79) r5 = *(u64 *)(r10 -72) | |
45: (7b) *(u64 *)(r10 -144) = r1 | |
46: (7b) *(u64 *)(r10 -152) = r2 | |
47: (7b) *(u64 *)(r10 -160) = r3 | |
48: (2d) if r4 > r5 goto pc+207 | |
R0=pkt_end R1=imm1,min_value=1,max_value=1 R2=fp-64 R3=pkt(id=0,off=0,r=34) R4=pkt(id=0,off=34,r=34) R5=pkt_end R6=pkt(id=0,off=0,r=34) R7=pkt(id=0,off=14,r=34) R10=fp fp-160=pkt fp-152=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
49: (05) goto pc+0 | |
50: (b7) r1 = 0 | |
51: (79) r2 = *(u64 *)(r10 -72) | |
52: (79) r3 = *(u64 *)(r10 -160) | |
53: (71) r4 = *(u8 *)(r3 +23) | |
54: (bf) r5 = r4 | |
55: (7b) *(u64 *)(r10 -168) = r1 | |
56: (7b) *(u64 *)(r10 -176) = r2 | |
57: (7b) *(u64 *)(r10 -184) = r4 | |
58: (7b) *(u64 *)(r10 -192) = r5 | |
59: (15) if r4 == 0x6 goto pc+6 | |
R0=pkt_end R1=imm0,min_value=0,max_value=0 R2=pkt_end R3=pkt(id=0,off=0,r=34) R4=inv56 R5=inv56 R6=pkt(id=0,off=0,r=34) R7=pkt(id=0,off=14,r=34) R10=fp fp-176=pkt_end fp-160=pkt fp-152=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
60: (05) goto pc+0 | |
61: (79) r1 = *(u64 *)(r10 -168) | |
62: (79) r2 = *(u64 *)(r10 -184) | |
63: (7b) *(u64 *)(r10 -200) = r1 | |
64: (15) if r2 == 0x11 goto pc+12 | |
R0=pkt_end R1=inv R2=inv R3=pkt(id=0,off=0,r=34) R4=inv56 R5=inv56 R6=pkt(id=0,off=0,r=34) R7=pkt(id=0,off=14,r=34) R10=fp fp-176=pkt_end fp-160=pkt fp-152=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
65: (05) goto pc+22 | |
88: (79) r1 = *(u64 *)(r10 -200) | |
89: (79) r2 = *(u64 *)(r10 -192) | |
90: (73) *(u8 *)(r10 -44) = r2 | |
91: (b7) r3 = 2 | |
92: (6b) *(u16 *)(r10 -46) = r3 | |
93: (79) r4 = *(u64 *)(r10 -160) | |
94: (61) r5 = *(u32 *)(r4 +30) | |
95: (63) *(u32 *)(r10 -64) = r5 | |
96: (6b) *(u16 *)(r10 -48) = r1 | |
97: (69) r1 = *(u16 *)(r4 +16) | |
98: (18) r5 = 0xa610d000 | |
100: (7b) *(u64 *)(r10 -208) = r1 | |
101: (bf) r1 = r5 | |
102: (79) r2 = *(u64 *)(r10 -152) | |
103: (7b) *(u64 *)(r10 -216) = r3 | |
104: (85) call bpf_map_lookup_elem#1 | |
105: (bf) r1 = r10 | |
106: (07) r1 += -44 | |
107: (79) r2 = *(u64 *)(r10 -208) | |
108: (dc) (u32) r2 endian (u32) r0 | |
109: (bf) r3 = r0 | |
110: (79) r4 = *(u64 *)(r10 -216) | |
111: (7b) *(u64 *)(r10 -144) = r4 | |
112: (7b) *(u64 *)(r10 -224) = r1 | |
113: (7b) *(u64 *)(r10 -232) = r2 | |
114: (7b) *(u64 *)(r10 -240) = r3 | |
115: (15) if r0 == 0x0 goto pc+140 | |
R0=map_value(ks=24,vs=40,id=1),min_value=0,max_value=0 R1=fp-44 R2=inv R3=map_value(ks=24,vs=40,id=1),min_value=0,max_value=0 R4=inv R6=pkt(id=0,off=0,r=34) R7=pkt(id=0,off=14,r=34) R10=fp fp-240=map_value fp-224=fp fp-176=pkt_end fp-160=pkt fp-152=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
116: (05) goto pc+0 | |
117: (b7) r1 = 2 | |
118: (79) r2 = *(u64 *)(r10 -240) | |
119: (69) r3 = *(u16 *)(r2 +32) | |
120: (7b) *(u64 *)(r10 -144) = r1 | |
121: (55) if r3 != 0x2 goto pc+134 | |
R0=map_value(ks=24,vs=40,id=1),min_value=0,max_value=0 R1=imm2,min_value=2,max_value=2 R2=map_value(ks=24,vs=40,id=1) R3=inv48,min_value=2,max_value=2 R4=inv R6=pkt(id=0,off=0,r=34) R7=pkt(id=0,off=14,r=34) R10=fp fp-240=map_value fp-224=fp fp-176=pkt_end fp-160=pkt fp-152=fp fp-120=pkt fp-112=pkt fp-104=ctx fp-96=ctx fp-72=pkt_end | |
122: (05) goto pc+0 | |
123: (18) r2 = 0xffffffec | |
125: (79) r1 = *(u64 *)(r10 -104) | |
126: (85) call bpf_xdp_adjust_head#44 | |
127: (b7) r1 = 1 | |
128: (67) r0 <<= 32 | |
129: (77) r0 >>= 32 | |
130: (7b) *(u64 *)(r10 -144) = r1 | |
131: (55) if r0 != 0x0 goto pc+124 | |
R0=inv32,min_value=0,max_value=0 R1=imm1,min_value=1,max_value=1 R6=inv R7=inv R10=fp fp-240=map_value fp-224=fp fp-176=inv fp-160=inv fp-152=fp fp-120=inv fp-112=inv fp-104=ctx fp-96=ctx fp-72=inv | |
132: (05) goto pc+0 | |
133: (b7) r1 = 1 | |
134: (79) r2 = *(u64 *)(r10 -96) | |
135: (61) r3 = *(u32 *)(r2 +0) | |
136: (bf) r4 = r3 | |
137: (07) r4 += 20 | |
138: (79) r5 = *(u64 *)(r10 -88) | |
139: (61) r0 = *(u32 *)(r5 +0) | |
R5 invalid mem access 'inv' | |
load_bpf_file: Permission denied |
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
root@osboxes:~/net-next/samples/bpf# llvm-objdump -S -no-show-raw-insn xdp_tx_iptunnel_kern.o > xdp_tx_iptunnel_kern.S | |
root@osboxes:~/net-next/samples/bpf# llvm-objdump -S -no-show-raw-insn xdp_tx_iptunnel_kern.o | |
xdp_tx_iptunnel_kern.o: file format ELF64-BPF | |
Disassembly of section xdp_tx_iptunnel: | |
_xdp_tx_iptunnel: | |
; { | |
0: r2 = 1 | |
; void *data_end = (void *)(long)xdp->data_end; | |
1: r3 = r1 | |
2: r3 += 4 | |
; void *data = (void *)(long)xdp->data; | |
3: r4 = r1 | |
4: r5 = r1 | |
; void *data_end = (void *)(long)xdp->data_end; | |
5: r0 = *(u32 *)(r1 + 4) | |
; void *data = (void *)(long)xdp->data; | |
6: r1 = *(u32 *)(r1 + 0) | |
; struct ethhdr *eth = data; | |
7: r6 = r1 | |
; if (eth + 1 > data_end) | |
8: r7 = r1 | |
9: r7 += 14 | |
10: *(u64 *)(r10 - 72) = r0 | |
11: *(u64 *)(r10 - 80) = r2 | |
12: *(u64 *)(r10 - 88) = r3 | |
13: *(u64 *)(r10 - 96) = r4 | |
14: *(u64 *)(r10 - 104) = r5 | |
15: *(u64 *)(r10 - 112) = r1 | |
16: *(u64 *)(r10 - 120) = r6 | |
17: if r7 > r0 goto 464 | |
18: goto 0 | |
LBB0_1: | |
; h_proto = eth->h_proto; | |
19: r1 = *(u64 *)(r10 - 120) | |
20: r2 = *(u8 *)(r1 + 12) | |
21: r3 = *(u8 *)(r1 + 13) | |
22: r3 <<= 8 | |
23: r3 |= r2 | |
24: r2 = 2 | |
; if (h_proto == htons(ETH_P_IP)) | |
25: *(u64 *)(r10 - 128) = r3 | |
26: *(u64 *)(r10 - 136) = r2 | |
27: if r3 == 56710 goto 231 | |
28: goto 0 | |
LBB0_35: | |
29: r1 = *(u64 *)(r10 - 136) | |
30: r2 = *(u64 *)(r10 - 128) | |
31: *(u64 *)(r10 - 80) = r1 | |
32: if r2 != 8 goto 449 | |
33: goto 0 | |
LBB0_2: | |
; struct vip vip = {}; | |
34: r1 = 0 | |
35: *(u64 *)(r10 - 48) = r1 | |
36: *(u64 *)(r10 - 56) = r1 | |
37: *(u64 *)(r10 - 64) = r1 | |
38: r1 = 1 | |
39: r2 = r10 | |
40: r2 += -64 | |
; void *data = (void *)(long)xdp->data; | |
41: r3 = *(u64 *)(r10 - 112) | |
; if (iph + 1 > data_end) | |
42: r4 = *(u64 *)(r10 - 112) | |
43: r4 += 34 | |
44: r5 = *(u64 *)(r10 - 72) | |
45: *(u64 *)(r10 - 144) = r1 | |
46: *(u64 *)(r10 - 152) = r2 | |
47: *(u64 *)(r10 - 160) = r3 | |
48: if r4 > r5 goto 207 | |
49: goto 0 | |
LBB0_3: | |
50: r1 = 0 | |
; void *data_end = (void *)(long)xdp->data_end; | |
51: r2 = *(u64 *)(r10 - 72) | |
; vip.protocol = iph->protocol; | |
52: r3 = *(u64 *)(r10 - 160) | |
53: r4 = *(u8 *)(r3 + 23) | |
54: r5 = r4 | |
; switch (protocol) { | |
55: *(u64 *)(r10 - 168) = r1 | |
56: *(u64 *)(r10 - 176) = r2 | |
57: *(u64 *)(r10 - 184) = r4 | |
58: *(u64 *)(r10 - 192) = r5 | |
59: if r4 == 6 goto 6 | |
60: goto 0 | |
LBB0_37: | |
; return handle_ipv4(xdp); | |
61: r1 = *(u64 *)(r10 - 168) | |
62: r2 = *(u64 *)(r10 - 184) | |
63: *(u64 *)(r10 - 200) = r1 | |
64: if r2 == 17 goto 12 | |
65: goto 22 | |
LBB0_4: | |
66: r1 = 1 | |
; if (th + 1 > data_end) | |
67: r2 = *(u64 *)(r10 - 160) | |
68: r2 += 54 | |
69: r3 = *(u64 *)(r10 - 176) | |
70: *(u64 *)(r10 - 144) = r1 | |
71: if r2 > r3 goto 184 | |
72: goto 0 | |
LBB0_5: | |
; return th->dest; | |
73: r1 = *(u64 *)(r10 - 160) | |
74: r2 = *(u16 *)(r1 + 36) | |
75: *(u64 *)(r10 - 200) = r2 | |
76: goto 11 | |
LBB0_6: | |
77: r1 = 1 | |
; if (uh + 1 > data_end) | |
78: r2 = *(u64 *)(r10 - 160) | |
79: r2 += 42 | |
80: r3 = *(u64 *)(r10 - 176) | |
81: *(u64 *)(r10 - 144) = r1 | |
82: if r2 > r3 goto 173 | |
83: goto 0 | |
LBB0_7: | |
; return uh->dest; | |
84: r1 = *(u64 *)(r10 - 160) | |
85: r2 = *(u16 *)(r1 + 36) | |
86: *(u64 *)(r10 - 200) = r2 | |
87: goto 0 | |
LBB0_8: | |
; return handle_ipv4(xdp); | |
88: r1 = *(u64 *)(r10 - 200) | |
; vip.protocol = iph->protocol; | |
89: r2 = *(u64 *)(r10 - 192) | |
90: *(u8 *)(r10 - 44) = r2 | |
91: r3 = 2 | |
; vip.family = AF_INET; | |
92: *(u16 *)(r10 - 46) = r3 | |
; vip.daddr.v4 = iph->daddr; | |
93: r4 = *(u64 *)(r10 - 160) | |
94: r5 = *(u32 *)(r4 + 30) | |
95: *(u32 *)(r10 - 64) = r5 | |
; vip.dport = dport; | |
96: *(u16 *)(r10 - 48) = r1 | |
; payload_len = ntohs(iph->tot_len); | |
97: r1 = *(u16 *)(r4 + 16) | |
; tnl = bpf_map_lookup_elem(&vip2tnl, &vip); | |
98: r5 = 0ll | |
100: *(u64 *)(r10 - 208) = r1 | |
101: r1 = r5 | |
102: r2 = *(u64 *)(r10 - 152) | |
103: *(u64 *)(r10 - 216) = r3 | |
104: call 1 | |
; vip.protocol = iph->protocol; | |
105: r1 = r10 | |
106: r1 += -44 | |
; return ___constant_swab16(val); | |
107: r2 = *(u64 *)(r10 - 208) | |
108: bswap16 r2 | |
; tnl = bpf_map_lookup_elem(&vip2tnl, &vip); | |
109: r3 = r0 | |
; return handle_ipv4(xdp); | |
110: r4 = *(u64 *)(r10 - 216) | |
; if (!tnl || tnl->family != AF_INET) | |
111: *(u64 *)(r10 - 144) = r4 | |
112: *(u64 *)(r10 - 224) = r1 | |
113: *(u64 *)(r10 - 232) = r2 | |
114: *(u64 *)(r10 - 240) = r3 | |
115: if r0 == 0 goto 140 | |
116: goto 0 | |
LBB0_9: | |
117: r1 = 2 | |
118: r2 = *(u64 *)(r10 - 240) | |
119: r3 = *(u16 *)(r2 + 32) | |
120: *(u64 *)(r10 - 144) = r1 | |
121: if r3 != 2 goto 134 | |
122: goto 0 | |
LBB0_10: | |
; if (bpf_xdp_adjust_head(xdp, 0 - (int)sizeof(struct iphdr))) | |
123: r2 = 4294967276ll | |
125: r1 = *(u64 *)(r10 - 104) | |
126: call 44 | |
127: r1 = 1 | |
128: r0 <<= 32 | |
129: r0 >>= 32 | |
130: *(u64 *)(r10 - 144) = r1 | |
131: if r0 != 0 goto 124 | |
132: goto 0 | |
LBB0_11: | |
133: r1 = 1 | |
; data = (void *)(long)xdp->data; | |
134: r2 = *(u64 *)(r10 - 96) | |
135: r3 = *(u32 *)(r2 + 0) | |
; old_eth = data + sizeof(*iph); | |
136: r4 = r3 | |
137: r4 += 20 | |
; data_end = (void *)(long)xdp->data_end; | |
138: r5 = *(u64 *)(r10 - 88) | |
139: r0 = *(u32 *)(r5 + 0) | |
; new_eth = data; | |
140: r6 = r3 | |
; iph = data + sizeof(*new_eth); | |
141: r7 = r3 | |
142: r7 += 14 | |
; if (new_eth + 1 > data_end || | |
143: r8 = r0 | |
144: *(u64 *)(r10 - 248) = r8 | |
145: *(u64 *)(r10 - 256) = r3 | |
146: *(u64 *)(r10 - 264) = r4 | |
147: *(u64 *)(r10 - 272) = r0 | |
148: *(u64 *)(r10 - 280) = r6 | |
149: *(u64 *)(r10 - 288) = r7 | |
150: *(u64 *)(r10 - 144) = r1 | |
151: if r7 > r0 goto 104 | |
152: goto 0 | |
LBB0_12: | |
153: r1 = 1 | |
; old_eth + 1 > data_end || | |
154: r2 = *(u64 *)(r10 - 256) | |
155: r2 += 34 | |
156: r3 = *(u64 *)(r10 - 248) | |
157: *(u64 *)(r10 - 296) = r2 | |
158: *(u64 *)(r10 - 144) = r1 | |
159: if r2 > r3 goto 96 | |
160: goto 0 | |
LBB0_13: | |
161: r1 = 1 | |
; if (new_eth + 1 > data_end || | |
162: r2 = *(u64 *)(r10 - 296) | |
163: r3 = *(u64 *)(r10 - 272) | |
164: *(u64 *)(r10 - 144) = r1 | |
165: if r2 > r3 goto 90 | |
166: goto 0 | |
LBB0_14: | |
; memcpy(new_eth->h_source, old_eth->h_dest, sizeof(new_eth->h_source)); | |
167: r1 = *(u64 *)(r10 - 264) | |
168: r2 = *(u8 *)(r1 + 5) | |
169: r3 = *(u64 *)(r10 - 280) | |
170: *(u8 *)(r3 + 11) = r2 | |
171: r2 = *(u8 *)(r1 + 4) | |
172: *(u8 *)(r3 + 10) = r2 | |
173: r2 = *(u8 *)(r1 + 3) | |
174: *(u8 *)(r3 + 9) = r2 | |
175: r2 = *(u8 *)(r1 + 2) | |
176: *(u8 *)(r3 + 8) = r2 | |
177: r2 = *(u8 *)(r1 + 1) | |
178: *(u8 *)(r3 + 7) = r2 | |
179: r2 = *(u8 *)(r1 + 0) | |
180: *(u8 *)(r3 + 6) = r2 | |
; memcpy(new_eth->h_dest, tnl->dmac, sizeof(new_eth->h_dest)); | |
181: r2 = *(u64 *)(r10 - 240) | |
182: r4 = *(u8 *)(r2 + 39) | |
183: *(u8 *)(r3 + 5) = r4 | |
184: r4 = *(u8 *)(r2 + 38) | |
185: *(u8 *)(r3 + 4) = r4 | |
186: r4 = *(u8 *)(r2 + 37) | |
187: *(u8 *)(r3 + 3) = r4 | |
188: r4 = *(u8 *)(r2 + 36) | |
189: *(u8 *)(r3 + 2) = r4 | |
190: r4 = *(u8 *)(r2 + 35) | |
191: *(u8 *)(r3 + 1) = r4 | |
192: r4 = *(u8 *)(r2 + 34) | |
193: *(u8 *)(r3 + 0) = r4 | |
194: r4 = 0 | |
; new_eth->h_proto = h_proto; | |
195: *(u8 *)(r3 + 13) = r4 | |
196: r5 = 8 | |
197: *(u8 *)(r3 + 12) = r5 | |
; iph->ihl = sizeof(*iph) >> 2; | |
198: r0 = 69 | |
199: r6 = *(u64 *)(r10 - 288) | |
200: *(u8 *)(r6 + 0) = r0 | |
; iph->frag_off = 0; | |
201: *(u16 *)(r1 + 0) = r4 | |
202: r0 = 4 | |
; iph->protocol = IPPROTO_IPIP; | |
203: r7 = *(u64 *)(r10 - 256) | |
204: *(u8 *)(r7 + 23) = r0 | |
; iph->tos = 0; | |
205: *(u8 *)(r7 + 15) = r4 | |
; iph->tot_len = htons(payload_len + sizeof(*iph)); | |
206: r4 = *(u64 *)(r10 - 232) | |
207: r4 += 20 | |
; return ___constant_swab16(val); | |
208: bswap16 r4 | |
; iph->tot_len = htons(payload_len + sizeof(*iph)); | |
209: *(u16 *)(r7 + 16) = r4 | |
; iph->daddr = tnl->daddr.v4; | |
210: r0 = *(u32 *)(r2 + 16) | |
211: *(u32 *)(r7 + 30) = r0 | |
; iph->saddr = tnl->saddr.v4; | |
212: r8 = *(u32 *)(r2 + 0) | |
213: *(u32 *)(r7 + 26) = r8 | |
; iph->ttl = 8; | |
214: *(u8 *)(r7 + 22) = r5 | |
; csum += *next_iph_u16++; | |
215: r5 = *(u16 *)(r6 + 0) | |
216: r5 += r4 | |
217: r4 = *(u16 *)(r7 + 18) | |
218: r5 += r4 | |
219: r4 = *(u16 *)(r7 + 22) | |
220: r5 += r4 | |
221: r4 = r8 | |
222: r4 &= 65535 | |
223: r5 += r4 | |
224: r8 >>= 16 | |
225: r5 += r8 | |
226: r4 = r0 | |
227: r4 &= 65535 | |
228: r5 += r4 | |
229: r0 >>= 16 | |
230: r5 += r0 | |
; iph->check = ~((csum & 0xffff) + (csum >> 16)); | |
231: r4 = r5 | |
232: r4 >>= 16 | |
233: r4 += r5 | |
234: r4 ^= -1 | |
235: *(u16 *)(r7 + 24) = r4 | |
; count_tx(vip.protocol); | |
236: r4 = *(u64 *)(r10 - 224) | |
237: r5 = *(u8 *)(r4 + 0) | |
238: *(u32 *)(r10 - 36) = r5 | |
; rxcnt_count = bpf_map_lookup_elem(&rxcnt, &protocol); | |
239: r1 = 0ll | |
241: r2 = r10 | |
242: r2 += -36 | |
243: call 1 | |
244: r1 = r0 | |
; if (rxcnt_count) | |
245: *(u64 *)(r10 - 304) = r1 | |
246: if r0 == 0 goto 6 | |
247: goto 0 | |
LBB0_15: | |
; *rxcnt_count += 1; | |
248: r1 = *(u64 *)(r10 - 304) | |
249: r2 = *(u64 *)(r1 + 0) | |
250: r2 += 1 | |
251: *(u64 *)(r1 + 0) = r2 | |
252: goto 0 | |
LBB0_16: | |
253: r1 = 3 | |
; return XDP_TX; | |
254: *(u64 *)(r10 - 144) = r1 | |
255: goto 0 | |
LBB0_17: | |
; return handle_ipv4(xdp); | |
256: r1 = *(u64 *)(r10 - 144) | |
257: *(u64 *)(r10 - 80) = r1 | |
258: goto 223 | |
LBB0_18: | |
; struct vip vip = {}; | |
259: r1 = 0 | |
260: *(u64 *)(r10 - 16) = r1 | |
261: *(u64 *)(r10 - 24) = r1 | |
262: *(u64 *)(r10 - 32) = r1 | |
263: r1 = 1 | |
264: r2 = r10 | |
265: r2 += -32 | |
; void *data = (void *)(long)xdp->data; | |
266: r3 = *(u64 *)(r10 - 112) | |
; if (ip6h + 1 > data_end) | |
267: r4 = *(u64 *)(r10 - 112) | |
268: r4 += 54 | |
269: r5 = *(u64 *)(r10 - 72) | |
270: *(u64 *)(r10 - 312) = r1 | |
271: *(u64 *)(r10 - 320) = r2 | |
272: *(u64 *)(r10 - 328) = r3 | |
273: if r4 > r5 goto 205 | |
274: goto 0 | |
LBB0_19: | |
275: r1 = 0 | |
; void *data_end = (void *)(long)xdp->data_end; | |
276: r2 = *(u64 *)(r10 - 72) | |
; vip.protocol = ip6h->nexthdr; | |
277: r3 = *(u64 *)(r10 - 328) | |
278: r4 = *(u8 *)(r3 + 20) | |
279: r5 = r4 | |
; switch (protocol) { | |
280: *(u64 *)(r10 - 336) = r1 | |
281: *(u64 *)(r10 - 344) = r2 | |
282: *(u64 *)(r10 - 352) = r4 | |
283: *(u64 *)(r10 - 360) = r5 | |
284: if r4 == 6 goto 6 | |
285: goto 0 | |
LBB0_36: | |
; return handle_ipv6(xdp); | |
286: r1 = *(u64 *)(r10 - 336) | |
287: r2 = *(u64 *)(r10 - 352) | |
288: *(u64 *)(r10 - 368) = r1 | |
289: if r2 == 17 goto 12 | |
290: goto 22 | |
LBB0_20: | |
291: r1 = 1 | |
; if (th + 1 > data_end) | |
292: r2 = *(u64 *)(r10 - 328) | |
293: r2 += 74 | |
294: r3 = *(u64 *)(r10 - 344) | |
295: *(u64 *)(r10 - 312) = r1 | |
296: if r2 > r3 goto 182 | |
297: goto 0 | |
LBB0_21: | |
; return th->dest; | |
298: r1 = *(u64 *)(r10 - 328) | |
299: r2 = *(u16 *)(r1 + 56) | |
300: *(u64 *)(r10 - 368) = r2 | |
301: goto 11 | |
LBB0_22: | |
302: r1 = 1 | |
; if (uh + 1 > data_end) | |
303: r2 = *(u64 *)(r10 - 328) | |
304: r2 += 62 | |
305: r3 = *(u64 *)(r10 - 344) | |
306: *(u64 *)(r10 - 312) = r1 | |
307: if r2 > r3 goto 171 | |
308: goto 0 | |
LBB0_23: | |
; return uh->dest; | |
309: r1 = *(u64 *)(r10 - 328) | |
310: r2 = *(u16 *)(r1 + 56) | |
311: *(u64 *)(r10 - 368) = r2 | |
312: goto 0 | |
LBB0_24: | |
; return handle_ipv6(xdp); | |
313: r1 = *(u64 *)(r10 - 368) | |
; vip.protocol = ip6h->nexthdr; | |
314: r2 = *(u64 *)(r10 - 360) | |
315: *(u8 *)(r10 - 12) = r2 | |
; vip.family = AF_INET6; | |
316: r3 = 10 | |
317: *(u16 *)(r10 - 14) = r3 | |
; memcpy(vip.daddr.v6, ip6h->daddr.s6_addr32, sizeof(vip.daddr)); | |
318: r3 = *(u64 *)(r10 - 328) | |
319: r4 = *(u32 *)(r3 + 50) | |
320: r5 = *(u64 *)(r10 - 320) | |
321: *(u32 *)(r5 + 12) = r4 | |
322: r4 = *(u32 *)(r3 + 46) | |
323: *(u32 *)(r5 + 8) = r4 | |
324: r4 = *(u32 *)(r3 + 42) | |
325: *(u32 *)(r5 + 4) = r4 | |
326: r4 = *(u32 *)(r3 + 38) | |
327: *(u32 *)(r5 + 0) = r4 | |
; vip.dport = dport; | |
328: *(u16 *)(r10 - 16) = r1 | |
; payload_len = ip6h->payload_len; | |
329: r1 = *(u16 *)(r3 + 18) | |
; tnl = bpf_map_lookup_elem(&vip2tnl, &vip); | |
330: r4 = 0ll | |
332: *(u64 *)(r10 - 376) = r1 | |
333: r1 = r4 | |
334: r2 = r5 | |
335: call 1 | |
336: r1 = 2 | |
; vip.protocol = ip6h->nexthdr; | |
337: r2 = r10 | |
338: r2 += -12 | |
; tnl = bpf_map_lookup_elem(&vip2tnl, &vip); | |
339: r3 = r0 | |
; if (!tnl || tnl->family != AF_INET6) | |
340: *(u64 *)(r10 - 312) = r1 | |
341: *(u64 *)(r10 - 384) = r3 | |
342: *(u64 *)(r10 - 392) = r2 | |
343: if r0 == 0 goto 135 | |
344: goto 0 | |
LBB0_25: | |
345: r1 = 2 | |
346: r2 = *(u64 *)(r10 - 384) | |
347: r3 = *(u16 *)(r2 + 32) | |
348: *(u64 *)(r10 - 312) = r1 | |
349: if r3 != 10 goto 129 | |
350: goto 0 | |
LBB0_26: | |
; if (bpf_xdp_adjust_head(xdp, 0 - (int)sizeof(struct ipv6hdr))) | |
351: r2 = 4294967256ll | |
353: r1 = *(u64 *)(r10 - 104) | |
354: call 44 | |
355: r1 = 1 | |
356: r0 <<= 32 | |
357: r0 >>= 32 | |
358: *(u64 *)(r10 - 312) = r1 | |
359: if r0 != 0 goto 119 | |
360: goto 0 | |
LBB0_27: | |
361: r1 = 1 | |
; data = (void *)(long)xdp->data; | |
362: r2 = *(u64 *)(r10 - 96) | |
363: r3 = *(u32 *)(r2 + 0) | |
; old_eth = data + sizeof(*ip6h); | |
364: r4 = r3 | |
365: r4 += 40 | |
; data_end = (void *)(long)xdp->data_end; | |
366: r5 = *(u64 *)(r10 - 88) | |
367: r0 = *(u32 *)(r5 + 0) | |
; new_eth = data; | |
368: r6 = r3 | |
; ip6h = data + sizeof(*new_eth); | |
369: r7 = r3 | |
370: r7 += 14 | |
; if (new_eth + 1 > data_end || | |
371: r8 = r0 | |
372: *(u64 *)(r10 - 400) = r8 | |
373: *(u64 *)(r10 - 408) = r3 | |
374: *(u64 *)(r10 - 416) = r4 | |
375: *(u64 *)(r10 - 424) = r0 | |
376: *(u64 *)(r10 - 432) = r6 | |
377: *(u64 *)(r10 - 440) = r7 | |
378: *(u64 *)(r10 - 312) = r1 | |
379: if r7 > r0 goto 99 | |
380: goto 0 | |
LBB0_28: | |
381: r1 = 1 | |
; old_eth + 1 > data_end || | |
382: r2 = *(u64 *)(r10 - 408) | |
383: r2 += 54 | |
384: r3 = *(u64 *)(r10 - 400) | |
385: *(u64 *)(r10 - 448) = r2 | |
386: *(u64 *)(r10 - 312) = r1 | |
387: if r2 > r3 goto 91 | |
388: goto 0 | |
LBB0_29: | |
389: r1 = 1 | |
; if (new_eth + 1 > data_end || | |
390: r2 = *(u64 *)(r10 - 448) | |
391: r3 = *(u64 *)(r10 - 424) | |
392: *(u64 *)(r10 - 312) = r1 | |
393: if r2 > r3 goto 85 | |
394: goto 0 | |
LBB0_30: | |
; memcpy(new_eth->h_source, old_eth->h_dest, sizeof(new_eth->h_source)); | |
395: r1 = *(u64 *)(r10 - 416) | |
396: r2 = *(u8 *)(r1 + 5) | |
397: r3 = *(u64 *)(r10 - 432) | |
398: *(u8 *)(r3 + 11) = r2 | |
399: r2 = *(u8 *)(r1 + 4) | |
400: *(u8 *)(r3 + 10) = r2 | |
401: r2 = *(u8 *)(r1 + 3) | |
402: *(u8 *)(r3 + 9) = r2 | |
403: r2 = *(u8 *)(r1 + 2) | |
404: *(u8 *)(r3 + 8) = r2 | |
405: r2 = *(u8 *)(r1 + 1) | |
406: *(u8 *)(r3 + 7) = r2 | |
407: r2 = *(u8 *)(r1 + 0) | |
408: *(u8 *)(r3 + 6) = r2 | |
; memcpy(new_eth->h_dest, tnl->dmac, sizeof(new_eth->h_dest)); | |
409: r2 = *(u64 *)(r10 - 384) | |
410: r4 = *(u8 *)(r2 + 39) | |
411: *(u8 *)(r3 + 5) = r4 | |
412: r4 = *(u8 *)(r2 + 38) | |
413: *(u8 *)(r3 + 4) = r4 | |
414: r4 = *(u8 *)(r2 + 37) | |
415: *(u8 *)(r3 + 3) = r4 | |
416: r4 = *(u8 *)(r2 + 36) | |
417: *(u8 *)(r3 + 2) = r4 | |
418: r4 = *(u8 *)(r2 + 35) | |
419: *(u8 *)(r3 + 1) = r4 | |
420: r4 = *(u8 *)(r2 + 34) | |
421: *(u8 *)(r3 + 0) = r4 | |
; new_eth->h_proto = h_proto; | |
422: r4 = 221 | |
423: *(u8 *)(r3 + 13) = r4 | |
424: r4 = 134 | |
425: *(u8 *)(r3 + 12) = r4 | |
; ip6h->priority = 0; | |
426: r4 = 96 | |
427: r5 = *(u64 *)(r10 - 440) | |
428: *(u8 *)(r5 + 0) = r4 | |
429: r4 = 0 | |
; memset(ip6h->flow_lbl, 0, sizeof(ip6h->flow_lbl)); | |
430: r0 = *(u64 *)(r10 - 408) | |
431: *(u8 *)(r0 + 16) = r4 | |
432: *(u8 *)(r0 + 15) = r4 | |
433: *(u8 *)(r0 + 17) = r4 | |
; return ___constant_swab16(val); | |
434: r4 = *(u64 *)(r10 - 376) | |
435: bswap16 r4 | |
; ip6h->payload_len = htons(ntohs(payload_len) + sizeof(*ip6h)); | |
436: r4 += 40 | |
; return ___constant_swab16(val); | |
437: bswap16 r4 | |
; ip6h->payload_len = htons(ntohs(payload_len) + sizeof(*ip6h)); | |
438: *(u16 *)(r0 + 18) = r4 | |
; ip6h->nexthdr = IPPROTO_IPV6; | |
439: r4 = 41 | |
440: *(u8 *)(r0 + 20) = r4 | |
441: r4 = 8 | |
; ip6h->hop_limit = 8; | |
442: *(u8 *)(r0 + 21) = r4 | |
; memcpy(ip6h->saddr.s6_addr32, tnl->saddr.v6, sizeof(tnl->saddr.v6)); | |
443: r4 = *(u32 *)(r2 + 12) | |
444: *(u32 *)(r0 + 34) = r4 | |
445: r4 = *(u32 *)(r2 + 8) | |
446: *(u32 *)(r0 + 30) = r4 | |
447: r4 = *(u32 *)(r2 + 4) | |
448: *(u32 *)(r0 + 26) = r4 | |
449: r4 = *(u32 *)(r2 + 0) | |
450: *(u32 *)(r0 + 22) = r4 | |
; memcpy(ip6h->daddr.s6_addr32, tnl->daddr.v6, sizeof(tnl->daddr.v6)); | |
451: r4 = *(u32 *)(r2 + 28) | |
452: *(u32 *)(r0 + 50) = r4 | |
453: r4 = *(u32 *)(r2 + 24) | |
454: *(u32 *)(r0 + 46) = r4 | |
455: r4 = *(u32 *)(r2 + 20) | |
456: *(u32 *)(r0 + 42) = r4 | |
457: r4 = *(u32 *)(r2 + 16) | |
458: *(u32 *)(r0 + 38) = r4 | |
; count_tx(vip.protocol); | |
459: r4 = *(u64 *)(r10 - 392) | |
460: r6 = *(u8 *)(r4 + 0) | |
461: *(u32 *)(r10 - 4) = r6 | |
; rxcnt_count = bpf_map_lookup_elem(&rxcnt, &protocol); | |
462: r1 = 0ll | |
464: r2 = r10 | |
465: r2 += -4 | |
466: call 1 | |
467: r1 = r0 | |
; if (rxcnt_count) | |
468: *(u64 *)(r10 - 456) = r1 | |
469: if r0 == 0 goto 6 | |
470: goto 0 | |
LBB0_31: | |
; *rxcnt_count += 1; | |
471: r1 = *(u64 *)(r10 - 456) | |
472: r2 = *(u64 *)(r1 + 0) | |
473: r2 += 1 | |
474: *(u64 *)(r1 + 0) = r2 | |
475: goto 0 | |
LBB0_32: | |
476: r1 = 3 | |
; return XDP_TX; | |
477: *(u64 *)(r10 - 312) = r1 | |
478: goto 0 | |
LBB0_33: | |
; return handle_ipv6(xdp); | |
479: r1 = *(u64 *)(r10 - 312) | |
480: *(u64 *)(r10 - 80) = r1 | |
481: goto 0 | |
LBB0_34: | |
482: r1 = *(u64 *)(r10 - 80) | |
; } | |
483: r0 = r1 | |
484: exit |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment