# SPDX-License-Identifier: AGPL-3.0-or-later # # PASST - Plug A Simple Socket Transport # for qemu/UNIX domain socket mode # # PASTA - Pack A Subtle Tap Abstraction # for network namespace/tap device mode # # test/udp/passt_in_ns - Check UDP functionality for passt in ns and pasta # # Copyright (c) 2021 Red Hat GmbH # Author: Stefano Brivio onlyfor passt_in_ns gtools nc tee grep cat ip jq md5sum cut nstools nc tee grep cat ip jq md5sum cut htools printf dd nc tee grep cat ip jq md5sum cut test UDP/IPv4: host to guest temp TEMP temp NC_PID guestb (nc -u -q1 -4 -l 10001 & echo $! > nc.pic) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat nc.pic)) host dd if=/dev/urandom bs=1k count=5 > __TEMP__ && printf "\nEND_OF_TEST\n" >> __TEMP__ host cat __TEMP__ | nc -u -q1 -N 127.0.0.1 10001 guestw hout MD5 md5sum __TEMP__ | cut -d' ' -f1 gout GUEST_MD5 md5sum test.bin | cut -d' ' -f1 check [ "__GUEST_MD5__" = "__MD5__" ] test UDP/IPv4: host to ns temp TEMP_NS ns :> __TEMP_NS__ nsb (nc -u -q1 -4 -l 10002 & echo $! > __NC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) host cat __TEMP__ | nc -u -q1 -N 127.0.0.1 10002 nsw nsout NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1 check [ "__NS_MD5__" = "__MD5__" ] test UDP/IPv4: guest to host host :> __TEMP__ hostb (nc -u -q1 -4 -l 10003 & echo $! > __NC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) gout GW ip -j -4 ro sh|jq -rM '.[] | select(.dst == "default").gateway' guest cat test.bin | nc -u -q1 -N __GW__ 10003 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv4: guest to ns ns :> __TEMP_NS__ nsb (nc -u -q1 -4 -l 10002 & echo $! > __NC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) guest cat test.bin | nc -u -q1 -N __GW__ 10002 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv4: ns to host (recvmmsg/sendmmsg) sleep 1 host :> __TEMP__ hostb (nc -u -q1 -4 -l 10003 & echo $! > __NC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) ns cat __TEMP_NS__ | nc -u -q1 -N 127.0.0.1 10003 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv4: ns to host (via tap) host :> __TEMP__ hostb (nc -u -q1 -4 -l 10003 & echo $! > __NC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) ns cat __TEMP_NS__ | nc -u -q1 -N __GW__ 10003 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv4: ns to guest (using loopback address) guestb (nc -u -q1 -4 -l 10001 & echo $! > nc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat nc.pid)) ns cat __TEMP_NS__ | nc -u -q1 -N 127.0.0.1 10001 guestw gout GUEST_MD5 md5sum test.bin | cut -d' ' -f1 check [ "__GUEST_MD5__" = "__MD5__" ] test UDP/IPv4: ns to guest (using namespace address) guestb (nc -u -q1 -4 -l 10001 & echo $! > nc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat nc.pid)) nsout IFNAME ip -j li sh | jq -rM '.[] | select(.link_type == "ether").ifname' nsout ADDR ip -j -4 ad sh|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local' ns cat __TEMP_NS__ | nc -u -q1 -N __ADDR__ 10001 guestw gout GUEST_MD5 md5sum test.bin | cut -d' ' -f1 check [ "__GUEST_MD5__" = "__MD5__" ] test UDP/IPv6: host to guest guestb (nc -u -q1 -6 -l 10001 & echo $! > nc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat nc.pid)) host cat __TEMP__ | nc -u -q1 -N ::1 10001 guestw gout GUEST_MD5 md5sum test.bin | cut -d' ' -f1 check [ "__GUEST_MD5__" = "__MD5__" ] test UDP/IPv6: host to ns ns :> __TEMP_NS__ nsb (nc -u -q1 -6 -l 10002 & echo $! > __NC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) host cat __TEMP__ | nc -u -q1 -N ::1 10002 nsw nsout NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1 check [ "__NS_MD5__" = "__MD5__" ] test UDP/IPv6: guest to host host :> __TEMP__ hostb (nc -u -q1 -6 -l 10003 & echo $! > __NC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) gout GW6 ip -j -6 ro sh|jq -rM '.[] | select(.dst == "default").gateway' gout IFNAME ip -j li sh | jq -rM '.[] | select(.link_type == "ether").ifname' guest cat test.bin | nc -u -q1 -N __GW6__%__IFNAME__ 10003 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv6: guest to ns ns :> __TEMP_NS__ nsb (nc -u -q1 -6 -l 10002 & echo $! > __NC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) guest cat test.bin | nc -u -q1 -N __GW6__%__IFNAME__ 10002 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv6: ns to host (recvmmsg/sendmmsg) host :> __TEMP__ hostb (nc -u -q1 -6 -l 10003 & echo $! > __NC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) ns cat __TEMP_NS__ | nc -u -q1 -N ::1 10003 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv6: ns to host (via tap) host :> __TEMP__ hostb (nc -u -q1 -6 -l 10003 & echo $! > __NC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __NC_PID__)) nsout IFNAME ip -j li sh | jq -rM '.[] | select(.link_type == "ether").ifname' ns cat __TEMP_NS__ | nc -u -q1 -N __GW6__%__IFNAME__ 10003 hostw hout HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1 check [ "__HOST_MD5__" = "__MD5__" ] test UDP/IPv6: ns to guest (using loopback address) guestb (nc -u -q1 -6 -l 10001 & echo $! > nc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat nc.pid)) ns cat __TEMP_NS__ | nc -u -q1 -N ::1 10001 guestw gout GUEST_MD5 md5sum test.bin | cut -d' ' -f1 check [ "__GUEST_MD5__" = "__MD5__" ] test UDP/IPv6: ns to guest (using namespace address) guestb (nc -u -q1 -6 -l 10001 & echo $! > nc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat nc.pid)) nsout ADDR6 ip -j -6 ad sh|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local' ns cat __TEMP_NS__ | nc -u -q1 -N __ADDR6__ 10001 guestw gout GUEST_MD5 md5sum test.bin | cut -d' ' -f1 check [ "__GUEST_MD5__" = "__MD5__" ]