diff options
Diffstat (limited to 'source3/nmbd')
-rw-r--r-- | source3/nmbd/nmbd_nameregister.c | 9 | ||||
-rw-r--r-- | source3/nmbd/nmbd_namerelease.c | 11 | ||||
-rw-r--r-- | source3/nmbd/nmbd_packets.c | 16 |
3 files changed, 29 insertions, 7 deletions
diff --git a/source3/nmbd/nmbd_nameregister.c b/source3/nmbd/nmbd_nameregister.c index cbc72fe2a9..cc1fac5577 100644 --- a/source3/nmbd/nmbd_nameregister.c +++ b/source3/nmbd/nmbd_nameregister.c @@ -197,6 +197,15 @@ static void register_name_timeout_response(struct subnet_record *subrec, DEBUG(2,("register_name_timeout_response: WINS server at address %s is not \ responding.\n", inet_ntoa(rrec->packet->ip))); + /* mark it temporarily dead */ + wins_srv_died(rrec->packet->ip); + + /* and try the next wins server in our failover list */ + rrec->packet->ip = wins_srv_ip(); + + /* also update the UNICODE subnet IPs */ + subrec->bcast_ip = subrec->mask_ip = subrec->myip = rrec->packet->ip; + /* Keep trying to contact the WINS server periodically. This allows us to work correctly if the WINS server is down temporarily when we come up. */ diff --git a/source3/nmbd/nmbd_namerelease.c b/source3/nmbd/nmbd_namerelease.c index fd35181f33..cefab44a08 100644 --- a/source3/nmbd/nmbd_namerelease.c +++ b/source3/nmbd/nmbd_namerelease.c @@ -147,9 +147,14 @@ static void release_name_timeout_response(struct subnet_record *subrec, DEBUG(2,("release_name_timeout_response: WINS server at address %s is not \ responding.\n", inet_ntoa(rrec->packet->ip))); - /* Keep trying to contact the WINS server periodically. This allows - us to work correctly if the WINS server is down temporarily when - we want to delete the name. */ + /* mark it temporarily dead */ + wins_srv_died(rrec->packet->ip); + + /* and try the next wins server */ + rrec->packet->ip = wins_srv_ip(); + + /* also update the UNICODE subnet IPs */ + subrec->bcast_ip = subrec->mask_ip = subrec->myip = rrec->packet->ip; /* Reset the number of attempts to zero and double the interval between retries. Max out at 5 minutes. */ diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c index a11b30b1dc..b5741caae0 100644 --- a/source3/nmbd/nmbd_packets.c +++ b/source3/nmbd/nmbd_packets.c @@ -264,11 +264,19 @@ static BOOL create_and_init_additional_record(struct packet_struct *packet, /* Set the address for the name we are registering. */ putip(&nmb->additional->rdata[2], register_ip); - /* Ensure that we send out the file descriptor to give us the - the specific source address we are registering as our - IP source address. */ - +#if 0 + /* I removed this forced source IP as it breaks wins failover. The + problem is that our 2nd interface IP may not be routable to the + wins server, in which case all these nice packets we are senidng + out will never get a response and we end up marking a perfectly good wins server dead. + + In general I can't see any reason why we should force the source + ip on a packet anyway. We should just let the kernels routin + table take care of it, as that is the only place which really + knows what is routable and what isn't. (tridge) + */ packet->fd = find_subnet_fd_for_address( *register_ip ); +#endif return True; } |