mirror of
https://github.com/samba-team/samba.git
synced 2025-03-05 20:58:40 +03:00
added lots of comments to the docs that Luke wrote on the internals of
nmbd. I haven't been through all of them yet, but I'm getting there :-) (This used to be commit 9e411f2c9044104df60022da316379bd27e98b56)
This commit is contained in:
parent
a1ab08fdb5
commit
1c2ab212d9
@ -27,6 +27,41 @@ a primary domain controller for its workgroup (either by directed
|
||||
packet or by broadcast if it cannot resolve the domain controller
|
||||
name using DNS), which results in the same action as listed above.
|
||||
|
||||
------------
|
||||
NOTE FROM TRIDGE:
|
||||
|
||||
PDC in the above should really be DMB (domain master browser). They
|
||||
might be separate entities.
|
||||
|
||||
I also propose a simpler scheme :-)
|
||||
|
||||
If a DMB is not configured with lp_domain_controller() (perhaps
|
||||
renamed to lp_domain_master()?) then just don't do master
|
||||
announcements. Remember that most peoples networks are very simple and
|
||||
don't need DMB capabilities. Those that do need them will have more
|
||||
complex network topologies and they really need to choose themselves
|
||||
which box will act as the "hub" for netbios name resolution. Doing it
|
||||
via name queries will just lead to lag and propogation delays, because
|
||||
if two parts of the net choose different DMBs then the data will be
|
||||
very slow to propoogate.
|
||||
|
||||
If a DMB is configured then just sent the master announcemnt to that
|
||||
box! Thats all that needs to be done. Just send a udp 138 packet and
|
||||
forget it. If the recipient is indeed a DMB (as it should be if the
|
||||
config file is correct) then it should initiate a browse list sync
|
||||
with us at some later time, but that is take care of by smbd and nmbd
|
||||
doesn't even need to know it happened.
|
||||
|
||||
Additionally, if a DMB is configured we need to sync our workgroup
|
||||
list and server list with them occasionally. Note that this is only
|
||||
time a non-DMB should do a browse sync, and it should only do it with
|
||||
a DMB. Essentially WAN based netbios is just a simple star. There is a
|
||||
DMB in the centre, and the individual master browsers for each subnet
|
||||
talk to it, but never talk to each other. If they start talking to
|
||||
each other then the network load will go as the square of the number
|
||||
of machines, which will result in meltdown :-)
|
||||
-------------
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
announce_host()
|
||||
@ -103,6 +138,19 @@ the master browser, or primary domain controller, should respond
|
||||
with an ANN_GetBackupListResp browse mailslot containing the list
|
||||
of backup servers.
|
||||
|
||||
--------------
|
||||
NOTE FROM TRIDGE: I don't see why nmbd should ever send one of
|
||||
these. The only reason I can see for any part of Samba sending one of
|
||||
these is if we implement it in smbclient.
|
||||
|
||||
This packet is used to request a list of backup master browsers from
|
||||
the master browser. It is used by clients (not servers!) to spread the
|
||||
browse load over more than one server. The only server that needs to
|
||||
know what the list of backups is is the master browser, and as it is
|
||||
also responsible for generating this list it will never ask anyone
|
||||
else for it.
|
||||
--------------
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
sync_server()
|
||||
@ -135,3 +183,25 @@ if the announce request is sent to ^1^2__MSBROWSE__^2(0x1) then
|
||||
browsers should respond with ANN_DomainAnnounce packets.
|
||||
this is untested.
|
||||
|
||||
-----------
|
||||
NOTE FROM TRIDGE:
|
||||
|
||||
I had great trouble getting machines to actually respond to this
|
||||
packet. Either we have the format wrong or MS chose not to implement
|
||||
it.
|
||||
|
||||
Not implementing it doesn't break anything, it just means a new master
|
||||
browser won't get a complete server list as quickly.
|
||||
|
||||
Also note that this packet should be used as little as possible as it
|
||||
could easily cause meltdown if too many servers used it. Imagine a
|
||||
dozen samba servers on a net all sending this packet! You will get 244
|
||||
responses all within 30 seconds. now imagine 50 samba servers ....
|
||||
|
||||
So I think we should restrict ourselves to sending this packet only if
|
||||
we are already the master browser for a workgroup. We could send a
|
||||
single "announce request" when we become the master, just to prime our
|
||||
server lists. From then on the normal announce cycles should take care
|
||||
of keeping it uptodate.
|
||||
-----------
|
||||
|
||||
|
@ -17,6 +17,36 @@ master browser.
|
||||
samba does not deal with becoming a backup master browser properly
|
||||
at present.
|
||||
|
||||
-------------
|
||||
NOTE FROM TRIDGE:
|
||||
|
||||
Yes, samba can send these either in its capacity as a DMB or as a
|
||||
MB. There are only two situations:
|
||||
|
||||
- If samba is a DMB then it should sync with the "local only" bit set
|
||||
with any master browser that has sent it a "master announce".
|
||||
|
||||
- if samba is not a DMB then it can only sync with the DMB, and should
|
||||
not set the "local only" bit.
|
||||
|
||||
Note that samba should never sync with other non-DMB servers when it
|
||||
is not a DMB.
|
||||
|
||||
Try to do a sync under any other circumstances is dangerous without a
|
||||
multi-threaded nmbd. I have a print server at home that knows some SMB
|
||||
and NBT, but if you try to sync browse lists with it then it clogs up,
|
||||
and also clogs up nmbd while it times out the connection. If we
|
||||
follow the above two rules then we can't get into this sort of
|
||||
trouble as:
|
||||
|
||||
- if we are a DMB and a master browser sends us a "master announce"
|
||||
then it is expecting to receive a NetServerEnum SMB connection soon,
|
||||
and must be capabable of handling it.
|
||||
|
||||
- if we are not a DMB then we will only sync with the DMB, which must
|
||||
be capable of doing this stuff or things are really in a mess :-)
|
||||
--------------
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
do_browser_lists()
|
||||
@ -40,6 +70,24 @@ NetServerEnum api call.
|
||||
samba will only initiate this process if it is a master browser
|
||||
for this workgroup.
|
||||
|
||||
-----------
|
||||
NOTE FROM TRIDGE:
|
||||
|
||||
I'd actually prefer to skip the name query completely if we can
|
||||
resolve the DMBs name via gethostbyname(). For the name query to work
|
||||
we either have to have WINS working, or we need to know the broadcast
|
||||
address of the network that the DMB is on. This makes us too dependent
|
||||
on too many thing being right.
|
||||
|
||||
If the gethostbyname() fails then sure, go for a normal name query,
|
||||
but if it works then we have saved ourselves a lot of trouble and
|
||||
gained a lot of robustness.
|
||||
|
||||
This is best handled by a generic "resolve netbios name" routine that
|
||||
tries DNS first then resorts to WINS or bcast if that fails. It also
|
||||
needs to cache the results.
|
||||
-------------
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
add_browser_entry()
|
||||
@ -67,3 +115,6 @@ this function's scope) and have been in the cache for a while.
|
||||
this function is responsible for adding a new entry into the list
|
||||
of servers to sync browse lists with at some point in the near future.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -46,3 +46,25 @@ expected response queue. the number of expected responses is decreased.
|
||||
this function is responsible for adding the response record created by
|
||||
make_response_queue_record() into the appropriate response record queue.
|
||||
|
||||
|
||||
-----------------
|
||||
NOTE FROM TRIDGE:
|
||||
|
||||
namedbresp.c is interesting because it implements a novel way of
|
||||
getting most of the advantages of a multi-threaded nmbd daemon without
|
||||
the portability problems.
|
||||
|
||||
The NBT specs (rfc1001/1002) talk about the 16 bit IDs in the packets
|
||||
as being used to ensure that packets are unique, and to stop packets
|
||||
from being confused. It suggests incrementing the ID by 1 each time.
|
||||
|
||||
Instead Luke uses these IDs to identify individual threads of control
|
||||
in nmbd. So when nmbd sends out a NBT packet as part of some complex
|
||||
processing, it adds to a linked list the information required to
|
||||
continue the processing when the reply comes in (or it times
|
||||
out). When a reply arrives this list can be searched to find the
|
||||
matching query and the next step in the processing can be carried out.
|
||||
|
||||
This is really good stuff, and allows for much more complex behaviour
|
||||
than was possible with the old nmbd.
|
||||
----------------
|
||||
|
@ -21,6 +21,20 @@ wide area network).
|
||||
(a wide area network is created when one or more servers on a
|
||||
broadcast-isolated subnet point to the same WINS server).
|
||||
|
||||
--------
|
||||
NOTE FROM TRIDGE:
|
||||
|
||||
I'd say "domain master browser" not "WINS server" here. WINS doesn't
|
||||
have much to do with browsing, it is the WAN varient of name
|
||||
resolution. The name resolution and browsing functions of a netbios
|
||||
network are almost entirely separate. Both grew out of systems that
|
||||
could only be used on local networks.
|
||||
|
||||
To adapt them to WANs, WINS was added for name resolution, and "domain
|
||||
master browsers" were added for browse lists. It would be perfectly
|
||||
possible to have a WINS server that doesn't even listen to UDP port
|
||||
138.
|
||||
--------
|
||||
|
||||
/*************************************************************************
|
||||
check_elections()
|
||||
|
Loading…
x
Reference in New Issue
Block a user