]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - samples/bpf/test_lwt_bpf.sh
Merge tag 'pci-v4.13-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
[karo-tx-linux.git] / samples / bpf / test_lwt_bpf.sh
1 #!/bin/bash
2
3 # Uncomment to see generated bytecode
4 #VERBOSE=verbose
5
6 NS1=lwt_ns1
7 NS2=lwt_ns2
8 VETH0=tst_lwt1a
9 VETH1=tst_lwt1b
10 VETH2=tst_lwt2a
11 VETH3=tst_lwt2b
12 IPVETH0="192.168.254.1"
13 IPVETH1="192.168.254.2"
14 IPVETH1b="192.168.254.3"
15
16 IPVETH2="192.168.111.1"
17 IPVETH3="192.168.111.2"
18
19 IP_LOCAL="192.168.99.1"
20
21 TRACE_ROOT=/sys/kernel/debug/tracing
22
23 function lookup_mac()
24 {
25         set +x
26         if [ ! -z "$2" ]; then
27                 MAC=$(ip netns exec $2 ip link show $1 | grep ether | awk '{print $2}')
28         else
29                 MAC=$(ip link show $1 | grep ether | awk '{print $2}')
30         fi
31         MAC="${MAC//:/}"
32         echo "0x${MAC:10:2}${MAC:8:2}${MAC:6:2}${MAC:4:2}${MAC:2:2}${MAC:0:2}"
33         set -x
34 }
35
36 function cleanup {
37         set +ex
38         rm test_lwt_bpf.o 2> /dev/null
39         ip link del $VETH0 2> /dev/null
40         ip link del $VETH1 2> /dev/null
41         ip link del $VETH2 2> /dev/null
42         ip link del $VETH3 2> /dev/null
43         ip netns exec $NS1 killall netserver
44         ip netns delete $NS1 2> /dev/null
45         ip netns delete $NS2 2> /dev/null
46         set -ex
47 }
48
49 function setup_one_veth {
50         ip netns add $1
51         ip link add $2 type veth peer name $3
52         ip link set dev $2 up
53         ip addr add $4/24 dev $2
54         ip link set $3 netns $1
55         ip netns exec $1 ip link set dev $3 up
56         ip netns exec $1 ip addr add $5/24 dev $3
57
58         if [ "$6" ]; then
59                 ip netns exec $1 ip addr add $6/32 dev $3
60         fi
61 }
62
63 function get_trace {
64         set +x
65         cat ${TRACE_ROOT}/trace | grep -v '^#'
66         set -x
67 }
68
69 function cleanup_routes {
70         ip route del ${IPVETH1}/32 dev $VETH0 2> /dev/null || true
71         ip route del table local local ${IP_LOCAL}/32 dev lo 2> /dev/null || true
72 }
73
74 function install_test {
75         cleanup_routes
76         cp /dev/null ${TRACE_ROOT}/trace
77
78         OPTS="encap bpf headroom 14 $1 obj test_lwt_bpf.o section $2 $VERBOSE"
79
80         if [ "$1" == "in" ];  then
81                 ip route add table local local ${IP_LOCAL}/32 $OPTS dev lo
82         else
83                 ip route add ${IPVETH1}/32 $OPTS dev $VETH0
84         fi
85 }
86
87 function remove_prog {
88         if [ "$1" == "in" ];  then
89                 ip route del table local local ${IP_LOCAL}/32 dev lo
90         else
91                 ip route del ${IPVETH1}/32 dev $VETH0
92         fi
93 }
94
95 function filter_trace {
96         # Add newline to allow starting EXPECT= variables on newline
97         NL=$'\n'
98         echo "${NL}$*" | sed -e 's/^.*: : //g'
99 }
100
101 function expect_fail {
102         set +x
103         echo "FAIL:"
104         echo "Expected: $1"
105         echo "Got: $2"
106         set -x
107         exit 1
108 }
109
110 function match_trace {
111         set +x
112         RET=0
113         TRACE=$1
114         EXPECT=$2
115         GOT="$(filter_trace "$TRACE")"
116
117         [ "$GOT" != "$EXPECT" ] && {
118                 expect_fail "$EXPECT" "$GOT"
119                 RET=1
120         }
121         set -x
122         return $RET
123 }
124
125 function test_start {
126         set +x
127         echo "----------------------------------------------------------------"
128         echo "Starting test: $*"
129         echo "----------------------------------------------------------------"
130         set -x
131 }
132
133 function failure {
134         get_trace
135         echo "FAIL: $*"
136         exit 1
137 }
138
139 function test_ctx_xmit {
140         test_start "test_ctx on lwt xmit"
141         install_test xmit test_ctx
142         ping -c 3 $IPVETH1 || {
143                 failure "test_ctx xmit: packets are dropped"
144         }
145         match_trace "$(get_trace)" "
146 len 84 hash 0 protocol 8
147 cb 1234 ingress_ifindex 0 ifindex $DST_IFINDEX
148 len 84 hash 0 protocol 8
149 cb 1234 ingress_ifindex 0 ifindex $DST_IFINDEX
150 len 84 hash 0 protocol 8
151 cb 1234 ingress_ifindex 0 ifindex $DST_IFINDEX" || exit 1
152         remove_prog xmit
153 }
154
155 function test_ctx_out {
156         test_start "test_ctx on lwt out"
157         install_test out test_ctx
158         ping -c 3 $IPVETH1 || {
159                 failure "test_ctx out: packets are dropped"
160         }
161         match_trace "$(get_trace)" "
162 len 84 hash 0 protocol 0
163 cb 1234 ingress_ifindex 0 ifindex 0
164 len 84 hash 0 protocol 0
165 cb 1234 ingress_ifindex 0 ifindex 0
166 len 84 hash 0 protocol 0
167 cb 1234 ingress_ifindex 0 ifindex 0" || exit 1
168         remove_prog out
169 }
170
171 function test_ctx_in {
172         test_start "test_ctx on lwt in"
173         install_test in test_ctx
174         ping -c 3 $IP_LOCAL || {
175                 failure "test_ctx out: packets are dropped"
176         }
177         # We will both request & reply packets as the packets will
178         # be from $IP_LOCAL => $IP_LOCAL
179         match_trace "$(get_trace)" "
180 len 84 hash 0 protocol 8
181 cb 1234 ingress_ifindex 1 ifindex 1
182 len 84 hash 0 protocol 8
183 cb 1234 ingress_ifindex 1 ifindex 1
184 len 84 hash 0 protocol 8
185 cb 1234 ingress_ifindex 1 ifindex 1
186 len 84 hash 0 protocol 8
187 cb 1234 ingress_ifindex 1 ifindex 1
188 len 84 hash 0 protocol 8
189 cb 1234 ingress_ifindex 1 ifindex 1
190 len 84 hash 0 protocol 8
191 cb 1234 ingress_ifindex 1 ifindex 1" || exit 1
192         remove_prog in
193 }
194
195 function test_data {
196         test_start "test_data on lwt $1"
197         install_test $1 test_data
198         ping -c 3 $IPVETH1 || {
199                 failure "test_data ${1}: packets are dropped"
200         }
201         match_trace "$(get_trace)" "
202 src: 1fea8c0 dst: 2fea8c0
203 src: 1fea8c0 dst: 2fea8c0
204 src: 1fea8c0 dst: 2fea8c0" || exit 1
205         remove_prog $1
206 }
207
208 function test_data_in {
209         test_start "test_data on lwt in"
210         install_test in test_data
211         ping -c 3 $IP_LOCAL || {
212                 failure "test_data in: packets are dropped"
213         }
214         # We will both request & reply packets as the packets will
215         # be from $IP_LOCAL => $IP_LOCAL
216         match_trace "$(get_trace)" "
217 src: 163a8c0 dst: 163a8c0
218 src: 163a8c0 dst: 163a8c0
219 src: 163a8c0 dst: 163a8c0
220 src: 163a8c0 dst: 163a8c0
221 src: 163a8c0 dst: 163a8c0
222 src: 163a8c0 dst: 163a8c0" || exit 1
223         remove_prog in
224 }
225
226 function test_cb {
227         test_start "test_cb on lwt $1"
228         install_test $1 test_cb
229         ping -c 3 $IPVETH1 || {
230                 failure "test_cb ${1}: packets are dropped"
231         }
232         match_trace "$(get_trace)" "
233 cb0: 0 cb1: 0 cb2: 0
234 cb3: 0 cb4: 0
235 cb0: 0 cb1: 0 cb2: 0
236 cb3: 0 cb4: 0
237 cb0: 0 cb1: 0 cb2: 0
238 cb3: 0 cb4: 0" || exit 1
239         remove_prog $1
240 }
241
242 function test_cb_in {
243         test_start "test_cb on lwt in"
244         install_test in test_cb
245         ping -c 3 $IP_LOCAL || {
246                 failure "test_cb in: packets are dropped"
247         }
248         # We will both request & reply packets as the packets will
249         # be from $IP_LOCAL => $IP_LOCAL
250         match_trace "$(get_trace)" "
251 cb0: 0 cb1: 0 cb2: 0
252 cb3: 0 cb4: 0
253 cb0: 0 cb1: 0 cb2: 0
254 cb3: 0 cb4: 0
255 cb0: 0 cb1: 0 cb2: 0
256 cb3: 0 cb4: 0
257 cb0: 0 cb1: 0 cb2: 0
258 cb3: 0 cb4: 0
259 cb0: 0 cb1: 0 cb2: 0
260 cb3: 0 cb4: 0
261 cb0: 0 cb1: 0 cb2: 0
262 cb3: 0 cb4: 0" || exit 1
263         remove_prog in
264 }
265
266 function test_drop_all {
267         test_start "test_drop_all on lwt $1"
268         install_test $1 drop_all
269         ping -c 3 $IPVETH1 && {
270                 failure "test_drop_all ${1}: Unexpected success of ping"
271         }
272         match_trace "$(get_trace)" "
273 dropping with: 2
274 dropping with: 2
275 dropping with: 2" || exit 1
276         remove_prog $1
277 }
278
279 function test_drop_all_in {
280         test_start "test_drop_all on lwt in"
281         install_test in drop_all
282         ping -c 3 $IP_LOCAL && {
283                 failure "test_drop_all in: Unexpected success of ping"
284         }
285         match_trace "$(get_trace)" "
286 dropping with: 2
287 dropping with: 2
288 dropping with: 2" || exit 1
289         remove_prog in
290 }
291
292 function test_push_ll_and_redirect {
293         test_start "test_push_ll_and_redirect on lwt xmit"
294         install_test xmit push_ll_and_redirect
295         ping -c 3 $IPVETH1 || {
296                 failure "Redirected packets appear to be dropped"
297         }
298         match_trace "$(get_trace)" "
299 redirected to $DST_IFINDEX
300 redirected to $DST_IFINDEX
301 redirected to $DST_IFINDEX" || exit 1
302         remove_prog xmit
303 }
304
305 function test_no_l2_and_redirect {
306         test_start "test_no_l2_and_redirect on lwt xmit"
307         install_test xmit fill_garbage_and_redirect
308         ping -c 3 $IPVETH1 && {
309                 failure "Unexpected success despite lack of L2 header"
310         }
311         match_trace "$(get_trace)" "
312 redirected to $DST_IFINDEX
313 redirected to $DST_IFINDEX
314 redirected to $DST_IFINDEX" || exit 1
315         remove_prog xmit
316 }
317
318 function test_rewrite {
319         test_start "test_rewrite on lwt xmit"
320         install_test xmit test_rewrite
321         ping -c 3 $IPVETH1 || {
322                 failure "Rewritten packets appear to be dropped"
323         }
324         match_trace "$(get_trace)" "
325 out: rewriting from 2fea8c0 to 3fea8c0
326 out: rewriting from 2fea8c0 to 3fea8c0
327 out: rewriting from 2fea8c0 to 3fea8c0" || exit 1
328         remove_prog out
329 }
330
331 function test_fill_garbage {
332         test_start "test_fill_garbage on lwt xmit"
333         install_test xmit fill_garbage
334         ping -c 3 $IPVETH1 && {
335                 failure "test_drop_all ${1}: Unexpected success of ping"
336         }
337         match_trace "$(get_trace)" "
338 Set initial 96 bytes of header to FF
339 Set initial 96 bytes of header to FF
340 Set initial 96 bytes of header to FF" || exit 1
341         remove_prog xmit
342 }
343
344 function test_netperf_nop {
345         test_start "test_netperf_nop on lwt xmit"
346         install_test xmit nop
347         netperf -H $IPVETH1 -t TCP_STREAM || {
348                 failure "packets appear to be dropped"
349         }
350         match_trace "$(get_trace)" ""|| exit 1
351         remove_prog xmit
352 }
353
354 function test_netperf_redirect {
355         test_start "test_netperf_redirect on lwt xmit"
356         install_test xmit push_ll_and_redirect_silent
357         netperf -H $IPVETH1 -t TCP_STREAM || {
358                 failure "Rewritten packets appear to be dropped"
359         }
360         match_trace "$(get_trace)" ""|| exit 1
361         remove_prog xmit
362 }
363
364 cleanup
365 setup_one_veth $NS1 $VETH0 $VETH1 $IPVETH0 $IPVETH1 $IPVETH1b
366 setup_one_veth $NS2 $VETH2 $VETH3 $IPVETH2 $IPVETH3
367 ip netns exec $NS1 netserver
368 echo 1 > ${TRACE_ROOT}/tracing_on
369
370 DST_MAC=$(lookup_mac $VETH1 $NS1)
371 SRC_MAC=$(lookup_mac $VETH0)
372 DST_IFINDEX=$(cat /sys/class/net/$VETH0/ifindex)
373
374 CLANG_OPTS="-O2 -target bpf -I ../include/"
375 CLANG_OPTS+=" -DSRC_MAC=$SRC_MAC -DDST_MAC=$DST_MAC -DDST_IFINDEX=$DST_IFINDEX"
376 clang $CLANG_OPTS -c test_lwt_bpf.c -o test_lwt_bpf.o
377
378 test_ctx_xmit
379 test_ctx_out
380 test_ctx_in
381 test_data "xmit"
382 test_data "out"
383 test_data_in
384 test_cb "xmit"
385 test_cb "out"
386 test_cb_in
387 test_drop_all "xmit"
388 test_drop_all "out"
389 test_drop_all_in
390 test_rewrite
391 test_push_ll_and_redirect
392 test_no_l2_and_redirect
393 test_fill_garbage
394 test_netperf_nop
395 test_netperf_redirect
396
397 cleanup
398 echo 0 > ${TRACE_ROOT}/tracing_on
399 exit 0