summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2009-01-14 12:09:46 +0100
committerStefan Metzmacher <metze@samba.org>2009-01-16 15:16:59 +0100
commitdc6edf1ab4ae8e3fb3ef40b93135ff0ef5407e12 (patch)
treee199445195020bde967d7d8b1b6d28e76ba74ec8
parent6a94b7b9270f3d69595b93e2632051c9842645c9 (diff)
downloadsamba-dc6edf1ab4ae8e3fb3ef40b93135ff0ef5407e12.tar.gz
samba-dc6edf1ab4ae8e3fb3ef40b93135ff0ef5407e12.tar.bz2
samba-dc6edf1ab4ae8e3fb3ef40b93135ff0ef5407e12.zip
s3:cluster: fix ctdb ipv6 support
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
-rw-r--r--source3/include/ctdbd_conn.h4
-rw-r--r--source3/lib/ctdbd_conn.c30
-rw-r--r--source3/smbd/server.c4
3 files changed, 23 insertions, 15 deletions
diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index 44c35168a8..d721235336 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -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);
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index c94ef802c4..f8dae8fbd6 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -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);
}
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 00e939e2b8..a884914839 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -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",