From 465176b7e2fc1370dded850a80a8fe8519e79db8 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 18 Dec 2008 15:02:42 +0100 Subject: s3:cluster: register the client connection via CTDB_CONTROL_TCP_ADD This means we correctly pass IPv6 addresses too. (CTDB_CONTROL_TCP_CLIENT was IPv4 only) metze --- source3/include/ctdbd_conn.h | 4 ++-- source3/include/proto.h | 1 - source3/lib/ctdbd_conn.c | 26 +++++++++++++++++++------- source3/smbd/server.c | 9 ++++++--- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h index 39f50c2cfc..44c35168a8 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_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); diff --git a/source3/include/proto.h b/source3/include/proto.h index b874beb30b..7c00d7b110 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -7690,7 +7690,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); diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c index 10a65c5bcc..8d97606b85 100644 --- a/source3/lib/ctdbd_conn.c +++ b/source3/lib/ctdbd_conn.c @@ -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); } diff --git a/source3/smbd/server.c b/source3/smbd/server.c index f7bdb58288..cfdd05ba2f 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -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", -- cgit