Changeset: 54b89e9d66a6 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=54b89e9d66a6
Modified Files:
        tools/merovingian/daemon/controlrunner.c
        tools/merovingian/daemon/discoveryrunner.c
        tools/merovingian/daemon/discoveryrunner.h
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/merovingian.h
        tools/merovingian/daemon/monetdbd.1.in
Branch: ipv6
Log Message:

Revert discovery service changes.

IPv6 multicast requires to specify which interface to connect to, which would 
require another property to monetdbd. As the discovery functionality is not 
widely used, we will keep it under IPv4 exclusively.


diffs (278 lines):

diff --git a/tools/merovingian/daemon/controlrunner.c 
b/tools/merovingian/daemon/controlrunner.c
--- a/tools/merovingian/daemon/controlrunner.c
+++ b/tools/merovingian/daemon/controlrunner.c
@@ -48,7 +48,7 @@ leavedb(char *name)
                        "LEAV %s mapi:monetdb://%s:%u/",
                        name, _mero_hostname,
                        (unsigned int)getConfNum(_mero_props, "port"));
-       difuse(buf);
+       broadcast(buf);
 }
 
 static void
@@ -103,7 +103,7 @@ anncdbS(sabdb *stats)
                                _mero_hostname,
                                (unsigned int)getConfNum(_mero_props, "port"),
                                getConfNum(_mero_props, "discoveryttl") + 60);
-               difuse(buf);
+               broadcast(buf);
        }
        freeConfFile(props);
        free(props);
diff --git a/tools/merovingian/daemon/discoveryrunner.c 
b/tools/merovingian/daemon/discoveryrunner.c
--- a/tools/merovingian/daemon/discoveryrunner.c
+++ b/tools/merovingian/daemon/discoveryrunner.c
@@ -30,20 +30,16 @@ remotedb _mero_remotedbs = NULL;
 pthread_mutex_t _mero_remotedb_lock = PTHREAD_MUTEX_INITIALIZER;
 
 void
-difuse(char *msg)
+broadcast(char *msg)
 {
-       ssize_t sent;
-       size_t len = strlen(msg) + 1;
+       int len = strlen(msg) + 1;
        if (_mero_broadcastsock < 0)
                return;
-       sent = sendto(_mero_broadcastsock, msg, len, 0, _mero_broadcastaddr, 
_mero_broadcastlength);
-       if (sent == -1) {
-               Mfprintf(_mero_discerr, "error while sending %s message: %s\n",
-                                _mero_broadcastaddr->sa_family == AF_INET ? 
"broadcast" : "multicast", strerror(errno));
-       } else if (sent < (ssize_t) len) {
-               Mfprintf(_mero_discerr, "a %s message was not sent entirely\n",
-                                _mero_broadcastaddr->sa_family == AF_INET ? 
"broadcast" : "multicast");
-       }
+       if (sendto(_mero_broadcastsock, msg, len, 0,
+                               (struct sockaddr *)&_mero_broadcastaddr,
+                               sizeof(_mero_broadcastaddr)) != len)
+               Mfprintf(_mero_discerr, "error while sending broadcast "
+                               "message: %s\n", strerror(errno));
 }
 
 static int
@@ -310,7 +306,7 @@ discoveryRunner(void *d)
        /* start shouting around that we're here ;) request others to tell
         * what databases they have */
        snprintf(buf, 512, "HELO %s", _mero_hostname);
-       difuse(buf);
+       broadcast(buf);
 
        ckv = getDefaultProps();
        discttl = findConfKey(_mero_props, "discoveryttl");
@@ -348,7 +344,7 @@ discoveryRunner(void *d)
                                                        stats->dbname, val[0] 
== '\0' ? "" : "/", val,
                                                        _mero_hostname, 
(unsigned int)getConfNum(_mero_props, "port"),
                                                        discttl->ival + 60);
-                                       difuse(buf);
+                                       broadcast(buf);
                                }
                                freeConfFile(ckv);
                        }
@@ -362,7 +358,7 @@ discoveryRunner(void *d)
                                                _mero_hostname, (unsigned 
int)getConfNum(_mero_props, "port"),
                                                discttl->ival + 60);
                                /* coverity[string_null] */
-                               difuse(buf);
+                               broadcast(buf);
                        }
                }
 
@@ -527,7 +523,7 @@ discoveryRunner(void *d)
                        snprintf(buf, 512, "LEAV %s mapi:monetdb://%s:%u/",
                                        stats->dbname, _mero_hostname,
                                        (unsigned int)getConfNum(_mero_props, 
"port"));
-                       difuse(buf);
+                       broadcast(buf);
                }
                freeConfFile(ckv);
                stats = stats->next;
@@ -540,7 +536,7 @@ discoveryRunner(void *d)
        if (getConfNum(_mero_props, "control") != 0) {
                snprintf(buf, 512, "LEAV * %s:%u",
                                _mero_hostname, (unsigned 
int)getConfNum(_mero_props, "port"));
-               difuse(buf);
+               broadcast(buf);
        }
 
        free(ckv);
