The branch, v3-2-ctdb has been updated via fa7a49f9298c0044419947d2863aedb64e398811 (commit) via 67c6def39fe0d3fa7dc4dba690e6ab94e01fe114 (commit) from 0a648c520756fdd6f25b60c69b1e19a1a58dd03a (commit)
http://gitweb.samba.org/?p=obnox/samba-ctdb.git;a=shortlog;h=v3-2-ctdb - Log ----------------------------------------------------------------- commit fa7a49f9298c0044419947d2863aedb64e398811 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Jan 14 12:09:46 2009 +0100 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 (cherry picked from commit dc6edf1ab4ae8e3fb3ef40b93135ff0ef5407e12) (cherry picked from commit c07bcd6efd3383fc3a46fce35fd34df85ab221c9) (cherry picked from commit 9a5aee97cf6ec1514225e3060b0a083e9afdab32) Signed-off-by: Michael Adam <ob...@samba.org> commit 67c6def39fe0d3fa7dc4dba690e6ab94e01fe114 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Jan 15 12:49:06 2009 +0100 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 (cherry picked from commit 465176b7e2fc1370dded850a80a8fe8519e79db8) (cherry picked from commit 6d5b415c5a0d7e0b7aae2f20ee7989ca58ec2f81) (cherry picked from commit 0d9563329967838b3c91728a7ed8e88872d5047b) Signed-off-by: Michael Adam <ob...@samba.org> ----------------------------------------------------------------------- Summary of changes: source/include/ctdbd_conn.h | 4 ++-- source/lib/ctdbd_conn.c | 40 +++++++++++++++++++++++++++++++--------- source/smbd/server.c | 5 +++-- 3 files changed, 36 insertions(+), 13 deletions(-) Changeset truncated at 500 lines: diff --git a/source/include/ctdbd_conn.h b/source/include/ctdbd_conn.h index 39f50c2..d721235 100644 --- a/source/include/ctdbd_conn.h +++ b/source/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_storage *server, + const struct sockaddr_storage *client, void (*release_ip_handler)(const char *ip_addr, void *private_data), void *private_data); diff --git a/source/lib/ctdbd_conn.c b/source/lib/ctdbd_conn.c index 1ae23bc..3c602c8 100644 --- a/source/lib/ctdbd_conn.c +++ b/source/lib/ctdbd_conn.c @@ -1175,13 +1175,22 @@ 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_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 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; @@ -1190,6 +1199,25 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn, */ SMB_ASSERT(conn->release_ip_handler == NULL); + switch (sock->sa_family) { + case AF_INET: + 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: + return NT_STATUS_INTERNAL_ERROR; + } + conn->release_ip_handler = release_ip_handler; /* @@ -1201,17 +1229,11 @@ 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 * immediately reconnects */ - data.dptr = (uint8_t *)&p; - data.dsize = sizeof(p); - return ctdbd_control(conn, CTDB_CURRENT_NODE, CTDB_CONTROL_TCP_CLIENT, 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL, NULL); diff --git a/source/smbd/server.c b/source/smbd/server.c index d380a76..9dd5c4e 100644 --- a/source/smbd/server.c +++ b/source/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) { @@ -1438,7 +1439,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) { -- SAMBA-CTDB repository