Nmap names and installs its netcat implementation as ncat. Its Makefile
installs the ncat executable and does not create an nc link. Ubuntu and
Fedora provide nc through packaging alternatives, whereas the NixOS
Nmap package exposes the upstream executable name. Consequently, OVN
reports HAVE_NC=no and cannot run its netcat-based system tests there.

Prefer ncat when it is available and retain nc as a fallback for systems
which provide the compatibility name or another supported netcat
implementation. Route all invocations through the command selected by
the feature probe.

The tests use several Ncat-specific options, which is why the upstream
Nmap name is the first choice rather than merely accepting whichever
netcat command appears first in PATH.

Assisted-by: Codex gpt-5.6-sol high
Signed-off-by: Ihar Hrachyshka <[email protected]>
---
 tests/atlocal.in              |  15 +-
 tests/system-common-macros.at |  10 +-
 tests/system-ovn-kmod.at      |  90 +++----
 tests/system-ovn.at           | 472 +++++++++++++++++-----------------
 4 files changed, 298 insertions(+), 289 deletions(-)

diff --git a/tests/atlocal.in b/tests/atlocal.in
index 2683e9a2f..40635266f 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -135,11 +135,20 @@ find_command()
     fi
 }
 
-# Set HAVE_NC
-find_command nc
+# Set HAVE_NC and select the installed netcat command.
+if command -v ncat > /dev/null 2>&1; then
+    NC=ncat
+    HAVE_NC=yes
+elif command -v nc > /dev/null 2>&1; then
+    NC=nc
+    HAVE_NC=yes
+else
+    NC=nc
+    HAVE_NC=no
+fi
 
 # Determine correct netcat option to quit on stdin EOF
-if nc --version 2>&1 | grep -q nmap.org; then
+if "$NC" --version 2>&1 | grep -q nmap.org; then
     # Nmap netcat
     NC_EOF_OPT="--send-only -w 5"
 else
