diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-01-14 12:09:46 +0100 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2009-01-16 15:16:59 +0100 |
commit | dc6edf1ab4ae8e3fb3ef40b93135ff0ef5407e12 (patch) | |
tree | e199445195020bde967d7d8b1b6d28e76ba74ec8 | |
parent | 6a94b7b9270f3d69595b93e2632051c9842645c9 (diff) | |
download | samba-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.h | 4 | ||||
-rw-r--r-- | source3/lib/ctdbd_conn.c | 30 | ||||
-rw-r--r-- | source3/smbd/server.c | 4 |
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", |