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