diff --git a/tests/system-common-macros.at b/tests/system-common-macros.at
index a7585eeb6..634052cbe 100644
--- a/tests/system-common-macros.at
+++ b/tests/system-common-macros.at
@@ -209,7 +209,7 @@ m4_define([NETNS_START_DHCPD],
 # test.
 #
 m4_define([NETNS_START_UDP_ECHO],
-   [ip netns exec $1 nc -$2 -k -l -u -p $3 -d 0.1 -c 'cat' & echo $! > $4
+   [ip netns exec $1 $NC -$2 -k -l -u -p $3 -d 0.1 -c 'cat' & echo $! > $4
      echo "pkill -P \`cat $4\`; kill \`cat $4\`" >> cleanup
    ]
 )
@@ -498,8 +498,8 @@ m4_define([NS_CHECK_CONNECTIVITY__],
     check ovs-appctl revalidator/wait
 
     # Start a simple TCP and UDP echo server that replies with "ack 
<received_msg>".
-    NETNS_DAEMONIZE($ns_dst, [nc $proto -l -p 1235 -d 0.1 -c 'cat'], 
[nc-$ns_dst-$ip-tcp.pid])
-    NETNS_DAEMONIZE($ns_dst, [nc $proto -l -u -p 1234 -d 0.1 -c 'cat'], 
[nc-$ns_dst-$ip-udp.pid])
+    NETNS_DAEMONIZE($ns_dst, [$NC $proto -l -p 1235 -d 0.1 -c 'cat'], 
[nc-$ns_dst-$ip-tcp.pid])
+    NETNS_DAEMONIZE($ns_dst, [$NC $proto -l -u -p 1234 -d 0.1 -c 'cat'], 
[nc-$ns_dst-$ip-udp.pid])
 
     # Ensure that the destination NS can be pinged on the specified IP
     NS_CHECK_EXEC([$ns_src], [ping $proto -q -c 3 -i 0.3 -w 2 $ip | 
FORMAT_PING], \
@@ -512,8 +512,8 @@ m4_define([NS_CHECK_CONNECTIVITY__],
     :> ./tcp_data
     :> ./udp_data
 
-    NETNS_DAEMONIZE($ns_src, [nc $proto $ip 1235 -d 0.1 -c 'for i in $(seq 1 
3); do echo "tcp_data $i"; read msg; echo "$msg" >>./tcp_data; done'], 
[nc_$ns_src-$ip-tcp.pid])
-    NETNS_DAEMONIZE($ns_src, [nc $proto -u $ip 1234 -d 0.1 -c 'for i in $(seq 
1 3); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data; done'], 
[nc_$ns_src-$ip-udp.pid])
+    NETNS_DAEMONIZE($ns_src, [$NC $proto $ip 1235 -d 0.1 -c 'for i in $(seq 1 
3); do echo "tcp_data $i"; read msg; echo "$msg" >>./tcp_data; done'], 
[nc_$ns_src-$ip-tcp.pid])
+    NETNS_DAEMONIZE($ns_src, [$NC $proto -u $ip 1234 -d 0.1 -c 'for i in $(seq 
1 3); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data; done'], 
[nc_$ns_src-$ip-udp.pid])
 
     OVS_WAIT_FOR_OUTPUT([cat ./tcp_data],  [0], [dnl
 tcp_data 1
diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
index 754926721..dcfba7e87 100644
--- a/tests/system-ovn-kmod.at
+++ b/tests/system-ovn-kmod.at
@@ -107,8 +107,8 @@ check ovn-nbctl lr-lb-add R2 lb0-no-aff
 check ovn-nbctl lr-lb-add R2 lb10-no-aff
 
 # Start webservers in 'foo1', 'bar1'.
-NETNS_DAEMONIZE([foo1], [nc -l -k 192.168.1.2 80], [nc-foo1.pid])
-NETNS_DAEMONIZE([bar1], [nc -l -k 192.168.2.2 80], [nc-bar1.pid])
+NETNS_DAEMONIZE([foo1], [$NC -l -k 192.168.1.2 80], [nc-foo1.pid])
+NETNS_DAEMONIZE([bar1], [$NC -l -k 192.168.2.2 80], [nc-bar1.pid])
 
 # Wait for ovn-controller to catch up.
 check ovn-nbctl --wait=hv sync
@@ -122,7 +122,7 @@ grep 'nat(dst=192.168.2.2:80)'])
 dnl Should work with the virtual IP address through NAT
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([alice1], [nc -z 172.16.1.100 8080])
+        NS_EXEC([alice1], [$NC -z 172.16.1.100 8080])
     done
 
     dnl Each server should have at least one connection.
@@ -140,7 +140,7 @@ check ovn-nbctl --wait=sb set load_balancer lb10 
options:affinity_timeout=60
 
 for i in $(seq 1 15); do
     echo Request $i
-    NS_CHECK_EXEC([alice1], [nc -z 172.16.1.100 8080])
+    NS_CHECK_EXEC([alice1], [$NC -z 172.16.1.100 8080])
 done
 
 dnl here we should have just one entry in the ct table
@@ -161,7 +161,7 @@ n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
'/priority=150,ct_state=\+new\
 echo $?
 }
 AT_CHECK([test $(check_affinity_flows) -eq 0])
-NS_CHECK_EXEC([alice1], [nc -z 172.16.1.100 8081])
+NS_CHECK_EXEC([alice1], [$NC -z 172.16.1.100 8081])
 
 # Flush conntrack entries for easier output parsing of next test.
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
@@ -181,7 +181,7 @@ check ovn-nbctl lr-lb-add R2 lb11-no-aff
 # check we use both backends
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([alice1], [nc -z 172.16.1.101 8080])
+        NS_EXEC([alice1], [$NC -z 172.16.1.101 8080])
         ovs-ofctl del-flows br-int table=OFTABLE_CHK_LB_AFFINITY
     done
 
@@ -191,7 +191,7 @@ OVS_WAIT_FOR_OUTPUT([
 
tcp,orig=(src=172.16.1.2,dst=172.16.1.101,sport=<cleared>,dport=<cleared>),reply=(src=192.168.1.2,dst=172.16.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 
tcp,orig=(src=172.16.1.2,dst=172.16.1.101,sport=<cleared>,dport=<cleared>),reply=(src=192.168.2.2,dst=172.16.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([alice1], [nc -z 172.16.1.101 8081])
+NS_CHECK_EXEC([alice1], [$NC -z 172.16.1.101 8081])
 
 dnl There shouldn't be any DP flow with both +est and ct_tuple4. Otherwise HW
 dnl offload may not work.
@@ -200,7 +200,7 @@ AT_CHECK([ovs-appctl dpctl/dump-flows | grep 'ct_tuple4' | 
grep '+est'], [1], [i
 # Flush conntrack entries for easier output parsing of next test.
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
-NETNS_DAEMONIZE([bar2], [nc -l -k 192.168.2.3 80], [nc-bar2.pid])
+NETNS_DAEMONIZE([bar2], [$NC -l -k 192.168.2.3 80], [nc-bar2.pid])
 
 check ovn-nbctl lb-add lb2 192.168.2.100:8080 192.168.2.2:80,192.168.2.3:80
 check ovn-nbctl lb-add lb20 192.168.2.120:8080 192.168.2.2:80,192.168.2.3:80
@@ -215,14 +215,14 @@ check ovn-nbctl ls-lb-add foo lb20-no-aff
 
 for i in $(seq 1 15); do
     echo Request $i
-    NS_CHECK_EXEC([foo1], [nc -z 192.168.2.100 8080])
+    NS_CHECK_EXEC([foo1], [$NC -z 192.168.2.100 8080])
 done
 
 AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(192.168.2.100) |
 sed -e 's/zone=[[0-9]]*/zone=<cleared>/; 
s/src=192.168.2.[[0-9]]/src=192.168.2.<cleared>/'], [0], [dnl
 
tcp,orig=(src=192.168.1.2,dst=192.168.2.100,sport=<cleared>,dport=<cleared>),reply=(src=192.168.2.<cleared>,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([foo1], [nc -z 192.168.2.100 8081])
+NS_CHECK_EXEC([foo1], [$NC -z 192.168.2.100 8081])
 
 # Flush conntrack entries for easier output parsing of next test.
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
@@ -242,7 +242,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([foo1], [nc -z 192.168.2.101 8080])
+        NS_EXEC([foo1], [$NC -z 192.168.2.101 8080])
         ovs-ofctl del-flows br-int table=OFTABLE_CHK_LB_AFFINITY
     done
 
@@ -252,7 +252,7 @@ OVS_WAIT_FOR_OUTPUT([
 
tcp,orig=(src=192.168.1.2,dst=192.168.2.101,sport=<cleared>,dport=<cleared>),reply=(src=192.168.2.2,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 
tcp,orig=(src=192.168.1.2,dst=192.168.2.101,sport=<cleared>,dport=<cleared>),reply=(src=192.168.2.3,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([foo1], [nc -z 192.168.2.101 8081])
+NS_CHECK_EXEC([foo1], [$NC -z 192.168.2.101 8081])
 
 NS_CHECK_EXEC([foo1], [ip neigh add 192.168.1.200 lladdr 00:00:01:01:02:03 dev 
foo1], [0])
 check ovn-nbctl lb-add lb4 192.168.1.100:8080 192.168.1.2:80
@@ -275,7 +275,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 for i in $(seq 1 15); do
     echo Request $i
-    NS_CHECK_EXEC([foo1], [nc -z 192.168.1.100 8080])
+    NS_CHECK_EXEC([foo1], [$NC -z 192.168.1.100 8080])
 done
 
 dnl Each server should have at least one connection.
@@ -285,7 +285,7 @@ 
tcp,orig=(src=192.168.1.2,dst=192.168.1.100,sport=<cleared>,dport=<cleared>),rep
 
tcp,orig=(src=192.168.1.2,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),reply=(src=192.168.1.2,dst=192.168.1.200,sport=<cleared>,dport=<cleared>),zone=<cleared>,protoinfo=(state=<cleared>)
 
tcp,orig=(src=192.168.1.200,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),reply=(src=192.168.1.2,dst=192.168.1.200,sport=<cleared>,dport=<cleared>),zone=<cleared>,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([foo1], [nc -z 192.168.1.100 8081])
+NS_CHECK_EXEC([foo1], [$NC -z 192.168.1.100 8081])
 
 dnl There shouldn't be any DP flow with both +est and ct_tuple4. Otherwise HW
 dnl offload may not work.
@@ -416,13 +416,13 @@ OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-groups 
br-int | \
 grep 'nat(dst=\[[fd11::2\]]:80)'])
 
 # Start webservers in 'foo1', 'bar1'.
-NETNS_DAEMONIZE([foo1], [nc -l -k fd11::2 80], [nc-foo1.pid])
-NETNS_DAEMONIZE([bar1], [nc -l -k fd12::2 80], [nc-bar1.pid])
+NETNS_DAEMONIZE([foo1], [$NC -l -k fd11::2 80], [nc-foo1.pid])
+NETNS_DAEMONIZE([bar1], [$NC -l -k fd12::2 80], [nc-bar1.pid])
 
 dnl Should work with the virtual IP address through NAT
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([alice1], [nc -z fd30::1 8080])
+        NS_EXEC([alice1], [$NC -z fd30::1 8080])
     done
 
     dnl Each server should have at least one connection.
@@ -431,7 +431,7 @@ OVS_WAIT_FOR_OUTPUT([
 
tcp,orig=(src=fd72::2,dst=fd30::1,sport=<cleared>,dport=<cleared>),reply=(src=fd11::2,dst=fd72::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 
tcp,orig=(src=fd72::2,dst=fd30::1,sport=<cleared>,dport=<cleared>),reply=(src=fd12::2,dst=fd72::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([alice1], [nc -z fd30::1 8081])
+NS_CHECK_EXEC([alice1], [$NC -z fd30::1 8081])
 
 # Flush conntrack entries for easier output parsing of next test.
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
@@ -441,7 +441,7 @@ check ovn-nbctl --wait=sb set load_balancer lb10 
options:affinity_timeout=60
 
 for i in $(seq 1 15); do
     echo Request $i
-    NS_CHECK_EXEC([alice1], [nc -z fd30::1 8080])
+    NS_CHECK_EXEC([alice1], [$NC -z fd30::1 8080])
 done
 
 dnl here we should have just one entry in the ct table
@@ -462,7 +462,7 @@ n2=$(ovs-ofctl dump-flows br-int table=$dnat |awk 
'/priority=150,ct_state=\+new\
 echo $?
 }
 AT_CHECK([test $(check_affinity_flows) -eq 0])
-NS_CHECK_EXEC([alice1], [nc -z fd30::1 8081])
+NS_CHECK_EXEC([alice1], [$NC -z fd30::1 8081])
 
 # Flush conntrack entries for easier output parsing of next test.
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
@@ -482,7 +482,7 @@ check ovn-nbctl lr-lb-add R2 lb11-no-aff
 # check we use both backends
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([alice1], [nc -z fd30::2 8080])
+        NS_EXEC([alice1], [$NC -z fd30::2 8080])
         ovs-ofctl del-flows br-int table=OFTABLE_CHK_LB_AFFINITY
     done
 
@@ -492,12 +492,12 @@ OVS_WAIT_FOR_OUTPUT([
 
tcp,orig=(src=fd72::2,dst=fd30::2,sport=<cleared>,dport=<cleared>),reply=(src=fd11::2,dst=fd72::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 
tcp,orig=(src=fd72::2,dst=fd30::2,sport=<cleared>,dport=<cleared>),reply=(src=fd12::2,dst=fd72::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([alice1], [nc -z fd30::2 8081])
+NS_CHECK_EXEC([alice1], [$NC -z fd30::2 8081])
 
 # Flush conntrack entries for easier output parsing of next test.
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
-NETNS_DAEMONIZE([bar2], [nc -l -k fd12::3 80], [nc-bar2.pid])
+NETNS_DAEMONIZE([bar2], [$NC -l -k fd12::3 80], [nc-bar2.pid])
 
 check ovn-nbctl lb-add lb2 [[fd12::a]]:8080 [[fd12::2]]:80,[[fd12::3]]:80
 check ovn-nbctl lb-add lb20 [[fd12::2a]]:8080 [[fd12::2]]:80,[[fd12::3]]:80
@@ -512,7 +512,7 @@ check ovn-nbctl ls-lb-add foo lb20-no-aff
 
 for i in $(seq 1 15); do
     echo Request $i
-    NS_CHECK_EXEC([foo1], [nc -z fd12::a 8080])
+    NS_CHECK_EXEC([foo1], [$NC -z fd12::a 8080])
 done
 
 dnl here we should have just one entry in the ct table
@@ -520,7 +520,7 @@ AT_CHECK([ovs-appctl dpctl/dump-conntrack | 
FORMAT_CT(fd12::a) | grep -v fe80 |
 sed -e 's/zone=[[0-9]]*/zone=<cleared>/; 
s/src=fd12::[[0-9]]/src=fd12::<cleared>/'], [0], [dnl
 
tcp,orig=(src=fd11::2,dst=fd12::a,sport=<cleared>,dport=<cleared>),reply=(src=fd12::<cleared>,dst=fd11::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([foo1], [nc -z fd12::a 8081])
+NS_CHECK_EXEC([foo1], [$NC -z fd12::a 8081])
 
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
@@ -537,7 +537,7 @@ check ovn-nbctl ls-lb-add foo lb30-no-aff
 
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([foo1], [nc -z fd12::b 8080])
+        NS_EXEC([foo1], [$NC -z fd12::b 8080])
         ovs-ofctl del-flows br-int table=OFTABLE_CHK_LB_AFFINITY
     done
 
@@ -546,7 +546,7 @@ OVS_WAIT_FOR_OUTPUT([
 
tcp,orig=(src=fd11::2,dst=fd12::b,sport=<cleared>,dport=<cleared>),reply=(src=fd12::2,dst=fd11::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 
tcp,orig=(src=fd11::2,dst=fd12::b,sport=<cleared>,dport=<cleared>),reply=(src=fd12::3,dst=fd11::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([foo1], [nc -z fd12::b 8081])
+NS_CHECK_EXEC([foo1], [$NC -z fd12::b 8081])
 
 NS_CHECK_EXEC([foo1], [ip -6 neigh add fd11::b lladdr 00:00:01:01:02:03 dev 
foo1], [0])
 check ovn-nbctl --wait=sb lb-add lb4 [[fd11::a]]:8080 [[fd11::2]]:80
@@ -569,7 +569,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 OVS_WAIT_FOR_OUTPUT([
     for i in $(seq 1 5); do
-        NS_EXEC([foo1], [nc -z fd11::a 8080])
+        NS_EXEC([foo1], [$NC -z fd11::a 8080])
     done
 
     dnl Each server should have at least one connection.
@@ -579,7 +579,7 @@ 
tcp,orig=(src=fd11::2,dst=fd11::2,sport=<cleared>,dport=<cleared>),reply=(src=fd
 
tcp,orig=(src=fd11::2,dst=fd11::a,sport=<cleared>,dport=<cleared>),reply=(src=fd11::2,dst=fd11::2,sport=<cleared>,dport=<cleared>),zone=<cleared>,mark=2,protoinfo=(state=<cleared>)
 
tcp,orig=(src=fd11::b,dst=fd11::2,sport=<cleared>,dport=<cleared>),reply=(src=fd11::2,dst=fd11::b,sport=<cleared>,dport=<cleared>),zone=<cleared>,protoinfo=(state=<cleared>)
 ])
-NS_CHECK_EXEC([foo1], [nc -z fd11::a 8081])
+NS_CHECK_EXEC([foo1], [$NC -z fd11::a 8081])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -663,7 +663,7 @@ wait_for_ports_up
 check ovn-nbctl --wait=hv sync
 
 # Create service that listens for TCP and UDP
-NETNS_DAEMONIZE([vm2], [nc -l -k 1235], [nc0.pid])
+NETNS_DAEMONIZE([vm2], [$NC -l -k 1235], [nc0.pid])
 
 test_icmp() {
     # Make sure that a ping works as expected
@@ -687,8 +687,8 @@ 
icmp,orig=(src=173.0.1.2,dst=172.16.0.102,id=<cleared>,type=8,code=0),reply=(src
 }
 
 test_udp() {
-    NETNS_DAEMONIZE([vm2], [nc -l -u 1234], [nc1.pid])
-    NS_CHECK_EXEC([vm1], [nc -u 30.0.0.1 1234 -p 1222 -z])
+    NETNS_DAEMONIZE([vm2], [$NC -l -u 1234], [nc1.pid])
+    NS_CHECK_EXEC([vm1], [$NC -u 30.0.0.1 1234 -p 1222 -z])
     kill $(cat nc1.pid)
 
     AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | \
@@ -704,7 +704,7 @@ 
udp,orig=(src=173.0.1.2,dst=172.16.0.102,sport=<cleared>,dport=<cleared>),reply=
 }
 
 test_tcp() {
-    NS_CHECK_EXEC([vm1], [nc 30.0.0.1 1235 -z])
+    NS_CHECK_EXEC([vm1], [$NC 30.0.0.1 1235 -z])
 
     AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.1) | \
     sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], [dnl
@@ -931,12 +931,12 @@ printf %8000s > datafile
 printf %32000s > frag_test_srv.expected
 printf %16000s > frag_test_client.expected
 
-NETNS_DAEMONIZE([lsp], [nc -e "$(command -v cat)" -u -v -l 42.42.42.1 2021 -o 
udp_frag_test_srv.rcvd], [lsp-nc.pid])
+NETNS_DAEMONIZE([lsp], [$NC -e "$(command -v cat)" -u -v -l 42.42.42.1 2021 -o 
udp_frag_test_srv.rcvd], [lsp-nc.pid])
 
 # Send 2 client requests with the same port so that the 2nd one
 # is categorized as ct.est and not ct.new.
-NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | nc -u 88.88.88.88 4040 -p 
20000 -o udp_frag_test_c1.recvd], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | nc -u 88.88.88.88 4040 -p 
20000 -o udp_frag_test_c2.recvd], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | $NC -u 88.88.88.88 4040 -p 
20000 -o udp_frag_test_c1.recvd], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | $NC -u 88.88.88.88 4040 -p 
20000 -o udp_frag_test_c2.recvd], [0], [ignore], [ignore])
 
 check cmp frag_test_srv.expected udp_frag_test_srv.rcvd
 check cmp frag_test_client.expected udp_frag_test_c1.recvd
@@ -993,12 +993,12 @@ printf %8000s > datafile
 printf %32000s > frag_test_srv.expected
 printf %16000s > frag_test_client.expected
 
-NETNS_DAEMONIZE([lsp], [nc -e "$(command -v cat)" -u -v -l 4200::1 2021 -o 
udp_frag_test_srv.rcvd], [lsp-nc.pid])
+NETNS_DAEMONIZE([lsp], [$NC -e "$(command -v cat)" -u -v -l 4200::1 2021 -o 
udp_frag_test_srv.rcvd], [lsp-nc.pid])
 
 # Send 2 client requests with the same port so that the 2nd one
 # is categorized as ct.est and not ct.new.
-NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | nc -6 -u 8800::0088 4040 -p 
20000 -o udp_frag_test_c1.recvd], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | nc -6 -u 8800::0088 4040 -p 
20000 -o udp_frag_test_c2.recvd], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | $NC -6 -u 8800::0088 4040 -p 
20000 -o udp_frag_test_c1.recvd], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [(cat datafile; sleep 3) | $NC -6 -u 8800::0088 4040 -p 
20000 -o udp_frag_test_c2.recvd], [0], [ignore], [ignore])
 
 check cmp frag_test_srv.expected udp_frag_test_srv.rcvd
 check cmp frag_test_client.expected udp_frag_test_c1.recvd
@@ -1536,14 +1536,14 @@ NETNS_START_TCPDUMP([pod], [-vnne "ip or icmp"], [pod])
 echo -e "Hello UDP\nHello UDP" > udp.expected
 echo -e "Hello TCP\nHello TCP" > tcp.expected
 
-NETNS_DAEMONIZE([pod], [nc -e "$(command -v cat)" -v -l -u -o server_udp.log 
192.168.100.5 2323], [nc1.pid])
-NETNS_DAEMONIZE([pod], [nc -e "$(command -v cat)" -v -l -o server_tcp.log 
192.168.100.5 2324], [nc2.pid])
+NETNS_DAEMONIZE([pod], [$NC -e "$(command -v cat)" -v -l -u -o server_udp.log 
192.168.100.5 2323], [nc1.pid])
+NETNS_DAEMONIZE([pod], [$NC -e "$(command -v cat)" -v -l -o server_tcp.log 
192.168.100.5 2324], [nc2.pid])
 
-NS_CHECK_EXEC([mgmt], [(echo "Hello UDP"; sleep 3) | nc -u -s 172.16.100.2 -o 
client_udp.log 172.16.0.5 5656], [0], [ignore], [ignore])
+NS_CHECK_EXEC([mgmt], [(echo "Hello UDP"; sleep 3) | $NC -u -s 172.16.100.2 -o 
client_udp.log 172.16.0.5 5656], [0], [ignore], [ignore])
 check cmp server_udp.log udp.expected
 check cmp client_udp.log udp.expected
 
-NS_CHECK_EXEC([mgmt], [(echo "Hello TCP"; sleep 3) | nc -s 172.16.100.2 -o 
client_tcp.log 172.16.0.5 5657], [0], [ignore], [ignore])
+NS_CHECK_EXEC([mgmt], [(echo "Hello TCP"; sleep 3) | $NC -s 172.16.100.2 -o 
client_tcp.log 172.16.0.5 5657], [0], [ignore], [ignore])
 check cmp server_tcp.log tcp.expected
 check cmp client_tcp.log tcp.expected
 
@@ -1604,7 +1604,7 @@ ADD_NAMESPACES(vm2)
 ADD_VETH(vm2, vm2, br-int, "42.42.42.1/24", "00:00:00:00:00:02", "42.42.42.2")
 
 dnl Start a server on vm1.
-NETNS_DAEMONIZE([vm1], [nc -l -k 41.41.41.1 8080], [vm1.pid])
+NETNS_DAEMONIZE([vm1], [$NC -l -k 41.41.41.1 8080], [vm1.pid])
 
 dnl Wait for ovn-controller to catch up.
 wait_for_ports_up
@@ -1612,7 +1612,7 @@ check ovn-nbctl --wait=hv sync
 
 ovs-appctl revalidator/pause
 on_exit 'ovs-appctl revalidator/resume'
-NS_CHECK_EXEC([vm2], [nc -z 42.42.42.2 8080], 0, [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC -z 42.42.42.2 8080], 0, [ignore], [ignore])
 
 dnl For each DP flow with ct action, make sure a CT entry exists as established
 dnl for the zone the ct action is taken. Otherwise it means HW offload is
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index dd1e77a44..8d20b952a 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -1481,7 +1481,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 echo "foo" > foo
 for i in `seq 1 20`; do
     echo Request $i
-    ip netns exec foo1 nc -p 30000 30.0.0.2 8000 < foo
+    ip netns exec foo1 $NC -p 30000 30.0.0.2 8000 < foo
 done
 
 dnl Only one backend should be chosen.
@@ -1496,7 +1496,7 @@ OVS_WAIT_UNTIL([
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 for i in `seq 1 20`; do
     echo Request $i
-    ip netns exec foo1 nc 30.0.0.2 8000 < foo
+    ip netns exec foo1 $NC 30.0.0.2 8000 < foo
 done
 
 dnl Only one backend should be chosen as eth_src and ip_src is fixed.
@@ -1726,7 +1726,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 echo "foo" > foo
 for i in `seq 1 20`; do
     echo Request $i
-    ip netns exec foo1 nc -6 -p 30000 fd03::2 8000 < foo
+    ip netns exec foo1 $NC -6 -p 30000 fd03::2 8000 < foo
 done
 
 # Only one backend should be chosen. Since the source port is fixed,
@@ -1742,7 +1742,7 @@ OVS_WAIT_UNTIL([
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 for i in `seq 1 20`; do
     echo Request $i
-    ip netns exec foo1 nc -6 fd03::2 8000 < foo
+    ip netns exec foo1 $NC -6 fd03::2 8000 < foo
 done
 
 dnl Only one backend should be chosen as eth_src and ip_src is fixed.
@@ -1956,7 +1956,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 echo "foo" > foo
 for i in $(seq 1 20); do
     echo Request $i
-    NS_EXEC([foo1], [nc -p 30000 30.0.0.1 8080 < foo])
+    NS_EXEC([foo1], [$NC -p 30000 30.0.0.1 8080 < foo])
 done
 
 # Only one backend should be chosen.
@@ -1968,7 +1968,7 @@ 
tcp,orig=(src=192.168.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(s
 
 for i in $(seq 1 20); do
     echo Request $i
-    NS_EXEC([foo1], [nc -6 -p 30000 fd03::2 8090 < foo])
+    NS_EXEC([foo1], [$NC -6 -p 30000 fd03::2 8090 < foo])
 done
 
 # Only one backend should be chosen.
@@ -1993,7 +1993,7 @@ done
 
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 for p in $(seq 3 20); do
-    NS_EXEC([foo1], [nc -s 192.168.1.$p 30.0.0.1 8080 < foo])
+    NS_EXEC([foo1], [$NC -s 192.168.1.$p 30.0.0.1 8080 < foo])
 done
 
 bar1_ct=$(ovs-appctl dpctl/dump-conntrack | grep 172.16.1.2 -c)
@@ -2006,7 +2006,7 @@ AT_CHECK([test $bar3_ct -gt 0])
 
 for p in $(seq 3 20); do
     h=$(printf '%02x' $p)
-    NS_EXEC([foo1], [nc -6 -s fd01::$h fd03::2 8090 < foo])
+    NS_EXEC([foo1], [$NC -6 -s fd01::$h fd03::2 8090 < foo])
 done
 
 bar1_ct=$(ovs-appctl dpctl/dump-conntrack | grep fd02::2 -c)
@@ -4574,7 +4574,7 @@ udp2_pid=$(cat udp2.pid)
 
 wait_row_count Service_Monitor 2 status=online
 
-NETNS_DAEMONIZE(sw-ext-p1, [nc -4 -u 172.16.0.42 53 -d 0.1 -c 'for i in $(seq 
1 5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_1; done'], 
[udp1_client.pid])
+NETNS_DAEMONIZE(sw-ext-p1, [$NC -4 -u 172.16.0.42 53 -d 0.1 -c 'for i in $(seq 
1 5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_1; done'], 
[udp1_client.pid])
 
 OVS_WAIT_FOR_OUTPUT([cat ./udp_data_1],  [0], [dnl
 udp_data 1
@@ -4595,7 +4595,7 @@ NS_CHECK_EXEC([sw0-p1], [pkill -P $udp1_pid; kill 
$udp1_pid])
 wait_row_count Service_Monitor 1 logical_port=sw0-p1 status=offline
 wait_row_count Service_Monitor 1 logical_port=sw0-p2 status=online
 
-NETNS_DAEMONIZE(sw-ext-p1, [nc -4 -u 172.16.0.42 53 -d 0.1 -c 'for i in $(seq 
1 5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_2; done'], 
[udp2_client.pid])
+NETNS_DAEMONIZE(sw-ext-p1, [$NC -4 -u 172.16.0.42 53 -d 0.1 -c 'for i in $(seq 
1 5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_2; done'], 
[udp2_client.pid])
 
 OVS_WAIT_FOR_OUTPUT([cat ./udp_data_2],  [0], [dnl
 udp_data 1
@@ -4769,7 +4769,7 @@ udp2_pid=$(cat udp2.pid)
 
 wait_row_count Service_Monitor 2 status=online
 
-NETNS_DAEMONIZE(sw-ext-p1, [nc -6 -u fd20::42 53 -d 0.1 -c 'for i in $(seq 1 
5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_1; done'], 
[udp1_client.pid])
+NETNS_DAEMONIZE(sw-ext-p1, [$NC -6 -u fd20::42 53 -d 0.1 -c 'for i in $(seq 1 
5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_1; done'], 
[udp1_client.pid])
 
 OVS_WAIT_FOR_OUTPUT([cat ./udp_data_1],  [0], [dnl
 udp_data 1
@@ -4790,7 +4790,7 @@ NS_CHECK_EXEC([sw0-p1], [pkill -P $udp1_pid; kill 
$udp1_pid])
 wait_row_count Service_Monitor 1 logical_port=sw0-p1 status=offline
 wait_row_count Service_Monitor 1 logical_port=sw0-p2 status=online
 
-NETNS_DAEMONIZE(sw-ext-p1, [nc -6 -u fd20::42 53 -d 0.1 -c 'for i in $(seq 1 
5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_2; done'], 
[udp2_client.pid])
+NETNS_DAEMONIZE(sw-ext-p1, [$NC -6 -u fd20::42 53 -d 0.1 -c 'for i in $(seq 1 
5); do echo "udp_data $i"; read msg; echo "$msg" >>./udp_data_2; done'], 
[udp2_client.pid])
 
 OVS_WAIT_FOR_OUTPUT([cat ./udp_data_2],  [0], [dnl
 udp_data 1
@@ -5255,21 +5255,21 @@ ADD_VETH(lsp, lsp, br-int, "42.42.42.1/24", 
"00:00:00:00:00:01", \
 check ovn-nbctl --wait=hv -t 3 sync
 
 # Start IPv4 TCP server on lsp.
-NETNS_DAEMONIZE([lsp], [nc -l -k 42.42.42.1 4041], [lsp0.pid])
+NETNS_DAEMONIZE([lsp], [$NC -l -k 42.42.42.1 4041], [lsp0.pid])
 
 # Check that IPv4 TCP hairpin connection succeeds on both VIPs.
-NS_CHECK_EXEC([lsp], [nc 88.88.88.88 8080 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [nc 88.88.88.89 8080 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [nc 88.88.88.90 4041 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 88.88.88.88 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 88.88.88.89 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 88.88.88.90 4041 -z], [0], [ignore], [ignore])
 
 # Capture IPv4 UDP hairpinned packets.
 filter="dst 42.42.42.1 and dst port 2021 and udp"
 NETNS_START_TCPDUMP([lsp], [-nn -c 3 -i lsp ${filter}], [lsp])
 
 # Generate IPv4 UDP hairpin traffic.
-NS_CHECK_EXEC([lsp], [echo a | nc -u 88.88.88.88 4040], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([lsp], [echo a | nc -u 88.88.88.89 4040], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([lsp], [echo a | nc -u 88.88.88.90 2021], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp], [echo a | $NC -u 88.88.88.88 4040], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp], [echo a | $NC -u 88.88.88.89 4040], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp], [echo a | $NC -u 88.88.88.90 2021], [ignore], [ignore], 
[ignore])
 
 # Check hairpin traffic.
 OVS_WAIT_UNTIL([
@@ -5284,8 +5284,8 @@ check ovn-nbctl --apply-after-lb acl-add pg0 from-lport 
1002 "ip4 && udp" allow
 check ovn-nbctl --wait=hv sync
 
 ## Check that IPv4 TCP hairpin connection succeeds on both VIPs.
-NS_CHECK_EXEC([lsp], [nc 88.88.88.88 8080 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [nc 88.88.88.89 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 88.88.88.88 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 88.88.88.89 8080 -z], [0], [ignore], [ignore])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -5402,19 +5402,19 @@ zone_lsp2_id=$(ovn-appctl -t ovn-controller 
ct-zone-list | grep lsp2 | cut -d '
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 # Start IPv4 TCP and UDP server on lsp1.
-NETNS_DAEMONIZE([lsp1], [nc -l -k 192.168.0.101 4041], [lsp1_tcp.pid])
-NETNS_DAEMONIZE([lsp1], [nc -u -l 192.168.0.101 4042], [lsp1_udp.pid])
+NETNS_DAEMONIZE([lsp1], [$NC -l -k 192.168.0.101 4041], [lsp1_tcp.pid])
+NETNS_DAEMONIZE([lsp1], [$NC -u -l 192.168.0.101 4042], [lsp1_udp.pid])
 
 # Create another server without load balancer to check that it
 # does not create conntrack records.
-NETNS_DAEMONIZE([lsp1], [nc -l -k 192.168.0.101 4043], [lsp1_non_lb.pid])
+NETNS_DAEMONIZE([lsp1], [$NC -l -k 192.168.0.101 4043], [lsp1_non_lb.pid])
 
 # Send the packet to VIP from private network.
 NETNS_START_TCPDUMP([lsp1], [-nnnei lsp1], [lsp1])
-NS_CHECK_EXEC([lsp1], [nc -z 192.168.0.1 8080], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp1], [$NC -z 192.168.0.1 8080], [0], [ignore], [ignore])
 
 # Udp connections
-NS_CHECK_EXEC([lsp1], [echo a | nc -u 192.168.0.1 8081], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp1], [echo a | $NC -u 192.168.0.1 8081], [ignore], [ignore], 
[ignore])
 
 # Check conntrack zone of lsp1 has tcp entry for lb
 AT_CHECK([ovs-appctl dpctl/dump-conntrack zone=$zone_lsp1_id | \
@@ -5427,7 +5427,7 @@ 
udp,orig=(src=192.168.0.101,dst=192.168.0.1,sport=<cleared>,dport=<cleared>),rep
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 # Do the same sending a packet.
-NS_CHECK_EXEC([lsp1], [echo a | nc 192.168.0.1 8080], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp1], [echo a | $NC 192.168.0.1 8080], [0], [ignore], [ignore])
 
 # Check conntrack zone of lsp1 has tcp entry for lb
 AT_CHECK([ovs-appctl dpctl/dump-conntrack zone=$zone_lsp1_id | \
@@ -5438,7 +5438,7 @@ 
tcp,orig=(src=192.168.0.101,dst=192.168.0.1,sport=<cleared>,dport=<cleared>),rep
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 # Check that internal traffic not related to lb doesn't create conntrack 
records
-NS_CHECK_EXEC([external], [nc -z 192.168.0.101 4043], [0], [])
+NS_CHECK_EXEC([external], [$NC -z 192.168.0.101 4043], [0], [])
 
 AT_CHECK([ovs-appctl dpctl/dump-conntrack zone=$zone_lsp1_id | 
FORMAT_CT(192.168.0.101) | sed -e 's/zone=[[0-9]]*/zone=<cleared>/'], [0], 
[dnl])
 
@@ -5497,21 +5497,21 @@ ADD_VETH(lsp, lsp, br-int, "4200::1/64", 
"00:00:00:00:00:01", "4200::00ff", "nod
 check ovn-nbctl --wait=hv -t 3 sync
 
 # Start IPv6 TCP server on lsp.
-NETNS_DAEMONIZE([lsp], [nc -l -k 4200::1 4041], [lsp0.pid])
+NETNS_DAEMONIZE([lsp], [$NC -l -k 4200::1 4041], [lsp0.pid])
 
 # Check that IPv6 TCP hairpin connection succeeds on both VIPs.
-NS_CHECK_EXEC([lsp], [nc 8800::0088 8080 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [nc 8800::0089 8080 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [nc 8800::0090 4041 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 8800::0088 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 8800::0089 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 8800::0090 4041 -z], [0], [ignore], [ignore])
 
 # Capture IPv6 UDP hairpinned packets.
 filter="dst 4200::1 and dst port 2021 and udp"
 NETNS_START_TCPDUMP([lsp], [-nn -c 3 -i lsp $filter], [lsp])
 
 # Generate IPv6 UDP hairpin traffic.
-NS_CHECK_EXEC([lsp], [echo a | nc -u 8800::0088 4040], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([lsp], [echo a | nc -u 8800::0089 4040], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([lsp], [echo a | nc -u 8800::0090 2021], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp], [echo a | $NC -u 8800::0088 4040], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp], [echo a | $NC -u 8800::0089 4040], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([lsp], [echo a | $NC -u 8800::0090 2021], [ignore], [ignore], 
[ignore])
 
 # Check hairpin traffic.
 OVS_WAIT_UNTIL([
@@ -5526,8 +5526,8 @@ check ovn-nbctl --apply-after-lb acl-add pg0 from-lport 
1000 "ip6" drop
 check ovn-nbctl --wait=hv sync
 
 # Check that IPv6 TCP hairpin connection succeeds on both VIPs.
-NS_CHECK_EXEC([lsp], [nc 8800::0088 8080 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([lsp], [nc 8800::0089 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 8800::0088 8080 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([lsp], [$NC 8800::0089 8080 -z], [0], [ignore], [ignore])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -5619,12 +5619,12 @@ ADD_VETH(sw1-p1-rej, sw1-p1-rej, br-int, "20.0.0.3/24", 
"40:54:00:00:00:03", \
 NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej tcp], [sw0-p1-rej-ip4])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p1-rej $NC -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 # Now send traffic to port 84
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p1-rej $NC -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
 ])
 
 OVS_WAIT_UNTIL([
@@ -5642,7 +5642,7 @@ OVS_WAIT_UNTIL([
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej tcp port 80], 
[sw0-p2-rej-ip6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p2-rej $NC -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 
@@ -5656,7 +5656,7 @@ check ovn-nbctl acl-add sw1 to-lport 1004 "ip" 
allow-related
 check ovn-nbctl --log acl-add pg0 to-lport 1004 "outport == @pg0 && ip && tcp 
&& tcp.dst == 84" reject
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw1-p1-rej nc -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw1-p1-rej $NC -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
 ])
 
 
@@ -5666,7 +5666,7 @@ NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej 
icmp], [sw0-p1-rej-icmp])
 
 printf '.%.0s' {1..100} > foo
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -u 10.0.0.4 90 < foo
+    ip netns exec sw0-p1-rej $NC -u 10.0.0.4 90 < foo
     c=$(cat sw0-p1-rej-icmp.tcpdump | grep \
 "10.0.0.4 > 10.0.0.3: ICMP 10.0.0.4 udp port 90 unreachable" | uniq | wc -l)
     test $c -ge 1
@@ -5679,7 +5679,7 @@ NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej udp 
port 94], [sw0-p1-rej-u
 NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej icmp], [sw0-p1-rej-icmp])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -u 10.0.0.4 94 < foo
+    ip netns exec sw0-p1-rej $NC -u 10.0.0.4 94 < foo
     c=$(cat sw0-p1-rej-icmp.tcpdump | grep \
 "10.0.0.4 > 10.0.0.3: ICMP 10.0.0.4 udp port 94 unreachable" | uniq | wc -l)
     test $c -ge 1
@@ -5690,7 +5690,7 @@ NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej udp 
port 90], [sw0-p2-rej-i
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej icmp6], 
[sw0-p2-rej-icmp6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -u -6 aef0::3 90 < foo
+    ip netns exec sw0-p2-rej $NC -u -6 aef0::3 90 < foo
     c=$(cat sw0-p2-rej-icmp6.tcpdump | grep \
 "IP6 aef0::3 > aef0::4: ICMP6, destination unreachable, unreachable port, \
 aef0::3 udp port 90" | uniq | wc -l)
@@ -5704,7 +5704,7 @@ NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej udp 
port 94], [sw0-p2-rej-i
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej icmp6], 
[sw0-p2-rej-icmp6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -u -6 aef0::3 94 < foo
+    ip netns exec sw0-p2-rej $NC -u -6 aef0::3 94 < foo
     c=$(cat sw0-p2-rej-icmp6.tcpdump | grep \
 "IP6 aef0::3 > aef0::4: ICMP6, destination unreachable, unreachable port, \
 aef0::3 udp port 94" | uniq | wc -l)
@@ -5717,11 +5717,11 @@ check ovn-nbctl pg-add pg0 sw0-p1-rej sw0-p2-rej
 check ovn-nbctl --log acl-add pg0 from-lport 1004 "inport == @pg0 && ip && 
(tcp || udp)" reject
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p1-rej $NC -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p2-rej $NC -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 rm -f *.tcpdump
@@ -5730,7 +5730,7 @@ NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej 
icmp], [sw0-p1-rej-icmp])
 
 printf '.%.0s' {1..100} > foo
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -u 10.0.0.4 90 < foo
+    ip netns exec sw0-p1-rej $NC -u 10.0.0.4 90 < foo
     c=$(cat sw0-p1-rej-icmp.tcpdump | grep \
 "10.0.0.4 > 10.0.0.3: ICMP 10.0.0.4 udp port 90 unreachable" | uniq | wc -l)
     test $c -ge 1
@@ -5742,7 +5742,7 @@ rm -f *.tcpdump
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej icmp6], 
[sw0-p2-rej-icmp6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -u -6 aef0::3 90 < foo
+    ip netns exec sw0-p2-rej $NC -u -6 aef0::3 90 < foo
     c=$(cat sw0-p2-rej-icmp6.tcpdump | grep \
 "IP6 aef0::3 > aef0::4: ICMP6, destination unreachable, unreachable port, \
 aef0::3 udp port 90" | uniq | wc -l)
@@ -5840,12 +5840,12 @@ ADD_VETH(sw1-p1-rej, sw1-p1-rej, br-int, "20.0.0.3/24", 
"40:54:00:00:00:03", \
 NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej tcp], [sw0-p1-rej-ip4])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p1-rej $NC -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 # Now send traffic to port 84
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p1-rej $NC -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
 ])
 
 OVS_WAIT_UNTIL([
@@ -5863,7 +5863,7 @@ OVS_WAIT_UNTIL([
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej tcp port 80], 
[sw0-p2-rej-ip6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p2-rej $NC -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 
@@ -5880,7 +5880,7 @@ check ovn-nbctl acl-add sw1 to-lport 1004 "ip" 
allow-related
 check ovn-nbctl --log acl-add pg0 to-lport 1004 "outport == @pg0 && ip && tcp 
&& tcp.dst == 84" reject
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw1-p1-rej nc -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw1-p1-rej $NC -vz 10.0.0.4 84 2>&1 | grep -i 'connection 
refused'
 ])
 
 # Now test for IPv4 UDP.
@@ -5889,7 +5889,7 @@ NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej 
icmp], [sw0-p1-rej-icmp])
 
 printf '.%.0s' {1..100} > foo
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -u 10.0.0.4 90 < foo
+    ip netns exec sw0-p1-rej $NC -u 10.0.0.4 90 < foo
     c=$(cat sw0-p1-rej-icmp.tcpdump | grep \
 "10.0.0.4 > 10.0.0.3: ICMP 10.0.0.4 udp port 90 unreachable" | uniq | wc -l)
     test $c -ge 1
@@ -5902,7 +5902,7 @@ NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej udp 
port 94], [sw0-p1-rej-u
 NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej icmp], [sw0-p1-rej-icmp])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -u 10.0.0.4 94 < foo
+    ip netns exec sw0-p1-rej $NC -u 10.0.0.4 94 < foo
     c=$(cat sw0-p1-rej-icmp.tcpdump | grep \
 "10.0.0.4 > 10.0.0.3: ICMP 10.0.0.4 udp port 94 unreachable" | uniq | wc -l)
     test $c -ge 1
@@ -5913,7 +5913,7 @@ NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej udp 
port 90], [sw0-p2-rej-i
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej icmp6], 
[sw0-p2-rej-icmp6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -u -6 aef0::3 90 < foo
+    ip netns exec sw0-p2-rej $NC -u -6 aef0::3 90 < foo
     c=$(cat sw0-p2-rej-icmp6.tcpdump | grep \
 "IP6 aef0::3 > aef0::4: ICMP6, destination unreachable, unreachable port, \
 aef0::3 udp port 90" | uniq | wc -l)
@@ -5927,7 +5927,7 @@ NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej udp 
port 94], [sw0-p2-rej-i
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej icmp6], 
[sw0-p2-rej-icmp6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -u -6 aef0::3 94 < foo
+    ip netns exec sw0-p2-rej $NC -u -6 aef0::3 94 < foo
     c=$(cat sw0-p2-rej-icmp6.tcpdump | grep \
 "IP6 aef0::3 > aef0::4: ICMP6, destination unreachable, unreachable port, \
 aef0::3 udp port 94" | uniq | wc -l)
@@ -5940,11 +5940,11 @@ check ovn-nbctl pg-add pg0 sw0-p1-rej sw0-p2-rej
 check ovn-nbctl --log --apply-after-lb acl-add pg0 from-lport 1004 "inport == 
@pg0 && ip && (tcp || udp)" reject
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p1-rej $NC -vz 10.0.0.4 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
+    ip netns exec sw0-p2-rej $NC -vz6 aef0::3 80 2>&1 | grep -i 'connection 
refused'
 ])
 
 kill $(pidof tcpdump)
@@ -5954,7 +5954,7 @@ NETNS_START_TCPDUMP([sw0-p1-rej], [-nn -i sw0-p1-rej 
icmp], [sw0-p1-rej-icmp])
 
 printf '.%.0s' {1..100} > foo
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p1-rej nc -u 10.0.0.4 90 < foo
+    ip netns exec sw0-p1-rej $NC -u 10.0.0.4 90 < foo
     c=$(cat sw0-p1-rej-icmp.tcpdump | grep \
 "10.0.0.4 > 10.0.0.3: ICMP 10.0.0.4 udp port 90 unreachable" | uniq | wc -l)
     test $c -ge 1
@@ -5966,7 +5966,7 @@ rm -f *.tcpdump
 NETNS_START_TCPDUMP([sw0-p2-rej], [-nn -i sw0-p2-rej icmp6], 
[sw0-p2-rej-icmp6])
 
 OVS_WAIT_UNTIL([
-    ip netns exec sw0-p2-rej nc -u -6 aef0::3 90 < foo
+    ip netns exec sw0-p2-rej $NC -u -6 aef0::3 90 < foo
     c=$(cat sw0-p2-rej-icmp6.tcpdump | grep \
 "IP6 aef0::3 > aef0::4: ICMP6, destination unreachable, unreachable port, \
 aef0::3 udp port 90" | uniq | wc -l)
@@ -6179,21 +6179,21 @@ NS_CHECK_EXEC([sw0-p2-lbc], [ip route delete default 
via 10.0.0.1 dev sw0-p2-lbc
 NS_CHECK_EXEC([sw0-p2-lbc], [ip route add default via 20.0.0.1 dev sw1p2], [0])
 
 # Start nc server on sw1p2 (sw0-p2-lbc is the parent)
-NETNS_DAEMONIZE([sw0-p2-lbc], [nc -l -k 20.0.0.4 80], [nc0.pid])
+NETNS_DAEMONIZE([sw0-p2-lbc], [$NC -l -k 20.0.0.4 80], [nc0.pid])
 
 # Send the packet to backend
-NS_CHECK_EXEC([sw0-p1-lbc], [nc -z 20.0.0.4 80], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw0-p1-lbc], [$NC -z 20.0.0.4 80], [0], [ignore], [ignore])
 
 # Send the packet to VIP.
-NS_CHECK_EXEC([sw0-p1-lbc], [nc -z 30.0.0.10 80], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw0-p1-lbc], [$NC -z 30.0.0.10 80], [0], [ignore], [ignore])
 
 # Now add an ACL in sw1.
 check ovn-nbctl --wait=hv acl-add sw1 to-lport 2002 "ip" allow-related
 # Send the packet to backend
-NS_CHECK_EXEC([sw0-p1-lbc], [nc -z 20.0.0.4 80], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw0-p1-lbc], [$NC -z 20.0.0.4 80], [0], [ignore], [ignore])
 
 # Send the packet to VIP.
-NS_CHECK_EXEC([sw0-p1-lbc], [nc -z 30.0.0.10 80], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw0-p1-lbc], [$NC -z 30.0.0.10 80], [0], [ignore], [ignore])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -6254,13 +6254,13 @@ wait_for_ports_up
 check ovn-nbctl --wait=hv sync
 
 # Start IPv4 TCP server on vm1.
-NETNS_DAEMONIZE([vm1], [nc -k -l 42.42.42.2 4242], [nc-vm1.pid])
+NETNS_DAEMONIZE([vm1], [$NC -k -l 42.42.42.2 4242], [nc-vm1.pid])
 
 # Make sure connecting to the VIP works.
-NS_CHECK_EXEC([vm2], [nc 66.66.66.66 666 -p 2000 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 66.66.66.66 666 -p 2000 -z], [0], [ignore], [ignore])
 
 # Start IPv4 TCP connection to VIP from vm2.
-NS_CHECK_EXEC([vm2], [nc 66.66.66.66 666 -p 2001 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 66.66.66.66 666 -p 2001 -z], [0], [ignore], [ignore])
 
 # Check conntrack.  We expect two entries:
 # - one in vm1's zone (firewall)
@@ -6278,7 +6278,7 @@ 
tcp,orig=(src=42.42.42.3,dst=66.66.66.66,sport=<clnt_s_port>,dport=666),reply=(s
 
 # Start IPv4 TCP connection to backend IP from vm2 which would require
 # additional source port translation to avoid a tuple conflict.
-NS_CHECK_EXEC([vm2], [nc 42.42.42.2 4242 -p 2001 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 42.42.42.2 4242 -p 2001 -z], [0], [ignore], [ignore])
 
 # Check conntrack.  We expect three entries:
 # - one in vm1's zone (firewall) - reused from the previous connection.
@@ -6354,13 +6354,13 @@ wait_for_ports_up
 check ovn-nbctl --wait=hv sync
 
 # Start IPv6 TCP server on vm1.
-NETNS_DAEMONIZE([vm1], [nc -k -l 4242::2 4242], [nc-vm1.pid])
+NETNS_DAEMONIZE([vm1], [$NC -k -l 4242::2 4242], [nc-vm1.pid])
 
 # Make sure connecting to the VIP works.
-NS_CHECK_EXEC([vm2], [nc 6666::1 666 -p 2000 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 6666::1 666 -p 2000 -z], [0], [ignore], [ignore])
 
 # Start IPv6 TCP connection to VIP from vm2.
-NS_CHECK_EXEC([vm2], [nc 6666::1 666 -p 2001 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 6666::1 666 -p 2001 -z], [0], [ignore], [ignore])
 
 # Check conntrack.  We expect two entries:
 # - one in vm1's zone (firewall)
@@ -6378,7 +6378,7 @@ 
tcp,orig=(src=4242::3,dst=6666::1,sport=<clnt_s_port>,dport=666),reply=(src=4242
 
 # Start IPv6 TCP connection to backend IP from vm2 which would require
 # additional source port translation to avoid a tuple conflict.
-NS_CHECK_EXEC([vm2], [nc 4242::2 4242 -p 2001 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 4242::2 4242 -p 2001 -z], [0], [ignore], [ignore])
 
 # Check conntrack.  We expect three entries:
 # - one in vm1's zone (firewall) - reused from the previous connection.
@@ -6594,8 +6594,8 @@ check ovn-nbctl --wait=hv sync
 
 on_exit 'ovs-ofctl dump-flows br-int'
 
-NETNS_DAEMONIZE([alice1], [nc -l -k 80], [alice1.pid])
-NS_CHECK_EXEC([bob1], [nc -z 10.0.0.2 80], [0])
+NETNS_DAEMONIZE([alice1], [$NC -l -k 80], [alice1.pid])
+NS_CHECK_EXEC([bob1], [$NC -z 10.0.0.2 80], [0])
 NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2 10.0.0.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6631,7 +6631,7 @@ check ovn-nbctl set Logical_Switch_Port r2-ext \
 # Wait for ovn-controller before sending traffic
 check ovn-nbctl --wait=hv sync
 
-NS_CHECK_EXEC([bob1], [nc -z 10.0.0.2 80], [0])
+NS_CHECK_EXEC([bob1], [$NC -z 10.0.0.2 80], [0])
 NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2 10.0.0.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6662,8 +6662,8 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 NS_CHECK_EXEC([bob1], [ip r d default via 172.16.0.2 dev bob1], [0])
 NS_CHECK_EXEC([bob1], [ip r a default via 172.16.0.3 dev bob1], [0])
 
-NETNS_DAEMONIZE([bob1], [nc -l -k 8080], [bob1.pid])
-NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | nc 
172.16.0.1 8080], [0])
+NETNS_DAEMONIZE([bob1], [$NC -l -k 8080], [bob1.pid])
+NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | $NC 
172.16.0.1 8080], [0])
 NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2 172.16.0.1 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6680,8 +6680,8 @@ 
tcp,orig=(src=10.0.0.2,dst=172.16.0.1,sport=<cleared>,dport=<cleared>),reply=(sr
 check ovn-nbctl --policy="src-ip" lr-route-del R1 10.0.0.0/24 20.0.0.3
 check ovn-nbctl --wait=hv sync
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
-NETNS_DAEMONIZE([bob1], [nc -l -k 8081], [bob2.pid])
-NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | nc 
172.16.0.1 8081], [0])
+NETNS_DAEMONIZE([bob1], [$NC -l -k 8081], [bob2.pid])
+NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | $NC 
172.16.0.1 8081], [0])
 NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2 172.16.0.1 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6823,8 +6823,8 @@ check ovn-nbctl --wait=hv sync
 
 on_exit 'ovs-ofctl dump-flows br-int'
 
-NETNS_DAEMONIZE([alice1], [nc -6 -l -k 80], [alice1.pid])
-NS_CHECK_EXEC([bob1], [nc -6 -z fd01::2 80], [0])
+NETNS_DAEMONIZE([alice1], [$NC -6 -l -k 80], [alice1.pid])
+NS_CHECK_EXEC([bob1], [$NC -6 -z fd01::2 80], [0])
 NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2 fd01::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6859,7 +6859,7 @@ check ovn-nbctl set Logical_Router_Port R2_ext 
mac='"00:00:10:01:02:04"'
 check ovn-nbctl --wait=hv set Logical_Switch_Port r2-ext \
      type=router options:router-port=R2_ext addresses='"00:00:10:01:02:04"'
 
-NS_CHECK_EXEC([bob1], [nc -6 -z fd01::2 80], [0])
+NS_CHECK_EXEC([bob1], [$NC -6 -z fd01::2 80], [0])
 NS_CHECK_EXEC([bob1], [ping -q -c 3 -i 0.3 -w 2 fd01::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6889,8 +6889,8 @@ test $(ovs-ofctl dump-flows br-int | grep -c 
'table=OFTABLE_ECMP_NH, n_packets')
 
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
-NETNS_DAEMONIZE([bob1], [nc -6 -l -k 8080], [bob1.pid])
-NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | nc -6 
fd07::1 8080], [0])
+NETNS_DAEMONIZE([bob1], [$NC -6 -l -k 8080], [bob1.pid])
+NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | $NC -6 
fd07::1 8080], [0])
 NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2 fd07::1 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -6907,8 +6907,8 @@ 
tcp,orig=(src=fd01::2,dst=fd07::1,sport=<cleared>,dport=<cleared>),reply=(src=fd
 check ovn-nbctl --policy="src-ip" lr-route-del R1 fd01::/126 fd02::3
 check ovn-nbctl --wait=hv sync
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
-NETNS_DAEMONIZE([bob1], [nc -6 -l -k 8081], [bob2.pid])
-NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | nc -6 
fd07::1 8081], [0])
+NETNS_DAEMONIZE([bob1], [$NC -6 -l -k 8081], [bob2.pid])
+NS_CHECK_EXEC([alice1], [(echo "Packet 1"; sleep 1; echo "Packet 2") | $NC -6 
fd07::1 8081], [0])
 NS_CHECK_EXEC([alice1], [ping -q -c 3 -i 0.3 -w 2 fd07::1 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
@@ -8985,7 +8985,7 @@ ADD_VETH(sw11, sw11, br-int, "192.168.2.2/24", 
"f0:00:00:02:02:03", \
 check ovn-nbctl lsp-add sw1 sw11 \
     -- lsp-set-addresses sw11 "f0:00:00:02:02:03 192.168.2.2"
 
-NETNS_DAEMONIZE([sw01], [nc -k -l 8000], [nc-sw01.pid])
+NETNS_DAEMONIZE([sw01], [$NC -k -l 8000], [nc-sw01.pid])
 
 test_ping() {
     NS_CHECK_EXEC([$1],  [ping -q -c 1 $2 -w 2 | FORMAT_PING], \
@@ -8998,7 +8998,7 @@ test_ping() {
 check ovn-nbctl --wait=hv lr-nat-add R1 snat 172.16.1.21 192.168.2.0/24
 
 echo "foo" > foo
-NS_CHECK_EXEC([sw11], [nc 192.168.1.2 8000 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw11], [$NC 192.168.1.2 8000 -z], [0], [ignore], [ignore])
 test_ping sw11 192.168.1.2
 
 # Ensure nat has been hit
@@ -9015,7 +9015,7 @@ AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 # SNAT and DNAT. using Logical IP
 check ovn-nbctl --wait=hv lr-nat-add R1 dnat_and_snat 172.16.1.2 192.168.1.2
-NS_CHECK_EXEC([sw11], [nc 192.168.1.2 8000 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw11], [$NC 192.168.1.2 8000 -z], [0], [ignore], [ignore])
 test_ping sw11 192.168.1.2
 
 # Ensure conntrack entry is present
@@ -9029,7 +9029,7 @@ 
tcp,orig=(src=192.168.2.2,dst=192.168.1.2,sport=<cleared>,dport=<cleared>),reply
 AT_CHECK([ovs-appctl dpctl/flush-conntrack])
 
 # SNAT and DNAT. using floating IP
-NS_CHECK_EXEC([sw11], [nc 172.16.1.2 8000 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([sw11], [$NC 172.16.1.2 8000 -z], [0], [ignore], [ignore])
 test_ping sw11 172.16.1.2
 
 # Ensure conntrack entry is present
@@ -9435,8 +9435,8 @@ test_related_traffic() {
     NETNS_START_TCPDUMP([server], [-U -i server -w server.pcap], [tcpdump1])
 
     # Setup a dummy UDP listeners so we don't get "port unreachable".
-    NETNS_DAEMONIZE([client], [nc -l -u 1], [nc0.pid])
-    NETNS_DAEMONIZE([server], [nc -l -u 2], [nc1.pid])
+    NETNS_DAEMONIZE([client], [$NC -l -u 1], [nc0.pid])
+    NETNS_DAEMONIZE([server], [$NC -l -u 2], [nc1.pid])
 
     # Send UDP client -> server
     check ovs-ofctl packet-out br-int 
"in_port=ovs-client,packet=$client_udp,actions=resubmit(,0)"
@@ -9647,28 +9647,28 @@ name: 'vport4' value: '999'
 ])
 
 # Start IPv4 TCP server on vm1.
-NETNS_DAEMONIZE([vm1], [nc -k -l 42.42.42.2 4242], [nc-vm1.pid])
+NETNS_DAEMONIZE([vm1], [$NC -k -l 42.42.42.2 4242], [nc-vm1.pid])
 
 NETNS_START_TCPDUMP([vm1],
     [-n -i vm1 -nnqleX -c6 udp and dst 42.42.42.2 and dst port 4343],
     [vm1])
 
 # Make sure connecting to the VIP works (hairpin, via ls and via lr).
-NS_CHECK_EXEC([vm1], [nc 66.66.66.66 666 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm2], [nc 66.66.66.66 666 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm3], [nc 66.66.66.66 666 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm1], [$NC 66.66.66.66 666 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 66.66.66.66 666 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm3], [$NC 66.66.66.66 666 -z], [0], [ignore], [ignore])
 
-NS_CHECK_EXEC([vm1], [echo a | nc -u 66.66.66.66 777], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm2], [echo a | nc -u 66.66.66.66 777], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm3], [echo a | nc -u 66.66.66.66 777], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm1], [echo a | $NC -u 66.66.66.66 777], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm2], [echo a | $NC -u 66.66.66.66 777], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm3], [echo a | $NC -u 66.66.66.66 777], [ignore], [ignore], 
[ignore])
 
-NS_CHECK_EXEC([vm1], [nc 66.66.66.66 888 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm2], [nc 66.66.66.66 888 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm3], [nc 66.66.66.66 888 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm1], [$NC 66.66.66.66 888 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 66.66.66.66 888 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm3], [$NC 66.66.66.66 888 -z], [0], [ignore], [ignore])
 
-NS_CHECK_EXEC([vm1], [echo a | nc -u 66.66.66.66 999], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm2], [echo a | nc -u 66.66.66.66 999], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm3], [echo a | nc -u 66.66.66.66 999], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm1], [echo a | $NC -u 66.66.66.66 999], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm2], [echo a | $NC -u 66.66.66.66 999], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm3], [echo a | $NC -u 66.66.66.66 999], [ignore], [ignore], 
[ignore])
 
 OVS_WAIT_UNTIL([
     requests=`grep "UDP" -c vm1.tcpdump`
@@ -9785,28 +9785,28 @@ name: 'vport4' value: '999'
 ])
 
 # Start IPv6 TCP server on vm1.
-NETNS_DAEMONIZE([vm1], [nc -k -l 4242::2 4242], [nc-vm1.pid])
+NETNS_DAEMONIZE([vm1], [$NC -k -l 4242::2 4242], [nc-vm1.pid])
 
 NETNS_START_TCPDUMP([vm1],
     [-n -i vm1 -nnqleX -c6 udp and dst 4242::2 and dst port 4343],
     [vm1])
 
 # Make sure connecting to the VIP works (hairpin, via ls and via lr).
-NS_CHECK_EXEC([vm1], [nc 6666::1 666 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm2], [nc 6666::1 666 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm3], [nc 6666::1 666 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm1], [$NC 6666::1 666 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 6666::1 666 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm3], [$NC 6666::1 666 -z], [0], [ignore], [ignore])
 
-NS_CHECK_EXEC([vm1], [echo a | nc -u 6666::1 777], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm2], [echo a | nc -u 6666::1 777], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm3], [echo a | nc -u 6666::1 777], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm1], [echo a | $NC -u 6666::1 777], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm2], [echo a | $NC -u 6666::1 777], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm3], [echo a | $NC -u 6666::1 777], [ignore], [ignore], 
[ignore])
 
-NS_CHECK_EXEC([vm1], [nc 6666::1 888 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm2], [nc 6666::1 888 -z], [0], [ignore], [ignore])
-NS_CHECK_EXEC([vm3], [nc 6666::1 888 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm1], [$NC 6666::1 888 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm2], [$NC 6666::1 888 -z], [0], [ignore], [ignore])
+NS_CHECK_EXEC([vm3], [$NC 6666::1 888 -z], [0], [ignore], [ignore])
 
-NS_CHECK_EXEC([vm1], [echo a | nc -u 6666::1 999], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm2], [echo a | nc -u 6666::1 999], [ignore], [ignore], 
[ignore])
-NS_CHECK_EXEC([vm3], [echo a | nc -u 6666::1 999], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm1], [echo a | $NC -u 6666::1 999], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm2], [echo a | $NC -u 6666::1 999], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([vm3], [echo a | $NC -u 6666::1 999], [ignore], [ignore], 
[ignore])
 
 OVS_WAIT_UNTIL([
     requests=`grep "UDP" -c vm1.tcpdump`
@@ -12199,7 +12199,7 @@ on_exit "ovs-ofctl -O OpenFlow13 dump-flows br-int"
 dnl Should work with the virtual IP address through NAT
 for i in `seq 1 20`; do
     echo Request $i
-    NS_CHECK_EXEC([alice1], [nc --sctp --recv-only 30.0.0.1 12345 > 
client$i.log])
+    NS_CHECK_EXEC([alice1], [$NC --sctp --recv-only 30.0.0.1 12345 > 
client$i.log])
 done
 
 dnl Each server should have at least one connection.
@@ -12213,7 +12213,7 @@ 
sctp,orig=(src=172.16.1.2,dst=30.0.0.1,sport=<cleared>,dport=<cleared>),reply=(s
 dnl Test load-balancing that includes L4 ports in NAT.
 for i in `seq 1 20`; do
     echo Request $i
-    NS_CHECK_EXEC([alice1], [nc --sctp --recv-only 30.0.0.2 8000 > 
clients$i.log])
+    NS_CHECK_EXEC([alice1], [$NC --sctp --recv-only 30.0.0.2 8000 > 
clients$i.log])
 done
 
 dnl Each server should have at least one connection.
@@ -12256,7 +12256,7 @@ OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows 
br-int table=$(ovn-debug lflo
 dnl Test load-balancing that includes L4 ports in NAT.
 for i in `seq 1 20`; do
     echo Request $i
-    NS_CHECK_EXEC([alice1], [nc --sctp --recv-only 30.0.0.2 8000 > 
clients$i.log])
+    NS_CHECK_EXEC([alice1], [$NC --sctp --recv-only 30.0.0.2 8000 > 
clients$i.log])
 done
 
 dnl Each server should have at least one connection.
@@ -12319,12 +12319,12 @@ check ovn-nbctl lb-add lb-test 43.43.43.43:80 
42.42.42.1:8080,42.42.42.2:8080 tc
 dnl Start a server on vm1.
 ADD_NAMESPACES(vm1)
 ADD_VETH(vm1, vm1, br-int, "42.42.42.1/24", "00:00:00:00:00:01", "42.42.42.3")
-NETNS_DAEMONIZE([vm1], [nc -l -k 42.42.42.1 8080], [vm1.pid])
+NETNS_DAEMONIZE([vm1], [$NC -l -k 42.42.42.1 8080], [vm1.pid])
 
 dnl Start a server on vm2.
 ADD_NAMESPACES(vm2)
 ADD_VETH(vm2, vm2, br-int, "42.42.42.2/24", "00:00:00:00:00:02", "42.42.42.3")
-NETNS_DAEMONIZE([vm2], [nc -l -k 42.42.42.2 8080], [vm2.pid])
+NETNS_DAEMONIZE([vm2], [$NC -l -k 42.42.42.2 8080], [vm2.pid])
 
 dnl Wait for ovn-controller to catch up.
 wait_for_ports_up
@@ -12332,7 +12332,7 @@ check ovn-nbctl --wait=hv sync
 
 dnl Test the connection.
 OVS_WAIT_UNTIL([
-    ip netns exec vm1 nc -z 43.43.43.43 80 &> /dev/null
+    ip netns exec vm1 $NC -z 43.43.43.43 80 &> /dev/null
 ])
 
 OVS_WAIT_UNTIL([test $(ovs-ofctl dump-flows br-int | grep 
'table=OFTABLE_CHK_LB_AFFINITY, n_packets' -c) -eq 1])
@@ -12607,18 +12607,18 @@ ADD_NAMESPACES(server)
 ADD_VETH(server, server, br-int, "2000::10/64", "f0:00:0f:01:02:03", \
          "2000::1", "nodad", "192.168.200.10/24", "192.168.200.1")
 
-NETNS_DAEMONIZE([server], [nc -l -u 192.168.200.10 4242 > /dev/null], 
[serverv4.pid])
-NETNS_DAEMONIZE([server], [nc -l -u 2000::10 4243 > /dev/null], [serverv6.pid])
+NETNS_DAEMONIZE([server], [$NC -l -u 192.168.200.10 4242 > /dev/null], 
[serverv4.pid])
+NETNS_DAEMONIZE([server], [$NC -l -u 2000::10 4243 > /dev/null], 
[serverv6.pid])
 
 NETNS_START_TCPDUMP([client], [-l -U -i client -vnne udp], [client])
 NETNS_START_TCPDUMP([server], [-l -U -i server -vnne udp], [server])
 
 check ovs-appctl dpctl/flush-conntrack
 
-NS_CHECK_EXEC([client], [nc -z -u 192.168.100.20 4242], [ignore], [ignore], 
[ignore])
+NS_CHECK_EXEC([client], [$NC -z -u 192.168.100.20 4242], [ignore], [ignore], 
[ignore])
 OVS_WAIT_UNTIL([grep -q "192.168.200.10" server.tcpdump])
 
-NS_CHECK_EXEC([client], [nc -z -u 1000::20 4243])
+NS_CHECK_EXEC([client], [$NC -z -u 1000::20 4243])
 OVS_WAIT_UNTIL([grep -q "2000::10" server.tcpdump])
 
 zone_id=$(ovn-appctl -t ovn-controller ct-zone-list | grep lr_dnat | cut -d ' 
' -f2)
@@ -12824,10 +12824,10 @@ ADD_VETH(vm2, vm2, br-int, "192.168.200.20/24", 
"f0:00:0f:01:02:04", "192.168.20
 ADD_NAMESPACES(vm3)
 ADD_VETH(vm3, vm3, br-int, "192.168.200.30/24", "f0:00:0f:01:02:05", 
"192.168.200.1")
 
-NETNS_DAEMONIZE([vm0], [nc -l -k 192.168.200.10 4242], [server0.pid])
-NETNS_DAEMONIZE([vm1], [nc -l -k 192.168.100.10 4242], [server1.pid])
-NETNS_DAEMONIZE([vm2], [nc -l -k 192.168.200.20 4242], [server2.pid])
-NETNS_DAEMONIZE([vm3], [nc -l -k 192.168.200.30 4242], [server3.pid])
+NETNS_DAEMONIZE([vm0], [$NC -l -k 192.168.200.10 4242], [server0.pid])
+NETNS_DAEMONIZE([vm1], [$NC -l -k 192.168.100.10 4242], [server1.pid])
+NETNS_DAEMONIZE([vm2], [$NC -l -k 192.168.200.20 4242], [server2.pid])
+NETNS_DAEMONIZE([vm3], [$NC -l -k 192.168.200.30 4242], [server3.pid])
 
 check_snat() {
     check ovn-nbctl lr-nat-del lr
@@ -12838,9 +12838,9 @@ check_snat() {
 
     check ovs-appctl dpctl/flush-conntrack
 
-    NS_CHECK_EXEC([vm0], [nc -z 192.168.100.10 4242 -p 2000])
-    NS_CHECK_EXEC([vm0], [nc -z 192.168.100.10 4242 -p 2001])
-    NS_CHECK_EXEC([vm0], [nc -z 192.168.100.10 4242 -p 2002])
+    NS_CHECK_EXEC([vm0], [$NC -z 192.168.100.10 4242 -p 2000])
+    NS_CHECK_EXEC([vm0], [$NC -z 192.168.100.10 4242 -p 2001])
+    NS_CHECK_EXEC([vm0], [$NC -z 192.168.100.10 4242 -p 2002])
 
     snat_id=$(ovn-appctl -t ovn-controller ct-zone-list | grep lr_snat | cut 
-d ' ' -f2)
     AT_CHECK_UNQUOTED([ovs-appctl dpctl/dump-conntrack | 
FORMAT_CT(192.168.100.10) | grep "zone=$snat_id"], [0], [dnl
@@ -12859,9 +12859,9 @@ check_dnat() {
 
     check ovs-appctl dpctl/flush-conntrack
 
-    NS_CHECK_EXEC([vm1], [nc -z 192.168.100.100 4242 -p 2000])
-    NS_CHECK_EXEC([vm1], [nc -z 192.168.100.100 4242 -p 2001])
-    NS_CHECK_EXEC([vm1], [nc -z 192.168.100.100 4242 -p 2002])
+    NS_CHECK_EXEC([vm1], [$NC -z 192.168.100.100 4242 -p 2000])
+    NS_CHECK_EXEC([vm1], [$NC -z 192.168.100.100 4242 -p 2001])
+    NS_CHECK_EXEC([vm1], [$NC -z 192.168.100.100 4242 -p 2002])
 
     dnat_id=$(ovn-appctl -t ovn-controller ct-zone-list | grep lr_dnat | cut 
-d ' ' -f2)
     AT_CHECK_UNQUOTED([ovs-appctl dpctl/dump-conntrack | 
FORMAT_CT(192.168.100.100) | grep "zone=$dnat_id"], [0], [dnl
@@ -12950,10 +12950,10 @@ ADD_VETH(vm2, vm2, br-int, "2000::20/64", 
"f0:00:0f:01:02:04", "2000::1", "nodad
 ADD_NAMESPACES(vm3)
 ADD_VETH(vm3, vm3, br-int, "2000::30/64", "f0:00:0f:01:02:05", "2000::1", 
"nodad")
 
-NETNS_DAEMONIZE([vm0], [nc -lk 2000::10 4242 > /dev/null], [server0.pid])
-NETNS_DAEMONIZE([vm1], [nc -lk 1000::10 4242 > /dev/null], [server1.pid])
-NETNS_DAEMONIZE([vm2], [nc -lk 2000::20 4242 > /dev/null], [server2.pid])
-NETNS_DAEMONIZE([vm3], [nc -lk 2000::30 4242 > /dev/null], [server3.pid])
+NETNS_DAEMONIZE([vm0], [$NC -lk 2000::10 4242 > /dev/null], [server0.pid])
+NETNS_DAEMONIZE([vm1], [$NC -lk 1000::10 4242 > /dev/null], [server1.pid])
+NETNS_DAEMONIZE([vm2], [$NC -lk 2000::20 4242 > /dev/null], [server2.pid])
+NETNS_DAEMONIZE([vm3], [$NC -lk 2000::30 4242 > /dev/null], [server3.pid])
 
 check_snat() {
     check ovn-nbctl lr-nat-del lr
@@ -12964,9 +12964,9 @@ check_snat() {
 
     check ovs-appctl dpctl/flush-conntrack
 
-    NS_CHECK_EXEC([vm0], [nc -z 1000::10 4242 -p 2000])
-    NS_CHECK_EXEC([vm0], [nc -z 1000::10 4242 -p 2001])
-    NS_CHECK_EXEC([vm0], [nc -z 1000::10 4242 -p 2002])
+    NS_CHECK_EXEC([vm0], [$NC -z 1000::10 4242 -p 2000])
+    NS_CHECK_EXEC([vm0], [$NC -z 1000::10 4242 -p 2001])
+    NS_CHECK_EXEC([vm0], [$NC -z 1000::10 4242 -p 2002])
 
     snat_id=$(ovn-appctl -t ovn-controller ct-zone-list | grep lr_snat | cut 
-d ' ' -f2)
     AT_CHECK_UNQUOTED([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(1000::10) | 
grep "zone=$snat_id"], [0], [dnl
@@ -12985,9 +12985,9 @@ check_dnat() {
 
     check ovs-appctl dpctl/flush-conntrack
 
-    NS_CHECK_EXEC([vm1], [nc -z 1000::100 4242 -p 2000])
-    NS_CHECK_EXEC([vm1], [nc -z 1000::100 4242 -p 2001])
-    NS_CHECK_EXEC([vm1], [nc -z 1000::100 4242 -p 2002])
+    NS_CHECK_EXEC([vm1], [$NC -z 1000::100 4242 -p 2000])
+    NS_CHECK_EXEC([vm1], [$NC -z 1000::100 4242 -p 2001])
+    NS_CHECK_EXEC([vm1], [$NC -z 1000::100 4242 -p 2002])
 
     dnat_id=$(ovn-appctl -t ovn-controller ct-zone-list | grep lr_dnat | cut 
-d ' ' -f2)
     AT_CHECK_UNQUOTED([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(1000::100) 
| grep "zone=$dnat_id"], [0], [dnl
@@ -13169,12 +13169,12 @@ dnl And wait for it to be up and running.
 OVS_WAIT_UNTIL([ovs-ofctl dump-ipfix-flow br-int | grep -q '1 ids'])
 
 dnl Start UDP echo server on vm2.
-NETNS_DAEMONIZE([vm2], [nc -e "$PYTHON ./server.py" -k -u -v -l -m 1 1000], 
[nc-vm2-1000.pid])
-NETNS_DAEMONIZE([vm2], [nc -e "$PYTHON ./server.py" -k -u -v -l -m 1 1010], 
[nc-vm2-1010.pid])
-NETNS_DAEMONIZE([vm2], [nc -e "$PYTHON ./server.py" -k -u -v -l -m 1 2000], 
[nc-vm2-2000.pid])
-NETNS_DAEMONIZE([vm2], [nc -e "$PYTHON ./server.py" -k -u -v -l -m 1 2010], 
[nc-vm2-2010.pid])
-NETNS_DAEMONIZE([vm2], [nc -e "$PYTHON ./server.py" -k -u -v -l -m 1 3000], 
[nc-vm2-3000.pid])
-NETNS_DAEMONIZE([vm2], [nc -e "$PYTHON ./server.py" -k -u -v -l -m 1 3010], 
[nc-vm2-3010.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$PYTHON ./server.py" -k -u -v -l -m 1 1000], 
[nc-vm2-1000.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$PYTHON ./server.py" -k -u -v -l -m 1 1010], 
[nc-vm2-1010.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$PYTHON ./server.py" -k -u -v -l -m 1 2000], 
[nc-vm2-2000.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$PYTHON ./server.py" -k -u -v -l -m 1 2010], 
[nc-vm2-2010.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$PYTHON ./server.py" -k -u -v -l -m 1 3000], 
[nc-vm2-3000.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$PYTHON ./server.py" -k -u -v -l -m 1 3010], 
[nc-vm2-3010.pid])
 NETNS_START_TCPDUMP([vm2], [-i vm2 -vnne], [vm2])
 
 dnl Send traffic (2 packets) to the UDP LB1 (hits the from-lport ACL).
@@ -13332,10 +13332,10 @@ dnl And wait for it to be up and running.
 OVS_WAIT_UNTIL([ovs-ofctl dump-ipfix-flow br-int | grep -q '1 ids'])
 
 dnl Start UDP echo server on vm2.
-NETNS_DAEMONIZE([vm2], [nc -e "$(command -v cat)" -k -u -v -l -m 1 1000], 
[nc-vm2-1000.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$(command -v cat)" -k -u -v -l -m 1 1000], 
[nc-vm2-1000.pid])
 
 dnl Send traffic to the UDP server (hits both ACL tiers).
-NS_CHECK_EXEC([vm1], [echo a | nc --send-only -u 42.42.42.3 1000])
+NS_CHECK_EXEC([vm1], [echo a | $NC --send-only -u 42.42.42.3 1000])
 
 dnl Wait until OVS sampled all expected packets:
 dnl - first packet sampled by both tiers
@@ -13450,10 +13450,10 @@ dnl And wait for it to be up and running.
 OVS_WAIT_UNTIL([ovs-ofctl dump-ipfix-flow br-int | grep -q '1 ids'])
 
 dnl Start UDP echo server on vm2.
-NETNS_DAEMONIZE([vm2], [nc -e "$(command -v cat)" -k -u -v -l -m 1 1000], 
[nc-vm2-1000.pid])
+NETNS_DAEMONIZE([vm2], [$NC -e "$(command -v cat)" -k -u -v -l -m 1 1000], 
[nc-vm2-1000.pid])
 
 dnl Send traffic to the UDP server (hits both ACL tiers).
-NS_CHECK_EXEC([vm1], [echo a | nc --send-only -u 42.42.42.3 1000])
+NS_CHECK_EXEC([vm1], [echo a | $NC --send-only -u 42.42.42.3 1000])
 
 dnl Wait until OVS sampled all expected packets:
 dnl In this case, we only expect a single sampled packet.
@@ -13671,8 +13671,8 @@ check ovn-nbctl --wait=hv sync
 check_row_count nb:ACL 2
 check_row_count nb:Sample 2
 
-NETNS_DAEMONIZE([vm1], [nc -l -u 1234], [udp1.pid])
-NETNS_DAEMONIZE([vm2], [nc -l -u 1235], [udp2.pid])
+NETNS_DAEMONIZE([vm1], [$NC -l -u 1234], [udp1.pid])
+NETNS_DAEMONIZE([vm2], [$NC -l -u 1235], [udp2.pid])
 
 dnl Start an IPFIX collector.
 DAEMONIZE([nfcapd -B 1024000 -w . -p 4242 2> collector.err], [collector.pid])
@@ -13692,12 +13692,12 @@ OVS_WAIT_UNTIL([ovs-ofctl dump-ipfix-flow br-int | 
grep -q '2 ids'])
 
 # Create the connection in the CT table.
 echo "Hello" > Hello
-NS_EXEC([vm1], [nc -p 1234 -u 43.43.43.2 1235 < Hello])
-NS_EXEC([vm2], [nc -p 1235 -u 42.42.42.2 1234 < Hello])
+NS_EXEC([vm1], [$NC -p 1234 -u 43.43.43.2 1235 < Hello])
+NS_EXEC([vm2], [$NC -p 1235 -u 42.42.42.2 1234 < Hello])
 # Send some more packets.
 for i in $(seq 10); do
-NS_EXEC([vm1], [nc -p 1234 -u 43.43.43.2 1235 < Hello])
-NS_EXEC([vm2], [nc -p 1235 -u 42.42.42.2 1234 < Hello])
+NS_EXEC([vm1], [$NC -p 1234 -u 43.43.43.2 1235 < Hello])
+NS_EXEC([vm2], [$NC -p 1235 -u 42.42.42.2 1234 < Hello])
 done
 
 OVS_WAIT_UNTIL([ovs-ofctl dump-ipfix-flow br-int | grep 'id 100' | grep -q 
'sampled pkts=21'])
@@ -13908,52 +13908,52 @@ OVS_WAIT_UNTIL([NS_EXEC([ext-foo], [ip a show dev 
ext-foo | grep "fe80::" | grep
 
 # Verify that BGP control plane traffic is delivered to the "bgp-daemon"
 # interface on both IPv4 and IPv6 LLA addresses
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -k 172.16.1.1 179], [bgp_v4.pid])
-NS_CHECK_EXEC([ext-foo], [echo "BGP IPv4 server traffic" | nc --send-only 
172.16.1.1 179])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -k 172.16.1.1 179], [bgp_v4.pid])
+NS_CHECK_EXEC([ext-foo], [echo "BGP IPv4 server traffic" | $NC --send-only 
172.16.1.1 179])
 
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -6 -k fe80::200:2ff:fe01:203%bgp-daemon 
179], [bgp_v6.pid])
-NS_CHECK_EXEC([ext-foo], [echo "BGP IPv6 server traffic" | nc --send-only -6 
fe80::200:2ff:fe01:203%ext-foo 179])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -6 -k fe80::200:2ff:fe01:203%bgp-daemon 
179], [bgp_v6.pid])
+NS_CHECK_EXEC([ext-foo], [echo "BGP IPv6 server traffic" | $NC --send-only -6 
fe80::200:2ff:fe01:203%ext-foo 179])
 
 # Perform same set of checks as above for BFD daemon.
 # We need to manually check that the message arrived on the receiving end as 
Ncat will
 # produce false positive results over UDP due to lack of ICMP port unreachable 
messages
 # from LRP's IP.
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -u 172.16.1.1 3784 > 
bgp-daemon_bfd_v4.out], [bfd_v4.pid])
-NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv4 server traffic" | nc -u 
172.16.1.1 3784])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -u 172.16.1.1 3784 > 
bgp-daemon_bfd_v4.out], [bfd_v4.pid])
+NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv4 server traffic" | $NC 
-u 172.16.1.1 3784])
 AT_CHECK([cat bgp-daemon_bfd_v4.out], [0], [dnl
 from ext-foo: BFD IPv4 server traffic
 ])
 
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -6 -u fe80::200:2ff:fe01:203%bgp-daemon 
3784 > bgp-daemon_bfd_v6.out], [bfd_v6.pid])
-NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv6 server traffic" | nc -u 
-6 fe80::200:2ff:fe01:203%ext-foo 3784])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -6 -u fe80::200:2ff:fe01:203%bgp-daemon 
3784 > bgp-daemon_bfd_v6.out], [bfd_v6.pid])
+NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv6 server traffic" | $NC 
-u -6 fe80::200:2ff:fe01:203%ext-foo 3784])
 AT_CHECK([cat bgp-daemon_bfd_v6.out], [0], [dnl
 from ext-foo: BFD IPv6 server traffic
 ])
 
 # Verify connection in other direction. i.e when BGP daemon running on 
"bgp-daemon" port
 # makes a client connection to its peer
-NETNS_DAEMONIZE([ext-foo], [nc -l -k 172.16.1.100 179], [reply_bgp_v4.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv4 client traffic" | nc --send-only 
172.16.1.100 179])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -k 172.16.1.100 179], [reply_bgp_v4.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv4 client traffic" | $NC --send-only 
172.16.1.100 179])
 
-NETNS_DAEMONIZE([ext-foo], [nc -l -6 -k fe80::210:10ff:fe01:213%ext-foo 179], 
[reply_bgp_v6.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv6 client traffic" | nc --send-only 
-6 fe80::210:10ff:fe01:213%bgp-daemon 179])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -6 -k fe80::210:10ff:fe01:213%ext-foo 179], 
[reply_bgp_v6.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv6 client traffic" | $NC --send-only 
-6 fe80::210:10ff:fe01:213%bgp-daemon 179])
 
 # Perform same checks in other direction for BFD daemon
-NETNS_DAEMONIZE([ext-foo], [nc -l -u 172.16.1.100 3784 > ext-foo_bfd_v4.out], 
[reply_bfd_v4.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv4 client traffic" | 
nc -u 172.16.1.100 3784])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -u 172.16.1.100 3784 > ext-foo_bfd_v4.out], 
[reply_bfd_v4.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv4 client traffic" | 
$NC -u 172.16.1.100 3784])
 AT_CHECK([cat ext-foo_bfd_v4.out], [0], [dnl
 from bgp-daemon: BFD IPv4 client traffic
 ])
 
-NETNS_DAEMONIZE([ext-foo], [nc -l -6 -u fe80::210:10ff:fe01:213%ext-foo 3784 > 
ext-foo_bfd_v6.out], [reply_bfd_v6.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv6 client traffic" | 
nc -u -6 fe80::210:10ff:fe01:213%bgp-daemon 3784])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -6 -u fe80::210:10ff:fe01:213%ext-foo 3784 
> ext-foo_bfd_v6.out], [reply_bfd_v6.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv6 client traffic" | 
$NC -u -6 fe80::210:10ff:fe01:213%bgp-daemon 3784])
 AT_CHECK([cat ext-foo_bfd_v6.out], [0], [dnl
 from bgp-daemon: BFD IPv6 client traffic
 ])
 
 # Verify that hosts on the internal network can reach external networks
-NETNS_DAEMONIZE([ext-foo], [nc -l -k 172.16.1.100 2222], [nc_external.pid])
-NS_CHECK_EXEC([bar1], [echo "TCP test" | nc -w 1 --send-only 172.16.1.100 
2222])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -k 172.16.1.100 2222], [nc_external.pid])
+NS_CHECK_EXEC([bar1], [echo "TCP test" | $NC -w 1 --send-only 172.16.1.100 
2222])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -14048,52 +14048,52 @@ OVS_WAIT_UNTIL([NS_EXEC([ext-foo], [ip a show dev 
ext-foo | grep "fe80::" | grep
 
 # Verify that BGP control plane traffic is delivered to the "bgp-daemon"
 # interface on both IPv4 and IPv6 LLA addresses
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -k 172.16.1.1 179], [bgp_v4.pid])
-NS_CHECK_EXEC([ext-foo], [echo "BGP IPv4 server traffic" | nc --send-only 
172.16.1.1 179])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -k 172.16.1.1 179], [bgp_v4.pid])
+NS_CHECK_EXEC([ext-foo], [echo "BGP IPv4 server traffic" | $NC --send-only 
172.16.1.1 179])
 
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -6 -k fe80::200:2ff:fe01:203%bgp-daemon 
179], [bgp_v6.pid])
-NS_CHECK_EXEC([ext-foo], [echo "BGP IPv6 server traffic" | nc --send-only -6 
fe80::200:2ff:fe01:203%ext-foo 179])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -6 -k fe80::200:2ff:fe01:203%bgp-daemon 
179], [bgp_v6.pid])
+NS_CHECK_EXEC([ext-foo], [echo "BGP IPv6 server traffic" | $NC --send-only -6 
fe80::200:2ff:fe01:203%ext-foo 179])
 
 # Perform same set of checks as above for BFD daemon.
 # We need to manually check that the message arrived on the receiving end as 
Ncat will
 # produce false positive results over UDP due to lack of ICMP port unreachable 
messages
 # from LRP's IP.
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -u 172.16.1.1 3784 > 
bgp-daemon_bfd_v4.out], [bfd_v4.pid])
-NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv4 server traffic" | nc -u 
172.16.1.1 3784])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -u 172.16.1.1 3784 > 
bgp-daemon_bfd_v4.out], [bfd_v4.pid])
+NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv4 server traffic" | $NC 
-u 172.16.1.1 3784])
 AT_CHECK([cat bgp-daemon_bfd_v4.out], [0], [dnl
 from ext-foo: BFD IPv4 server traffic
 ])
 
-NETNS_DAEMONIZE([bgp-daemon], [nc -l -6 -u fe80::200:2ff:fe01:203%bgp-daemon 
3784 > bgp-daemon_bfd_v6.out], [bfd_v6.pid])
-NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv6 server traffic" | nc -u 
-6 fe80::200:2ff:fe01:203%ext-foo 3784])
+NETNS_DAEMONIZE([bgp-daemon], [$NC -l -6 -u fe80::200:2ff:fe01:203%bgp-daemon 
3784 > bgp-daemon_bfd_v6.out], [bfd_v6.pid])
+NS_CHECK_EXEC([ext-foo], [echo "from ext-foo: BFD IPv6 server traffic" | $NC 
-u -6 fe80::200:2ff:fe01:203%ext-foo 3784])
 AT_CHECK([cat bgp-daemon_bfd_v6.out], [0], [dnl
 from ext-foo: BFD IPv6 server traffic
 ])
 
 # Verify connection in other direction. i.e when BGP daemon running on 
"bgp-daemon" port
 # makes a client connection to its peer
-NETNS_DAEMONIZE([ext-foo], [nc -l -k 172.16.1.100 179], [reply_bgp_v4.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv4 client traffic" | nc --send-only 
172.16.1.100 179])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -k 172.16.1.100 179], [reply_bgp_v4.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv4 client traffic" | $NC --send-only 
172.16.1.100 179])
 
-NETNS_DAEMONIZE([ext-foo], [nc -l -6 -k fe80::210:10ff:fe01:213%ext-foo 179], 
[reply_bgp_v6.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv6 client traffic" | nc --send-only 
-6 fe80::210:10ff:fe01:213%bgp-daemon 179])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -6 -k fe80::210:10ff:fe01:213%ext-foo 179], 
[reply_bgp_v6.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "BGP IPv6 client traffic" | $NC --send-only 
-6 fe80::210:10ff:fe01:213%bgp-daemon 179])
 
 # Perform same checks in other direction for BFD daemon
-NETNS_DAEMONIZE([ext-foo], [nc -l -u 172.16.1.100 3784 > ext-foo_bfd_v4.out], 
[reply_bfd_v4.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv4 client traffic" | 
nc -u 172.16.1.100 3784])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -u 172.16.1.100 3784 > ext-foo_bfd_v4.out], 
[reply_bfd_v4.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv4 client traffic" | 
$NC -u 172.16.1.100 3784])
 AT_CHECK([cat ext-foo_bfd_v4.out], [0], [dnl
 from bgp-daemon: BFD IPv4 client traffic
 ])
 
-NETNS_DAEMONIZE([ext-foo], [nc -l -6 -u fe80::210:10ff:fe01:213%ext-foo 3784 > 
ext-foo_bfd_v6.out], [reply_bfd_v6.pid])
-NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv6 client traffic" | 
nc -u -6 fe80::210:10ff:fe01:213%bgp-daemon 3784])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -6 -u fe80::210:10ff:fe01:213%ext-foo 3784 
> ext-foo_bfd_v6.out], [reply_bfd_v6.pid])
+NS_CHECK_EXEC([bgp-daemon], [echo "from bgp-daemon: BFD IPv6 client traffic" | 
$NC -u -6 fe80::210:10ff:fe01:213%bgp-daemon 3784])
 AT_CHECK([cat ext-foo_bfd_v6.out], [0], [dnl
 from bgp-daemon: BFD IPv6 client traffic
 ])
 
 # Verify that hosts on the internal network can reach external networks
-NETNS_DAEMONIZE([ext-foo], [nc -l -k 172.16.1.100 2222], [nc_external.pid])
-NS_CHECK_EXEC([bar1], [echo "TCP test" | nc -w 1 --send-only 172.16.1.100 
2222])
+NETNS_DAEMONIZE([ext-foo], [$NC -l -k 172.16.1.100 2222], [nc_external.pid])
+NS_CHECK_EXEC([bar1], [echo "TCP test" | $NC -w 1 --send-only 172.16.1.100 
2222])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -15024,14 +15024,14 @@ check ovn-nbctl --ecmp-symmetric-reply lr-route-add 
R1 172.16.2.0/24 172.16.1.3
 
 wait_for_ports_up
 check ovn-nbctl --wait=hv sync
-NETNS_DAEMONIZE([alice], [nc -l -k 80], [alice.pid])
-NETNS_DAEMONIZE([peter], [nc -l -k 80], [peter.pid])
+NETNS_DAEMONIZE([alice], [$NC -l -k 80], [alice.pid])
+NETNS_DAEMONIZE([peter], [$NC -l -k 80], [peter.pid])
 
 NS_CHECK_EXEC([bob], [ping -q -c 3 -i 0.3 -w 2 192.168.1.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -z 192.168.1.2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -z 192.168.1.2 80], [0])
 
 wait_row_count ECMP_Nexthop 2
 wait_column 'f0:00:00:01:02:04' ECMP_Nexthop mac nexthop='172.16.1.2'
@@ -15052,7 +15052,7 @@ NS_CHECK_EXEC([bob], [ping -q -c 3 -i 0.3 -w 2 
192.168.1.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -z 192.168.1.2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -z 192.168.1.2 80], [0])
 
 wait_row_count ECMP_Nexthop 2
 check_column 'f0:00:00:01:02:04' ECMP_Nexthop mac nexthop='172.16.1.2'
@@ -15097,7 +15097,7 @@ NS_CHECK_EXEC([bob], [ping -q -c 3 -i 0.3 -w 2 
192.168.1.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -z 192.168.1.2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -z 192.168.1.2 80], [0])
 
 AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(172.16.2.10) | \
 sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
@@ -15136,13 +15136,13 @@ NS_CHECK_EXEC([bob], [ping -q -c 3 -i 0.3 -w 2 
192.168.1.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -z 192.168.1.2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -z 192.168.1.2 80], [0])
 
 NS_CHECK_EXEC([bob], [ping -q -c 3 -i 0.3 -w 2 192.168.2.2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -z 192.168.2.2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -z 192.168.2.2 80], [0])
 
 AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(172.16.2.10) | \
 sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
@@ -15273,15 +15273,15 @@ net.ipv6.conf.all.forwarding = 1
 ])
 
 check ovn-nbctl --wait=hv sync
