source: branches/samba-3.2.x/source/nmbd/nmbd_packets.c

Last change on this file was 133, checked in by Paul Smedley, 17 years ago

Update trunk to 3.2.0pre3

File size: 61.9 KB
Line 
1/*
2 Unix SMB/CIFS implementation.
3 NBT netbios routines and daemon - version 2
4 Copyright (C) Andrew Tridgell 1994-1998
5 Copyright (C) Luke Kenneth Casson Leighton 1994-1998
6 Copyright (C) Jeremy Allison 1994-2003
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21*/
22
23#include "includes.h"
24
25extern int ClientNMB;
26extern int ClientDGRAM;
27extern int global_nmb_port;
28
29extern int num_response_packets;
30
31static void queue_packet(struct packet_struct *packet);
32
33bool rescan_listen_set = False;
34
35
36/*******************************************************************
37 The global packet linked-list. Incoming entries are
38 added to the end of this list. It is supposed to remain fairly
39 short so we won't bother with an end pointer.
40******************************************************************/
41
42static struct packet_struct *packet_queue = NULL;
43
44/***************************************************************************
45Utility function to find the specific fd to send a packet out on.
46**************************************************************************/
47
48static int find_subnet_fd_for_address( struct in_addr local_ip )
49{
50 struct subnet_record *subrec;
51
52 for( subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
53 if(ip_equal_v4(local_ip, subrec->myip))
54 return subrec->nmb_sock;
55
56 return ClientNMB;
57}
58
59/***************************************************************************
60Utility function to find the specific fd to send a mailslot packet out on.
61**************************************************************************/
62
63static int find_subnet_mailslot_fd_for_address( struct in_addr local_ip )
64{
65 struct subnet_record *subrec;
66
67 for( subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
68 if(ip_equal_v4(local_ip, subrec->myip))
69 return subrec->dgram_sock;
70
71 return ClientDGRAM;
72}
73
74/***************************************************************************
75Get/Set problematic nb_flags as network byte order 16 bit int.
76**************************************************************************/
77
78uint16 get_nb_flags(char *buf)
79{
80 return ((((uint16)*buf)&0xFFFF) & NB_FLGMSK);
81}
82
83void set_nb_flags(char *buf, uint16 nb_flags)
84{
85 *buf++ = ((nb_flags & NB_FLGMSK) & 0xFF);
86 *buf = '\0';
87}
88
89/***************************************************************************
90Dumps out the browse packet data.
91**************************************************************************/
92
93static void debug_browse_data(char *outbuf, int len)
94{
95 int i,j;
96
97 DEBUG( 4, ( "debug_browse_data():\n" ) );
98 for (i = 0; i < len; i+= 16) {
99 DEBUGADD( 4, ( "%3x char ", i ) );
100
101 for (j = 0; j < 16; j++) {
102 unsigned char x;
103 if (i+j >= len)
104 break;
105
106 x = outbuf[i+j];
107 if (x < 32 || x > 127)
108 x = '.';
109
110 DEBUGADD( 4, ( "%c", x ) );
111 }
112
113 DEBUGADD( 4, ( "%*s hex", 16-j, "" ) );
114
115 for (j = 0; j < 16; j++) {
116 if (i+j >= len)
117 break;
118 DEBUGADD( 4, ( " %02x", (unsigned char)outbuf[i+j] ) );
119 }
120
121 DEBUGADD( 4, ("\n") );
122 }
123}
124
125/***************************************************************************
126 Generates the unique transaction identifier
127**************************************************************************/
128
129static uint16 name_trn_id=0;
130
131static uint16 generate_name_trn_id(void)
132{
133 if (!name_trn_id) {
134 name_trn_id = ((unsigned)time(NULL)%(unsigned)0x7FFF) + ((unsigned)sys_getpid()%(unsigned)100);
135 }
136 name_trn_id = (name_trn_id+1) % (unsigned)0x7FFF;
137 return name_trn_id;
138}
139
140/***************************************************************************
141 Either loops back or sends out a completed NetBIOS packet.
142**************************************************************************/
143
144static bool send_netbios_packet(struct packet_struct *p)
145{
146 bool loopback_this_packet = False;
147
148 /* Check if we are sending to or from ourselves as a WINS server. */
149 if(ismyip_v4(p->ip) && (p->port == global_nmb_port))
150 loopback_this_packet = True;
151
152 if(loopback_this_packet) {
153 struct packet_struct *lo_packet = NULL;
154 DEBUG(5,("send_netbios_packet: sending packet to ourselves.\n"));
155 if((lo_packet = copy_packet(p)) == NULL)
156 return False;
157 queue_packet(lo_packet);
158 } else if (!send_packet(p)) {
159 DEBUG(0,("send_netbios_packet: send_packet() to IP %s port %d failed\n",
160 inet_ntoa(p->ip),p->port));
161 return False;
162 }
163
164 return True;
165}
166
167/***************************************************************************
168 Sets up the common elements of an outgoing NetBIOS packet.
169
170 Note: do not attempt to rationalise whether rec_des should be set or not
171 in a particular situation. Just follow rfc_1002 or look at examples from WinXX.
172 It does NOT follow the rule that requests to the wins server always have
173 rec_des true. See for example name releases and refreshes
174**************************************************************************/
175
176static struct packet_struct *create_and_init_netbios_packet(struct nmb_name *nmbname,
177 bool bcast, bool rec_des,
178 struct in_addr to_ip)
179{
180 struct packet_struct *packet = NULL;
181 struct nmb_packet *nmb = NULL;
182
183 /* Allocate the packet_struct we will return. */
184 if((packet = SMB_MALLOC_P(struct packet_struct)) == NULL) {
185 DEBUG(0,("create_and_init_netbios_packet: malloc fail (1) for packet struct.\n"));
186 return NULL;
187 }
188
189 memset((char *)packet,'\0',sizeof(*packet));
190
191 nmb = &packet->packet.nmb;
192
193 nmb->header.name_trn_id = generate_name_trn_id();
194 nmb->header.response = False;
195 nmb->header.nm_flags.recursion_desired = rec_des;
196 nmb->header.nm_flags.recursion_available = False;
197 nmb->header.nm_flags.trunc = False;
198 nmb->header.nm_flags.authoritative = False;
199 nmb->header.nm_flags.bcast = bcast;
200
201 nmb->header.rcode = 0;
202 nmb->header.qdcount = 1;
203 nmb->header.ancount = 0;
204 nmb->header.nscount = 0;
205
206 nmb->question.question_name = *nmbname;
207 nmb->question.question_type = QUESTION_TYPE_NB_QUERY;
208 nmb->question.question_class = QUESTION_CLASS_IN;
209
210 packet->ip = to_ip;
211 packet->port = NMB_PORT;
212 packet->fd = ClientNMB;
213 packet->timestamp = time(NULL);
214 packet->packet_type = NMB_PACKET;
215 packet->locked = False;
216
217 return packet; /* Caller must free. */
218}
219
220/***************************************************************************
221 Sets up the common elements of register, refresh or release packet.
222**************************************************************************/
223
224static bool create_and_init_additional_record(struct packet_struct *packet,
225 uint16 nb_flags,
226 const struct in_addr *register_ip)
227{
228 struct nmb_packet *nmb = &packet->packet.nmb;
229
230 if((nmb->additional = SMB_MALLOC_P(struct res_rec)) == NULL) {
231 DEBUG(0,("create_and_init_additional_record: malloc fail for additional record.\n"));
232 return False;
233 }
234
235 memset((char *)nmb->additional,'\0',sizeof(struct res_rec));
236
237 nmb->additional->rr_name = nmb->question.question_name;
238 nmb->additional->rr_type = RR_TYPE_NB;
239 nmb->additional->rr_class = RR_CLASS_IN;
240
241 /* See RFC 1002, sections 5.1.1.1, 5.1.1.2 and 5.1.1.3 */
242 if (nmb->header.nm_flags.bcast)
243 nmb->additional->ttl = PERMANENT_TTL;
244 else
245 nmb->additional->ttl = lp_max_ttl();
246
247 nmb->additional->rdlength = 6;
248
249 set_nb_flags(nmb->additional->rdata,nb_flags);
250
251 /* Set the address for the name we are registering. */
252 putip(&nmb->additional->rdata[2], register_ip);
253
254 /*
255 it turns out that Jeremys code was correct, we are supposed
256 to send registrations from the IP we are registering. The
257 trick is what to do on timeouts! When we send on a
258 non-routable IP then the reply will timeout, and we should
259 treat this as success, not failure. That means we go into
260 our standard refresh cycle for that name which copes nicely
261 with disconnected networks.
262 */
263 packet->fd = find_subnet_fd_for_address(*register_ip);
264
265 return True;
266}
267
268/***************************************************************************
269 Sends out a name query.
270**************************************************************************/
271
272static bool initiate_name_query_packet( struct packet_struct *packet)
273{
274 struct nmb_packet *nmb = NULL;
275
276 nmb = &packet->packet.nmb;
277
278 nmb->header.opcode = NMB_NAME_QUERY_OPCODE;
279 nmb->header.arcount = 0;
280
281 nmb->header.nm_flags.recursion_desired = True;
282
283 DEBUG(4,("initiate_name_query_packet: sending query for name %s (bcast=%s) to IP %s\n",
284 nmb_namestr(&nmb->question.question_name),
285 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
286
287 return send_netbios_packet( packet );
288}
289
290/***************************************************************************
291 Sends out a name query - from a WINS server.
292**************************************************************************/
293
294static bool initiate_name_query_packet_from_wins_server( struct packet_struct *packet)
295{
296 struct nmb_packet *nmb = NULL;
297
298 nmb = &packet->packet.nmb;
299
300 nmb->header.opcode = NMB_NAME_QUERY_OPCODE;
301 nmb->header.arcount = 0;
302
303 nmb->header.nm_flags.recursion_desired = False;
304
305 DEBUG(4,("initiate_name_query_packet_from_wins_server: sending query for name %s (bcast=%s) to IP %s\n",
306 nmb_namestr(&nmb->question.question_name),
307 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
308
309 return send_netbios_packet( packet );
310}
311
312/***************************************************************************
313 Sends out a name register.
314**************************************************************************/
315
316static bool initiate_name_register_packet( struct packet_struct *packet,
317 uint16 nb_flags, const struct in_addr *register_ip)
318{
319 struct nmb_packet *nmb = &packet->packet.nmb;
320
321 nmb->header.opcode = NMB_NAME_REG_OPCODE;
322 nmb->header.arcount = 1;
323
324 nmb->header.nm_flags.recursion_desired = True;
325
326 if(create_and_init_additional_record(packet, nb_flags, register_ip) == False)
327 return False;
328
329 DEBUG(4,("initiate_name_register_packet: sending registration for name %s (bcast=%s) to IP %s\n",
330 nmb_namestr(&nmb->additional->rr_name),
331 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
332
333 return send_netbios_packet( packet );
334}
335
336/***************************************************************************
337 Sends out a multihomed name register.
338**************************************************************************/
339
340static bool initiate_multihomed_name_register_packet(struct packet_struct *packet,
341 uint16 nb_flags, struct in_addr *register_ip)
342{
343 struct nmb_packet *nmb = &packet->packet.nmb;
344 fstring second_ip_buf;
345
346 fstrcpy(second_ip_buf, inet_ntoa(packet->ip));
347
348 nmb->header.opcode = NMB_NAME_MULTIHOMED_REG_OPCODE;
349 nmb->header.arcount = 1;
350
351 nmb->header.nm_flags.recursion_desired = True;
352
353 if(create_and_init_additional_record(packet, nb_flags, register_ip) == False)
354 return False;
355
356 DEBUG(4,("initiate_multihomed_name_register_packet: sending registration \
357for name %s IP %s (bcast=%s) to IP %s\n",
358 nmb_namestr(&nmb->additional->rr_name), inet_ntoa(*register_ip),
359 BOOLSTR(nmb->header.nm_flags.bcast), second_ip_buf ));
360
361 return send_netbios_packet( packet );
362}
363
364/***************************************************************************
365 Sends out a name refresh.
366**************************************************************************/
367
368static bool initiate_name_refresh_packet( struct packet_struct *packet,
369 uint16 nb_flags, struct in_addr *refresh_ip)
370{
371 struct nmb_packet *nmb = &packet->packet.nmb;
372
373 nmb->header.opcode = NMB_NAME_REFRESH_OPCODE_8;
374 nmb->header.arcount = 1;
375
376 nmb->header.nm_flags.recursion_desired = False;
377
378 if(create_and_init_additional_record(packet, nb_flags, refresh_ip) == False)
379 return False;
380
381 DEBUG(4,("initiate_name_refresh_packet: sending refresh for name %s (bcast=%s) to IP %s\n",
382 nmb_namestr(&nmb->additional->rr_name),
383 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
384
385 return send_netbios_packet( packet );
386}
387
388/***************************************************************************
389 Sends out a name release.
390**************************************************************************/
391
392static bool initiate_name_release_packet( struct packet_struct *packet,
393 uint16 nb_flags, struct in_addr *release_ip)
394{
395 struct nmb_packet *nmb = &packet->packet.nmb;
396
397 nmb->header.opcode = NMB_NAME_RELEASE_OPCODE;
398 nmb->header.arcount = 1;
399
400 nmb->header.nm_flags.recursion_desired = False;
401
402 if(create_and_init_additional_record(packet, nb_flags, release_ip) == False)
403 return False;
404
405 DEBUG(4,("initiate_name_release_packet: sending release for name %s (bcast=%s) to IP %s\n",
406 nmb_namestr(&nmb->additional->rr_name),
407 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
408
409 return send_netbios_packet( packet );
410}
411
412/***************************************************************************
413 Sends out a node status.
414**************************************************************************/
415
416static bool initiate_node_status_packet( struct packet_struct *packet )
417{
418 struct nmb_packet *nmb = &packet->packet.nmb;
419
420 nmb->header.opcode = NMB_NAME_QUERY_OPCODE;
421 nmb->header.arcount = 0;
422
423 nmb->header.nm_flags.recursion_desired = False;
424
425 nmb->question.question_type = QUESTION_TYPE_NB_STATUS;
426
427 DEBUG(4,("initiate_node_status_packet: sending node status request for name %s to IP %s\n",
428 nmb_namestr(&nmb->question.question_name),
429 inet_ntoa(packet->ip)));
430
431 return send_netbios_packet( packet );
432}
433
434/****************************************************************************
435 Simplification functions for queuing standard packets.
436 These should be the only publicly callable functions for sending
437 out packets.
438****************************************************************************/
439
440/****************************************************************************
441 Assertion - we should never be sending nmbd packets on the remote
442 broadcast subnet.
443****************************************************************************/
444
445static bool assert_check_subnet(struct subnet_record *subrec)
446{
447 if( subrec == remote_broadcast_subnet) {
448 DEBUG(0,("assert_check_subnet: Attempt to send packet on remote broadcast subnet. \
449This is a bug.\n"));
450 return True;
451 }
452 return False;
453}
454
455/****************************************************************************
456 Queue a register name packet to the broadcast address of a subnet.
457****************************************************************************/
458
459struct response_record *queue_register_name( struct subnet_record *subrec,
460 response_function resp_fn,
461 timeout_response_function timeout_fn,
462 register_name_success_function success_fn,
463 register_name_fail_function fail_fn,
464 struct userdata_struct *userdata,
465 struct nmb_name *nmbname,
466 uint16 nb_flags)
467{
468 struct packet_struct *p;
469 struct response_record *rrec;
470 struct sockaddr_storage ss;
471 const struct sockaddr_storage *pss = NULL;
472 if(assert_check_subnet(subrec))
473 return NULL;
474
475 /* note that all name registration requests have RD set (rfc1002 - section 4.2.2 */
476 if ((p = create_and_init_netbios_packet(nmbname, (subrec != unicast_subnet), True,
477 subrec->bcast_ip)) == NULL)
478 return NULL;
479
480 in_addr_to_sockaddr_storage(&ss, subrec->bcast_ip);
481 pss = iface_ip(&ss);
482 if (!pss || pss->ss_family != AF_INET) {
483 p->locked = False;
484 free_packet(p);
485 return NULL;
486 }
487
488 if(initiate_name_register_packet(p, nb_flags,
489 &((const struct sockaddr_in *)pss)->sin_addr) == False) {
490 p->locked = False;
491 free_packet(p);
492 return NULL;
493 }
494
495 if((rrec = make_response_record(subrec, /* subnet record. */
496 p, /* packet we sent. */
497 resp_fn, /* function to call on response. */
498 timeout_fn, /* function to call on timeout. */
499 (success_function)success_fn, /* function to call on operation success. */
500 (fail_function)fail_fn, /* function to call on operation fail. */
501 userdata)) == NULL) {
502 p->locked = False;
503 free_packet(p);
504 return NULL;
505 }
506
507 return rrec;
508}
509
510/****************************************************************************
511 Queue a refresh name packet to the broadcast address of a subnet.
512****************************************************************************/
513
514void queue_wins_refresh(struct nmb_name *nmbname,
515 response_function resp_fn,
516 timeout_response_function timeout_fn,
517 uint16 nb_flags,
518 struct in_addr refresh_ip,
519 const char *tag)
520{
521 struct packet_struct *p;
522 struct response_record *rrec;
523 struct in_addr wins_ip;
524 struct userdata_struct *userdata;
525 fstring ip_str;
526
527 wins_ip = wins_srv_ip_tag(tag, refresh_ip);
528
529 if ((p = create_and_init_netbios_packet(nmbname, False, False, wins_ip)) == NULL) {
530 return;
531 }
532
533 if (!initiate_name_refresh_packet(p, nb_flags, &refresh_ip)) {
534 p->locked = False;
535 free_packet(p);
536 return;
537 }
538
539 fstrcpy(ip_str, inet_ntoa(refresh_ip));
540
541 DEBUG(6,("Refreshing name %s IP %s with WINS server %s using tag '%s'\n",
542 nmb_namestr(nmbname), ip_str, inet_ntoa(wins_ip), tag));
543
544 userdata = (struct userdata_struct *)SMB_MALLOC(sizeof(*userdata) + strlen(tag) + 1);
545 if (!userdata) {
546 p->locked = False;
547 free_packet(p);
548 DEBUG(0,("Failed to allocate userdata structure!\n"));
549 return;
550 }
551 ZERO_STRUCTP(userdata);
552 userdata->userdata_len = strlen(tag) + 1;
553 strlcpy(userdata->data, tag, userdata->userdata_len);
554
555 if ((rrec = make_response_record(unicast_subnet,
556 p,
557 resp_fn, timeout_fn,
558 NULL,
559 NULL,
560 userdata)) == NULL) {
561 p->locked = False;
562 free_packet(p);
563 return;
564 }
565
566 free(userdata);
567
568 /* we don't want to repeat refresh packets */
569 rrec->repeat_count = 0;
570}
571
572
573/****************************************************************************
574 Queue a multihomed register name packet to a given WINS server IP
575****************************************************************************/
576
577struct response_record *queue_register_multihomed_name( struct subnet_record *subrec,
578 response_function resp_fn,
579 timeout_response_function timeout_fn,
580 register_name_success_function success_fn,
581 register_name_fail_function fail_fn,
582 struct userdata_struct *userdata,
583 struct nmb_name *nmbname,
584 uint16 nb_flags,
585 struct in_addr register_ip,
586 struct in_addr wins_ip)
587{
588 struct packet_struct *p;
589 struct response_record *rrec;
590 bool ret;
591
592 /* Sanity check. */
593 if(subrec != unicast_subnet) {
594 DEBUG(0,("queue_register_multihomed_name: should only be done on \
595unicast subnet. subnet is %s\n.", subrec->subnet_name ));
596 return NULL;
597 }
598
599 if(assert_check_subnet(subrec))
600 return NULL;
601
602 if ((p = create_and_init_netbios_packet(nmbname, False, True, wins_ip)) == NULL)
603 return NULL;
604
605 if (nb_flags & NB_GROUP)
606 ret = initiate_name_register_packet( p, nb_flags, &register_ip);
607 else
608 ret = initiate_multihomed_name_register_packet(p, nb_flags, &register_ip);
609
610 if (ret == False) {
611 p->locked = False;
612 free_packet(p);
613 return NULL;
614 }
615
616 if ((rrec = make_response_record(subrec, /* subnet record. */
617 p, /* packet we sent. */
618 resp_fn, /* function to call on response. */
619 timeout_fn, /* function to call on timeout. */
620 (success_function)success_fn, /* function to call on operation success. */
621 (fail_function)fail_fn, /* function to call on operation fail. */
622 userdata)) == NULL) {
623 p->locked = False;
624 free_packet(p);
625 return NULL;
626 }
627
628 return rrec;
629}
630
631/****************************************************************************
632 Queue a release name packet to the broadcast address of a subnet.
633****************************************************************************/
634
635struct response_record *queue_release_name( struct subnet_record *subrec,
636 response_function resp_fn,
637 timeout_response_function timeout_fn,
638 release_name_success_function success_fn,
639 release_name_fail_function fail_fn,
640 struct userdata_struct *userdata,
641 struct nmb_name *nmbname,
642 uint16 nb_flags,
643 struct in_addr release_ip,
644 struct in_addr dest_ip)
645{
646 struct packet_struct *p;
647 struct response_record *rrec;
648
649 if(assert_check_subnet(subrec))
650 return NULL;
651
652 if ((p = create_and_init_netbios_packet(nmbname, (subrec != unicast_subnet), False, dest_ip)) == NULL)
653 return NULL;
654
655 if(initiate_name_release_packet( p, nb_flags, &release_ip) == False) {
656 p->locked = False;
657 free_packet(p);
658 return NULL;
659 }
660
661 if((rrec = make_response_record(subrec, /* subnet record. */
662 p, /* packet we sent. */
663 resp_fn, /* function to call on response. */
664 timeout_fn, /* function to call on timeout. */
665 (success_function)success_fn, /* function to call on operation success. */
666 (fail_function)fail_fn, /* function to call on operation fail. */
667 userdata)) == NULL) {
668 p->locked = False;
669 free_packet(p);
670 return NULL;
671 }
672
673 /*
674 * For a broadcast release packet, only send once.
675 * This will cause us to remove the name asap. JRA.
676 */
677
678 if (subrec != unicast_subnet) {
679 rrec->repeat_count = 0;
680 rrec->repeat_time = 0;
681 }
682
683 return rrec;
684}
685
686/****************************************************************************
687 Queue a query name packet to the broadcast address of a subnet.
688****************************************************************************/
689
690struct response_record *queue_query_name( struct subnet_record *subrec,
691 response_function resp_fn,
692 timeout_response_function timeout_fn,
693 query_name_success_function success_fn,
694 query_name_fail_function fail_fn,
695 struct userdata_struct *userdata,
696 struct nmb_name *nmbname)
697{
698 struct packet_struct *p;
699 struct response_record *rrec;
700 struct in_addr to_ip;
701
702 if(assert_check_subnet(subrec))
703 return NULL;
704
705 to_ip = subrec->bcast_ip;
706
707 /* queries to the WINS server turn up here as queries to IP 0.0.0.0
708 These need to be handled a bit differently */
709 if (subrec->type == UNICAST_SUBNET && is_zero_ip_v4(to_ip)) {
710 /* What we really need to do is loop over each of our wins
711 * servers and wins server tags here, but that just doesn't
712 * fit our architecture at the moment (userdata may already
713 * be used when we get here). For now we just query the first
714 * active wins server on the first tag.
715 */
716 char **tags = wins_srv_tags();
717 if (!tags) {
718 return NULL;
719 }
720 to_ip = wins_srv_ip_tag(tags[0], to_ip);
721 wins_srv_tags_free(tags);
722 }
723
724 if(( p = create_and_init_netbios_packet(nmbname,
725 (subrec != unicast_subnet),
726 (subrec == unicast_subnet),
727 to_ip)) == NULL)
728 return NULL;
729
730 if(lp_bind_interfaces_only()) {
731 int i;
732
733 DEBUG(10,("queue_query_name: bind_interfaces_only is set, looking for suitable source IP\n"));
734 for(i = 0; i < iface_count(); i++) {
735 const struct in_addr *ifip = iface_n_ip_v4(i);
736
737 if (ifip == NULL) {
738 DEBUG(0,("queue_query_name: interface %d has NULL IP address !\n", i));
739 continue;
740 }
741
742 if (is_loopback_ip_v4(*ifip)) {
743 DEBUG(5,("queue_query_name: ignoring loopback interface (%d)\n", i));
744 continue;
745 }
746
747 DEBUG(10,("queue_query_name: using source IP %s\n",inet_ntoa(*ifip)));
748 p->fd = find_subnet_fd_for_address( *ifip );
749 break;
750 }
751 }
752
753 if(initiate_name_query_packet( p ) == False) {
754 p->locked = False;
755 free_packet(p);
756 return NULL;
757 }
758
759 if((rrec = make_response_record(subrec, /* subnet record. */
760 p, /* packet we sent. */
761 resp_fn, /* function to call on response. */
762 timeout_fn, /* function to call on timeout. */
763 (success_function)success_fn, /* function to call on operation success. */
764 (fail_function)fail_fn, /* function to call on operation fail. */
765 userdata)) == NULL) {
766 p->locked = False;
767 free_packet(p);
768 return NULL;
769 }
770
771 return rrec;
772}
773
774/****************************************************************************
775 Queue a query name packet to a given address from the WINS subnet.
776****************************************************************************/
777
778struct response_record *queue_query_name_from_wins_server( struct in_addr to_ip,
779 response_function resp_fn,
780 timeout_response_function timeout_fn,
781 query_name_success_function success_fn,
782 query_name_fail_function fail_fn,
783 struct userdata_struct *userdata,
784 struct nmb_name *nmbname)
785{
786 struct packet_struct *p;
787 struct response_record *rrec;
788
789 if ((p = create_and_init_netbios_packet(nmbname, False, False, to_ip)) == NULL)
790 return NULL;
791
792 if(initiate_name_query_packet_from_wins_server( p ) == False) {
793 p->locked = False;
794 free_packet(p);
795 return NULL;
796 }
797
798 if((rrec = make_response_record(wins_server_subnet, /* subnet record. */
799 p, /* packet we sent. */
800 resp_fn, /* function to call on response. */
801 timeout_fn, /* function to call on timeout. */
802 (success_function)success_fn, /* function to call on operation success. */
803 (fail_function)fail_fn, /* function to call on operation fail. */
804 userdata)) == NULL) {
805 p->locked = False;
806 free_packet(p);
807 return NULL;
808 }
809
810 return rrec;
811}
812
813/****************************************************************************
814 Queue a node status packet to a given name and address.
815****************************************************************************/
816
817struct response_record *queue_node_status( struct subnet_record *subrec,
818 response_function resp_fn,
819 timeout_response_function timeout_fn,
820 node_status_success_function success_fn,
821 node_status_fail_function fail_fn,
822 struct userdata_struct *userdata,
823 struct nmb_name *nmbname,
824 struct in_addr send_ip)
825{
826 struct packet_struct *p;
827 struct response_record *rrec;
828
829 /* Sanity check. */
830 if(subrec != unicast_subnet) {
831 DEBUG(0,("queue_register_multihomed_name: should only be done on \
832unicast subnet. subnet is %s\n.", subrec->subnet_name ));
833 return NULL;
834 }
835
836 if(assert_check_subnet(subrec))
837 return NULL;
838
839 if(( p = create_and_init_netbios_packet(nmbname, False, False, send_ip)) == NULL)
840 return NULL;
841
842 if(initiate_node_status_packet(p) == False) {
843 p->locked = False;
844 free_packet(p);
845 return NULL;
846 }
847
848 if((rrec = make_response_record(subrec, /* subnet record. */
849 p, /* packet we sent. */
850 resp_fn, /* function to call on response. */
851 timeout_fn, /* function to call on timeout. */
852 (success_function)success_fn, /* function to call on operation success. */
853 (fail_function)fail_fn, /* function to call on operation fail. */
854 userdata)) == NULL) {
855 p->locked = False;
856 free_packet(p);
857 return NULL;
858 }
859
860 return rrec;
861}
862
863/****************************************************************************
864 Reply to a netbios name packet. see rfc1002.txt
865****************************************************************************/
866
867void reply_netbios_packet(struct packet_struct *orig_packet,
868 int rcode, enum netbios_reply_type_code rcv_code, int opcode,
869 int ttl, char *data,int len)
870{
871 struct packet_struct packet;
872 struct nmb_packet *nmb = NULL;
873 struct res_rec answers;
874 struct nmb_packet *orig_nmb = &orig_packet->packet.nmb;
875 bool loopback_this_packet = False;
876 int rr_type = RR_TYPE_NB;
877 const char *packet_type = "unknown";
878
879 /* Check if we are sending to or from ourselves. */
880 if(ismyip_v4(orig_packet->ip) && (orig_packet->port == global_nmb_port))
881 loopback_this_packet = True;
882
883 nmb = &packet.packet.nmb;
884
885 /* Do a partial copy of the packet. We clear the locked flag and
886 the resource record pointers. */
887 packet = *orig_packet; /* Full structure copy. */
888 packet.locked = False;
889 nmb->answers = NULL;
890 nmb->nsrecs = NULL;
891 nmb->additional = NULL;
892
893 switch (rcv_code) {
894 case NMB_STATUS:
895 packet_type = "nmb_status";
896 nmb->header.nm_flags.recursion_desired = False;
897 nmb->header.nm_flags.recursion_available = False;
898 rr_type = RR_TYPE_NBSTAT;
899 break;
900 case NMB_QUERY:
901 packet_type = "nmb_query";
902 nmb->header.nm_flags.recursion_desired = True;
903 nmb->header.nm_flags.recursion_available = True;
904 if (rcode) {
905 rr_type = RR_TYPE_NULL;
906 }
907 break;
908 case NMB_REG:
909 case NMB_REG_REFRESH:
910 packet_type = "nmb_reg";
911 nmb->header.nm_flags.recursion_desired = True;
912 nmb->header.nm_flags.recursion_available = True;
913 break;
914 case NMB_REL:
915 packet_type = "nmb_rel";
916 nmb->header.nm_flags.recursion_desired = False;
917 nmb->header.nm_flags.recursion_available = False;
918 break;
919 case NMB_WAIT_ACK:
920 packet_type = "nmb_wack";
921 nmb->header.nm_flags.recursion_desired = False;
922 nmb->header.nm_flags.recursion_available = False;
923 rr_type = RR_TYPE_NULL;
924 break;
925 case WINS_REG:
926 packet_type = "wins_reg";
927 nmb->header.nm_flags.recursion_desired = True;
928 nmb->header.nm_flags.recursion_available = True;
929 break;
930 case WINS_QUERY:
931 packet_type = "wins_query";
932 nmb->header.nm_flags.recursion_desired = True;
933 nmb->header.nm_flags.recursion_available = True;
934 if (rcode) {
935 rr_type = RR_TYPE_NULL;
936 }
937 break;
938 default:
939 DEBUG(0,("reply_netbios_packet: Unknown packet type: %s %s to ip %s\n",
940 packet_type, nmb_namestr(&orig_nmb->question.question_name),
941 inet_ntoa(packet.ip)));
942 return;
943 }
944
945 DEBUG(4,("reply_netbios_packet: sending a reply of packet type: %s %s to ip %s \
946for id %hu\n", packet_type, nmb_namestr(&orig_nmb->question.question_name),
947 inet_ntoa(packet.ip), orig_nmb->header.name_trn_id));
948
949 nmb->header.name_trn_id = orig_nmb->header.name_trn_id;
950 nmb->header.opcode = opcode;
951 nmb->header.response = True;
952 nmb->header.nm_flags.bcast = False;
953 nmb->header.nm_flags.trunc = False;
954 nmb->header.nm_flags.authoritative = True;
955
956 nmb->header.rcode = rcode;
957 nmb->header.qdcount = 0;
958 nmb->header.ancount = 1;
959 nmb->header.nscount = 0;
960 nmb->header.arcount = 0;
961
962 memset((char*)&nmb->question,'\0',sizeof(nmb->question));
963
964 nmb->answers = &answers;
965 memset((char*)nmb->answers,'\0',sizeof(*nmb->answers));
966
967 nmb->answers->rr_name = orig_nmb->question.question_name;
968 nmb->answers->rr_type = rr_type;
969 nmb->answers->rr_class = RR_CLASS_IN;
970 nmb->answers->ttl = ttl;
971
972 if (data && len) {
973 if (len < 0 || len > sizeof(nmb->answers->rdata)) {
974 DEBUG(5,("reply_netbios_packet: "
975 "invalid packet len (%d)\n",
976 len ));
977 return;
978 }
979 nmb->answers->rdlength = len;
980 memcpy(nmb->answers->rdata, data, len);
981 }
982
983 packet.packet_type = NMB_PACKET;
984 /* Ensure we send out on the same fd that the original
985 packet came in on to give the correct source IP address. */
986 packet.fd = orig_packet->fd;
987 packet.timestamp = time(NULL);
988
989 debug_nmb_packet(&packet);
990
991 if(loopback_this_packet) {
992 struct packet_struct *lo_packet;
993 DEBUG(5,("reply_netbios_packet: sending packet to ourselves.\n"));
994 if((lo_packet = copy_packet(&packet)) == NULL)
995 return;
996 queue_packet(lo_packet);
997 } else if (!send_packet(&packet)) {
998 DEBUG(0,("reply_netbios_packet: send_packet to IP %s port %d failed\n",
999 inet_ntoa(packet.ip),packet.port));
1000 }
1001}
1002
1003/*******************************************************************
1004 Queue a packet into a packet queue
1005******************************************************************/
1006
1007static void queue_packet(struct packet_struct *packet)
1008{
1009 struct packet_struct *p;
1010
1011 if (!packet_queue) {
1012 packet->prev = NULL;
1013 packet->next = NULL;
1014 packet_queue = packet;
1015 return;
1016 }
1017
1018 /* find the bottom */
1019 for (p=packet_queue;p->next;p=p->next)
1020 ;
1021
1022 p->next = packet;
1023 packet->next = NULL;
1024 packet->prev = p;
1025}
1026
1027/****************************************************************************
1028 Try and find a matching subnet record for a datagram port 138 packet.
1029****************************************************************************/
1030
1031static struct subnet_record *find_subnet_for_dgram_browse_packet(struct packet_struct *p)
1032{
1033 struct subnet_record *subrec;
1034
1035 /* Go through all the broadcast subnets and see if the mask matches. */
1036 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
1037 if(same_net_v4(p->ip, subrec->bcast_ip, subrec->mask_ip))
1038 return subrec;
1039 }
1040
1041 /* If the subnet record is the remote announce broadcast subnet,
1042 hack it here to be the first subnet. This is really gross and
1043 is needed due to people turning on port 137/138 broadcast
1044 forwarding on their routers. May fire and brimstone rain
1045 down upon them...
1046 */
1047
1048 return FIRST_SUBNET;
1049}
1050
1051/****************************************************************************
1052Dispatch a browse frame from port 138 to the correct processing function.
1053****************************************************************************/
1054
1055static void process_browse_packet(struct packet_struct *p, char *buf,int len)
1056{
1057 struct dgram_packet *dgram = &p->packet.dgram;
1058 int command = CVAL(buf,0);
1059 struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
1060 char scope[64];
1061 unstring src_name;
1062
1063 /* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
1064 pull_ascii(scope, dgram->dest_name.scope, 64, 64, STR_TERMINATE);
1065 if (!strequal(scope, global_scope())) {
1066 DEBUG(7,("process_browse_packet: Discarding datagram from IP %s. Scope (%s) \
1067mismatch with our scope (%s).\n", inet_ntoa(p->ip), scope, global_scope()));
1068 return;
1069 }
1070
1071 pull_ascii_nstring(src_name, sizeof(src_name), dgram->source_name.name);
1072 if (is_myname(src_name)) {
1073 DEBUG(0,("process_browse_packet: Discarding datagram from IP %s. Source name \
1074%s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
1075 return;
1076 }
1077
1078 switch (command) {
1079 case ANN_HostAnnouncement:
1080 debug_browse_data(buf, len);
1081 process_host_announce(subrec, p, buf+1);
1082 break;
1083 case ANN_DomainAnnouncement:
1084 debug_browse_data(buf, len);
1085 process_workgroup_announce(subrec, p, buf+1);
1086 break;
1087 case ANN_LocalMasterAnnouncement:
1088 debug_browse_data(buf, len);
1089 process_local_master_announce(subrec, p, buf+1);
1090 break;
1091 case ANN_AnnouncementRequest:
1092 debug_browse_data(buf, len);
1093 process_announce_request(subrec, p, buf+1);
1094 break;
1095 case ANN_Election:
1096 debug_browse_data(buf, len);
1097 process_election(subrec, p, buf+1);
1098 break;
1099 case ANN_GetBackupListReq:
1100 debug_browse_data(buf, len);
1101 process_get_backup_list_request(subrec, p, buf+1);
1102 break;
1103 case ANN_GetBackupListResp:
1104 debug_browse_data(buf, len);
1105 /* We never send ANN_GetBackupListReq so we should never get these. */
1106 DEBUG(0,("process_browse_packet: Discarding GetBackupListResponse \
1107packet from %s IP %s\n", nmb_namestr(&dgram->source_name), inet_ntoa(p->ip)));
1108 break;
1109 case ANN_ResetBrowserState:
1110 debug_browse_data(buf, len);
1111 process_reset_browser(subrec, p, buf+1);
1112 break;
1113 case ANN_MasterAnnouncement:
1114 /* Master browser datagrams must be processed on the unicast subnet. */
1115 subrec = unicast_subnet;
1116
1117 debug_browse_data(buf, len);
1118 process_master_browser_announce(subrec, p, buf+1);
1119 break;
1120 case ANN_BecomeBackup:
1121 /*
1122 * We don't currently implement this. Log it just in case.
1123 */
1124 debug_browse_data(buf, len);
1125 DEBUG(10,("process_browse_packet: On subnet %s ignoring browse packet \
1126command ANN_BecomeBackup from %s IP %s to %s\n", subrec->subnet_name, nmb_namestr(&dgram->source_name),
1127 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1128 break;
1129 default:
1130 debug_browse_data(buf, len);
1131 DEBUG(0,("process_browse_packet: On subnet %s ignoring browse packet \
1132command code %d from %s IP %s to %s\n", subrec->subnet_name, command, nmb_namestr(&dgram->source_name),
1133 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1134 break;
1135 }
1136}
1137
1138/****************************************************************************
1139 Dispatch a LanMan browse frame from port 138 to the correct processing function.
1140****************************************************************************/
1141
1142static void process_lanman_packet(struct packet_struct *p, char *buf,int len)
1143{
1144 struct dgram_packet *dgram = &p->packet.dgram;
1145 int command = SVAL(buf,0);
1146 struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
1147 char scope[64];
1148 unstring src_name;
1149
1150 /* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
1151
1152 pull_ascii(scope, dgram->dest_name.scope, 64, 64, STR_TERMINATE);
1153 if (!strequal(scope, global_scope())) {
1154 DEBUG(7,("process_lanman_packet: Discarding datagram from IP %s. Scope (%s) \
1155mismatch with our scope (%s).\n", inet_ntoa(p->ip), scope, global_scope()));
1156 return;
1157 }
1158
1159 pull_ascii_nstring(src_name, sizeof(src_name), dgram->source_name.name);
1160 if (is_myname(src_name)) {
1161 DEBUG(0,("process_lanman_packet: Discarding datagram from IP %s. Source name \
1162%s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
1163 return;
1164 }
1165
1166 switch (command) {
1167 case ANN_HostAnnouncement:
1168 debug_browse_data(buf, len);
1169 process_lm_host_announce(subrec, p, buf+1, len > 1 ? len-1 : 0);
1170 break;
1171 case ANN_AnnouncementRequest:
1172 process_lm_announce_request(subrec, p, buf+1, len > 1 ? len-1 : 0);
1173 break;
1174 default:
1175 DEBUG(0,("process_lanman_packet: On subnet %s ignoring browse packet \
1176command code %d from %s IP %s to %s\n", subrec->subnet_name, command, nmb_namestr(&dgram->source_name),
1177 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1178 break;
1179 }
1180}
1181
1182/****************************************************************************
1183 Determine if a packet is for us on port 138. Note that to have any chance of
1184 being efficient we need to drop as many packets as possible at this
1185 stage as subsequent processing is expensive.
1186****************************************************************************/
1187
1188static bool listening(struct packet_struct *p,struct nmb_name *nbname)
1189{
1190 struct subnet_record *subrec = NULL;
1191
1192 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
1193 if(same_net_v4(p->ip, subrec->bcast_ip, subrec->mask_ip))
1194 break;
1195 }
1196
1197 if(subrec == NULL)
1198 subrec = unicast_subnet;
1199
1200 return (find_name_on_subnet(subrec, nbname, FIND_SELF_NAME) != NULL);
1201}
1202
1203/****************************************************************************
1204 Process udp 138 datagrams
1205****************************************************************************/
1206
1207static void process_dgram(struct packet_struct *p)
1208{
1209 char *buf;
1210 char *buf2;
1211 int len;
1212 struct dgram_packet *dgram = &p->packet.dgram;
1213
1214 /* If we aren't listening to the destination name then ignore the packet */
1215 if (!listening(p,&dgram->dest_name)) {
1216 unexpected_packet(p);
1217 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from %s\n",
1218 nmb_namestr(&dgram->dest_name), inet_ntoa(p->ip)));
1219 return;
1220 }
1221
1222 if (dgram->header.msg_type != 0x10 && dgram->header.msg_type != 0x11 && dgram->header.msg_type != 0x12) {
1223 unexpected_packet(p);
1224 /* Don't process error packets etc yet */
1225 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from IP %s as it is \
1226an error packet of type %x\n", nmb_namestr(&dgram->dest_name), inet_ntoa(p->ip), dgram->header.msg_type));
1227 return;
1228 }
1229
1230 /* Ensure we have a large enough packet before looking inside. */
1231 if (dgram->datasize < (smb_vwv12 - 2)) {
1232 /* That's the offset minus the 4 byte length + 2 bytes of offset. */
1233 DEBUG(0,("process_dgram: ignoring too short dgram packet (%u) sent to name %s from IP %s\n",
1234 (unsigned int)dgram->datasize,
1235 nmb_namestr(&dgram->dest_name),
1236 inet_ntoa(p->ip) ));
1237 return;
1238 }
1239
1240 buf = &dgram->data[0];
1241 buf -= 4; /* XXXX for the pseudo tcp length - someday I need to get rid of this */
1242
1243 if (CVAL(buf,smb_com) != SMBtrans)
1244 return;
1245
1246 len = SVAL(buf,smb_vwv11);
1247 buf2 = smb_base(buf) + SVAL(buf,smb_vwv12);
1248
1249 if (len <= 0 || len > dgram->datasize) {
1250 DEBUG(0,("process_dgram: ignoring malformed1 (datasize = %d, len = %d) datagram \
1251packet sent to name %s from IP %s\n",
1252 dgram->datasize,
1253 len,
1254 nmb_namestr(&dgram->dest_name),
1255 inet_ntoa(p->ip) ));
1256 return;
1257 }
1258
1259 if (buf2 < dgram->data || (buf2 >= dgram->data + dgram->datasize)) {
1260 DEBUG(0,("process_dgram: ignoring malformed2 (datasize = %d, len=%d, off=%d) datagram \
1261packet sent to name %s from IP %s\n",
1262 dgram->datasize,
1263 len,
1264 (int)PTR_DIFF(buf2, dgram->data),
1265 nmb_namestr(&dgram->dest_name),
1266 inet_ntoa(p->ip) ));
1267 return;
1268 }
1269
1270 if ((buf2 + len < dgram->data) || (buf2 + len > dgram->data + dgram->datasize)) {
1271 DEBUG(0,("process_dgram: ignoring malformed3 (datasize = %d, len=%d, off=%d) datagram \
1272packet sent to name %s from IP %s\n",
1273 dgram->datasize,
1274 len,
1275 (int)PTR_DIFF(buf2, dgram->data),
1276 nmb_namestr(&dgram->dest_name),
1277 inet_ntoa(p->ip) ));
1278 return;
1279 }
1280
1281 DEBUG(4,("process_dgram: datagram from %s to %s IP %s for %s of type %d len=%d\n",
1282 nmb_namestr(&dgram->source_name),nmb_namestr(&dgram->dest_name),
1283 inet_ntoa(p->ip), smb_buf(buf),CVAL(buf2,0),len));
1284
1285 /* Datagram packet received for the browser mailslot */
1286 if (strequal(smb_buf(buf),BROWSE_MAILSLOT)) {
1287 process_browse_packet(p,buf2,len);
1288 return;
1289 }
1290
1291 /* Datagram packet received for the LAN Manager mailslot */
1292 if (strequal(smb_buf(buf),LANMAN_MAILSLOT)) {
1293 process_lanman_packet(p,buf2,len);
1294 return;
1295 }
1296
1297 /* Datagram packet received for the domain logon mailslot */
1298 if (strequal(smb_buf(buf),NET_LOGON_MAILSLOT)) {
1299 process_logon_packet(p,buf2,len,NET_LOGON_MAILSLOT);
1300 return;
1301 }
1302
1303 /* Datagram packet received for the NT domain logon mailslot */
1304 if (strequal(smb_buf(buf),NT_LOGON_MAILSLOT)) {
1305 process_logon_packet(p,buf2,len,NT_LOGON_MAILSLOT);
1306 return;
1307 }
1308
1309 unexpected_packet(p);
1310}
1311
1312/****************************************************************************
1313 Validate a response nmb packet.
1314****************************************************************************/
1315
1316static bool validate_nmb_response_packet( struct nmb_packet *nmb )
1317{
1318 bool ignore = False;
1319
1320 switch (nmb->header.opcode) {
1321 case NMB_NAME_REG_OPCODE:
1322 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1323 case NMB_NAME_REFRESH_OPCODE_9: /* WinNT uses 8 by default. */
1324 if (nmb->header.ancount == 0) {
1325 DEBUG(0,("validate_nmb_response_packet: Bad REG/REFRESH Packet. "));
1326 ignore = True;
1327 }
1328 break;
1329
1330 case NMB_NAME_QUERY_OPCODE:
1331 if ((nmb->header.ancount != 0) && (nmb->header.ancount != 1)) {
1332 DEBUG(0,("validate_nmb_response_packet: Bad QUERY Packet. "));
1333 ignore = True;
1334 }
1335 break;
1336
1337 case NMB_NAME_RELEASE_OPCODE:
1338 if (nmb->header.ancount == 0) {
1339 DEBUG(0,("validate_nmb_response_packet: Bad RELEASE Packet. "));
1340 ignore = True;
1341 }
1342 break;
1343
1344 case NMB_WACK_OPCODE:
1345 /* Check WACK response here. */
1346 if (nmb->header.ancount != 1) {
1347 DEBUG(0,("validate_nmb_response_packet: Bad WACK Packet. "));
1348 ignore = True;
1349 }
1350 break;
1351 default:
1352 DEBUG(0,("validate_nmb_response_packet: Ignoring packet with unknown opcode %d.\n",
1353 nmb->header.opcode));
1354 return True;
1355 }
1356
1357 if(ignore)
1358 DEBUG(0,("Ignoring response packet with opcode %d.\n", nmb->header.opcode));
1359
1360 return ignore;
1361}
1362
1363/****************************************************************************
1364 Validate a request nmb packet.
1365****************************************************************************/
1366
1367static bool validate_nmb_packet( struct nmb_packet *nmb )
1368{
1369 bool ignore = False;
1370
1371 switch (nmb->header.opcode) {
1372 case NMB_NAME_REG_OPCODE:
1373 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1374 case NMB_NAME_REFRESH_OPCODE_9: /* WinNT uses 8 by default. */
1375 case NMB_NAME_MULTIHOMED_REG_OPCODE:
1376 if (nmb->header.qdcount==0 || nmb->header.arcount==0) {
1377 DEBUG(0,("validate_nmb_packet: Bad REG/REFRESH Packet. "));
1378 ignore = True;
1379 }
1380 break;
1381
1382 case NMB_NAME_QUERY_OPCODE:
1383 if ((nmb->header.qdcount == 0) || ((nmb->question.question_type != QUESTION_TYPE_NB_QUERY) &&
1384 (nmb->question.question_type != QUESTION_TYPE_NB_STATUS))) {
1385 DEBUG(0,("validate_nmb_packet: Bad QUERY Packet. "));
1386 ignore = True;
1387 }
1388 break;
1389
1390 case NMB_NAME_RELEASE_OPCODE:
1391 if (nmb->header.qdcount==0 || nmb->header.arcount==0) {
1392 DEBUG(0,("validate_nmb_packet: Bad RELEASE Packet. "));
1393 ignore = True;
1394 }
1395 break;
1396 default:
1397 DEBUG(0,("validate_nmb_packet: Ignoring packet with unknown opcode %d.\n",
1398 nmb->header.opcode));
1399 return True;
1400 }
1401
1402 if(ignore)
1403 DEBUG(0,("validate_nmb_packet: Ignoring request packet with opcode %d.\n", nmb->header.opcode));
1404
1405 return ignore;
1406}
1407
1408/****************************************************************************
1409 Find a subnet (and potentially a response record) for a packet.
1410****************************************************************************/
1411
1412static struct subnet_record *find_subnet_for_nmb_packet( struct packet_struct *p,
1413 struct response_record **pprrec)
1414{
1415 struct nmb_packet *nmb = &p->packet.nmb;
1416 struct response_record *rrec = NULL;
1417 struct subnet_record *subrec = NULL;
1418
1419 if(pprrec != NULL)
1420 *pprrec = NULL;
1421
1422 if(nmb->header.response) {
1423 /* It's a response packet. Find a record for it or it's an error. */
1424
1425 rrec = find_response_record( &subrec, nmb->header.name_trn_id);
1426 if(rrec == NULL) {
1427 DEBUG(3,("find_subnet_for_nmb_packet: response record not found for response id %hu\n",
1428 nmb->header.name_trn_id));
1429 unexpected_packet(p);
1430 return NULL;
1431 }
1432
1433 if(subrec == NULL) {
1434 DEBUG(0,("find_subnet_for_nmb_packet: subnet record not found for response id %hu\n",
1435 nmb->header.name_trn_id));
1436 return NULL;
1437 }
1438
1439 if(pprrec != NULL)
1440 *pprrec = rrec;
1441 return subrec;
1442 }
1443
1444 /* Try and see what subnet this packet belongs to. */
1445
1446 /* WINS server ? */
1447 if(packet_is_for_wins_server(p))
1448 return wins_server_subnet;
1449
1450 /* If it wasn't a broadcast packet then send to the UNICAST subnet. */
1451 if(nmb->header.nm_flags.bcast == False)
1452 return unicast_subnet;
1453
1454 /* Go through all the broadcast subnets and see if the mask matches. */
1455 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
1456 if(same_net_v4(p->ip, subrec->bcast_ip, subrec->mask_ip))
1457 return subrec;
1458 }
1459
1460 /* If none match it must have been a directed broadcast - assign the remote_broadcast_subnet. */
1461 return remote_broadcast_subnet;
1462}
1463
1464/****************************************************************************
1465 Process a nmb request packet - validate the packet and route it.
1466****************************************************************************/
1467
1468static void process_nmb_request(struct packet_struct *p)
1469{
1470 struct nmb_packet *nmb = &p->packet.nmb;
1471 struct subnet_record *subrec = NULL;
1472
1473 debug_nmb_packet(p);
1474
1475 /* Ensure we have a good packet. */
1476 if(validate_nmb_packet(nmb))
1477 return;
1478
1479 /* Allocate a subnet to this packet - if we cannot - fail. */
1480 if((subrec = find_subnet_for_nmb_packet(p, NULL))==NULL)
1481 return;
1482
1483 switch (nmb->header.opcode) {
1484 case NMB_NAME_REG_OPCODE:
1485 if(subrec == wins_server_subnet)
1486 wins_process_name_registration_request(subrec, p);
1487 else
1488 process_name_registration_request(subrec, p);
1489 break;
1490
1491 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1492 case NMB_NAME_REFRESH_OPCODE_9:
1493 if(subrec == wins_server_subnet)
1494 wins_process_name_refresh_request(subrec, p);
1495 else
1496 process_name_refresh_request(subrec, p);
1497 break;
1498
1499 case NMB_NAME_MULTIHOMED_REG_OPCODE:
1500 if(subrec == wins_server_subnet) {
1501 wins_process_multihomed_name_registration_request(subrec, p);
1502 } else {
1503 DEBUG(0,("process_nmb_request: Multihomed registration request must be \
1504directed at a WINS server.\n"));
1505 }
1506 break;
1507
1508 case NMB_NAME_QUERY_OPCODE:
1509 switch (nmb->question.question_type) {
1510 case QUESTION_TYPE_NB_QUERY:
1511 if(subrec == wins_server_subnet)
1512 wins_process_name_query_request(subrec, p);
1513 else
1514 process_name_query_request(subrec, p);
1515 break;
1516 case QUESTION_TYPE_NB_STATUS:
1517 if(subrec == wins_server_subnet) {
1518 DEBUG(0,("process_nmb_request: NB_STATUS request directed at WINS server is \
1519not allowed.\n"));
1520 break;
1521 } else {
1522 process_node_status_request(subrec, p);
1523 }
1524 break;
1525 }
1526 break;
1527
1528 case NMB_NAME_RELEASE_OPCODE:
1529 if(subrec == wins_server_subnet)
1530 wins_process_name_release_request(subrec, p);
1531 else
1532 process_name_release_request(subrec, p);
1533 break;
1534 }
1535}
1536
1537/****************************************************************************
1538 Process a nmb response packet - validate the packet and route it.
1539 to either the WINS server or a normal response.
1540****************************************************************************/
1541
1542static void process_nmb_response(struct packet_struct *p)
1543{
1544 struct nmb_packet *nmb = &p->packet.nmb;
1545 struct subnet_record *subrec = NULL;
1546 struct response_record *rrec = NULL;
1547
1548 debug_nmb_packet(p);
1549
1550 if(validate_nmb_response_packet(nmb))
1551 return;
1552
1553 if((subrec = find_subnet_for_nmb_packet(p, &rrec))==NULL)
1554 return;
1555
1556 if(rrec == NULL) {
1557 DEBUG(0,("process_nmb_response: response packet received but no response record \
1558found for id = %hu. Ignoring packet.\n", nmb->header.name_trn_id));
1559 return;
1560 }
1561
1562 /* Increment the number of responses received for this record. */
1563 rrec->num_msgs++;
1564 /* Ensure we don't re-send the request. */
1565 rrec->repeat_count = 0;
1566
1567 /* Call the response received function for this packet. */
1568 (*rrec->resp_fn)(subrec, rrec, p);
1569}
1570
1571/*******************************************************************
1572 Run elements off the packet queue till its empty
1573******************************************************************/
1574
1575void run_packet_queue(void)
1576{
1577 struct packet_struct *p;
1578
1579 while ((p = packet_queue)) {
1580 packet_queue = p->next;
1581 if (packet_queue)
1582 packet_queue->prev = NULL;
1583 p->next = p->prev = NULL;
1584
1585 switch (p->packet_type) {
1586 case NMB_PACKET:
1587 if(p->packet.nmb.header.response)
1588 process_nmb_response(p);
1589 else
1590 process_nmb_request(p);
1591 break;
1592
1593 case DGRAM_PACKET:
1594 process_dgram(p);
1595 break;
1596 }
1597 free_packet(p);
1598 }
1599}
1600
1601/*******************************************************************
1602 Retransmit or timeout elements from all the outgoing subnet response
1603 record queues. NOTE that this code must also check the WINS server
1604 subnet for response records to timeout as the WINS server code
1605 can send requests to check if a client still owns a name.
1606 (Patch from Andrey Alekseyev <fetch@muffin.arcadia.spb.ru>).
1607******************************************************************/
1608
1609void retransmit_or_expire_response_records(time_t t)
1610{
1611 struct subnet_record *subrec;
1612
1613 for (subrec = FIRST_SUBNET; subrec; subrec = get_next_subnet_maybe_unicast_or_wins_server(subrec)) {
1614 struct response_record *rrec, *nextrrec;
1615
1616 restart:
1617
1618 for (rrec = subrec->responselist; rrec; rrec = nextrrec) {
1619 nextrrec = rrec->next;
1620
1621 if (rrec->repeat_time <= t) {
1622 if (rrec->repeat_count > 0) {
1623 /* Resend while we have a non-zero repeat_count. */
1624 if(!send_packet(rrec->packet)) {
1625 DEBUG(0,("retransmit_or_expire_response_records: Failed to resend packet id %hu \
1626to IP %s on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip), subrec->subnet_name));
1627 }
1628 rrec->repeat_time = t + rrec->repeat_interval;
1629 rrec->repeat_count--;
1630 } else {
1631 DEBUG(4,("retransmit_or_expire_response_records: timeout for packet id %hu to IP %s \
1632on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip), subrec->subnet_name));
1633
1634 /*
1635 * Check the flag in this record to prevent recursion if we end
1636 * up in this function again via the timeout function call.
1637 */
1638
1639 if(!rrec->in_expiration_processing) {
1640
1641 /*
1642 * Set the recursion protection flag in this record.
1643 */
1644
1645 rrec->in_expiration_processing = True;
1646
1647 /* Call the timeout function. This will deal with removing the
1648 timed out packet. */
1649 if(rrec->timeout_fn) {
1650 (*rrec->timeout_fn)(subrec, rrec);
1651 } else {
1652 /* We must remove the record ourself if there is
1653 no timeout function. */
1654 remove_response_record(subrec, rrec);
1655 }
1656 /* We have changed subrec->responselist,
1657 * restart from the beginning of this list. */
1658 goto restart;
1659 } /* !rrec->in_expitation_processing */
1660 } /* rrec->repeat_count > 0 */
1661 } /* rrec->repeat_time <= t */
1662 } /* end for rrec */
1663 } /* end for subnet */
1664}
1665
1666/****************************************************************************
1667 Create an fd_set containing all the sockets in the subnet structures,
1668 plus the broadcast sockets.
1669***************************************************************************/
1670
1671static bool create_listen_fdset(fd_set **ppset, int **psock_array, int *listen_number, int *maxfd)
1672{
1673 int *sock_array = NULL;
1674 struct subnet_record *subrec = NULL;
1675 int count = 0;
1676 int num = 0;
1677 fd_set *pset = SMB_MALLOC_P(fd_set);
1678
1679 if(pset == NULL) {
1680 DEBUG(0,("create_listen_fdset: malloc fail !\n"));
1681 return True;
1682 }
1683
1684 /* Check that we can add all the fd's we need. */
1685 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1686 count++;
1687
1688 if((count*2) + 2 > FD_SETSIZE) {
1689 DEBUG(0,("create_listen_fdset: Too many file descriptors needed (%d). We can \
1690only use %d.\n", (count*2) + 2, FD_SETSIZE));
1691 SAFE_FREE(pset);
1692 return True;
1693 }
1694
1695 if((sock_array = SMB_MALLOC_ARRAY(int, (count*2) + 2)) == NULL) {
1696 DEBUG(0,("create_listen_fdset: malloc fail for socket array.\n"));
1697 SAFE_FREE(pset);
1698 return True;
1699 }
1700
1701 FD_ZERO(pset);
1702
1703 /* Add in the broadcast socket on 137. */
1704 FD_SET(ClientNMB,pset);
1705 sock_array[num++] = ClientNMB;
1706 *maxfd = MAX( *maxfd, ClientNMB);
1707
1708 /* Add in the 137 sockets on all the interfaces. */
1709 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
1710 FD_SET(subrec->nmb_sock,pset);
1711 sock_array[num++] = subrec->nmb_sock;
1712 *maxfd = MAX( *maxfd, subrec->nmb_sock);
1713 }
1714
1715 /* Add in the broadcast socket on 138. */
1716 FD_SET(ClientDGRAM,pset);
1717 sock_array[num++] = ClientDGRAM;
1718 *maxfd = MAX( *maxfd, ClientDGRAM);
1719
1720 /* Add in the 138 sockets on all the interfaces. */
1721 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec)) {
1722 FD_SET(subrec->dgram_sock,pset);
1723 sock_array[num++] = subrec->dgram_sock;
1724 *maxfd = MAX( *maxfd, subrec->dgram_sock);
1725 }
1726
1727 *listen_number = (count*2) + 2;
1728
1729 SAFE_FREE(*ppset);
1730 SAFE_FREE(*psock_array);
1731
1732 *ppset = pset;
1733 *psock_array = sock_array;
1734
1735 return False;
1736}
1737
1738/****************************************************************************
1739 Listens for NMB or DGRAM packets, and queues them.
1740 return True if the socket is dead
1741***************************************************************************/
1742
1743bool listen_for_packets(bool run_election)
1744{
1745 static fd_set *listen_set = NULL;
1746 static int listen_number = 0;
1747 static int *sock_array = NULL;
1748 int i;
1749 static int maxfd = 0;
1750
1751 fd_set r_fds;
1752 fd_set w_fds;
1753 int selrtn;
1754 struct timeval timeout;
1755#ifndef SYNC_DNS
1756 int dns_fd;
1757#endif
1758
1759 if(listen_set == NULL || rescan_listen_set) {
1760 if(create_listen_fdset(&listen_set, &sock_array, &listen_number, &maxfd)) {
1761 DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n"));
1762 return True;
1763 }
1764 rescan_listen_set = False;
1765 }
1766
1767 memcpy((char *)&r_fds, (char *)listen_set, sizeof(fd_set));
1768 FD_ZERO(&w_fds);
1769
1770#ifndef SYNC_DNS
1771 dns_fd = asyncdns_fd();
1772 if (dns_fd != -1) {
1773 FD_SET(dns_fd, &r_fds);
1774 maxfd = MAX( maxfd, dns_fd);
1775 }
1776#endif
1777
1778 /*
1779 * During elections and when expecting a netbios response packet we
1780 * need to send election packets at tighter intervals.
1781 * Ideally it needs to be the interval (in ms) between time now and
1782 * the time we are expecting the next netbios packet.
1783 */
1784
1785 timeout.tv_sec = (run_election||num_response_packets) ? 1 : NMBD_SELECT_LOOP;
1786 timeout.tv_usec = 0;
1787
1788 {
1789 struct timeval now = timeval_current();
1790 event_add_to_select_args(nmbd_event_context(), &now,
1791 &r_fds, &w_fds, &timeout, &maxfd);
1792 }
1793
1794 if (timeval_is_zero(&timeout)) {
1795 /* Process a timed event now... */
1796 if (run_events(nmbd_event_context(), 0, NULL, NULL)) {
1797 return False;
1798 }
1799 }
1800
1801 /* Prepare for the select - allow certain signals. */
1802
1803 BlockSignals(False, SIGTERM);
1804
1805 selrtn = sys_select(maxfd+1,&r_fds,&w_fds,NULL,&timeout);
1806
1807 /* We can only take signals when we are in the select - block them again here. */
1808
1809 BlockSignals(True, SIGTERM);
1810
1811 if(selrtn == -1) {
1812 return False;
1813 }
1814
1815 if (run_events(nmbd_event_context(), selrtn, &r_fds, &w_fds)) {
1816 return False;
1817 }
1818
1819#ifndef SYNC_DNS
1820 if (dns_fd != -1 && FD_ISSET(dns_fd,&r_fds)) {
1821 run_dns_queue();
1822 }
1823#endif
1824
1825 for(i = 0; i < listen_number; i++) {
1826 if (i < (listen_number/2)) {
1827 /* Processing a 137 socket. */
1828 if (FD_ISSET(sock_array[i],&r_fds)) {
1829 struct packet_struct *packet = read_packet(sock_array[i], NMB_PACKET);
1830 if (packet) {
1831 /*
1832 * If we got a packet on the broadcast socket and interfaces
1833 * only is set then check it came from one of our local nets.
1834 */
1835 if(lp_bind_interfaces_only() && (sock_array[i] == ClientNMB) &&
1836 (!is_local_net_v4(packet->ip))) {
1837 DEBUG(7,("discarding nmb packet sent to broadcast socket from %s:%d\n",
1838 inet_ntoa(packet->ip),packet->port));
1839 free_packet(packet);
1840 } else if ((is_loopback_ip_v4(packet->ip) ||
1841 ismyip_v4(packet->ip)) && packet->port == global_nmb_port &&
1842 packet->packet.nmb.header.nm_flags.bcast) {
1843 DEBUG(7,("discarding own bcast packet from %s:%d\n",
1844 inet_ntoa(packet->ip),packet->port));
1845 free_packet(packet);
1846 } else {
1847 /* Save the file descriptor this packet came in on. */
1848 packet->fd = sock_array[i];
1849 queue_packet(packet);
1850 }
1851 }
1852 }
1853 } else {
1854 /* Processing a 138 socket. */
1855 if (FD_ISSET(sock_array[i],&r_fds)) {
1856 struct packet_struct *packet = read_packet(sock_array[i], DGRAM_PACKET);
1857 if (packet) {
1858 /*
1859 * If we got a packet on the broadcast socket and interfaces
1860 * only is set then check it came from one of our local nets.
1861 */
1862 if(lp_bind_interfaces_only() && (sock_array[i] == ClientDGRAM) &&
1863 (!is_local_net_v4(packet->ip))) {
1864 DEBUG(7,("discarding dgram packet sent to broadcast socket from %s:%d\n",
1865 inet_ntoa(packet->ip),packet->port));
1866 free_packet(packet);
1867 } else if ((is_loopback_ip_v4(packet->ip) ||
1868 ismyip_v4(packet->ip)) && packet->port == DGRAM_PORT) {
1869 DEBUG(7,("discarding own dgram packet from %s:%d\n",
1870 inet_ntoa(packet->ip),packet->port));
1871 free_packet(packet);
1872 } else {
1873 /* Save the file descriptor this packet came in on. */
1874 packet->fd = sock_array[i];
1875 queue_packet(packet);
1876 }
1877 }
1878 }
1879 } /* end processing 138 socket. */
1880 } /* end for */
1881 return False;
1882}
1883
1884/****************************************************************************
1885 Construct and send a netbios DGRAM.
1886**************************************************************************/
1887
1888bool send_mailslot(bool unique, const char *mailslot,char *buf, size_t len,
1889 const char *srcname, int src_type,
1890 const char *dstname, int dest_type,
1891 struct in_addr dest_ip,struct in_addr src_ip,
1892 int dest_port)
1893{
1894 bool loopback_this_packet = False;
1895 struct packet_struct p;
1896 struct dgram_packet *dgram = &p.packet.dgram;
1897 char *ptr,*p2;
1898 char tmp[4];
1899
1900 memset((char *)&p,'\0',sizeof(p));
1901
1902 if(ismyip_v4(dest_ip) && (dest_port == DGRAM_PORT)) /* Only if to DGRAM_PORT */
1903 loopback_this_packet = True;
1904
1905 /* generate_name_trn_id(); */ /* Not used, so gone, RJS */
1906
1907 /* DIRECT GROUP or UNIQUE datagram. */
1908 dgram->header.msg_type = unique ? 0x10 : 0x11;
1909 dgram->header.flags.node_type = M_NODE;
1910 dgram->header.flags.first = True;
1911 dgram->header.flags.more = False;
1912 dgram->header.dgm_id = generate_name_trn_id();
1913 dgram->header.source_ip = src_ip;
1914 dgram->header.source_port = DGRAM_PORT;
1915 dgram->header.dgm_length = 0; /* Let build_dgram() handle this. */
1916 dgram->header.packet_offset = 0;
1917
1918 make_nmb_name(&dgram->source_name,srcname,src_type);
1919 make_nmb_name(&dgram->dest_name,dstname,dest_type);
1920
1921 ptr = &dgram->data[0];
1922
1923 /* Setup the smb part. */
1924 ptr -= 4; /* XXX Ugliness because of handling of tcp SMB length. */
1925 memcpy(tmp,ptr,4);
1926
1927 if (smb_size + 17*2 + strlen(mailslot) + 1 + len > MAX_DGRAM_SIZE) {
1928 DEBUG(0, ("send_mailslot: Cannot write beyond end of packet\n"));
1929 return false;
1930 }
1931
1932 cli_set_message(ptr,17,strlen(mailslot) + 1 + len,True);
1933 memcpy(ptr,tmp,4);
1934
1935 SCVAL(ptr,smb_com,SMBtrans);
1936 SSVAL(ptr,smb_vwv1,len);
1937 SSVAL(ptr,smb_vwv11,len);
1938 SSVAL(ptr,smb_vwv12,70 + strlen(mailslot));
1939 SSVAL(ptr,smb_vwv13,3);
1940 SSVAL(ptr,smb_vwv14,1);
1941 SSVAL(ptr,smb_vwv15,1);
1942 SSVAL(ptr,smb_vwv16,2);
1943 p2 = smb_buf(ptr);
1944 safe_strcpy_base(p2, mailslot, dgram->data, sizeof(dgram->data));
1945 p2 = skip_string(ptr,MAX_DGRAM_SIZE,p2);
1946
1947 if (((p2+len) > dgram->data+sizeof(dgram->data)) || ((p2+len) < p2)) {
1948 DEBUG(0, ("send_mailslot: Cannot write beyond end of packet\n"));
1949 return False;
1950 } else {
1951 memcpy(p2,buf,len);
1952 p2 += len;
1953 }
1954
1955 dgram->datasize = PTR_DIFF(p2,ptr+4); /* +4 for tcp length. */
1956
1957 p.ip = dest_ip;
1958 p.port = dest_port;
1959 p.fd = find_subnet_mailslot_fd_for_address( src_ip );
1960 p.timestamp = time(NULL);
1961 p.packet_type = DGRAM_PACKET;
1962
1963 DEBUG(4,("send_mailslot: Sending to mailslot %s from %s IP %s ", mailslot,
1964 nmb_namestr(&dgram->source_name), inet_ntoa(src_ip)));
1965 DEBUG(4,("to %s IP %s\n", nmb_namestr(&dgram->dest_name), inet_ntoa(dest_ip)));
1966
1967 debug_browse_data(buf, len);
1968
1969 if(loopback_this_packet) {
1970 struct packet_struct *lo_packet = NULL;
1971 DEBUG(5,("send_mailslot: sending packet to ourselves.\n"));
1972 if((lo_packet = copy_packet(&p)) == NULL)
1973 return False;
1974 queue_packet(lo_packet);
1975 return True;
1976 } else {
1977 return(send_packet(&p));
1978 }
1979}
Note: See TracBrowser for help on using the repository browser.