dnscrypto-proxy: Support files updated.
[tomato.git] / release / src / router / samba / source / nmbd / nmbd_packets.c
blob1d6fa1d77cc28ea52939785c6a9aa8e8e10e668a
1 /*
2 Unix SMB/Netbios implementation.
3 Version 1.9.
4 NBT netbios routines and daemon - version 2
5 Copyright (C) Andrew Tridgell 1994-1998
6 Copyright (C) Luke Kenneth Casson Leighton 1994-1998
7 Copyright (C) Jeremy Allison 1994-1998
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "includes.h"
27 extern int ClientNMB;
28 extern int ClientDGRAM;
29 extern int global_nmb_port;
31 extern int DEBUGLEVEL;
33 extern int num_response_packets;
35 extern struct in_addr loopback_ip;
37 static void queue_packet(struct packet_struct *packet);
39 BOOL rescan_listen_set = False;
42 /*******************************************************************
43 The global packet linked-list. Incoming entries are
44 added to the end of this list. It is supposed to remain fairly
45 short so we won't bother with an end pointer.
46 ******************************************************************/
48 static struct packet_struct *packet_queue = NULL;
50 /***************************************************************************
51 Utility function to find the specific fd to send a packet out on.
52 **************************************************************************/
54 static int find_subnet_fd_for_address( struct in_addr local_ip )
56 struct subnet_record *subrec;
58 for( subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
59 if(ip_equal(local_ip, subrec->myip))
60 return subrec->nmb_sock;
62 return ClientNMB;
65 /***************************************************************************
66 Utility function to find the specific fd to send a mailslot packet out on.
67 **************************************************************************/
69 static int find_subnet_mailslot_fd_for_address( struct in_addr local_ip )
71 struct subnet_record *subrec;
73 for( subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
74 if(ip_equal(local_ip, subrec->myip))
75 return subrec->dgram_sock;
77 return ClientDGRAM;
80 /***************************************************************************
81 Get/Set problematic nb_flags as network byte order 16 bit int.
82 **************************************************************************/
84 uint16 get_nb_flags(char *buf)
86 return ((((uint16)*buf)&0xFFFF) & NB_FLGMSK);
89 void set_nb_flags(char *buf, uint16 nb_flags)
91 *buf++ = ((nb_flags & NB_FLGMSK) & 0xFF);
92 *buf = '\0';
95 /***************************************************************************
96 Dumps out the browse packet data.
97 **************************************************************************/
99 static void debug_browse_data(char *outbuf, int len)
101 int i,j;
103 DEBUG( 4, ( "debug_browse_data():\n" ) );
104 for (i = 0; i < len; i+= 16)
106 DEBUGADD( 4, ( "%3x char ", i ) );
108 for (j = 0; j < 16; j++)
110 unsigned char x = outbuf[i+j];
111 if (x < 32 || x > 127)
112 x = '.';
114 if (i+j >= len)
115 break;
116 DEBUGADD( 4, ( "%c", x ) );
119 DEBUGADD( 4, ( "%*s hex", 16-j, "" ) );
121 for (j = 0; j < 16; j++)
123 if (i+j >= len)
124 break;
125 DEBUGADD( 4, ( " %02x", (unsigned char)outbuf[i+j] ) );
128 DEBUGADD( 4, ("\n") );
132 /***************************************************************************
133 Generates the unique transaction identifier
134 **************************************************************************/
136 static uint16 name_trn_id=0;
138 static uint16 generate_name_trn_id(void)
141 if (!name_trn_id)
143 name_trn_id = ((unsigned)time(NULL)%(unsigned)0x7FFF) + ((unsigned)getpid()%(unsigned)100);
145 name_trn_id = (name_trn_id+1) % (unsigned)0x7FFF;
146 return name_trn_id;
149 /***************************************************************************
150 Either loops back or sends out a completed NetBIOS packet.
151 **************************************************************************/
153 static BOOL send_netbios_packet(struct packet_struct *p)
155 BOOL loopback_this_packet = False;
157 /* Check if we are sending to or from ourselves as a WINS server. */
158 if(ismyip(p->ip) && (p->port == global_nmb_port))
159 loopback_this_packet = True;
161 if(loopback_this_packet)
163 struct packet_struct *lo_packet = NULL;
164 DEBUG(5,("send_netbios_packet: sending packet to ourselves.\n"));
165 if((lo_packet = copy_packet(p)) == NULL)
166 return False;
167 queue_packet(lo_packet);
169 else if (!send_packet(p))
171 DEBUG(0,("send_netbios_packet: send_packet() to IP %s port %d failed\n",
172 inet_ntoa(p->ip),p->port));
173 return False;
176 return True;
179 /***************************************************************************
180 Sets up the common elements of an outgoing NetBIOS packet.
182 Note: do not attempt to rationalise whether rec_des should be set or not
183 in a particular situation. Just follow rfc_1002 or look at examples from WinXX.
184 It does NOT follow the rule that requests to the wins server always have
185 rec_des true. See for example name releases and refreshes.
186 **************************************************************************/
188 static struct packet_struct *create_and_init_netbios_packet(struct nmb_name *nmbname,
189 BOOL bcast, BOOL rec_des,
190 struct in_addr to_ip)
192 struct packet_struct *packet = NULL;
193 struct nmb_packet *nmb = NULL;
195 /* Allocate the packet_struct we will return. */
196 if((packet = (struct packet_struct *)malloc(sizeof(*packet))) == NULL)
198 DEBUG(0,("create_and_init_netbios_packet: malloc fail (1) for packet struct.\n"));
199 return NULL;
202 memset((char *)packet,'\0',sizeof(*packet));
204 nmb = &packet->packet.nmb;
206 nmb->header.name_trn_id = generate_name_trn_id();
207 nmb->header.response = False;
208 nmb->header.nm_flags.recursion_desired = rec_des;
209 nmb->header.nm_flags.recursion_available = False;
210 nmb->header.nm_flags.trunc = False;
211 nmb->header.nm_flags.authoritative = False;
212 nmb->header.nm_flags.bcast = bcast;
214 nmb->header.rcode = 0;
215 nmb->header.qdcount = 1;
216 nmb->header.ancount = 0;
217 nmb->header.nscount = 0;
219 nmb->question.question_name = *nmbname;
220 nmb->question.question_type = QUESTION_TYPE_NB_QUERY;
221 nmb->question.question_class = QUESTION_CLASS_IN;
223 packet->ip = to_ip;
224 packet->port = NMB_PORT;
225 packet->fd = ClientNMB;
226 packet->timestamp = time(NULL);
227 packet->packet_type = NMB_PACKET;
228 packet->locked = False;
230 return packet; /* Caller must free. */
233 /***************************************************************************
234 Sets up the common elements of register, refresh or release packet.
235 **************************************************************************/
237 static BOOL create_and_init_additional_record(struct packet_struct *packet,
238 uint16 nb_flags,
239 struct in_addr *register_ip)
241 struct nmb_packet *nmb = &packet->packet.nmb;
243 if((nmb->additional = (struct res_rec *)malloc(sizeof(struct res_rec))) == NULL)
245 DEBUG(0,("initiate_name_register_packet: malloc fail for additional record.\n"));
246 return False;
249 memset((char *)nmb->additional,'\0',sizeof(struct res_rec));
251 nmb->additional->rr_name = nmb->question.question_name;
252 nmb->additional->rr_type = RR_TYPE_NB;
253 nmb->additional->rr_class = RR_CLASS_IN;
255 /* See RFC 1002, sections 5.1.1.1, 5.1.1.2 and 5.1.1.3 */
256 if (nmb->header.nm_flags.bcast)
257 nmb->additional->ttl = PERMANENT_TTL;
258 else
259 nmb->additional->ttl = lp_max_ttl();
261 nmb->additional->rdlength = 6;
263 set_nb_flags(nmb->additional->rdata,nb_flags);
265 /* Set the address for the name we are registering. */
266 putip(&nmb->additional->rdata[2], register_ip);
268 /* Ensure that we send out the file descriptor to give us the
269 the specific source address we are registering as our
270 IP source address. */
272 packet->fd = find_subnet_fd_for_address( *register_ip );
274 return True;
277 /***************************************************************************
278 Sends out a name query.
279 **************************************************************************/
281 static BOOL initiate_name_query_packet( struct packet_struct *packet)
283 struct nmb_packet *nmb = NULL;
285 nmb = &packet->packet.nmb;
287 nmb->header.opcode = NMB_NAME_QUERY_OPCODE;
288 nmb->header.arcount = 0;
290 nmb->header.nm_flags.recursion_desired = True;
292 DEBUG(4,("initiate_name_query_packet: sending query for name %s (bcast=%s) to IP %s\n",
293 nmb_namestr(&nmb->question.question_name),
294 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
296 return send_netbios_packet( packet );
299 /***************************************************************************
300 Sends out a name query - from a WINS server.
301 **************************************************************************/
303 static BOOL initiate_name_query_packet_from_wins_server( struct packet_struct *packet)
305 struct nmb_packet *nmb = NULL;
307 nmb = &packet->packet.nmb;
309 nmb->header.opcode = NMB_NAME_QUERY_OPCODE;
310 nmb->header.arcount = 0;
312 nmb->header.nm_flags.recursion_desired = False;
314 DEBUG(4,("initiate_name_query_packet_from_wins_server: sending query for name %s (bcast=%s) to IP %s\n",
315 nmb_namestr(&nmb->question.question_name),
316 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
318 return send_netbios_packet( packet );
321 /***************************************************************************
322 Sends out a name register.
323 **************************************************************************/
325 static BOOL initiate_name_register_packet( struct packet_struct *packet,
326 uint16 nb_flags, struct in_addr *register_ip)
328 struct nmb_packet *nmb = &packet->packet.nmb;
330 nmb->header.opcode = NMB_NAME_REG_OPCODE;
331 nmb->header.arcount = 1;
333 nmb->header.nm_flags.recursion_desired = True;
335 if(create_and_init_additional_record(packet, nb_flags, register_ip) == False)
336 return False;
338 DEBUG(4,("initiate_name_register_packet: sending registration for name %s (bcast=%s) to IP %s\n",
339 nmb_namestr(&nmb->additional->rr_name),
340 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
342 return send_netbios_packet( packet );
345 /***************************************************************************
346 Sends out a multihomed name register.
347 **************************************************************************/
349 static BOOL initiate_multihomed_name_register_packet( struct packet_struct *packet,
350 uint16 nb_flags, struct in_addr *register_ip)
352 struct nmb_packet *nmb = &packet->packet.nmb;
353 fstring second_ip_buf;
355 fstrcpy(second_ip_buf, inet_ntoa(packet->ip));
357 nmb->header.opcode = NMB_NAME_MULTIHOMED_REG_OPCODE;
358 nmb->header.arcount = 1;
360 nmb->header.nm_flags.recursion_desired = True;
362 if(create_and_init_additional_record(packet, nb_flags, register_ip) == False)
363 return False;
365 DEBUG(4,("initiate_multihomed_name_register_packet: sending registration \
366 for name %s IP %s (bcast=%s) to IP %s\n",
367 nmb_namestr(&nmb->additional->rr_name), inet_ntoa(*register_ip),
368 BOOLSTR(nmb->header.nm_flags.bcast), second_ip_buf ));
370 return send_netbios_packet( packet );
373 /***************************************************************************
374 Sends out a name refresh.
375 **************************************************************************/
377 static BOOL initiate_name_refresh_packet( struct packet_struct *packet,
378 uint16 nb_flags, struct in_addr *refresh_ip)
380 struct nmb_packet *nmb = &packet->packet.nmb;
382 nmb->header.opcode = NMB_NAME_REFRESH_OPCODE_8;
383 nmb->header.arcount = 1;
385 nmb->header.nm_flags.recursion_desired = False;
387 if(create_and_init_additional_record(packet, nb_flags, refresh_ip) == False)
388 return False;
390 DEBUG(4,("initiate_name_refresh_packet: sending refresh for name %s (bcast=%s) to IP %s\n",
391 nmb_namestr(&nmb->additional->rr_name),
392 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
394 return send_netbios_packet( packet );
397 /***************************************************************************
398 Sends out a name release.
399 **************************************************************************/
401 static BOOL initiate_name_release_packet( struct packet_struct *packet,
402 uint16 nb_flags, struct in_addr *release_ip)
404 struct nmb_packet *nmb = &packet->packet.nmb;
406 nmb->header.opcode = NMB_NAME_RELEASE_OPCODE;
407 nmb->header.arcount = 1;
409 nmb->header.nm_flags.recursion_desired = False;
411 if(create_and_init_additional_record(packet, nb_flags, release_ip) == False)
412 return False;
414 DEBUG(4,("initiate_name_release_packet: sending release for name %s (bcast=%s) to IP %s\n",
415 nmb_namestr(&nmb->additional->rr_name),
416 BOOLSTR(nmb->header.nm_flags.bcast), inet_ntoa(packet->ip)));
418 return send_netbios_packet( packet );
421 /***************************************************************************
422 Sends out a node status.
423 **************************************************************************/
425 static BOOL initiate_node_status_packet( struct packet_struct *packet )
427 struct nmb_packet *nmb = &packet->packet.nmb;
429 nmb->header.opcode = NMB_NAME_QUERY_OPCODE;
430 nmb->header.arcount = 0;
432 nmb->header.nm_flags.recursion_desired = False;
434 nmb->question.question_type = QUESTION_TYPE_NB_STATUS;
436 DEBUG(4,("initiate_node_status_packet: sending node status request for name %s to IP %s\n",
437 nmb_namestr(&nmb->question.question_name),
438 inet_ntoa(packet->ip)));
440 return send_netbios_packet( packet );
443 /****************************************************************************
444 Simplification functions for queuing standard packets.
445 These should be the only publicly callable functions for sending
446 out packets.
447 ****************************************************************************/
449 /****************************************************************************
450 Assertion - we should never be sending nmbd packets on the remote
451 broadcast subnet.
452 ****************************************************************************/
454 static BOOL assert_check_subnet(struct subnet_record *subrec)
456 if( subrec == remote_broadcast_subnet)
458 DEBUG(0,("assert_check_subnet: Attempt to send packet on remote broadcast subnet. \
459 This is a bug.\n"));
460 return True;
462 return False;
465 /****************************************************************************
466 Queue a register name packet to the broadcast address of a subnet.
467 ****************************************************************************/
469 struct response_record *queue_register_name( struct subnet_record *subrec,
470 response_function resp_fn,
471 timeout_response_function timeout_fn,
472 register_name_success_function success_fn,
473 register_name_fail_function fail_fn,
474 struct userdata_struct *userdata,
475 struct nmb_name *nmbname,
476 uint16 nb_flags)
478 struct packet_struct *p;
479 struct response_record *rrec;
481 if(assert_check_subnet(subrec))
482 return NULL;
484 /* note that all name registration requests have RD set (rfc1002 -
485 section 4.2.2 */
486 if ((p = create_and_init_netbios_packet(nmbname, (subrec != unicast_subnet), True,
487 subrec->bcast_ip)) == NULL)
488 return NULL;
490 if(initiate_name_register_packet( p, nb_flags,
491 iface_ip(subrec->bcast_ip)) == False)
493 p->locked = False;
494 free_packet(p);
495 return NULL;
498 if((rrec = make_response_record(subrec, /* subnet record. */
499 p, /* packet we sent. */
500 resp_fn, /* function to call on response. */
501 timeout_fn, /* function to call on timeout. */
502 (success_function)success_fn, /* function to call on operation success. */
503 (fail_function)fail_fn, /* function to call on operation fail. */
504 userdata)) == NULL)
506 p->locked = False;
507 free_packet(p);
508 return NULL;
511 return rrec;
514 /****************************************************************************
515 Queue a multihomed register name packet to the broadcast address of a subnet.
516 ****************************************************************************/
518 struct response_record *queue_register_multihomed_name( struct subnet_record *subrec,
519 response_function resp_fn,
520 timeout_response_function timeout_fn,
521 register_name_success_function success_fn,
522 register_name_fail_function fail_fn,
523 struct userdata_struct *userdata,
524 struct nmb_name *nmbname,
525 uint16 nb_flags,
526 struct in_addr register_ip)
528 struct packet_struct *p;
529 struct response_record *rrec;
530 BOOL ret;
532 /* Sanity check. */
533 if(subrec != unicast_subnet)
535 DEBUG(0,("queue_register_multihomed_name: should only be done on \
536 unicast subnet. subnet is %s\n.", subrec->subnet_name ));
537 return NULL;
540 if(assert_check_subnet(subrec))
541 return NULL;
543 if(( p = create_and_init_netbios_packet(nmbname, False, True,
544 subrec->bcast_ip)) == NULL)
545 return NULL;
547 if (nb_flags & NB_GROUP)
548 ret = initiate_name_register_packet( p, nb_flags, &register_ip);
549 else
550 ret = initiate_multihomed_name_register_packet( p, nb_flags, &register_ip);
552 if(ret == False)
554 p->locked = False;
555 free_packet(p);
556 return NULL;
559 if((rrec = make_response_record(subrec, /* subnet record. */
560 p, /* packet we sent. */
561 resp_fn, /* function to call on response. */
562 timeout_fn, /* function to call on timeout. */
563 (success_function)success_fn, /* function to call on operation success. */
564 (fail_function)fail_fn, /* function to call on operation fail. */
565 userdata)) == NULL)
567 p->locked = False;
568 free_packet(p);
569 return NULL;
572 return rrec;
575 /****************************************************************************
576 Queue a release name packet to the broadcast address of a subnet.
577 ****************************************************************************/
579 struct response_record *queue_release_name( struct subnet_record *subrec,
580 response_function resp_fn,
581 timeout_response_function timeout_fn,
582 release_name_success_function success_fn,
583 release_name_fail_function fail_fn,
584 struct userdata_struct *userdata,
585 struct nmb_name *nmbname,
586 uint16 nb_flags,
587 struct in_addr release_ip)
589 struct packet_struct *p;
590 struct response_record *rrec;
592 if(assert_check_subnet(subrec))
593 return NULL;
595 if ((p = create_and_init_netbios_packet(nmbname, (subrec != unicast_subnet), False,
596 subrec->bcast_ip)) == NULL)
597 return NULL;
599 if(initiate_name_release_packet( p, nb_flags, &release_ip) == False)
601 p->locked = False;
602 free_packet(p);
603 return NULL;
606 if((rrec = make_response_record(subrec, /* subnet record. */
607 p, /* packet we sent. */
608 resp_fn, /* function to call on response. */
609 timeout_fn, /* function to call on timeout. */
610 (success_function)success_fn, /* function to call on operation success. */
611 (fail_function)fail_fn, /* function to call on operation fail. */
612 userdata)) == NULL)
614 p->locked = False;
615 free_packet(p);
616 return NULL;
620 * For a broadcast release packet, only send once.
621 * This will cause us to remove the name asap. JRA.
624 if (subrec != unicast_subnet) {
625 rrec->repeat_count = 0;
626 rrec->repeat_time = 0;
629 return rrec;
632 /****************************************************************************
633 Queue a refresh name packet to the broadcast address of a subnet.
634 ****************************************************************************/
636 struct response_record *queue_refresh_name( struct subnet_record *subrec,
637 response_function resp_fn,
638 timeout_response_function timeout_fn,
639 refresh_name_success_function success_fn,
640 refresh_name_fail_function fail_fn,
641 struct userdata_struct *userdata,
642 struct name_record *namerec,
643 struct in_addr refresh_ip)
645 struct packet_struct *p;
646 struct response_record *rrec;
648 if(assert_check_subnet(subrec))
649 return NULL;
651 if(( p = create_and_init_netbios_packet(&namerec->name, (subrec != unicast_subnet), False,
652 subrec->bcast_ip)) == NULL)
653 return NULL;
655 if( !initiate_name_refresh_packet( p, namerec->data.nb_flags, &refresh_ip ) )
657 p->locked = False;
658 free_packet(p);
659 return NULL;
662 if((rrec = make_response_record(subrec, /* subnet record. */
663 p, /* packet we sent. */
664 resp_fn, /* function to call on response. */
665 timeout_fn, /* function to call on timeout. */
666 (success_function)success_fn, /* function to call on operation success. */
667 (fail_function)fail_fn, /* function to call on operation fail. */
668 userdata)) == NULL)
670 p->locked = False;
671 free_packet(p);
672 return NULL;
675 return rrec;
678 /****************************************************************************
679 Queue a query name packet to the broadcast address of a subnet.
680 ****************************************************************************/
682 struct response_record *queue_query_name( struct subnet_record *subrec,
683 response_function resp_fn,
684 timeout_response_function timeout_fn,
685 query_name_success_function success_fn,
686 query_name_fail_function fail_fn,
687 struct userdata_struct *userdata,
688 struct nmb_name *nmbname)
690 struct packet_struct *p;
691 struct response_record *rrec;
693 if(assert_check_subnet(subrec))
694 return NULL;
696 if(( p = create_and_init_netbios_packet(nmbname,
697 (subrec != unicast_subnet),
698 (subrec == unicast_subnet),
699 subrec->bcast_ip)) == NULL)
700 return NULL;
702 if(initiate_name_query_packet( p ) == False)
704 p->locked = False;
705 free_packet(p);
706 return NULL;
709 if((rrec = make_response_record(subrec, /* subnet record. */
710 p, /* packet we sent. */
711 resp_fn, /* function to call on response. */
712 timeout_fn, /* function to call on timeout. */
713 (success_function)success_fn, /* function to call on operation success. */
714 (fail_function)fail_fn, /* function to call on operation fail. */
715 userdata)) == NULL)
717 p->locked = False;
718 free_packet(p);
719 return NULL;
722 return rrec;
725 /****************************************************************************
726 Queue a query name packet to a given address from the WINS subnet.
727 ****************************************************************************/
729 struct response_record *queue_query_name_from_wins_server( struct in_addr to_ip,
730 response_function resp_fn,
731 timeout_response_function timeout_fn,
732 query_name_success_function success_fn,
733 query_name_fail_function fail_fn,
734 struct userdata_struct *userdata,
735 struct nmb_name *nmbname)
737 struct packet_struct *p;
738 struct response_record *rrec;
740 if ((p = create_and_init_netbios_packet(nmbname, False, False, to_ip)) == NULL)
741 return NULL;
743 if(initiate_name_query_packet_from_wins_server( p ) == False)
745 p->locked = False;
746 free_packet(p);
747 return NULL;
750 if((rrec = make_response_record(wins_server_subnet, /* subnet record. */
751 p, /* packet we sent. */
752 resp_fn, /* function to call on response. */
753 timeout_fn, /* function to call on timeout. */
754 (success_function)success_fn, /* function to call on operation success. */
755 (fail_function)fail_fn, /* function to call on operation fail. */
756 userdata)) == NULL)
758 p->locked = False;
759 free_packet(p);
760 return NULL;
763 return rrec;
766 /****************************************************************************
767 Queue a node status packet to a given name and address.
768 ****************************************************************************/
770 struct response_record *queue_node_status( struct subnet_record *subrec,
771 response_function resp_fn,
772 timeout_response_function timeout_fn,
773 node_status_success_function success_fn,
774 node_status_fail_function fail_fn,
775 struct userdata_struct *userdata,
776 struct nmb_name *nmbname,
777 struct in_addr send_ip)
779 struct packet_struct *p;
780 struct response_record *rrec;
782 /* Sanity check. */
783 if(subrec != unicast_subnet)
785 DEBUG(0,("queue_register_multihomed_name: should only be done on \
786 unicast subnet. subnet is %s\n.", subrec->subnet_name ));
787 return NULL;
790 if(assert_check_subnet(subrec))
791 return NULL;
793 if(( p = create_and_init_netbios_packet(nmbname, False, False,
794 send_ip)) == NULL)
795 return NULL;
797 if(initiate_node_status_packet(p) == False)
799 p->locked = False;
800 free_packet(p);
801 return NULL;
804 if((rrec = make_response_record(subrec, /* subnet record. */
805 p, /* packet we sent. */
806 resp_fn, /* function to call on response. */
807 timeout_fn, /* function to call on timeout. */
808 (success_function)success_fn, /* function to call on operation success. */
809 (fail_function)fail_fn, /* function to call on operation fail. */
810 userdata)) == NULL)
812 p->locked = False;
813 free_packet(p);
814 return NULL;
817 return rrec;
820 /****************************************************************************
821 Reply to a netbios name packet. see rfc1002.txt
822 ****************************************************************************/
824 void reply_netbios_packet(struct packet_struct *orig_packet,
825 int rcode, enum netbios_reply_type_code rcv_code, int opcode,
826 int ttl, char *data,int len)
828 struct packet_struct packet;
829 struct nmb_packet *nmb = NULL;
830 struct res_rec answers;
831 struct nmb_packet *orig_nmb = &orig_packet->packet.nmb;
832 BOOL loopback_this_packet = False;
833 char *packet_type = "unknown";
835 /* Check if we are sending to or from ourselves. */
836 if(ismyip(orig_packet->ip) && (orig_packet->port == global_nmb_port))
837 loopback_this_packet = True;
839 nmb = &packet.packet.nmb;
841 /* Do a partial copy of the packet. We clear the locked flag and
842 the resource record pointers. */
843 packet = *orig_packet; /* Full structure copy. */
844 packet.locked = False;
845 nmb->answers = NULL;
846 nmb->nsrecs = NULL;
847 nmb->additional = NULL;
849 switch (rcv_code)
851 case NMB_STATUS:
853 packet_type = "nmb_status";
854 nmb->header.nm_flags.recursion_desired = False;
855 nmb->header.nm_flags.recursion_available = False;
856 break;
858 case NMB_QUERY:
860 packet_type = "nmb_query";
861 nmb->header.nm_flags.recursion_desired = True;
862 nmb->header.nm_flags.recursion_available = True;
863 break;
865 case NMB_REG:
866 case NMB_REG_REFRESH:
868 packet_type = "nmb_reg";
869 nmb->header.nm_flags.recursion_desired = True;
870 nmb->header.nm_flags.recursion_available = True;
871 break;
873 case NMB_REL:
875 packet_type = "nmb_rel";
876 nmb->header.nm_flags.recursion_desired = False;
877 nmb->header.nm_flags.recursion_available = False;
878 break;
880 case NMB_WAIT_ACK:
882 packet_type = "nmb_wack";
883 nmb->header.nm_flags.recursion_desired = False;
884 nmb->header.nm_flags.recursion_available = False;
885 break;
887 case WINS_REG:
889 packet_type = "wins_reg";
890 nmb->header.nm_flags.recursion_desired = True;
891 nmb->header.nm_flags.recursion_available = True;
892 break;
894 case WINS_QUERY:
896 packet_type = "wins_query";
897 nmb->header.nm_flags.recursion_desired = True;
898 nmb->header.nm_flags.recursion_available = True;
899 break;
902 default:
904 DEBUG(0,("reply_netbios_packet: Unknown packet type: %s %s to ip %s\n",
905 packet_type, nmb_namestr(&orig_nmb->question.question_name),
906 inet_ntoa(packet.ip)));
908 return;
912 DEBUG(4,("reply_netbios_packet: sending a reply of packet type: %s %s to ip %s \
913 for id %hu\n",
914 packet_type, nmb_namestr(&orig_nmb->question.question_name),
915 inet_ntoa(packet.ip), orig_nmb->header.name_trn_id));
917 nmb->header.name_trn_id = orig_nmb->header.name_trn_id;
918 nmb->header.opcode = opcode;
919 nmb->header.response = True;
920 nmb->header.nm_flags.bcast = False;
921 nmb->header.nm_flags.trunc = False;
922 nmb->header.nm_flags.authoritative = True;
924 nmb->header.rcode = rcode;
925 nmb->header.qdcount = 0;
926 nmb->header.ancount = 1;
927 nmb->header.nscount = 0;
928 nmb->header.arcount = 0;
930 memset((char*)&nmb->question,'\0',sizeof(nmb->question));
932 nmb->answers = &answers;
933 memset((char*)nmb->answers,'\0',sizeof(*nmb->answers));
935 nmb->answers->rr_name = orig_nmb->question.question_name;
936 nmb->answers->rr_type = orig_nmb->question.question_type;
937 nmb->answers->rr_class = orig_nmb->question.question_class;
938 nmb->answers->ttl = ttl;
940 if (data && len)
942 nmb->answers->rdlength = len;
943 memcpy(nmb->answers->rdata, data, len);
946 packet.packet_type = NMB_PACKET;
947 /* Ensure we send out on the same fd that the original
948 packet came in on to give the correct source IP address. */
949 packet.fd = orig_packet->fd;
950 packet.timestamp = time(NULL);
952 debug_nmb_packet(&packet);
954 if(loopback_this_packet)
956 struct packet_struct *lo_packet;
957 DEBUG(5,("reply_netbios_packet: sending packet to ourselves.\n"));
958 if((lo_packet = copy_packet(&packet)) == NULL)
959 return;
960 queue_packet(lo_packet);
962 else if (!send_packet(&packet))
964 DEBUG(0,("reply_netbios_packet: send_packet to IP %s port %d failed\n",
965 inet_ntoa(packet.ip),packet.port));
969 /*******************************************************************
970 Queue a packet into a packet queue
971 ******************************************************************/
972 static void queue_packet(struct packet_struct *packet)
974 struct packet_struct *p;
976 if (!packet_queue)
978 packet->prev = NULL;
979 packet->next = NULL;
980 packet_queue = packet;
981 return;
984 /* find the bottom */
985 for (p=packet_queue;p->next;p=p->next)
988 p->next = packet;
989 packet->next = NULL;
990 packet->prev = p;
993 /****************************************************************************
994 Try and find a matching subnet record for a datagram port 138 packet.
995 ****************************************************************************/
997 static struct subnet_record *find_subnet_for_dgram_browse_packet(struct packet_struct *p)
999 struct subnet_record *subrec;
1001 /* Go through all the broadcast subnets and see if the mask matches. */
1002 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1004 if(same_net(p->ip, subrec->bcast_ip, subrec->mask_ip))
1005 return subrec;
1008 /* If the subnet record is the remote announce broadcast subnet,
1009 hack it here to be the first subnet. This is really gross and
1010 is needed due to people turning on port 137/138 broadcast
1011 forwarding on their routers. May fire and brimstone rain
1012 down upon them...
1015 return FIRST_SUBNET;
1018 /****************************************************************************
1019 Dispatch a browse frame from port 138 to the correct processing function.
1020 ****************************************************************************/
1021 static void process_browse_packet(struct packet_struct *p, char *buf,int len)
1023 struct dgram_packet *dgram = &p->packet.dgram;
1024 int command = CVAL(buf,0);
1025 struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
1026 extern pstring global_scope;
1028 /* Drop the packet if it's a different NetBIOS scope, or
1029 the source is from one of our names. */
1031 if (!strequal(dgram->dest_name.scope, global_scope ))
1033 DEBUG(7,("process_browse_packet: Discarding datagram from IP %s. Scope (%s) \
1034 mismatch with our scope (%s).\n", inet_ntoa(p->ip), dgram->dest_name.scope, global_scope));
1035 return;
1038 if (is_myname(dgram->source_name.name))
1040 DEBUG(0,("process_browse_packet: Discarding datagram from IP %s. Source name \
1041 %s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
1042 return;
1045 switch (command)
1047 case ANN_HostAnnouncement:
1049 debug_browse_data(buf, len);
1050 process_host_announce(subrec, p, buf+1);
1051 break;
1053 case ANN_DomainAnnouncement:
1055 debug_browse_data(buf, len);
1056 process_workgroup_announce(subrec, p, buf+1);
1057 break;
1059 case ANN_LocalMasterAnnouncement:
1061 debug_browse_data(buf, len);
1062 process_local_master_announce(subrec, p, buf+1);
1063 break;
1065 case ANN_AnnouncementRequest:
1067 debug_browse_data(buf, len);
1068 process_announce_request(subrec, p, buf+1);
1069 break;
1071 case ANN_Election:
1073 debug_browse_data(buf, len);
1074 process_election(subrec, p, buf+1);
1075 break;
1077 case ANN_GetBackupListReq:
1079 debug_browse_data(buf, len);
1080 process_get_backup_list_request(subrec, p, buf+1);
1081 break;
1083 case ANN_GetBackupListResp:
1085 debug_browse_data(buf, len);
1086 /* We never send ANN_GetBackupListReq so we
1087 should never get these. */
1088 DEBUG(0,("process_browse_packet: Discarding GetBackupListResponse \
1089 packet from %s IP %s\n", nmb_namestr(&dgram->source_name), inet_ntoa(p->ip)));
1090 break;
1092 case ANN_ResetBrowserState:
1094 debug_browse_data(buf, len);
1095 process_reset_browser(subrec, p, buf+1);
1096 break;
1098 case ANN_MasterAnnouncement:
1100 /* Master browser datagrams must be processed
1101 on the unicast subnet. */
1102 subrec = unicast_subnet;
1104 debug_browse_data(buf, len);
1105 process_master_browser_announce(subrec, p, buf+1);
1106 break;
1108 case ANN_BecomeBackup:
1111 * We don't currently implement this. Log it just in case.
1113 debug_browse_data(buf, len);
1114 DEBUG(10,("process_browse_packet: On subnet %s ignoring browse packet \
1115 command ANN_BecomeBackup from %s IP %s to %s\n",
1116 subrec->subnet_name, nmb_namestr(&dgram->source_name),
1117 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1118 break;
1120 default:
1122 debug_browse_data(buf, len);
1123 DEBUG(0,("process_browse_packet: On subnet %s ignoring browse packet \
1124 command code %d from %s IP %s to %s\n",
1125 subrec->subnet_name, command, nmb_namestr(&dgram->source_name),
1126 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1131 /****************************************************************************
1132 Dispatch a LanMan browse frame from port 138 to the correct processing function.
1133 ****************************************************************************/
1134 static void process_lanman_packet(struct packet_struct *p, char *buf,int len)
1136 struct dgram_packet *dgram = &p->packet.dgram;
1137 int command = SVAL(buf,0);
1138 struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
1139 extern pstring global_scope;
1141 /* Drop the packet if it's a different NetBIOS scope, or
1142 the source is from one of our names. */
1144 if (!strequal(dgram->dest_name.scope, global_scope ))
1146 DEBUG(7,("process_lanman_packet: Discarding datagram from IP %s. Scope (%s) \
1147 mismatch with our scope (%s).\n", inet_ntoa(p->ip), dgram->dest_name.scope, global_scope));
1148 return;
1151 if (is_myname(dgram->source_name.name))
1153 DEBUG(0,("process_lanman_packet: Discarding datagram from IP %s. Source name \
1154 %s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
1155 return;
1158 switch (command)
1160 case ANN_HostAnnouncement:
1162 debug_browse_data(buf, len);
1163 process_lm_host_announce(subrec, p, buf+1);
1164 break;
1166 case ANN_AnnouncementRequest:
1168 process_lm_announce_request(subrec, p, buf+1);
1169 break;
1171 default:
1173 DEBUG(0,("process_lanman_packet: On subnet %s ignoring browse packet \
1174 command code %d from %s IP %s to %s\n",
1175 subrec->subnet_name, command, nmb_namestr(&dgram->source_name),
1176 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1181 /****************************************************************************
1182 Determine if a packet is for us on port 138. Note that to have any chance of
1183 being efficient we need to drop as many packets as possible at this
1184 stage as subsequent processing is expensive.
1185 ****************************************************************************/
1187 static BOOL listening(struct packet_struct *p,struct nmb_name *nbname)
1189 struct subnet_record *subrec = NULL;
1191 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1193 if(same_net(p->ip, subrec->bcast_ip, subrec->mask_ip))
1194 break;
1197 if(subrec == NULL)
1198 subrec = unicast_subnet;
1200 return (find_name_on_subnet(subrec, nbname, FIND_SELF_NAME) != NULL);
1203 /****************************************************************************
1204 Process udp 138 datagrams
1205 ****************************************************************************/
1206 static void process_dgram(struct packet_struct *p)
1208 char *buf;
1209 char *buf2;
1210 int len;
1211 struct dgram_packet *dgram = &p->packet.dgram;
1213 /* If we aren't listening to the destination name then ignore the packet */
1214 if (!listening(p,&dgram->dest_name))
1216 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from %s\n",
1217 nmb_namestr(&dgram->dest_name), inet_ntoa(p->ip)));
1218 return;
1221 if (dgram->header.msg_type != 0x10 &&
1222 dgram->header.msg_type != 0x11 &&
1223 dgram->header.msg_type != 0x12)
1225 /* Don't process error packets etc yet */
1226 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from IP %s as it is \
1227 an error packet of type %x\n",
1228 nmb_namestr(&dgram->dest_name), inet_ntoa(p->ip), dgram->header.msg_type));
1229 return;
1232 buf = &dgram->data[0];
1233 buf -= 4; /* XXXX for the pseudo tcp length -
1234 someday I need to get rid of this */
1236 if (CVAL(buf,smb_com) != SMBtrans)
1237 return;
1239 len = SVAL(buf,smb_vwv11);
1240 buf2 = smb_base(buf) + SVAL(buf,smb_vwv12);
1242 DEBUG(4,("process_dgram: datagram from %s to %s IP %s for %s of type %d len=%d\n",
1243 nmb_namestr(&dgram->source_name),nmb_namestr(&dgram->dest_name),
1244 inet_ntoa(p->ip), smb_buf(buf),CVAL(buf2,0),len));
1247 if (len <= 0)
1248 return;
1250 /* Datagram packet received for the browser mailslot */
1251 if (strequal(smb_buf(buf),BROWSE_MAILSLOT))
1253 process_browse_packet(p,buf2,len);
1254 return;
1257 /* Datagram packet received for the LAN Manager mailslot */
1258 if (strequal(smb_buf(buf),LANMAN_MAILSLOT)) {
1259 process_lanman_packet(p,buf2,len);
1260 return;
1263 /* Datagram packet received for the domain logon mailslot */
1264 if (strequal(smb_buf(buf),NET_LOGON_MAILSLOT))
1266 process_logon_packet(p,buf2,len,NET_LOGON_MAILSLOT);
1267 return;
1270 /* Datagram packet received for the NT domain logon mailslot */
1271 if (strequal(smb_buf(buf),NT_LOGON_MAILSLOT))
1273 process_logon_packet(p,buf2,len,NT_LOGON_MAILSLOT);
1274 return;
1278 /****************************************************************************
1279 Validate a response nmb packet.
1280 ****************************************************************************/
1282 static BOOL validate_nmb_response_packet( struct nmb_packet *nmb )
1284 BOOL ignore = False;
1286 switch (nmb->header.opcode)
1288 case NMB_NAME_REG_OPCODE:
1289 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1290 case NMB_NAME_REFRESH_OPCODE_9: /* WinNT uses 8 by default. */
1291 if (nmb->header.ancount == 0)
1293 DEBUG(0,("validate_nmb_response_packet: Bad REG/REFRESH Packet. "));
1294 ignore = True;
1296 break;
1298 case NMB_NAME_QUERY_OPCODE:
1299 if ((nmb->header.ancount != 0) && (nmb->header.ancount != 1))
1301 DEBUG(0,("validate_nmb_response_packet: Bad QUERY Packet. "));
1302 ignore = True;
1304 break;
1305 case NMB_NAME_RELEASE_OPCODE:
1306 if (nmb->header.ancount == 0)
1308 DEBUG(0,("validate_nmb_response_packet: Bad RELEASE Packet. "));
1309 ignore = True;
1311 break;
1312 case NMB_WACK_OPCODE:
1313 /* Check WACK response here. */
1314 if (nmb->header.ancount != 1)
1316 DEBUG(0,("validate_nmb_response_packet: Bad WACK Packet. "));
1317 ignore = True;
1319 break;
1320 default:
1321 DEBUG(0,("validate_nmb_response_packet: Ignoring packet with unknown opcode %d.\n",
1322 nmb->header.opcode));
1323 return True;
1326 if(ignore)
1327 DEBUG(0,("Ignoring response packet with opcode %d.\n", nmb->header.opcode));
1329 return ignore;
1332 /****************************************************************************
1333 Validate a request nmb packet.
1334 ****************************************************************************/
1336 static BOOL validate_nmb_packet( struct nmb_packet *nmb )
1338 BOOL ignore = False;
1340 switch (nmb->header.opcode)
1342 case NMB_NAME_REG_OPCODE:
1343 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1344 case NMB_NAME_REFRESH_OPCODE_9: /* WinNT uses 8 by default. */
1345 case NMB_NAME_MULTIHOMED_REG_OPCODE:
1346 if (nmb->header.qdcount==0 || nmb->header.arcount==0)
1348 DEBUG(0,("validate_nmb_packet: Bad REG/REFRESH Packet. "));
1349 ignore = True;
1351 break;
1353 case NMB_NAME_QUERY_OPCODE:
1354 if ((nmb->header.qdcount == 0) ||
1355 ((nmb->question.question_type != QUESTION_TYPE_NB_QUERY) &&
1356 (nmb->question.question_type != QUESTION_TYPE_NB_STATUS)))
1358 DEBUG(0,("validate_nmb_packet: Bad QUERY Packet. "));
1359 ignore = True;
1361 break;
1363 case NMB_NAME_RELEASE_OPCODE:
1364 if (nmb->header.qdcount==0 || nmb->header.arcount==0)
1366 DEBUG(0,("validate_nmb_packet: Bad RELEASE Packet. "));
1367 ignore = True;
1369 break;
1370 default:
1371 DEBUG(0,("validate_nmb_packet: Ignoring packet with unknown opcode %d.\n",
1372 nmb->header.opcode));
1373 return True;
1376 if(ignore)
1377 DEBUG(0,("validate_nmb_packet: Ignoring request packet with opcode %d.\n", nmb->header.opcode));
1379 return ignore;
1382 /****************************************************************************
1383 Find a subnet (and potentially a response record) for a packet.
1384 ****************************************************************************/
1386 static struct subnet_record *find_subnet_for_nmb_packet( struct packet_struct *p,
1387 struct response_record **pprrec)
1389 struct nmb_packet *nmb = &p->packet.nmb;
1390 struct response_record *rrec = NULL;
1391 struct subnet_record *subrec = NULL;
1393 if(pprrec != NULL)
1394 *pprrec = NULL;
1396 if(nmb->header.response)
1398 /* It's a response packet. Find a record for it or it's an error. */
1400 rrec = find_response_record( &subrec, nmb->header.name_trn_id);
1401 if(rrec == NULL)
1403 DEBUG(3,("find_subnet_for_nmb_packet: response record not found for response id %hu\n",
1404 nmb->header.name_trn_id));
1405 return NULL;
1408 if(subrec == NULL)
1410 DEBUG(0,("find_subnet_for_nmb_packet: subnet record not found for response id %hu\n",
1411 nmb->header.name_trn_id));
1412 return NULL;
1415 if(pprrec != NULL)
1416 *pprrec = rrec;
1417 return subrec;
1420 /* Try and see what subnet this packet belongs to. */
1422 /* WINS server ? */
1423 if(packet_is_for_wins_server(p))
1424 return wins_server_subnet;
1426 /* If it wasn't a broadcast packet then send to the UNICAST subnet. */
1427 if(nmb->header.nm_flags.bcast == False)
1428 return unicast_subnet;
1430 /* Go through all the broadcast subnets and see if the mask matches. */
1431 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1433 if(same_net(p->ip, subrec->bcast_ip, subrec->mask_ip))
1434 return subrec;
1437 /* If none match it must have been a directed broadcast - assign
1438 the remote_broadcast_subnet. */
1439 return remote_broadcast_subnet;
1442 /****************************************************************************
1443 Process a nmb request packet - validate the packet and route it.
1444 ****************************************************************************/
1446 static void process_nmb_request(struct packet_struct *p)
1448 struct nmb_packet *nmb = &p->packet.nmb;
1449 struct subnet_record *subrec = NULL;
1451 debug_nmb_packet(p);
1453 /* Ensure we have a good packet. */
1454 if(validate_nmb_packet(nmb))
1455 return;
1457 /* Allocate a subnet to this packet - if we cannot - fail. */
1458 if((subrec = find_subnet_for_nmb_packet(p, NULL))==NULL)
1459 return;
1461 switch (nmb->header.opcode)
1463 case NMB_NAME_REG_OPCODE:
1464 if(subrec == wins_server_subnet)
1465 wins_process_name_registration_request(subrec, p);
1466 else
1467 process_name_registration_request(subrec, p);
1468 break;
1470 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1471 case NMB_NAME_REFRESH_OPCODE_9:
1472 if(subrec == wins_server_subnet)
1473 wins_process_name_refresh_request(subrec, p);
1474 else
1475 process_name_refresh_request(subrec, p);
1476 break;
1478 case NMB_NAME_MULTIHOMED_REG_OPCODE:
1479 if(subrec == wins_server_subnet)
1480 wins_process_multihomed_name_registration_request(subrec, p);
1481 else
1483 DEBUG(0,("process_nmb_request: Multihomed registration request must be \
1484 directed at a WINS server.\n"));
1486 break;
1488 case NMB_NAME_QUERY_OPCODE:
1489 switch (nmb->question.question_type)
1491 case QUESTION_TYPE_NB_QUERY:
1493 if(subrec == wins_server_subnet)
1494 wins_process_name_query_request(subrec, p);
1495 else
1496 process_name_query_request(subrec, p);
1497 break;
1499 case QUESTION_TYPE_NB_STATUS:
1501 if(subrec == wins_server_subnet)
1503 DEBUG(0,("process_nmb_request: NB_STATUS request directed at WINS server is \
1504 not allowed.\n"));
1505 break;
1507 else
1508 process_node_status_request(subrec, p);
1509 break;
1512 break;
1514 case NMB_NAME_RELEASE_OPCODE:
1515 if(subrec == wins_server_subnet)
1516 wins_process_name_release_request(subrec, p);
1517 else
1518 process_name_release_request(subrec, p);
1519 break;
1523 /****************************************************************************
1524 Process a nmb response packet - validate the packet and route it.
1525 to either the WINS server or a normal response.
1526 ****************************************************************************/
1528 static void process_nmb_response(struct packet_struct *p)
1530 struct nmb_packet *nmb = &p->packet.nmb;
1531 struct subnet_record *subrec = NULL;
1532 struct response_record *rrec = NULL;
1534 debug_nmb_packet(p);
1536 if(validate_nmb_response_packet(nmb))
1537 return;
1539 if((subrec = find_subnet_for_nmb_packet(p, &rrec))==NULL)
1540 return;
1542 if(rrec == NULL)
1544 DEBUG(0,("process_nmb_response: response packet received but no response record \
1545 found for id = %hu. Ignoring packet.\n", nmb->header.name_trn_id));
1546 return;
1549 /* Increment the number of responses received for this record. */
1550 rrec->num_msgs++;
1551 /* Ensure we don't re-send the request. */
1552 rrec->repeat_count = 0;
1554 /* Call the response received function for this packet. */
1555 (*rrec->resp_fn)(subrec, rrec, p);
1559 /*******************************************************************
1560 Run elements off the packet queue till its empty
1561 ******************************************************************/
1563 void run_packet_queue(void)
1565 struct packet_struct *p;
1567 while ((p = packet_queue))
1569 packet_queue = p->next;
1570 if (packet_queue)
1571 packet_queue->prev = NULL;
1572 p->next = p->prev = NULL;
1574 switch (p->packet_type)
1576 case NMB_PACKET:
1577 if(p->packet.nmb.header.response)
1578 process_nmb_response(p);
1579 else
1580 process_nmb_request(p);
1581 break;
1583 case DGRAM_PACKET:
1584 process_dgram(p);
1585 break;
1587 free_packet(p);
1591 /*******************************************************************
1592 Retransmit or timeout elements from all the outgoing subnet response
1593 record queues. NOTE that this code must also check the WINS server
1594 subnet for response records to timeout as the WINS server code
1595 can send requests to check if a client still owns a name.
1596 (Patch from Andrey Alekseyev <fetch@muffin.arcadia.spb.ru>).
1597 ******************************************************************/
1599 void retransmit_or_expire_response_records(time_t t)
1601 struct subnet_record *subrec;
1603 for (subrec = FIRST_SUBNET; subrec;
1604 subrec = get_next_subnet_maybe_unicast_or_wins_server(subrec))
1606 struct response_record *rrec, *nextrrec;
1608 for (rrec = subrec->responselist; rrec; rrec = nextrrec)
1610 nextrrec = rrec->next;
1612 if (rrec->repeat_time <= t)
1614 if (rrec->repeat_count > 0)
1616 /* Resend while we have a non-zero repeat_count. */
1617 if(!send_packet(rrec->packet))
1619 DEBUG(0,("retransmit_or_expire_response_records: Failed to resend packet id %hu \
1620 to IP %s on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip),
1621 subrec->subnet_name));
1623 rrec->repeat_time += rrec->repeat_interval;
1624 rrec->repeat_count--;
1626 else
1628 DEBUG(4,("retransmit_or_expire_response_records: timeout for packet id %hu to IP %s \
1629 on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip),
1630 subrec->subnet_name));
1633 * Check the flag in this record to prevent recursion if we end
1634 * up in this function again via the timeout function call.
1637 if(!rrec->in_expiration_processing)
1641 * Set the recursion protection flag in this record.
1644 rrec->in_expiration_processing = True;
1646 /* Call the timeout function. This will deal with removing the
1647 timed out packet. */
1648 if(rrec->timeout_fn)
1649 (*rrec->timeout_fn)(subrec, rrec);
1650 else
1652 /* We must remove the record ourself if there is
1653 no timeout function. */
1654 remove_response_record(subrec, rrec);
1656 } /* !rrec->in_expitation_processing */
1657 } /* rrec->repeat_count > 0 */
1658 } /* rrec->repeat_time <= t */
1659 } /* end for rrec */
1660 } /* end for subnet */
1663 /****************************************************************************
1664 Create an fd_set containing all the sockets in the subnet structures,
1665 plus the broadcast sockets.
1666 ***************************************************************************/
1668 static BOOL create_listen_fdset(fd_set **ppset, int **psock_array, int *listen_number)
1670 int *sock_array = NULL;
1671 struct subnet_record *subrec = NULL;
1672 int count = 0;
1673 int num = 0;
1674 fd_set *pset = (fd_set *)malloc(sizeof(fd_set));
1676 if(pset == NULL)
1678 DEBUG(0,("create_listen_fdset: malloc fail !\n"));
1679 return True;
1682 /* Check that we can add all the fd's we need. */
1683 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1684 count++;
1686 if((count*2) + 2 > FD_SETSIZE)
1688 DEBUG(0,("create_listen_fdset: Too many file descriptors needed (%d). We can \
1689 only use %d.\n", (count*2) + 2, FD_SETSIZE));
1690 return True;
1693 if((sock_array = (int *)malloc(((count*2) + 2)*sizeof(int))) == NULL)
1695 DEBUG(0,("create_listen_fdset: malloc fail for socket array.\n"));
1696 return True;
1699 FD_ZERO(pset);
1701 /* Add in the broadcast socket on 137. */
1702 FD_SET(ClientNMB,pset);
1703 sock_array[num++] = ClientNMB;
1705 /* Add in the 137 sockets on all the interfaces. */
1706 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1708 FD_SET(subrec->nmb_sock,pset);
1709 sock_array[num++] = subrec->nmb_sock;
1712 /* Add in the broadcast socket on 138. */
1713 FD_SET(ClientDGRAM,pset);
1714 sock_array[num++] = ClientDGRAM;
1716 /* Add in the 138 sockets on all the interfaces. */
1717 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1719 FD_SET(subrec->dgram_sock,pset);
1720 sock_array[num++] = subrec->dgram_sock;
1723 *listen_number = (count*2) + 2;
1725 if (*ppset) free(*ppset);
1726 if (*psock_array) free(*psock_array);
1728 *ppset = pset;
1729 *psock_array = sock_array;
1731 return False;
1734 /****************************************************************************
1735 Listens for NMB or DGRAM packets, and queues them.
1736 ***************************************************************************/
1738 BOOL listen_for_packets(BOOL run_election)
1740 static fd_set *listen_set = NULL;
1741 static int listen_number = 0;
1742 static int *sock_array = NULL;
1744 fd_set fds;
1745 int selrtn;
1746 struct timeval timeout;
1747 #ifndef SYNC_DNS
1748 int dns_fd;
1749 #endif
1751 if(listen_set == NULL || rescan_listen_set)
1753 if(create_listen_fdset(&listen_set, &sock_array, &listen_number))
1755 DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n"));
1756 return True;
1758 rescan_listen_set = False;
1761 memcpy((char *)&fds, (char *)listen_set, sizeof(fd_set));
1763 #ifndef SYNC_DNS
1764 dns_fd = asyncdns_fd();
1765 if (dns_fd != -1) {
1766 FD_SET(dns_fd, &fds);
1768 #endif
1772 * During elections and when expecting a netbios response packet we
1773 * need to send election packets at tighter intervals.
1774 * Ideally it needs to be the interval (in ms) between time now and
1775 * the time we are expecting the next netbios packet.
1778 timeout.tv_sec = (run_election||num_response_packets) ? 1 : NMBD_SELECT_LOOP;
1779 timeout.tv_usec = 0;
1781 /* Prepare for the select - allow certain signals. */
1783 BlockSignals(False, SIGTERM);
1784 #if defined(SIGUSR1)
1785 BlockSignals(False, SIGUSR1);
1786 #endif /* SIGUSR1 */
1787 #if defined(SIGUSR2)
1788 BlockSignals(False, SIGUSR2);
1789 #endif /* SIGUSR2 */
1791 selrtn = sys_select(FD_SETSIZE,&fds,&timeout);
1793 /* We can only take signals when we are in the select - block them again here. */
1795 BlockSignals(True, SIGTERM);
1796 #if defined(SIGUSR1)
1797 BlockSignals(True, SIGUSR1);
1798 #endif /* SIGUSR1 */
1799 #if defined(SIGUSR2)
1800 BlockSignals(True, SIGUSR2);
1801 #endif /* SIGUSR2 */
1803 if(selrtn > 0)
1805 int i;
1807 #ifndef SYNC_DNS
1808 if (dns_fd != -1 && FD_ISSET(dns_fd,&fds)) {
1809 run_dns_queue();
1811 #endif
1813 for(i = 0; i < listen_number; i++)
1815 if(i < (listen_number/2))
1817 /* Processing a 137 socket. */
1818 if (FD_ISSET(sock_array[i],&fds))
1820 struct packet_struct *packet = read_packet(sock_array[i], NMB_PACKET);
1821 if (packet)
1824 * If we got a packet on the broadcast socket and interfaces
1825 * only is set then check it came from one of our local nets.
1827 if(lp_bind_interfaces_only() && (sock_array[i] == ClientNMB) &&
1828 (!is_local_net(packet->ip)))
1830 DEBUG(7,("discarding nmb packet sent to broadcast socket from %s:%d\n",
1831 inet_ntoa(packet->ip),packet->port));
1832 free_packet(packet);
1834 else if ((ip_equal(loopback_ip, packet->ip) ||
1835 ismyip(packet->ip)) && packet->port == global_nmb_port)
1837 DEBUG(7,("discarding own packet from %s:%d\n",
1838 inet_ntoa(packet->ip),packet->port));
1839 free_packet(packet);
1841 else
1843 /* Save the file descriptor this packet came in on. */
1844 packet->fd = sock_array[i];
1845 queue_packet(packet);
1850 else
1852 /* Processing a 138 socket. */
1854 if (FD_ISSET(sock_array[i],&fds))
1856 struct packet_struct *packet = read_packet(sock_array[i], DGRAM_PACKET);
1857 if (packet)
1860 * If we got a packet on the broadcast socket and interfaces
1861 * only is set then check it came from one of our local nets.
1863 if(lp_bind_interfaces_only() && (sock_array[i] == ClientDGRAM) &&
1864 (!is_local_net(packet->ip)))
1866 DEBUG(7,("discarding dgram packet sent to broadcast socket from %s:%d\n",
1867 inet_ntoa(packet->ip),packet->port));
1868 free_packet(packet);
1870 else if ((ip_equal(loopback_ip, packet->ip) ||
1871 ismyip(packet->ip)) && packet->port == DGRAM_PORT)
1873 DEBUG(7,("discarding own packet from %s:%d\n",
1874 inet_ntoa(packet->ip),packet->port));
1875 free_packet(packet);
1877 else
1879 /* Save the file descriptor this packet came in on. */
1880 packet->fd = sock_array[i];
1881 queue_packet(packet);
1885 } /* end processing 138 socket. */
1886 } /* end for */
1887 } /* end if selret > 0 */
1888 return False;
1891 /****************************************************************************
1892 Construct and send a netbios DGRAM.
1893 **************************************************************************/
1894 BOOL send_mailslot(BOOL unique, char *mailslot,char *buf,int len,
1895 char *srcname, int src_type,
1896 char *dstname, int dest_type,
1897 struct in_addr dest_ip,struct in_addr src_ip,
1898 int dest_port)
1900 BOOL loopback_this_packet = False;
1901 struct packet_struct p;
1902 struct dgram_packet *dgram = &p.packet.dgram;
1903 char *ptr,*p2;
1904 char tmp[4];
1906 memset((char *)&p,'\0',sizeof(p));
1908 if(ismyip(dest_ip))
1909 loopback_this_packet = True;
1911 generate_name_trn_id();
1913 /* DIRECT GROUP or UNIQUE datagram. */
1914 dgram->header.msg_type = unique ? 0x10 : 0x11;
1915 dgram->header.flags.node_type = M_NODE;
1916 dgram->header.flags.first = True;
1917 dgram->header.flags.more = False;
1918 dgram->header.dgm_id = name_trn_id;
1919 dgram->header.source_ip = src_ip;
1920 dgram->header.source_port = DGRAM_PORT;
1921 dgram->header.dgm_length = 0; /* Let build_dgram() handle this. */
1922 dgram->header.packet_offset = 0;
1924 make_nmb_name(&dgram->source_name,srcname,src_type);
1925 make_nmb_name(&dgram->dest_name,dstname,dest_type);
1927 ptr = &dgram->data[0];
1929 /* Setup the smb part. */
1930 ptr -= 4; /* XXX Ugliness because of handling of tcp SMB length. */
1931 memcpy(tmp,ptr,4);
1932 set_message(ptr,17,17 + len,True);
1933 memcpy(ptr,tmp,4);
1935 CVAL(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 pstrcpy(p2,mailslot);
1945 p2 = skip_string(p2,1);
1947 memcpy(p2,buf,len);
1948 p2 += len;
1950 dgram->datasize = PTR_DIFF(p2,ptr+4); /* +4 for tcp length. */
1952 p.ip = dest_ip;
1953 p.port = dest_port;
1954 p.fd = find_subnet_mailslot_fd_for_address( src_ip );
1955 p.timestamp = time(NULL);
1956 p.packet_type = DGRAM_PACKET;
1958 DEBUG(4,("send_mailslot: Sending to mailslot %s from %s IP %s ", mailslot,
1959 nmb_namestr(&dgram->source_name), inet_ntoa(src_ip)));
1960 DEBUG(4,("to %s IP %s\n", nmb_namestr(&dgram->dest_name), inet_ntoa(dest_ip)));
1962 debug_browse_data(buf, len);
1964 if(loopback_this_packet)
1966 struct packet_struct *lo_packet = NULL;
1967 DEBUG(5,("send_mailslot: sending packet to ourselves.\n"));
1968 if((lo_packet = copy_packet(&p)) == NULL)
1969 return False;
1970 queue_packet(lo_packet);
1971 return True;
1973 else
1974 return(send_packet(&p));