-NETNS_DAEMONIZE([alice], [nc -6 -l -k 80], [alice.pid])
-NETNS_DAEMONIZE([peter], [nc -6 -l -k 80], [peter.pid])
+NETNS_DAEMONIZE([alice], [$NC -6 -l -k 80], [alice.pid])
+NETNS_DAEMONIZE([peter], [$NC -6 -l -k 80], [peter.pid])
 
 NS_CHECK_EXEC([bob], [ping -6 -q -c 3 -i 0.3 -w 2 fd11::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
 
-NS_CHECK_EXEC([bob], [nc -6 -z fd11::2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -6 -z fd11::2 80], [0])
 
 wait_row_count ECMP_Nexthop 2
 wait_column 'f0:00:00:01:02:04' ECMP_Nexthop mac nexthop='"fd12::2"'
@@ -15302,7 +15302,7 @@ NS_CHECK_EXEC([bob], [ping -6 -q -c 3 -i 0.3 -w 2 
fd11::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -6 -z fd11::2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -6 -z fd11::2 80], [0])
 
 wait_row_count ECMP_Nexthop 2
 check_column 'f0:00:00:01:02:04' ECMP_Nexthop mac nexthop='"fd12::2"'
@@ -15347,7 +15347,7 @@ NS_CHECK_EXEC([bob], [ping -6 -q -c 3 -i 0.3 -w 2 
fd11::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -6 -z fd11::2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -6 -z fd11::2 80], [0])
 
 AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fd13::a) | \
 sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
@@ -15386,13 +15386,13 @@ NS_CHECK_EXEC([bob], [ping -6 -q -c 3 -i 0.3 -w 2 
fd11::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -6 -z fd11::2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -6 -z fd11::2 80], [0])
 
 NS_CHECK_EXEC([bob], [ping -6 -q -c 3 -i 0.3 -w 2 fd14::2 | FORMAT_PING], \
 [0], [dnl
 3 packets transmitted, 3 received, 0% packet loss, time 0ms
 ])
-NS_CHECK_EXEC([bob], [nc -6 -z fd14::2 80], [0])
+NS_CHECK_EXEC([bob], [$NC -6 -z fd14::2 80], [0])
 
 AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fd13::a) | \
 sed -e 's/zone=[[0-9]]*/zone=<cleared>/' |
