| From fe9074820f6c61fceb4764422a8f9b607b7e8451 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 14 Mar 2024 10:59:11 +0000 |
| Subject: selftests/bpf: Prevent client connect before server bind in |
| test_tc_tunnel.sh |
| |
| From: Alessandro Carminati (Red Hat) <alessandro.carminati@gmail.com> |
| |
| [ Upstream commit f803bcf9208a2540acb4c32bdc3616673169f490 ] |
| |
| In some systems, the netcat server can incur in delay to start listening. |
| When this happens, the test can randomly fail in various points. |
| This is an example error message: |
| |
| # ip gre none gso |
| # encap 192.168.1.1 to 192.168.1.2, type gre, mac none len 2000 |
| # test basic connectivity |
| # Ncat: Connection refused. |
| |
| The issue stems from a race condition between the netcat client and server. |
| The test author had addressed this problem by implementing a sleep, which |
| I have removed in this patch. |
| This patch introduces a function capable of sleeping for up to two seconds. |
| However, it can terminate the waiting period early if the port is reported |
| to be listening. |
| |
| Signed-off-by: Alessandro Carminati (Red Hat) <alessandro.carminati@gmail.com> |
| Signed-off-by: Andrii Nakryiko <andrii@kernel.org> |
| Link: https://lore.kernel.org/bpf/20240314105911.213411-1-alessandro.carminati@gmail.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| tools/testing/selftests/bpf/test_tc_tunnel.sh | 13 ++++++++++++- |
| 1 file changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/tools/testing/selftests/bpf/test_tc_tunnel.sh b/tools/testing/selftests/bpf/test_tc_tunnel.sh |
| index 088fcad138c98..38c6e9f16f41e 100755 |
| --- a/tools/testing/selftests/bpf/test_tc_tunnel.sh |
| +++ b/tools/testing/selftests/bpf/test_tc_tunnel.sh |
| @@ -71,7 +71,6 @@ cleanup() { |
| server_listen() { |
| ip netns exec "${ns2}" nc "${netcat_opt}" -l "${port}" > "${outfile}" & |
| server_pid=$! |
| - sleep 0.2 |
| } |
| |
| client_connect() { |
| @@ -92,6 +91,16 @@ verify_data() { |
| fi |
| } |
| |
| +wait_for_port() { |
| + for i in $(seq 20); do |
| + if ip netns exec "${ns2}" ss ${2:--4}OHntl | grep -q "$1"; then |
| + return 0 |
| + fi |
| + sleep 0.1 |
| + done |
| + return 1 |
| +} |
| + |
| set -e |
| |
| # no arguments: automated test, run all |
| @@ -189,6 +198,7 @@ setup |
| # basic communication works |
| echo "test basic connectivity" |
| server_listen |
| +wait_for_port ${port} ${netcat_opt} |
| client_connect |
| verify_data |
| |
| @@ -200,6 +210,7 @@ ip netns exec "${ns1}" tc filter add dev veth1 egress \ |
| section "encap_${tuntype}_${mac}" |
| echo "test bpf encap without decap (expect failure)" |
| server_listen |
| +wait_for_port ${port} ${netcat_opt} |
| ! client_connect |
| |
| if [[ "$tuntype" =~ "udp" ]]; then |
| -- |
| 2.43.0 |
| |