#!/bin/bash # SPDX-License-Identifier: GPL-2.0 source lib.sh readonly KSFT_SKIP=4 IP4=192.0.2.1/24 TGT4=192.0.2.2 TGT4_RAW=192.0.2.3 IP6=2001:db8::1/64 TGT6=2001:db8::2 TGT6_RAW=2001:db8::3 PORT=1234 TOTAL_TESTS=0 FAILED_TESTS=0 if ! command -v jq &> /dev/null; then echo "SKIP cmsg_so_priroity.sh test: jq is not installed." >&2 exit "$KSFT_SKIP" fi check_result() { ((TOTAL_TESTS++)) if [ "$1" -ne 0 ]; then ((FAILED_TESTS++)) fi } cleanup() { cleanup_ns $NS } trap cleanup EXIT setup_ns NS create_filter() { local handle=$1 local vlan_prio=$2 local ip_type=$3 local proto=$4 local dst_ip=$5 local ip_proto if [[ "$proto" == "u" ]]; then ip_proto="udp" elif [[ "$ip_type" == "ipv4" && "$proto" == "i" ]]; then ip_proto="icmp" elif [[ "$ip_type" == "ipv6" && "$proto" == "i" ]]; then ip_proto="icmpv6" fi tc -n $NS filter add dev dummy1 \ egress pref 1 handle "$handle" proto 802.1q \ flower vlan_prio "$vlan_prio" vlan_ethtype "$ip_type" \ dst_ip "$dst_ip" ${ip_proto:+ip_proto $ip_proto} \ action pass } ip -n $NS link set dev lo up ip -n $NS link add name dummy1 up type dummy ip -n $NS link add link dummy1 name dummy1.10 up type vlan id 10 \ egress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7 ip -n $NS address add $IP4 dev dummy1.10 ip -n $NS address add $IP6 dev dummy1.10 nodad ip netns exec $NS sysctl -wq net.ipv4.ping_group_range='0 2147483647' ip -n $NS neigh add $TGT4 lladdr 00:11:22:33:44:55 nud permanent \ dev dummy1.10 ip -n $NS neigh add $TGT6 lladdr 00:11:22:33:44:55 nud permanent \ dev dummy1.10 ip -n $NS neigh add $TGT4_RAW lladdr 00:11:22:33:44:66 nud permanent \ dev dummy1.10 ip -n $NS neigh add $TGT6_RAW lladdr 00:11:22:33:44:66 nud permanent \ dev dummy1.10 tc -n $NS qdisc add dev dummy1 clsact FILTER_COUNTER=10 for i in 4 6; do for proto in u i r; do echo "Test IPV$i, prot: $proto" for priority in {0..7}; do if [[ $i == 4 && $proto == "r" ]]; then TGT=$TGT4_RAW elif [[ $i == 6 && $proto == "r" ]]; then TGT=$TGT6_RAW elif [ $i == 4 ]; then TGT=$TGT4 else TGT=$TGT6 fi handle="${FILTER_COUNTER}${priority}" create_filter $handle $priority ipv$i $proto $TGT pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \ | jq ".[] | select(.options.handle == ${handle}) | \ .options.actions[0].stats.packets") if [[ $pkts == 0 ]]; then check_result 0 else echo "prio $priority: expected 0, got $pkts" check_result 1 fi ip netns exec $NS ./cmsg_sender -$i -Q $priority \ -p $proto $TGT $PORT pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \ | jq ".[] | select(.options.handle == ${handle}) | \ .options.actions[0].stats.packets") if [[ $pkts == 1 ]]; then check_result 0 else echo "prio $priority -Q: expected 1, got $pkts" check_result 1 fi ip netns exec $NS ./cmsg_sender -$i -P $priority \ -p $proto $TGT $PORT pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \ | jq ".[] | select(.options.handle == ${handle}) | \ .options.actions[0].stats.packets") if [[ $pkts == 2 ]]; then check_result 0 else echo "prio $priority -P: expected 2, got $pkts" check_result 1 fi done FILTER_COUNTER=$((FILTER_COUNTER + 10)) done done if [ $FAILED_TESTS -ne 0 ]; then echo "FAIL - $FAILED_TESTS/$TOTAL_TESTS tests failed" exit 1 else echo "OK - All $TOTAL_TESTS tests passed" exit 0 fi