2 Unix SMB/Netbios implementation.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1996
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.
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.
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.
23 Module name: nameservresp.c
25 14 jan 96: lkcl@pires.co.uk
26 added multiple workgroup domain master support
28 05 jul 96: lkcl@pires.co.uk
29 created module nameservresp containing NetBIOS response functions
37 extern int DEBUGLEVEL;
40 extern struct in_addr ipzero;
42 #define GET_TTL(ttl) ((ttl)?MIN(ttl,lp_max_ttl()):lp_max_ttl())
45 /****************************************************************************
46 response for a reg release received. samba has asked a WINS server if it
48 **************************************************************************/
49 static void response_name_release(struct subnet_record *d,
50 struct packet_struct *p)
52 struct nmb_packet *nmb = &p->packet.nmb;
53 char *name = nmb->question.question_name.name;
54 int type = nmb->question.question_name.name_type;
56 DEBUG(4,("response name release received\n"));
58 if (nmb->header.rcode == 0 && nmb->answers->rdata)
60 /* IMPORTANT: see expire_netbios_response_entries() */
62 struct in_addr found_ip;
63 putip((char*)&found_ip,&nmb->answers->rdata[2]);
65 /* NOTE: we only release our own names at present */
68 name_unregister_work(d,name,type);
72 DEBUG(2,("name release for different ip! %s %s\n",
74 namestr(&nmb->question.question_name)));
79 DEBUG(2,("name release for %s rejected!\n",
80 namestr(&nmb->question.question_name)));
82 /* XXXX PANIC! what to do if it's one of samba's own names? */
84 /* XXXX do we honestly care if our name release was rejected?
85 only if samba is issuing the release on behalf of some out-of-sync
86 server. if it's one of samba's SELF names, we don't care. */
91 /****************************************************************************
92 response for a reg request received
93 **************************************************************************/
94 static void response_name_reg(struct subnet_record *d, struct packet_struct *p)
96 struct nmb_packet *nmb = &p->packet.nmb;
97 char *name = nmb->question.question_name.name;
98 int type = nmb->question.question_name.name_type;
99 BOOL bcast = nmb->header.nm_flags.bcast;
101 DEBUG(4,("response name registration received!\n"));
103 if (nmb->header.rcode == 0 && nmb->answers->rdata)
105 /* IMPORTANT: see expire_netbios_response_entries() */
107 int nb_flags = nmb->answers->rdata[0];
108 int ttl = nmb->answers->ttl;
109 struct in_addr found_ip;
111 putip((char*)&found_ip,&nmb->answers->rdata[2]);
113 name_register_work(d,name,type,nb_flags,ttl,found_ip,bcast);
117 DEBUG(1,("name registration for %s rejected!\n",
118 namestr(&nmb->question.question_name)));
120 /* oh dear. we have problems. possibly unbecome a master browser. */
121 name_unregister_work(d,name,type);
126 /****************************************************************************
127 response from a name query announce host
128 NAME_QUERY_ANNOUNCE_HOST is dealt with here
129 ****************************************************************************/
130 static void response_announce_host(struct nmb_name *ans_name,
131 struct nmb_packet *nmb,
132 struct response_record *n, struct subnet_record *d)
134 DEBUG(4, ("Name query at %s ip %s - ",
135 namestr(&n->name), inet_ntoa(n->send_ip)));
137 if (!name_equal(&n->name, ans_name))
139 /* someone gave us the wrong name as a reply. oops. */
140 /* XXXX should say to them 'oi! release that name!' */
142 DEBUG(4,("unexpected name received: %s\n", namestr(ans_name)));
146 if (nmb->header.rcode == 0 && nmb->answers->rdata)
148 /* we had sent out a name query to the current owner
149 of a name because someone else wanted it. now they
150 have responded saying that they still want the name,
151 so the other host can't have it.
154 /* first check all the details are correct */
156 int nb_flags = nmb->answers->rdata[0];
157 struct in_addr found_ip;
159 putip((char*)&found_ip,&nmb->answers->rdata[2]);
161 if (nb_flags != n->nb_flags)
163 /* someone gave us the wrong nb_flags as a reply. oops. */
164 /* XXXX should say to them 'oi! release that name!' */
166 DEBUG(4,("expected nb_flags: %d\n", n->nb_flags));
167 DEBUG(4,("unexpected nb_flags: %d\n", nb_flags));
171 /* do an announce host */
172 do_announce_host(ANN_HostAnnouncement,
173 n->my_name , 0x00, d->myip,
174 n->name.name, 0x1d, found_ip,
176 n->my_name, n->server_type, n->my_comment);
180 /* XXXX negative name query response. no master exists. oops */
185 /****************************************************************************
186 response from a name query server check. states of type NAME_QUERY_DOM_SRV_CHK,
187 NAME_QUERY_SRV_CHK, and NAME_QUERY_FIND_MST dealt with here.
188 ****************************************************************************/
189 static void response_server_check(struct nmb_name *ans_name,
190 struct response_record *n, struct subnet_record *d)
192 /* issue another state: this time to do a name status check */
194 enum state_type cmd = (n->state == NAME_QUERY_DOM_SRV_CHK) ?
195 NAME_STATUS_DOM_SRV_CHK : NAME_STATUS_SRV_CHK;
197 /* initiate a name status check on the server that replied */
198 queue_netbios_packet(d,ClientNMB,NMB_STATUS, cmd,
199 ans_name->name, ans_name->name_type,
201 False,False,n->send_ip,n->reply_to_ip);
205 /****************************************************************************
206 interpret a node status response. this is pretty hacked: we need two bits of
207 info. a) the name of the workgroup b) the name of the server. it will also
208 add all the names it finds into the namelist.
209 ****************************************************************************/
210 static BOOL interpret_node_status(struct subnet_record *d,
211 char *p, struct nmb_name *name,int t,
212 char *serv_name, struct in_addr ip, BOOL bcast)
214 int numnames = CVAL(p,0);
217 DEBUG(4,("received %d names\n",numnames));
221 if (serv_name) *serv_name = 0;
238 trim_string(qname,NULL," ");
242 if (NAME_GROUP (nb_flags)) { strcat(flags,"<GROUP> "); group=True;}
243 if (NAME_BFLAG (nb_flags)) { strcat(flags,"B "); }
244 if (NAME_PFLAG (nb_flags)) { strcat(flags,"P "); }
245 if (NAME_MFLAG (nb_flags)) { strcat(flags,"M "); }
246 if (NAME_HFLAG (nb_flags)) { strcat(flags,"H "); }
247 if (NAME_DEREG (nb_flags)) { strcat(flags,"<DEREGISTERING> "); }
248 if (NAME_CONFLICT (nb_flags)) { strcat(flags,"<CONFLICT> "); add=True;}
249 if (NAME_ACTIVE (nb_flags)) { strcat(flags,"<ACTIVE> "); add=True; }
250 if (NAME_PERMANENT(nb_flags)) { strcat(flags,"<PERMANENT> "); add=True;}
252 /* might as well update our namelist while we're at it */
255 struct in_addr nameip;
256 enum name_source src;
265 add_netbios_entry(d,qname,type,nb_flags,2*60*60,src,nameip,True,bcast);
268 /* we want the server name */
269 if (serv_name && !*serv_name && !group && t == 0)
271 StrnCpy(serv_name,qname,15);
275 /* looking for a name and type? */
276 if (name && !found && (t == type))
278 /* take a guess at some of the name types we're going to ask for.
279 evaluate whether they are group names or no... */
280 if (((t == 0x1b || t == 0x1d ) && !group) ||
281 ((t == 0x20 || t == 0x1c || t == 0x1e) && group))
284 make_nmb_name(name,qname,type,scope);
288 DEBUG(4,("\t%s(0x%x)\t%s\n",qname,type,flags));
290 DEBUG(4,("num_good_sends=%d num_good_receives=%d\n",
291 IVAL(p,20),IVAL(p,24)));
296 /****************************************************************************
297 response from a name status check. states of type NAME_STATUS_DOM_SRV_CHK
298 and NAME_STATUS_SRV_CHK dealt with here.
299 ****************************************************************************/
300 static void response_name_status_check(struct in_addr ip,
301 struct nmb_packet *nmb, BOOL bcast,
302 struct response_record *n, struct subnet_record *d)
304 /* NMB_STATUS arrives: contains workgroup name and server name required.
305 amongst other things. */
307 struct nmb_name name;
310 if (interpret_node_status(d,nmb->answers->rdata,
311 &name,name.name_type,serv_name,ip,bcast))
315 sync_server(n->state,serv_name,
316 name.name,name.name_type, n->send_ip);
321 DEBUG(1,("No 0x1d name type in interpret_node_status()\n"));
326 /****************************************************************************
327 response from a name query for secured WINS registration. a state of
328 NAME_REGISTER_CHALLENGE is dealt with here.
329 ****************************************************************************/
330 static void response_name_query_register(struct nmb_packet *nmb,
331 struct nmb_name *ans_name,
332 struct response_record *n, struct subnet_record *d)
334 struct in_addr register_ip;
337 DEBUG(4, ("Name query at %s ip %s - ",
338 namestr(&n->name), inet_ntoa(n->send_ip)));
340 if (!name_equal(&n->name, ans_name))
342 /* someone gave us the wrong name as a reply. oops. */
343 /* XXXX should say to them 'oi! release that name!' */
345 DEBUG(4,("unexpected name received: %s\n", namestr(ans_name)));
349 if (nmb->header.rcode == 0 && nmb->answers->rdata)
351 /* we had sent out a name query to the current owner
352 of a name because someone else wanted it. now they
353 have responded saying that they still want the name,
354 so the other host can't have it.
357 /* first check all the details are correct */
359 int nb_flags = nmb->answers->rdata[0];
360 struct in_addr found_ip;
362 putip((char*)&found_ip,&nmb->answers->rdata[2]);
364 if (nb_flags != n->nb_flags)
366 /* someone gave us the wrong nb_flags as a reply. oops. */
367 /* XXXX should say to them 'oi! release that name!' */
369 DEBUG(4,("expected nb_flags: %d\n", n->nb_flags));
370 DEBUG(4,("unexpected nb_flags: %d\n", nb_flags));
374 if (!ip_equal(n->send_ip, found_ip))
376 /* someone gave us the wrong ip as a reply. oops. */
377 /* XXXX should say to them 'oi! release that name!' */
379 DEBUG(4,("expected ip: %s\n", inet_ntoa(n->send_ip)));
380 DEBUG(4,("unexpected ip: %s\n", inet_ntoa(found_ip)));
384 DEBUG(4, (" OK: %s\n", inet_ntoa(found_ip)));
386 /* fine: now tell the other host they can't have the name */
387 register_ip = n->send_ip;
392 DEBUG(4, (" NEGATIVE RESPONSE!\n"));
394 /* the owner didn't want the name: the other host can have it */
395 register_ip = n->reply_to_ip;
399 /* register the old or the new owners' ip */
400 add_name_respond(d, n->fd, d->myip, n->response_id,&n->name,n->nb_flags,
401 GET_TTL(0), register_ip,
402 new_owner, n->reply_to_ip);
406 /****************************************************************************
407 response from a name query to sync browse lists or to update our netbios
408 entry. states of type NAME_QUERY_SYNC and NAME_QUERY_CONFIRM
409 ****************************************************************************/
410 static void response_name_query_sync(struct nmb_packet *nmb,
411 struct nmb_name *ans_name, BOOL bcast,
412 struct response_record *n, struct subnet_record *d)
414 DEBUG(4, ("Name query at %s ip %s - ",
415 namestr(&n->name), inet_ntoa(n->send_ip)));
417 if (!name_equal(&n->name, ans_name))
419 /* someone gave us the wrong name as a reply. oops. */
420 DEBUG(4,("unexpected name received: %s\n", namestr(ans_name)));
424 if (nmb->header.rcode == 0 && nmb->answers->rdata)
426 int nb_flags = nmb->answers->rdata[0];
427 struct in_addr found_ip;
429 putip((char*)&found_ip,&nmb->answers->rdata[2]);
431 if (!ip_equal(n->send_ip, found_ip))
433 /* someone gave us the wrong ip as a reply. oops. */
434 DEBUG(4,("expected ip: %s\n", inet_ntoa(n->send_ip)));
435 DEBUG(4,("unexpected ip: %s\n", inet_ntoa(found_ip)));
439 DEBUG(4, (" OK: %s\n", inet_ntoa(found_ip)));
441 if (n->state == NAME_QUERY_SYNC_LOCAL ||
442 n->state == NAME_QUERY_SYNC_REMOTE)
444 struct work_record *work = NULL;
445 if ((work = find_workgroupstruct(d, ans_name->name, False)))
447 BOOL local_list_only = n->state == NAME_QUERY_SYNC_LOCAL;
449 /* the server is there: sync quick before it (possibly) dies! */
450 sync_browse_lists(d, work, ans_name->name, ans_name->name_type,
451 found_ip, local_list_only);
456 /* update our netbios name list (re-register it if necessary) */
457 add_netbios_entry(d, ans_name->name, ans_name->name_type,
458 nb_flags,GET_TTL(0),REGISTER,
459 found_ip,False,!bcast);
464 DEBUG(4, (" NEGATIVE RESPONSE!\n"));
466 if (n->state == NAME_QUERY_CONFIRM)
468 /* XXXX remove_netbios_entry()? */
469 /* lots of things we ought to do, here. if we get here,
470 then we're in a mess: our name database doesn't match
473 remove_netbios_name(d,n->name.name, n->name.name_type,
474 REGISTER,n->send_ip);
480 /****************************************************************************
481 report the response record type
482 ****************************************************************************/
483 static void debug_rr_type(int rr_type)
487 case NMB_STATUS: DEBUG(3,("Name status ")); break;
488 case NMB_QUERY : DEBUG(3,("Name query ")); break;
489 case NMB_REG : DEBUG(3,("Name registration ")); break;
490 case NMB_REL : DEBUG(3,("Name release ")); break;
491 default : DEBUG(1,("wrong response packet type received")); break;
495 /****************************************************************************
496 report the response record nmbd state
497 ****************************************************************************/
498 void debug_state_type(int state)
500 /* report the state type to help debugging */
503 case NAME_QUERY_DOM_SRV_CHK : DEBUG(4,("MASTER_SVR_CHECK\n")); break;
504 case NAME_QUERY_SRV_CHK : DEBUG(4,("NAME_QUERY_SRV_CHK\n")); break;
505 case NAME_QUERY_FIND_MST : DEBUG(4,("NAME_QUERY_FIND_MST\n")); break;
506 case NAME_QUERY_MST_CHK : DEBUG(4,("NAME_QUERY_MST_CHK\n")); break;
507 case NAME_QUERY_CONFIRM : DEBUG(4,("NAME_QUERY_CONFIRM\n")); break;
508 case NAME_QUERY_SYNC_LOCAL : DEBUG(4,("NAME_QUERY_SYNC_LOCAL\n")); break;
509 case NAME_QUERY_SYNC_REMOTE : DEBUG(4,("NAME_QUERY_SYNC_REMOTE\n")); break;
510 case NAME_QUERY_ANNOUNCE_HOST: DEBUG(4,("NAME_QUERY_ANNCE_HOST\n"));break;
512 case NAME_REGISTER : DEBUG(4,("NAME_REGISTER\n")); break;
513 case NAME_REGISTER_CHALLENGE : DEBUG(4,("NAME_REGISTER_CHALLENGE\n"));break;
515 case NAME_RELEASE : DEBUG(4,("NAME_RELEASE\n")); break;
517 case NAME_STATUS_DOM_SRV_CHK : DEBUG(4,("NAME_STAT_MST_CHK\n")); break;
518 case NAME_STATUS_SRV_CHK : DEBUG(4,("NAME_STATUS_SRV_CHK\n")); break;
524 /****************************************************************************
525 report any problems with the fact that a response has been received.
527 (responses for certain types of operations are only expected from one host)
528 ****************************************************************************/
529 static BOOL response_problem_check(struct response_record *n,
530 struct nmb_packet *nmb, char *qname)
532 switch (nmb->answers->rr_type)
538 DEBUG(1,("more than one release name response received!\n"));
548 DEBUG(1,("more than one register name response received!\n"));
558 if (nmb->header.rcode == 0 && nmb->answers->rdata)
560 int nb_flags = nmb->answers->rdata[0];
562 if ((!NAME_GROUP(nb_flags)))
564 /* oh dear. more than one person responded to a unique name.
565 there is either a network problem, a configuration problem
566 or a server is mis-behaving */
568 /* XXXX mark the name as in conflict, and then let the
569 person who just responded know that they must also mark it
570 as in conflict, and therefore must NOT use it.
571 see rfc1001.txt 15.1.3.5 */
573 /* this may cause problems for some early versions of nmbd */
577 case NAME_QUERY_FIND_MST:
579 /* query for ^1^2__MSBROWSE__^2^1 expect lots of responses */
582 case NAME_QUERY_ANNOUNCE_HOST:
583 case NAME_QUERY_DOM_SRV_CHK:
584 case NAME_QUERY_SRV_CHK:
585 case NAME_QUERY_MST_CHK:
587 if (!strequal(qname,n->name.name))
589 /* one subnet, one master browser per workgroup */
590 /* XXXX force an election? */
592 DEBUG(3,("more than one master browser replied!\n"));
599 DEBUG(3,("Unique Name conflict detected!\n"));
605 /* we have received a negative reply, having already received
606 at least one response (pos/neg). something's really wrong! */
608 DEBUG(3,("wierd name query problem detected!\n"));
617 /****************************************************************************
618 check that the response received is compatible with the response record
619 ****************************************************************************/
620 static BOOL response_compatible(struct response_record *n,
621 struct nmb_packet *nmb)
627 if (nmb->answers->rr_type != 0x20)
629 DEBUG(1,("Name release reply has wrong answer rr_type\n"));
637 if (nmb->answers->rr_type != 0x20)
639 DEBUG(1,("Name register reply has wrong answer rr_type\n"));
645 case NAME_REGISTER_CHALLENGE: /* this is a query: we then do a register */
646 case NAME_QUERY_CONFIRM:
647 case NAME_QUERY_ANNOUNCE_HOST:
648 case NAME_QUERY_SYNC_LOCAL:
649 case NAME_QUERY_SYNC_REMOTE:
650 case NAME_QUERY_DOM_SRV_CHK:
651 case NAME_QUERY_SRV_CHK:
652 case NAME_QUERY_FIND_MST:
653 case NAME_QUERY_MST_CHK:
655 if (nmb->answers->rr_type != 0x20)
657 DEBUG(1,("Name query reply has wrong answer rr_type\n"));
663 case NAME_STATUS_DOM_SRV_CHK:
664 case NAME_STATUS_SRV_CHK:
666 if (nmb->answers->rr_type != 0x21)
668 DEBUG(1,("Name status reply has wrong answer rr_type\n"));
676 DEBUG(1,("unknown state type received in response_netbios_packet\n"));
684 /****************************************************************************
685 process the response packet received
686 ****************************************************************************/
687 static void response_process(struct subnet_record *d, struct packet_struct *p,
688 struct response_record *n, struct nmb_packet *nmb,
689 BOOL bcast, struct nmb_name *ans_name)
695 response_name_release(d, p);
701 response_name_reg(d, p);
705 case NAME_REGISTER_CHALLENGE:
707 response_name_query_register(nmb, ans_name, n, d);
711 case NAME_QUERY_DOM_SRV_CHK:
712 case NAME_QUERY_SRV_CHK:
713 case NAME_QUERY_FIND_MST:
715 response_server_check(ans_name, n, d);
719 case NAME_STATUS_DOM_SRV_CHK:
720 case NAME_STATUS_SRV_CHK:
722 response_name_status_check(p->ip, nmb, bcast, n, d);
726 case NAME_QUERY_ANNOUNCE_HOST:
728 response_announce_host(ans_name, nmb, n, d);
732 case NAME_QUERY_CONFIRM:
733 case NAME_QUERY_SYNC_LOCAL:
734 case NAME_QUERY_SYNC_REMOTE:
736 response_name_query_sync(nmb, ans_name, bcast, n, d);
739 case NAME_QUERY_MST_CHK:
741 /* no action required here. it's when NO responses are received
742 that we need to do something. see expire_name_query_entries() */
744 DEBUG(4, ("Master browser exists for %s at %s (just checking!)\n",
745 namestr(&n->name), inet_ntoa(n->send_ip)));
751 DEBUG(1,("unknown state type received in response_netbios_packet\n"));
758 /****************************************************************************
759 response from a netbios packet.
760 ****************************************************************************/
761 void response_netbios_packet(struct packet_struct *p)
763 struct nmb_packet *nmb = &p->packet.nmb;
764 struct nmb_name *question = &nmb->question.question_name;
765 struct nmb_name *ans_name = NULL;
766 char *qname = question->name;
767 BOOL bcast = nmb->header.nm_flags.bcast;
768 struct response_record *n;
769 struct subnet_record *d = NULL;
771 if (!(n = find_response_record(&d,nmb->header.name_trn_id))) {
772 DEBUG(2,("unknown netbios response (received late or from nmblookup?)\n"));
778 DEBUG(2,("response packet: subnet %s not known\n", inet_ntoa(p->ip)));
782 /* args wrong way round: spotted by ccm@shentel.net */
783 if (!same_net(d->bcast_ip, p->ip, d->mask_ip)) /* copes with WINS 'subnet' */
785 DEBUG(2,("response from %s. ", inet_ntoa(p->ip)));
786 DEBUG(2,("expected on subnet %s. hmm.\n", inet_ntoa(d->bcast_ip)));
790 if (nmb->answers == NULL)
792 /* hm. the packet received was a response, but with no answer. wierd! */
793 DEBUG(2,("NMB packet response from %s (bcast=%s) - UNKNOWN\n",
794 inet_ntoa(p->ip), BOOLSTR(bcast)));
798 ans_name = &nmb->answers->rr_name;
799 DEBUG(3,("response for %s from %s (bcast=%s)\n",
800 namestr(ans_name), inet_ntoa(p->ip), BOOLSTR(bcast)));
802 debug_rr_type(nmb->answers->rr_type);
804 n->num_msgs++; /* count number of responses received */
805 n->repeat_count = 0; /* don't resend: see expire_netbios_packets() */
807 debug_state_type(n->state);
809 /* problem checking: multiple responses etc */
810 if (response_problem_check(n, nmb, qname))
813 /* now deal with the current state */
814 response_process(d, p, n, nmb, bcast, ans_name);