summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2008-12-18 15:02:42 +0100
committerStefan Metzmacher <metze@samba.org>2008-12-30 16:18:08 +0100
commit465176b7e2fc1370dded850a80a8fe8519e79db8 (patch)
treeea30f048d79a7a0ce5d7b382a9312908e1825d05
parentfee2664dad37536b05ce8bdae3e74d45b257f632 (diff)
downloadsamba-465176b7e2fc1370dded850a80a8fe8519e79db8.tar.gz
samba-465176b7e2fc1370dded850a80a8fe8519e79db8.tar.bz2
samba-465176b7e2fc1370dded850a80a8fe8519e79db8.zip
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
-rw-r--r--source3/include/ctdbd_conn.h4
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/lib/ctdbd_conn.c26
-rw-r--r--source3/smbd/server.c9
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",