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);
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);
*/
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;
*/
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;
/*
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
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);
}
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) {
* client.
*/
- struct sockaddr_in srv, clnt;
+ struct sockaddr_storage srv, clnt;
if (client_get_tcp_info(&srv, &clnt) == 0) {
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",