public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
* [PATCH v2 0/3] Don't drop outbound zero-length UDP packets over tap
@ 2022-09-13  6:37 David Gibson
  2022-09-13  6:37 ` [PATCH v2 1/3] udp: Don't pre-initialize msghdr array David Gibson
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: David Gibson @ 2022-09-13  6:37 UTC (permalink / raw)
  To: passt-dev

[-- Attachment #1: Type: text/plain, Size: 877 bytes --]

passt/pasta was incorrectly dropping UDP packets with a zero-length
payload when travelling out via the tap interface.  This is incorrect,
since for a datagram protocol, zero-length packets are still
meaningful.

Based on my earlier series for test command dispatch, user namespace
cleanup and test temporary file handling.

Bugzilla: https://bugs.passt.top/show_bug.cgi?id=19

Changes since v1:
 * Also remove unnecessary initialization of mm[]

David Gibson (3):
  udp: Don't pre-initialize msghdr array
  udp: Don't drop zero-length outbound UDP packets
  test: Simpler termination handling for UDP tests

 test/passt/udp       | 23 +++++++-------
 test/passt_in_ns/udp | 73 ++++++++++++++++++++++----------------------
 test/pasta/udp       | 31 +++++++++----------
 udp.c                | 23 +++++++++-----
 4 files changed, 77 insertions(+), 73 deletions(-)

-- 
2.37.3


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 1/3] udp: Don't pre-initialize msghdr array
  2022-09-13  6:37 [PATCH v2 0/3] Don't drop outbound zero-length UDP packets over tap David Gibson
@ 2022-09-13  6:37 ` David Gibson
  2022-09-13  6:37 ` [PATCH v2 2/3] udp: Don't drop zero-length outbound UDP packets David Gibson
  2022-09-13  6:37 ` [PATCH v2 3/3] test: Simpler termination handling for UDP tests David Gibson
  2 siblings, 0 replies; 4+ messages in thread
From: David Gibson @ 2022-09-13  6:37 UTC (permalink / raw)
  To: passt-dev

