1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
|
/*
Unix SMB/Netbios documentation.
Version 0.1
Copyright (C) Luke Leighton Andrew Tridgell 1996
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Document name: namework.doc
Revision History:
0.0 - 02jul96 : lkcl@pires.co.uk
created
0.1 - 22jul96 Andrew.Tridgell@anu.edu.au
tridge's comments on first revision
*/
the module namework.c deals with NetBIOS datagram packets, primarily.
it deals with nmbd's workgroup browser side and the domain log in
side. none of the functionality here has specification documents available.
empirical observation of packet traces has been the order of the day,
along with some guess-work.
beware!
the receipt of datagram packets for workgroup browsing are dealt with here.
some of the functions listed here will call others outside of this
module, or will activate functionality dealt with by other modules
(namedb, nameannounce, nameelect, namelogon, and namebrowse).
/*************************************************************************
process_browse_packet()
*************************************************************************/
this function is responsible for further identifying which type of
browser datagram packet has been received, and dealing with it
accordingly. if the packet is not dealt with, then an error is
logged along with the type of packet that has been received.
if listening_type() was in use, then it would be used here.
the types of packets received and dealt with are:
- ANN_HostAnnouncement
- ANN_DomainAnnouncement
- ANN_LocalMasterAnnouncement
these are all identical in format and can all be processed by
process_announce(). an announcement is received from a host
(either a master browser telling us about itself, a server
telling us about itself or a master browser telling us about
a domain / workgroup)
- ANN_AnnouncementRequest
these are sent by master browsers or by servers. it is a
request to announce ourselves as appropriate by sending
either a ANN_HostAnnouncement datagram or both an
ANN_DomainAnnouncement and an ANN_LocalMasterAnnouncement
if we are a master browser (but not both).
- ANN_Election
this is an election datagram. if samba has been configured
as a domain master then it will also send out election
datagrams.
- ANN_GetBackupListReq
this is a request from another server for us to send a
backup list of all servers that we know about. we respond
by sending a datagram ANN_GetBackupListResp. the protocol
here is a little dicey.
- ANN_GetBackupListResp
this is a response from another server that we have sent an
ANN_GetBackupListReq to. the protocol is a little dicey.
- ANN_BecomeBackup
this is a message sent by a master browser to a
potential master browser, indicating that it should become
a backup master browser for the workgroup it is a member
of. samba does not respond at present to such datagrams,
and it also sends out such datagrams for the wrong reasons
(this code has now been disabled until this is fixed).
- ANN_ResetBrowserState
this datagram is sent for trouble-shooting purposes.
it asks a browser to clear out its server lists, or to
stop becoming a master browser altogether. NT/AS and
samba do not implement this latter option.
- ANN_MasterAnnouncement
this datagram is sent by a master browser to a domain master
browser. it is a way to ensure that master browsers are kept in sync
with a domain master browser across a wide area network. on
receipt of an ANN_MasterAnnouncement we should sync browse lists with
the sender.
(i never got the hang of this one when i was experimenting.
i forget exactly what it's for, and i never fully worked
out how to coax a server to send it. :-)
NOTE FROM TRIDGE: The reason you didn't work out how to coax a server
into sending it is that you can't (or shouldn't try!). Basically these
"master announce" datagrams are the way that separate netbios subnets
are linked together to form a complete browse net. The way it works is
that the local master decides it is going to inform the domain master
of its presence, then sends this master announce to the domain
master. The domain master then syncs with the local master using a
"local only" sync. The whole transaction is initiated by the local
master, not the domain master, so the domain master should not do any
of this if it does not first receive a "master announcement". The
local domain masters need to be configured to know the IP address of
the domain master.
/*************************************************************************
listening_type()
*************************************************************************/
a datagram packet is sent from one NetBIOS name of a specific type
to another NetBIOS name of a specific type. certain types of
datagrams are only expected from certain types of NetBIOS names.
this function is intended to catch errors in the type of datagrams
received from different NetBIOS names. it is currently incomplete
due to lack of information on the types of names and the datagrams
they send.
/*************************************************************************
process_announce_request()
*************************************************************************/
this function is responsible for dealing with announcement requests.
if the type of name that the request is sent to matches our current
status, then we should respond. otherwise, the datagram should be
ignored.
samba only responds on its local subnets.
at present, just the name is checked to see if the packet is for us.
what should be done is that if we own the name (e.g WORGROUP(0x1d)
or WORKGROUP(0x1b) then we should respond, otherwise, ignore the
datagram.
if the name is for us, and we are a member of that workgroup, then
samba should respond.
note that samba does not respond immediately. this is to ensure that
if the master browser for the workgroup that samba is a member of
sends out a broadcast request announcement, that that master browser
is not swamped with replies. it is therefore up to samba to reply
at some random interval. hence, a flag is set indicating the need
to announce later.
/*************************************************************************
process_reset_browser()
*************************************************************************/
this function is responsible for dealing with reset state datagrams.
there are three kinds of diagnostic reset requests:
- stop being a master browser
- discard browse lists, stop being a master browser, and run for re-election
- stop being a master browser forever.
samba and windows nt do not implement the latter option.
there appears to be a discrepancy between this description and the
code actually implemented.
/*************************************************************************
process_send_backup_list()
*************************************************************************/
this function is part of samba's domain master browser functionality.
it is responsible for giving master browsers a list of other browsers
that maintain backup lists of servers for that master browser's workgroup.
it is also responsible for giving master browsers a list of primary domain
controllers for that master browser's domain.
a correct way to think of this function is that it is a 'request to
send out a backup list for the requested workgroup or domain'.
i have some suspicions and intuitions about this function and how it
is to actually be used. there is no documentation on this, so it is a
matter of experimenting until it's right.
/*************************************************************************
send_backup_list()
*************************************************************************/
this function is responsible for compiling a list of either master
browsers and backup master browsers or primary domain controllers or
backup domain controllers. samba constructs this list from its
workgroup / server database.
the list is then sent to the host that requested it by sending an
ANN_GetBackupListResp datagram to this host.
NOTE FROM TRIDGE: The "backup list" stuff is only relevant to
local subnets. It has nothing to do with PDCs or domain masters. Its
function is twofold:
1) spread the browsing load over multiple servers so one server
doesn't get overloaded with browse requests
2) make sure the database doesn't get lost completely if the master
goes down
To accomplish this a few things are supposed to be done:
- the master browser maintains a list of "backup browsers".
- backup browsers are are machines that are just like ordinary servers
but also maintain a browse list and respond to "NetServerEnum"
requests
- when a server initially announces itself to the master it may set
its "maintain browse list" flag to auto.
- when a master browser sees a server announcement with "auto" set it
may send a "become backup" to that server telling it to become a
backup.
- the master has a simple algorithm to determine how many backups it wants
given the number of hosts on the net
- when a client wishes to get a browse list it asks the master for a
backup list. The master sends it the current list of backup browsers,
including itself. The client caches this list. The client then sends
the NetServerEnum to a random member of this list easch time it wants
to browse. This spreads the load.
/*************************************************************************
process_rcv_backup_list()
*************************************************************************/
this function is implemented with a slightly over-kill algorithm.
the correct functionality is to pick any three names at random from
the list that is received from this datagram, and then at intervals
contact _one_ of them for a list of browser, in order to update
samba's browse list.
samba contacts every single one of the backup browsers listed, through
the use of a NAME_QUERY_SRV_CHK 'state'.
/*************************************************************************
process_master_announce()
*************************************************************************/
this function is responsible for synchronising browse lists with a
master browser that contacts samba in its capacity as a domain master
browser.
the function add_browser_entry() is used to add the server that
contacts us to our list of browser to sync browse lists with at
some point in the near future.
/*************************************************************************
process_announce()
*************************************************************************/
this function is responsible for dealing with the three types of
announcement type datagrams that samba recognises. some appropriate
type-checking is done on the name that the datagram is sent to.
samba does not at present deal with LanManager announcements.
these announcements are for updating the browse entry records.
each browse entry has a time-to-live associated with it. each server
must refresh its entry with all other servers by broadcasting
Announcements. if it does not do so, then other servers will not
know about that machine, and the records on each server of that
other machine will die.
if an ANN_DomainAnnouncement is received, then this will be from
a master browser. only one machine on any given broadcast area (e.g
a subnet) should be broadcasting such announcements. the information
it contains tells other servers that there is a master browser for
this workgroup. if another server thinks that it is also a master
browser for the same workgroup, then it should stop being a master
browser and force an election.
if an ANN_LocalMasterAnnouncement is received, then a master browser
is telling us that it exists. i am uncertain that anything else
actually needs to be done with this, other than to shout 'hooray' and
'thank you for informing me of this fact'.
/*************************************************************************
listening_name()
*************************************************************************/
this function is an over-simplified way of identifying whether we
should be responding to a datagram that has been received.
/*************************************************************************
same_context()
*************************************************************************/
this function helps us to identify whether we should be responding to
a datagram that has been received.
/*************************************************************************
tell_become_backup()
*************************************************************************/
this function is part of samba's domain master browser capabilities.
it is responsible for finding appropriate servers to tell to become a
backup master browser for the domain that samba controls.
other servers that contact samba asking for a list of backup browsers
will then be given that server's name, and that server can expect to
receive NetServerEnum requests for lists of servers and workgroups.
this function must be updated before it is in a fit state to be used.
it must properly check whether a server is prepared to become a backup
browser before actually asking it to be one.
/*************************************************************************
reset_server()
*************************************************************************/
this function is responsible for issuing an ANN_ResetBrowserState to
the specified server, asking it to reset its browser information.
see process_reset_browser() for details on this function.
|