| # SPDX-License-Identifier: GPL-2.0 |
| |
| # This is a template for ETS Qdisc test. |
| # |
| # This test sends from H1 several traffic streams with 802.1p-tagged packets. |
| # The tags are used at $swp1 to prioritize the traffic. Each stream is then |
| # queued at a different ETS band according to the assigned priority. After |
| # runnig for a while, counters at H2 are consulted to determine whether the |
| # traffic scheduling was according to the ETS configuration. |
| # |
| # This template is supposed to be embedded by a test driver, which implements |
| # statistics collection, any HW-specific stuff, and prominently configures the |
| # system to assure that there is overcommitment at $swp2. That is necessary so |
| # that the ETS traffic selection algorithm kicks in and has to schedule some |
| # traffic at the expense of other. |
| # |
| # A driver for veth-based testing is in sch_ets.sh, an example of a driver for |
| # an offloaded data path is in selftests/drivers/net/mlxsw/sch_ets.sh. |
| # |
| # +---------------------------------------------------------------------+ |
| # | H1 | |
| # | + $h1.10 + $h1.11 + $h1.12 | |
| # | | 192.0.2.1/28 | 192.0.2.17/28 | 192.0.2.33/28 | |
| # | | egress-qos-map | egress-qos-map | egress-qos-map | |
| # | | 0:0 | 0:1 | 0:2 | |
| # | \____________________ | ____________________/ | |
| # | \|/ | |
| # | + $h1 | |
| # +---------------------------|-----------------------------------------+ |
| # | |
| # +---------------------------|-----------------------------------------+ |
| # | SW + $swp1 | |
| # | | >1Gbps | |
| # | ____________________/|\____________________ | |
| # | / | \ | |
| # | +--|----------------+ +--|----------------+ +--|----------------+ | |
| # | | + $swp1.10 | | + $swp1.11 | | + $swp1.12 | | |
| # | | ingress-qos-map| | ingress-qos-map| | ingress-qos-map| | |
| # | | 0:0 1:1 2:2 | | 0:0 1:1 2:2 | | 0:0 1:1 2:2 | | |
| # | | | | | | | | |
| # | | BR10 | | BR11 | | BR12 | | |
| # | | | | | | | | |
| # | | + $swp2.10 | | + $swp2.11 | | + $swp2.12 | | |
| # | +--|----------------+ +--|----------------+ +--|----------------+ | |
| # | \____________________ | ____________________/ | |
| # | \|/ | |
| # | + $swp2 | |
| # | | 1Gbps (ethtool or HTB qdisc) | |
| # | | qdisc ets quanta $W0 $W1 $W2 | |
| # | | priomap 0 1 2 | |
| # +---------------------------|-----------------------------------------+ |
| # | |
| # +---------------------------|-----------------------------------------+ |
| # | H2 + $h2 | |
| # | ____________________/|\____________________ | |
| # | / | \ | |
| # | + $h2.10 + $h2.11 + $h2.12 | |
| # | 192.0.2.2/28 192.0.2.18/28 192.0.2.34/28 | |
| # +---------------------------------------------------------------------+ |
| |
| NUM_NETIFS=4 |
| CHECK_TC=yes |
| source $lib_dir/lib.sh |
| source $lib_dir/sch_ets_tests.sh |
| |
| PARENT=root |
| QDISC_DEV= |
| |
| sip() |
| { |
| echo 192.0.2.$((16 * $1 + 1)) |
| } |
| |
| dip() |
| { |
| echo 192.0.2.$((16 * $1 + 2)) |
| } |
| |
| # Callback from sch_ets_tests.sh |
| ets_start_traffic() |
| { |
| local dst_mac=$(mac_get $h2) |
| local i=$1; shift |
| |
| start_traffic $h1.1$i $(sip $i) $(dip $i) $dst_mac |
| } |
| |
| ETS_CHANGE_QDISC= |
| |
| priomap_mode() |
| { |
| echo "Running in priomap mode" |
| ets_delete_qdisc |
| ETS_CHANGE_QDISC=ets_change_qdisc_priomap |
| } |
| |
| classifier_mode() |
| { |
| echo "Running in classifier mode" |
| ets_delete_qdisc |
| ETS_CHANGE_QDISC=ets_change_qdisc_classifier |
| } |
| |
| ets_change_qdisc_priomap() |
| { |
| local dev=$1; shift |
| local nstrict=$1; shift |
| local priomap=$1; shift |
| local quanta=("${@}") |
| |
| local op=$(if [[ -n $QDISC_DEV ]]; then echo change; else echo add; fi) |
| |
| tc qdisc $op dev $dev $PARENT handle 10: ets \ |
| $(if ((nstrict)); then echo strict $nstrict; fi) \ |
| $(if ((${#quanta[@]})); then echo quanta ${quanta[@]}; fi) \ |
| priomap $priomap |
| QDISC_DEV=$dev |
| } |
| |
| ets_change_qdisc_classifier() |
| { |
| local dev=$1; shift |
| local nstrict=$1; shift |
| local priomap=$1; shift |
| local quanta=("${@}") |
| |
| local op=$(if [[ -n $QDISC_DEV ]]; then echo change; else echo add; fi) |
| |
| tc qdisc $op dev $dev $PARENT handle 10: ets \ |
| $(if ((nstrict)); then echo strict $nstrict; fi) \ |
| $(if ((${#quanta[@]})); then echo quanta ${quanta[@]}; fi) |
| |
| if [[ $op == add ]]; then |
| local prio=0 |
| local band |
| |
| for band in $priomap; do |
| tc filter add dev $dev parent 10: basic \ |
| match "meta(priority eq $prio)" \ |
| flowid 10:$((band + 1)) |
| ((prio++)) |
| done |
| fi |
| QDISC_DEV=$dev |
| } |
| |
| # Callback from sch_ets_tests.sh |
| ets_change_qdisc() |
| { |
| if [[ -z "$ETS_CHANGE_QDISC" ]]; then |
| exit 1 |
| fi |
| $ETS_CHANGE_QDISC "$@" |
| } |
| |
| ets_delete_qdisc() |
| { |
| if [[ -n $QDISC_DEV ]]; then |
| tc qdisc del dev $QDISC_DEV $PARENT |
| QDISC_DEV= |
| fi |
| } |
| |
| h1_create() |
| { |
| local i; |
| |
| simple_if_init $h1 |
| mtu_set $h1 9900 |
| for i in {0..2}; do |
| vlan_create $h1 1$i v$h1 $(sip $i)/28 |
| ip link set dev $h1.1$i type vlan egress 0:$i |
| done |
| } |
| |
| h1_destroy() |
| { |
| local i |
| |
| for i in {0..2}; do |
| vlan_destroy $h1 1$i |
| done |
| mtu_restore $h1 |
| simple_if_fini $h1 |
| } |
| |
| h2_create() |
| { |
| local i |
| |
| simple_if_init $h2 |
| mtu_set $h2 9900 |
| for i in {0..2}; do |
| vlan_create $h2 1$i v$h2 $(dip $i)/28 |
| done |
| } |
| |
| h2_destroy() |
| { |
| local i |
| |
| for i in {0..2}; do |
| vlan_destroy $h2 1$i |
| done |
| mtu_restore $h2 |
| simple_if_fini $h2 |
| } |
| |
| ets_switch_create() |
| { |
| local i |
| |
| ip link set dev $swp1 up |
| mtu_set $swp1 9900 |
| |
| ip link set dev $swp2 up |
| mtu_set $swp2 9900 |
| |
| for i in {0..2}; do |
| vlan_create $swp1 1$i |
| ip link set dev $swp1.1$i type vlan ingress 0:0 1:1 2:2 |
| |
| vlan_create $swp2 1$i |
| |
| ip link add dev br1$i type bridge |
| ip link set dev $swp1.1$i master br1$i |
| ip link set dev $swp2.1$i master br1$i |
| |
| ip link set dev br1$i up |
| ip link set dev $swp1.1$i up |
| ip link set dev $swp2.1$i up |
| done |
| } |
| |
| ets_switch_destroy() |
| { |
| local i |
| |
| ets_delete_qdisc |
| |
| for i in {0..2}; do |
| ip link del dev br1$i |
| vlan_destroy $swp2 1$i |
| vlan_destroy $swp1 1$i |
| done |
| |
| mtu_restore $swp2 |
| ip link set dev $swp2 down |
| |
| mtu_restore $swp1 |
| ip link set dev $swp1 down |
| } |
| |
| setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| swp1=${NETIFS[p2]} |
| |
| swp2=${NETIFS[p3]} |
| h2=${NETIFS[p4]} |
| |
| put=$swp2 |
| hut=$h2 |
| |
| vrf_prepare |
| |
| h1_create |
| h2_create |
| switch_create |
| } |
| |
| cleanup() |
| { |
| pre_cleanup |
| |
| switch_destroy |
| h2_destroy |
| h1_destroy |
| |
| vrf_cleanup |
| } |
| |
| ping_ipv4() |
| { |
| ping_test $h1.10 $(dip 0) " vlan 10" |
| ping_test $h1.11 $(dip 1) " vlan 11" |
| ping_test $h1.12 $(dip 2) " vlan 12" |
| } |
| |
| ets_run() |
| { |
| trap cleanup EXIT |
| |
| setup_prepare |
| setup_wait |
| |
| tests_run |
| |
| exit $EXIT_STATUS |
| } |