| #!/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 |