2 Unix SMB/CIFS implementation.
3 NBT netbios routines and daemon - version 2
4 Copyright (C) Andrew Tridgell 1994-1998
5 Copyright (C) Luke Kenneth Casson Leighton 1994-1998
6 Copyright (C) Jeremy Allison 1994-2003
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 extern int ClientDGRAM
;
28 extern int global_nmb_port
;
30 extern int num_response_packets
;
32 extern struct in_addr loopback_ip
;
34 static void queue_packet(struct packet_struct
*packet
);
36 BOOL rescan_listen_set
= False
;
39 /*******************************************************************
40 The global packet linked-list. Incoming entries are
41 added to the end of this list. It is supposed to remain fairly
42 short so we won't bother with an end pointer.
43 ******************************************************************/
45 static struct packet_struct
*packet_queue
= NULL
;
47 /***************************************************************************
48 Utility function to find the specific fd to send a packet out on.
49 **************************************************************************/
51 static int find_subnet_fd_for_address( struct in_addr local_ip
)
53 struct subnet_record
*subrec
;
55 for( subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
))
56 if(ip_equal(local_ip
, subrec
->myip
))
57 return subrec
->nmb_sock
;
62 /***************************************************************************
63 Utility function to find the specific fd to send a mailslot packet out on.
64 **************************************************************************/
66 static int find_subnet_mailslot_fd_for_address( struct in_addr local_ip
)
68 struct subnet_record
*subrec
;
70 for( subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
))
71 if(ip_equal(local_ip
, subrec
->myip
))
72 return subrec
->dgram_sock
;
77 /***************************************************************************
78 Get/Set problematic nb_flags as network byte order 16 bit int.
79 **************************************************************************/
81 uint16
get_nb_flags(char *buf
)
83 return ((((uint16
)*buf
)&0xFFFF) & NB_FLGMSK
);
86 void set_nb_flags(char *buf
, uint16 nb_flags
)
88 *buf
++ = ((nb_flags
& NB_FLGMSK
) & 0xFF);
92 /***************************************************************************
93 Dumps out the browse packet data.
94 **************************************************************************/
96 static void debug_browse_data(char *outbuf
, int len
)
100 DEBUG( 4, ( "debug_browse_data():\n" ) );
101 for (i
= 0; i
< len
; i
+= 16) {
102 DEBUGADD( 4, ( "%3x char ", i
) );
104 for (j
= 0; j
< 16; j
++) {
110 if (x
< 32 || x
> 127)
113 DEBUGADD( 4, ( "%c", x
) );
116 DEBUGADD( 4, ( "%*s hex", 16-j
, "" ) );
118 for (j
= 0; j
< 16; j
++) {
121 DEBUGADD( 4, ( " %02x", (unsigned char)outbuf
[i
+j
] ) );
124 DEBUGADD( 4, ("\n") );
128 /***************************************************************************
129 Generates the unique transaction identifier
130 **************************************************************************/
132 static uint16 name_trn_id
=0;
134 static uint16
generate_name_trn_id(void)
137 name_trn_id
= ((unsigned)time(NULL
)%(unsigned)0x7FFF) + ((unsigned)sys_getpid()%(unsigned)100);
139 name_trn_id
= (name_trn_id
+1) % (unsigned)0x7FFF;
143 /***************************************************************************
144 Either loops back or sends out a completed NetBIOS packet.
145 **************************************************************************/
147 static BOOL
send_netbios_packet(struct packet_struct
*p
)
149 BOOL loopback_this_packet
= False
;
151 /* Check if we are sending to or from ourselves as a WINS server. */
152 if(ismyip(p
->ip
) && (p
->port
== global_nmb_port
))
153 loopback_this_packet
= True
;
155 if(loopback_this_packet
) {
156 struct packet_struct
*lo_packet
= NULL
;
157 DEBUG(5,("send_netbios_packet: sending packet to ourselves.\n"));
158 if((lo_packet
= copy_packet(p
)) == NULL
)
160 queue_packet(lo_packet
);
161 } else if (!send_packet(p
)) {
162 DEBUG(0,("send_netbios_packet: send_packet() to IP %s port %d failed\n",
163 inet_ntoa(p
->ip
),p
->port
));
170 /***************************************************************************
171 Sets up the common elements of an outgoing NetBIOS packet.
173 Note: do not attempt to rationalise whether rec_des should be set or not
174 in a particular situation. Just follow rfc_1002 or look at examples from WinXX.
175 It does NOT follow the rule that requests to the wins server always have
176 rec_des true. See for example name releases and refreshes
177 **************************************************************************/
179 static struct packet_struct
*create_and_init_netbios_packet(struct nmb_name
*nmbname
,
180 BOOL bcast
, BOOL rec_des
,
181 struct in_addr to_ip
)
183 struct packet_struct
*packet
= NULL
;
184 struct nmb_packet
*nmb
= NULL
;
186 /* Allocate the packet_struct we will return. */
187 if((packet
= SMB_MALLOC_P(struct packet_struct
)) == NULL
) {
188 DEBUG(0,("create_and_init_netbios_packet: malloc fail (1) for packet struct.\n"));
192 memset((char *)packet
,'\0',sizeof(*packet
));
194 nmb
= &packet
->packet
.nmb
;
196 nmb
->header
.name_trn_id
= generate_name_trn_id();
197 nmb
->header
.response
= False
;
198 nmb
->header
.nm_flags
.recursion_desired
= rec_des
;
199 nmb
->header
.nm_flags
.recursion_available
= False
;
200 nmb
->header
.nm_flags
.trunc
= False
;
201 nmb
->header
.nm_flags
.authoritative
= False
;
202 nmb
->header
.nm_flags
.bcast
= bcast
;
204 nmb
->header
.rcode
= 0;
205 nmb
->header
.qdcount
= 1;
206 nmb
->header
.ancount
= 0;
207 nmb
->header
.nscount
= 0;
209 nmb
->question
.question_name
= *nmbname
;
210 nmb
->question
.question_type
= QUESTION_TYPE_NB_QUERY
;
211 nmb
->question
.question_class
= QUESTION_CLASS_IN
;
214 packet
->port
= NMB_PORT
;
215 packet
->fd
= ClientNMB
;
216 packet
->timestamp
= time(NULL
);
217 packet
->packet_type
= NMB_PACKET
;
218 packet
->locked
= False
;
220 return packet
; /* Caller must free. */
223 /***************************************************************************
224 Sets up the common elements of register, refresh or release packet.
225 **************************************************************************/
227 static BOOL
create_and_init_additional_record(struct packet_struct
*packet
,
229 struct in_addr
*register_ip
)
231 struct nmb_packet
*nmb
= &packet
->packet
.nmb
;
233 if((nmb
->additional
= SMB_MALLOC_P(struct res_rec
)) == NULL
) {
234 DEBUG(0,("initiate_name_register_packet: malloc fail for additional record.\n"));
238 memset((char *)nmb
->additional
,'\0',sizeof(struct res_rec
));
240 nmb
->additional
->rr_name
= nmb
->question
.question_name
;
241 nmb
->additional
->rr_type
= RR_TYPE_NB
;
242 nmb
->additional
->rr_class
= RR_CLASS_IN
;
244 /* See RFC 1002, sections 5.1.1.1, 5.1.1.2 and 5.1.1.3 */
245 if (nmb
->header
.nm_flags
.bcast
)
246 nmb
->additional
->ttl
= PERMANENT_TTL
;
248 nmb
->additional
->ttl
= lp_max_ttl();
250 nmb
->additional
->rdlength
= 6;
252 set_nb_flags(nmb
->additional
->rdata
,nb_flags
);
254 /* Set the address for the name we are registering. */
255 putip(&nmb
->additional
->rdata
[2], register_ip
);
258 it turns out that Jeremys code was correct, we are supposed
259 to send registrations from the IP we are registering. The
260 trick is what to do on timeouts! When we send on a
261 non-routable IP then the reply will timeout, and we should
262 treat this as success, not failure. That means we go into
263 our standard refresh cycle for that name which copes nicely
264 with disconnected networks.
266 packet
->fd
= find_subnet_fd_for_address(*register_ip
);
271 /***************************************************************************
272 Sends out a name query.
273 **************************************************************************/
275 static BOOL
initiate_name_query_packet( struct packet_struct
*packet
)
277 struct nmb_packet
*nmb
= NULL
;
279 nmb
= &packet
->packet
.nmb
;
281 nmb
->header
.opcode
= NMB_NAME_QUERY_OPCODE
;
282 nmb
->header
.arcount
= 0;
284 nmb
->header
.nm_flags
.recursion_desired
= True
;
286 DEBUG(4,("initiate_name_query_packet: sending query for name %s (bcast=%s) to IP %s\n",
287 nmb_namestr(&nmb
->question
.question_name
),
288 BOOLSTR(nmb
->header
.nm_flags
.bcast
), inet_ntoa(packet
->ip
)));
290 return send_netbios_packet( packet
);
293 /***************************************************************************
294 Sends out a name query - from a WINS server.
295 **************************************************************************/
297 static BOOL
initiate_name_query_packet_from_wins_server( struct packet_struct
*packet
)
299 struct nmb_packet
*nmb
= NULL
;
301 nmb
= &packet
->packet
.nmb
;
303 nmb
->header
.opcode
= NMB_NAME_QUERY_OPCODE
;
304 nmb
->header
.arcount
= 0;
306 nmb
->header
.nm_flags
.recursion_desired
= False
;
308 DEBUG(4,("initiate_name_query_packet_from_wins_server: sending query for name %s (bcast=%s) to IP %s\n",
309 nmb_namestr(&nmb
->question
.question_name
),
310 BOOLSTR(nmb
->header
.nm_flags
.bcast
), inet_ntoa(packet
->ip
)));
312 return send_netbios_packet( packet
);
315 /***************************************************************************
316 Sends out a name register.
317 **************************************************************************/
319 static BOOL
initiate_name_register_packet( struct packet_struct
*packet
,
320 uint16 nb_flags
, struct in_addr
*register_ip
)
322 struct nmb_packet
*nmb
= &packet
->packet
.nmb
;
324 nmb
->header
.opcode
= NMB_NAME_REG_OPCODE
;
325 nmb
->header
.arcount
= 1;
327 nmb
->header
.nm_flags
.recursion_desired
= True
;
329 if(create_and_init_additional_record(packet
, nb_flags
, register_ip
) == False
)
332 DEBUG(4,("initiate_name_register_packet: sending registration for name %s (bcast=%s) to IP %s\n",
333 nmb_namestr(&nmb
->additional
->rr_name
),
334 BOOLSTR(nmb
->header
.nm_flags
.bcast
), inet_ntoa(packet
->ip
)));
336 return send_netbios_packet( packet
);
339 /***************************************************************************
340 Sends out a multihomed name register.
341 **************************************************************************/
343 static BOOL
initiate_multihomed_name_register_packet(struct packet_struct
*packet
,
344 uint16 nb_flags
, struct in_addr
*register_ip
)
346 struct nmb_packet
*nmb
= &packet
->packet
.nmb
;
347 fstring second_ip_buf
;
349 fstrcpy(second_ip_buf
, inet_ntoa(packet
->ip
));
351 nmb
->header
.opcode
= NMB_NAME_MULTIHOMED_REG_OPCODE
;
352 nmb
->header
.arcount
= 1;
354 nmb
->header
.nm_flags
.recursion_desired
= True
;
356 if(create_and_init_additional_record(packet
, nb_flags
, register_ip
) == False
)
359 DEBUG(4,("initiate_multihomed_name_register_packet: sending registration \
360 for name %s IP %s (bcast=%s) to IP %s\n",
361 nmb_namestr(&nmb
->additional
->rr_name
), inet_ntoa(*register_ip
),
362 BOOLSTR(nmb
->header
.nm_flags
.bcast
), second_ip_buf
));
364 return send_netbios_packet( packet
);
367 /***************************************************************************
368 Sends out a name refresh.
369 **************************************************************************/
371 static BOOL
initiate_name_refresh_packet( struct packet_struct
*packet
,
372 uint16 nb_flags
, struct in_addr
*refresh_ip
)
374 struct nmb_packet
*nmb
= &packet
->packet
.nmb
;
376 nmb
->header
.opcode
= NMB_NAME_REFRESH_OPCODE_8
;
377 nmb
->header
.arcount
= 1;
379 nmb
->header
.nm_flags
.recursion_desired
= False
;
381 if(create_and_init_additional_record(packet
, nb_flags
, refresh_ip
) == False
)
384 DEBUG(4,("initiate_name_refresh_packet: sending refresh for name %s (bcast=%s) to IP %s\n",
385 nmb_namestr(&nmb
->additional
->rr_name
),
386 BOOLSTR(nmb
->header
.nm_flags
.bcast
), inet_ntoa(packet
->ip
)));
388 return send_netbios_packet( packet
);
391 /***************************************************************************
392 Sends out a name release.
393 **************************************************************************/
395 static BOOL
initiate_name_release_packet( struct packet_struct
*packet
,
396 uint16 nb_flags
, struct in_addr
*release_ip
)
398 struct nmb_packet
*nmb
= &packet
->packet
.nmb
;
400 nmb
->header
.opcode
= NMB_NAME_RELEASE_OPCODE
;
401 nmb
->header
.arcount
= 1;
403 nmb
->header
.nm_flags
.recursion_desired
= False
;
405 if(create_and_init_additional_record(packet
, nb_flags
, release_ip
) == False
)
408 DEBUG(4,("initiate_name_release_packet: sending release for name %s (bcast=%s) to IP %s\n",
409 nmb_namestr(&nmb
->additional
->rr_name
),
410 BOOLSTR(nmb
->header
.nm_flags
.bcast
), inet_ntoa(packet
->ip
)));
412 return send_netbios_packet( packet
);
415 /***************************************************************************
416 Sends out a node status.
417 **************************************************************************/
419 static BOOL
initiate_node_status_packet( struct packet_struct
*packet
)
421 struct nmb_packet
*nmb
= &packet
->packet
.nmb
;
423 nmb
->header
.opcode
= NMB_NAME_QUERY_OPCODE
;
424 nmb
->header
.arcount
= 0;
426 nmb
->header
.nm_flags
.recursion_desired
= False
;
428 nmb
->question
.question_type
= QUESTION_TYPE_NB_STATUS
;
430 DEBUG(4,("initiate_node_status_packet: sending node status request for name %s to IP %s\n",
431 nmb_namestr(&nmb
->question
.question_name
),
432 inet_ntoa(packet
->ip
)));
434 return send_netbios_packet( packet
);
437 /****************************************************************************
438 Simplification functions for queuing standard packets.
439 These should be the only publicly callable functions for sending
441 ****************************************************************************/
443 /****************************************************************************
444 Assertion - we should never be sending nmbd packets on the remote
446 ****************************************************************************/
448 static BOOL
assert_check_subnet(struct subnet_record
*subrec
)
450 if( subrec
== remote_broadcast_subnet
) {
451 DEBUG(0,("assert_check_subnet: Attempt to send packet on remote broadcast subnet. \
458 /****************************************************************************
459 Queue a register name packet to the broadcast address of a subnet.
460 ****************************************************************************/
462 struct response_record
*queue_register_name( struct subnet_record
*subrec
,
463 response_function resp_fn
,
464 timeout_response_function timeout_fn
,
465 register_name_success_function success_fn
,
466 register_name_fail_function fail_fn
,
467 struct userdata_struct
*userdata
,
468 struct nmb_name
*nmbname
,
471 struct packet_struct
*p
;
472 struct response_record
*rrec
;
474 if(assert_check_subnet(subrec
))
477 /* note that all name registration requests have RD set (rfc1002 - section 4.2.2 */
478 if ((p
= create_and_init_netbios_packet(nmbname
, (subrec
!= unicast_subnet
), True
,
479 subrec
->bcast_ip
)) == NULL
)
482 if(initiate_name_register_packet( p
, nb_flags
, iface_ip(subrec
->bcast_ip
)) == False
) {
488 if((rrec
= make_response_record(subrec
, /* subnet record. */
489 p
, /* packet we sent. */
490 resp_fn
, /* function to call on response. */
491 timeout_fn
, /* function to call on timeout. */
492 (success_function
)success_fn
, /* function to call on operation success. */
493 (fail_function
)fail_fn
, /* function to call on operation fail. */
494 userdata
)) == NULL
) {
503 /****************************************************************************
504 Queue a refresh name packet to the broadcast address of a subnet.
505 ****************************************************************************/
507 void queue_wins_refresh(struct nmb_name
*nmbname
,
508 response_function resp_fn
,
509 timeout_response_function timeout_fn
,
511 struct in_addr refresh_ip
,
514 struct packet_struct
*p
;
515 struct response_record
*rrec
;
516 struct in_addr wins_ip
;
517 struct userdata_struct
*userdata
;
520 wins_ip
= wins_srv_ip_tag(tag
, refresh_ip
);
522 if ((p
= create_and_init_netbios_packet(nmbname
, False
, False
, wins_ip
)) == NULL
) {
526 if (!initiate_name_refresh_packet(p
, nb_flags
, &refresh_ip
)) {
532 fstrcpy(ip_str
, inet_ntoa(refresh_ip
));
534 DEBUG(6,("Refreshing name %s IP %s with WINS server %s using tag '%s'\n",
535 nmb_namestr(nmbname
), ip_str
, inet_ntoa(wins_ip
), tag
));
537 userdata
= (struct userdata_struct
*)SMB_MALLOC(sizeof(*userdata
) + strlen(tag
) + 1);
539 DEBUG(0,("Failed to allocate userdata structure!\n"));
542 ZERO_STRUCTP(userdata
);
543 userdata
->userdata_len
= strlen(tag
) + 1;
544 strlcpy(userdata
->data
, tag
, userdata
->userdata_len
);
546 if ((rrec
= make_response_record(unicast_subnet
,
551 userdata
)) == NULL
) {
559 /* we don't want to repeat refresh packets */
560 rrec
->repeat_count
= 0;
564 /****************************************************************************
565 Queue a multihomed register name packet to a given WINS server IP
566 ****************************************************************************/
568 struct response_record
*queue_register_multihomed_name( struct subnet_record
*subrec
,
569 response_function resp_fn
,
570 timeout_response_function timeout_fn
,
571 register_name_success_function success_fn
,
572 register_name_fail_function fail_fn
,
573 struct userdata_struct
*userdata
,
574 struct nmb_name
*nmbname
,
576 struct in_addr register_ip
,
577 struct in_addr wins_ip
)
579 struct packet_struct
*p
;
580 struct response_record
*rrec
;
584 if(subrec
!= unicast_subnet
) {
585 DEBUG(0,("queue_register_multihomed_name: should only be done on \
586 unicast subnet. subnet is %s\n.", subrec
->subnet_name
));
590 if(assert_check_subnet(subrec
))
593 if ((p
= create_and_init_netbios_packet(nmbname
, False
, True
, wins_ip
)) == NULL
)
596 if (nb_flags
& NB_GROUP
)
597 ret
= initiate_name_register_packet( p
, nb_flags
, ®ister_ip
);
599 ret
= initiate_multihomed_name_register_packet(p
, nb_flags
, ®ister_ip
);
607 if ((rrec
= make_response_record(subrec
, /* subnet record. */
608 p
, /* packet we sent. */
609 resp_fn
, /* function to call on response. */
610 timeout_fn
, /* function to call on timeout. */
611 (success_function
)success_fn
, /* function to call on operation success. */
612 (fail_function
)fail_fn
, /* function to call on operation fail. */
613 userdata
)) == NULL
) {
622 /****************************************************************************
623 Queue a release name packet to the broadcast address of a subnet.
624 ****************************************************************************/
626 struct response_record
*queue_release_name( struct subnet_record
*subrec
,
627 response_function resp_fn
,
628 timeout_response_function timeout_fn
,
629 release_name_success_function success_fn
,
630 release_name_fail_function fail_fn
,
631 struct userdata_struct
*userdata
,
632 struct nmb_name
*nmbname
,
634 struct in_addr release_ip
,
635 struct in_addr dest_ip
)
637 struct packet_struct
*p
;
638 struct response_record
*rrec
;
640 if(assert_check_subnet(subrec
))
643 if ((p
= create_and_init_netbios_packet(nmbname
, (subrec
!= unicast_subnet
), False
, dest_ip
)) == NULL
)
646 if(initiate_name_release_packet( p
, nb_flags
, &release_ip
) == False
) {
652 if((rrec
= make_response_record(subrec
, /* subnet record. */
653 p
, /* packet we sent. */
654 resp_fn
, /* function to call on response. */
655 timeout_fn
, /* function to call on timeout. */
656 (success_function
)success_fn
, /* function to call on operation success. */
657 (fail_function
)fail_fn
, /* function to call on operation fail. */
658 userdata
)) == NULL
) {
665 * For a broadcast release packet, only send once.
666 * This will cause us to remove the name asap. JRA.
669 if (subrec
!= unicast_subnet
) {
670 rrec
->repeat_count
= 0;
671 rrec
->repeat_time
= 0;
677 /****************************************************************************
678 Queue a query name packet to the broadcast address of a subnet.
679 ****************************************************************************/
681 struct response_record
*queue_query_name( struct subnet_record
*subrec
,
682 response_function resp_fn
,
683 timeout_response_function timeout_fn
,
684 query_name_success_function success_fn
,
685 query_name_fail_function fail_fn
,
686 struct userdata_struct
*userdata
,
687 struct nmb_name
*nmbname
)
689 struct packet_struct
*p
;
690 struct response_record
*rrec
;
691 struct in_addr to_ip
;
693 if(assert_check_subnet(subrec
))
696 to_ip
= subrec
->bcast_ip
;
698 /* queries to the WINS server turn up here as queries to IP 0.0.0.0
699 These need to be handled a bit differently */
700 if (subrec
->type
== UNICAST_SUBNET
&& is_zero_ip(to_ip
)) {
701 /* What we really need to do is loop over each of our wins
702 * servers and wins server tags here, but that just doesn't
703 * fit our architecture at the moment (userdata may already
704 * be used when we get here). For now we just query the first
705 * active wins server on the first tag.
707 char **tags
= wins_srv_tags();
711 to_ip
= wins_srv_ip_tag(tags
[0], to_ip
);
712 wins_srv_tags_free(tags
);
715 if(( p
= create_and_init_netbios_packet(nmbname
,
716 (subrec
!= unicast_subnet
),
717 (subrec
== unicast_subnet
),
721 if(lp_bind_interfaces_only()) {
724 DEBUG(10,("queue_query_name: bind_interfaces_only is set, looking for suitable source IP\n"));
725 for(i
= 0; i
< iface_count(); i
++) {
726 struct in_addr
*ifip
= iface_n_ip(i
);
729 DEBUG(0,("queue_query_name: interface %d has NULL IP address !\n", i
));
733 if (ip_equal(*ifip
,loopback_ip
)) {
734 DEBUG(5,("queue_query_name: ignoring loopback interface (%d)\n", i
));
738 DEBUG(10,("queue_query_name: using source IP %s\n",inet_ntoa(*ifip
)));
739 p
->fd
= find_subnet_fd_for_address( *ifip
);
744 if(initiate_name_query_packet( p
) == False
) {
750 if((rrec
= make_response_record(subrec
, /* 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
) {
765 /****************************************************************************
766 Queue a query name packet to a given address from the WINS subnet.
767 ****************************************************************************/
769 struct response_record
*queue_query_name_from_wins_server( struct in_addr to_ip
,
770 response_function resp_fn
,
771 timeout_response_function timeout_fn
,
772 query_name_success_function success_fn
,
773 query_name_fail_function fail_fn
,
774 struct userdata_struct
*userdata
,
775 struct nmb_name
*nmbname
)
777 struct packet_struct
*p
;
778 struct response_record
*rrec
;
780 if ((p
= create_and_init_netbios_packet(nmbname
, False
, False
, to_ip
)) == NULL
)
783 if(initiate_name_query_packet_from_wins_server( p
) == False
) {
789 if((rrec
= make_response_record(wins_server_subnet
, /* subnet record. */
790 p
, /* packet we sent. */
791 resp_fn
, /* function to call on response. */
792 timeout_fn
, /* function to call on timeout. */
793 (success_function
)success_fn
, /* function to call on operation success. */
794 (fail_function
)fail_fn
, /* function to call on operation fail. */
795 userdata
)) == NULL
) {
804 /****************************************************************************
805 Queue a node status packet to a given name and address.
806 ****************************************************************************/
808 struct response_record
*queue_node_status( struct subnet_record
*subrec
,
809 response_function resp_fn
,
810 timeout_response_function timeout_fn
,
811 node_status_success_function success_fn
,
812 node_status_fail_function fail_fn
,
813 struct userdata_struct
*userdata
,
814 struct nmb_name
*nmbname
,
815 struct in_addr send_ip
)
817 struct packet_struct
*p
;
818 struct response_record
*rrec
;
821 if(subrec
!= unicast_subnet
) {
822 DEBUG(0,("queue_register_multihomed_name: should only be done on \
823 unicast subnet. subnet is %s\n.", subrec
->subnet_name
));
827 if(assert_check_subnet(subrec
))
830 if(( p
= create_and_init_netbios_packet(nmbname
, False
, False
, send_ip
)) == NULL
)
833 if(initiate_node_status_packet(p
) == False
) {
839 if((rrec
= make_response_record(subrec
, /* subnet record. */
840 p
, /* packet we sent. */
841 resp_fn
, /* function to call on response. */
842 timeout_fn
, /* function to call on timeout. */
843 (success_function
)success_fn
, /* function to call on operation success. */
844 (fail_function
)fail_fn
, /* function to call on operation fail. */
845 userdata
)) == NULL
) {
854 /****************************************************************************
855 Reply to a netbios name packet. see rfc1002.txt
856 ****************************************************************************/
858 void reply_netbios_packet(struct packet_struct
*orig_packet
,
859 int rcode
, enum netbios_reply_type_code rcv_code
, int opcode
,
860 int ttl
, char *data
,int len
)
862 struct packet_struct packet
;
863 struct nmb_packet
*nmb
= NULL
;
864 struct res_rec answers
;
865 struct nmb_packet
*orig_nmb
= &orig_packet
->packet
.nmb
;
866 BOOL loopback_this_packet
= False
;
867 BOOL use_null_rr_type
= False
;
868 const char *packet_type
= "unknown";
870 /* Check if we are sending to or from ourselves. */
871 if(ismyip(orig_packet
->ip
) && (orig_packet
->port
== global_nmb_port
))
872 loopback_this_packet
= True
;
874 nmb
= &packet
.packet
.nmb
;
876 /* Do a partial copy of the packet. We clear the locked flag and
877 the resource record pointers. */
878 packet
= *orig_packet
; /* Full structure copy. */
879 packet
.locked
= False
;
882 nmb
->additional
= NULL
;
886 packet_type
= "nmb_status";
887 nmb
->header
.nm_flags
.recursion_desired
= False
;
888 nmb
->header
.nm_flags
.recursion_available
= False
;
891 packet_type
= "nmb_query";
892 nmb
->header
.nm_flags
.recursion_desired
= True
;
893 nmb
->header
.nm_flags
.recursion_available
= True
;
895 use_null_rr_type
= True
;
899 case NMB_REG_REFRESH
:
900 packet_type
= "nmb_reg";
901 nmb
->header
.nm_flags
.recursion_desired
= True
;
902 nmb
->header
.nm_flags
.recursion_available
= True
;
905 packet_type
= "nmb_rel";
906 nmb
->header
.nm_flags
.recursion_desired
= False
;
907 nmb
->header
.nm_flags
.recursion_available
= False
;
910 packet_type
= "nmb_wack";
911 nmb
->header
.nm_flags
.recursion_desired
= False
;
912 nmb
->header
.nm_flags
.recursion_available
= False
;
913 use_null_rr_type
= True
;
916 packet_type
= "wins_reg";
917 nmb
->header
.nm_flags
.recursion_desired
= True
;
918 nmb
->header
.nm_flags
.recursion_available
= True
;
921 packet_type
= "wins_query";
922 nmb
->header
.nm_flags
.recursion_desired
= True
;
923 nmb
->header
.nm_flags
.recursion_available
= True
;
925 use_null_rr_type
= True
;
929 DEBUG(0,("reply_netbios_packet: Unknown packet type: %s %s to ip %s\n",
930 packet_type
, nmb_namestr(&orig_nmb
->question
.question_name
),
931 inet_ntoa(packet
.ip
)));
935 DEBUG(4,("reply_netbios_packet: sending a reply of packet type: %s %s to ip %s \
936 for id %hu\n", packet_type
, nmb_namestr(&orig_nmb
->question
.question_name
),
937 inet_ntoa(packet
.ip
), orig_nmb
->header
.name_trn_id
));
939 nmb
->header
.name_trn_id
= orig_nmb
->header
.name_trn_id
;
940 nmb
->header
.opcode
= opcode
;
941 nmb
->header
.response
= True
;
942 nmb
->header
.nm_flags
.bcast
= False
;
943 nmb
->header
.nm_flags
.trunc
= False
;
944 nmb
->header
.nm_flags
.authoritative
= True
;
946 nmb
->header
.rcode
= rcode
;
947 nmb
->header
.qdcount
= 0;
948 nmb
->header
.ancount
= 1;
949 nmb
->header
.nscount
= 0;
950 nmb
->header
.arcount
= 0;
952 memset((char*)&nmb
->question
,'\0',sizeof(nmb
->question
));
954 nmb
->answers
= &answers
;
955 memset((char*)nmb
->answers
,'\0',sizeof(*nmb
->answers
));
957 nmb
->answers
->rr_name
= orig_nmb
->question
.question_name
;
958 if (use_null_rr_type
) {
959 nmb
->answers
->rr_type
= RR_TYPE_NULL
;
961 nmb
->answers
->rr_type
= orig_nmb
->question
.question_type
;
963 nmb
->answers
->rr_class
= orig_nmb
->question
.question_class
;
964 nmb
->answers
->ttl
= ttl
;
967 nmb
->answers
->rdlength
= len
;
968 memcpy(nmb
->answers
->rdata
, data
, len
);
971 packet
.packet_type
= NMB_PACKET
;
972 /* Ensure we send out on the same fd that the original
973 packet came in on to give the correct source IP address. */
974 packet
.fd
= orig_packet
->fd
;
975 packet
.timestamp
= time(NULL
);
977 debug_nmb_packet(&packet
);
979 if(loopback_this_packet
) {
980 struct packet_struct
*lo_packet
;
981 DEBUG(5,("reply_netbios_packet: sending packet to ourselves.\n"));
982 if((lo_packet
= copy_packet(&packet
)) == NULL
)
984 queue_packet(lo_packet
);
985 } else if (!send_packet(&packet
)) {
986 DEBUG(0,("reply_netbios_packet: send_packet to IP %s port %d failed\n",
987 inet_ntoa(packet
.ip
),packet
.port
));
991 /*******************************************************************
992 Queue a packet into a packet queue
993 ******************************************************************/
995 static void queue_packet(struct packet_struct
*packet
)
997 struct packet_struct
*p
;
1000 packet
->prev
= NULL
;
1001 packet
->next
= NULL
;
1002 packet_queue
= packet
;
1006 /* find the bottom */
1007 for (p
=packet_queue
;p
->next
;p
=p
->next
)
1011 packet
->next
= NULL
;
1015 /****************************************************************************
1016 Try and find a matching subnet record for a datagram port 138 packet.
1017 ****************************************************************************/
1019 static struct subnet_record
*find_subnet_for_dgram_browse_packet(struct packet_struct
*p
)
1021 struct subnet_record
*subrec
;
1023 /* Go through all the broadcast subnets and see if the mask matches. */
1024 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
)) {
1025 if(same_net(p
->ip
, subrec
->bcast_ip
, subrec
->mask_ip
))
1029 /* If the subnet record is the remote announce broadcast subnet,
1030 hack it here to be the first subnet. This is really gross and
1031 is needed due to people turning on port 137/138 broadcast
1032 forwarding on their routers. May fire and brimstone rain
1036 return FIRST_SUBNET
;
1039 /****************************************************************************
1040 Dispatch a browse frame from port 138 to the correct processing function.
1041 ****************************************************************************/
1043 static void process_browse_packet(struct packet_struct
*p
, char *buf
,int len
)
1045 struct dgram_packet
*dgram
= &p
->packet
.dgram
;
1046 int command
= CVAL(buf
,0);
1047 struct subnet_record
*subrec
= find_subnet_for_dgram_browse_packet(p
);
1051 /* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
1052 pull_ascii(scope
, dgram
->dest_name
.scope
, 64, 64, STR_TERMINATE
);
1053 if (!strequal(scope
, global_scope())) {
1054 DEBUG(7,("process_browse_packet: Discarding datagram from IP %s. Scope (%s) \
1055 mismatch with our scope (%s).\n", inet_ntoa(p
->ip
), scope
, global_scope()));
1059 pull_ascii_nstring(src_name
, sizeof(src_name
), dgram
->source_name
.name
);
1060 if (is_myname(src_name
)) {
1061 DEBUG(0,("process_browse_packet: Discarding datagram from IP %s. Source name \
1062 %s is one of our names !\n", inet_ntoa(p
->ip
), nmb_namestr(&dgram
->source_name
)));
1067 case ANN_HostAnnouncement
:
1068 debug_browse_data(buf
, len
);
1069 process_host_announce(subrec
, p
, buf
+1);
1071 case ANN_DomainAnnouncement
:
1072 debug_browse_data(buf
, len
);
1073 process_workgroup_announce(subrec
, p
, buf
+1);
1075 case ANN_LocalMasterAnnouncement
:
1076 debug_browse_data(buf
, len
);
1077 process_local_master_announce(subrec
, p
, buf
+1);
1079 case ANN_AnnouncementRequest
:
1080 debug_browse_data(buf
, len
);
1081 process_announce_request(subrec
, p
, buf
+1);
1084 debug_browse_data(buf
, len
);
1085 process_election(subrec
, p
, buf
+1);
1087 case ANN_GetBackupListReq
:
1088 debug_browse_data(buf
, len
);
1089 process_get_backup_list_request(subrec
, p
, buf
+1);
1091 case ANN_GetBackupListResp
:
1092 debug_browse_data(buf
, len
);
1093 /* We never send ANN_GetBackupListReq so we should never get these. */
1094 DEBUG(0,("process_browse_packet: Discarding GetBackupListResponse \
1095 packet from %s IP %s\n", nmb_namestr(&dgram
->source_name
), inet_ntoa(p
->ip
)));
1097 case ANN_ResetBrowserState
:
1098 debug_browse_data(buf
, len
);
1099 process_reset_browser(subrec
, p
, buf
+1);
1101 case ANN_MasterAnnouncement
:
1102 /* Master browser datagrams must be processed on the unicast subnet. */
1103 subrec
= unicast_subnet
;
1105 debug_browse_data(buf
, len
);
1106 process_master_browser_announce(subrec
, p
, buf
+1);
1108 case ANN_BecomeBackup
:
1110 * We don't currently implement this. Log it just in case.
1112 debug_browse_data(buf
, len
);
1113 DEBUG(10,("process_browse_packet: On subnet %s ignoring browse packet \
1114 command ANN_BecomeBackup from %s IP %s to %s\n", subrec
->subnet_name
, nmb_namestr(&dgram
->source_name
),
1115 inet_ntoa(p
->ip
), nmb_namestr(&dgram
->dest_name
)));
1118 debug_browse_data(buf
, len
);
1119 DEBUG(0,("process_browse_packet: On subnet %s ignoring browse packet \
1120 command code %d from %s IP %s to %s\n", subrec
->subnet_name
, command
, nmb_namestr(&dgram
->source_name
),
1121 inet_ntoa(p
->ip
), nmb_namestr(&dgram
->dest_name
)));
1126 /****************************************************************************
1127 Dispatch a LanMan browse frame from port 138 to the correct processing function.
1128 ****************************************************************************/
1130 static void process_lanman_packet(struct packet_struct
*p
, char *buf
,int len
)
1132 struct dgram_packet
*dgram
= &p
->packet
.dgram
;
1133 int command
= SVAL(buf
,0);
1134 struct subnet_record
*subrec
= find_subnet_for_dgram_browse_packet(p
);
1138 /* Drop the packet if it's a different NetBIOS scope, or the source is from one of our names. */
1140 pull_ascii(scope
, dgram
->dest_name
.scope
, 64, 64, STR_TERMINATE
);
1141 if (!strequal(scope
, global_scope())) {
1142 DEBUG(7,("process_lanman_packet: Discarding datagram from IP %s. Scope (%s) \
1143 mismatch with our scope (%s).\n", inet_ntoa(p
->ip
), scope
, global_scope()));
1147 pull_ascii_nstring(src_name
, sizeof(src_name
), dgram
->source_name
.name
);
1148 if (is_myname(src_name
)) {
1149 DEBUG(0,("process_lanman_packet: Discarding datagram from IP %s. Source name \
1150 %s is one of our names !\n", inet_ntoa(p
->ip
), nmb_namestr(&dgram
->source_name
)));
1155 case ANN_HostAnnouncement
:
1156 debug_browse_data(buf
, len
);
1157 process_lm_host_announce(subrec
, p
, buf
+1);
1159 case ANN_AnnouncementRequest
:
1160 process_lm_announce_request(subrec
, p
, buf
+1);
1163 DEBUG(0,("process_lanman_packet: On subnet %s ignoring browse packet \
1164 command code %d from %s IP %s to %s\n", subrec
->subnet_name
, command
, nmb_namestr(&dgram
->source_name
),
1165 inet_ntoa(p
->ip
), nmb_namestr(&dgram
->dest_name
)));
1170 /****************************************************************************
1171 Determine if a packet is for us on port 138. Note that to have any chance of
1172 being efficient we need to drop as many packets as possible at this
1173 stage as subsequent processing is expensive.
1174 ****************************************************************************/
1176 static BOOL
listening(struct packet_struct
*p
,struct nmb_name
*nbname
)
1178 struct subnet_record
*subrec
= NULL
;
1180 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
)) {
1181 if(same_net(p
->ip
, subrec
->bcast_ip
, subrec
->mask_ip
))
1186 subrec
= unicast_subnet
;
1188 return (find_name_on_subnet(subrec
, nbname
, FIND_SELF_NAME
) != NULL
);
1191 /****************************************************************************
1192 Process udp 138 datagrams
1193 ****************************************************************************/
1195 static void process_dgram(struct packet_struct
*p
)
1200 struct dgram_packet
*dgram
= &p
->packet
.dgram
;
1202 /* If we aren't listening to the destination name then ignore the packet */
1203 if (!listening(p
,&dgram
->dest_name
)) {
1204 unexpected_packet(p
);
1205 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from %s\n",
1206 nmb_namestr(&dgram
->dest_name
), inet_ntoa(p
->ip
)));
1210 if (dgram
->header
.msg_type
!= 0x10 && dgram
->header
.msg_type
!= 0x11 && dgram
->header
.msg_type
!= 0x12) {
1211 unexpected_packet(p
);
1212 /* Don't process error packets etc yet */
1213 DEBUG(5,("process_dgram: ignoring dgram packet sent to name %s from IP %s as it is \
1214 an error packet of type %x\n", nmb_namestr(&dgram
->dest_name
), inet_ntoa(p
->ip
), dgram
->header
.msg_type
));
1218 /* Ensure we have a large enough packet before looking inside. */
1219 if (dgram
->datasize
< (smb_vwv12
- 2)) {
1220 /* That's the offset minus the 4 byte length + 2 bytes of offset. */
1221 DEBUG(0,("process_dgram: ignoring too short dgram packet (%u) sent to name %s from IP %s\n",
1222 (unsigned int)dgram
->datasize
,
1223 nmb_namestr(&dgram
->dest_name
),
1224 inet_ntoa(p
->ip
) ));
1228 buf
= &dgram
->data
[0];
1229 buf
-= 4; /* XXXX for the pseudo tcp length - someday I need to get rid of this */
1231 if (CVAL(buf
,smb_com
) != SMBtrans
)
1234 len
= SVAL(buf
,smb_vwv11
);
1235 buf2
= smb_base(buf
) + SVAL(buf
,smb_vwv12
);
1237 if (len
<= 0 || len
> dgram
->datasize
) {
1238 DEBUG(0,("process_dgram: ignoring malformed1 (datasize = %d, len = %d) datagram \
1239 packet sent to name %s from IP %s\n",
1242 nmb_namestr(&dgram
->dest_name
),
1243 inet_ntoa(p
->ip
) ));
1247 if (buf2
< dgram
->data
|| (buf2
>= dgram
->data
+ dgram
->datasize
)) {
1248 DEBUG(0,("process_dgram: ignoring malformed2 (datasize = %d, len=%d, off=%d) datagram \
1249 packet sent to name %s from IP %s\n",
1252 PTR_DIFF(buf2
, dgram
->data
),
1253 nmb_namestr(&dgram
->dest_name
),
1254 inet_ntoa(p
->ip
) ));
1258 if ((buf2
+ len
< dgram
->data
) || (buf2
+ len
> dgram
->data
+ dgram
->datasize
)) {
1259 DEBUG(0,("process_dgram: ignoring malformed3 (datasize = %d, len=%d, off=%d) datagram \
1260 packet sent to name %s from IP %s\n",
1263 PTR_DIFF(buf2
, dgram
->data
),
1264 nmb_namestr(&dgram
->dest_name
),
1265 inet_ntoa(p
->ip
) ));
1269 DEBUG(4,("process_dgram: datagram from %s to %s IP %s for %s of type %d len=%d\n",
1270 nmb_namestr(&dgram
->source_name
),nmb_namestr(&dgram
->dest_name
),
1271 inet_ntoa(p
->ip
), smb_buf(buf
),CVAL(buf2
,0),len
));
1273 /* Datagram packet received for the browser mailslot */
1274 if (strequal(smb_buf(buf
),BROWSE_MAILSLOT
)) {
1275 process_browse_packet(p
,buf2
,len
);
1279 /* Datagram packet received for the LAN Manager mailslot */
1280 if (strequal(smb_buf(buf
),LANMAN_MAILSLOT
)) {
1281 process_lanman_packet(p
,buf2
,len
);
1285 /* Datagram packet received for the domain logon mailslot */
1286 if (strequal(smb_buf(buf
),NET_LOGON_MAILSLOT
)) {
1287 process_logon_packet(p
,buf2
,len
,NET_LOGON_MAILSLOT
);
1291 /* Datagram packet received for the NT domain logon mailslot */
1292 if (strequal(smb_buf(buf
),NT_LOGON_MAILSLOT
)) {
1293 process_logon_packet(p
,buf2
,len
,NT_LOGON_MAILSLOT
);
1297 unexpected_packet(p
);
1300 /****************************************************************************
1301 Validate a response nmb packet.
1302 ****************************************************************************/
1304 static BOOL
validate_nmb_response_packet( struct nmb_packet
*nmb
)
1306 BOOL ignore
= False
;
1308 switch (nmb
->header
.opcode
) {
1309 case NMB_NAME_REG_OPCODE
:
1310 case NMB_NAME_REFRESH_OPCODE_8
: /* ambiguity in rfc1002 about which is correct. */
1311 case NMB_NAME_REFRESH_OPCODE_9
: /* WinNT uses 8 by default. */
1312 if (nmb
->header
.ancount
== 0) {
1313 DEBUG(0,("validate_nmb_response_packet: Bad REG/REFRESH Packet. "));
1318 case NMB_NAME_QUERY_OPCODE
:
1319 if ((nmb
->header
.ancount
!= 0) && (nmb
->header
.ancount
!= 1)) {
1320 DEBUG(0,("validate_nmb_response_packet: Bad QUERY Packet. "));
1325 case NMB_NAME_RELEASE_OPCODE
:
1326 if (nmb
->header
.ancount
== 0) {
1327 DEBUG(0,("validate_nmb_response_packet: Bad RELEASE Packet. "));
1332 case NMB_WACK_OPCODE
:
1333 /* Check WACK response here. */
1334 if (nmb
->header
.ancount
!= 1) {
1335 DEBUG(0,("validate_nmb_response_packet: Bad WACK Packet. "));
1340 DEBUG(0,("validate_nmb_response_packet: Ignoring packet with unknown opcode %d.\n",
1341 nmb
->header
.opcode
));
1346 DEBUG(0,("Ignoring response packet with opcode %d.\n", nmb
->header
.opcode
));
1351 /****************************************************************************
1352 Validate a request nmb packet.
1353 ****************************************************************************/
1355 static BOOL
validate_nmb_packet( struct nmb_packet
*nmb
)
1357 BOOL ignore
= False
;
1359 switch (nmb
->header
.opcode
) {
1360 case NMB_NAME_REG_OPCODE
:
1361 case NMB_NAME_REFRESH_OPCODE_8
: /* ambiguity in rfc1002 about which is correct. */
1362 case NMB_NAME_REFRESH_OPCODE_9
: /* WinNT uses 8 by default. */
1363 case NMB_NAME_MULTIHOMED_REG_OPCODE
:
1364 if (nmb
->header
.qdcount
==0 || nmb
->header
.arcount
==0) {
1365 DEBUG(0,("validate_nmb_packet: Bad REG/REFRESH Packet. "));
1370 case NMB_NAME_QUERY_OPCODE
:
1371 if ((nmb
->header
.qdcount
== 0) || ((nmb
->question
.question_type
!= QUESTION_TYPE_NB_QUERY
) &&
1372 (nmb
->question
.question_type
!= QUESTION_TYPE_NB_STATUS
))) {
1373 DEBUG(0,("validate_nmb_packet: Bad QUERY Packet. "));
1378 case NMB_NAME_RELEASE_OPCODE
:
1379 if (nmb
->header
.qdcount
==0 || nmb
->header
.arcount
==0) {
1380 DEBUG(0,("validate_nmb_packet: Bad RELEASE Packet. "));
1385 DEBUG(0,("validate_nmb_packet: Ignoring packet with unknown opcode %d.\n",
1386 nmb
->header
.opcode
));
1391 DEBUG(0,("validate_nmb_packet: Ignoring request packet with opcode %d.\n", nmb
->header
.opcode
));
1396 /****************************************************************************
1397 Find a subnet (and potentially a response record) for a packet.
1398 ****************************************************************************/
1400 static struct subnet_record
*find_subnet_for_nmb_packet( struct packet_struct
*p
,
1401 struct response_record
**pprrec
)
1403 struct nmb_packet
*nmb
= &p
->packet
.nmb
;
1404 struct response_record
*rrec
= NULL
;
1405 struct subnet_record
*subrec
= NULL
;
1410 if(nmb
->header
.response
) {
1411 /* It's a response packet. Find a record for it or it's an error. */
1413 rrec
= find_response_record( &subrec
, nmb
->header
.name_trn_id
);
1415 DEBUG(3,("find_subnet_for_nmb_packet: response record not found for response id %hu\n",
1416 nmb
->header
.name_trn_id
));
1417 unexpected_packet(p
);
1421 if(subrec
== NULL
) {
1422 DEBUG(0,("find_subnet_for_nmb_packet: subnet record not found for response id %hu\n",
1423 nmb
->header
.name_trn_id
));
1432 /* Try and see what subnet this packet belongs to. */
1435 if(packet_is_for_wins_server(p
))
1436 return wins_server_subnet
;
1438 /* If it wasn't a broadcast packet then send to the UNICAST subnet. */
1439 if(nmb
->header
.nm_flags
.bcast
== False
)
1440 return unicast_subnet
;
1442 /* Go through all the broadcast subnets and see if the mask matches. */
1443 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
)) {
1444 if(same_net(p
->ip
, subrec
->bcast_ip
, subrec
->mask_ip
))
1448 /* If none match it must have been a directed broadcast - assign the remote_broadcast_subnet. */
1449 return remote_broadcast_subnet
;
1452 /****************************************************************************
1453 Process a nmb request packet - validate the packet and route it.
1454 ****************************************************************************/
1456 static void process_nmb_request(struct packet_struct
*p
)
1458 struct nmb_packet
*nmb
= &p
->packet
.nmb
;
1459 struct subnet_record
*subrec
= NULL
;
1461 debug_nmb_packet(p
);
1463 /* Ensure we have a good packet. */
1464 if(validate_nmb_packet(nmb
))
1467 /* Allocate a subnet to this packet - if we cannot - fail. */
1468 if((subrec
= find_subnet_for_nmb_packet(p
, NULL
))==NULL
)
1471 switch (nmb
->header
.opcode
) {
1472 case NMB_NAME_REG_OPCODE
:
1473 if(subrec
== wins_server_subnet
)
1474 wins_process_name_registration_request(subrec
, p
);
1476 process_name_registration_request(subrec
, p
);
1479 case NMB_NAME_REFRESH_OPCODE_8
: /* ambiguity in rfc1002 about which is correct. */
1480 case NMB_NAME_REFRESH_OPCODE_9
:
1481 if(subrec
== wins_server_subnet
)
1482 wins_process_name_refresh_request(subrec
, p
);
1484 process_name_refresh_request(subrec
, p
);
1487 case NMB_NAME_MULTIHOMED_REG_OPCODE
:
1488 if(subrec
== wins_server_subnet
) {
1489 wins_process_multihomed_name_registration_request(subrec
, p
);
1491 DEBUG(0,("process_nmb_request: Multihomed registration request must be \
1492 directed at a WINS server.\n"));
1496 case NMB_NAME_QUERY_OPCODE
:
1497 switch (nmb
->question
.question_type
) {
1498 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
);
1504 case QUESTION_TYPE_NB_STATUS
:
1505 if(subrec
== wins_server_subnet
) {
1506 DEBUG(0,("process_nmb_request: NB_STATUS request directed at WINS server is \
1510 process_node_status_request(subrec
, p
);
1516 case NMB_NAME_RELEASE_OPCODE
:
1517 if(subrec
== wins_server_subnet
)
1518 wins_process_name_release_request(subrec
, p
);
1520 process_name_release_request(subrec
, p
);
1525 /****************************************************************************
1526 Process a nmb response packet - validate the packet and route it.
1527 to either the WINS server or a normal response.
1528 ****************************************************************************/
1530 static void process_nmb_response(struct packet_struct
*p
)
1532 struct nmb_packet
*nmb
= &p
->packet
.nmb
;
1533 struct subnet_record
*subrec
= NULL
;
1534 struct response_record
*rrec
= NULL
;
1536 debug_nmb_packet(p
);
1538 if(validate_nmb_response_packet(nmb
))
1541 if((subrec
= find_subnet_for_nmb_packet(p
, &rrec
))==NULL
)
1545 DEBUG(0,("process_nmb_response: response packet received but no response record \
1546 found for id = %hu. Ignoring packet.\n", nmb
->header
.name_trn_id
));
1550 /* Increment the number of responses received for this record. */
1552 /* Ensure we don't re-send the request. */
1553 rrec
->repeat_count
= 0;
1555 /* Call the response received function for this packet. */
1556 (*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
)) {
1568 packet_queue
= p
->next
;
1570 packet_queue
->prev
= NULL
;
1571 p
->next
= p
->prev
= NULL
;
1573 switch (p
->packet_type
) {
1575 if(p
->packet
.nmb
.header
.response
)
1576 process_nmb_response(p
);
1578 process_nmb_request(p
);
1589 /*******************************************************************
1590 Retransmit or timeout elements from all the outgoing subnet response
1591 record queues. NOTE that this code must also check the WINS server
1592 subnet for response records to timeout as the WINS server code
1593 can send requests to check if a client still owns a name.
1594 (Patch from Andrey Alekseyev <fetch@muffin.arcadia.spb.ru>).
1595 ******************************************************************/
1597 void retransmit_or_expire_response_records(time_t t
)
1599 struct subnet_record
*subrec
;
1601 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= get_next_subnet_maybe_unicast_or_wins_server(subrec
)) {
1602 struct response_record
*rrec
, *nextrrec
;
1604 for (rrec
= subrec
->responselist
; rrec
; rrec
= nextrrec
) {
1605 nextrrec
= rrec
->next
;
1607 if (rrec
->repeat_time
<= t
) {
1608 if (rrec
->repeat_count
> 0) {
1609 /* Resend while we have a non-zero repeat_count. */
1610 if(!send_packet(rrec
->packet
)) {
1611 DEBUG(0,("retransmit_or_expire_response_records: Failed to resend packet id %hu \
1612 to IP %s on subnet %s\n", rrec
->response_id
, inet_ntoa(rrec
->packet
->ip
), subrec
->subnet_name
));
1614 rrec
->repeat_time
= t
+ rrec
->repeat_interval
;
1615 rrec
->repeat_count
--;
1617 DEBUG(4,("retransmit_or_expire_response_records: timeout for packet id %hu to IP %s \
1618 on subnet %s\n", rrec
->response_id
, inet_ntoa(rrec
->packet
->ip
), subrec
->subnet_name
));
1621 * Check the flag in this record to prevent recursion if we end
1622 * up in this function again via the timeout function call.
1625 if(!rrec
->in_expiration_processing
) {
1628 * Set the recursion protection flag in this record.
1631 rrec
->in_expiration_processing
= True
;
1633 /* Call the timeout function. This will deal with removing the
1634 timed out packet. */
1635 if(rrec
->timeout_fn
) {
1636 (*rrec
->timeout_fn
)(subrec
, rrec
);
1638 /* We must remove the record ourself if there is
1639 no timeout function. */
1640 remove_response_record(subrec
, rrec
);
1642 } /* !rrec->in_expitation_processing */
1643 } /* rrec->repeat_count > 0 */
1644 } /* rrec->repeat_time <= t */
1645 } /* end for rrec */
1646 } /* end for subnet */
1649 /****************************************************************************
1650 Create an fd_set containing all the sockets in the subnet structures,
1651 plus the broadcast sockets.
1652 ***************************************************************************/
1654 static BOOL
create_listen_fdset(fd_set
**ppset
, int **psock_array
, int *listen_number
, int *maxfd
)
1656 int *sock_array
= NULL
;
1657 struct subnet_record
*subrec
= NULL
;
1660 fd_set
*pset
= SMB_MALLOC_P(fd_set
);
1663 DEBUG(0,("create_listen_fdset: malloc fail !\n"));
1667 /* Check that we can add all the fd's we need. */
1668 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
))
1671 if((count
*2) + 2 > FD_SETSIZE
) {
1672 DEBUG(0,("create_listen_fdset: Too many file descriptors needed (%d). We can \
1673 only use %d.\n", (count
*2) + 2, FD_SETSIZE
));
1677 if((sock_array
= SMB_MALLOC_ARRAY(int, (count
*2) + 2)) == NULL
) {
1678 DEBUG(0,("create_listen_fdset: malloc fail for socket array.\n"));
1684 /* Add in the broadcast socket on 137. */
1685 FD_SET(ClientNMB
,pset
);
1686 sock_array
[num
++] = ClientNMB
;
1687 *maxfd
= MAX( *maxfd
, ClientNMB
);
1689 /* Add in the 137 sockets on all the interfaces. */
1690 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
)) {
1691 FD_SET(subrec
->nmb_sock
,pset
);
1692 sock_array
[num
++] = subrec
->nmb_sock
;
1693 *maxfd
= MAX( *maxfd
, subrec
->nmb_sock
);
1696 /* Add in the broadcast socket on 138. */
1697 FD_SET(ClientDGRAM
,pset
);
1698 sock_array
[num
++] = ClientDGRAM
;
1699 *maxfd
= MAX( *maxfd
, ClientDGRAM
);
1701 /* Add in the 138 sockets on all the interfaces. */
1702 for (subrec
= FIRST_SUBNET
; subrec
; subrec
= NEXT_SUBNET_EXCLUDING_UNICAST(subrec
)) {
1703 FD_SET(subrec
->dgram_sock
,pset
);
1704 sock_array
[num
++] = subrec
->dgram_sock
;
1705 *maxfd
= MAX( *maxfd
, subrec
->dgram_sock
);
1708 *listen_number
= (count
*2) + 2;
1711 SAFE_FREE(*psock_array
);
1714 *psock_array
= sock_array
;
1719 /****************************************************************************
1720 Listens for NMB or DGRAM packets, and queues them.
1721 return True if the socket is dead
1722 ***************************************************************************/
1724 BOOL
listen_for_packets(BOOL run_election
)
1726 static fd_set
*listen_set
= NULL
;
1727 static int listen_number
= 0;
1728 static int *sock_array
= NULL
;
1730 static int maxfd
= 0;
1734 struct timeval timeout
;
1739 if(listen_set
== NULL
|| rescan_listen_set
) {
1740 if(create_listen_fdset(&listen_set
, &sock_array
, &listen_number
, &maxfd
)) {
1741 DEBUG(0,("listen_for_packets: Fatal error. unable to create listen set. Exiting.\n"));
1744 rescan_listen_set
= False
;
1747 memcpy((char *)&fds
, (char *)listen_set
, sizeof(fd_set
));
1750 dns_fd
= asyncdns_fd();
1752 FD_SET(dns_fd
, &fds
);
1753 maxfd
= MAX( maxfd
, dns_fd
);
1758 * During elections and when expecting a netbios response packet we
1759 * need to send election packets at tighter intervals.
1760 * Ideally it needs to be the interval (in ms) between time now and
1761 * the time we are expecting the next netbios packet.
1764 timeout
.tv_sec
= (run_election
||num_response_packets
) ? 1 : NMBD_SELECT_LOOP
;
1765 timeout
.tv_usec
= 0;
1767 /* Prepare for the select - allow certain signals. */
1769 BlockSignals(False
, SIGTERM
);
1771 selrtn
= sys_select(maxfd
+1,&fds
,NULL
,NULL
,&timeout
);
1773 /* We can only take signals when we are in the select - block them again here. */
1775 BlockSignals(True
, SIGTERM
);
1782 if (dns_fd
!= -1 && FD_ISSET(dns_fd
,&fds
)) {
1787 for(i
= 0; i
< listen_number
; i
++) {
1788 if (i
< (listen_number
/2)) {
1789 /* Processing a 137 socket. */
1790 if (FD_ISSET(sock_array
[i
],&fds
)) {
1791 struct packet_struct
*packet
= read_packet(sock_array
[i
], NMB_PACKET
);
1794 * If we got a packet on the broadcast socket and interfaces
1795 * only is set then check it came from one of our local nets.
1797 if(lp_bind_interfaces_only() && (sock_array
[i
] == ClientNMB
) &&
1798 (!is_local_net(packet
->ip
))) {
1799 DEBUG(7,("discarding nmb packet sent to broadcast socket from %s:%d\n",
1800 inet_ntoa(packet
->ip
),packet
->port
));
1801 free_packet(packet
);
1802 } else if ((ip_equal(loopback_ip
, packet
->ip
) ||
1803 ismyip(packet
->ip
)) && packet
->port
== global_nmb_port
&&
1804 packet
->packet
.nmb
.header
.nm_flags
.bcast
) {
1805 DEBUG(7,("discarding own bcast packet from %s:%d\n",
1806 inet_ntoa(packet
->ip
),packet
->port
));
1807 free_packet(packet
);
1809 /* Save the file descriptor this packet came in on. */
1810 packet
->fd
= sock_array
[i
];
1811 queue_packet(packet
);
1816 /* Processing a 138 socket. */
1817 if (FD_ISSET(sock_array
[i
],&fds
)) {
1818 struct packet_struct
*packet
= read_packet(sock_array
[i
], DGRAM_PACKET
);
1821 * If we got a packet on the broadcast socket and interfaces
1822 * only is set then check it came from one of our local nets.
1824 if(lp_bind_interfaces_only() && (sock_array
[i
] == ClientDGRAM
) &&
1825 (!is_local_net(packet
->ip
))) {
1826 DEBUG(7,("discarding dgram packet sent to broadcast socket from %s:%d\n",
1827 inet_ntoa(packet
->ip
),packet
->port
));
1828 free_packet(packet
);
1829 } else if ((ip_equal(loopback_ip
, packet
->ip
) ||
1830 ismyip(packet
->ip
)) && packet
->port
== DGRAM_PORT
) {
1831 DEBUG(7,("discarding own dgram packet from %s:%d\n",
1832 inet_ntoa(packet
->ip
),packet
->port
));
1833 free_packet(packet
);
1835 /* Save the file descriptor this packet came in on. */
1836 packet
->fd
= sock_array
[i
];
1837 queue_packet(packet
);
1841 } /* end processing 138 socket. */
1846 /****************************************************************************
1847 Construct and send a netbios DGRAM.
1848 **************************************************************************/
1850 BOOL
send_mailslot(BOOL unique
, const char *mailslot
,char *buf
, size_t len
,
1851 const char *srcname
, int src_type
,
1852 const char *dstname
, int dest_type
,
1853 struct in_addr dest_ip
,struct in_addr src_ip
,
1856 BOOL loopback_this_packet
= False
;
1857 struct packet_struct p
;
1858 struct dgram_packet
*dgram
= &p
.packet
.dgram
;
1862 memset((char *)&p
,'\0',sizeof(p
));
1864 if(ismyip(dest_ip
) && (dest_port
== DGRAM_PORT
)) /* Only if to DGRAM_PORT */
1865 loopback_this_packet
= True
;
1867 /* generate_name_trn_id(); */ /* Not used, so gone, RJS */
1869 /* DIRECT GROUP or UNIQUE datagram. */
1870 dgram
->header
.msg_type
= unique
? 0x10 : 0x11;
1871 dgram
->header
.flags
.node_type
= M_NODE
;
1872 dgram
->header
.flags
.first
= True
;
1873 dgram
->header
.flags
.more
= False
;
1874 dgram
->header
.dgm_id
= generate_name_trn_id();
1875 dgram
->header
.source_ip
= src_ip
;
1876 dgram
->header
.source_port
= DGRAM_PORT
;
1877 dgram
->header
.dgm_length
= 0; /* Let build_dgram() handle this. */
1878 dgram
->header
.packet_offset
= 0;
1880 make_nmb_name(&dgram
->source_name
,srcname
,src_type
);
1881 make_nmb_name(&dgram
->dest_name
,dstname
,dest_type
);
1883 ptr
= &dgram
->data
[0];
1885 /* Setup the smb part. */
1886 ptr
-= 4; /* XXX Ugliness because of handling of tcp SMB length. */
1888 set_message(ptr
,17,strlen(mailslot
) + 1 + len
,True
);
1891 SCVAL(ptr
,smb_com
,SMBtrans
);
1892 SSVAL(ptr
,smb_vwv1
,len
);
1893 SSVAL(ptr
,smb_vwv11
,len
);
1894 SSVAL(ptr
,smb_vwv12
,70 + strlen(mailslot
));
1895 SSVAL(ptr
,smb_vwv13
,3);
1896 SSVAL(ptr
,smb_vwv14
,1);
1897 SSVAL(ptr
,smb_vwv15
,1);
1898 SSVAL(ptr
,smb_vwv16
,2);
1900 safe_strcpy_base(p2
, mailslot
, dgram
->data
, sizeof(dgram
->data
));
1901 p2
= skip_string(p2
,1);
1903 if (((p2
+len
) > dgram
->data
+sizeof(dgram
->data
)) || ((p2
+len
) < p2
)) {
1904 DEBUG(0, ("send_mailslot: Cannot write beyond end of packet\n"));
1911 dgram
->datasize
= PTR_DIFF(p2
,ptr
+4); /* +4 for tcp length. */
1915 p
.fd
= find_subnet_mailslot_fd_for_address( src_ip
);
1916 p
.timestamp
= time(NULL
);
1917 p
.packet_type
= DGRAM_PACKET
;
1919 DEBUG(4,("send_mailslot: Sending to mailslot %s from %s IP %s ", mailslot
,
1920 nmb_namestr(&dgram
->source_name
), inet_ntoa(src_ip
)));
1921 DEBUG(4,("to %s IP %s\n", nmb_namestr(&dgram
->dest_name
), inet_ntoa(dest_ip
)));
1923 debug_browse_data(buf
, len
);
1925 if(loopback_this_packet
) {
1926 struct packet_struct
*lo_packet
= NULL
;
1927 DEBUG(5,("send_mailslot: sending packet to ourselves.\n"));
1928 if((lo_packet
= copy_packet(&p
)) == NULL
)
1930 queue_packet(lo_packet
);
1933 return(send_packet(&p
));