CVS commit: src/tests/net/mcast

2015-02-27 Thread Martin Husemann
Module Name:src
Committed By:   martin
Date:   Fri Feb 27 13:15:49 UTC 2015

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Bump timeout for a poll() call slightly, so the test has a chance to work
on slow machines.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.10 src/tests/net/mcast/t_mcast.c:1.11
--- src/tests/net/mcast/t_mcast.c:1.10	Mon Oct 27 21:28:58 2014
+++ src/tests/net/mcast/t_mcast.c	Fri Feb 27 13:15:49 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.10 2014/10/27 21:28:58 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.11 2015/02/27 13:15:49 martin Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.10 2014/10/27 21:28:58 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.11 2015/02/27 13:15:49 martin Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -275,7 +275,7 @@ receiver(const char *host, const char *p
 	pfd.fd = s;
 	pfd.events = POLLIN;
 	for (seq = 0; seq < n; seq++) {
-		if (poll(&pfd, 1, 1000) == -1)
+		if (poll(&pfd, 1, 1) == -1)
 			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
 		l = conn ? recv(s, &msg, sizeof(msg), 0) :
 		recvfrom(s, &msg, sizeof(msg), 0, (void *)&ss, &slen);



CVS commit: src/tests/net/mcast

2015-05-17 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Sun May 17 15:48:57 UTC 2015

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Save errno for errx


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.11 src/tests/net/mcast/t_mcast.c:1.12
--- src/tests/net/mcast/t_mcast.c:1.11	Fri Feb 27 13:15:49 2015
+++ src/tests/net/mcast/t_mcast.c	Sun May 17 15:48:57 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.11 2015/02/27 13:15:49 martin Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.12 2015/05/17 15:48:57 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.11 2015/02/27 13:15:49 martin Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.12 2015/05/17 15:48:57 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -186,7 +186,7 @@ getsocket(const char *host, const char *
 int (*f)(int, const struct sockaddr *, socklen_t), socklen_t *slen,
 bool bug)
 {
-	int e, s;
+	int e, s, lasterrno = 0;
 	struct addrinfo hints, *ai0, *ai;
 	const char *cause = "?";
 
@@ -202,6 +202,7 @@ getsocket(const char *host, const char *
 	for (ai = ai0; ai; ai = ai->ai_next) {
 		s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
 		if (s == -1) {
+			lasterrno = errno;
 			cause = "socket";
 			continue;
 		}
@@ -220,13 +221,14 @@ getsocket(const char *host, const char *
 		*slen = ai->ai_addrlen;
 		break;
 out:
+		lasterrno = errno;
 		close(s);
 		s = -1;
 		continue;
 	}
 	freeaddrinfo(ai0);
 	if (s == -1)
-		ERRX(1, "%s (%s)", cause, strerror(errno));
+		ERRX(1, "%s (%s)", cause, strerror(lasterrno));
 	return s;
 }
 



CVS commit: src/tests/net/mcast

2015-05-17 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Mon May 18 00:55:09 UTC 2015

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
KNF

Tweaks of whitespaces and tabs.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.12 src/tests/net/mcast/t_mcast.c:1.13
--- src/tests/net/mcast/t_mcast.c:1.12	Sun May 17 15:48:57 2015
+++ src/tests/net/mcast/t_mcast.c	Mon May 18 00:55:09 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.12 2015/05/17 15:48:57 ozaki-r Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.13 2015/05/18 00:55:09 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.12 2015/05/17 15:48:57 ozaki-r Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.13 2015/05/18 00:55:09 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -88,12 +88,12 @@ struct message {
 static int
 addmc(int s, struct addrinfo *ai, bool bug)
 {
-	struct ip_mreq 	m4;
+	struct ip_mreq m4;
 	struct ipv6_mreq m6;
 	struct sockaddr_in *s4;
 	struct sockaddr_in6 *s6;
 	unsigned int ifc;
-	
+
 	switch (ai->ai_family) {
 	case AF_INET:
 		s4 = (void *)ai->ai_addr;
@@ -127,11 +127,11 @@ addmc(int s, struct addrinfo *ai, bool b
 		ifc = 1;
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
 		&ifc, sizeof(ifc)) == -1)
-			return -1;
+			return -1;
 		ifc = 224;
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
 		&ifc, sizeof(ifc)) == -1)
-			return -1;
+			return -1;
 		ifc = 1;
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifc,
 		sizeof(ifc)) == -1)
@@ -140,7 +140,7 @@ addmc(int s, struct addrinfo *ai, bool b
 		ifc = 1;
 #endif
 		m6.ipv6mr_interface = ifc;
-	m6.ipv6mr_multiaddr = s6->sin6_addr;
+		m6.ipv6mr_multiaddr = s6->sin6_addr;
 		return setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP,
 		&m6, sizeof(m6));
 	default:
@@ -467,14 +467,14 @@ ATF_TC_BODY(unconninet6, tc)
 ATF_TP_ADD_TCS(tp)
 {
 	debug++;
-ATF_TP_ADD_TC(tp, conninet4);
-ATF_TP_ADD_TC(tp, connmappedinet4);
-ATF_TP_ADD_TC(tp, connmappedbuginet4);
-ATF_TP_ADD_TC(tp, conninet6);
-ATF_TP_ADD_TC(tp, unconninet4);
-ATF_TP_ADD_TC(tp, unconnmappedinet4);
-ATF_TP_ADD_TC(tp, unconnmappedbuginet4);
-ATF_TP_ADD_TC(tp, unconninet6);
+	ATF_TP_ADD_TC(tp, conninet4);
+	ATF_TP_ADD_TC(tp, connmappedinet4);
+	ATF_TP_ADD_TC(tp, connmappedbuginet4);
+	ATF_TP_ADD_TC(tp, conninet6);
+	ATF_TP_ADD_TC(tp, unconninet4);
+	ATF_TP_ADD_TC(tp, unconnmappedinet4);
+	ATF_TP_ADD_TC(tp, unconnmappedbuginet4);
+	ATF_TP_ADD_TC(tp, unconninet6);
 
 	return atf_no_error();
 }



CVS commit: src/tests/net/mcast

2015-05-18 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Tue May 19 03:19:27 UTC 2015

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Use EXIT_FAILURE instead of 1


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.13 src/tests/net/mcast/t_mcast.c:1.14
--- src/tests/net/mcast/t_mcast.c:1.13	Mon May 18 00:55:09 2015
+++ src/tests/net/mcast/t_mcast.c	Tue May 19 03:19:27 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.13 2015/05/18 00:55:09 ozaki-r Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.14 2015/05/19 03:19:27 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.13 2015/05/18 00:55:09 ozaki-r Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.14 2015/05/19 03:19:27 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -228,7 +228,7 @@ out:
 	}
 	freeaddrinfo(ai0);
 	if (s == -1)
-		ERRX(1, "%s (%s)", cause, strerror(lasterrno));
+		ERRX(EXIT_FAILURE, "%s (%s)", cause, strerror(lasterrno));
 	return s;
 }
 



CVS commit: src/tests/net/mcast

