Skip to content

Instantly share code, notes, and snippets.

@williamtu
Last active February 14, 2017 02:03
Show Gist options
  • Save williamtu/939238014d4f71d12b9a89186c0020a6 to your computer and use it in GitHub Desktop.
Save williamtu/939238014d4f71d12b9a89186c0020a6 to your computer and use it in GitHub Desktop.
xdp tx tunnel fails verifier
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
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