summaryrefslogtreecommitdiff
path: root/source3/nameserv.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1996-08-21 06:09:00 +0000
committerAndrew Tridgell <tridge@samba.org>1996-08-21 06:09:00 +0000
commitb5a64bb74056fad43afedcb05d29000618170ef4 (patch)
tree9373ad05fe68254b02678ebf5ea5e513c39d6226 /source3/nameserv.c
parenta2fa290188911b1013a8950fe18489038c8fcb05 (diff)
downloadsamba-b5a64bb74056fad43afedcb05d29000618170ef4.tar.gz
samba-b5a64bb74056fad43afedcb05d29000618170ef4.tar.bz2
samba-b5a64bb74056fad43afedcb05d29000618170ef4.zip
- new handling of ST_TYPE bits, they are now consolidated much more in
DFLT_SERVER_TYPE in nameserv.h - got rid of a lot of spurious domain controller stuff. Samba is not a domain controller yet, but it can be a domain master. We were claiming to be a domain controller in some packets which may have caused problems - don't do preferred master startups on the WINS pseudo-net - don't do election requests on the WINS pseudo-net - fix a nasty bug in become_non_master() which wiped out the bits in remove_type before using them. The result was that samba didn't like losing its master status. - changed the logic in the election packet handling to enable us to become a non-master whenever we receive a winning election frame, even if we aren't expecting it - get another packet from the socket in nmbd when we reject one of our own packets, this stops us from going into the packet reading code too often and makes nmbd much snappier - always remove a name immediately when we try to release it, don't wait for the lack of response from the network, otherwise we will end up replying to name that we don't really own. We still send the dereg packets, we just don't wait for them to time out. (This used to be commit eb84f2f342375439d94481a0ccf47c9593544e32)
Diffstat (limited to 'source3/nameserv.c')
-rw-r--r--source3/nameserv.c47
1 files changed, 18 insertions, 29 deletions
diff --git a/source3/nameserv.c b/source3/nameserv.c
index 8831cb510f..26c2f330da 100644
--- a/source3/nameserv.c
+++ b/source3/nameserv.c
@@ -47,7 +47,7 @@ extern uint16 nb_type; /* samba's NetBIOS type */
/****************************************************************************
remove an entry from the name list
- note: the name will _always_ be removed: it's just a matter of when.
+ note: the name will _always_ be removed
XXXX at present, the name is removed _even_ if a WINS server says keep it.
****************************************************************************/
@@ -72,37 +72,26 @@ void remove_name_entry(struct subnet_record *d, char *name,int type)
n2->ip_flgs[0].nb_flags &= NB_DEREG;
}
- if (ip_equal(d->bcast_ip, ipgrp))
- {
- if (lp_wins_support())
- {
- /* we are a WINS server. */
- /* XXXX assume that if we are a WINS server that we are therefore
- not pointing to another WINS server as well. this may later NOT
- actually be true
- */
- remove_netbios_name(d,name,type,SELF,ipzero);
- }
- else
- {
- /* not a WINS server: cannot just remove our own names: we have to
- release them on the network first. ask permission from the WINS
- server, or if no reply is received, then we can remove the name */
+ if (!n2) return;
- queue_netbios_pkt_wins(d,ClientNMB,NMB_REL,NAME_RELEASE,
- name, type, 0, 0,0,NULL,NULL,
- False, True, ipzero, ipzero);
- }
- }
- else
- {
- /* local interface: cannot just remove our own names: we have to
- release them on the network first. once no reply is received,
- then we can remove the name. */
+ /* remove the name immediately. even if the spec says we should
+ first try to release them, this is too dangerous with our current
+ name structures as otherwise we will end up replying to names we
+ don't really own */
+ remove_netbios_name(d,name,type,SELF,n2->ip_flgs[0].ip);
- queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
+ if (ip_equal(d->bcast_ip, ipgrp)) {
+ if (!lp_wins_support()) {
+ /* not a WINS server: we have to release them on the network */
+ queue_netbios_pkt_wins(d,ClientNMB,NMB_REL,NAME_RELEASE,
name, type, 0, 0,0,NULL,NULL,
- True, True, d->bcast_ip, d->bcast_ip);
+ False, True, ipzero, ipzero);
+ }
+ } else {
+ /* local interface: release them on the network */
+ queue_netbios_packet(d,ClientNMB,NMB_REL,NAME_RELEASE,
+ name, type, 0, 0,0,NULL,NULL,
+ True, True, d->bcast_ip, d->bcast_ip);
}
}