selftests: forwarding: fix race between packet receive and tc check
authorJiri Pirko <jiri@mellanox.com>
Thu, 28 Nov 2019 12:38:57 +0000 (13:38 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sat, 30 Nov 2019 20:23:27 +0000 (12:23 -0800)
It is possible that tc stats get checked before the packet we check for
actually arrived into the interface and accounted for.
Fix it by checking for the expected result in a loop until
timeout is reached (by default 1 second).

Fixes: 07e5c75184a1 ("selftests: forwarding: Introduce tc flower matching tests")
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/forwarding/tc_common.sh

index d93589b..64f6526 100644 (file)
@@ -3,16 +3,42 @@
 
 CHECK_TC="yes"
 
+# Can be overridden by the configuration file. See lib.sh
+TC_HIT_TIMEOUT=${TC_HIT_TIMEOUT:=1000} # ms
+
+__tc_check_packets()
+{
+       local id=$1
+       local handle=$2
+       local count=$3
+       local operator=$4
+
+       start_time="$(date -u +%s%3N)"
+       while true
+       do
+               cmd_jq "tc -j -s filter show $id" \
+                      ".[] | select(.options.handle == $handle) | \
+                           select(.options.actions[0].stats.packets $operator $count)" \
+                   &> /dev/null
+               ret=$?
+               if [[ $ret -eq 0 ]]; then
+                       return $ret
+               fi
+               current_time="$(date -u +%s%3N)"
+               diff=$(expr $current_time - $start_time)
+               if [ "$diff" -gt "$TC_HIT_TIMEOUT" ]; then
+                       return 1
+               fi
+       done
+}
+
 tc_check_packets()
 {
        local id=$1
        local handle=$2
        local count=$3
 
-       cmd_jq "tc -j -s filter show $id" \
-              ".[] | select(.options.handle == $handle) | \
-                     select(.options.actions[0].stats.packets == $count)" \
-              &> /dev/null
+       __tc_check_packets "$id" "$handle" "$count" "=="
 }
 
 tc_check_packets_hitting()
@@ -20,8 +46,5 @@ tc_check_packets_hitting()
        local id=$1
        local handle=$2
 
-       cmd_jq "tc -j -s filter show $id" \
-              ".[] | select(.options.handle == $handle) | \
-                     select(.options.actions[0].stats.packets > 0)" \
-              &> /dev/null
+       __tc_check_packets "$id" "$handle" 0 ">"
 }