diff --git a/tools/merovingian/daemon/discoveryrunner.h 
b/tools/merovingian/daemon/discoveryrunner.h
--- a/tools/merovingian/daemon/discoveryrunner.h
+++ b/tools/merovingian/daemon/discoveryrunner.h
@@ -11,7 +11,7 @@
 
 #include "msabaoth.h"
 
-void difuse(char *msg);
+void broadcast(char *msg);
 void registerMessageTap(int fd);
 void unregisterMessageTap(int fd);
 void *discoveryRunner(void *d);
diff --git a/tools/merovingian/daemon/merovingian.c 
b/tools/merovingian/daemon/merovingian.c
--- a/tools/merovingian/daemon/merovingian.c
+++ b/tools/merovingian/daemon/merovingian.c
@@ -118,11 +118,8 @@ FILE *_mero_ctlerr = NULL;
 int _mero_broadcastsock = -1;
 /* ipv6 global any bind address constant */
 const struct in6_addr ipv6_any_addr = IN6ADDR_ANY_INIT;
-/* broadcast/multicast address/port */
-struct sockaddr_in server_ipv4;
-struct sockaddr_in6 server_ipv6;
-struct sockaddr *_mero_broadcastaddr;
-socklen_t _mero_broadcastlength;
+/* broadcast address/port */
+struct sockaddr_in _mero_broadcastaddr;
 /* hostname of this machine */
 char _mero_hostname[128];
 /* default options read from config file */
