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