2015-05-18 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Tue May 19 04:14:04 UTC 2015

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Handle child's exit status precisely


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.14 src/tests/net/mcast/t_mcast.c:1.15
--- src/tests/net/mcast/t_mcast.c:1.14	Tue May 19 03:19:27 2015
+++ src/tests/net/mcast/t_mcast.c	Tue May 19 04:14:04 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.14 2015/05/19 03:19:27 ozaki-r Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.15 2015/05/19 04:14:04 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.14 2015/05/19 03:19:27 ozaki-r Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.15 2015/05/19 04:14:04 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -316,9 +316,25 @@ run(const char *host, const char *port, 
 strerror(errno));
 			goto again;
 		default:
-			if (status != 0)
-ERRX(EXIT_FAILURE, "pid exited with %d",
+			if (WIFSIGNALED(status)) {
+if (WTERMSIG(status) == SIGTERM)
+	ERRX(EXIT_FAILURE,
+	"receiver got terminated due to " \
+	"deadline (%d usec)", 100);
+else
+	ERRX(EXIT_FAILURE,
+	"receiver got signaled (%s)",
+	strsignal(WTERMSIG(status)));
+			} else if (WIFEXITED(status)) {
+if (WEXITSTATUS(status) != 0)
+	ERRX(EXIT_FAILURE,
+	"receiver exited with status %d",
+	WEXITSTATUS(status));
+			} else {
+ERRX(EXIT_FAILURE,
+"receiver exited with unexpected status %d",
 status);
+			}
 			break;
 		}
 		return;



CVS commit: src/tests/net/mcast

2015-05-25 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Mon May 25 07:17:17 UTC 2015

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Fix specifying an interface for IPV6_JOIN_GROUP

Using always an interface of index=1 is not good idea; it varies
depending on runtime environments. We can use index=0 instead,
which allows the kernel to pick an appropriate interface for mcast.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.15 src/tests/net/mcast/t_mcast.c:1.16
--- src/tests/net/mcast/t_mcast.c:1.15	Tue May 19 04:14:04 2015
+++ src/tests/net/mcast/t_mcast.c	Mon May 25 07:17:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.15 2015/05/19 04:14:04 ozaki-r Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.16 2015/05/25 07:17:17 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.15 2015/05/19 04:14:04 ozaki-r Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.16 2015/05/25 07:17:17 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -132,12 +132,12 @@ addmc(int s, struct addrinfo *ai, bool b
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
 		&ifc, sizeof(ifc)) == -1)
 			return -1;
-		ifc = 1;
+		ifc = 1; /* XXX should pick a proper interface */
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifc,
 		sizeof(ifc)) == -1)
 			return -1;
 #else
-		ifc = 1;
+		ifc = 0; /* Let pick an appropriate interface */
 #endif
 		m6.ipv6mr_interface = ifc;
 		m6.ipv6mr_multiaddr = s6->sin6_addr;



CVS commit: src/tests/net/mcast

2015-05-28 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Thu May 28 08:32:53 UTC 2015

Modified Files:
src/tests/net/mcast: mcast.c

