xref: /openbmc/linux/tools/testing/selftests/net/test_ingress_egress_chaining.sh (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1*fd602f5cSPaul Blakey#!/bin/bash
2*fd602f5cSPaul Blakey# SPDX-License-Identifier: GPL-2.0
3*fd602f5cSPaul Blakey
4*fd602f5cSPaul Blakey# This test runs a simple ingress tc setup between two veth pairs,
5*fd602f5cSPaul Blakey# and chains a single egress rule to test ingress chaining to egress.
6*fd602f5cSPaul Blakey#
7*fd602f5cSPaul Blakey# Kselftest framework requirement - SKIP code is 4.
8*fd602f5cSPaul Blakeyksft_skip=4
9*fd602f5cSPaul Blakey
10*fd602f5cSPaul Blakeyif [ "$(id -u)" -ne 0 ];then
11*fd602f5cSPaul Blakey	echo "SKIP: Need root privileges"
12*fd602f5cSPaul Blakey	exit $ksft_skip
13*fd602f5cSPaul Blakeyfi
14*fd602f5cSPaul Blakey
15*fd602f5cSPaul Blakeyneeded_mods="act_mirred cls_flower sch_ingress"
16*fd602f5cSPaul Blakeyfor mod in $needed_mods; do
17*fd602f5cSPaul Blakey	modinfo $mod &>/dev/null || { echo "SKIP: Need act_mirred module"; exit $ksft_skip; }
18*fd602f5cSPaul Blakeydone
19*fd602f5cSPaul Blakey
20*fd602f5cSPaul Blakeyns="ns$((RANDOM%899+100))"
21*fd602f5cSPaul Blakeyveth1="veth1$((RANDOM%899+100))"
22*fd602f5cSPaul Blakeyveth2="veth2$((RANDOM%899+100))"
23*fd602f5cSPaul Blakeypeer1="peer1$((RANDOM%899+100))"
24*fd602f5cSPaul Blakeypeer2="peer2$((RANDOM%899+100))"
25*fd602f5cSPaul Blakeyip_peer1=198.51.100.5
26*fd602f5cSPaul Blakeyip_peer2=198.51.100.6
27*fd602f5cSPaul Blakey
28*fd602f5cSPaul Blakeyfunction fail() {
29*fd602f5cSPaul Blakey	echo "FAIL: $@" >> /dev/stderr
30*fd602f5cSPaul Blakey	exit 1
31*fd602f5cSPaul Blakey}
32*fd602f5cSPaul Blakey
33*fd602f5cSPaul Blakeyfunction cleanup() {
34*fd602f5cSPaul Blakey	killall -q -9 udpgso_bench_rx
35*fd602f5cSPaul Blakey	ip link del $veth1 &> /dev/null
36*fd602f5cSPaul Blakey	ip link del $veth2 &> /dev/null
37*fd602f5cSPaul Blakey	ip netns del $ns &> /dev/null
38*fd602f5cSPaul Blakey}
39*fd602f5cSPaul Blakeytrap cleanup EXIT
40*fd602f5cSPaul Blakey
41*fd602f5cSPaul Blakeyfunction config() {
42*fd602f5cSPaul Blakey	echo "Setup veth pairs [$veth1, $peer1], and veth pair [$veth2, $peer2]"
43*fd602f5cSPaul Blakey	ip link add $veth1 type veth peer name $peer1
44*fd602f5cSPaul Blakey	ip link add $veth2 type veth peer name $peer2
45*fd602f5cSPaul Blakey	ip addr add $ip_peer1/24 dev $peer1
46*fd602f5cSPaul Blakey	ip link set $peer1 up
47*fd602f5cSPaul Blakey	ip netns add $ns
48*fd602f5cSPaul Blakey	ip link set dev $peer2 netns $ns
49*fd602f5cSPaul Blakey	ip netns exec $ns ip addr add $ip_peer2/24 dev $peer2
50*fd602f5cSPaul Blakey	ip netns exec $ns ip link set $peer2 up
51*fd602f5cSPaul Blakey	ip link set $veth1 up
52*fd602f5cSPaul Blakey	ip link set $veth2 up
53*fd602f5cSPaul Blakey
54*fd602f5cSPaul Blakey	echo "Add tc filter ingress->egress forwarding $veth1 <-> $veth2"
55*fd602f5cSPaul Blakey	tc qdisc add dev $veth2 ingress
56*fd602f5cSPaul Blakey	tc qdisc add dev $veth1 ingress
57*fd602f5cSPaul Blakey	tc filter add dev $veth2 ingress prio 1 proto all flower \
58*fd602f5cSPaul Blakey		action mirred egress redirect dev $veth1
59*fd602f5cSPaul Blakey	tc filter add dev $veth1 ingress prio 1 proto all flower \
60*fd602f5cSPaul Blakey		action mirred egress redirect dev $veth2
61*fd602f5cSPaul Blakey
62*fd602f5cSPaul Blakey	echo "Add tc filter egress->ingress forwarding $peer1 -> $veth1, bypassing the veth pipe"
63*fd602f5cSPaul Blakey	tc qdisc add dev $peer1 clsact
64*fd602f5cSPaul Blakey	tc filter add dev $peer1 egress prio 20 proto ip flower \
65*fd602f5cSPaul Blakey		action mirred ingress redirect dev $veth1
66*fd602f5cSPaul Blakey}
67*fd602f5cSPaul Blakey
68*fd602f5cSPaul Blakeyfunction test_run() {
69*fd602f5cSPaul Blakey	echo "Run tcp traffic"
70*fd602f5cSPaul Blakey	./udpgso_bench_rx -t &
71*fd602f5cSPaul Blakey	sleep 1
72*fd602f5cSPaul Blakey	ip netns exec $ns timeout -k 2 10 ./udpgso_bench_tx -t -l 2 -4 -D $ip_peer1 || fail "traffic failed"
73*fd602f5cSPaul Blakey	echo "Test passed"
74*fd602f5cSPaul Blakey}
75*fd602f5cSPaul Blakey
76*fd602f5cSPaul Blakeyconfig
77*fd602f5cSPaul Blakeytest_run
78*fd602f5cSPaul Blakeytrap - EXIT
79*fd602f5cSPaul Blakeycleanup
80