# on every try.
   for tries in {1..3}; do
     # Actual test starts here
-    ip netns exec server_ns ./gro "${ARGS[@]}" "--rx" "--iface" "server" \
+    ip netns exec $server_ns ./gro "${ARGS[@]}" "--rx" "--iface" "server" \
       1>>log.txt &
     server_pid=$!
     sleep 0.5  # to allow for socket init
-    ip netns exec client_ns ./gro "${ARGS[@]}" "--iface" "client" \
+    ip netns exec $client_ns ./gro "${ARGS[@]}" "--iface" "client" \
       1>>log.txt
     wait "${server_pid}"
     exit_code=$?
 
 readonly IRQ_PATH="/sys/class/net/${dev}/napi_defer_hard_irqs"
 readonly FLUSH_TIMEOUT="$(< ${FLUSH_PATH})"
 readonly HARD_IRQS="$(< ${IRQ_PATH})"
+readonly server_ns=$(mktemp -u server-XXXXXXXX)
+readonly client_ns=$(mktemp -u client-XXXXXXXX)
 
 netdev_check_for_carrier() {
        local -r dev="$1"
 
 setup_ns() {
        # Set up server_ns namespace and client_ns namespace
-       setup_macvlan_ns "${dev}" server_ns server "${SERVER_MAC}"
-       setup_macvlan_ns "${dev}" client_ns client "${CLIENT_MAC}"
+       setup_macvlan_ns "${dev}" ${server_ns} server "${SERVER_MAC}"
+       setup_macvlan_ns "${dev}" ${client_ns} client "${CLIENT_MAC}"
 }
 
 cleanup_ns() {
-       cleanup_macvlan_ns server_ns server client_ns client
+       cleanup_macvlan_ns ${server_ns} server ${client_ns} client
 }
 
 setup() {
 
 #!/bin/bash
 # SPDX-License-Identifier: GPL-2.0
 
+readonly server_ns=$(mktemp -u server-XXXXXXXX)
+readonly client_ns=$(mktemp -u client-XXXXXXXX)
+
 setup_veth_ns() {
        local -r link_dev="$1"
        local -r ns_name="$2"
        # Set up server_ns namespace and client_ns namespace
        ip link add name server type veth peer name client
 
-       setup_veth_ns "${dev}" server_ns server "${SERVER_MAC}"
-       setup_veth_ns "${dev}" client_ns client "${CLIENT_MAC}"
+       setup_veth_ns "${dev}" ${server_ns} server "${SERVER_MAC}"
+       setup_veth_ns "${dev}" ${client_ns} client "${CLIENT_MAC}"
 }
 
 cleanup_ns() {
        local ns_name
 
-       for ns_name in client_ns server_ns; do
+       for ns_name in ${client_ns} ${server_ns}; do
                [[ -e /var/run/netns/"${ns_name}" ]] && ip netns del "${ns_name}"
        done
 }
 
        setup_loopback_environment "${DEV}"
 
        # Set up server_ns namespace and client_ns namespace
-       setup_macvlan_ns "${DEV}" server_ns server \
+       setup_macvlan_ns "${DEV}" $server_ns server \
        "${SERVER_MAC}" "${SERVER_IP}"
-       setup_macvlan_ns "${DEV}" client_ns client \
+       setup_macvlan_ns "${DEV}" $client_ns client \
        "${CLIENT_MAC}" "${CLIENT_IP}"
 }
 
 cleanup() {
-       cleanup_macvlan_ns server_ns server client_ns client
+       cleanup_macvlan_ns $server_ns server $client_ns client
        cleanup_loopback "${DEV}"
 }
 
        # RPS/RFS must be disabled because they move packets between cpus,
        # which breaks the PACKET_FANOUT_CPU identification of RSS decisions.
        eval "$(get_disable_rfs_cmd) $(get_disable_rps_cmd)" \
-         ip netns exec server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
+         ip netns exec $server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
          -d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 \
          -C "$(get_rx_irq_cpus)" -s -v &
 elif [[ ! -z "${RPS_MAP}" ]]; then
        eval "$(get_disable_rfs_cmd) $(get_set_rps_bitmaps_cmd ${RPS_MAP})" \
-         ip netns exec server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
+         ip netns exec $server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
          -d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 \
          -r "0x${RPS_MAP}" -s -v &
 else
-       ip netns exec server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
+       ip netns exec $server_ns ./toeplitz "${IP_FLAG}" "${PROTO_FLAG}" \
          -d "${PORT}" -i "${DEV}" -k "${KEY}" -T 1000 -s -v &
 fi
 
 server_pid=$!
 
-ip netns exec client_ns ./toeplitz_client.sh "${PROTO_FLAG}" \
+ip netns exec $client_ns ./toeplitz_client.sh "${PROTO_FLAG}" \
   "${IP_FLAG}" "${SERVER_IP%%/*}" "${PORT}" &
 
 client_pid=$!