1d67a94e8SPetr Machata#!/bin/bash 2d67a94e8SPetr Machata# SPDX-License-Identifier: GPL-2.0 3d67a94e8SPetr Machata 4d67a94e8SPetr Machata# Test for resource limit of offloaded flower rules. The test adds a given 5abfce9e0SDanielle Ratson# number of flower matches for different IPv6 addresses, then check the offload 6abfce9e0SDanielle Ratson# indication for all of the tc flower rules. This file contains functions to set 7abfce9e0SDanielle Ratson# up a testing topology and run the test, and is meant to be sourced from a test 8d67a94e8SPetr Machata# script that calls the testing routine with a given number of rules. 9d67a94e8SPetr Machata 10d67a94e8SPetr MachataTC_FLOWER_NUM_NETIFS=2 11d67a94e8SPetr Machata 12d67a94e8SPetr Machatatc_flower_h1_create() 13d67a94e8SPetr Machata{ 14d67a94e8SPetr Machata simple_if_init $h1 15d67a94e8SPetr Machata tc qdisc add dev $h1 clsact 16d67a94e8SPetr Machata} 17d67a94e8SPetr Machata 18d67a94e8SPetr Machatatc_flower_h1_destroy() 19d67a94e8SPetr Machata{ 20d67a94e8SPetr Machata tc qdisc del dev $h1 clsact 21d67a94e8SPetr Machata simple_if_fini $h1 22d67a94e8SPetr Machata} 23d67a94e8SPetr Machata 24d67a94e8SPetr Machatatc_flower_h2_create() 25d67a94e8SPetr Machata{ 26d67a94e8SPetr Machata simple_if_init $h2 27d67a94e8SPetr Machata tc qdisc add dev $h2 clsact 28d67a94e8SPetr Machata} 29d67a94e8SPetr Machata 30d67a94e8SPetr Machatatc_flower_h2_destroy() 31d67a94e8SPetr Machata{ 32d67a94e8SPetr Machata tc qdisc del dev $h2 clsact 33d67a94e8SPetr Machata simple_if_fini $h2 34d67a94e8SPetr Machata} 35d67a94e8SPetr Machata 36d67a94e8SPetr Machatatc_flower_setup_prepare() 37d67a94e8SPetr Machata{ 38d67a94e8SPetr Machata h1=${NETIFS[p1]} 39d67a94e8SPetr Machata h2=${NETIFS[p2]} 40d67a94e8SPetr Machata 41d67a94e8SPetr Machata vrf_prepare 42d67a94e8SPetr Machata 43d67a94e8SPetr Machata tc_flower_h1_create 44d67a94e8SPetr Machata tc_flower_h2_create 45d67a94e8SPetr Machata} 46d67a94e8SPetr Machata 47d67a94e8SPetr Machatatc_flower_cleanup() 48d67a94e8SPetr Machata{ 49d67a94e8SPetr Machata pre_cleanup 50d67a94e8SPetr Machata 51d67a94e8SPetr Machata tc_flower_h2_destroy 52d67a94e8SPetr Machata tc_flower_h1_destroy 53d67a94e8SPetr Machata 54d67a94e8SPetr Machata vrf_cleanup 55d67a94e8SPetr Machata 56d67a94e8SPetr Machata if [[ -v TC_FLOWER_BATCH_FILE ]]; then 57d67a94e8SPetr Machata rm -f $TC_FLOWER_BATCH_FILE 58d67a94e8SPetr Machata fi 59d67a94e8SPetr Machata} 60d67a94e8SPetr Machata 61d67a94e8SPetr Machatatc_flower_addr() 62d67a94e8SPetr Machata{ 63d67a94e8SPetr Machata local num=$1; shift 64d67a94e8SPetr Machata 65d67a94e8SPetr Machata printf "2001:db8:1::%x" $num 66d67a94e8SPetr Machata} 67d67a94e8SPetr Machata 68d67a94e8SPetr Machatatc_flower_rules_create() 69d67a94e8SPetr Machata{ 70d67a94e8SPetr Machata local count=$1; shift 71d67a94e8SPetr Machata local should_fail=$1; shift 72d67a94e8SPetr Machata 73d67a94e8SPetr Machata TC_FLOWER_BATCH_FILE="$(mktemp)" 74d67a94e8SPetr Machata 75d67a94e8SPetr Machata for ((i = 0; i < count; ++i)); do 76d67a94e8SPetr Machata cat >> $TC_FLOWER_BATCH_FILE <<-EOF 77d67a94e8SPetr Machata filter add dev $h2 ingress \ 78d67a94e8SPetr Machata prot ipv6 \ 79d67a94e8SPetr Machata pref 1000 \ 80*dd5d20e1SPetr Machata handle 42$i \ 81d67a94e8SPetr Machata flower $tcflags dst_ip $(tc_flower_addr $i) \ 82d67a94e8SPetr Machata action drop 83d67a94e8SPetr Machata EOF 84d67a94e8SPetr Machata done 85d67a94e8SPetr Machata 86d67a94e8SPetr Machata tc -b $TC_FLOWER_BATCH_FILE 87d67a94e8SPetr Machata check_err_fail $should_fail $? "Rule insertion" 88d67a94e8SPetr Machata} 89d67a94e8SPetr Machata 90d67a94e8SPetr Machata__tc_flower_test() 91d67a94e8SPetr Machata{ 92d67a94e8SPetr Machata local count=$1; shift 93d67a94e8SPetr Machata local should_fail=$1; shift 94d67a94e8SPetr Machata local last=$((count - 1)) 95d67a94e8SPetr Machata 96d67a94e8SPetr Machata tc_flower_rules_create $count $should_fail 97d67a94e8SPetr Machata 98abfce9e0SDanielle Ratson offload_count=$(tc -j -s filter show dev $h2 ingress | 99abfce9e0SDanielle Ratson jq -r '[ .[] | select(.kind == "flower") | 100abfce9e0SDanielle Ratson .options | .in_hw ]' | jq .[] | wc -l) 101abfce9e0SDanielle Ratson [[ $((offload_count - 1)) -eq $count ]] 1021f1c9213SDanielle Ratson check_err_fail $should_fail $? "Attempt to offload $count rules (actual result $((offload_count - 1)))" 103d67a94e8SPetr Machata} 104d67a94e8SPetr Machata 105d67a94e8SPetr Machatatc_flower_test() 106d67a94e8SPetr Machata{ 107d67a94e8SPetr Machata local count=$1; shift 108d67a94e8SPetr Machata local should_fail=$1; shift 109d67a94e8SPetr Machata 110d67a94e8SPetr Machata # We use lower 16 bits of IPv6 address for match. Also there are only 16 111d67a94e8SPetr Machata # bits of rule priority space. 112d67a94e8SPetr Machata if ((count > 65536)); then 113d67a94e8SPetr Machata check_err 1 "Invalid count of $count. At most 65536 rules supported" 114d67a94e8SPetr Machata return 115d67a94e8SPetr Machata fi 116d67a94e8SPetr Machata 117d67a94e8SPetr Machata if ! tc_offload_check $TC_FLOWER_NUM_NETIFS; then 118d67a94e8SPetr Machata check_err 1 "Could not test offloaded functionality" 119d67a94e8SPetr Machata return 120d67a94e8SPetr Machata fi 121d67a94e8SPetr Machata 122d67a94e8SPetr Machata tcflags="skip_sw" 123d67a94e8SPetr Machata __tc_flower_test $count $should_fail 124d67a94e8SPetr Machata} 125*dd5d20e1SPetr Machata 126*dd5d20e1SPetr Machatatc_flower_traffic_test() 127*dd5d20e1SPetr Machata{ 128*dd5d20e1SPetr Machata local count=$1; shift 129*dd5d20e1SPetr Machata local i; 130*dd5d20e1SPetr Machata 131*dd5d20e1SPetr Machata for ((i = count - 1; i > 0; i /= 2)); do 132*dd5d20e1SPetr Machata $MZ -6 $h1 -c 1 -d 20msec -p 100 -a own -b $(mac_get $h2) \ 133*dd5d20e1SPetr Machata -A $(tc_flower_addr 0) -B $(tc_flower_addr $i) \ 134*dd5d20e1SPetr Machata -q -t udp sp=54321,dp=12345 135*dd5d20e1SPetr Machata done 136*dd5d20e1SPetr Machata for ((i = count - 1; i > 0; i /= 2)); do 137*dd5d20e1SPetr Machata tc_check_packets "dev $h2 ingress" 42$i 1 138*dd5d20e1SPetr Machata check_err $? "Traffic not seen at rule #$i" 139*dd5d20e1SPetr Machata done 140*dd5d20e1SPetr Machata} 141