Log Message:
Detail an error message


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/net/mcast/mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/mcast.c
diff -u src/tests/net/mcast/mcast.c:1.1 src/tests/net/mcast/mcast.c:1.2
--- src/tests/net/mcast/mcast.c:1.1	Tue May 26 00:42:07 2015
+++ src/tests/net/mcast/mcast.c	Thu May 28 08:32:53 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcast.c,v 1.1 2015/05/26 00:42:07 ozaki-r Exp $	*/
+/*	$NetBSD: mcast.c,v 1.2 2015/05/28 08:32:53 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: mcast.c,v 1.1 2015/05/26 00:42:07 ozaki-r Exp $");
+__RCSID("$NetBSD: mcast.c,v 1.2 2015/05/28 08:32:53 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -286,7 +286,8 @@ receiver(const char *host, const char *p
 		if (debug)
 			show("got", &msg);
 		if (seq != msg.seq)
-			ERRX(EXIT_FAILURE, "seq %zu != %zu", seq, msg.seq);
+			ERRX(EXIT_FAILURE, "seq: expect=%zu actual=%zu",
+			seq, msg.seq);
 	}
 }
 



CVS commit: src/tests/net/mcast

2015-05-28 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Thu May 28 10:19:17 UTC 2015

Modified Files:
src/tests/net/mcast: mcast.c

Log Message:
Make the test stable under load or when running on a slow machine

Let sender and receiver synchronize explicitly via a socketpair
and don't rely on sleep.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/net/mcast/mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/mcast.c
diff -u src/tests/net/mcast/mcast.c:1.2 src/tests/net/mcast/mcast.c:1.3
--- src/tests/net/mcast/mcast.c:1.2	Thu May 28 08:32:53 2015
+++ src/tests/net/mcast/mcast.c	Thu May 28 10:19:17 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcast.c,v 1.2 2015/05/28 08:32:53 ozaki-r Exp $	*/
+/*	$NetBSD: mcast.c,v 1.3 2015/05/28 10:19:17 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: mcast.c,v 1.2 2015/05/28 08:32:53 ozaki-r Exp $");
+__RCSID("$NetBSD: mcast.c,v 1.3 2015/05/28 10:19:17 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -59,6 +59,7 @@ extern const char *__progname;
 #include 
 
 #define ERRX(ev, msg, ...)	ATF_REQUIRE_MSG(0, msg, __VA_ARGS__)
+#define ERRX0(ev, msg)		ATF_REQUIRE_MSG(0, msg)
 
 #define SKIPX(ev, msg, ...)	do {			\
 	atf_tc_skip(msg, __VA_ARGS__);			\
@@ -67,6 +68,7 @@ extern const char *__progname;
 
 #else
 #define ERRX(ev, msg, ...)	errx(ev, msg, __VA_ARGS__)
+#define ERRX0(ev, msg)		errx(ev, msg)
 #define SKIPX(ev, msg, ...)	errx(ev, msg, __VA_ARGS__)
 #endif
 
@@ -232,8 +234,38 @@ out:
 	return s;
 }
 
-static void
-sender(const char *host, const char *port, size_t n, bool conn, bool bug)
+static int
+synchronize(const int fd, bool waiter)
+{
+	int syncmsg = 0;
+	int r;
+	struct pollfd pfd;
+
+	if (waiter) {
+		pfd.fd = fd;
+		pfd.events = POLLIN;
+
+		/* We use poll to avoid lock up when the peer died unexpectedly */
+		r = poll(&pfd, 1, 1);
+		if (r == -1)
+			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
+		if (r == 0)
+			/* Timed out */
+			return -1;
+
+		if (read(fd, &syncmsg, sizeof(syncmsg)) == -1)
+			ERRX(EXIT_FAILURE, "read (%s)", strerror(errno));
+	} else {
+		if (write(fd, &syncmsg, sizeof(syncmsg)) == -1)
+			ERRX(EXIT_FAILURE, "write (%s)", strerror(errno));
+	}
+
+	return 0;
+}
+
+static int
+sender(const int fd, const char *host, const char *port, size_t n, bool conn,
+bool bug)
 {
 	int s;
 	ssize_t l;
@@ -242,6 +274,11 @@ sender(const char *host, const char *por
 	socklen_t slen;
 
 	s = getsocket(host, port, conn ? connect : connector, &slen, bug);
+
+	/* Wait until receiver gets ready. */
+	if (synchronize(fd, true) == -1)
+		return -1;
+
 	for (msg.seq = 0; msg.seq < n; msg.seq++) {
 #ifdef CLOCK_MONOTONIC
 		if (clock_gettime(CLOCK_MONOTONIC, &msg.ts) == -1)
@@ -261,10 +298,17 @@ sender(const char *host, const char *por
 			ERRX(EXIT_FAILURE, "send (%s)", strerror(errno));
 		usleep(100);
 	}
+
+	/* Wait until receiver finishes its work. */
+	if (synchronize(fd, true) == -1)
+		return -1;
+
+	return 0;
 }
 
 static void
-receiver(const char *host, const char *port, size_t n, bool conn, bool bug)
+receiver(const int fd, const char *host, const char *port, size_t n, bool conn,
+bool bug)
 {
 	int s;
 	ssize_t l;
@@ -276,6 +320,10 @@ receiver(const char *host, const char *p
 	s = getsocket(host, port, bind, &slen, bug);
 	pfd.fd = s;
 	pfd.events = POLLIN;
+
+	/* Tell I'm ready */
+	synchronize(fd, false);
+
 	for (seq = 0; seq < n; seq++) {
 		if (poll(&pfd, 1, 1) == -1)
 			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
@@ -289,6 +337,9 @@ receiver(const char *host, const char *p
 			ERRX(EXIT_FAILURE, "seq: expect=%zu actual=%zu",
 			seq, msg.seq);
 	}
+
+	/* Tell I'm finished */
+	synchronize(fd, false);
 }
 
 static void
@@ -296,22 +347,32 @@ run(const char *host, const char *port, 
 {
 	pid_t pid;
 	int status;
+	int syncfds[2];
+	int error;
+
+	if (socketpair(AF_UNIX, SOCK_STREAM, 0, syncfds) == -1)
+		ERRX(EXIT_FAILURE, "socketpair (%s)", strerror(errno));
 
 	switch ((pid = fork())) {
 	case 0:
-		receiver(host, port, n, conn, bug);
+		receiver(syncfds[0], host, port, n, conn, bug);
 		return;
 	case -1:
 		ERRX(EXIT_FAILURE, "fork (%s)", strerror(errno));
 	default:
-		usleep(1000);
-		sender(host, port, n, conn, bug);
-		usleep(100);
+		error = sender(syncfds[1], host, port, n, conn, bug);
 	again:
 		switch (waitpid(pid, &status, WNOHANG)) {
 		case -1:
 			ERRX(EXIT_FAILURE, "wait (%s)", strerror(errno));
 		case 0:
+			if (error == 0)
+/*
+ * Receiver is still alive, but we know
+ * it will exit soon.
+ */
+goto again;
+
 			if (kill(pid, SIGTERM) == -1)
 ERRX(EXIT_FAILURE, "kill (%s)",
 strerror(errno));
@@ -319,9 +380,9 @@ run(const char *host, const char *port, 
 		default:
 			if (WIFSIGNALED(status)) {

CVS commit: src/tests/net/mcast

2016-08-10 Thread Robert Elz
Module Name:src
Committed By:   kre
Date:   Wed Aug 10 22:45:39 UTC 2016

Modified Files:
src/tests/net/mcast: t_mcast.sh

Log Message:
+ -lrumpdev


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/net/mcast/t_mcast.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.sh
diff -u src/tests/net/mcast/t_mcast.sh:1.1 src/tests/net/mcast/t_mcast.sh:1.2
--- src/tests/net/mcast/t_mcast.sh:1.1	Tue May 26 00:42:07 2015
+++ src/tests/net/mcast/t_mcast.sh	Wed Aug 10 22:45:39 2016
@@ -1,4 +1,4 @@
-#	$NetBSD: t_mcast.sh,v 1.1 2015/05/26 00:42:07 ozaki-r Exp $
+#	$NetBSD: t_mcast.sh,v 1.2 2016/08/10 22:45:39 kre Exp $
 #
 # Copyright (c) 2015 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -27,6 +27,7 @@
 
 netserver="rump_server -lrumpnet -lrumpnet_net"
 netserver="$netserver -lrumpnet_netinet -lrumpnet_netinet6 -lrumpnet_shmif"
+netserver="$netserver -lrumpdev"
 export RUMP_SERVER=unix://commsock
 
 DEBUG=false



CVS commit: src/tests/net/mcast

2014-10-12 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sun Oct 12 13:48:26 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Add the simple unconnected tests too.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.1 src/tests/net/mcast/t_mcast.c:1.2
--- src/tests/net/mcast/t_mcast.c:1.1	Sat Oct 11 19:04:42 2014
+++ src/tests/net/mcast/t_mcast.c	Sun Oct 12 09:48:25 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.1 2014/10/11 23:04:42 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.2 2014/10/12 13:48:25 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include 
-__RCSID("$NetBSD: t_mcast.c,v 1.1 2014/10/11 23:04:42 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.2 2014/10/12 13:48:25 christos Exp $");
 
 #include 
 #include 
@@ -45,6 +45,7 @@ __RCSID("$NetBSD: t_mcast.c,v 1.1 2014/1
 #include 
 #include 
 #include 
+#include 
 
 #ifndef TEST
 #include 
@@ -125,6 +126,15 @@ allowv4mapped(int s, struct addrinfo *ai
 	return setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero));
 }
 
+static struct sockaddr_storage ss;
+static int
+connector(int fd, const struct sockaddr *sa, socklen_t slen)
+{
+	assert(sizeof(ss) > slen);
+	memcpy(&ss, sa, slen);
+	return 0;
+}
+
 static int
 getsocket(const char *host, const char *port,
 int (*f)(int, const struct sockaddr *, socklen_t))
@@ -156,7 +166,7 @@ getsocket(const char *host, const char *
 			cause = f == bind ? "bind" : "connect";
 			goto out;
 		}
-		if (f == bind && addmc(s, ai) == -1) {
+		if ((f == bind || f == connector) && addmc(s, ai) == -1) {
 			cause = "join group";
 			goto out;
 		}
@@ -173,20 +183,21 @@ out:
 }
 
 static void
-sender(const char *host, const char *port, size_t n)
+sender(const char *host, const char *port, size_t n, bool conn)
 {
 	int s;
 	ssize_t l;
 	size_t seq;
 	char buf[64];
 
-	s = getsocket(host, port, connect);
+	s = getsocket(host, port, conn ? connect : connector);
 	for (seq = 0; seq < n; seq++) {
 		time_t t = time(&t);
 		snprintf(buf, sizeof(buf), "%zu: %-24.24s", seq, ctime(&t));
 		if (debug)
 			printf("sending: %s\n", buf);
-		l = send(s, buf, sizeof(buf), 0);
+		l = conn ? send(s, buf, sizeof(buf), 0) :
+		sendto(s, buf, sizeof(buf), 0, (void *)&ss, ss.ss_len);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "send (%s)", strerror(errno));
 		usleep(100);
@@ -194,21 +205,24 @@ sender(const char *host, const char *por
 }
 
 static void
-receiver(const char *host, const char *port, size_t n)
+receiver(const char *host, const char *port, size_t n, bool conn)
 {
 	int s;
 	ssize_t l;
 	size_t seq;
 	char buf[64];
 	struct pollfd pfd;
+	socklen_t slen;
 
-	s = getsocket(host, port, bind);
+	s = getsocket(host, port, conn ? bind : connector);
 	pfd.fd = s;
 	pfd.events = POLLIN;
 	for (seq = 0; seq < n; seq++) {
 		if (poll(&pfd, 1, 1000) == -1)
 			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
-		l = recv(s, buf, sizeof(buf), 0);
+		slen = ss.ss_len;
+		l = conn ? recv(s, buf, sizeof(buf), 0) :
+		recvfrom(s, buf, sizeof(buf), 0, (void *)&ss, &slen);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "recv (%s)", strerror(errno));
 		if (debug)
@@ -217,17 +231,17 @@ receiver(const char *host, const char *p
 }
 
 static void
-run(const char *host, const char *port, size_t n)
+run(const char *host, const char *port, size_t n, bool conn)
 {
 	switch (fork()) {
 	case 0:
-		receiver(host, port, n);
+		receiver(host, port, n, conn);
 		return;
 	case -1:
 		ERRX(EXIT_FAILURE, "fork (%s)", strerror(errno));
 	default:
 		usleep(100);
-		sender(host, port, n);
+		sender(host, port, n, conn);
 		return;
 	}
 }
@@ -239,12 +253,14 @@ main(int argc, char *argv[])
 	const char *host, *port;
 	int c;
 	size_t n;
+	bool conn;
 
 	host = HOST_V4;
 	port = PORT_V4;
 	n = TOTAL;
+	conn = false;
 
-	while ((c = getopt(argc, argv, "46dmn:")) != -1)
+	while ((c = getopt(argc, argv, "46cdmn:")) != -1)
 		switch (c) {
 		case '4':
 			host = HOST_V4;
@@ -254,6 +270,9 @@ main(int argc, char *argv[])
 			host = HOST_V6;
 			port = PORT_V6;
 			break;
+		case 'c':
+			conn = true;
+			break;
 		case 'd':
 			debug++;
 			break;
@@ -265,54 +284,90 @@ main(int argc, char *argv[])
 			n = atoi(optarg);
 			break;
 		default:
-			fprintf(stderr, "Usage: %s [-dm46] [-n ]",
+			fprintf(stderr, "Usage: %s [-cdm46] [-n ]",
 			getprogname());
 			return 1;
 		}
 
-	run(host, port, n);
+	run(host, port, n, conn);
 	return 0;
 }
 #else
 
-ATF_TC(inet4);
-ATF_TC_HEAD(inet4, tc)
+ATF_TC(conninet4);
+ATF_TC_HEAD(conninet4, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Checks connected multicast for ipv4");
+}
+
+ATF_TC_BODY(conninet4, tc)
+{
+	run(HOST_V4, PORT_V4, TOTAL, true);
+}
+
+ATF_TC(connmap

CVS commit: src/tests/net/mcast

2014-10-12 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sun Oct 12 14:53:46 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Explain a bit more what's going on with the multicast setsockopts.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.2 src/tests/net/mcast/t_mcast.c:1.3
--- src/tests/net/mcast/t_mcast.c:1.2	Sun Oct 12 09:48:25 2014
+++ src/tests/net/mcast/t_mcast.c	Sun Oct 12 10:53:46 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.2 2014/10/12 13:48:25 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.3 2014/10/12 14:53:46 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include 
-__RCSID("$NetBSD: t_mcast.c,v 1.2 2014/10/12 13:48:25 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.3 2014/10/12 14:53:46 christos Exp $");
 
 #include 
 #include 
@@ -90,7 +90,11 @@ addmc(int s, struct addrinfo *ai)
 		&m4, sizeof(m4));
 	case AF_INET6:
 		s6 = (void *)ai->ai_addr;
+#if defined(__linux__) || defined(__NetBSD__)
 		// XXX: Both linux and we do this thing wrong...
+		// It is just difficult to make the regular IPv6 multicast
+		// calls to work with mapped addresses because the code is
+		// not structured properly. MacOS/X works properly.
 		if (IN6_IS_ADDR_V4MAPPED(&s6->sin6_addr)) {
 			memcpy(&m4.imr_multiaddr, &s6->sin6_addr.s6_addr[12],
 			sizeof(m4.imr_multiaddr));
@@ -98,6 +102,7 @@ addmc(int s, struct addrinfo *ai)
 			return setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP,
 			&m4, sizeof(m4));
 		}
+#endif
 		assert(sizeof(*s6) == ai->ai_addrlen);
 		memset(&m6, 0, sizeof(m6));
 		m6.ipv6mr_interface = 0;



CVS commit: src/tests/net/mcast

2014-10-12 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sun Oct 12 18:56:57 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
now we support the v6 ioctls for mapped addresses too.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.3 src/tests/net/mcast/t_mcast.c:1.4
--- src/tests/net/mcast/t_mcast.c:1.3	Sun Oct 12 10:53:46 2014
+++ src/tests/net/mcast/t_mcast.c	Sun Oct 12 14:56:57 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.3 2014/10/12 14:53:46 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.4 2014/10/12 18:56:57 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include 
-__RCSID("$NetBSD: t_mcast.c,v 1.3 2014/10/12 14:53:46 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.4 2014/10/12 18:56:57 christos Exp $");
 
 #include 
 #include 
@@ -73,7 +73,7 @@ static int debug;
 #define HOST_V6 "FF05:0:0:0:0:0:0:1"
 
 static int
-addmc(int s, struct addrinfo *ai)
+addmc(int s, struct addrinfo *ai, bool bug)
 {
 	struct ip_mreq 	m4;
 	struct ipv6_mreq m6;
@@ -90,19 +90,14 @@ addmc(int s, struct addrinfo *ai)
 		&m4, sizeof(m4));
 	case AF_INET6:
 		s6 = (void *)ai->ai_addr;
-#if defined(__linux__) || defined(__NetBSD__)
-		// XXX: Both linux and we do this thing wrong...
-		// It is just difficult to make the regular IPv6 multicast
-		// calls to work with mapped addresses because the code is
-		// not structured properly. MacOS/X works properly.
-		if (IN6_IS_ADDR_V4MAPPED(&s6->sin6_addr)) {
+		// XXX: Linux does not support the v6 ioctls on v4 sockets!
+		if (bug && IN6_IS_ADDR_V4MAPPED(&s6->sin6_addr)) {
 			memcpy(&m4.imr_multiaddr, &s6->sin6_addr.s6_addr[12],
 			sizeof(m4.imr_multiaddr));
 			m4.imr_interface.s_addr = htonl(INADDR_ANY);
 			return setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP,
 			&m4, sizeof(m4));
 		}
-#endif
 		assert(sizeof(*s6) == ai->ai_addrlen);
 		memset(&m6, 0, sizeof(m6));
 		m6.ipv6mr_interface = 0;
@@ -142,7 +137,7 @@ connector(int fd, const struct sockaddr 
 
 static int
 getsocket(const char *host, const char *port,
-int (*f)(int, const struct sockaddr *, socklen_t))
+int (*f)(int, const struct sockaddr *, socklen_t), bool bug)
 {
 	int e, s;
 	struct addrinfo hints, *ai0, *ai;
@@ -171,7 +166,7 @@ getsocket(const char *host, const char *
 			cause = f == bind ? "bind" : "connect";
 			goto out;
 		}
-		if ((f == bind || f == connector) && addmc(s, ai) == -1) {
+		if ((f == bind || f == connector) && addmc(s, ai, bug) == -1) {
 			cause = "join group";
 			goto out;
 		}
@@ -188,14 +183,14 @@ out:
 }
 
 static void
-sender(const char *host, const char *port, size_t n, bool conn)
+sender(const char *host, const char *port, size_t n, bool conn, bool bug)
 {
 	int s;
 	ssize_t l;
 	size_t seq;
 	char buf[64];
 
-	s = getsocket(host, port, conn ? connect : connector);
+	s = getsocket(host, port, conn ? connect : connector, bug);
 	for (seq = 0; seq < n; seq++) {
 		time_t t = time(&t);
 		snprintf(buf, sizeof(buf), "%zu: %-24.24s", seq, ctime(&t));
@@ -210,7 +205,7 @@ sender(const char *host, const char *por
 }
 
 static void
-receiver(const char *host, const char *port, size_t n, bool conn)
+receiver(const char *host, const char *port, size_t n, bool conn, bool bug)
 {
 	int s;
 	ssize_t l;
@@ -219,7 +214,7 @@ receiver(const char *host, const char *p
 	struct pollfd pfd;
 	socklen_t slen;
 
-	s = getsocket(host, port, conn ? bind : connector);
+	s = getsocket(host, port, conn ? bind : connector, bug);
 	pfd.fd = s;
 	pfd.events = POLLIN;
 	for (seq = 0; seq < n; seq++) {
@@ -236,17 +231,17 @@ receiver(const char *host, const char *p
 }
 
 static void
-run(const char *host, const char *port, size_t n, bool conn)
+run(const char *host, const char *port, size_t n, bool conn, bool bug)
 {
 	switch (fork()) {
 	case 0:
-		receiver(host, port, n, conn);
+		receiver(host, port, n, conn, bug);
 		return;
 	case -1:
 		ERRX(EXIT_FAILURE, "fork (%s)", strerror(errno));
 	default:
 		usleep(100);
-		sender(host, port, n, conn);
+		sender(host, port, n, conn, bug);
 		return;
 	}
 }
@@ -258,12 +253,12 @@ main(int argc, char *argv[])
 	const char *host, *port;
 	int c;
 	size_t n;
-	bool conn;
+	bool conn, bug;
 
 	host = HOST_V4;
 	port = PORT_V4;
 	n = TOTAL;
-	conn = false;
+	bug = conn = false;
 
 	while ((c = getopt(argc, argv, "46cdmn:")) != -1)
 		switch (c) {
@@ -275,6 +270,9 @@ main(int argc, char *argv[])
 			host = HOST_V6;
 			port = PORT_V6;
 			break;
+		case 'b':
+			bug = true;
+			break;
 		case 'c':
 			conn = true;
 			break;
@@ -294,7 +292,7 @@ main(int argc, char *argv[])
 			return 1;
 		}
 
-	run(host, port, n, conn);
+	run(host, port, n, conn, bug);
 	return 0;
 }
 #else
@@ -307,7 +305,7 @@

CVS commit: src/tests/net/mcast

2014-10-12 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sun Oct 12 19:49:01 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Explain what works, what does not and why.
Provide compatible code so that it compiles on Linux and MacOS/X with -DTEST.
We should check more OS's and see if they are broken too.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.4 src/tests/net/mcast/t_mcast.c:1.5
--- src/tests/net/mcast/t_mcast.c:1.4	Sun Oct 12 14:56:57 2014
+++ src/tests/net/mcast/t_mcast.c	Sun Oct 12 15:49:01 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.4 2014/10/12 18:56:57 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.5 2014/10/12 19:49:01 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,15 +29,22 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include 
-__RCSID("$NetBSD: t_mcast.c,v 1.4 2014/10/12 18:56:57 christos Exp $");
+#ifdef __RCSID
+__RCSID("$NetBSD: t_mcast.c,v 1.5 2014/10/12 19:49:01 christos Exp $");
+#else
+extern const char *__progname;
+#define getprogname() __progname
+#endif
 
 #include 
 #include 
+#include 
 #include 
 
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -62,7 +69,7 @@ __RCSID("$NetBSD: t_mcast.c,v 1.4 2014/1
 #define SKIPX(ev, msg, ...)	errx(ev, msg, __VA_ARGS__)
 #endif
 
-static int debug;
+static int debug = 1;
 
 #define TOTAL 10
 #define PORT_V4MAPPED ""
@@ -90,7 +97,16 @@ addmc(int s, struct addrinfo *ai, bool b
 		&m4, sizeof(m4));
 	case AF_INET6:
 		s6 = (void *)ai->ai_addr;
-		// XXX: Linux does not support the v6 ioctls on v4 sockets!
+		/*
+		 * Linux:	Does not support the v6 ioctls on v4 mapped
+		 *		sockets but it does support the v4 ones and
+		 *		it works.
+		 * MacOS/X:	Dupports the v6 ioctls on v4 mapped sockets,
+		 *		but does not work and also does not support
+		 *		the v4 ioctls. So no way to make multicasting
+		 *		work with mapped addresses.
+		 * NetBSD:	Supports both and works for both.
+		 */
 		if (bug && IN6_IS_ADDR_V4MAPPED(&s6->sin6_addr)) {
 			memcpy(&m4.imr_multiaddr, &s6->sin6_addr.s6_addr[12],
 			sizeof(m4.imr_multiaddr));
@@ -137,7 +153,8 @@ connector(int fd, const struct sockaddr 
 
 static int
 getsocket(const char *host, const char *port,
-int (*f)(int, const struct sockaddr *, socklen_t), bool bug)
+int (*f)(int, const struct sockaddr *, socklen_t), socklen_t *slen,
+bool bug)
 {
 	int e, s;
 	struct addrinfo hints, *ai0, *ai;
@@ -170,6 +187,7 @@ getsocket(const char *host, const char *
 			cause = "join group";
 			goto out;
 		}
+		*slen = ai->ai_addrlen;
 		break;
 out:
 		close(s);
@@ -189,15 +207,16 @@ sender(const char *host, const char *por
 	ssize_t l;
 	size_t seq;
 	char buf[64];
+	socklen_t slen;
 
-	s = getsocket(host, port, conn ? connect : connector, bug);
+	s = getsocket(host, port, conn ? connect : connector, &slen, bug);
 	for (seq = 0; seq < n; seq++) {
 		time_t t = time(&t);
 		snprintf(buf, sizeof(buf), "%zu: %-24.24s", seq, ctime(&t));
 		if (debug)
 			printf("sending: %s\n", buf);
 		l = conn ? send(s, buf, sizeof(buf), 0) :
-		sendto(s, buf, sizeof(buf), 0, (void *)&ss, ss.ss_len);
+		sendto(s, buf, sizeof(buf), 0, (void *)&ss, slen);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "send (%s)", strerror(errno));
 		usleep(100);
@@ -214,13 +233,12 @@ receiver(const char *host, const char *p
 	struct pollfd pfd;
 	socklen_t slen;
 
-	s = getsocket(host, port, conn ? bind : connector, bug);
+	s = getsocket(host, port, conn ? bind : connector, &slen, bug);
 	pfd.fd = s;
 	pfd.events = POLLIN;
 	for (seq = 0; seq < n; seq++) {
 		if (poll(&pfd, 1, 1000) == -1)
 			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
-		slen = ss.ss_len;
 		l = conn ? recv(s, buf, sizeof(buf), 0) :
 		recvfrom(s, buf, sizeof(buf), 0, (void *)&ss, &slen);
 		if (l == -1)
@@ -233,7 +251,10 @@ receiver(const char *host, const char *p
 static void
 run(const char *host, const char *port, size_t n, bool conn, bool bug)
 {
-	switch (fork()) {
+	pid_t pid;
+	int status;
+
+	switch ((pid = fork())) {
 	case 0:
 		receiver(host, port, n, conn, bug);
 		return;
@@ -242,6 +263,22 @@ run(const char *host, const char *port, 
 	default:
 		usleep(100);
 		sender(host, port, n, conn, bug);
+		usleep(100);
+	again:
+		switch (waitpid(pid, &status, WNOHANG)) {
+		case -1:
+			ERRX(EXIT_FAILURE, "wait (%s)", strerror(errno));
+		case 0:
+			if (kill(pid, SIGTERM) == -1)
+ERRX(EXIT_FAILURE, "kill (%s)",
+strerror(errno));
+			goto again;
+		default:
+			if (status != 0)
+ERRX(EXIT_FAILURE, "pid exited with %d",
+status);
+			break;
+		}
 		return;
 	}
 }
@@ -260,7 +297,7 @@ main(int argc, char *argv[])
 	n = TOTAL;
 	bug = conn = false;
 
-	while ((c = getopt(argc,

CVS commit: src/tests/net/mcast

2014-10-12 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Mon Oct 13 04:56:26 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
Oops need to bind, also make the message more interesting and check that
it arrives correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.5 src/tests/net/mcast/t_mcast.c:1.6
--- src/tests/net/mcast/t_mcast.c:1.5	Sun Oct 12 15:49:01 2014
+++ src/tests/net/mcast/t_mcast.c	Mon Oct 13 00:56:26 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.5 2014/10/12 19:49:01 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.6 2014/10/13 04:56:26 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.5 2014/10/12 19:49:01 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.6 2014/10/13 04:56:26 christos Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -69,7 +69,7 @@ extern const char *__progname;
 #define SKIPX(ev, msg, ...)	errx(ev, msg, __VA_ARGS__)
 #endif
 
-static int debug = 1;
+static int debug;
 
 #define TOTAL 10
 #define PORT_V4MAPPED ""
@@ -79,6 +79,11 @@ static int debug = 1;
 #define PORT_V6 ""
 #define HOST_V6 "FF05:0:0:0:0:0:0:1"
 
+struct message {
+	size_t seq;
+	struct timespec ts;
+};
+
 static int
 addmc(int s, struct addrinfo *ai, bool bug)
 {
@@ -151,6 +156,13 @@ connector(int fd, const struct sockaddr 
 	return 0;
 }
 
+static void
+show(const char *prefix, const struct message *msg)
+{
+	printf("%10.10s: %zu [%jd.%jd]\n", prefix, msg->seq, (intmax_t)
+	msg->ts.tv_sec, msg->ts.tv_nsec);
+}
+
 static int
 getsocket(const char *host, const char *port,
 int (*f)(int, const struct sockaddr *, socklen_t), socklen_t *slen,
@@ -205,18 +217,18 @@ sender(const char *host, const char *por
 {
 	int s;
 	ssize_t l;
-	size_t seq;
-	char buf[64];
+	struct message msg;
+
 	socklen_t slen;
 
 	s = getsocket(host, port, conn ? connect : connector, &slen, bug);
-	for (seq = 0; seq < n; seq++) {
-		time_t t = time(&t);
-		snprintf(buf, sizeof(buf), "%zu: %-24.24s", seq, ctime(&t));
+	for (msg.seq = 0; msg.seq < n; msg.seq++) {
+		if (clock_gettime(CLOCK_MONOTONIC, &msg.ts) == -1)
+			ERRX(EXIT_FAILURE, "clock (%s)", strerror(errno));
 		if (debug)
-			printf("sending: %s\n", buf);
-		l = conn ? send(s, buf, sizeof(buf), 0) :
-		sendto(s, buf, sizeof(buf), 0, (void *)&ss, slen);
+			show("sending", &msg);
+		l = conn ? send(s, &msg, sizeof(msg), 0) :
+		sendto(s, &msg, sizeof(msg), 0, (void *)&ss, slen);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "send (%s)", strerror(errno));
 		usleep(100);
@@ -229,22 +241,24 @@ receiver(const char *host, const char *p
 	int s;
 	ssize_t l;
 	size_t seq;
-	char buf[64];
+	struct message msg;
 	struct pollfd pfd;
 	socklen_t slen;
 
-	s = getsocket(host, port, conn ? bind : connector, &slen, bug);
+	s = getsocket(host, port, bind, &slen, bug);
 	pfd.fd = s;
 	pfd.events = POLLIN;
 	for (seq = 0; seq < n; seq++) {
 		if (poll(&pfd, 1, 1000) == -1)
 			ERRX(EXIT_FAILURE, "poll (%s)", strerror(errno));
-		l = conn ? recv(s, buf, sizeof(buf), 0) :
-		recvfrom(s, buf, sizeof(buf), 0, (void *)&ss, &slen);
+		l = conn ? recv(s, &msg, sizeof(msg), 0) :
+		recvfrom(s, &msg, sizeof(msg), 0, (void *)&ss, &slen);
 		if (l == -1)
 			ERRX(EXIT_FAILURE, "recv (%s)", strerror(errno));
 		if (debug)
-			printf("got: %s\n", buf);
+			show("got", &msg);
+		if (seq != msg.seq)
+			ERRX(EXIT_FAILURE, "seq %zu != %zu", seq, msg.seq);
 	}
 }
 
@@ -261,7 +275,7 @@ run(const char *host, const char *port, 
 	case -1:
 		ERRX(EXIT_FAILURE, "fork (%s)", strerror(errno));
 	default:
-		usleep(100);
+		usleep(1000);
 		sender(host, port, n, conn, bug);
 		usleep(100);
 	again:
@@ -424,20 +438,15 @@ ATF_TC_BODY(unconninet6, tc)
 
 ATF_TP_ADD_TCS(tp)
 {
+	debug++;
 ATF_TP_ADD_TC(tp, conninet4);
 ATF_TP_ADD_TC(tp, connmappedinet4);
 ATF_TP_ADD_TC(tp, connmappedbuginet4);
 ATF_TP_ADD_TC(tp, conninet6);
-#if 0
-	/*
-	 * The receiver does not get any packets on unconnected sockets,
-	 * but the ioctl's work. Is my code wrong?
-	 */
 ATF_TP_ADD_TC(tp, unconninet4);
 ATF_TP_ADD_TC(tp, unconnmappedinet4);
 ATF_TP_ADD_TC(tp, unconnmappedbuginet4);
 ATF_TP_ADD_TC(tp, unconninet6);
-#endif
 
 	return atf_no_error();
 }



CVS commit: src/tests/net/mcast

2014-10-12 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Mon Oct 13 04:57:11 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
typo


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.6 src/tests/net/mcast/t_mcast.c:1.7
--- src/tests/net/mcast/t_mcast.c:1.6	Mon Oct 13 00:56:26 2014
+++ src/tests/net/mcast/t_mcast.c	Mon Oct 13 00:57:11 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.6 2014/10/13 04:56:26 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.7 2014/10/13 04:57:11 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.6 2014/10/13 04:56:26 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.7 2014/10/13 04:57:11 christos Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -106,7 +106,7 @@ addmc(int s, struct addrinfo *ai, bool b
 		 * Linux:	Does not support the v6 ioctls on v4 mapped
 		 *		sockets but it does support the v4 ones and
 		 *		it works.
-		 * MacOS/X:	Dupports the v6 ioctls on v4 mapped sockets,
+		 * MacOS/X:	Supports the v6 ioctls on v4 mapped sockets,
 		 *		but does not work and also does not support
 		 *		the v4 ioctls. So no way to make multicasting
 		 *		work with mapped addresses.



CVS commit: src/tests/net/mcast

2014-10-12 Thread Martin Husemann
Module Name:src
Committed By:   martin
Date:   Mon Oct 13 06:57:08 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
timespec.tv_nsec is long, so use %ld instead of %jd as printf format.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.7 src/tests/net/mcast/t_mcast.c:1.8
--- src/tests/net/mcast/t_mcast.c:1.7	Mon Oct 13 04:57:11 2014
+++ src/tests/net/mcast/t_mcast.c	Mon Oct 13 06:57:08 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.7 2014/10/13 04:57:11 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.8 2014/10/13 06:57:08 martin Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.7 2014/10/13 04:57:11 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.8 2014/10/13 06:57:08 martin Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -159,7 +159,7 @@ connector(int fd, const struct sockaddr 
 static void
 show(const char *prefix, const struct message *msg)
 {
-	printf("%10.10s: %zu [%jd.%jd]\n", prefix, msg->seq, (intmax_t)
+	printf("%10.10s: %zu [%jd.%ld]\n", prefix, msg->seq, (intmax_t)
 	msg->ts.tv_sec, msg->ts.tv_nsec);
 }
 



CVS commit: src/tests/net/mcast

2014-10-26 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Sun Oct 26 18:33:43 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
- deal with MacOS/X not having clock_*()
- change multicast address
- set the interface
XXX: Now the ipv6 code works on MacOS/X but does not work for us still.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.8 src/tests/net/mcast/t_mcast.c:1.9
--- src/tests/net/mcast/t_mcast.c:1.8	Mon Oct 13 02:57:08 2014
+++ src/tests/net/mcast/t_mcast.c	Sun Oct 26 14:33:43 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.8 2014/10/13 06:57:08 martin Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.9 2014/10/26 18:33:43 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.8 2014/10/13 06:57:08 martin Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.9 2014/10/26 18:33:43 christos Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -39,6 +39,7 @@ extern const char *__progname;
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -77,7 +78,7 @@ static int debug;
 #define PORT_V4 ""
 #define HOST_V4 "239.1.1.1"
 #define PORT_V6 ""
-#define HOST_V6 "FF05:0:0:0:0:0:0:1"
+#define HOST_V6 "FF02:0:0:0:0:0:0:1"
 
 struct message {
 	size_t seq;
@@ -91,6 +92,7 @@ addmc(int s, struct addrinfo *ai, bool b
 	struct ipv6_mreq m6;
 	struct sockaddr_in *s4;
 	struct sockaddr_in6 *s6;
+	unsigned int ifc;
 	
 	switch (ai->ai_family) {
 	case AF_INET:
@@ -121,7 +123,23 @@ addmc(int s, struct addrinfo *ai, bool b
 		}
 		assert(sizeof(*s6) == ai->ai_addrlen);
 		memset(&m6, 0, sizeof(m6));
-		m6.ipv6mr_interface = 0;
+#if 0
+		ifc = 1;
+		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
+		&ifc, sizeof(ifc))) == -1)
+			return -1;
+		ifc = 224;
+		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+		&ifc, sizeof(ifc)) == -1)
+			return -1;
+#endif
+#if 1
+		ifc = 1;
+		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifc,
+		sizeof(ifc)) == -1)
+			return -1;
+#endif
+		m6.ipv6mr_interface = ifc;
 	m6.ipv6mr_multiaddr = s6->sin6_addr;
 		return setsockopt(s, IPPROTO_IPV6, IPV6_JOIN_GROUP,
 		&m6, sizeof(m6));
@@ -223,8 +241,16 @@ sender(const char *host, const char *por
 
 	s = getsocket(host, port, conn ? connect : connector, &slen, bug);
 	for (msg.seq = 0; msg.seq < n; msg.seq++) {
+#ifdef CLOCK_MONOTONIC
 		if (clock_gettime(CLOCK_MONOTONIC, &msg.ts) == -1)
 			ERRX(EXIT_FAILURE, "clock (%s)", strerror(errno));
+#else
+		struct timeval tv;
+		if (gettimeofday(&tv, NULL) == -1)
+			ERRX(EXIT_FAILURE, "clock (%s)", strerror(errno));
+		msg.ts.tv_sec = tv.tv_sec;
+		msg.ts.tv_nsec = tv.tv_usec * 1000;
+#endif
 		if (debug)
 			show("sending", &msg);
 		l = conn ? send(s, &msg, sizeof(msg), 0) :



CVS commit: src/tests/net/mcast

2014-10-27 Thread Christos Zoulas
Module Name:src
Committed By:   christos
Date:   Mon Oct 27 21:28:58 UTC 2014

Modified Files:
src/tests/net/mcast: t_mcast.c

Log Message:
fix typo, use different address


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/tests/net/mcast/t_mcast.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/t_mcast.c
diff -u src/tests/net/mcast/t_mcast.c:1.9 src/tests/net/mcast/t_mcast.c:1.10
--- src/tests/net/mcast/t_mcast.c:1.9	Sun Oct 26 14:33:43 2014
+++ src/tests/net/mcast/t_mcast.c	Mon Oct 27 17:28:58 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_mcast.c,v 1.9 2014/10/26 18:33:43 christos Exp $	*/
+/*	$NetBSD: t_mcast.c,v 1.10 2014/10/27 21:28:58 christos Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: t_mcast.c,v 1.9 2014/10/26 18:33:43 christos Exp $");
+__RCSID("$NetBSD: t_mcast.c,v 1.10 2014/10/27 21:28:58 christos Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -78,7 +78,7 @@ static int debug;
 #define PORT_V4 ""
 #define HOST_V4 "239.1.1.1"
 #define PORT_V6 ""
-#define HOST_V6 "FF02:0:0:0:0:0:0:1"
+#define HOST_V6 "FF05:1:0:0:0:0:0:1"
 
 struct message {
 	size_t seq;
@@ -126,18 +126,18 @@ addmc(int s, struct addrinfo *ai, bool b
 #if 0
 		ifc = 1;
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
-		&ifc, sizeof(ifc))) == -1)
+		&ifc, sizeof(ifc)) == -1)
 			return -1;
 		ifc = 224;
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
 		&ifc, sizeof(ifc)) == -1)
 			return -1;
-#endif
-#if 1
 		ifc = 1;
 		if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifc,
 		sizeof(ifc)) == -1)
 			return -1;
+#else
+		ifc = 1;
 #endif
 		m6.ipv6mr_interface = ifc;
 	m6.ipv6mr_multiaddr = s6->sin6_addr;



CVS commit: src/tests/net/mcast

2017-02-28 Thread Ryota Ozaki
Module Name:src
Committed By:   ozaki-r
Date:   Tue Feb 28 09:23:23 UTC 2017

Modified Files:
src/tests/net/mcast: mcast.c t_mcast.sh

Log Message:
Add tests that destroy an interface while the mcast program is running


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/net/mcast/mcast.c
cvs rdiff -u -r1.4 -r1.5 src/tests/net/mcast/t_mcast.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/net/mcast/mcast.c
diff -u src/tests/net/mcast/mcast.c:1.3 src/tests/net/mcast/mcast.c:1.4
--- src/tests/net/mcast/mcast.c:1.3	Thu May 28 10:19:17 2015
+++ src/tests/net/mcast/mcast.c	Tue Feb 28 09:23:23 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: mcast.c,v 1.3 2015/05/28 10:19:17 ozaki-r Exp $	*/
+/*	$NetBSD: mcast.c,v 1.4 2017/02/28 09:23:23 ozaki-r Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 #include 
 #ifdef __RCSID
-__RCSID("$NetBSD: mcast.c,v 1.3 2015/05/28 10:19:17 ozaki-r Exp $");
+__RCSID("$NetBSD: mcast.c,v 1.4 2017/02/28 09:23:23 ozaki-r Exp $");
 #else
 extern const char *__progname;
 #define getprogname() __progname
@@ -73,6 +73,7 @@ extern const char *__progname;
 #endif
 
 static int debug;
+static int nsleep;
 
 #define TOTAL 10
 #define PORT_V4MAPPED ""
@@ -338,6 +339,8 @@ receiver(const int fd, const char *host,
 			seq, msg.seq);
 	}
 
+	if (nsleep)
+		sleep(nsleep);
 	/* Tell I'm finished */
 	synchronize(fd, false);
 }
@@ -417,7 +420,7 @@ main(int argc, char *argv[])
 	n = TOTAL;
 	bug = conn = false;
 
-	while ((c = getopt(argc, argv, "46bcdmn:")) != -1)
+	while ((c = getopt(argc, argv, "46bcdmn:s:")) != -1)
 		switch (c) {
 		case '4':
 			host = HOST_V4;
@@ -443,8 +446,12 @@ main(int argc, char *argv[])
 		case 'n':
 			n = atoi(optarg);
 			break;
+		case 's':
+			nsleep = atoi(optarg);
+			break;
 		default:
-			fprintf(stderr, "Usage: %s [-cdm46] [-n ]",
+			fprintf(stderr, "Usage: %s [-cdm46] [-n ]"
+			" [-s ]",
 			getprogname());
 			return 1;
 		}

Index: src/tests/net/mcast/t_mcast.sh
diff -u src/tests/net/mcast/t_mcast.sh:1.4 src/tests/net/mcast/t_mcast.sh:1.5
--- src/tests/net/mcast/t_mcast.sh:1.4	Fri Nov 25 08:51:16 2016
+++ src/tests/net/mcast/t_mcast.sh	Tue Feb 28 09:23:23 2017
@@ -1,4 +1,4 @@
-#	$NetBSD: t_mcast.sh,v 1.4 2016/11/25 08:51:16 ozaki-r Exp $
+#	$NetBSD: t_mcast.sh,v 1.5 2017/02/28 09:23:23 ozaki-r Exp $
 #
 # Copyright (c) 2015 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -62,15 +62,61 @@ run_test()
 	unset LD_PRELOAD
 }
 
+run_test_destroyif()
+{
+	local name="$1"
+	local opts="$2"
+	local mcast="$(atf_get_srcdir)/mcast"
+	local sleep=3
+
+	rump_server_start $RUMP_SERVER netinet6
+	rump_server_add_iface $RUMP_SERVER shmif0 bus1
+	export RUMP_SERVER=$RUMP_SERVER
+	atf_check -s exit:0 rump.ifconfig shmif0 10.0.0.2/24
+	atf_check -s exit:0 rump.ifconfig shmif0 inet6 fc00::2/64
+	atf_check -s exit:0 rump.ifconfig shmif0 up
+
+	atf_check -s exit:0 rump.ifconfig -w 10
+	atf_check -s not-exit:0 -x "rump.ifconfig shmif0 |grep -q tentative"
+
+	# A route to the mcast address is required to join the mcast group
+	atf_check -s exit:0 -o ignore rump.route add default 10.0.0.1
+	atf_check -s exit:0 -o ignore rump.route add -inet6 default fc00::1
+
+	$DEBUG && rump.ifconfig
+	$DEBUG && rump.netstat -nr
+
+	export LD_PRELOAD=/usr/lib/librumphijack.so
+	#$DEBUG && /usr/sbin/ifmcstat  # Not yet run on rump kernel
+	if $DEBUG; then
+		$mcast -d ${opts} -s $sleep &
+	else
+		$mcast ${opts} -s $sleep &
+	fi
+	#$DEBUG && /usr/sbin/ifmcstat  # Not yet run on rump kernel
+	unset LD_PRELOAD
+
+	# Give a chance to setup mcast
+	sleep 1
+
+	# Try to destroy an interface that the mcast program is running on
+	atf_check -s exit:0 rump.ifconfig shmif0 destroy
+
+	wait
+	atf_check -s exit:0 -o ignore rump.ifconfig
+}
+
 add_test()
 {
 	local name=$1
 	local opts="$2"
 	local desc="$3"
+	local fulldesc=
 
+	fulldesc="Checks $desc"
 	atf_test_case "mcast_${name}" cleanup
 	eval "mcast_${name}_head() { \
-			atf_set \"descr\" \"${desc}\"; \
+			atf_set \"descr\" \"${fulldesc}\"; \
 			atf_set \"require.progs\" \"rump_server\"; \
 		}; \
 	mcast_${name}_body() { \
@@ -82,25 +128,40 @@ add_test()
 			cleanup; \
 		}"
 	atf_add_test_case "mcast_${name}"
+
+	fulldesc="Destroying interface while testing ${desc}"
+	atf_test_case "mcast_destroyif_${name}" cleanup
+	eval "mcast_destroyif_${name}_head() { \
+			atf_set \"descr\" \"${fulldesc}\"; \
+			atf_set \"require.progs\" \"rump_server\"; \
+		}; \
+	mcast_destroyif_${name}_body() { \
+			run_test_destroyif \"${name}\" \"${opts}\"; \
+		}; \
+	mcast_destroyif_${name}_cleanup() { \
+			${DEBUG} && dump; \
+			cleanup; \
+		}"
+	atf_add_test_case "mcast_destroyif_${name}"
 }
 
 atf_init_test_cases()
 {
 
 	add_test conninet4"-c -4" \
-	"Checks connected multicast for ipv4"
+	"connected multicast for ipv4"
 	add_test connmappedin