ip1() { pretty 1 "ip $*"; ip -n $netns1 "$@"; }
 ip2() { pretty 2 "ip $*"; ip -n $netns2 "$@"; }
 sleep() { read -t "$1" -N 1 || true; }
-waitiperf() { pretty "${1//*-}" "wait for iperf:5201 pid $2"; while [[ $(ss -N "$1" -tlpH 'sport = 5201') != *\"iperf3\",pid=$2,fd=* ]]; do sleep 0.1; done; }
+waitiperf() { pretty "${1//*-}" "wait for iperf:${3:-5201} pid $2"; while [[ $(ss -N "$1" -tlpH "sport = ${3:-5201}") != *\"iperf3\",pid=$2,fd=* ]]; do sleep 0.1; done; }
 waitncatudp() { pretty "${1//*-}" "wait for udp:1111 pid $2"; while [[ $(ss -N "$1" -ulpH 'sport = 1111') != *\"ncat\",pid=$2,fd=* ]]; do sleep 0.1; done; }
 waitiface() { pretty "${1//*-}" "wait for $2 to come up"; ip netns exec "$1" bash -c "while [[ \$(< \"/sys/class/net/$2/operstate\") != up ]]; do read -t .1 -N 0 || true; done;"; }
 
        n2 iperf3 -s -1 -B fd00::2 &
        waitiperf $netns2 $!
        n1 iperf3 -Z -t 3 -b 0 -u -c fd00::2
+
+       # TCP over IPv4, in parallel
+       for max in 4 5 50; do
+               local pids=( )
+               for ((i=0; i < max; ++i)) do
+                       n2 iperf3 -p $(( 5200 + i )) -s -1 -B 192.168.241.2 &
+                       pids+=( $! ); waitiperf $netns2 $! $(( 5200 + i ))
+               done
+               for ((i=0; i < max; ++i)) do
+                       n1 iperf3 -Z -t 3 -p $(( 5200 + i )) -c 192.168.241.2 &
+               done
+               wait "${pids[@]}"
+       done
 }
 
 [[ $(ip1 link show dev wg0) =~ mtu\ ([0-9]+) ]] && orig_mtu="${BASH_REMATCH[1]}"