1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 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=4 8 9WAIT_TIME=1 10NUM_NETIFS=4 11REQUIRE_JQ="yes" 12REQUIRE_MZ="yes" 13STABLE_MAC_ADDRS=yes 14NETIF_CREATE=no 15lib_dir=$(dirname $0)/../../../net/forwarding 16source $lib_dir/tc_common.sh 17source $lib_dir/lib.sh 18 19require_command dcb 20 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 the 32# system, to keep packet counters clean. 33h1_create() 34{ 35 simple_if_init $h1 36 sysctl_set net.ipv6.conf.${h1}.disable_ipv6 1 37 # Get the MAC address of the interface to use it with mausezahn 38 h1_mac=$(ip -j link show dev ${h1} | jq -e '.[].address') 39} 40 41h1_destroy() 42{ 43 sysctl_restore net.ipv6.conf.${h1}.disable_ipv6 44 simple_if_fini $h1 45} 46 47h2_create() 48{ 49 simple_if_init $h2 50 sysctl_set net.ipv6.conf.${h2}.disable_ipv6 1 51 h2_mac=$(ip -j link show dev ${h2} | jq -e '.[].address') 52} 53 54h2_destroy() 55{ 56 sysctl_restore net.ipv6.conf.${h2}.disable_ipv6 57 simple_if_fini $h2 58} 59 60switch_create() 61{ 62 ip link set ${swp1} up 63 ip link set ${swp2} up 64 sysctl_set net.ipv6.conf.${swp1}.disable_ipv6 1 65 sysctl_set net.ipv6.conf.${swp2}.disable_ipv6 1 66 67 # Ports should trust VLAN PCP even with vlan_filtering=0 68 ip link add br0 type bridge 69 ip link set ${swp1} master br0 70 ip link set ${swp2} master br0 71 ip link set br0 up 72 sysctl_set net.ipv6.conf.br0.disable_ipv6 1 73} 74 75switch_destroy() 76{ 77 sysctl_restore net.ipv6.conf.${swp2}.disable_ipv6 78 sysctl_restore net.ipv6.conf.${swp1}.disable_ipv6 79 80 ip link del br0 81} 82 83setup_prepare() 84{ 85 vrf_prepare 86 87 h1_create 88 h2_create 89 switch_create 90} 91 92cleanup() 93{ 94 pre_cleanup 95 96 h2_destroy 97 h1_destroy 98 switch_destroy 99 100 vrf_cleanup 101} 102 103set_apptrust_order() 104{ 105 local if_name=$1 106 local order=$2 107 108 dcb apptrust set dev ${if_name} order ${order} 109} 110 111# Function to extract a specified field from a given JSON stats string 112extract_network_stat() { 113 local stats_json=$1 114 local field_name=$2 115 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=$9 130 131 local rx_ipv 132 local tx_ipv 133 134 RET=0 135 136 # Send some packet to populate the switch MAC table 137 $MZ ${h2} -a ${h2_mac} -b ${h1_mac} -p 64 -t icmp echores -c 1 138 139 # Based on the apptrust order, set the expected Internal Priority values 140 # for the RX and TX paths. 141 if [ "${apptrust_order}" == "" ]; then 142 echo "Apptrust order not set." 143 rx_ipv=${port_prio} 144 tx_ipv=${port_prio} 145 elif [ "${apptrust_order}" == "dscp" ]; then 146 echo "Apptrust order is DSCP." 147 rx_ipv=${dscp_ipv} 148 tx_ipv=${dscp_ipv} 149 elif [ "${apptrust_order}" == "pcp" ]; then 150 echo "Apptrust order is PCP." 151 rx_ipv=${pcp_ipv} 152 tx_ipv=${pcp_ipv} 153 elif [ "${apptrust_order}" == "pcp dscp" ]; then 154 echo "Apptrust order is PCP DSCP." 155 if [ ${have_vlan} -eq 1 ]; then 156 rx_ipv=$((dscp_ipv > pcp_ipv ? dscp_ipv : pcp_ipv)) 157 tx_ipv=${pcp_ipv} 158 else 159 rx_ipv=${dscp_ipv} 160 tx_ipv=${dscp_ipv} 161 fi 162 else 163 RET=1 164 echo "Error: Unknown apptrust order ${apptrust_order}" 165 log_test "${test_name}" 166 return 167 fi 168 169 # Most/all? of the KSZ switches do not provide per-TC counters. There 170 # are only tx_hi and rx_hi counters, which are used to count packets 171 # which are considered as high priority and most likely not assigned 172 # to the queue 0. 173 # On the ingress path, packets seem to get high priority status 174 # 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 global 176 # map configuration. 177 # The thresholds for the high priority status are not documented, but 178 # it seems that the switch considers packets as high priority on the 179 # ingress path if detected Internal Priority is greater than 0. On the 180 # egress path, the switch considers packets as high priority if 181 # detected Internal Priority is greater than 1. 182 if [ ${rx_ipv} -ge 1 ]; then 183 local expect_rx_high_prio=1 184 else 185 local expect_rx_high_prio=0 186 fi 187 188 if [ ${tx_ipv} -ge 2 ]; then 189 local expect_tx_high_prio=1 190 else 191 local expect_tx_high_prio=0 192 fi 193 194 # Use ip tool to get the current switch packet counters. ethool stats 195 # 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 parameters 210 # For the testis with ipv4 or ipv6, use icmp response packets, 211 # to avoid interaction with the system, to keep packet counters 212 # clean. 213 if [ ${ip_v6} -eq 0 ]; then 214 local ip="-a ${h1_mac} -b ${h2_mac} -A ${H1_IPV4} \ 215 -B ${H2_IPV4} -t icmp unreach,code=1,dscp=${dscp}" 216 else 217 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 fi 220 221 if [ ${have_vlan} -eq 1 ]; then 222 local vlan_pcp_opt="-Q ${vlan_pcp}:0" 223 else 224 local vlan_pcp_opt="" 225 fi 226 $MZ ${h1} ${ip} -c ${PING_COUNT} -d 10msec ${vlan_pcp_opt} 227 228 # Wait until the switch packet counters are updated 229 sleep 6 230 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 after 252 if [ ${swp1_rx_packets_diff} -lt ${PING_COUNT} ]; then 253 echo "Not expected amount of received packets on ${swp1}" 254 echo "before ${swp1_rx_packets_before} after ${swp1_rx_packets_after}" 255 RET=1 256 fi 257 258 # Test if any packets were transmitted on swp2, we will tx before and after 259 if [ ${swp2_tx_packets_diff} -lt ${PING_COUNT} ]; then 260 echo "Not expected amount of transmitted packets on ${swp2}" 261 echo "before ${swp2_tx_packets_before} after ${swp2_tx_packets_after}" 262 RET=1 263 fi 264 265 # tx/rx_hi counted in bytes. So, we need to compare the difference in bytes 266 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 ]; then 272 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} ]; then 275 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=1 278 fi 279 else 280 if [ ${swp1_rx_hi_diff} -ne 0 ]; then 281 echo "Unexpected amount of high priority packets received on ${swp1}" 282 echo "RX hi diff: ${swp1_rx_hi_diff}, expected 0" 283 RET=1 284 fi 285 fi 286 287 if [ ${expect_tx_high_prio} -eq 1 ]; then 288 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} ]; then 291 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=1 294 fi 295 else 296 if [ ${swp2_tx_hi_diff} -ne 0 ]; then 297 echo "Unexpected amount of high priority packets transmitted on ${swp2}" 298 echo "TX hi diff: ${swp2_tx_hi_diff}, expected 0" 299 RET=1 300 fi 301 fi 302 303 log_test "${test_name}" 304} 305 306run_test_dscp() 307{ 308 # IPv4 test 309 run_test "$1" "$2" "$3" "$4" "$5" 0 0 0 0 310 # IPv6 test 311 run_test "$1" "$2" "$3" "$4" "$5" 0 0 0 1 312} 313 314run_test_dscp_pcp() 315{ 316 # IPv4 test 317 run_test "$1" "$2" "$3" "$4" "$5" 1 "$6" "$7" 0 318 # IPv6 test 319 run_test "$1" "$2" "$3" "$4" "$5" 1 "$6" "$7" 1 320} 321 322port_default_prio_get() 323{ 324 local if_name=$1 325 local prio 326 327 prio="$(dcb -j app show dev ${if_name} default-prio | \ 328 jq '.default_prio[]')" 329 if [ -z "${prio}" ]; then 330 prio=0 331 fi 332 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=0 343 344 # Make sure no other priority sources will interfere with the test 345 set_apptrust_order ${swp1} "${apptrust_order}" 346 347 for val in $(seq 0 7); do 348 dcb app replace dev ${swp1} default-prio ${val} 349 if [ $val -ne $(port_default_prio_get ${swp1}) ]; then 350 RET=1 351 break 352 fi 353 354 run_test_dscp "Port-default QoS classification, prio: ${val}" \ 355 "${apptrust_order}" ${val} 0 0 356 done 357 358 set_apptrust_order ${swp1} "${orig_apptrust}" 359 if [[ "$orig_apptrust" != "$(port_get_default_apptrust ${swp1})" ]]; then 360 RET=1 361 fi 362 363 dcb app replace dev ${swp1} default-prio ${orig_prio} 364 if [ $orig_prio -ne $(port_default_prio_get ${swp1}) ]; then 365 RET=1 366 fi 367 368 log_test "Port-default QoS classification" 369} 370 371port_get_default_apptrust() 372{ 373 local if_name=$1 374 375 dcb -j apptrust show dev ${if_name} | jq -r '.order[]' | \ 376 tr '\n' ' ' | xargs 377} 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_order 386 local port_prio 387 local dscp_prio 388 local pcp_prio 389 local dscp 390 local pcp 391 392 RET=0 393 394 # First, test if apptrust configuration as taken by the kernel 395 for order in "${order_variants[@]}"; do 396 set_apptrust_order ${swp1} "${order}" 397 if [[ "$order" != "$(port_get_default_apptrust ${swp1})" ]]; then 398 RET=1 399 break 400 fi 401 done 402 403 log_test "Apptrust, supported variants" 404 405 # To test if the apptrust configuration is working as expected, we need 406 # 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 disabled 410 # default port priority is 0, DSCP priority is mapped to 7. 411 # No high priority packets should be received or transmitted. 412 port_prio=0 413 dscp_prio=7 414 dscp=4 415 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 default 422 # priority which is 0 423 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 not 429 # set in this test (no VLAN tags are present in the packet). No high 430 # 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 7 437 # 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 priority 444 # so packets should get PCP priority. But in this test VLAN PCP is not 445 # set, so it should get DSCP priority which is set to 7. High priority 446 # 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 DSCP 451 # so packets should get VLAN PCP priority. Send packets with VLAN PCP 452 # 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 the 454 # switch, high priority packets will be received. 455 pcp_prio=0 456 pcp=0 457 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 than 461 # DSCP so packets should get VLAN PCP priority. Send packets with VLAN 462 # 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=7 465 pcp=7 466 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 DSCP 469 # priority is set to 0 and PCP priority is set to 7. Packets should get 470 # PCP priority. High priority packets should be received and transmitted. 471 dscp_prio=0 472 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=0 478 pcp=0 479 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 priorities 483 if ! restore_priorities "${swp1}" "${original_dscp_prios_swp1}"; then 484 RET=1 485 fi 486 487 set_apptrust_order ${swp1} "${orig_apptrust}" 488 if [ "$orig_apptrust" != "$(port_get_default_apptrust ${swp1})" ]; then 489 RET=1 490 fi 491 492 dcb app replace dev ${swp1} default-prio ${orig_port_prio} 493 if [ $orig_port_prio -ne $(port_default_prio_get ${swp1}) ]; then 494 RET=1 495 fi 496 497 log_test "Apptrust, restore original settings" 498} 499 500# Function to get current DSCP priorities 501get_dscp_prios() { 502 local if_name=$1 503 dcb -j app show dev ${if_name} | jq -c '.dscp_prio' 504} 505 506# Function to set a specific DSCP priority on a device 507replace_dscp_prio() { 508 local if_name=$1 509 local dscp=$2 510 local prio=$3 511 dcb app replace dev ${if_name} dscp-prio ${dscp}:${prio} 512} 513 514# Function to compare DSCP maps 515compare_dscp_maps() { 516 local old_json=$1 517 local new_json=$2 518 local dscp=$3 519 local prio=$4 520 521 # Create a modified old_json with the expected change for comparison 522 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_json 528 if [[ "$modified_old_json" == "$new_json" ]]; then 529 return 0 530 else 531 return 1 532 fi 533} 534 535# Function to set DSCP priorities 536set_and_verify_dscp() { 537 local port=$1 538 local dscp=$2 539 local new_prio=$3 540 541 local old_prios=$(get_dscp_prios $port) 542 543 replace_dscp_prio "$port" $dscp $new_prio 544 545 # Fetch current settings and compare 546 local current_prios=$(get_dscp_prios $port) 547 if ! compare_dscp_maps "$old_prios" "$current_prios" $dscp $new_prio; then 548 echo "Error: Unintended changes detected in DSCP map for $port after setting DSCP $dscp to $new_prio." 549 return 1 550 fi 551 return 0 552} 553 554# Function to restore original priorities 555restore_priorities() { 556 local port=$1 557 local original_prios=$2 558 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_str 564 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_str 569 570 local current_prios=$(get_dscp_prios $port) 571 if [[ "$original_prios" != "$current_prios" ]]; then 572 echo "Error: Failed to restore original DSCP priorities for $port" 573 return 1 574 fi 575 return 0 576} 577 578# Initialize DSCP priorities. Set them to predictable values for testing. 579init_dscp_prios() { 580 local port=$1 581 local original_prios=$2 582 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_str 587 588 # Initialize DSCP priorities list 589 local dscp_prios="" 590 for dscp in {0..63}; do 591 dscp_prios+=("$dscp:0") 592 done 593 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 ports 599test_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=0 606 local dscp_prio 607 local dscp 608 609 RET=0 610 611 set_apptrust_order ${swp1} "${apptrust_order}" 612 dcb app replace dev ${swp1} default-prio ${port_prio} 613 614 # Initialize DSCP priorities 615 init_dscp_prios "${ports[0]}" "$original_dscp_prios_port0" 616 617 # Loop over each DSCP index 618 for dscp in {0..63}; do 619 # and test each Internal Priority value 620 for dscp_prio in {0..7}; do 621 # do it for each port. This is to test if the global DSCP map 622 # is accessible from all ports. 623 for port in "${ports[@]}"; do 624 if ! set_and_verify_dscp "$port" $dscp $dscp_prio; then 625 RET=1 626 fi 627 done 628 629 # Test if the DSCP priority is correctly applied to the packets 630 run_test_dscp "DSCP (${dscp}) QoS classification, prio: ${dscp_prio}" \ 631 "${apptrust_order}" ${port_prio} ${dscp_prio} ${dscp} 632 if [ ${RET} -eq 1 ]; then 633 break 634 fi 635 done 636 done 637 638 # Restore original priorities 639 if ! restore_priorities "${ports[0]}" "${original_dscp_prios_port0}"; then 640 RET=1 641 fi 642 643 set_apptrust_order ${swp1} "${orig_apptrust}" 644 if [[ "$orig_apptrust" != "$(port_get_default_apptrust ${swp1})" ]]; then 645 RET=1 646 fi 647 648 dcb app replace dev ${swp1} default-prio ${orig_port_prio} 649 if [ $orig_port_prio -ne $(port_default_prio_get ${swp1}) ]; then 650 RET=1 651 fi 652 653 log_test "DSCP global map" 654} 655 656trap cleanup EXIT 657 658ALL_TESTS=" 659 test_port_default 660 test_port_apptrust 661 test_global_dscp_map 662" 663 664setup_prepare 665setup_wait 666tests_run 667 668exit $EXIT_STATUS 669