[-- Attachment #1: Type: text/plain, Size: 1327 bytes --]

In udp_tap_handler() the array of msghdr structures, mm[], is initialized
to zero.  Since UIO_MAXIOV is 1024, this can be quite a large zero, which
is expensive if we only end up using a few of its entries.  It also makes
it less obvious how we're setting all the control fields at the point we
actually invoke sendmmsg().

Rather than pre-initializing it, just initialize each element as we use it.

Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au>
---
 udp.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/udp.c b/udp.c
index c4ebecc..864e7b2 100644
--- a/udp.c
+++ b/udp.c
@@ -968,7 +968,7 @@ void udp_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events,
 int udp_tap_handler(struct ctx *c, int af, const void *addr,
 		    const struct pool *p, const struct timespec *now)
 {
-	struct mmsghdr mm[UIO_MAXIOV] = { 0 };
+	struct mmsghdr mm[UIO_MAXIOV];
 	struct iovec m[UIO_MAXIOV];
 	struct sockaddr_in6 s_in6;
 	struct sockaddr_in s_in;
@@ -1087,6 +1087,10 @@ int udp_tap_handler(struct ctx *c, int af, const void *addr,
 		mm[i].msg_hdr.msg_iov = m + i;
 		mm[i].msg_hdr.msg_iovlen = 1;
 
+		mm[i].msg_hdr.msg_control = NULL;
+		mm[i].msg_hdr.msg_controllen = 0;
+		mm[i].msg_hdr.msg_flags = 0;
+
 		count++;
 	}
 
-- 
@@ -968,7 +968,7 @@ void udp_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events,
 int udp_tap_handler(struct ctx *c, int af, const void *addr,
 		    const struct pool *p, const struct timespec *now)
 {
-	struct mmsghdr mm[UIO_MAXIOV] = { 0 };
+	struct mmsghdr mm[UIO_MAXIOV];
 	struct iovec m[UIO_MAXIOV];
 	struct sockaddr_in6 s_in6;
 	struct sockaddr_in s_in;
@@ -1087,6 +1087,10 @@ int udp_tap_handler(struct ctx *c, int af, const void *addr,
 		mm[i].msg_hdr.msg_iov = m + i;
 		mm[i].msg_hdr.msg_iovlen = 1;
 
+		mm[i].msg_hdr.msg_control = NULL;
+		mm[i].msg_hdr.msg_controllen = 0;
+		mm[i].msg_hdr.msg_flags = 0;
+
 		count++;
 	}
 
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/3] udp: Don't drop zero-length outbound UDP packets
  2022-09-13  6:37 [PATCH v2 0/3] Don't drop outbound zero-length UDP packets over tap David Gibson
  2022-09-13  6:37 ` [PATCH v2 1/3] udp: Don't pre-initialize msghdr array David Gibson
@ 2022-09-13  6:37 ` David Gibson
  2022-09-13  6:37 ` [PATCH v2 3/3] test: Simpler termination handling for UDP tests David Gibson
  2 siblings, 0 replies; 4+ messages in thread
From: David Gibson @ 2022-09-13  6:37 UTC (permalink / raw)
  To: passt-dev

[-- Attachment #1: Type: text/plain, Size: 1341 bytes --]

udp_tap_handler() currently skips outbound packets if they have a payload
length of zero.  This is not correct, since in a datagram protocol zero
length packets still have meaning.

Adjust this to correctly forward the zero-length packets by using a msghdr
with msg_iovlen == 0.

Bugzilla: https://bugs.passt.top/show_bug.cgi?id=19

Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au>
---
 udp.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/udp.c b/udp.c
index 864e7b2..0b4e134 100644
--- a/udp.c
+++ b/udp.c
@@ -1075,17 +1075,20 @@ int udp_tap_handler(struct ctx *c, int af, const void *addr,
 		uh_send = packet_get(p, i, 0, sizeof(*uh), &len);
 		if (!uh_send)
 			return p->count;
-		if (!len)
-			continue;
-
-		m[i].iov_base = (char *)(uh_send + 1);
-		m[i].iov_len = len;
 
 		mm[i].msg_hdr.msg_name = sa;
 		mm[i].msg_hdr.msg_namelen = sl;
 
-		mm[i].msg_hdr.msg_iov = m + i;
-		mm[i].msg_hdr.msg_iovlen = 1;
+		if (len) {
+			m[i].iov_base = (char *)(uh_send + 1);
+			m[i].iov_len = len;
+
+			mm[i].msg_hdr.msg_iov = m + i;
+			mm[i].msg_hdr.msg_iovlen = 1;
+		} else {
+			mm[i].msg_hdr.msg_iov = NULL;
+			mm[i].msg_hdr.msg_iovlen = 0;
+		}
 
 		mm[i].msg_hdr.msg_control = NULL;
 		mm[i].msg_hdr.msg_controllen = 0;
-- 
@@ -1075,17 +1075,20 @@ int udp_tap_handler(struct ctx *c, int af, const void *addr,
 		uh_send = packet_get(p, i, 0, sizeof(*uh), &len);
 		if (!uh_send)
 			return p->count;
-		if (!len)
-			continue;
-
-		m[i].iov_base = (char *)(uh_send + 1);
-		m[i].iov_len = len;
 
 		mm[i].msg_hdr.msg_name = sa;
 		mm[i].msg_hdr.msg_namelen = sl;
 
-		mm[i].msg_hdr.msg_iov = m + i;
-		mm[i].msg_hdr.msg_iovlen = 1;
+		if (len) {
+			m[i].iov_base = (char *)(uh_send + 1);
+			m[i].iov_len = len;
+
+			mm[i].msg_hdr.msg_iov = m + i;
+			mm[i].msg_hdr.msg_iovlen = 1;
+		} else {
+			mm[i].msg_hdr.msg_iov = NULL;
+			mm[i].msg_hdr.msg_iovlen = 0;
+		}
 
 		mm[i].msg_hdr.msg_control = NULL;
 		mm[i].msg_hdr.msg_controllen = 0;
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 3/3] test: Simpler termination handling for UDP tests
  2022-09-13  6:37 [PATCH v2 0/3] Don't drop outbound zero-length UDP packets over tap David Gibson
  2022-09-13  6:37 ` [PATCH v2 1/3] udp: Don't pre-initialize msghdr array David Gibson
  2022-09-13  6:37 ` [PATCH v2 2/3] udp: Don't drop zero-length outbound UDP packets David Gibson
@ 2022-09-13  6:37 ` David Gibson
  2 siblings, 0 replies; 4+ messages in thread
From: David Gibson @ 2022-09-13  6:37 UTC (permalink / raw)
  To: passt-dev

[-- Attachment #1: Type: text/plain, Size: 16113 bytes --]

Because UDP is connectionless we don't have an in-built end-of-stream
signal for our connectivity tests.  We work around this by explicitly
adding an end marker to our sample data and killing the listening end once
it is seen.

However, socat has some built-in options - null-eof and shut-null - which
can be used to signal the end of stream with a zero-length UDP packet.
Use these to simplify how the UDP tests are implemented.

Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au>
---
 test/passt/udp       | 23 +++++++-------
 test/passt_in_ns/udp | 73 ++++++++++++++++++++++----------------------
 test/pasta/udp       | 31 +++++++++----------
 3 files changed, 62 insertions(+), 65 deletions(-)

diff --git a/test/passt/udp b/test/passt/udp
index 0253a86..7d444b8 100644
--- a/test/passt/udp
+++ b/test/passt/udp
@@ -11,42 +11,41 @@
 # Copyright (c) 2021 Red Hat GmbH
 # Author: Stefano Brivio <sbrivio(a)redhat.com>
 
-gtools	socat tee grep cat ip jq md5sum cut
-htools	printf dd socat tee grep cat ip jq md5sum cut
+gtools	socat ip jq md5sum cut
+htools	dd socat jq md5sum cut
 
 test	UDP/IPv4: host to guest
 set	TEMP __STATEDIR__/data
-set	SC_PID __STATEDIR__/socat.pid
-guestb	(socat -u UDP4-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
+guestb	socat -u UDP4-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
 sleep	1
-host	dd if=/dev/urandom bs=1k count=5 > __TEMP__ && printf "\nEND_OF_TEST\n" >> __TEMP__
-host	socat -u OPEN:__TEMP__ UDP4:127.0.0.1:10001
+host	dd if=/dev/urandom bs=1k count=5 > __TEMP__
+host	socat -u OPEN:__TEMP__ UDP4:127.0.0.1:10001,shut-null
 guestw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__HOST_MD5__" ]
 
 test	UDP/IPv4: guest to host
-hostb	(socat -u UDP4-LISTEN:10003,bind=127.0.0.1 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP4-LISTEN:10003,bind=127.0.0.1,null-eof OPEN:__TEMP__,create,trunc
 gout	GW ip -j -4 route show|jq -rM '.[] | select(.dst == "default").gateway'
-guest	socat -u OPEN:test.bin UDP4:__GW__:10003
+guest	socat -u OPEN:test.bin UDP4:__GW__:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__HOST_MD5__" ]
 
 test	UDP/IPv6: host to guest
-guestb	(socat -u UDP6-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
+guestb	socat -u UDP6-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
 sleep	1
-host	socat -u OPEN:__TEMP__ UDP6:[::1]:10001
+host	socat -u OPEN:__TEMP__ UDP6:[::1]:10001,shut-null
 guestw
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__HOST_MD5__" ]
 
 test	UDP/IPv6: guest to host
-hostb	(socat -u UDP6-LISTEN:10003,bind=[::1] STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,bind=[::1],null-eof OPEN:__TEMP__,create,trunc
 gout	GW6 ip -j -6 route show|jq -rM '.[] | select(.dst == "default").gateway'
 gout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-guest	socat -u OPEN:test.bin UDP6:[__GW6__%__IFNAME__]:10003
+guest	socat -u OPEN:test.bin UDP6:[__GW6__%__IFNAME__]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__HOST_MD5__" ]
diff --git a/test/passt_in_ns/udp b/test/passt_in_ns/udp
index 3b1e521..5f01cbf 100644
--- a/test/passt_in_ns/udp
+++ b/test/passt_in_ns/udp
@@ -11,17 +11,16 @@
 # Copyright (c) 2021 Red Hat GmbH
 # Author: Stefano Brivio <sbrivio(a)redhat.com>
 
-gtools	socat tee grep cat ip jq md5sum cut
-nstools	socat tee grep cat ip jq md5sum cut
-htools	printf dd socat tee grep cat ip jq md5sum cut
+gtools	socat ip jq md5sum cut
+nstools	socat ip jq md5sum cut
+htools	dd socat ip jq md5sum cut
 
 test	UDP/IPv4: host to guest
 set	TEMP __STATEDIR__/data
-set	SC_PID __STATEDIR__/socat.pid
-guestb	(socat -u UDP4-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
+guestb	socat -u UDP4-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
 sleep	1
-host	dd if=/dev/urandom bs=1k count=5 > __TEMP__ && printf "\nEND_OF_TEST\n" >> __TEMP__
-host	socat -u OPEN:__TEMP__ UDP4:127.0.0.1:10001
+host	dd if=/dev/urandom bs=1k count=5 > __TEMP__
+host	socat -u OPEN:__TEMP__ UDP4:127.0.0.1:10001,shut-null
 guestw
 hout	MD5 md5sum __TEMP__ | cut -d' ' -f1
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
@@ -29,114 +28,114 @@ check	[ "__GUEST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: host to ns
 set	TEMP_NS __STATEDIR__/data_ns
-nsb	(socat -u UDP4-LISTEN:10002 STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-host	socat -u OPEN:__TEMP__ UDP4:127.0.0.1:10002
+nsb	socat -u UDP4-LISTEN:10002,null-eof OPEN:__TEMP_NS__,create,trunc
+host	socat -u OPEN:__TEMP__ UDP4:127.0.0.1:10002,shut-null
 nsw
 nsout	NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1
 check	[ "__NS_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: guest to host
-hostb	(socat -u UDP4-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP4-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 gout	GW ip -j -4 route show|jq -rM '.[] | select(.dst == "default").gateway'
-guest	socat -u OPEN:test.bin UDP4:__GW__:10003
+guest	socat -u OPEN:test.bin UDP4:__GW__:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: guest to ns
-nsb	(socat -u UDP4-LISTEN:10002 STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-guest	socat -u OPEN:test.bin UDP4:__GW__:10002
+nsb	socat -u UDP4-LISTEN:10002,null-eof OPEN:__TEMP_NS__,create,trunc
+guest	socat -u OPEN:test.bin UDP4:__GW__:10002,shut-null
 nsw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to host (recvmmsg/sendmmsg)
 sleep	1
-hostb	(socat -u UDP4-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-ns	socat -u OPEN:__TEMP_NS__ UDP4:127.0.0.1:10003
+hostb	socat -u UDP4-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
+ns	socat -u OPEN:__TEMP_NS__ UDP4:127.0.0.1:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to host (via tap)
-hostb	(socat -u UDP4-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-ns	socat -u OPEN:__TEMP_NS__ UDP4:__GW__:10003
+hostb	socat -u UDP4-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
+ns	socat -u OPEN:__TEMP_NS__ UDP4:__GW__:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to guest (using loopback address)
-guestb	(socat -u UDP4-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
-ns	socat -u OPEN:__TEMP_NS__ UDP4:127.0.0.1:10001
+guestb	socat -u UDP4-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
+ns	socat -u OPEN:__TEMP_NS__ UDP4:127.0.0.1:10001,shut-null
 guestw
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to guest (using namespace address)
-guestb	(socat -u UDP4-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
+guestb	socat -u UDP4-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
 nsout	ADDR ip -j -4 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local'
-ns	socat -u OPEN:__TEMP_NS__ UDP4:__ADDR__:10001
+ns	socat -u OPEN:__TEMP_NS__ UDP4:__ADDR__:10001,shut-null
 guestw
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: host to guest
-guestb	(socat -u UDP6-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
-host	socat -u OPEN:__TEMP__ UDP6:[::1]:10001
+guestb	socat -u UDP6-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
+host	socat -u OPEN:__TEMP__ UDP6:[::1]:10001,shut-null
 guestw
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: host to ns
-nsb	(socat -u UDP6-LISTEN:10002 STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-host	socat -u OPEN:__TEMP__ UDP6:[::1]:10002
+nsb	socat -u UDP6-LISTEN:10002,null-eof OPEN:__TEMP_NS__,create,trunc
+host	socat -u OPEN:__TEMP__ UDP6:[::1]:10002,shut-null
 nsw
 nsout	NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1
 check	[ "__NS_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: guest to host
-hostb	(socat -u UDP6-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 gout	GW6 ip -j -6 route show|jq -rM '.[] | select(.dst == "default").gateway'
 gout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-guest	socat -u OPEN:test.bin UDP6:[__GW6__%__IFNAME__]:10003
+guest	socat -u OPEN:test.bin UDP6:[__GW6__%__IFNAME__]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: guest to ns
-nsb	(socat -u UDP6-LISTEN:10002 STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-guest	socat -u OPEN:test.bin UDP6:[__GW6__%__IFNAME__]:10002
+nsb	socat -u UDP6-LISTEN:10002,null-eof OPEN:__TEMP_NS__,create,trunc
+guest	socat -u OPEN:test.bin UDP6:[__GW6__%__IFNAME__]:10002,shut-null
 nsw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to host (recvmmsg/sendmmsg)
-hostb	(socat -u UDP6-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10003
+hostb	socat -u UDP6-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to host (via tap)
-hostb	(socat -u UDP6-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[__GW6__%__IFNAME__]:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[__GW6__%__IFNAME__]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to guest (using loopback address)
-guestb	(socat -u UDP6-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10001
+guestb	socat -u UDP6-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10001,shut-null
 guestw
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to guest (using namespace address)
-guestb	(socat -u UDP6-LISTEN:10001 STDOUT & echo $! > sc.pid) | tee test.bin | (grep -qm1 "END_OF_TEST" && kill $(cat sc.pid))
+guestb	socat -u UDP6-LISTEN:10001,null-eof OPEN:test.bin,create,trunc
 nsout	ADDR6 ip -j -6 addr show|jq -rM '.[] | select(.ifname == "__IFNAME__").addr_info[0].local'
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[__ADDR6__]:10001
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[__ADDR6__]:10001,shut-null
 guestw
 gout	GUEST_MD5 md5sum test.bin | cut -d' ' -f1
 check	[ "__GUEST_MD5__" = "__MD5__" ]
diff --git a/test/pasta/udp b/test/pasta/udp
index 74148e3..fc6bf0a 100644
--- a/test/pasta/udp
+++ b/test/pasta/udp
@@ -11,59 +11,58 @@
 # Copyright (c) 2021 Red Hat GmbH
 # Author: Stefano Brivio <sbrivio(a)redhat.com>
 
-nstools	socat tee grep cat ip jq md5sum cut
-htools	printf dd socat tee grep cat ip jq md5sum cut
+nstools	socat ip jq md5sum cut
+htools	dd socat ip jq md5sum cut
 
 test	UDP/IPv4: host to ns
 set	TEMP __STATEDIR__/data
 set	TEMP_NS __STATEDIR__/data_ns
-set	SC_PID __STATEDIR__/socat.pid
-nsb	(socat -u UDP4-LISTEN:10002,bind=127.0.0.1 STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-host	dd if=/dev/urandom bs=1k count=5 > __TEMP__ && printf "\nEND_OF_TEST\n" >> __TEMP__
+nsb	socat -u UDP4-LISTEN:10002,bind=127.0.0.1,null-eof OPEN:__TEMP_NS__,create,trunc
+host	dd if=/dev/urandom bs=1k count=5 > __TEMP__
 
-host	socat OPEN:__TEMP__ UDP4:127.0.0.1:10002
+host	socat OPEN:__TEMP__ UDP4:127.0.0.1:10002,shut-null
 nsw
 hout	MD5 md5sum __TEMP__ | cut -d' ' -f1
 nsout	NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1
 check	[ "__NS_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to host (recvmmsg/sendmmsg)
-hostb	(socat -u UDP4-LISTEN:10003,bind=127.0.0.1 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP4-LISTEN:10003,bind=127.0.0.1,null-eof OPEN:__TEMP__,create,trunc
 sleep	1
-ns	socat OPEN:__TEMP_NS__ UDP4:127.0.0.1:10003
+ns	socat OPEN:__TEMP_NS__ UDP4:127.0.0.1:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to host (via tap)
-hostb	(socat -u UDP4-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP4-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 nsout	GW ip -j -4 route show|jq -rM '.[] | select(.dst == "default").gateway'
-ns	socat -u OPEN:__TEMP_NS__ UDP4:__GW__:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP4:__GW__:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: host to ns
-nsb	(socat -u UDP6-LISTEN:10002,bind=[::1] STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-host	socat -u OPEN:__TEMP__ UDP6:[::1]:10002
+nsb	socat -u UDP6-LISTEN:10002,bind=[::1],null-eof OPEN:__TEMP_NS__,create,trunc
+host	socat -u OPEN:__TEMP__ UDP6:[::1]:10002,shut-null
 nsw
 hout	MD5 md5sum __TEMP__ | cut -d' ' -f1
 nsout	NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1
 check	[ "__NS_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to host (recvmmsg/sendmmsg)
-hostb	(socat -u UDP6-LISTEN:10003,bind=[::1] STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,bind=[::1],null-eof OPEN:__TEMP__,create,trunc
 sleep	1
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to host (via tap)
-hostb	(socat -u UDP6-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 nsout	GW6 ip -j -6 route show|jq -rM '.[] | select(.dst == "default").gateway'
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[__GW6__%__IFNAME__]:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[__GW6__%__IFNAME__]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
-- 
@@ -11,59 +11,58 @@
 # Copyright (c) 2021 Red Hat GmbH
 # Author: Stefano Brivio <sbrivio(a)redhat.com>
 
-nstools	socat tee grep cat ip jq md5sum cut
-htools	printf dd socat tee grep cat ip jq md5sum cut
+nstools	socat ip jq md5sum cut
+htools	dd socat ip jq md5sum cut
 
 test	UDP/IPv4: host to ns
 set	TEMP __STATEDIR__/data
 set	TEMP_NS __STATEDIR__/data_ns
-set	SC_PID __STATEDIR__/socat.pid
-nsb	(socat -u UDP4-LISTEN:10002,bind=127.0.0.1 STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-host	dd if=/dev/urandom bs=1k count=5 > __TEMP__ && printf "\nEND_OF_TEST\n" >> __TEMP__
+nsb	socat -u UDP4-LISTEN:10002,bind=127.0.0.1,null-eof OPEN:__TEMP_NS__,create,trunc
+host	dd if=/dev/urandom bs=1k count=5 > __TEMP__
 
-host	socat OPEN:__TEMP__ UDP4:127.0.0.1:10002
+host	socat OPEN:__TEMP__ UDP4:127.0.0.1:10002,shut-null
 nsw
 hout	MD5 md5sum __TEMP__ | cut -d' ' -f1
 nsout	NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1
 check	[ "__NS_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to host (recvmmsg/sendmmsg)
-hostb	(socat -u UDP4-LISTEN:10003,bind=127.0.0.1 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP4-LISTEN:10003,bind=127.0.0.1,null-eof OPEN:__TEMP__,create,trunc
 sleep	1
-ns	socat OPEN:__TEMP_NS__ UDP4:127.0.0.1:10003
+ns	socat OPEN:__TEMP_NS__ UDP4:127.0.0.1:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv4: ns to host (via tap)
-hostb	(socat -u UDP4-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP4-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 nsout	GW ip -j -4 route show|jq -rM '.[] | select(.dst == "default").gateway'
-ns	socat -u OPEN:__TEMP_NS__ UDP4:__GW__:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP4:__GW__:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: host to ns
-nsb	(socat -u UDP6-LISTEN:10002,bind=[::1] STDOUT & echo $! > __SC_PID__) | tee __TEMP_NS__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
-host	socat -u OPEN:__TEMP__ UDP6:[::1]:10002
+nsb	socat -u UDP6-LISTEN:10002,bind=[::1],null-eof OPEN:__TEMP_NS__,create,trunc
+host	socat -u OPEN:__TEMP__ UDP6:[::1]:10002,shut-null
 nsw
 hout	MD5 md5sum __TEMP__ | cut -d' ' -f1
 nsout	NS_MD5 md5sum __TEMP_NS__ | cut -d' ' -f1
 check	[ "__NS_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to host (recvmmsg/sendmmsg)
-hostb	(socat -u UDP6-LISTEN:10003,bind=[::1] STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,bind=[::1],null-eof OPEN:__TEMP__,create,trunc
 sleep	1
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[::1]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
 
 test	UDP/IPv6: ns to host (via tap)
-hostb	(socat -u UDP6-LISTEN:10003 STDOUT & echo $! > __SC_PID__) | tee __TEMP__ | (grep -qm1 "END_OF_TEST" && kill $(cat __SC_PID__))
+hostb	socat -u UDP6-LISTEN:10003,null-eof OPEN:__TEMP__,create,trunc
 nsout	GW6 ip -j -6 route show|jq -rM '.[] | select(.dst == "default").gateway'
 nsout	IFNAME ip -j link show | jq -rM '.[] | select(.link_type == "ether").ifname'
-ns	socat -u OPEN:__TEMP_NS__ UDP6:[__GW6__%__IFNAME__]:10003
+ns	socat -u OPEN:__TEMP_NS__ UDP6:[__GW6__%__IFNAME__]:10003,shut-null
 hostw
 hout	HOST_MD5 md5sum __TEMP__ | cut -d' ' -f1
 check	[ "__HOST_MD5__" = "__MD5__" ]
-- 
2.37.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-09-13  6:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-13  6:37 [PATCH v2 0/3] Don't drop outbound zero-length UDP packets over tap David Gibson
2022-09-13  6:37 ` [PATCH v2 1/3] udp: Don't pre-initialize msghdr array David Gibson
2022-09-13  6:37 ` [PATCH v2 2/3] udp: Don't drop zero-length outbound UDP packets David Gibson
2022-09-13  6:37 ` [PATCH v2 3/3] test: Simpler termination handling for UDP tests David Gibson

Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).