cmsg_so_priority.sh 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. source lib.sh
  4. readonly KSFT_SKIP=4
  5. IP4=192.0.2.1/24
  6. TGT4=192.0.2.2
  7. TGT4_RAW=192.0.2.3
  8. IP6=2001:db8::1/64
  9. TGT6=2001:db8::2
  10. TGT6_RAW=2001:db8::3
  11. PORT=1234
  12. TOTAL_TESTS=0
  13. FAILED_TESTS=0
  14. if ! command -v jq &> /dev/null; then
  15. echo "SKIP cmsg_so_priroity.sh test: jq is not installed." >&2
  16. exit "$KSFT_SKIP"
  17. fi
  18. check_result() {
  19. ((TOTAL_TESTS++))
  20. if [ "$1" -ne 0 ]; then
  21. ((FAILED_TESTS++))
  22. fi
  23. }
  24. cleanup()
  25. {
  26. cleanup_ns $NS
  27. }
  28. trap cleanup EXIT
  29. setup_ns NS
  30. create_filter() {
  31. local handle=$1
  32. local vlan_prio=$2
  33. local ip_type=$3
  34. local proto=$4
  35. local dst_ip=$5
  36. local ip_proto
  37. if [[ "$proto" == "u" ]]; then
  38. ip_proto="udp"
  39. elif [[ "$ip_type" == "ipv4" && "$proto" == "i" ]]; then
  40. ip_proto="icmp"
  41. elif [[ "$ip_type" == "ipv6" && "$proto" == "i" ]]; then
  42. ip_proto="icmpv6"
  43. fi
  44. tc -n $NS filter add dev dummy1 \
  45. egress pref 1 handle "$handle" proto 802.1q \
  46. flower vlan_prio "$vlan_prio" vlan_ethtype "$ip_type" \
  47. dst_ip "$dst_ip" ${ip_proto:+ip_proto $ip_proto} \
  48. action pass
  49. }
  50. ip -n $NS link set dev lo up
  51. ip -n $NS link add name dummy1 up type dummy
  52. ip -n $NS link add link dummy1 name dummy1.10 up type vlan id 10 \
  53. egress-qos-map 0:0 1:1 2:2 3:3 4:4 5:5 6:6 7:7
  54. ip -n $NS address add $IP4 dev dummy1.10
  55. ip -n $NS address add $IP6 dev dummy1.10 nodad
  56. ip netns exec $NS sysctl -wq net.ipv4.ping_group_range='0 2147483647'
  57. ip -n $NS neigh add $TGT4 lladdr 00:11:22:33:44:55 nud permanent \
  58. dev dummy1.10
  59. ip -n $NS neigh add $TGT6 lladdr 00:11:22:33:44:55 nud permanent \
  60. dev dummy1.10
  61. ip -n $NS neigh add $TGT4_RAW lladdr 00:11:22:33:44:66 nud permanent \
  62. dev dummy1.10
  63. ip -n $NS neigh add $TGT6_RAW lladdr 00:11:22:33:44:66 nud permanent \
  64. dev dummy1.10
  65. tc -n $NS qdisc add dev dummy1 clsact
  66. FILTER_COUNTER=10
  67. for i in 4 6; do
  68. for proto in u i r; do
  69. echo "Test IPV$i, prot: $proto"
  70. for priority in {0..7}; do
  71. if [[ $i == 4 && $proto == "r" ]]; then
  72. TGT=$TGT4_RAW
  73. elif [[ $i == 6 && $proto == "r" ]]; then
  74. TGT=$TGT6_RAW
  75. elif [ $i == 4 ]; then
  76. TGT=$TGT4
  77. else
  78. TGT=$TGT6
  79. fi
  80. handle="${FILTER_COUNTER}${priority}"
  81. create_filter $handle $priority ipv$i $proto $TGT
  82. pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \
  83. | jq ".[] | select(.options.handle == ${handle}) | \
  84. .options.actions[0].stats.packets")
  85. if [[ $pkts == 0 ]]; then
  86. check_result 0
  87. else
  88. echo "prio $priority: expected 0, got $pkts"
  89. check_result 1
  90. fi
  91. ip netns exec $NS ./cmsg_sender -$i -Q $priority \
  92. -p $proto $TGT $PORT
  93. pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \
  94. | jq ".[] | select(.options.handle == ${handle}) | \
  95. .options.actions[0].stats.packets")
  96. if [[ $pkts == 1 ]]; then
  97. check_result 0
  98. else
  99. echo "prio $priority -Q: expected 1, got $pkts"
  100. check_result 1
  101. fi
  102. ip netns exec $NS ./cmsg_sender -$i -P $priority \
  103. -p $proto $TGT $PORT
  104. pkts=$(tc -n $NS -j -s filter show dev dummy1 egress \
  105. | jq ".[] | select(.options.handle == ${handle}) | \
  106. .options.actions[0].stats.packets")
  107. if [[ $pkts == 2 ]]; then
  108. check_result 0
  109. else
  110. echo "prio $priority -P: expected 2, got $pkts"
  111. check_result 1
  112. fi
  113. done
  114. FILTER_COUNTER=$((FILTER_COUNTER + 10))
  115. done
  116. done
  117. if [ $FAILED_TESTS -ne 0 ]; then
  118. echo "FAIL - $FAILED_TESTS/$TOTAL_TESTS tests failed"
  119. exit 1
  120. else
  121. echo "OK - All $TOTAL_TESTS tests passed"
  122. exit 0
  123. fi