s3:cluster: register the client connection via CTDB_CONTROL_TCP_ADD
authorStefan Metzmacher <metze@samba.org>
Thu, 18 Dec 2008 14:02:42 +0000 (15:02 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 30 Dec 2008 17:02:39 +0000 (18:02 +0100)
This means we correctly pass IPv6 addresses too.
(CTDB_CONTROL_TCP_CLIENT was IPv4 only)

metze
(cherry picked from commit 465176b7e2fc1370dded850a80a8fe8519e79db8)

source/include/ctdbd_conn.h
source/include/proto.h
source/lib/ctdbd_conn.c
source/smbd/server.c

index 39f50c2cfcf31e0248a3cc1edc912b0f852efa34..44c35168a8170f65ea00605bf7ba3da094b18049 100644 (file)
@@ -57,8 +57,8 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
                        void *private_data);
 
 NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
-                           const struct sockaddr_in *server,
-                           const struct sockaddr_in *client,
+                           const struct sockaddr *server,
+                           const struct sockaddr *client,
                            void (*release_ip_handler)(const char *ip_addr,
                                                       void *private_data),
                            void *private_data);
index 643370c22009eebc94879dc873719d30385f125e..76e0d7629cee4c9817b069e0d0c5433000435131 100644 (file)
@@ -10223,7 +10223,6 @@ void init_sec_ctx(void);
 
 int smbd_server_fd(void);
 int get_client_fd(void);
-int client_get_tcp_info(struct sockaddr_in *server, struct sockaddr_in *client);
 struct event_context *smbd_event_context(void);
 struct messaging_context *smbd_messaging_context(void);
 struct memcache *smbd_memcache(void);
index 1ae23bcf8270f482d65ccdb5698b3cfc8a70a5dc..424c316f9319613984f5d5424b5d6331159749d2 100644 (file)
@@ -1175,13 +1175,13 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
  */
 
 NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
-                           const struct sockaddr_in *server,
-                           const struct sockaddr_in *client,
+                           const struct sockaddr *server,
+                           const struct sockaddr *client,
                            void (*release_ip_handler)(const char *ip_addr,
                                                       void *private_data),
                            void *private_data)
 {
-       struct ctdb_control_tcp p;
+       struct ctdb_control_tcp_vnn p;
        TDB_DATA data;
        NTSTATUS status;
 
@@ -1190,6 +1190,21 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
         */
        SMB_ASSERT(conn->release_ip_handler == NULL);
 
+       switch (client->sa_family) {
+       case AF_INET:
+               p.dest.ip = *(struct sockaddr_in *)server;
+               p.src.ip = *(struct sockaddr_in *)client;
+               break;
+#ifdef HAVE_IPV6
+       case AF_INET6:
+               p.dest.ip6 = *(struct sockaddr_in6 *)server;
+               p.src.ip6 = *(struct sockaddr_in6 *)client;
+               break;
+#endif
+       default:
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
        conn->release_ip_handler = release_ip_handler;
 
        /*
@@ -1201,9 +1216,6 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
                return status;
        }
 
-       p.dest = *server;
-       p.src = *client;
-
        /*
         * inform ctdb of our tcp connection, so if IP takeover happens ctdb
         * can send an extra ack to trigger a reset for our client, so it
@@ -1213,7 +1225,7 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
        data.dsize = sizeof(p);
 
        return ctdbd_control(conn, CTDB_CURRENT_NODE, 
-                            CTDB_CONTROL_TCP_CLIENT, 0,
+                            CTDB_CONTROL_TCP_ADD, 0,
                             CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL, NULL);
 }
 
index 1c1e7280c9a39f875b3337fafd4745ea6bf0ad9c..c04ae6fd81d57728ebc79a2136458e715f00b8f0 100644 (file)
@@ -59,7 +59,8 @@ int get_client_fd(void)
        return server_fd;
 }
 
-int client_get_tcp_info(struct sockaddr_in *server, struct sockaddr_in *client)
+static int client_get_tcp_info(struct sockaddr_storage *server,
+                              struct sockaddr_storage *client)
 {
        socklen_t length;
        if (server_fd == -1) {
@@ -1466,7 +1467,7 @@ extern void build_options(bool screen);
                 * client.
                 */
 
-               struct sockaddr_in srv, clnt;
+               struct sockaddr_storage srv, clnt;
 
                if (client_get_tcp_info(&srv, &clnt) == 0) {
 
@@ -1474,7 +1475,9 @@ extern void build_options(bool screen);
 
                        status = ctdbd_register_ips(
                                messaging_ctdbd_connection(),
-                               &srv, &clnt, release_ip, NULL);
+                               (struct sockaddr *)&srv,
+                               (struct sockaddr *)&clnt,
+                               release_ip, NULL);
 
                        if (!NT_STATUS_IS_OK(status)) {
                                DEBUG(0, ("ctdbd_register_ips failed: %s\n",