669 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03# Copyright (c) 2024 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>4 5# The script is adopted to work with the Microchip KSZ switch driver.6 7ETH_FCS_LEN=48 9WAIT_TIME=110NUM_NETIFS=411REQUIRE_JQ="yes"12REQUIRE_MZ="yes"13STABLE_MAC_ADDRS=yes14NETIF_CREATE=no15lib_dir=$(dirname $0)/../../../net/forwarding16source $lib_dir/tc_common.sh17source $lib_dir/lib.sh18 19require_command dcb20 21h1=${NETIFS[p1]}22swp1=${NETIFS[p2]}23swp2=${NETIFS[p3]}24h2=${NETIFS[p4]}25 26H1_IPV4="192.0.2.1"27H2_IPV4="192.0.2.2"28H1_IPV6="2001:db8:1::1"29H2_IPV6="2001:db8:1::2"30 31# On h1_ and h2_create do not set IP addresses to avoid interaction with the32# system, to keep packet counters clean.33h1_create()34{35 simple_if_init $h136 sysctl_set net.ipv6.conf.${h1}.disable_ipv6 137 # Get the MAC address of the interface to use it with mausezahn38 h1_mac=$(ip -j link show dev ${h1} | jq -e '.[].address')39}40 41h1_destroy()42{43 sysctl_restore net.ipv6.conf.${h1}.disable_ipv644 simple_if_fini $h145}46 47h2_create()48{49 simple_if_init $h250 sysctl_set net.ipv6.conf.${h2}.disable_ipv6 151 h2_mac=$(ip -j link show dev ${h2} | jq -e '.[].address')52}53 54h2_destroy()55{56 sysctl_restore net.ipv6.conf.${h2}.disable_ipv657 simple_if_fini $h258}59 60switch_create()61{62 ip link set ${swp1} up63 ip link set ${swp2} up64 sysctl_set net.ipv6.conf.${swp1}.disable_ipv6 165 sysctl_set net.ipv6.conf.${swp2}.disable_ipv6 166 67 # Ports should trust VLAN PCP even with vlan_filtering=068 ip link add br0 type bridge69 ip link set ${swp1} master br070 ip link set ${swp2} master br071 ip link set br0 up72 sysctl_set net.ipv6.conf.br0.disable_ipv6 173}74 75switch_destroy()76{77 sysctl_restore net.ipv6.conf.${swp2}.disable_ipv678 sysctl_restore net.ipv6.conf.${swp1}.disable_ipv679 80 ip link del br081}82 83setup_prepare()84{85 vrf_prepare86 87 h1_create88 h2_create89 switch_create90}91 92cleanup()93{94 pre_cleanup95 96 h2_destroy97 h1_destroy98 switch_destroy99 100 vrf_cleanup101}102 103set_apptrust_order()104{105 local if_name=$1106 local order=$2107 108 dcb apptrust set dev ${if_name} order ${order}109}110 111# Function to extract a specified field from a given JSON stats string112extract_network_stat() {113 local stats_json=$1114 local field_name=$2115 116 echo $(echo "$stats_json" | jq -r "$field_name")117}118 119run_test()120{121 local test_name=$1;122 local apptrust_order=$2;123 local port_prio=$3;124 local dscp_ipv=$4;125 local dscp=$5;126 local have_vlan=$6;127 local pcp_ipv=$7;128 local vlan_pcp=$8;129 local ip_v6=$9130 131 local rx_ipv132 local tx_ipv133 134 RET=0135 136 # Send some packet to populate the switch MAC table137 $MZ ${h2} -a ${h2_mac} -b ${h1_mac} -p 64 -t icmp echores -c 1138 139 # Based on the apptrust order, set the expected Internal Priority values140 # for the RX and TX paths.141 if [ "${apptrust_order}" == "" ]; then142 echo "Apptrust order not set."143 rx_ipv=${port_prio}144 tx_ipv=${port_prio}145 elif [ "${apptrust_order}" == "dscp" ]; then146 echo "Apptrust order is DSCP."147 rx_ipv=${dscp_ipv}148 tx_ipv=${dscp_ipv}149 elif [ "${apptrust_order}" == "pcp" ]; then150 echo "Apptrust order is PCP."151 rx_ipv=${pcp_ipv}152 tx_ipv=${pcp_ipv}153 elif [ "${apptrust_order}" == "pcp dscp" ]; then154 echo "Apptrust order is PCP DSCP."155 if [ ${have_vlan} -eq 1 ]; then156 rx_ipv=$((dscp_ipv > pcp_ipv ? dscp_ipv : pcp_ipv))157 tx_ipv=${pcp_ipv}158 else159 rx_ipv=${dscp_ipv}160 tx_ipv=${dscp_ipv}161 fi162 else163 RET=1164 echo "Error: Unknown apptrust order ${apptrust_order}"165 log_test "${test_name}"166 return167 fi168 169 # Most/all? of the KSZ switches do not provide per-TC counters. There170 # are only tx_hi and rx_hi counters, which are used to count packets171 # which are considered as high priority and most likely not assigned172 # to the queue 0.173 # On the ingress path, packets seem to get high priority status174 # independently of the DSCP or PCP global mapping. On the egress path,175 # the high priority status is assigned based on the DSCP or PCP global176 # map configuration.177 # The thresholds for the high priority status are not documented, but178 # it seems that the switch considers packets as high priority on the179 # ingress path if detected Internal Priority is greater than 0. On the180 # egress path, the switch considers packets as high priority if181 # detected Internal Priority is greater than 1.182 if [ ${rx_ipv} -ge 1 ]; then183 local expect_rx_high_prio=1184 else185 local expect_rx_high_prio=0186 fi187 188 if [ ${tx_ipv} -ge 2 ]; then189 local expect_tx_high_prio=1190 else191 local expect_tx_high_prio=0192 fi193 194 # Use ip tool to get the current switch packet counters. ethool stats195 # need to be recalculated to get the correct values.196 local swp1_stats=$(ip -s -j link show dev ${swp1})197 local swp2_stats=$(ip -s -j link show dev ${swp2})198 local swp1_rx_packets_before=$(extract_network_stat "$swp1_stats" \199 '.[0].stats64.rx.packets')200 local swp1_rx_bytes_before=$(extract_network_stat "$swp1_stats" \201 '.[0].stats64.rx.bytes')202 local swp2_tx_packets_before=$(extract_network_stat "$swp2_stats" \203 '.[0].stats64.tx.packets')204 local swp2_tx_bytes_before=$(extract_network_stat "$swp2_stats" \205 '.[0].stats64.tx.bytes')206 local swp1_rx_hi_before=$(ethtool_stats_get ${swp1} "rx_hi")207 local swp2_tx_hi_before=$(ethtool_stats_get ${swp2} "tx_hi")208 209 # Assamble the mausezahn command based on the test parameters210 # For the testis with ipv4 or ipv6, use icmp response packets,211 # to avoid interaction with the system, to keep packet counters212 # clean.213 if [ ${ip_v6} -eq 0 ]; then214 local ip="-a ${h1_mac} -b ${h2_mac} -A ${H1_IPV4} \215 -B ${H2_IPV4} -t icmp unreach,code=1,dscp=${dscp}"216 else217 local ip="-6 -a ${h1_mac} -b ${h2_mac} -A ${H1_IPV6} \218 -B ${H2_IPV6} -t icmp6 type=1,code=0,dscp=${dscp}"219 fi220 221 if [ ${have_vlan} -eq 1 ]; then222 local vlan_pcp_opt="-Q ${vlan_pcp}:0"223 else224 local vlan_pcp_opt=""225 fi226 $MZ ${h1} ${ip} -c ${PING_COUNT} -d 10msec ${vlan_pcp_opt}227 228 # Wait until the switch packet counters are updated229 sleep 6230 231 local swp1_stats=$(ip -s -j link show dev ${swp1})232 local swp2_stats=$(ip -s -j link show dev ${swp2})233 234 local swp1_rx_packets_after=$(extract_network_stat "$swp1_stats" \235 '.[0].stats64.rx.packets')236 local swp1_rx_bytes_after=$(extract_network_stat "$swp1_stats" \237 '.[0].stats64.rx.bytes')238 local swp2_tx_packets_after=$(extract_network_stat "$swp2_stats" \239 '.[0].stats64.tx.packets')240 local swp2_tx_bytes_after=$(extract_network_stat "$swp2_stats" \241 '.[0].stats64.tx.bytes')242 243 local swp1_rx_packets_diff=$((${swp1_rx_packets_after} - \244 ${swp1_rx_packets_before}))245 local swp2_tx_packets_diff=$((${swp2_tx_packets_after} - \246 ${swp2_tx_packets_before}))247 248 local swp1_rx_hi_after=$(ethtool_stats_get ${swp1} "rx_hi")249 local swp2_tx_hi_after=$(ethtool_stats_get ${swp2} "tx_hi")250 251 # Test if any packets were received on swp1, we will rx before and after252 if [ ${swp1_rx_packets_diff} -lt ${PING_COUNT} ]; then253 echo "Not expected amount of received packets on ${swp1}"254 echo "before ${swp1_rx_packets_before} after ${swp1_rx_packets_after}"255 RET=1256 fi257 258 # Test if any packets were transmitted on swp2, we will tx before and after259 if [ ${swp2_tx_packets_diff} -lt ${PING_COUNT} ]; then260 echo "Not expected amount of transmitted packets on ${swp2}"261 echo "before ${swp2_tx_packets_before} after ${swp2_tx_packets_after}"262 RET=1263 fi264 265 # tx/rx_hi counted in bytes. So, we need to compare the difference in bytes266 local swp1_rx_bytes_diff=$(($swp1_rx_bytes_after - $swp1_rx_bytes_before))267 local swp2_tx_bytes_diff=$(($swp2_tx_bytes_after - $swp2_tx_bytes_before))268 local swp1_rx_hi_diff=$(($swp1_rx_hi_after - $swp1_rx_hi_before))269 local swp2_tx_hi_diff=$(($swp2_tx_hi_after - $swp2_tx_hi_before))270 271 if [ ${expect_rx_high_prio} -eq 1 ]; then272 swp1_rx_hi_diff=$((${swp1_rx_hi_diff} - \273 ${swp1_rx_packets_diff} * ${ETH_FCS_LEN}))274 if [ ${swp1_rx_hi_diff} -ne ${swp1_rx_bytes_diff} ]; then275 echo "Not expected amount of high priority packets received on ${swp1}"276 echo "RX hi diff: ${swp1_rx_hi_diff}, expected RX bytes diff: ${swp1_rx_bytes_diff}"277 RET=1278 fi279 else280 if [ ${swp1_rx_hi_diff} -ne 0 ]; then281 echo "Unexpected amount of high priority packets received on ${swp1}"282 echo "RX hi diff: ${swp1_rx_hi_diff}, expected 0"283 RET=1284 fi285 fi286 287 if [ ${expect_tx_high_prio} -eq 1 ]; then288 swp2_tx_hi_diff=$((${swp2_tx_hi_diff} - \289 ${swp2_tx_packets_diff} * ${ETH_FCS_LEN}))290 if [ ${swp2_tx_hi_diff} -ne ${swp2_tx_bytes_diff} ]; then291 echo "Not expected amount of high priority packets transmitted on ${swp2}"292 echo "TX hi diff: ${swp2_tx_hi_diff}, expected TX bytes diff: ${swp2_tx_bytes_diff}"293 RET=1294 fi295 else296 if [ ${swp2_tx_hi_diff} -ne 0 ]; then297 echo "Unexpected amount of high priority packets transmitted on ${swp2}"298 echo "TX hi diff: ${swp2_tx_hi_diff}, expected 0"299 RET=1300 fi301 fi302 303 log_test "${test_name}"304}305 306run_test_dscp()307{308 # IPv4 test309 run_test "$1" "$2" "$3" "$4" "$5" 0 0 0 0310 # IPv6 test311 run_test "$1" "$2" "$3" "$4" "$5" 0 0 0 1312}313 314run_test_dscp_pcp()315{316 # IPv4 test317 run_test "$1" "$2" "$3" "$4" "$5" 1 "$6" "$7" 0318 # IPv6 test319 run_test "$1" "$2" "$3" "$4" "$5" 1 "$6" "$7" 1320}321 322port_default_prio_get()323{324 local if_name=$1325 local prio326 327 prio="$(dcb -j app show dev ${if_name} default-prio | \328 jq '.default_prio[]')"329 if [ -z "${prio}" ]; then330 prio=0331 fi332 333 echo ${prio}334}335 336test_port_default()337{338 local orig_apptrust=$(port_get_default_apptrust ${swp1})339 local orig_prio=$(port_default_prio_get ${swp1})340 local apptrust_order=""341 342 RET=0343 344 # Make sure no other priority sources will interfere with the test345 set_apptrust_order ${swp1} "${apptrust_order}"346 347 for val in $(seq 0 7); do348 dcb app replace dev ${swp1} default-prio ${val}349 if [ $val -ne $(port_default_prio_get ${swp1}) ]; then350 RET=1351 break352 fi353 354 run_test_dscp "Port-default QoS classification, prio: ${val}" \355 "${apptrust_order}" ${val} 0 0356 done357 358 set_apptrust_order ${swp1} "${orig_apptrust}"359 if [[ "$orig_apptrust" != "$(port_get_default_apptrust ${swp1})" ]]; then360 RET=1361 fi362 363 dcb app replace dev ${swp1} default-prio ${orig_prio}364 if [ $orig_prio -ne $(port_default_prio_get ${swp1}) ]; then365 RET=1366 fi367 368 log_test "Port-default QoS classification"369}370 371port_get_default_apptrust()372{373 local if_name=$1374 375 dcb -j apptrust show dev ${if_name} | jq -r '.order[]' | \376 tr '\n' ' ' | xargs377}378 379test_port_apptrust()380{381 local original_dscp_prios_swp1=$(get_dscp_prios ${swp1})382 local orig_apptrust=$(port_get_default_apptrust ${swp1})383 local orig_port_prio=$(port_default_prio_get ${swp1})384 local order_variants=("pcp dscp" "dscp" "pcp")385 local apptrust_order386 local port_prio387 local dscp_prio388 local pcp_prio389 local dscp390 local pcp391 392 RET=0393 394 # First, test if apptrust configuration as taken by the kernel395 for order in "${order_variants[@]}"; do396 set_apptrust_order ${swp1} "${order}"397 if [[ "$order" != "$(port_get_default_apptrust ${swp1})" ]]; then398 RET=1399 break400 fi401 done402 403 log_test "Apptrust, supported variants"404 405 # To test if the apptrust configuration is working as expected, we need406 # to set DSCP priorities for the switch port.407 init_dscp_prios "${swp1}" "${original_dscp_prios_swp1}"408 409 # Start with a simple test where all apptrust sources are disabled410 # default port priority is 0, DSCP priority is mapped to 7.411 # No high priority packets should be received or transmitted.412 port_prio=0413 dscp_prio=7414 dscp=4415 416 dcb app replace dev ${swp1} default-prio ${port_prio}417 dcb app replace dev ${swp1} dscp-prio ${dscp}:${dscp_prio}418 419 apptrust_order=""420 set_apptrust_order ${swp1} "${apptrust_order}"421 # Test with apptrust sources disabled, Packets should get port default422 # priority which is 0423 run_test_dscp "Apptrust, all disabled. DSCP-prio ${dscp}:${dscp_prio}" \424 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp}425 426 apptrust_order="pcp"427 set_apptrust_order ${swp1} "${apptrust_order}"428 # If PCP is enabled, packets should get PCP priority, which is not429 # set in this test (no VLAN tags are present in the packet). No high430 # priority packets should be received or transmitted.431 run_test_dscp "Apptrust, PCP enabled. DSCP-prio ${dscp}:${dscp_prio}" \432 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp}433 434 apptrust_order="dscp"435 set_apptrust_order ${swp1} "${apptrust_order}"436 # If DSCP is enabled, packets should get DSCP priority which is set to 7437 # in this test. High priority packets should be received and transmitted.438 run_test_dscp "Apptrust, DSCP enabled. DSCP-prio ${dscp}:${dscp_prio}" \439 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp}440 441 apptrust_order="pcp dscp"442 set_apptrust_order ${swp1} "${apptrust_order}"443 # If PCP and DSCP are enabled, PCP would have higher apptrust priority444 # so packets should get PCP priority. But in this test VLAN PCP is not445 # set, so it should get DSCP priority which is set to 7. High priority446 # packets should be received and transmitted.447 run_test_dscp "Apptrust, PCP and DSCP are enabled. DSCP-prio ${dscp}:${dscp_prio}" \448 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp}449 450 # If VLAN PCP is set, it should have higher apptrust priority than DSCP451 # so packets should get VLAN PCP priority. Send packets with VLAN PCP452 # set to 0, DSCP set to 7. Packets should get VLAN PCP priority.453 # No high priority packets should be transmitted. Due to nature of the454 # switch, high priority packets will be received.455 pcp_prio=0456 pcp=0457 run_test_dscp_pcp "Apptrust, PCP and DSCP are enabled. PCP ${pcp_prio}, DSCP-prio ${dscp}:${dscp_prio}" \458 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp} ${pcp_prio} ${pcp}459 460 # If VLAN PCP is set to 7, it should have higher apptrust priority than461 # DSCP so packets should get VLAN PCP priority. Send packets with VLAN462 # PCP set to 7, DSCP set to 7. Packets should get VLAN PCP priority.463 # High priority packets should be received and transmitted.464 pcp_prio=7465 pcp=7466 run_test_dscp_pcp "Apptrust, PCP and DSCP are enabled. PCP ${pcp_prio}, DSCP-prio ${dscp}:${dscp_prio}" \467 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp} ${pcp_prio} ${pcp}468 # Now make sure that the switch is able to handle the case where DSCP469 # priority is set to 0 and PCP priority is set to 7. Packets should get470 # PCP priority. High priority packets should be received and transmitted.471 dscp_prio=0472 dcb app replace dev ${swp1} dscp-prio ${dscp}:${dscp_prio}473 run_test_dscp_pcp "Apptrust, PCP and DSCP are enabled. PCP ${pcp_prio}, DSCP-prio ${dscp}:${dscp_prio}" \474 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp} ${pcp_prio} ${pcp}475 # If both VLAN PCP and DSCP are set to 0, packets should get 0 priority.476 # No high priority packets should be received or transmitted.477 pcp_prio=0478 pcp=0479 run_test_dscp_pcp "Apptrust, PCP and DSCP are enabled. PCP ${pcp_prio}, DSCP-prio ${dscp}:${dscp_prio}" \480 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp} ${pcp_prio} ${pcp}481 482 # Restore original priorities483 if ! restore_priorities "${swp1}" "${original_dscp_prios_swp1}"; then484 RET=1485 fi486 487 set_apptrust_order ${swp1} "${orig_apptrust}"488 if [ "$orig_apptrust" != "$(port_get_default_apptrust ${swp1})" ]; then489 RET=1490 fi491 492 dcb app replace dev ${swp1} default-prio ${orig_port_prio}493 if [ $orig_port_prio -ne $(port_default_prio_get ${swp1}) ]; then494 RET=1495 fi496 497 log_test "Apptrust, restore original settings"498}499 500# Function to get current DSCP priorities501get_dscp_prios() {502 local if_name=$1503 dcb -j app show dev ${if_name} | jq -c '.dscp_prio'504}505 506# Function to set a specific DSCP priority on a device507replace_dscp_prio() {508 local if_name=$1509 local dscp=$2510 local prio=$3511 dcb app replace dev ${if_name} dscp-prio ${dscp}:${prio}512}513 514# Function to compare DSCP maps515compare_dscp_maps() {516 local old_json=$1517 local new_json=$2518 local dscp=$3519 local prio=$4520 521 # Create a modified old_json with the expected change for comparison522 local modified_old_json=$(echo "$old_json" |523 jq --argjson dscp $dscp --argjson prio $prio \524 'map(if .[0] == $dscp then [$dscp, $prio] else . end)' |525 tr -d " \n")526 527 # Compare new_json with the modified_old_json528 if [[ "$modified_old_json" == "$new_json" ]]; then529 return 0530 else531 return 1532 fi533}534 535# Function to set DSCP priorities536set_and_verify_dscp() {537 local port=$1538 local dscp=$2539 local new_prio=$3540 541 local old_prios=$(get_dscp_prios $port)542 543 replace_dscp_prio "$port" $dscp $new_prio544 545 # Fetch current settings and compare546 local current_prios=$(get_dscp_prios $port)547 if ! compare_dscp_maps "$old_prios" "$current_prios" $dscp $new_prio; then548 echo "Error: Unintended changes detected in DSCP map for $port after setting DSCP $dscp to $new_prio."549 return 1550 fi551 return 0552}553 554# Function to restore original priorities555restore_priorities() {556 local port=$1557 local original_prios=$2558 559 echo "Removing test artifacts for $port"560 local current_prios=$(get_dscp_prios $port)561 local prio_str=$(echo "$current_prios" |562 jq -r 'map("\(.[0]):\(.[1])") | join(" ")')563 dcb app del dev $port dscp-prio $prio_str564 565 echo "Restoring original DSCP priorities for $port"566 local restore_str=$(echo "$original_prios" |567 jq -r 'map("\(.[0]):\(.[1])") | join(" ")')568 dcb app add dev $port dscp-prio $restore_str569 570 local current_prios=$(get_dscp_prios $port)571 if [[ "$original_prios" != "$current_prios" ]]; then572 echo "Error: Failed to restore original DSCP priorities for $port"573 return 1574 fi575 return 0576}577 578# Initialize DSCP priorities. Set them to predictable values for testing.579init_dscp_prios() {580 local port=$1581 local original_prios=$2582 583 echo "Removing any existing DSCP priority mappins for $port"584 local prio_str=$(echo "$original_prios" |585 jq -r 'map("\(.[0]):\(.[1])") | join(" ")')586 dcb app del dev $port dscp-prio $prio_str587 588 # Initialize DSCP priorities list589 local dscp_prios=""590 for dscp in {0..63}; do591 dscp_prios+=("$dscp:0")592 done593 594 echo "Setting initial DSCP priorities map to 0 for $port"595 dcb app add dev $port dscp-prio ${dscp_prios[@]}596}597 598# Main function to test global DSCP map across specified ports599test_global_dscp_map() {600 local ports=("$swp1" "$swp2")601 local original_dscp_prios_port0=$(get_dscp_prios ${ports[0]})602 local orig_apptrust=$(port_get_default_apptrust ${swp1})603 local orig_port_prio=$(port_default_prio_get ${swp1})604 local apptrust_order="dscp"605 local port_prio=0606 local dscp_prio607 local dscp608 609 RET=0610 611 set_apptrust_order ${swp1} "${apptrust_order}"612 dcb app replace dev ${swp1} default-prio ${port_prio}613 614 # Initialize DSCP priorities615 init_dscp_prios "${ports[0]}" "$original_dscp_prios_port0"616 617 # Loop over each DSCP index618 for dscp in {0..63}; do619 # and test each Internal Priority value620 for dscp_prio in {0..7}; do621 # do it for each port. This is to test if the global DSCP map622 # is accessible from all ports.623 for port in "${ports[@]}"; do624 if ! set_and_verify_dscp "$port" $dscp $dscp_prio; then625 RET=1626 fi627 done628 629 # Test if the DSCP priority is correctly applied to the packets630 run_test_dscp "DSCP (${dscp}) QoS classification, prio: ${dscp_prio}" \631 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp}632 if [ ${RET} -eq 1 ]; then633 break634 fi635 done636 done637 638 # Restore original priorities639 if ! restore_priorities "${ports[0]}" "${original_dscp_prios_port0}"; then640 RET=1641 fi642 643 set_apptrust_order ${swp1} "${orig_apptrust}"644 if [[ "$orig_apptrust" != "$(port_get_default_apptrust ${swp1})" ]]; then645 RET=1646 fi647 648 dcb app replace dev ${swp1} default-prio ${orig_port_prio}649 if [ $orig_port_prio -ne $(port_default_prio_get ${swp1}) ]; then650 RET=1651 fi652 653 log_test "DSCP global map"654}655 656trap cleanup EXIT657 658ALL_TESTS="659 test_port_default660 test_port_apptrust661 test_global_dscp_map662"663 664setup_prepare665setup_wait666tests_run667 668exit $EXIT_STATUS669