2 Unix SMB/Netbios implementation.
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.
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;
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;
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);
95 /***************************************************************************
96 Dumps out the browse packet data.
97 **************************************************************************/
99 static void debug_browse_data(char *outbuf, int len)
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)
116 DEBUGADD( 4, ( "%c", x ) );
119 DEBUGADD( 4, ( "%*s hex", 16-j, "" ) );
121 for (j = 0; j < 16; j++)
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)
143 name_trn_id = ((unsigned)time(NULL)%(unsigned)0x7FFF) + ((unsigned)getpid()%(unsigned)100);
145 name_trn_id = (name_trn_id+1) % (unsigned)0x7FFF;
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)
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));
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"));
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;
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,
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"));
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;
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 );
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)
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)
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)
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)
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
447 ****************************************************************************/
449 /****************************************************************************
450 Assertion - we should never be sending nmbd packets on the remote
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. \
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,
478 struct packet_struct *p;
479 struct response_record *rrec;
481 if(assert_check_subnet(subrec))
484 /* note that all name registration requests have RD set (rfc1002 -
486 if ((p = create_and_init_netbios_packet(nmbname, (subrec != unicast_subnet), True,
487 subrec->bcast_ip)) == NULL)
490 if(initiate_name_register_packet( p, nb_flags,
491 iface_ip(subrec->bcast_ip)) == False)
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. */
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,
526 struct in_addr register_ip)
528 struct packet_struct *p;
529 struct response_record *rrec;
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 ));
540 if(assert_check_subnet(subrec))
543 if(( p = create_and_init_netbios_packet(nmbname, False, True,
544 subrec->bcast_ip)) == NULL)
547 if (nb_flags & NB_GROUP)
548 ret = initiate_name_register_packet( p, nb_flags, ®ister_ip);
550 ret = initiate_multihomed_name_register_packet( p, nb_flags, ®ister_ip);
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. */
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,
587 struct in_addr release_ip)
589 struct packet_struct *p;
590 struct response_record *rrec;
592 if(assert_check_subnet(subrec))
595 if(( p = create_and_init_netbios_packet(nmbname, (subrec != unicast_subnet), False,
596 subrec->bcast_ip)) == NULL)
599 if(initiate_name_release_packet( p, nb_flags, &release_ip) == False)
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. */
620 * For a broadcast release packet, only send once.
621 * This will cause us to remove the name asap. JRA.
626 rrec->repeat_count = 0;
627 rrec->repeat_time = 0;
633 /****************************************************************************
634 Queue a refresh name packet to the broadcast address of a subnet.
635 ****************************************************************************/
637 struct response_record *queue_refresh_name( struct subnet_record *subrec,
638 response_function resp_fn,
639 timeout_response_function timeout_fn,
640 refresh_name_success_function success_fn,
641 refresh_name_fail_function fail_fn,
642 struct userdata_struct *userdata,
643 struct name_record *namerec,
644 struct in_addr refresh_ip)
646 struct packet_struct *p;
647 struct response_record *rrec;
649 if(assert_check_subnet(subrec))
652 if(( p = create_and_init_netbios_packet(&namerec->name, (subrec != unicast_subnet), False,
653 subrec->bcast_ip)) == NULL)
656 if( !initiate_name_refresh_packet( p, namerec->data.nb_flags, &refresh_ip ) )
663 if((rrec = make_response_record(subrec, /* subnet record. */
664 p, /* packet we sent. */
665 resp_fn, /* function to call on response. */
666 timeout_fn, /* function to call on timeout. */
667 (success_function)success_fn, /* function to call on operation success. */
668 (fail_function)fail_fn, /* function to call on operation fail. */
679 /****************************************************************************
680 Queue a query name packet to the broadcast address of a subnet.
681 ****************************************************************************/
683 struct response_record *queue_query_name( struct subnet_record *subrec,
684 response_function resp_fn,
685 timeout_response_function timeout_fn,
686 query_name_success_function success_fn,
687 query_name_fail_function fail_fn,
688 struct userdata_struct *userdata,
689 struct nmb_name *nmbname)
691 struct packet_struct *p;
692 struct response_record *rrec;
694 if(assert_check_subnet(subrec))
697 if(( p = create_and_init_netbios_packet(nmbname,
698 (subrec != unicast_subnet),
699 (subrec == unicast_subnet),
700 subrec->bcast_ip)) == NULL)
703 if(initiate_name_query_packet( p ) == False)
710 if((rrec = make_response_record(subrec, /* subnet record. */
711 p, /* packet we sent. */
712 resp_fn, /* function to call on response. */
713 timeout_fn, /* function to call on timeout. */
714 (success_function)success_fn, /* function to call on operation success. */
715 (fail_function)fail_fn, /* function to call on operation fail. */
726 /****************************************************************************
727 Queue a query name packet to a given address from the WINS subnet.
728 ****************************************************************************/
730 struct response_record *queue_query_name_from_wins_server( struct in_addr to_ip,
731 response_function resp_fn,
732 timeout_response_function timeout_fn,
733 query_name_success_function success_fn,
734 query_name_fail_function fail_fn,
735 struct userdata_struct *userdata,
736 struct nmb_name *nmbname)
738 struct packet_struct *p;
739 struct response_record *rrec;
741 if ((p = create_and_init_netbios_packet(nmbname, False, False, to_ip)) == NULL)
744 if(initiate_name_query_packet_from_wins_server( p ) == False)
751 if((rrec = make_response_record(wins_server_subnet, /* subnet record. */
752 p, /* packet we sent. */
753 resp_fn, /* function to call on response. */
754 timeout_fn, /* function to call on timeout. */
755 (success_function)success_fn, /* function to call on operation success. */
756 (fail_function)fail_fn, /* function to call on operation fail. */
767 /****************************************************************************
768 Queue a node status packet to a given name and address.
769 ****************************************************************************/
771 struct response_record *queue_node_status( struct subnet_record *subrec,
772 response_function resp_fn,
773 timeout_response_function timeout_fn,
774 node_status_success_function success_fn,
775 node_status_fail_function fail_fn,
776 struct userdata_struct *userdata,
777 struct nmb_name *nmbname,
778 struct in_addr send_ip)
780 struct packet_struct *p;
781 struct response_record *rrec;
784 if(subrec != unicast_subnet)
786 DEBUG(0,("queue_register_multihomed_name: should only be done on \
787 unicast subnet. subnet is %s\n.", subrec->subnet_name ));
791 if(assert_check_subnet(subrec))
794 if(( p = create_and_init_netbios_packet(nmbname, False, False,
798 if(initiate_node_status_packet(p) == False)
805 if((rrec = make_response_record(subrec, /* subnet record. */
806 p, /* packet we sent. */
807 resp_fn, /* function to call on response. */
808 timeout_fn, /* function to call on timeout. */
809 (success_function)success_fn, /* function to call on operation success. */
810 (fail_function)fail_fn, /* function to call on operation fail. */
821 /****************************************************************************
822 Reply to a netbios name packet. see rfc1002.txt
823 ****************************************************************************/
825 void reply_netbios_packet(struct packet_struct *orig_packet,
826 int rcode, enum netbios_reply_type_code rcv_code, int opcode,
827 int ttl, char *data,int len)
829 struct packet_struct packet;
830 struct nmb_packet *nmb = NULL;
831 struct res_rec answers;
832 struct nmb_packet *orig_nmb = &orig_packet->packet.nmb;
833 BOOL loopback_this_packet = False;
834 char *packet_type = "unknown";
836 /* Check if we are sending to or from ourselves. */
837 if(ismyip(orig_packet->ip) && (orig_packet->port == global_nmb_port))
838 loopback_this_packet = True;
840 nmb = &packet.packet.nmb;
842 /* Do a partial copy of the packet. We clear the locked flag and
843 the resource record pointers. */
844 packet = *orig_packet; /* Full structure copy. */
845 packet.locked = False;
848 nmb->additional = NULL;
854 packet_type = "nmb_status";
855 nmb->header.nm_flags.recursion_desired = False;
856 nmb->header.nm_flags.recursion_available = False;
861 packet_type = "nmb_query";
862 nmb->header.nm_flags.recursion_desired = True;
863 nmb->header.nm_flags.recursion_available = True;
867 case NMB_REG_REFRESH:
869 packet_type = "nmb_reg";
870 nmb->header.nm_flags.recursion_desired = True;
871 nmb->header.nm_flags.recursion_available = True;
876 packet_type = "nmb_rel";
877 nmb->header.nm_flags.recursion_desired = False;
878 nmb->header.nm_flags.recursion_available = False;
883 packet_type = "nmb_wack";
884 nmb->header.nm_flags.recursion_desired = False;
885 nmb->header.nm_flags.recursion_available = False;
890 packet_type = "wins_reg";
891 nmb->header.nm_flags.recursion_desired = True;
892 nmb->header.nm_flags.recursion_available = True;
897 packet_type = "wins_query";
898 nmb->header.nm_flags.recursion_desired = True;
899 nmb->header.nm_flags.recursion_available = True;
905 DEBUG(0,("reply_netbios_packet: Unknown packet type: %s %s to ip %s\n",
906 packet_type, nmb_namestr(&orig_nmb->question.question_name),
907 inet_ntoa(packet.ip)));
913 DEBUG(4,("reply_netbios_packet: sending a reply of packet type: %s %s to ip %s \
915 packet_type, nmb_namestr(&orig_nmb->question.question_name),
916 inet_ntoa(packet.ip), orig_nmb->header.name_trn_id));
918 nmb->header.name_trn_id = orig_nmb->header.name_trn_id;
919 nmb->header.opcode = opcode;
920 nmb->header.response = True;
921 nmb->header.nm_flags.bcast = False;
922 nmb->header.nm_flags.trunc = False;
923 nmb->header.nm_flags.authoritative = True;
925 nmb->header.rcode = rcode;
926 nmb->header.qdcount = 0;
927 nmb->header.ancount = 1;
928 nmb->header.nscount = 0;
929 nmb->header.arcount = 0;
931 memset((char*)&nmb->question,'\0',sizeof(nmb->question));
933 nmb->answers = &answers;
934 memset((char*)nmb->answers,'\0',sizeof(*nmb->answers));
936 nmb->answers->rr_name = orig_nmb->question.question_name;
937 nmb->answers->rr_type = orig_nmb->question.question_type;
938 nmb->answers->rr_class = orig_nmb->question.question_class;
939 nmb->answers->ttl = ttl;
943 nmb->answers->rdlength = len;
944 memcpy(nmb->answers->rdata, data, len);
947 packet.packet_type = NMB_PACKET;
948 /* Ensure we send out on the same fd that the original
949 packet came in on to give the correct source IP address. */
950 packet.fd = orig_packet->fd;
951 packet.timestamp = time(NULL);
953 debug_nmb_packet(&packet);
955 if(loopback_this_packet)
957 struct packet_struct *lo_packet;
958 DEBUG(5,("reply_netbios_packet: sending packet to ourselves.\n"));
959 if((lo_packet = copy_packet(&packet)) == NULL)
961 queue_packet(lo_packet);
963 else if (!send_packet(&packet))
965 DEBUG(0,("reply_netbios_packet: send_packet to IP %s port %d failed\n",
966 inet_ntoa(packet.ip),packet.port));
970 /*******************************************************************
971 Queue a packet into a packet queue
972 ******************************************************************/
973 static void queue_packet(struct packet_struct *packet)
975 struct packet_struct *p;
981 packet_queue = packet;
985 /* find the bottom */
986 for (p=packet_queue;p->next;p=p->next)
994 /****************************************************************************
995 Try and find a matching subnet record for a datagram port 138 packet.
996 ****************************************************************************/
998 static struct subnet_record *find_subnet_for_dgram_browse_packet(struct packet_struct *p)
1000 struct subnet_record *subrec;
1002 /* Go through all the broadcast subnets and see if the mask matches. */
1003 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1005 if(same_net(p->ip, subrec->bcast_ip, subrec->mask_ip))
1009 /* If the subnet record is the remote announce broadcast subnet,
1010 hack it here to be the first subnet. This is really gross and
1011 is needed due to people turning on port 137/138 broadcast
1012 forwarding on their routers. May fire and brimstone rain
1016 return FIRST_SUBNET;
1019 /****************************************************************************
1020 Dispatch a browse frame from port 138 to the correct processing function.
1021 ****************************************************************************/
1022 static void process_browse_packet(struct packet_struct *p, char *buf,int len)
1024 struct dgram_packet *dgram = &p->packet.dgram;
1025 int command = CVAL(buf,0);
1026 struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
1027 extern pstring global_scope;
1029 /* Drop the packet if it's a different NetBIOS scope, or
1030 the source is from one of our names. */
1032 if (!strequal(dgram->dest_name.scope, global_scope))
1034 DEBUG(7,("process_browse_packet: Discarding datagram from IP %s. Scope (%s) \
1035 mismatch with our scope (%s).\n", inet_ntoa(p->ip), dgram->dest_name.scope, global_scope));
1039 if (is_myname(dgram->source_name.name))
1041 DEBUG(0,("process_browse_packet: Discarding datagram from IP %s. Source name \
1042 %s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
1048 case ANN_HostAnnouncement:
1050 debug_browse_data(buf, len);
1051 process_host_announce(subrec, p, buf+1);
1054 case ANN_DomainAnnouncement:
1056 debug_browse_data(buf, len);
1057 process_workgroup_announce(subrec, p, buf+1);
1060 case ANN_LocalMasterAnnouncement:
1062 debug_browse_data(buf, len);
1063 process_local_master_announce(subrec, p, buf+1);
1066 case ANN_AnnouncementRequest:
1068 debug_browse_data(buf, len);
1069 process_announce_request(subrec, p, buf+1);
1074 debug_browse_data(buf, len);
1075 process_election(subrec, p, buf+1);
1078 case ANN_GetBackupListReq:
1080 debug_browse_data(buf, len);
1081 process_get_backup_list_request(subrec, p, buf+1);
1084 case ANN_GetBackupListResp:
1086 debug_browse_data(buf, len);
1087 /* We never send ANN_GetBackupListReq so we
1088 should never get these. */
1089 DEBUG(0,("process_browse_packet: Discarding GetBackupListResponse \
1090 packet from %s IP %s\n", nmb_namestr(&dgram->source_name), inet_ntoa(p->ip)));
1093 case ANN_ResetBrowserState:
1095 debug_browse_data(buf, len);
1096 process_reset_browser(subrec, p, buf+1);
1099 case ANN_MasterAnnouncement:
1101 /* Master browser datagrams must be processed
1102 on the unicast subnet. */
1103 subrec = unicast_subnet;
1105 debug_browse_data(buf, len);
1106 process_master_browser_announce(subrec, p, buf+1);
1109 case ANN_BecomeBackup:
1112 * We don't currently implement this. Log it just in case.
1114 debug_browse_data(buf, len);
1115 DEBUG(10,("process_browse_packet: On subnet %s ignoring browse packet \
1116 command ANN_BecomeBackup from %s IP %s to %s\n",
1117 subrec->subnet_name, nmb_namestr(&dgram->source_name),
1118 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1123 debug_browse_data(buf, len);
1124 DEBUG(0,("process_browse_packet: On subnet %s ignoring browse packet \
1125 command code %d from %s IP %s to %s\n",
1126 subrec->subnet_name, command, nmb_namestr(&dgram->source_name),
1127 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
1132 /****************************************************************************
1133 Dispatch a LanMan browse frame from port 138 to the correct processing function.
1134 ****************************************************************************/
1135 static void process_lanman_packet(struct packet_struct *p, char *buf,int len)
1137 struct dgram_packet *dgram = &p->packet.dgram;
1138 int command = SVAL(buf,0);
1139 struct subnet_record *subrec = find_subnet_for_dgram_browse_packet(p);
1140 extern pstring global_scope;
1142 /* Drop the packet if it's a different NetBIOS scope, or
1143 the source is from one of our names. */
1145 if (!strequal(dgram->dest_name.scope, global_scope))
1147 DEBUG(7,("process_lanman_packet: Discarding datagram from IP %s. Scope (%s) \
1148 mismatch with our scope (%s).\n", inet_ntoa(p->ip), dgram->dest_name.scope, global_scope));
1152 if (is_myname(dgram->source_name.name))
1154 DEBUG(0,("process_lanman_packet: Discarding datagram from IP %s. Source name \
1155 %s is one of our names !\n", inet_ntoa(p->ip), nmb_namestr(&dgram->source_name)));
1161 case ANN_HostAnnouncement:
1163 debug_browse_data(buf, len);
1164 process_lm_host_announce(subrec, p, buf+1);
1167 case ANN_AnnouncementRequest:
1169 process_lm_announce_request(subrec, p, buf+1);
1174 DEBUG(0,("process_lanman_packet: On subnet %s ignoring browse packet \
1175 command code %d from %s IP %s to %s\n",
1176 subrec->subnet_name, command, nmb_namestr(&dgram->source_name),
1177 inet_ntoa(p->ip), nmb_namestr(&dgram->dest_name)));
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 ****************************************************************************/
1188 static BOOL listening(struct packet_struct *p,struct nmb_name *nbname)
1190 struct subnet_record *subrec = NULL;
1192 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1194 if(same_net(p->ip, subrec->bcast_ip, subrec->mask_ip))
1199 subrec = unicast_subnet;
1201 return (find_name_on_subnet(subrec, nbname, FIND_SELF_NAME) != NULL);
1204 /****************************************************************************
1205 Process udp 138 datagrams
1206 ****************************************************************************/
1207 static void process_dgram(struct packet_struct *p)
1212 struct dgram_packet *dgram = &p->packet.dgram;
1214 /* If we aren't listening to the destination name then ignore the packet */
1215 if (!listening(p,&dgram->dest_name))
1217 unexpected_packet(p);
1218 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from %s\n",
1219 nmb_namestr(&dgram->dest_name), inet_ntoa(p->ip)));
1223 if (dgram->header.msg_type != 0x10 &&
1224 dgram->header.msg_type != 0x11 &&
1225 dgram->header.msg_type != 0x12)
1227 unexpected_packet(p);
1228 /* Don't process error packets etc yet */
1229 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from IP %s as it is \
1230 an error packet of type %x\n",
1231 nmb_namestr(&dgram->dest_name), inet_ntoa(p->ip), dgram->header.msg_type));
1235 buf = &dgram->data[0];
1236 buf -= 4; /* XXXX for the pseudo tcp length -
1237 someday I need to get rid of this */
1239 if (CVAL(buf,smb_com) != SMBtrans)
1242 len = SVAL(buf,smb_vwv11);
1243 buf2 = smb_base(buf) + SVAL(buf,smb_vwv12);
1245 DEBUG(4,("process_dgram: datagram from %s to %s IP %s for %s of type %d len=%d\n",
1246 nmb_namestr(&dgram->source_name),nmb_namestr(&dgram->dest_name),
1247 inet_ntoa(p->ip), smb_buf(buf),CVAL(buf2,0),len));
1253 /* Datagram packet received for the browser mailslot */
1254 if (strequal(smb_buf(buf),BROWSE_MAILSLOT))
1256 process_browse_packet(p,buf2,len);
1260 /* Datagram packet received for the LAN Manager mailslot */
1261 if (strequal(smb_buf(buf),LANMAN_MAILSLOT)) {
1262 process_lanman_packet(p,buf2,len);
1266 /* Datagram packet received for the domain logon mailslot */
1267 if (strequal(smb_buf(buf),NET_LOGON_MAILSLOT))
1269 process_logon_packet(p,buf2,len,NET_LOGON_MAILSLOT);
1273 /* Datagram packet received for the NT domain logon mailslot */
1274 if (strequal(smb_buf(buf),NT_LOGON_MAILSLOT))
1276 process_logon_packet(p,buf2,len,NT_LOGON_MAILSLOT);
1280 unexpected_packet(p);
1283 /****************************************************************************
1284 Validate a response nmb packet.
1285 ****************************************************************************/
1287 static BOOL validate_nmb_response_packet( struct nmb_packet *nmb )
1289 BOOL ignore = False;
1291 switch (nmb->header.opcode)
1293 case NMB_NAME_REG_OPCODE:
1294 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1295 case NMB_NAME_REFRESH_OPCODE_9: /* WinNT uses 8 by default. */
1296 if (nmb->header.ancount == 0)
1298 DEBUG(0,("validate_nmb_response_packet: Bad REG/REFRESH Packet. "));
1303 case NMB_NAME_QUERY_OPCODE:
1304 if ((nmb->header.ancount != 0) && (nmb->header.ancount != 1))
1306 DEBUG(0,("validate_nmb_response_packet: Bad QUERY Packet. "));
1310 case NMB_NAME_RELEASE_OPCODE:
1311 if (nmb->header.ancount == 0)
1313 DEBUG(0,("validate_nmb_response_packet: Bad RELEASE Packet. "));
1317 case NMB_WACK_OPCODE:
1318 /* Check WACK response here. */
1319 if (nmb->header.ancount != 1)
1321 DEBUG(0,("validate_nmb_response_packet: Bad WACK Packet. "));
1326 DEBUG(0,("validate_nmb_response_packet: Ignoring packet with unknown opcode %d.\n",
1327 nmb->header.opcode));
1332 DEBUG(0,("Ignoring response packet with opcode %d.\n", nmb->header.opcode));
1337 /****************************************************************************
1338 Validate a request nmb packet.
1339 ****************************************************************************/
1341 static BOOL validate_nmb_packet( struct nmb_packet *nmb )
1343 BOOL ignore = False;
1345 switch (nmb->header.opcode)
1347 case NMB_NAME_REG_OPCODE:
1348 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1349 case NMB_NAME_REFRESH_OPCODE_9: /* WinNT uses 8 by default. */
1350 case NMB_NAME_MULTIHOMED_REG_OPCODE:
1351 if (nmb->header.qdcount==0 || nmb->header.arcount==0)
1353 DEBUG(0,("validate_nmb_packet: Bad REG/REFRESH Packet. "));
1358 case NMB_NAME_QUERY_OPCODE:
1359 if ((nmb->header.qdcount == 0) ||
1360 ((nmb->question.question_type != QUESTION_TYPE_NB_QUERY) &&
1361 (nmb->question.question_type != QUESTION_TYPE_NB_STATUS)))
1363 DEBUG(0,("validate_nmb_packet: Bad QUERY Packet. "));
1368 case NMB_NAME_RELEASE_OPCODE:
1369 if (nmb->header.qdcount==0 || nmb->header.arcount==0)
1371 DEBUG(0,("validate_nmb_packet: Bad RELEASE Packet. "));
1376 DEBUG(0,("validate_nmb_packet: Ignoring packet with unknown opcode %d.\n",
1377 nmb->header.opcode));
1382 DEBUG(0,("validate_nmb_packet: Ignoring request packet with opcode %d.\n", nmb->header.opcode));
1387 /****************************************************************************
1388 Find a subnet (and potentially a response record) for a packet.
1389 ****************************************************************************/
1391 static struct subnet_record *find_subnet_for_nmb_packet( struct packet_struct *p,
1392 struct response_record **pprrec)
1394 struct nmb_packet *nmb = &p->packet.nmb;
1395 struct response_record *rrec = NULL;
1396 struct subnet_record *subrec = NULL;
1401 if(nmb->header.response)
1403 /* It's a response packet. Find a record for it or it's an error. */
1405 rrec = find_response_record( &subrec, nmb->header.name_trn_id);
1408 DEBUG(3,("find_subnet_for_nmb_packet: response record not found for response id %hu\n",
1409 nmb->header.name_trn_id));
1410 unexpected_packet(p);
1416 DEBUG(0,("find_subnet_for_nmb_packet: subnet record not found for response id %hu\n",
1417 nmb->header.name_trn_id));
1426 /* Try and see what subnet this packet belongs to. */
1429 if(packet_is_for_wins_server(p))
1430 return wins_server_subnet;
1432 /* If it wasn't a broadcast packet then send to the UNICAST subnet. */
1433 if(nmb->header.nm_flags.bcast == False)
1434 return unicast_subnet;
1436 /* Go through all the broadcast subnets and see if the mask matches. */
1437 for (subrec = FIRST_SUBNET; subrec ; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1439 if(same_net(p->ip, subrec->bcast_ip, subrec->mask_ip))
1443 /* If none match it must have been a directed broadcast - assign
1444 the remote_broadcast_subnet. */
1445 return remote_broadcast_subnet;
1448 /****************************************************************************
1449 Process a nmb request packet - validate the packet and route it.
1450 ****************************************************************************/
1452 static void process_nmb_request(struct packet_struct *p)
1454 struct nmb_packet *nmb = &p->packet.nmb;
1455 struct subnet_record *subrec = NULL;
1457 debug_nmb_packet(p);
1459 /* Ensure we have a good packet. */
1460 if(validate_nmb_packet(nmb))
1463 /* Allocate a subnet to this packet - if we cannot - fail. */
1464 if((subrec = find_subnet_for_nmb_packet(p, NULL))==NULL)
1467 switch (nmb->header.opcode)
1469 case NMB_NAME_REG_OPCODE:
1470 if(subrec == wins_server_subnet)
1471 wins_process_name_registration_request(subrec, p);
1473 process_name_registration_request(subrec, p);
1476 case NMB_NAME_REFRESH_OPCODE_8: /* ambiguity in rfc1002 about which is correct. */
1477 case NMB_NAME_REFRESH_OPCODE_9:
1478 if(subrec == wins_server_subnet)
1479 wins_process_name_refresh_request(subrec, p);
1481 process_name_refresh_request(subrec, p);
1484 case NMB_NAME_MULTIHOMED_REG_OPCODE:
1485 if(subrec == wins_server_subnet)
1486 wins_process_multihomed_name_registration_request(subrec, p);
1489 DEBUG(0,("process_nmb_request: Multihomed registration request must be \
1490 directed at a WINS server.\n"));
1494 case NMB_NAME_QUERY_OPCODE:
1495 switch (nmb->question.question_type)
1497 case QUESTION_TYPE_NB_QUERY:
1499 if(subrec == wins_server_subnet)
1500 wins_process_name_query_request(subrec, p);
1502 process_name_query_request(subrec, p);
1505 case QUESTION_TYPE_NB_STATUS:
1507 if(subrec == wins_server_subnet)
1509 DEBUG(0,("process_nmb_request: NB_STATUS request directed at WINS server is \
1514 process_node_status_request(subrec, p);
1520 case NMB_NAME_RELEASE_OPCODE:
1521 if(subrec == wins_server_subnet)
1522 wins_process_name_release_request(subrec, p);
1524 process_name_release_request(subrec, p);
1529 /****************************************************************************
1530 Process a nmb response packet - validate the packet and route it.
1531 to either the WINS server or a normal response.
1532 ****************************************************************************/
1534 static void process_nmb_response(struct packet_struct *p)
1536 struct nmb_packet *nmb = &p->packet.nmb;
1537 struct subnet_record *subrec = NULL;
1538 struct response_record *rrec = NULL;
1540 debug_nmb_packet(p);
1542 if(validate_nmb_response_packet(nmb))
1545 if((subrec = find_subnet_for_nmb_packet(p, &rrec))==NULL)
1550 DEBUG(0,("process_nmb_response: response packet received but no response record \
1551 found for id = %hu. Ignoring packet.\n", nmb->header.name_trn_id));
1555 /* Increment the number of responses received for this record. */
1557 /* Ensure we don't re-send the request. */
1558 rrec->repeat_count = 0;
1560 /* Call the response received function for this packet. */
1561 (*rrec->resp_fn)(subrec, rrec, p);
1565 /*******************************************************************
1566 Run elements off the packet queue till its empty
1567 ******************************************************************/
1569 void run_packet_queue(void)
1571 struct packet_struct *p;
1573 while ((p = packet_queue))
1575 packet_queue = p->next;
1577 packet_queue->prev = NULL;
1578 p->next = p->prev = NULL;
1580 switch (p->packet_type)
1583 if(p->packet.nmb.header.response)
1584 process_nmb_response(p);
1586 process_nmb_request(p);
1597 /*******************************************************************
1598 Retransmit or timeout elements from all the outgoing subnet response
1599 record queues. NOTE that this code must also check the WINS server
1600 subnet for response records to timeout as the WINS server code
1601 can send requests to check if a client still owns a name.
1602 (Patch from Andrey Alekseyev <fetch@muffin.arcadia.spb.ru>).
1603 ******************************************************************/
1605 void retransmit_or_expire_response_records(time_t t)
1607 struct subnet_record *subrec;
1609 for (subrec = FIRST_SUBNET; subrec;
1610 subrec = get_next_subnet_maybe_unicast_or_wins_server(subrec))
1612 struct response_record *rrec, *nextrrec;
1614 for (rrec = subrec->responselist; rrec; rrec = nextrrec)
1616 nextrrec = rrec->next;
1618 if (rrec->repeat_time <= t)
1620 if (rrec->repeat_count > 0)
1622 /* Resend while we have a non-zero repeat_count. */
1623 if(!send_packet(rrec->packet))
1625 DEBUG(0,("retransmit_or_expire_response_records: Failed to resend packet id %hu \
1626 to IP %s on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip),
1627 subrec->subnet_name));
1629 rrec->repeat_time += rrec->repeat_interval;
1630 rrec->repeat_count--;
1634 DEBUG(4,("retransmit_or_expire_response_records: timeout for packet id %hu to IP %s \
1635 on subnet %s\n", rrec->response_id, inet_ntoa(rrec->packet->ip),
1636 subrec->subnet_name));
1639 * Check the flag in this record to prevent recursion if we end
1640 * up in this function again via the timeout function call.
1643 if(!rrec->in_expiration_processing)
1647 * Set the recursion protection flag in this record.
1650 rrec->in_expiration_processing = True;
1652 /* Call the timeout function. This will deal with removing the
1653 timed out packet. */
1654 if(rrec->timeout_fn)
1655 (*rrec->timeout_fn)(subrec, rrec);
1658 /* We must remove the record ourself if there is
1659 no timeout function. */
1660 remove_response_record(subrec, rrec);
1662 } /* !rrec->in_expitation_processing */
1663 } /* rrec->repeat_count > 0 */
1664 } /* rrec->repeat_time <= t */
1665 } /* end for rrec */
1666 } /* end for subnet */
1669 /****************************************************************************
1670 Create an fd_set containing all the sockets in the subnet structures,
1671 plus the broadcast sockets.
1672 ***************************************************************************/
1674 static BOOL create_listen_fdset(fd_set **ppset, int **psock_array, int *listen_number)
1676 int *sock_array = NULL;
1677 struct subnet_record *subrec = NULL;
1680 fd_set *pset = (fd_set *)malloc(sizeof(fd_set));
1684 DEBUG(0,("create_listen_fdset: malloc fail !\n"));
1688 /* Check that we can add all the fd's we need. */
1689 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1692 if((count*2) + 2 > FD_SETSIZE)
1694 DEBUG(0,("create_listen_fdset: Too many file descriptors needed (%d). We can \
1695 only use %d.\n", (count*2) + 2, FD_SETSIZE));
1699 if((sock_array = (int *)malloc(((count*2) + 2)*sizeof(int))) == NULL)
1701 DEBUG(0,("create_listen_fdset: malloc fail for socket array.\n"));
1707 /* Add in the broadcast socket on 137. */
1708 FD_SET(ClientNMB,pset);
1709 sock_array[num++] = ClientNMB;
1711 /* Add in the 137 sockets on all the interfaces. */
1712 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1714 FD_SET(subrec->nmb_sock,pset);
1715 sock_array[num++] = subrec->nmb_sock;
1718 /* Add in the broadcast socket on 138. */
1719 FD_SET(ClientDGRAM,pset);
1720 sock_array[num++] = ClientDGRAM;
1722 /* Add in the 138 sockets on all the interfaces. */
1723 for (subrec = FIRST_SUBNET; subrec; subrec = NEXT_SUBNET_EXCLUDING_UNICAST(subrec))
1725 FD_SET(subrec->dgram_sock,pset);
1726 sock_array[num++] = subrec->dgram_sock;
1729 *listen_number = (count*2) + 2;
1731 if (*ppset) free(*ppset);
1732 if (*psock_array) free(*psock_array);
1735 *psock_array = sock_array;
1740 /****************************************************************************
1741 Listens for NMB or DGRAM packets, and queues them.
1742 ***************************************************************************/
1744 BOOL listen_for_packets(BOOL run_election)
1746 static fd_set *listen_set = NULL;
1747 static int listen_number = 0;
1748 static int *sock_array = NULL;
1752 struct timeval timeout;
1757 if(listen_set == NULL || rescan_listen_set)
1759 if(create_listen_fdset(&listen_set, &sock_array, &listen_number))
1761 DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n"));
1764 rescan_listen_set = False;
1767 memcpy((char *)&fds, (char *)listen_set, sizeof(fd_set));
1770 dns_fd = asyncdns_fd();
1772 FD_SET(dns_fd, &fds);
1778 * During elections and when expecting a netbios response packet we
1779 * need to send election packets at tighter intervals.
1780 * Ideally it needs to be the interval (in ms) between time now and
1781 * the time we are expecting the next netbios packet.
1784 timeout.tv_sec = (run_election||num_response_packets) ? 1 : NMBD_SELECT_LOOP;
1785 timeout.tv_usec = 0;
1787 /* Prepare for the select - allow certain signals. */
1789 BlockSignals(False, SIGTERM);
1790 #if defined(SIGUSR1)
1791 BlockSignals(False, SIGUSR1);
1792 #endif /* SIGUSR1 */
1793 #if defined(SIGUSR2)
1794 BlockSignals(False, SIGUSR2);
1795 #endif /* SIGUSR2 */
1797 selrtn = sys_select(FD_SETSIZE,&fds,&timeout);
1799 /* We can only take signals when we are in the select - block them again here. */
1801 BlockSignals(True, SIGTERM);
1802 #if defined(SIGUSR1)
1803 BlockSignals(True, SIGUSR1);
1804 #endif /* SIGUSR1 */
1805 #if defined(SIGUSR2)
1806 BlockSignals(True, SIGUSR2);
1807 #endif /* SIGUSR2 */
1814 if (dns_fd != -1 && FD_ISSET(dns_fd,&fds)) {
1819 for(i = 0; i < listen_number; i++)
1821 if(i < (listen_number/2))
1823 /* Processing a 137 socket. */
1824 if (FD_ISSET(sock_array[i],&fds))
1826 struct packet_struct *packet = read_packet(sock_array[i], NMB_PACKET);
1830 * If we got a packet on the broadcast socket and interfaces
1831 * only is set then check it came from one of our local nets.
1833 if(lp_bind_interfaces_only() && (sock_array[i] == ClientNMB) &&
1834 (!is_local_net(packet->ip)))
1836 DEBUG(7,("discarding nmb packet sent to broadcast socket from %s:%d\n",
1837 inet_ntoa(packet->ip),packet->port));
1838 free_packet(packet);
1840 else if ((ip_equal(loopback_ip, packet->ip) ||
1841 ismyip(packet->ip)) && packet->port == global_nmb_port)
1843 DEBUG(7,("discarding own packet from %s:%d\n",
1844 inet_ntoa(packet->ip),packet->port));
1845 free_packet(packet);
1849 /* Save the file descriptor this packet came in on. */
1850 packet->fd = sock_array[i];
1851 queue_packet(packet);
1858 /* Processing a 138 socket. */
1860 if (FD_ISSET(sock_array[i],&fds))
1862 struct packet_struct *packet = read_packet(sock_array[i], DGRAM_PACKET);
1866 * If we got a packet on the broadcast socket and interfaces
1867 * only is set then check it came from one of our local nets.
1869 if(lp_bind_interfaces_only() && (sock_array[i] == ClientDGRAM) &&
1870 (!is_local_net(packet->ip)))
1872 DEBUG(7,("discarding dgram packet sent to broadcast socket from %s:%d\n",
1873 inet_ntoa(packet->ip),packet->port));
1874 free_packet(packet);
1876 else if ((ip_equal(loopback_ip, packet->ip) ||
1877 ismyip(packet->ip)) && packet->port == DGRAM_PORT)
1879 DEBUG(7,("discarding own packet from %s:%d\n",
1880 inet_ntoa(packet->ip),packet->port));
1881 free_packet(packet);
1885 /* Save the file descriptor this packet came in on. */
1886 packet->fd = sock_array[i];
1887 queue_packet(packet);
1891 } /* end processing 138 socket. */
1893 } /* end if selret > 0 */
1897 /****************************************************************************
1898 Construct and send a netbios DGRAM.
1899 **************************************************************************/
1900 BOOL send_mailslot(BOOL unique, char *mailslot,char *buf,int len,
1901 char *srcname, int src_type,
1902 char *dstname, int dest_type,
1903 struct in_addr dest_ip,struct in_addr src_ip,
1906 BOOL loopback_this_packet = False;
1907 struct packet_struct p;
1908 struct dgram_packet *dgram = &p.packet.dgram;
1912 memset((char *)&p,'\0',sizeof(p));
1915 loopback_this_packet = True;
1917 generate_name_trn_id();
1919 /* DIRECT GROUP or UNIQUE datagram. */
1920 dgram->header.msg_type = unique ? 0x10 : 0x11;
1921 dgram->header.flags.node_type = M_NODE;
1922 dgram->header.flags.first = True;
1923 dgram->header.flags.more = False;
1924 dgram->header.dgm_id = name_trn_id;
1925 dgram->header.source_ip = src_ip;
1926 dgram->header.source_port = DGRAM_PORT;
1927 dgram->header.dgm_length = 0; /* Let build_dgram() handle this. */
1928 dgram->header.packet_offset = 0;
1930 make_nmb_name(&dgram->source_name,srcname,src_type);
1931 make_nmb_name(&dgram->dest_name,dstname,dest_type);
1933 ptr = &dgram->data[0];
1935 /* Setup the smb part. */
1936 ptr -= 4; /* XXX Ugliness because of handling of tcp SMB length. */
1938 set_message(ptr,17,17 + len,True);
1941 CVAL(ptr,smb_com) = SMBtrans;
1942 SSVAL(ptr,smb_vwv1,len);
1943 SSVAL(ptr,smb_vwv11,len);
1944 SSVAL(ptr,smb_vwv12,70 + strlen(mailslot));
1945 SSVAL(ptr,smb_vwv13,3);
1946 SSVAL(ptr,smb_vwv14,1);
1947 SSVAL(ptr,smb_vwv15,1);
1948 SSVAL(ptr,smb_vwv16,2);
1950 pstrcpy(p2,mailslot);
1951 p2 = skip_string(p2,1);
1956 dgram->datasize = PTR_DIFF(p2,ptr+4); /* +4 for tcp length. */
1960 p.fd = find_subnet_mailslot_fd_for_address( src_ip );
1961 p.timestamp = time(NULL);
1962 p.packet_type = DGRAM_PACKET;
1964 DEBUG(4,("send_mailslot: Sending to mailslot %s from %s IP %s ", mailslot,
1965 nmb_namestr(&dgram->source_name), inet_ntoa(src_ip)));
1966 DEBUG(4,("to %s IP %s\n", nmb_namestr(&dgram->dest_name), inet_ntoa(dest_ip)));
1968 debug_browse_data(buf, len);
1970 if(loopback_this_packet)
1972 struct packet_struct *lo_packet = NULL;
1973 DEBUG(5,("send_mailslot: sending packet to ourselves.\n"));
1974 if((lo_packet = copy_packet(&p)) == NULL)
1976 queue_packet(lo_packet);
1980 return(send_packet(&p));