1*cda7d5abSAnna Emese Nyiri#!/bin/bash 2*cda7d5abSAnna Emese Nyiri# SPDX-License-Identifier: GPL-2.0 3*cda7d5abSAnna Emese Nyiri 4*cda7d5abSAnna Emese Nyirisource lib.sh 5*cda7d5abSAnna Emese Nyiri 6*cda7d5abSAnna Emese Nyirireadonly KSFT_SKIP=4 7*cda7d5abSAnna Emese Nyiri 8*cda7d5abSAnna Emese NyiriIP4=192.0.2.1/24 9*cda7d5abSAnna Emese NyiriTGT4=192.0.2.2 10*cda7d5abSAnna Emese NyiriTGT4_RAW=192.0.2.3 11*cda7d5abSAnna Emese NyiriIP6=2001:db8::1/64 12*cda7d5abSAnna Emese NyiriTGT6=2001:db8::2 13*cda7d5abSAnna Emese NyiriTGT6_RAW=2001:db8::3 14*cda7d5abSAnna Emese NyiriPORT=1234 15*cda7d5abSAnna Emese NyiriTOTAL_TESTS=0 16*cda7d5abSAnna Emese NyiriFAILED_TESTS=0 17*cda7d5abSAnna Emese Nyiri 18*cda7d5abSAnna Emese Nyiriif ! command -v jq &> /dev/null; then 19*cda7d5abSAnna Emese Nyiri echo "SKIP cmsg_so_priroity.sh test: jq is not installed." >&2 20*cda7d5abSAnna Emese Nyiri exit "$KSFT_SKIP" 21*cda7d5abSAnna Emese Nyirifi 22*cda7d5abSAnna Emese Nyiri 23*cda7d5abSAnna Emese Nyiricheck_result() { 24*cda7d5abSAnna Emese Nyiri ((TOTAL_TESTS++)) 25*cda7d5abSAnna Emese Nyiri if [ "$1" -ne 0 ]; then 26*cda7d5abSAnna Emese Nyiri ((FAILED_TESTS++)) 27*cda7d5abSAnna Emese Nyiri fi 28*cda7d5abSAnna Emese Nyiri} 29*cda7d5abSAnna Emese Nyiri 30*cda7d5abSAnna Emese Nyiricleanup() 31*cda7d5abSAnna Emese Nyiri{ 32*cda7d5abSAnna Emese Nyiri cleanup_ns $NS 33*cda7d5abSAnna Emese Nyiri} 34*cda7d5abSAnna Emese Nyiri 35*cda7d5abSAnna Emese Nyiritrap cleanup EXIT 36*cda7d5abSAnna Emese Nyiri 37*cda7d5abSAnna Emese Nyirisetup_ns NS 38*cda7d5abSAnna Emese Nyiri 39*cda7d5abSAnna Emese Nyiricreate_filter() { 40*cda7d5abSAnna Emese Nyiri local handle=$1 41*cda7d5abSAnna Emese Nyiri local vlan_prio=$2 42*cda7d5abSAnna Emese Nyiri local ip_type=$3 43*cda7d5abSAnna Emese Nyiri local proto=$4 44*cda7d5abSAnna Emese Nyiri local dst_ip=$5 45*cda7d5abSAnna Emese Nyiri local ip_proto 46*cda7d5abSAnna Emese Nyiri 47*cda7d5abSAnna Emese Nyiri if [[ "$proto" == "u" ]]; then 48*cda7d5abSAnna Emese Nyiri ip_proto="udp" 49*cda7d5abSAnna Emese Nyiri elif [[ "$ip_type" == "ipv4" && "$proto" == "i" ]]; then 50*cda7d5abSAnna Emese Nyiri ip_proto="icmp" 51*cda7d5abSAnna Emese Nyiri elif [[ "$ip_type" == "ipv6" && "$proto" == "i" ]]; then 52*cda7d5abSAnna Emese Nyiri ip_proto="icmpv6" 53*cda7d5abSAnna Emese Nyiri fi 54*cda7d5abSAnna Emese Nyiri 55*cda7d5abSAnna Emese Nyiri tc -n $NS filter add dev dummy1 \ 56*cda7d5abSAnna Emese Nyiri egress pref 1 handle "$handle" proto 802.1q \ 57*cda7d5abSAnna Emese Nyiri flower vlan_prio "$vlan_prio" vlan_ethtype "$ip_type" \ 58*cda7d5abSAnna Emese Nyiri dst_ip "$dst_ip" ${ip_proto:+ip_proto $ip_proto} \ 59*cda7d5abSAnna Emese Nyiri action pass 60*cda7d5abSAnna Emese Nyiri} 61*cda7d5abSAnna Emese Nyiri 62*cda7d5abSAnna Emese Nyiriip -n $NS link set dev lo up 63*cda7d5abSAnna Emese Nyiriip -n $NS link add name dummy1 up type dummy 64*cda7d5abSAnna Emese Nyiri 65*cda7d5abSAnna Emese Nyiriip -n $NS link add link dummy1 name dummy1.10 up type vlan id 10 \ 66*cda7d5abSAnna Emese Nyiri egress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 67*cda7d5abSAnna Emese Nyiri 68*cda7d5abSAnna Emese Nyiriip -n $NS address add $IP4 dev dummy1.10 69*cda7d5abSAnna Emese Nyiriip -n $NS address add $IP6 dev dummy1.10 nodad 70*cda7d5abSAnna Emese Nyiri 71*cda7d5abSAnna Emese Nyiriip netns exec $NS sysctl -wq net.ipv4.ping_group_range='0 2147483647' 72*cda7d5abSAnna Emese Nyiri 73*cda7d5abSAnna Emese Nyiriip -n $NS neigh add $TGT4 lladdr 00:11:22:33:44:55 nud permanent \ 74*cda7d5abSAnna Emese Nyiri dev dummy1.10 75*cda7d5abSAnna Emese Nyiriip -n $NS neigh add $TGT6 lladdr 00:11:22:33:44:55 nud permanent \ 76*cda7d5abSAnna Emese Nyiri dev dummy1.10 77*cda7d5abSAnna Emese Nyiriip -n $NS neigh add $TGT4_RAW lladdr 00:11:22:33:44:66 nud permanent \ 78*cda7d5abSAnna Emese Nyiri dev dummy1.10 79*cda7d5abSAnna Emese Nyiriip -n $NS neigh add $TGT6_RAW lladdr 00:11:22:33:44:66 nud permanent \ 80*cda7d5abSAnna Emese Nyiri dev dummy1.10 81*cda7d5abSAnna Emese Nyiri 82*cda7d5abSAnna Emese Nyiritc -n $NS qdisc add dev dummy1 clsact 83*cda7d5abSAnna Emese Nyiri 84*cda7d5abSAnna Emese NyiriFILTER_COUNTER=10 85*cda7d5abSAnna Emese Nyiri 86*cda7d5abSAnna Emese Nyirifor i in 4 6; do 87*cda7d5abSAnna Emese Nyiri for proto in u i r; do 88*cda7d5abSAnna Emese Nyiri echo "Test IPV$i, prot: $proto" 89*cda7d5abSAnna Emese Nyiri for priority in {0..7}; do 90*cda7d5abSAnna Emese Nyiri if [[ $i == 4 && $proto == "r" ]]; then 91*cda7d5abSAnna Emese Nyiri TGT=$TGT4_RAW 92*cda7d5abSAnna Emese Nyiri elif [[ $i == 6 && $proto == "r" ]]; then 93*cda7d5abSAnna Emese Nyiri TGT=$TGT6_RAW 94*cda7d5abSAnna Emese Nyiri elif [ $i == 4 ]; then 95*cda7d5abSAnna Emese Nyiri TGT=$TGT4 96*cda7d5abSAnna Emese Nyiri else 97*cda7d5abSAnna Emese Nyiri TGT=$TGT6 98*cda7d5abSAnna Emese Nyiri fi 99*cda7d5abSAnna Emese Nyiri 100*cda7d5abSAnna Emese Nyiri handle="${FILTER_COUNTER}${priority}" 101*cda7d5abSAnna Emese Nyiri 102*cda7d5abSAnna Emese Nyiri create_filter $handle $priority ipv$i $proto $TGT 103*cda7d5abSAnna Emese Nyiri 104*cda7d5abSAnna Emese Nyiri pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \ 105*cda7d5abSAnna Emese Nyiri | jq ".[] | select(.options.handle == ${handle}) | \ 106*cda7d5abSAnna Emese Nyiri .options.actions[0].stats.packets") 107*cda7d5abSAnna Emese Nyiri 108*cda7d5abSAnna Emese Nyiri if [[ $pkts == 0 ]]; then 109*cda7d5abSAnna Emese Nyiri check_result 0 110*cda7d5abSAnna Emese Nyiri else 111*cda7d5abSAnna Emese Nyiri echo "prio $priority: expected 0, got $pkts" 112*cda7d5abSAnna Emese Nyiri check_result 1 113*cda7d5abSAnna Emese Nyiri fi 114*cda7d5abSAnna Emese Nyiri 115*cda7d5abSAnna Emese Nyiri ip netns exec $NS ./cmsg_sender -$i -Q $priority \ 116*cda7d5abSAnna Emese Nyiri -p $proto $TGT $PORT 117*cda7d5abSAnna Emese Nyiri 118*cda7d5abSAnna Emese Nyiri pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \ 119*cda7d5abSAnna Emese Nyiri | jq ".[] | select(.options.handle == ${handle}) | \ 120*cda7d5abSAnna Emese Nyiri .options.actions[0].stats.packets") 121*cda7d5abSAnna Emese Nyiri if [[ $pkts == 1 ]]; then 122*cda7d5abSAnna Emese Nyiri check_result 0 123*cda7d5abSAnna Emese Nyiri else 124*cda7d5abSAnna Emese Nyiri echo "prio $priority -Q: expected 1, got $pkts" 125*cda7d5abSAnna Emese Nyiri check_result 1 126*cda7d5abSAnna Emese Nyiri fi 127*cda7d5abSAnna Emese Nyiri 128*cda7d5abSAnna Emese Nyiri ip netns exec $NS ./cmsg_sender -$i -P $priority \ 129*cda7d5abSAnna Emese Nyiri -p $proto $TGT $PORT 130*cda7d5abSAnna Emese Nyiri 131*cda7d5abSAnna Emese Nyiri pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \ 132*cda7d5abSAnna Emese Nyiri | jq ".[] | select(.options.handle == ${handle}) | \ 133*cda7d5abSAnna Emese Nyiri .options.actions[0].stats.packets") 134*cda7d5abSAnna Emese Nyiri if [[ $pkts == 2 ]]; then 135*cda7d5abSAnna Emese Nyiri check_result 0 136*cda7d5abSAnna Emese Nyiri else 137*cda7d5abSAnna Emese Nyiri echo "prio $priority -P: expected 2, got $pkts" 138*cda7d5abSAnna Emese Nyiri check_result 1 139*cda7d5abSAnna Emese Nyiri fi 140*cda7d5abSAnna Emese Nyiri done 141*cda7d5abSAnna Emese Nyiri FILTER_COUNTER=$((FILTER_COUNTER + 10)) 142*cda7d5abSAnna Emese Nyiri done 143*cda7d5abSAnna Emese Nyiridone 144*cda7d5abSAnna Emese Nyiri 145*cda7d5abSAnna Emese Nyiriif [ $FAILED_TESTS -ne 0 ]; then 146*cda7d5abSAnna Emese Nyiri echo "FAIL - $FAILED_TESTS/$TOTAL_TESTS tests failed" 147*cda7d5abSAnna Emese Nyiri exit 1 148*cda7d5abSAnna Emese Nyirielse 149*cda7d5abSAnna Emese Nyiri echo "OK - All $TOTAL_TESTS tests passed" 150*cda7d5abSAnna Emese Nyiri exit 0 151*cda7d5abSAnna Emese Nyirifi 152