@@ -17947,7 +17947,7 @@ test_fragmented_traffic() {
 
     check ovs-appctl dpctl/flush-conntrack
 
-    NETNS_DAEMONIZE([server], [nc -l -u 172.16.1.2 4242 > /dev/null], 
[server.pid])
+    NETNS_DAEMONIZE([server], [$NC -l -u 172.16.1.2 4242 > /dev/null], 
[server.pid])
 
     # Collect ICMP packets on client side
     NETNS_START_TCPDUMP([client], [-U -i client -vnne udp], [tcpdump-client])
@@ -20021,8 +20021,8 @@ OVN_POPULATE_ARP
 check ovn-nbctl --wait=hv sync
 wait_for_ports_up
 
-NETNS_DAEMONIZE([vm3], [nc -l -k 80], [vm3.pid])
-NS_CHECK_EXEC([vm1], [nc 30.0.0.2 80 -z])
+NETNS_DAEMONIZE([vm3], [$NC -l -k 80], [vm3.pid])
+NS_CHECK_EXEC([vm1], [$NC 30.0.0.2 80 -z])
 
 OVN_CLEANUP_CONTROLLER([hv1])
 
@@ -21076,8 +21076,8 @@ 
icmp,orig=(src=192.168.100.11,dst=172.16.0.100,id=<cleared>,type=8,code=0),reply
 ])
 
 # Test TCP traffic - should be blocked by ACLs.