@@ -908,90 +905,36 @@ main(int argc, char *argv[])
        /* open up connections */
        if ((e = openConnectionTCP(&sock, use_ipv6, host, port, stdout)) == 
NO_ERR &&
                (e = openConnectionUNIX(&socku, mapi_usock, 0, stdout)) == 
NO_ERR &&
-               (discovery == 0 || (e = openConnectionUDP(&discsock, use_ipv6, 
host, port)) == NO_ERR) &&
+               (discovery == 0 || (e = openConnectionUDP(&discsock, false, 
host, port)) == NO_ERR) &&
                (e = openConnectionUNIX(&unsock, control_usock, S_IRWXO, 
_mero_ctlout)) == NO_ERR) {
                pthread_t ctid = 0;
                pthread_t dtid = 0;
 
                if (discovery == 1) {
-                       if (use_ipv6) { //as ipv6 does not support broadcast, 
we will use multicast instead
-                               int check = -1;
-                               struct ipv6_mreq mreq;
-                               struct addrinfo *multi, hints = (struct 
addrinfo) {
-                                       .ai_family = AF_INET6,
-                                       .ai_socktype = SOCK_DGRAM,
-                                       .ai_protocol = IPPROTO_UDP,
-                               };
-
-                               _mero_broadcastaddr = (struct sockaddr*) 
&server_ipv6;
-                               _mero_broadcastlength = (socklen_t) 
sizeof(struct sockaddr_in6);
-
-                               memset(&server_ipv6, 0, sizeof(struct 
sockaddr_in6));
-                               server_ipv6.sin6_family = AF_INET6;
-                               server_ipv6.sin6_port = htons(port);
-                               server_ipv6.sin6_addr = ipv6_any_addr;
-
-                               _mero_broadcastsock = socket(AF_INET6, 
SOCK_DGRAM
+                       _mero_broadcastsock = socket(AF_INET, SOCK_DGRAM
 #ifdef SOCK_CLOEXEC
-                                                                               
        | SOCK_CLOEXEC
+                                                                               
 | SOCK_CLOEXEC
 #endif
-                                               , 0);
-                               if (_mero_broadcastsock == -1) {
-                                       Mfprintf(stderr, "cannot create 
multicast package: %s\n", strerror(errno));
-                                       closesocket(discsock);
-                                       discsock = -1;
-                               } else if ((check = getaddrinfo("ff02::1", 
NULL, &hints, &multi)) != 0) {
-                                       //ipv6 multicast all nodes on the local 
network segment
-                                       Mfprintf(stderr, "cannot create 
multicast package: %s\n", gai_strerror(check));
-                                       closesocket(discsock);
-                                       closesocket(_mero_broadcastsock);
-                                       discsock = -1;
-                               }
-
-                               if (discsock != -1) {
-                                       memset(&mreq, 0, sizeof(mreq));
-                                       memcpy(&mreq.ipv6mr_multiaddr, 
&((struct sockaddr_in6 *) multi->ai_addr)->sin6_addr,
-                                                  
sizeof(mreq.ipv6mr_multiaddr));
-                                       mreq.ipv6mr_interface = 0;
-                                       freeaddrinfo(multi);
-
-                                       if (setsockopt( _mero_broadcastsock, 
IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) != 0) {
-                                               Mfprintf(stderr, "cannot create 
multicast package: %s\n", strerror(errno));
-                                               closesocket(discsock);
-                                               
closesocket(_mero_broadcastsock);
-                                               discsock = -1;
-                                       }
-                               }
-                       } else {
-                               _mero_broadcastaddr = (struct sockaddr*) 
&server_ipv4;
-                               _mero_broadcastlength = (socklen_t) 
sizeof(struct sockaddr_in);
-                               server_ipv4.sin_family = AF_INET;
-                               server_ipv4.sin_addr.s_addr = 
htonl(INADDR_BROADCAST);
-                               /* the target port is our configured port, not 
elegant, but how
-                                * else can we do it? can't broadcast to all 
ports or something */
-                               server_ipv4.sin_port = htons(port);
-                               for (int i = 0; i < 8; i++)
-                                       server_ipv4.sin_zero[i] = 0;
-                               ret = 1;
-                               _mero_broadcastsock = socket(AF_INET, SOCK_DGRAM
-#ifdef SOCK_CLOEXEC
-                                                                               
        | SOCK_CLOEXEC
-#endif
-                                               , 0);
-                               if (_mero_broadcastsock == -1 ||
-                                       setsockopt(_mero_broadcastsock, 
SOL_SOCKET, SO_BROADCAST, &ret, sizeof(ret)) == -1) {
-                                       Mfprintf(stderr, "cannot create 
broadcast package, discovery services disabled, error: %s \n",
-                                                       strerror(errno));
-                                       closesocket(discsock);
-                                       if (_mero_broadcastsock >= 0)
-                                               
closesocket(_mero_broadcastsock);
-                                       discsock = -1;
-                               }
+                                                                               
 , 0);
+                       ret = 1;
+                       if (_mero_broadcastsock == -1 ||
+                               setsockopt(_mero_broadcastsock,
+                                                  SOL_SOCKET, SO_BROADCAST, 
&ret, sizeof(ret)) == -1)
+                       {
+                               Mfprintf(stderr, "cannot create broadcast 
package, "
+                                               "discovery services 
disabled\n");
+                               closesocket(discsock);
+                               discsock = -1;
                        }
 #ifndef SOCK_CLOEXEC
-                       if (discsock != -1)
-                               (void) fcntl(_mero_broadcastsock, F_SETFD, 
FD_CLOEXEC);
+                       (void) fcntl(_mero_broadcastsock, F_SETFD, FD_CLOEXEC);
 #endif
+
+                       _mero_broadcastaddr.sin_family = AF_INET;
+                       _mero_broadcastaddr.sin_addr.s_addr = 
htonl(INADDR_BROADCAST);
+                       /* the target port is our configured port, not elegant, 
but how
+                        * else can we do it? can't broadcast to all ports or 
something */
+                       _mero_broadcastaddr.sin_port = htons(port);
                }
 
                /* Paranoia umask, but good, because why would people have to 
sniff
diff --git a/tools/merovingian/daemon/merovingian.h 
b/tools/merovingian/daemon/merovingian.h
--- a/tools/merovingian/daemon/merovingian.h
+++ b/tools/merovingian/daemon/merovingian.h
@@ -75,8 +75,7 @@ extern FILE *_mero_ctlout;
 extern FILE *_mero_ctlerr;
 extern int _mero_broadcastsock;
 extern const struct in6_addr ipv6_any_addr;
-extern struct sockaddr *_mero_broadcastaddr;
-extern socklen_t _mero_broadcastlength;
+extern struct sockaddr_in _mero_broadcastaddr;
 extern char _mero_hostname[128];
 extern confkeyval *_mero_db_props;
 extern confkeyval *_mero_props;
diff --git a/tools/merovingian/daemon/monetdbd.1.in 
b/tools/merovingian/daemon/monetdbd.1.in
--- a/tools/merovingian/daemon/monetdbd.1.in
+++ b/tools/merovingian/daemon/monetdbd.1.in
@@ -170,9 +170,7 @@ This property specifies which TCP port
 should listen to for connection requests.  Defaults to 50000.
 .TP
 .B ipv6
-This property forces monetdbd to bind on IPv6 addresses only.  This
-enforcement applies to the discovery service as well if enabled.  In that
-case the discovery service will use IPv6 multicast on ff02::1 address.
+This property forces monetdbd to bind connections on IPv6 addresses only.
 Defaults to false.
 .TP
 .B listenaddr
@@ -202,10 +200,9 @@ one specified at configure time, which i
 Changing this property takes effect immediately at runtime.
 .TP
 .B discovery
-Specifies whether neighbor discovery is to be enabled using UDP.
-The discovery method is performed with broadcasts on IPv4 and
-multicasts in IPv6, while using the same portnumber as the port
-setting.
+Specifies whether neighbor discovery is to be enabled using UDP
+broadcasts or not.  The broadcasts are done on the same portnumber as
+the port setting.
 .TP
 .B discoveryttl
 .I Monetdbd
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to