151 lines · 3.9 KB · Shell
RawDownload
#!/bin/bash# SPDX-License-Identifier: GPL-2.0 source lib.sh readonly KSFT_SKIP=4 IP4=192.0.2.1/24TGT4=192.0.2.2TGT4_RAW=192.0.2.3IP6=2001:db8::1/64TGT6=2001:db8::2TGT6_RAW=2001:db8::3PORT=1234TOTAL_TESTS=0FAILED_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 upip -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.10ip -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.10ip -n $NS neigh add $TGT6 lladdr 00:11:22:33:44:55 nud permanent \    dev dummy1.10ip -n $NS neigh add $TGT4_RAW lladdr 00:11:22:33:44:66 nud permanent \    dev dummy1.10ip -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))    donedone if [ $FAILED_TESTS -ne 0 ]; then    echo "FAIL - $FAILED_TESTS/$TOTAL_TESTS tests failed"    exit 1else    echo "OK - All $TOTAL_TESTS tests passed"    exit 0fi