-NETNS_DAEMONIZE([external], [nc -l -k 172.16.0.100 80], [external.pid])
-NS_CHECK_EXEC([vm1], [nc -z 172.16.0.100 80], [1])
+NETNS_DAEMONIZE([external], [$NC -l -k 172.16.0.100 80], [external.pid])
+NS_CHECK_EXEC([vm1], [$NC -z 172.16.0.100 80], [1])
 
 # Remove enable_router_port_acl and verify CT zone release.
 check ovn-nbctl lsp-set-options ext_lr router-port=lr_ext
@@ -21696,14 +21696,14 @@ NETNS_START_TCPDUMP([server], [-U -i server -Q in -nn 
ip and '(ip[[6:2]] & 0x3ff
 NETNS_START_TCPDUMP([client], [-U -i client -Q in -nn ip and '(ip[[6:2]] & 
0x3fff != 0)'], [tcpdump-udp-client])
 
 # Start UDP listeners on both sides.
-NETNS_DAEMONIZE([server], [nc -l -u 172.16.1.2 5060 > udp_server.rcvd], 
[server.pid])
-NETNS_DAEMONIZE([client], [nc -l -u 172.16.1.3 5061 > udp_client.rcvd], 
[client.pid])
+NETNS_DAEMONIZE([server], [$NC -l -u 172.16.1.2 5060 > udp_server.rcvd], 
[server.pid])
+NETNS_DAEMONIZE([client], [$NC -l -u 172.16.1.3 5061 > udp_client.rcvd], 
[client.pid])
 
 # Client sends to server (will be fragmented due to MTU 900).
-NS_CHECK_EXEC([client], [cat datafile | nc -w 1 -u 172.16.1.2 5060], [0], 
[ignore], [ignore])
+NS_CHECK_EXEC([client], [cat datafile | $NC -w 1 -u 172.16.1.2 5060], [0], 
[ignore], [ignore])
 
 # Server sends to client (will be fragmented due to MTU 900).
-NS_CHECK_EXEC([server], [cat datafile | nc -w 1 -u 172.16.1.3 5061], [0], 
[ignore], [ignore])
+NS_CHECK_EXEC([server], [cat datafile | $NC -w 1 -u 172.16.1.3 5061], [0], 
[ignore], [ignore])
 
 OVS_WAIT_UNTIL([test -s udp_server.rcvd])
 OVS_WAIT_UNTIL([test -s udp_client.rcvd])
@@ -21792,8 +21792,8 @@ check ovn-nbctl --wait=hv sync
 check ovs-appctl dpctl/flush-conntrack
 
 # Test client -> server direction.
-NETNS_DAEMONIZE([server], [nc -l 172.16.1.2 8080 > tcp_server.rcvd], 
[server.pid])
-NS_CHECK_EXEC([client], [nc -w 1 172.16.1.2 8080 < datafile], [0], [ignore], 
[ignore])
+NETNS_DAEMONIZE([server], [$NC -l 172.16.1.2 8080 > tcp_server.rcvd], 
[server.pid])
+NS_CHECK_EXEC([client], [$NC -w 1 172.16.1.2 8080 < datafile], [0], [ignore], 
[ignore])
 
 OVS_WAIT_UNTIL([test -s tcp_server.rcvd])
 check cmp datafile tcp_server.rcvd
@@ -21802,8 +21802,8 @@ check cmp datafile tcp_server.rcvd
 kill $(cat server.pid) 2>/dev/null || true
 
 # Test server -> client direction.
-NETNS_DAEMONIZE([client], [nc -l 172.16.1.3 8081 > tcp_client.rcvd], 
[client.pid])
-NS_CHECK_EXEC([server], [nc -w 1 172.16.1.3 8081 < datafile], [0], [ignore], 
[ignore])
+NETNS_DAEMONIZE([client], [$NC -l 172.16.1.3 8081 > tcp_client.rcvd], 
[client.pid])
+NS_CHECK_EXEC([server], [$NC -w 1 172.16.1.3 8081 < datafile], [0], [ignore], 
[ignore])
 
 OVS_WAIT_UNTIL([test -s tcp_client.rcvd])
 check cmp datafile tcp_client.rcvd
@@ -21882,10 +21882,10 @@ check ovs-appctl dpctl/flush-conntrack
 NETNS_START_TCPDUMP([server], [-U -i server -Q in -nn udp port 4000], 
[tcpdump-drop-server])
 
 # Start UDP listener on server (on port 4000 which is NOT allowed by ACLs).
-NETNS_DAEMONIZE([server], [nc -l -u 172.16.1.2 4000 > udp_drop.rcvd], 
[drop_server.pid])
+NETNS_DAEMONIZE([server], [$NC -l -u 172.16.1.2 4000 > udp_drop.rcvd], 
[drop_server.pid])
 
 # Client sends to server on disallowed port.
-NS_CHECK_EXEC([client], [echo "test" | nc -w 1 -u 172.16.1.2 4000], [0], 
[ignore], [ignore])
+NS_CHECK_EXEC([client], [echo "test" | $NC -w 1 -u 172.16.1.2 4000], [0], 
[ignore], [ignore])
 
 # Wait a bit for any packets to arrive.
 sleep 2
@@ -22055,7 +22055,7 @@ check ovn-nbctl --wait=hv sync
 check_row_count sb:Service_Monitor 2
 
 # Create one more health check on logical switch port.
-NETNS_DAEMONIZE([lport], [nc -l -k 192.168.0.10 4041], [lport_tcp.pid])
+NETNS_DAEMONIZE([lport], [$NC -l -k 192.168.0.10 4041], [lport_tcp.pid])
 
 # Wait until the services are set to online.
 wait_row_count Service_Monitor 2 status=online
@@ -22063,7 +22063,7 @@ wait_row_count nb:Logical_Switch_Port_Health_Check 1 
status=online protocol=tcp
 
 check ovn-nbctl lsp-hc-add lport udp 192.168.0.250 4042 192.168.0.10
 
-NETNS_DAEMONIZE([lport], [nc -ulp 4042], [lport_udp.pid])
+NETNS_DAEMONIZE([lport], [$NC -ulp 4042], [lport_udp.pid])
 
 # Wait until the services are set to online.
 wait_row_count Service_Monitor 3 status=online
@@ -22086,7 +22086,7 @@ check ovn-nbctl --wait=hv sync
 check_row_count sb:Service_Monitor 2
 
 # Start IPv6 TCP server.
-NETNS_DAEMONIZE([lport], [nc -6 -l -k 2001:db8::10 4043], [lport_ipv6_tcp.pid])
+NETNS_DAEMONIZE([lport], [$NC -6 -l -k 2001:db8::10 4043], 
[lport_ipv6_tcp.pid])
 
 # Wait until the services are set to online.
 wait_row_count Service_Monitor 2 status=online
@@ -22098,7 +22098,7 @@ check ovn-nbctl --wait=hv sync
 check_row_count sb:Service_Monitor 3
 
 # Start IPv6 UDP server
-NETNS_DAEMONIZE([lport], [nc -6 -u -l 2001:db8::10 4044], [lport_ipv6_udp.pid])
+NETNS_DAEMONIZE([lport], [$NC -6 -u -l 2001:db8::10 4044], 
[lport_ipv6_udp.pid])
 
 # Wait until the services are set to online.
 wait_row_count Service_Monitor 3 status=online
@@ -22174,7 +22174,7 @@ NETNS_START_TCPDUMP([lsp], [-nne -i lsp -Q in 'udp port 
42'], [lsp_in])
 NETNS_START_TCPDUMP([lsp], [-nne -i lsp -Q out 'udp port 42 || icmp'], 
[lsp_out])
 
 dnl Start a backend server, the monitor should change status to "online".
-NETNS_DAEMONIZE([lsp], [nc -l -u 42], [nc.pid])
+NETNS_DAEMONIZE([lsp], [$NC -l -u 42], [nc.pid])
 wait_row_count Service_Monitor 1 status=online
 
 dnl Kill the backend server, the monitor should change status to "offline".
-- 
2.54.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to