CVS commit: src/tests/net/mcast
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
CVS commit: src/tests/net/mcast
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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