s3:cluster: fix ctdb ipv6 support
authorStefan Metzmacher <metze@samba.org>
Wed, 14 Jan 2009 11:09:46 +0000 (12:09 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 16 Jan 2009 14:16:59 +0000 (15:16 +0100)
We need to use CTDB_CONTROL_TCP_CLIENT instead of CTDB_CONTROL_TCP_ADD.

CTDB_CONTROL_TCP_CLIENT has support for 2 modes in newer ctdb versions:

- with struct ctdb_control_tcp it only supports ipv4.
- with struct ctdb_control_tcp_addr it supports ipv4 and ipv6.

You need new header files which defines struct ctdb_control_tcp_addr,
but at runtime it should be fine to work against older
ctdb versions (<= 1.0.68).

metze

source3/include/ctdbd_conn.h
source3/lib/ctdbd_conn.c
source3/smbd/server.c

index 44c35168a8170f65ea00605bf7ba3da094b18049..d72123533622c3f5f16e85cc5ac33b8f9232806b 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 *server,
-                           const struct sockaddr *client,
+                           const struct sockaddr_storage *server,
+                           const struct sockaddr_storage *client,
                            void (*release_ip_handler)(const char *ip_addr,
                                                       void *private_data),
                            void *private_data);
index c94ef802c4b68a5371df2d5027698d92dca645b9..f8dae8fbd6ce755e0a863659560015e5121282f2 100644 (file)
@@ -1181,13 +1181,22 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
  */
 
 NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
-                           const struct sockaddr *server,
-                           const struct sockaddr *client,
+                           const struct sockaddr_storage *server,
+                           const struct sockaddr_storage *client,
                            void (*release_ip_handler)(const char *ip_addr,
                                                       void *private_data),
                            void *private_data)
 {
-       struct ctdb_control_tcp_vnn p;
+       struct sockaddr *sock = (struct sockaddr *)client;
+       /*
+        * we still use ctdb_control_tcp for ipv4
+        * because we want to work against older ctdb
+        * versions at runtime
+        */
+       struct ctdb_control_tcp p4;
+#ifdef HAVE_IPV6
+       struct ctdb_control_tcp_addr p;
+#endif
        TDB_DATA data;
        NTSTATUS status;
 
@@ -1196,15 +1205,19 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
         */
        SMB_ASSERT(conn->release_ip_handler == NULL);
 
-       switch (client->sa_family) {
+       switch (sock->sa_family) {
        case AF_INET:
-               p.dest.ip = *(struct sockaddr_in *)server;
-               p.src.ip = *(struct sockaddr_in *)client;
+               p4.dest = *(struct sockaddr_in *)server;
+               p4.src = *(struct sockaddr_in *)client;
+               data.dptr = (uint8_t *)&p4;
+               data.dsize = sizeof(p4);
                break;
 #ifdef HAVE_IPV6
        case AF_INET6:
                p.dest.ip6 = *(struct sockaddr_in6 *)server;
                p.src.ip6 = *(struct sockaddr_in6 *)client;
+               data.dptr = (uint8_t *)&p;
+               data.dsize = sizeof(p);
                break;
 #endif
        default:
@@ -1227,11 +1240,8 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
         * can send an extra ack to trigger a reset for our client, so it
         * immediately reconnects
         */
-       data.dptr = (uint8_t *)&p;
-       data.dsize = sizeof(p);
-
        return ctdbd_control(conn, CTDB_CURRENT_NODE, 
-                            CTDB_CONTROL_TCP_ADD, 0,
+                            CTDB_CONTROL_TCP_CLIENT, 0,
                             CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL, NULL);
 }
 
index 00e939e2b802888b0850465add493a58f027c5fd..a884914839db9fec5a807305e7fc7cb60342d22e 100644 (file)
@@ -1458,9 +1458,7 @@ extern void build_options(bool screen);
 
                        status = ctdbd_register_ips(
                                messaging_ctdbd_connection(),
-                               (struct sockaddr *)&srv,
-                               (struct sockaddr *)&clnt,
-                               release_ip, NULL);
+                               &srv, &clnt, release_ip, NULL);
 
                        if (!NT_STATUS_IS_OK(status)) {
                                DEBUG(0, ("ctdbd_register_ips failed: %s\n",