Hi Ihar,
Thanks for the patch. This "traditional nc" vs "nmap nc" brings up
memories from when I first started with OVN, so I thought I'll chime
in.

On Sun, Jul 26, 2026 at 8:08 PM Ihar Hrachyshka
<[email protected]> wrote:
>
> 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

As you noted above, both Ubuntu and Fedora use links via
"/etc/alternatives" to expose "ncat" as "nc", but they also retain the
"ncat"

Ubuntu 24.04:
$  which ncat
/usr/bin/ncat

Fedora 43:
$ which ncat
/usr/sbin/ncat

Given that many tests rely on ncat-specific features, wouldn't it be
better to check only for presence of "ncat" and set `HAVE_NC=no` if it
doesn't exist?

Best regards,
Martin.

>
>  # 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
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to