diff options
author | Volker Lendecke <vl@samba.org> | 2010-09-29 12:17:05 +0200 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2010-09-30 14:30:33 +0200 |
commit | bad98e37e7e4077a74c7b32d74499c78810192c5 (patch) | |
tree | 0b69670fc18170d7bc5e9ef0be6643c1ef595fa9 /source3/winbindd | |
parent | 10f0c785c70b89e76f3a9cd3b319262affc9447e (diff) | |
download | samba-bad98e37e7e4077a74c7b32d74499c78810192c5.tar.gz samba-bad98e37e7e4077a74c7b32d74499c78810192c5.tar.bz2 samba-bad98e37e7e4077a74c7b32d74499c78810192c5.zip |
s3: Add "smbcontrol winbindd ip-dropped <local-ip>"
This is supposed to improve the winbind reconnect time after an ip address
has been moved away from a box. Any kind of HA scenario will benefit from
this, because winbindd does not have to wait for the TCP timeout to kick in
when a local IP address has been dropped and DC replies are not received
anymore.
Diffstat (limited to 'source3/winbindd')
-rw-r--r-- | source3/winbindd/winbindd.c | 4 | ||||
-rw-r--r-- | source3/winbindd/winbindd_cm.c | 33 | ||||
-rw-r--r-- | source3/winbindd/winbindd_dual.c | 22 | ||||
-rw-r--r-- | source3/winbindd/winbindd_proto.h | 10 |
4 files changed, 69 insertions, 0 deletions
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c index 9c0a1fb921..0c9cdcf52e 100644 --- a/source3/winbindd/winbindd.c +++ b/source3/winbindd/winbindd.c @@ -1062,6 +1062,10 @@ void winbindd_register_handlers(void) MSG_WINBIND_DUMP_DOMAIN_LIST, winbind_msg_dump_domain_list); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_IP_DROPPED, + winbind_msg_ip_dropped_parent); + /* Register handler for MSG_DEBUG. */ messaging_register(winbind_messaging_context(), NULL, MSG_DEBUG, diff --git a/source3/winbindd/winbindd_cm.c b/source3/winbindd/winbindd_cm.c index 4ab2d94aa6..3d84b62652 100644 --- a/source3/winbindd/winbindd_cm.c +++ b/source3/winbindd/winbindd_cm.c @@ -2567,3 +2567,36 @@ NTSTATUS cm_connect_netlogon(struct winbindd_domain *domain, *cli = conn->netlogon_pipe; return NT_STATUS_OK; } + +void winbind_msg_ip_dropped(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) +{ + struct winbindd_domain *domain; + + if ((data == NULL) + || (data->data == NULL) + || (data->length == 0) + || (data->data[data->length-1] != '\0') + || !is_ipaddress((char *)data->data)) { + DEBUG(1, ("invalid msg_ip_dropped message\n")); + return; + } + for (domain = domain_list(); domain != NULL; domain = domain->next) { + char sockaddr[INET6_ADDRSTRLEN]; + if (domain->conn.cli == NULL) { + continue; + } + if (domain->conn.cli->fd == -1) { + continue; + } + client_socket_addr(domain->conn.cli->fd, sockaddr, + sizeof(sockaddr)); + if (strequal(sockaddr, (char *)data->data)) { + close(domain->conn.cli->fd); + domain->conn.cli->fd = -1; + } + } +} diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c index 931ec6787a..a6cc64a7b5 100644 --- a/source3/winbindd/winbindd_dual.c +++ b/source3/winbindd/winbindd_dual.c @@ -1295,6 +1295,10 @@ static bool fork_domain_child(struct winbindd_child *child) MSG_DUMP_EVENT_LIST, child_msg_dump_event_list); messaging_register(winbind_messaging_context(), NULL, MSG_DEBUG, debug_message); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_IP_DROPPED, + winbind_msg_ip_dropped); + primary_domain = find_our_domain(); @@ -1486,3 +1490,21 @@ static bool fork_domain_child(struct winbindd_child *child) TALLOC_FREE(frame); } } + +void winbind_msg_ip_dropped_parent(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) +{ + struct winbindd_child *child; + + winbind_msg_ip_dropped(msg_ctx, private_data, msg_type, + server_id, data); + + + for (child = winbindd_children; child != NULL; child = child->next) { + messaging_send_buf(msg_ctx, pid_to_procid(child->pid), + msg_type, data->data, data->length); + } +} diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h index fa3cc10834..3588af1bff 100644 --- a/source3/winbindd/winbindd_proto.h +++ b/source3/winbindd/winbindd_proto.h @@ -296,6 +296,16 @@ void winbind_msg_dump_domain_list(struct messaging_context *msg_ctx, uint32_t msg_type, struct server_id server_id, DATA_BLOB *data); +void winbind_msg_ip_dropped(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data); +void winbind_msg_ip_dropped_parent(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data); bool winbindd_reinit_after_fork(const char *logfilename); struct winbindd_domain *wb_child_domain(void); |