1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0-only
3
4source ethtool-common.sh
5
6set -o pipefail
7
8n_children() {
9    n=$(tc qdisc show dev $NDEV | grep '^qdisc' | wc -l)
10    echo $((n - 1))
11}
12
13tcq() {
14    tc qdisc $1 dev $NDEV ${@:2}
15}
16
17n_child_assert() {
18    n=$(n_children)
19    if [ $n -ne $1 ]; then
20	echo "ERROR ($root): ${@:2}, expected $1 have $n"
21	((num_errors++))
22    else
23	((num_passes++))
24    fi
25}
26
27
28for root in mq mqprio; do
29    NDEV=$(make_netdev 1 4)
30
31    opts=
32    [ $root == "mqprio" ] && opts='hw 0 num_tc 1 map 0 0 0 0  queues 1@0'
33
34    tcq add root handle 100: $root $opts
35    n_child_assert 4 'Init'
36
37    # All defaults
38
39    for n in 3 2 1 2 3 4 1 4; do
40	ethtool -L $NDEV combined $n
41	n_child_assert $n "Change queues to $n while down"
42    done
43
44    ip link set dev $NDEV up
45
46    for n in 3 2 1 2 3 4 1 4; do
47	ethtool -L $NDEV combined $n
48	n_child_assert $n "Change queues to $n while up"
49    done
50
51    # One real one
52    tcq replace parent 100:4 handle 204: pfifo_fast
53    n_child_assert 4 "One real queue"
54
55    ethtool -L $NDEV combined 1
56    n_child_assert 2 "One real queue, one default"
57
58    ethtool -L $NDEV combined 4
59    n_child_assert 4 "One real queue, rest default"
60
61    # Graft some
62    tcq replace parent 100:1 handle 204:
63    n_child_assert 3 "Grafted"
64
65    ethtool -L $NDEV combined 1
66    n_child_assert 1 "Grafted, one"
67
68    cleanup_nsim
69done
70
71if [ $num_errors -eq 0 ]; then
72    echo "PASSED all $((num_passes)) checks"
73    exit 0
74else
75    echo "FAILED $num_errors/$((num_errors+num_passes)) checks"
76    exit 1
77fi
78