]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
When we create a tcp connection to a remote ctdb node do an explicit bind() to set...
authorRonnie sahlberg <ronniesahlberg@gmail.com>
Thu, 5 Apr 2007 23:08:41 +0000 (09:08 +1000)
committerRonnie sahlberg <ronniesahlberg@gmail.com>
Thu, 5 Apr 2007 23:08:41 +0000 (09:08 +1000)
We need this since there is no guarantee that INADDR_ANY (which would be defaulted to if we dont bind) would be routable from the remote host.
This is entirely possible to happen since CTDB traffic is likely to be isolated to a private non-routable network.

(This used to be ctdb commit e0743d2f84ca0088734c912e210deb93a6b78860)

ctdb/tcp/tcp_connect.c

index fe0fc210baf22d63303cabcde667c31840615013..85fffc2f7030ea40e452938effd3565f60275e57 100644 (file)
@@ -98,6 +98,7 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te,
        struct ctdb_tcp_node *tnode = talloc_get_type(node->private, 
                                                      struct ctdb_tcp_node);
        struct ctdb_context *ctdb = node->ctdb;
+        struct sockaddr_in sock_in;
         struct sockaddr_in sock_out;
 
        tnode->fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
@@ -109,7 +110,21 @@ void ctdb_tcp_node_connect(struct event_context *ev, struct timed_event *te,
        }
        sock_out.sin_port = htons(node->address.port);
        sock_out.sin_family = PF_INET;
-       
+
+
+       /* Bind our side of the socketpair to the same address we use to listen
+        * on incoming CTDB traffic.
+        * We must specify this address to make sure that the address we expose to
+        * the remote side is actually routable in case CTDB traffic will run on
+        * a dedicated non-routeable network.
+        */
+       if (ctdb_tcp_get_address(ctdb, ctdb->address.address, &sock_in.sin_addr) != 0) {
+               return;
+       }
+       sock_in.sin_port = htons(0); /* INPORT_ANY is not always available */
+       sock_in.sin_family = PF_INET;
+       bind(tnode->fd, (struct sockaddr *)&sock_in, sizeof(sock_in));
+
        if (connect(tnode->fd, (struct sockaddr *)&sock_out, sizeof(sock_out)) != 0 &&
            errno != EINPROGRESS) {
                /* try again once a second */