03bb5215586f94c0e14f2d678462117548931f00
[kai/samba.git] / source3 / include / nameserv.h
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    NBT netbios header - version 2
5    Copyright (C) Andrew Tridgell 1994-1995
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20    
21 */
22
23 /* NTAS uses 2, NT uses 1, WfWg uses 0 */
24 #define MAINTAIN_LIST    2
25 #define ELECTION_VERSION 1
26
27 #define MAX_DGRAM_SIZE (80*18+64)
28 #define MIN_DGRAM_SIZE 12
29
30 #define NMB_QUERY  0x20
31 #define NMB_STATUS 0x21
32
33 #define NMB_REG         0x05 /* see rfc1002.txt 4.2.2,3,5,6,7,8 */
34 #define NMB_REG_REFRESH 0x09 /* see rfc1002.txt 4.2.4 */
35 #define NMB_REL         0x06 /* see rfc1002.txt 4.2.9,10,11 */
36 #define NMB_WAIT_ACK    0x07 /* see rfc1002.txt 4.2.17 */
37 /* XXXX what about all the other types?? 0x1, 0x2, 0x3, 0x4, 0x8? */
38
39 #define NB_GROUP  0x80
40 #define NB_PERM   0x02
41 #define NB_ACTIVE 0x04
42 #define NB_CONFL  0x08
43 #define NB_DEREG  0x10
44 #define NB_BFLAG  0x00
45 #define NB_PFLAG  0x20
46 #define NB_MFLAG  0x40
47 #define NB__FLAG  0x60
48 #define NB_FLGMSK 0x60
49
50 #define REFRESH_TIME (15*60)
51 #define NAME_POLL_REFRESH_TIME (5*60)
52 #define NAME_POLL_INTERVAL 15
53
54 #define NAME_PERMANENT(p) ((p) & NB_PERM)
55 #define NAME_ACTIVE(p)    ((p) & NB_ACTIVE)
56 #define NAME_CONFLICT(p)  ((p) & NB_CONFL)
57 #define NAME_DEREG(p)     ((p) & NB_DEREG)
58 #define NAME_GROUP(p)     ((p) & NB_GROUP)
59
60 #define NAME_BFLAG(p)     (((p) & NB_FLGMSK) == NB_BFLAG)
61 #define NAME_PFLAG(p)     (((p) & NB_FLGMSK) == NB_PFLAG)
62 #define NAME_MFLAG(p)     (((p) & NB_FLGMSK) == NB_MFLAG)
63 #define NAME__FLAG(p)     (((p) & NB_FLGMSK) == NB__FLAG)
64
65 #define MSBROWSE "\001\002__MSBROWSE__\002"
66
67 enum name_source {STATUS_QUERY, LMHOSTS, REGISTER, SELF, DNS, DNSFAIL};
68 enum node_type {B_NODE=0, P_NODE=1, M_NODE=2, NBDD_NODE=3};
69 enum packet_type {NMB_PACKET, DGRAM_PACKET};
70 enum cmd_type
71 {
72         NAME_STATUS_MASTER_CHECK,
73         NAME_STATUS_CHECK,
74         NAME_REGISTER,
75         NAME_RELEASE,
76         NAME_QUERY_CONFIRM,
77         NAME_QUERY_SYNC,
78         NAME_QUERY_MST_SRV_CHK,
79         NAME_QUERY_SRV_CHK,
80         NAME_QUERY_FIND_MST,
81         NAME_QUERY_MST_CHK
82 };
83
84 /* a netbios name structure */
85 struct nmb_name {
86   char name[17];
87   char scope[64];
88   int name_type;
89 };
90
91 /* this is the structure used for the local netbios name list */
92 struct name_record
93 {
94   struct name_record *next;
95   struct name_record *prev;
96
97   struct nmb_name name;    /* the netbios name */
98   struct in_addr ip;       /* ip address of host that owns this name */
99   int nb_flags;            /* netbios flags */
100
101   enum name_source source; /* where the name came from */
102
103   time_t death_time; /* time record must be removed (do not remove if 0) */
104   time_t refresh_time; /* time record should be refreshed */
105 };
106
107 /* browse and backup server cache for synchronising browse list */
108 struct browse_cache_record
109 {
110         struct browse_cache_record *next;
111         struct browse_cache_record *prev;
112
113         pstring name;
114         int type;
115         pstring group;
116         struct in_addr ip;
117         time_t sync_time;
118         BOOL synced;
119 };
120
121 /* this is used to hold the list of servers in my domain, and is */
122 /* contained within lists of domains */
123 struct server_record
124 {
125   struct server_record *next;
126   struct server_record *prev;
127
128   struct server_info_struct serv;
129   time_t death_time;  
130 };
131
132 /* a workgroup structure. it contains a list of servers */
133 struct work_record
134 {
135   struct work_record *next;
136   struct work_record *prev;
137
138   struct server_record *serverlist;
139
140   /* work group info */
141   fstring work_group;
142   int     token;        /* used when communicating with backup browsers */
143   int     ServerType;
144
145   /* announce info */
146   time_t lastannounce_time;
147   int announce_interval;
148   BOOL    needannounce;
149
150   /* election info */
151   BOOL    RunningElection;
152   BOOL    needelection;
153   int     ElectionCount;
154   uint32  ElectionCriterion;
155 };
156
157 /* initiated name queries recorded in this list to track any responses... */
158 struct response_record
159 {
160   struct response_record *next;
161   struct response_record *prev;
162
163   uint16 response_id;
164   enum cmd_type cmd_type;
165
166   int fd;
167   int quest_type;
168   struct nmb_name name;
169   int nb_flags;
170   time_t ttl;
171
172   BOOL bcast;
173   BOOL recurse;
174   struct in_addr to_ip;
175
176   int num_msgs;
177
178   time_t repeat_time;
179   time_t repeat_interval;
180   int    repeat_count;
181 };
182
183 /* a subnet structure. it contains a list of workgroups and netbios names*/
184
185 /* note that a subnet of 255.255.255.255 contains all the WINS netbios names.
186    all communication from such nodes are on a non-broadcast basis: they
187    are point-to-point (P nodes) or mixed point-to-point and broadcast
188    (M nodes). M nodes use point-to-point as a preference, and will use
189    broadcasting for certain activities, or will resort to broadcasting as a
190    last resort, if the WINS server fails (users of wfwg will notice that their
191    machine often freezes for 30 seconds at a time intermittently, if the WINS
192    server is down).
193
194    B nodes will have their own, totally separate subnet record, with their
195    own netbios name set. these do NOT interact with other subnet records'
196    netbios names, INCLUDING the WINS one (with an ip "address", so called,
197    of 255.255.255.255)
198
199    there is a separate response list for each subnet record. in the case of
200    the 255.255.255.255 subnet record (WINS), the WINS server will be able to
201    use this to poll (infrequently!) each of its entries, to ensure that the
202    names are still in use.
203    XXXX this polling is a planned feature for a really over-cautious WINS server 
204 */
205
206 struct subnet_record
207 {
208   struct subnet_record *next;
209   struct subnet_record *prev;
210
211   struct work_record *workgrouplist; /* list of workgroups */
212   struct name_record *namelist;      /* list of netbios names */
213   struct response_record *responselist; /* list of responses expected */
214
215   struct in_addr bcast_ip;
216   struct in_addr mask_ip;
217   struct in_addr myip;
218
219   BOOL my_interface;
220 };
221
222 /* a resource record */
223 struct res_rec {
224   struct nmb_name rr_name;
225   int rr_type;
226   int rr_class;
227   int ttl;
228   int rdlength;
229   char rdata[MAX_DGRAM_SIZE];
230 };
231
232 /* define a nmb packet. */
233 struct nmb_packet
234 {
235   struct {
236     int name_trn_id;
237     int opcode;
238     BOOL response;
239     struct {
240       BOOL bcast;
241       BOOL recursion_available;
242       BOOL recursion_desired;
243       BOOL trunc;
244       BOOL authoritative;
245     } nm_flags;
246     int rcode;
247     int qdcount;
248     int ancount;
249     int nscount;
250     int arcount;
251   } header;
252
253   struct {
254     struct nmb_name question_name;
255     int question_type;
256     int question_class;
257   } question;
258
259   struct res_rec *answers;
260   struct res_rec *nsrecs;
261   struct res_rec *additional;
262 };
263
264
265 /* a datagram - this normally contains SMB data in the data[] array */
266 struct dgram_packet {
267   struct {
268     int msg_type;
269     struct {
270       enum node_type node_type;
271       BOOL first;
272       BOOL more;
273     } flags;
274     int dgm_id;
275     struct in_addr source_ip;
276     int source_port;
277     int dgm_length;
278     int packet_offset;
279   } header;
280   struct nmb_name source_name;
281   struct nmb_name dest_name;
282   int datasize;
283   char data[MAX_DGRAM_SIZE];
284 };
285
286 /* define a structure used to queue packets. this will be a linked
287  list of nmb packets */
288 struct packet_struct
289 {
290   struct packet_struct *next;
291   struct packet_struct *prev;
292   struct in_addr ip;
293   int port;
294   int fd;
295   time_t timestamp;
296   enum packet_type packet_type;
297   union {
298     struct nmb_packet nmb;
299     struct dgram_packet dgram;
300   } packet;
301 };
302
303
304 #define AM_MASTER(work) (work->ServerType & SV_TYPE_MASTER_BROWSER)
305 #define AM_BACKUP(work) (work->ServerType & SV_TYPE_BACKUP_BROWSER)
306 #define AM_DOMCTL(work) (work->ServerType & SV_TYPE_DOMAIN_CTRL)
307
308
309 /* ids for netbios packet types */
310 #define ANN_HostAnnouncement         1
311 #define ANN_AnnouncementRequest      2
312 #define ANN_Election                 8
313 #define ANN_GetBackupListReq         9
314 #define ANN_GetBackupListResp       10
315 #define ANN_BecomeBackup            11
316 #define ANN_DomainAnnouncement      12
317 #define ANN_MasterAnnouncement      13
318 #define ANN_ResetBrowserState       14
319 #define ANN_LocalMasterAnnouncement 15
320
321
322 /* broadcast packet announcement intervals, in minutes */
323
324 /* search for master browsers of workgroups samba knows about, 
325    except default */
326 #define CHECK_TIME_MST_BROWSE       5 
327
328 /* request backup browser announcements from other servers */
329 #define CHECK_TIME_ANNOUNCE_BACKUP 15
330
331 /* request host announcements from other servers: min and max of interval */
332 #define CHECK_TIME_MIN_HOST_ANNCE   3
333 #define CHECK_TIME_MAX_HOST_ANNCE  12
334
335 /* announce as master to WINS server and any Primary Domain Controllers */
336 #define CHECK_TIME_MST_ANNOUNCE    15
337