Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/net/mcast now we support the v6 ioctls for mapped addr...



details:   https://anonhg.NetBSD.org/src/rev/1741fbacad79
branches:  trunk
changeset: 332959:1741fbacad79
user:      christos <christos%NetBSD.org@localhost>
date:      Sun Oct 12 18:56:57 2014 +0000

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

diffstat:

 tests/net/mcast/t_mcast.c |  78 ++++++++++++++++++++++++++++++----------------
 1 files changed, 50 insertions(+), 28 deletions(-)

diffs (244 lines):

diff -r 99c0ff743442 -r 1741fbacad79 tests/net/mcast/t_mcast.c
--- a/tests/net/mcast/t_mcast.c Sun Oct 12 17:53:33 2014 +0000
+++ b/tests/net/mcast/t_mcast.c Sun Oct 12 18:56:57 2014 +0000
@@ -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 <sys/cdefs.h>
-__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 <sys/types.h>
 #include <sys/socket.h>
@@ -73,7 +73,7 @@
 #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 @@
                    &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 @@
 
 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 @@
                        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 @@
 }
 
 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 @@
 }
 
 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 @@
        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 @@
 }
 
 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 @@
        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 @@
                        host = HOST_V6;
                        port = PORT_V6;
                        break;
+               case 'b':
+                       bug = true;
+                       break;
                case 'c':
                        conn = true;
                        break;
@@ -294,7 +292,7 @@
                        return 1;
                }
 
-       run(host, port, n, conn);
+       run(host, port, n, conn, bug);
        return 0;
 }
 #else
@@ -307,7 +305,7 @@
 
 ATF_TC_BODY(conninet4, tc)
 {
-       run(HOST_V4, PORT_V4, TOTAL, true);
+       run(HOST_V4, PORT_V4, TOTAL, true, false);
 }
 
 ATF_TC(connmappedinet4);
@@ -318,7 +316,18 @@
 
 ATF_TC_BODY(connmappedinet4, tc)
 {
-       run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, true);
+       run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, true, false);
+}
+
+ATF_TC(connmappedbuginet4);
+ATF_TC_HEAD(connmappedbuginet4, tc)
+{
+       atf_tc_set_md_var(tc, "descr", "Checks connected multicast for mapped ipv4 using the v4 ioctls");
+}
+
+ATF_TC_BODY(connmappedbuginet4, tc)
+{
+       run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, true, true);
 }
 
 ATF_TC(conninet6);
@@ -329,7 +338,7 @@
 
 ATF_TC_BODY(conninet6, tc)
 {
-       run(HOST_V6, PORT_V6, TOTAL, true);
+       run(HOST_V6, PORT_V6, TOTAL, true, false);
 }
 
 ATF_TC(unconninet4);
@@ -340,7 +349,7 @@
 
 ATF_TC_BODY(unconninet4, tc)
 {
-       run(HOST_V4, PORT_V4, TOTAL, false);
+       run(HOST_V4, PORT_V4, TOTAL, false, false);
 }
 
 ATF_TC(unconnmappedinet4);
@@ -351,7 +360,18 @@
 
 ATF_TC_BODY(unconnmappedinet4, tc)
 {
-       run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, false);
+       run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, false, false);
+}
+
+ATF_TC(unconnmappedbuginet4);
+ATF_TC_HEAD(unconnmappedbuginet4, tc)
+{
+       atf_tc_set_md_var(tc, "descr", "Checks unconnected multicast for mapped ipv4 using the v4 ioctls");
+}
+
+ATF_TC_BODY(unconnmappedbuginet4, tc)
+{
+       run(HOST_V4MAPPED, PORT_V4MAPPED, TOTAL, false, true);
 }
 
 ATF_TC(unconninet6);
@@ -362,16 +382,18 @@
 
 ATF_TC_BODY(unconninet6, tc)
 {
-       run(HOST_V6, PORT_V6, TOTAL, false);
+       run(HOST_V6, PORT_V6, TOTAL, false, false);
 }
 
 ATF_TP_ADD_TCS(tp)
 {
         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();



Home | Main Index | Thread Index | Old Index