xref: /titanic_52/usr/src/lib/smbsrv/libsmbns/common/smbns_netbios.h (revision a0aa776e20803c84edd153d9cb584fd67163aef3)
1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
2229bd2886SAlan Wright  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23da6c28aaSamw  * Use is subject to license terms.
24da6c28aaSamw  */
25da6c28aaSamw 
26da6c28aaSamw #ifndef _SMB_NETBIOS_H_
27da6c28aaSamw #define	_SMB_NETBIOS_H_
28da6c28aaSamw 
29da6c28aaSamw #include <stdio.h>
30da6c28aaSamw #include <synch.h>
31da6c28aaSamw #include <pthread.h>
32da6c28aaSamw #include <strings.h>
33da6c28aaSamw #include <netinet/in.h>
34da6c28aaSamw 
35da6c28aaSamw #include <smbsrv/libsmbns.h>
36da6c28aaSamw 
37da6c28aaSamw #include <smbsrv/smbinfo.h>
38da6c28aaSamw #include <smbsrv/netbios.h>
39da6c28aaSamw 
40da6c28aaSamw #define	QUEUE_INSERT_TAIL(q, e) \
41da6c28aaSamw 	((e)->back) = (void *)((q)->back);	\
42da6c28aaSamw 	((e)->forw) = (void *)(q);		\
43da6c28aaSamw 	((q)->back->forw) = (void *)(e);	\
44da6c28aaSamw 	((q)->back) = (void *)(e);
45da6c28aaSamw 
46da6c28aaSamw #define	QUEUE_CLIP(e) \
47da6c28aaSamw 	(e)->forw->back = (e)->back;	\
48da6c28aaSamw 	(e)->back->forw = (e)->forw;	\
49da6c28aaSamw 	(e)->forw = 0;			\
50da6c28aaSamw 	(e)->back = 0;
51da6c28aaSamw 
52*a0aa776eSAlan Wright typedef enum {
53*a0aa776eSAlan Wright 	NETBIOS_EVENT_START = 0,
54*a0aa776eSAlan Wright 	NETBIOS_EVENT_STOP,
55*a0aa776eSAlan Wright 	NETBIOS_EVENT_RESET,
56*a0aa776eSAlan Wright 	NETBIOS_EVENT_NS_START,
57*a0aa776eSAlan Wright 	NETBIOS_EVENT_NS_STOP,
58*a0aa776eSAlan Wright 	NETBIOS_EVENT_DGM_START,
59*a0aa776eSAlan Wright 	NETBIOS_EVENT_DGM_STOP,
60*a0aa776eSAlan Wright 	NETBIOS_EVENT_BROWSER_START,
61*a0aa776eSAlan Wright 	NETBIOS_EVENT_BROWSER_STOP,
62*a0aa776eSAlan Wright 	NETBIOS_EVENT_TIMER_START,
63*a0aa776eSAlan Wright 	NETBIOS_EVENT_TIMER_STOP,
64*a0aa776eSAlan Wright 	NETBIOS_EVENT_ERROR,
65*a0aa776eSAlan Wright 	NETBIOS_EVENT_DUMP
66*a0aa776eSAlan Wright } netbios_event_t;
67da6c28aaSamw 
68*a0aa776eSAlan Wright typedef enum {
69*a0aa776eSAlan Wright 	NETBIOS_STATE_INIT = 0,
70*a0aa776eSAlan Wright 	NETBIOS_STATE_RUNNING,
71*a0aa776eSAlan Wright 	NETBIOS_STATE_CLOSING,
72*a0aa776eSAlan Wright 	NETBIOS_STATE_ERROR
73*a0aa776eSAlan Wright } netbios_state_t;
74da6c28aaSamw 
75*a0aa776eSAlan Wright typedef struct {
76*a0aa776eSAlan Wright 	pthread_t	s_tid;
77*a0aa776eSAlan Wright 	boolean_t	s_up;
78*a0aa776eSAlan Wright } netbios_svc_t;
79da6c28aaSamw 
80*a0aa776eSAlan Wright typedef struct {
81*a0aa776eSAlan Wright 	mutex_t		nbs_mtx;
82*a0aa776eSAlan Wright 	cond_t		nbs_cv;
83*a0aa776eSAlan Wright 	netbios_svc_t	nbs_ns;
84*a0aa776eSAlan Wright 	netbios_svc_t	nbs_dgm;
85*a0aa776eSAlan Wright 	netbios_svc_t	nbs_browser;
86*a0aa776eSAlan Wright 	netbios_svc_t	nbs_timer;
87*a0aa776eSAlan Wright 	netbios_state_t	nbs_state;
88*a0aa776eSAlan Wright 	uint32_t	nbs_errors;
89*a0aa776eSAlan Wright 	char		*nbs_last_event;
90*a0aa776eSAlan Wright } netbios_service_t;
91da6c28aaSamw 
92da6c28aaSamw char smb_node_type;
93da6c28aaSamw 
947b59d02dSjb150015 #define	SMB_NODETYPE_B	'B'
957b59d02dSjb150015 #define	SMB_NODETYPE_P	'P'
967b59d02dSjb150015 #define	SMB_NODETYPE_M	'M'
977b59d02dSjb150015 #define	SMB_NODETYPE_H	'H'
987b59d02dSjb150015 
99da6c28aaSamw /*
100da6c28aaSamw  * NAME service definitions
101da6c28aaSamw  */
102da6c28aaSamw #define	ADDR_FLAG_INVALID		0x0000
103da6c28aaSamw #define	ADDR_FLAG_VALID		0x0001
104da6c28aaSamw 
105da6c28aaSamw typedef struct addr_entry {
106da6c28aaSamw 	struct addr_entry 	*forw;
107da6c28aaSamw 	struct addr_entry 	*back;
108da6c28aaSamw 	uint32_t		attributes;
109da6c28aaSamw 	uint32_t		conflict_timer;
110da6c28aaSamw 	uint32_t		refresh_ttl;
111da6c28aaSamw 	uint32_t		ttl;
112da6c28aaSamw 	struct sockaddr_in	sin;
113da6c28aaSamw 	int			sinlen;
114da6c28aaSamw 	uint32_t 		flags;
115da6c28aaSamw } addr_entry_t;
116da6c28aaSamw 
117da6c28aaSamw /*
118da6c28aaSamw  *   The NODE_NAME ARRAY is an array of zero or more NUM_NAMES entries
119da6c28aaSamw  *   of NODE_NAME records.  Each NODE_NAME entry represents an active
120da6c28aaSamw  *   name in the same NetBIOS scope as the requesting name in the
121da6c28aaSamw  *   local name table of the responder.  RR_NAME is the requesting
122da6c28aaSamw  *   name.
123da6c28aaSamw  *
124da6c28aaSamw  *   NODE_NAME Entry:
125da6c28aaSamw  *
126da6c28aaSamw  *                        1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
127da6c28aaSamw  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
128da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
129da6c28aaSamw  *   |                                                               |
130da6c28aaSamw  *   +---                                                         ---+
131da6c28aaSamw  *   |                                                               |
132da6c28aaSamw  *   +---                    NETBIOS FORMAT NAME                  ---+
133da6c28aaSamw  *   |                                                               |
134da6c28aaSamw  *   +---                                                         ---+
135da6c28aaSamw  *   |                                                               |
136da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
137da6c28aaSamw  *   |         NAME_FLAGS            |
138da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
139da6c28aaSamw  *
140da6c28aaSamw  *   The NAME_FLAGS field:
141da6c28aaSamw  *
142da6c28aaSamw  *                                             1   1   1   1   1   1
143da6c28aaSamw  *     0   1   2   3   4   5   6   7   8   9   0   1   2   3   4   5
144da6c28aaSamw  *   +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
145da6c28aaSamw  *   | G |  ONT  |DRG|CNF|ACT|PRM|          RESERVED                 |
146da6c28aaSamw  *   +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
147da6c28aaSamw  *
148da6c28aaSamw  *   The NAME_FLAGS field is defined as:
149da6c28aaSamw  *
150da6c28aaSamw  *   Symbol     Bit(s)   Description:
151da6c28aaSamw  *
152da6c28aaSamw  *   RESERVED     7-15   Reserved for future use.  Must be zero (0).
153da6c28aaSamw  *   PRM             6   Permanent Name Flag.  If one (1) then entry
154da6c28aaSamw  *                       is for the permanent node name.  Flag is zero
155da6c28aaSamw  *                       (0) for all other names.
156da6c28aaSamw  *   ACT             5   Active Name Flag.  All entries have this flag
157da6c28aaSamw  *                       set to one (1).
158da6c28aaSamw  *   CNF             4   Conflict Flag.  If one (1) then name on this
159da6c28aaSamw  *                       node is in conflict.
160da6c28aaSamw  *   DRG             3   Deregister Flag.  If one (1) then this name
161da6c28aaSamw  *                       is in the process of being deleted.
162da6c28aaSamw  *   ONT           1,2   Owner Node Type:
163da6c28aaSamw  *                          00 = B node
164da6c28aaSamw  *                          01 = P node
165da6c28aaSamw  *                          10 = M node
166da6c28aaSamw  *                          11 = Reserved for future use
167da6c28aaSamw  *   G               0   Group Name Flag.
168da6c28aaSamw  *                       name.
169da6c28aaSamw  *                       If zero (0) then it is a UNIQUE NetBIOS name.
170da6c28aaSamw  */
171da6c28aaSamw 
172da6c28aaSamw typedef struct name_entry {
173da6c28aaSamw 	struct name_entry 	*forw;
174da6c28aaSamw 	struct name_entry 	*back;
175da6c28aaSamw 	unsigned char		name[NETBIOS_NAME_SZ];
176da6c28aaSamw 	unsigned char		scope[NETBIOS_DOMAIN_NAME_MAX];
177da6c28aaSamw 	unsigned short		attributes;
178da6c28aaSamw 	struct addr_entry	addr_list;
179da6c28aaSamw 	mutex_t			mtx;
1807b59d02dSjb150015 } name_entry_t;
181da6c28aaSamw 
182da6c28aaSamw struct name_question {
183da6c28aaSamw 	struct name_entry 	*name;
184da6c28aaSamw 	unsigned		question_type;
185da6c28aaSamw 	unsigned		question_class;
186da6c28aaSamw };
187da6c28aaSamw 
188da6c28aaSamw struct resource_record {
189da6c28aaSamw 	/*
190da6c28aaSamw 	 * These two flags and address are contained within RDATA
191da6c28aaSamw 	 * when rr_type==0x0020 (NB - NetBIOS general Name Service)
192da6c28aaSamw 	 * and rr_class==0x01 (IN - Internet Class).
193da6c28aaSamw 	 */
194da6c28aaSamw 
195da6c28aaSamw 	struct name_entry *name;
196da6c28aaSamw 	unsigned short rr_type;
197da6c28aaSamw 	unsigned short rr_class;
198da6c28aaSamw 	uint32_t ttl;
199da6c28aaSamw 	unsigned short rdlength;
200da6c28aaSamw 	unsigned char *rdata;
201da6c28aaSamw };
202da6c28aaSamw 
203da6c28aaSamw struct name_packet {
204da6c28aaSamw 	unsigned short		name_trn_id;
205da6c28aaSamw 	unsigned short		info;
206da6c28aaSamw 
207da6c28aaSamw 	unsigned		qdcount;	/* question entries */
208da6c28aaSamw 	unsigned		ancount;	/* answer recs */
209da6c28aaSamw 	unsigned		nscount;	/* authority recs */
210da6c28aaSamw 	unsigned		arcount;	/* additional recs */
211da6c28aaSamw 
212da6c28aaSamw 	struct name_question 	*question;
213da6c28aaSamw 	struct resource_record 	*answer;
214da6c28aaSamw 	struct resource_record 	*authority;
215da6c28aaSamw 	struct resource_record 	*additional;
216da6c28aaSamw 
217da6c28aaSamw 	unsigned char			block_data[4];	/* begining of space */
218da6c28aaSamw };
219da6c28aaSamw 
220da6c28aaSamw #define	NAME_OPCODE_R		0x8000	/* RESPONSE flag: 1 bit */
221da6c28aaSamw #define	NAME_OPCODE_OPCODE_MASK	0x7800	/* OPCODE Field: 4 bits */
222da6c28aaSamw #define	NAME_OPCODE_QUERY	0x0000
223da6c28aaSamw #define	NAME_OPCODE_REGISTRATION	0x2800
224da6c28aaSamw #define	NAME_OPCODE_RELEASE	0x3000
225da6c28aaSamw #define	NAME_OPCODE_WACK	0x3800
226da6c28aaSamw #define	NAME_OPCODE_REFRESH	0x4000
227da6c28aaSamw #define	NAME_OPCODE_MULTIHOME	0x7800
228da6c28aaSamw #define	NAME_NM_FLAGS_AA	0x0400	/* Authoritative Answer:1 bit */
229da6c28aaSamw #define	NAME_NM_FLAGS_TC	0x0200	/* Truncation:		1 bit */
230da6c28aaSamw #define	NAME_NM_FLAGS_RD	0x0100	/* Recursion desired:	1 bit */
231da6c28aaSamw #define	NAME_NM_FLAGS_RA	0x0080	/* Recursion available:	1 bit */
232da6c28aaSamw #define	NAME_NM_FLAGS_x2	0x0040	/* reserved, mbz:	1 bit */
233da6c28aaSamw #define	NAME_NM_FLAGS_x1	0x0020	/* reserved, mbz:	1 bit */
234da6c28aaSamw #define	NAME_NM_FLAGS_B		0x0010	/* Broadcast:		1 bit */
235da6c28aaSamw #define	NAME_RCODE_MASK		0x000f	/* RCODE Field:		4 bits */
236da6c28aaSamw #define	RCODE_FMT_ERR		0x0001
237da6c28aaSamw #define	RCODE_SRV_ERR		0x0002
238da6c28aaSamw #define	RCODE_NAM_ERR		0x0003
239da6c28aaSamw #define	RCODE_IMP_ERR		0x0004
240da6c28aaSamw #define	RCODE_RFS_ERR		0x0005
241da6c28aaSamw #define	RCODE_ACT_ERR		0x0006
242da6c28aaSamw #define	RCODE_CFT_ERR		0x0007
243da6c28aaSamw 
244da6c28aaSamw #define	NM_FLAGS_UNICAST		0
245da6c28aaSamw #define	NM_FLAGS_BROADCAST		NAME_NM_FLAGS_B
246da6c28aaSamw 
247da6c28aaSamw #define	PACKET_TYPE(x)	((x) & (NAME_OPCODE_R | NAME_OPCODE_OPCODE_MASK | \
248da6c28aaSamw 			NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD))
249da6c28aaSamw 
250da6c28aaSamw #define	RCODE(x)		((x) & NAME_RCODE_MASK)
251da6c28aaSamw #define	POSITIVE_RESPONSE(x)	(RCODE(x) == 0)
252da6c28aaSamw #define	NEGATIVE_RESPONSE(x)	(RCODE(x) != 0)
253da6c28aaSamw 
254da6c28aaSamw #define	END_NODE_CHALLENGE_REGISTRATION_REQUEST				\
255da6c28aaSamw 	    (NAME_OPCODE_REGISTRATION | NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD)
256da6c28aaSamw #define	END_NODE_CHALLENGE_NAME_REGISTRATION_RESPONSE			\
257da6c28aaSamw 	    (NAME_OPCODE_R | END_NODE_CHALLENGE_REGISTRATION_REQUEST)
258da6c28aaSamw 
259da6c28aaSamw #define	NAME_QUERY_REQUEST						\
260da6c28aaSamw 	    (NAME_OPCODE_QUERY | NAME_NM_FLAGS_RD)
261da6c28aaSamw #define	NAME_QUERY_RESPONSE						\
262da6c28aaSamw 	    (NAME_OPCODE_R | NAME_QUERY_REQUEST |			\
263da6c28aaSamw 	    NAME_NM_FLAGS_AA | NAME_NM_FLAGS_RD)
264da6c28aaSamw 
265da6c28aaSamw #define	NODE_STATUS_REQUEST						\
266da6c28aaSamw 	    (NAME_OPCODE_QUERY)
267da6c28aaSamw #define	NODE_STATUS_RESPONSE						\
268da6c28aaSamw 	    (NAME_OPCODE_R | NODE_STATUS_REQUEST | NAME_NM_FLAGS_AA)
269da6c28aaSamw 
270da6c28aaSamw #define	REDIRECT_NAME_QUERY_RESPONSE					\
271da6c28aaSamw 	    (NAME_OPCODE_R | NAME_QUERY_REQUEST | NAME_NM_FLAGS_RD)
272da6c28aaSamw 
273da6c28aaSamw #define	NAME_REFRESH_REQUEST						\
274da6c28aaSamw 	    (NAME_OPCODE_REFRESH)
275da6c28aaSamw #define	NAME_REGISTRATION_REQUEST					\
276da6c28aaSamw 	    (NAME_OPCODE_REGISTRATION | NAME_NM_FLAGS_RD)
277da6c28aaSamw #define	NAME_MULTIHOME_REGISTRATION_REQUEST				\
278da6c28aaSamw 	    (NAME_OPCODE_MULTIHOME | NAME_NM_FLAGS_RD)
279da6c28aaSamw #define	NAME_REGISTRATION_RESPONSE					\
280da6c28aaSamw 	    (NAME_OPCODE_R | NAME_REGISTRATION_REQUEST | NAME_NM_FLAGS_AA)
281da6c28aaSamw 
282da6c28aaSamw #define	NAME_RELEASE_REQUEST						\
283da6c28aaSamw 	    (NAME_OPCODE_RELEASE)
284da6c28aaSamw #define	NAME_RELEASE_RESPONSE						\
285da6c28aaSamw 	    (NAME_OPCODE_R | NAME_RELEASE_REQUEST | NAME_NM_FLAGS_AA)
286da6c28aaSamw 
287da6c28aaSamw #define	WACK_RESPONSE						\
288da6c28aaSamw 	    (NAME_OPCODE_R | NAME_OPCODE_WACK | NAME_NM_FLAGS_AA)
289da6c28aaSamw 
290da6c28aaSamw #define	NAME_QUESTION_TYPE_NB		0x0020
291da6c28aaSamw #define	NAME_QUESTION_TYPE_NBSTAT	0x0021
292da6c28aaSamw #define	NAME_QUESTION_CLASS_IN		0x0001
293da6c28aaSamw 
294da6c28aaSamw 
295da6c28aaSamw #define	NAME_RR_TYPE_A			0x0001	/* IP Address */
296da6c28aaSamw #define	NAME_RR_TYPE_NS			0x0002	/* Name Server */
297da6c28aaSamw #define	NAME_RR_TYPE_NULL		0x000A	/* NULL */
298da6c28aaSamw #define	NAME_RR_TYPE_NB			0x0020	/* NetBIOS Name Service */
299da6c28aaSamw #define	NAME_RR_TYPE_NBSTAT		0x0021	/* NetBIOS Node Status */
300da6c28aaSamw 
301da6c28aaSamw #define	NAME_RR_CLASS_IN		0x0001	/* NetBIOS Node Status */
302da6c28aaSamw 
303da6c28aaSamw #define	NAME_NB_FLAGS_ONT_MASK		(3<<13)
304da6c28aaSamw #define	NAME_NB_FLAGS_ONT_B		(0<<13) /* B-node (broadcast) */
305da6c28aaSamw #define	NAME_NB_FLAGS_ONT_P		(1<<13)	/* P-node (point-to-point) */
306da6c28aaSamw #define	NAME_NB_FLAGS_ONT_M		(2<<13)	/* M-node (multicast) */
307da6c28aaSamw #define	NAME_NB_FLAGS_ONT_resv		(3<<13)
308da6c28aaSamw #define	NAME_NB_FLAGS_G			(1<<15)	/* Group Name */
309da6c28aaSamw 
310da6c28aaSamw #define	UNICAST				0
311da6c28aaSamw #define	BROADCAST			1
312da6c28aaSamw #define	POINTCAST			2
313da6c28aaSamw 
314da6c28aaSamw #define	NAME_ATTR_UNIQUE		0x0000
315da6c28aaSamw #define	NAME_ATTR_GROUP			0x8000
316da6c28aaSamw #define	NAME_ATTR_OWNER_NODE_TYPE	0x6000
317da6c28aaSamw #define	  NAME_ATTR_OWNER_TYPE_BNODE	  0x0000
318da6c28aaSamw #define	  NAME_ATTR_OWNER_TYPE_PNODE	  0x2000
319da6c28aaSamw #define	  NAME_ATTR_OWNER_TYPE_MNODE	  0x4000
320da6c28aaSamw #define	  NAME_ATTR_OWNER_TYPE_HNODE	  0x6000
321da6c28aaSamw #define	NAME_ATTR_DEREGISTER		0x1000
322da6c28aaSamw #define	NAME_ATTR_CONFLICT		0x0800
323da6c28aaSamw #define	NAME_ATTR_ACTIVE_NAME		0x0400
324da6c28aaSamw #define	NAME_ATTR_PERMANENT		0x0200
325da6c28aaSamw #define	NAME_ATTR_RESERVED		0x01FF
326da6c28aaSamw #define	NAME_ATTR_LOCAL			0x0001
327da6c28aaSamw 
328da6c28aaSamw #define	NODE_TYPE(x)		((x) & NAME_ATTR_OWNER_NODE_TYPE))
329da6c28aaSamw #define	IS_BNODE(x)		(NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_BNODE)
330da6c28aaSamw #define	IS_PNODE(x)		(NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_PNODE)
331da6c28aaSamw #define	IS_MNODE(x)		(NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_MNODE)
332da6c28aaSamw #define	IS_HNODE(x)		(NODE_TYPE(x) == NAME_ATTR_OWNER_TYPE_HNODE)
333da6c28aaSamw 
334da6c28aaSamw #define	IS_UNIQUE(x)		(((x) & NAME_ATTR_GROUP) == 0)
335da6c28aaSamw #define	IS_GROUP(x)		(((x) & NAME_ATTR_GROUP) != 0)
336da6c28aaSamw #define	IS_PERMANENT(x)		(((x) & NAME_ATTR_PERMANENT) != 0)
337da6c28aaSamw #define	IS_CONFLICTING(x)	(((x) & NAME_ATTR_CONFLICT) != 0)
338da6c28aaSamw #define	IS_ACTIVE(x)		(((x) & NAME_ATTR_ACTIVE) != 0)
339da6c28aaSamw #define	IS_DEGREGISTERED(x)	(((x) & NAME_ATTR_ACTIVE) != 0)
340da6c28aaSamw 
341da6c28aaSamw #define	IS_LOCAL(x)		(((x) & NAME_ATTR_LOCAL) != 0)
342da6c28aaSamw #define	IS_PUBLIC(x)		(((x) & NAME_ATTR_LOCAL) == 0)
343da6c28aaSamw #define	PUBLIC_BITS(x)		((x) & ~NAME_ATTR_RESERVED)
344da6c28aaSamw 
345da6c28aaSamw #define	SAME_SCOPE(scope, e)	(strcmp((scope), ((e)->scope)) == 0)
346da6c28aaSamw 
347da6c28aaSamw /*
348da6c28aaSamw  *   STATISTICS Field of the NODE STATUS RESPONSE:
349da6c28aaSamw  *
350da6c28aaSamw  *                        1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
351da6c28aaSamw  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
352da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
353da6c28aaSamw  *   |               UNIT_ID (Unique unit ID)                        |
354da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
355da6c28aaSamw  *   |       UNIT_ID,continued       |    JUMPERS    |  TEST_RESULT  |
356da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
357da6c28aaSamw  *   |       VERSION_NUMBER          |      PERIOD_OF_STATISTICS     |
358da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
359da6c28aaSamw  *   |       NUMBER_OF_CRCs          |     NUMBER_ALIGNMENT_ERRORS   |
360da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
361da6c28aaSamw  *   |       NUMBER_OF_COLLISIONS    |        NUMBER_SEND_ABORTS     |
362da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
363da6c28aaSamw  *   |                       NUMBER_GOOD_SENDS                       |
364da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
365da6c28aaSamw  *   |                      NUMBER_GOOD_RECEIVES                     |
366da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
367da6c28aaSamw  *   |       NUMBER_RETRANSMITS      | NUMBER_NO_RESOURCE_CONDITIONS |
368da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
369da6c28aaSamw  *   |  NUMBER_FREE_COMMAND_BLOCKS   |  TOTAL_NUMBER_COMMAND_BLOCKS  |
370da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
371da6c28aaSamw  *   |MAX_TOTAL_NUMBER_COMMAND_BLOCKS|    NUMBER_PENDING_SESSIONS    |
372da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
373da6c28aaSamw  *   |  MAX_NUMBER_PENDING_SESSIONS  |  MAX_TOTAL_SESSIONS_POSSIBLE  |
374da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
375da6c28aaSamw  *   |   SESSION_DATA_PACKET_SIZE    |
376da6c28aaSamw  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
377da6c28aaSamw  */
378da6c28aaSamw 
379da6c28aaSamw typedef struct {
380da6c28aaSamw 	unsigned char	unit_id[6];
381da6c28aaSamw 	unsigned char	jumpers;
382da6c28aaSamw 	unsigned char	test_result;
383da6c28aaSamw 	unsigned short	version_number;
384da6c28aaSamw 	unsigned short	statistical_period;
385da6c28aaSamw 	unsigned short	crc_errors;
386da6c28aaSamw 	unsigned short	alignment_errors;
387da6c28aaSamw 	unsigned short	collisions;
388da6c28aaSamw 	unsigned short	send_aborts;
389da6c28aaSamw 	unsigned int	good_sends;
390da6c28aaSamw 	unsigned int	good_receives;
391da6c28aaSamw 	unsigned short	retransmits;
392da6c28aaSamw 	unsigned short	no_resource_conditions;
393da6c28aaSamw 	unsigned short	free_command_blocks;
394da6c28aaSamw 	unsigned short	total_command_blocks;
395da6c28aaSamw 	unsigned short	max_total_command_blocks;
396da6c28aaSamw 	unsigned short	pending_sessions;
397da6c28aaSamw 	unsigned short	max_pending_sessions;
398da6c28aaSamw 	unsigned short	total_possible_sessions;
399da6c28aaSamw 	unsigned short	session_data_packet_size;
400da6c28aaSamw } node_status_response;
401da6c28aaSamw 
402da6c28aaSamw /*
403da6c28aaSamw  * 4.4.1.  NetBIOS DATAGRAM HEADER
404da6c28aaSamw  *
405da6c28aaSamw  *                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
406da6c28aaSamw  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
407da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
408da6c28aaSamw  *    |   MSG_TYPE    |     FLAGS     |           DGM_ID              |
409da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
410da6c28aaSamw  *    |                           SOURCE_IP                           |
411da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
412da6c28aaSamw  *    |          SOURCE_PORT          |          DGM_LENGTH           |
413da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
414da6c28aaSamw  *    |         PACKET_OFFSET         |
415da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
416da6c28aaSamw  */
417da6c28aaSamw typedef struct {
418da6c28aaSamw 	unsigned char	msg_type;
419da6c28aaSamw 	unsigned char	flags;
420da6c28aaSamw 	unsigned short	dgm_id;
421da6c28aaSamw 	uint32_t	source_ip;
422da6c28aaSamw 	unsigned short	source_port;
423da6c28aaSamw 	unsigned short	dgm_length;
424da6c28aaSamw 	unsigned short	packet_offset;
425da6c28aaSamw } datagram_header;
426da6c28aaSamw 
427da6c28aaSamw /*
428da6c28aaSamw  *    MSG_TYPE values (in hexidecimal):
429da6c28aaSamw  *
430da6c28aaSamw  *            10 -  DIRECT_UNIQUE DATAGRAM
431da6c28aaSamw  *            11 -  DIRECT_GROUP DATAGRAM
432da6c28aaSamw  *            12 -  BROADCAST DATAGRAM
433da6c28aaSamw  *            13 -  DATAGRAM ERROR
434da6c28aaSamw  *            14 -  DATAGRAM QUERY REQUEST
435da6c28aaSamw  *            15 -  DATAGRAM POSITIVE QUERY RESPONSE
436da6c28aaSamw  *            16 -  DATAGRAM NEGATIVE QUERY RESPONSE
437da6c28aaSamw  */
438da6c28aaSamw #define	DATAGRAM_TYPE_DIRECT_UNIQUE	0x10
439da6c28aaSamw #define	DATAGRAM_TYPE_DIRECT_GROUP	0x11
440da6c28aaSamw #define	DATAGRAM_TYPE_BROADCAST		0x12
441da6c28aaSamw #define	DATAGRAM_TYPE_ERROR_DATAGRAM	0x13
442da6c28aaSamw #define	DATAGRAM_TYPE_QUERY_REQUEST	0x14
443da6c28aaSamw #define	DATAGRAM_TYPE_POSITIVE_RESPONSE	0x15
444da6c28aaSamw #define	DATAGRAM_TYPE_NEGATIVE_RESPONSE	0x16
445da6c28aaSamw 
446da6c28aaSamw 
447da6c28aaSamw /*
448da6c28aaSamw  *    Bit definitions of the FLAGS field:
449da6c28aaSamw  *
450da6c28aaSamw  *      0   1   2   3   4   5   6   7
451da6c28aaSamw  *    +---+---+---+---+---+---+---+---+
452da6c28aaSamw  *    | 0 | 0 | 0 | 0 |  SNT  | F | M |
453da6c28aaSamw  *    +---+---+---+---+---+---+---+---+
454da6c28aaSamw  *
455da6c28aaSamw  *    Symbol     Bit(s)   Description
456da6c28aaSamw  *
457da6c28aaSamw  *    M               7   MORE flag, If set then more NetBIOS datagram
458da6c28aaSamw  *                        fragments follow.
459da6c28aaSamw  *
460da6c28aaSamw  *    F               6   FIRST packet flag,  If set then this is first
461da6c28aaSamw  *                        (and possibly only) fragment of NetBIOS
462da6c28aaSamw  *                        datagram
463da6c28aaSamw  *
464da6c28aaSamw  *    SNT           4,5   Source End-Node type:
465da6c28aaSamw  *                           00 = B node
466da6c28aaSamw  *                           01 = P node
467da6c28aaSamw  *                           10 = M node
468da6c28aaSamw  *                           11 = H node
469da6c28aaSamw  *    RESERVED      0-3   Reserved, must be zero (0)
470da6c28aaSamw  */
471da6c28aaSamw #define	DATAGRAM_FLAGS_MORE	0x01
472da6c28aaSamw #define	DATAGRAM_FLAGS_FIRST	0x02
473da6c28aaSamw #define	DATAGRAM_FLAGS_SRC_TYPE	0x0c
474da6c28aaSamw #define	DATAGRAM_FLAGS_B_NODE	  0x00
475da6c28aaSamw #define	DATAGRAM_FLAGS_P_NODE	  0x04
476da6c28aaSamw #define	DATAGRAM_FLAGS_M_NODE	  0x08
477da6c28aaSamw #define	DATAGRAM_FLAGS_H_NODE	  0x0C
478da6c28aaSamw #define	DATAGRAM_FLAGS_NBDD	  0x0c
479da6c28aaSamw #define	DATAGRAM_FLAGS_RESERVED	0xf0
480da6c28aaSamw 
481da6c28aaSamw /*
482da6c28aaSamw  * 4.4.2.  DIRECT_UNIQUE, DIRECT_GROUP, & BROADCAST DATAGRAM
483da6c28aaSamw  *
484da6c28aaSamw  *                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
485da6c28aaSamw  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
486da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
487da6c28aaSamw  *    |   MSG_TYPE    |     FLAGS     |           DGM_ID              |
488da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
489da6c28aaSamw  *    |                           SOURCE_IP                           |
490da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
491da6c28aaSamw  *    |          SOURCE_PORT          |          DGM_LENGTH           |
492da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
493da6c28aaSamw  *    |         PACKET_OFFSET         |                               |
494da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
495da6c28aaSamw  *    |                                                               |
496da6c28aaSamw  *    /                          SOURCE_NAME                          /
497da6c28aaSamw  *    /                                                               /
498da6c28aaSamw  *    |                                                               |
499da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
500da6c28aaSamw  *    |                                                               |
501da6c28aaSamw  *    /                       DESTINATION_NAME                        /
502da6c28aaSamw  *    /                                                               /
503da6c28aaSamw  *    |                                                               |
504da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
505da6c28aaSamw  *    |                                                               |
506da6c28aaSamw  *    /                           USER_DATA                           /
507da6c28aaSamw  *    /                                                               /
508da6c28aaSamw  *    |                                                               |
509da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
510da6c28aaSamw  */
511da6c28aaSamw typedef struct {
512da6c28aaSamw 	datagram_header	header;
513da6c28aaSamw 	unsigned char	*source_name;
514da6c28aaSamw 	unsigned char	*destination_name;
515da6c28aaSamw 	unsigned char	*user_data;
516da6c28aaSamw } datagram_packet;
517da6c28aaSamw 
518da6c28aaSamw 
519da6c28aaSamw /*
520da6c28aaSamw  *    4.4.3.  DATAGRAM ERROR PACKET
521da6c28aaSamw  *
522da6c28aaSamw  *                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
523da6c28aaSamw  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
524da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
525da6c28aaSamw  *    |   MSG_TYPE    |     FLAGS     |           DGM_ID              |
526da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
527da6c28aaSamw  *    |                           SOURCE_IP                           |
528da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
529da6c28aaSamw  *    |          SOURCE_PORT          |  ERROR_CODE   |
530da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
531da6c28aaSamw  *
532da6c28aaSamw  *    ERROR_CODE values (in hexidecimal):
533da6c28aaSamw  *
534da6c28aaSamw  *            82 -  DESTINATION NAME NOT PRESENT
535da6c28aaSamw  *            83 -  INVALID SOURCE NAME FORMAT
536da6c28aaSamw  *            84 -  INVALID DESTINATION NAME FORMAT
537da6c28aaSamw  */
538da6c28aaSamw 
539da6c28aaSamw typedef struct {
540da6c28aaSamw 	unsigned char	msg_type;
541da6c28aaSamw 	unsigned char	flags;
542da6c28aaSamw 	unsigned short	dgm_id;
543da6c28aaSamw 	uint32_t	source_ip;
544da6c28aaSamw 	unsigned short	source_port;
545da6c28aaSamw 	unsigned char	error;
546da6c28aaSamw } datagram_error_packet;
547da6c28aaSamw 
548da6c28aaSamw /*
549da6c28aaSamw  * 4.4.4.  DATAGRAM QUERY REQUEST
550da6c28aaSamw  *
551da6c28aaSamw  *                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
552da6c28aaSamw  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
553da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
554da6c28aaSamw  *    |   MSG_TYPE    |     FLAGS     |           DGM_ID              |
555da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
556da6c28aaSamw  *    |                           SOURCE_IP                           |
557da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
558da6c28aaSamw  *    |          SOURCE_PORT          |                               |
559da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
560da6c28aaSamw  *    |                                                               |
561da6c28aaSamw  *    /                       DESTINATION_NAME                        /
562da6c28aaSamw  *    /                                                               /
563da6c28aaSamw  *    |                                                               |
564da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
565da6c28aaSamw  *
566da6c28aaSamw  * 4.4.5.  DATAGRAM POSITIVE AND NEGATIVE QUERY RESPONSE
567da6c28aaSamw  *
568da6c28aaSamw  *                         1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
569da6c28aaSamw  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
570da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
571da6c28aaSamw  *    |   MSG_TYPE    |     FLAGS     |           DGM_ID              |
572da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
573da6c28aaSamw  *    |                           SOURCE_IP                           |
574da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
575da6c28aaSamw  *    |          SOURCE_PORT          |                               |
576da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               +
577da6c28aaSamw  *    |                                                               |
578da6c28aaSamw  *    /                       DESTINATION_NAME                        /
579da6c28aaSamw  *    /                                                               /
580da6c28aaSamw  *    |                                                               |
581da6c28aaSamw  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
582da6c28aaSamw  */
583da6c28aaSamw 
584da6c28aaSamw typedef struct datagram_query_packet {
585da6c28aaSamw 	unsigned char	msg_type;
586da6c28aaSamw 	unsigned char	flags;
587da6c28aaSamw 	unsigned short	dgm_id;
588da6c28aaSamw 	uint32_t	source_ip;
589da6c28aaSamw 	unsigned short	source_port;
590da6c28aaSamw 	unsigned char	destination_name[MAX_NAME_LENGTH];
591da6c28aaSamw } datagram_query_packet;
592da6c28aaSamw 
593da6c28aaSamw 
594da6c28aaSamw typedef struct datagram {
595da6c28aaSamw 	struct datagram 	*forw;
596da6c28aaSamw 	struct datagram 	*back;
597da6c28aaSamw 	struct addr_entry	inaddr;
598da6c28aaSamw 	int			discard_timer;
599da6c28aaSamw 	unsigned char		packet_type;
600da6c28aaSamw 	unsigned char		flags;
601da6c28aaSamw 	unsigned short		datagram_id;
602da6c28aaSamw 	struct name_entry	src;
603da6c28aaSamw 	struct name_entry	dest;
604da6c28aaSamw 	unsigned short		offset;
605da6c28aaSamw 	unsigned short		data_length;
606da6c28aaSamw 	unsigned char 		*data;
607da6c28aaSamw 	unsigned int		rawbytes;
608da6c28aaSamw 	unsigned char		rawbuf[MAX_DATAGRAM_LENGTH];
609da6c28aaSamw } datagram;
610da6c28aaSamw 
611da6c28aaSamw typedef struct datagram_queue {
612da6c28aaSamw 	struct datagram 	*forw;
613da6c28aaSamw 	struct datagram 	*back;
614da6c28aaSamw } datagram_queue;
615da6c28aaSamw 
616da6c28aaSamw typedef struct name_queue {
617da6c28aaSamw 	struct name_entry head;
618da6c28aaSamw 	mutex_t mtx;
619da6c28aaSamw } name_queue_t;
620da6c28aaSamw 
6217b59d02dSjb150015 typedef struct nbcache_iter {
6227b59d02dSjb150015 	HT_ITERATOR		nbc_hti;
6237b59d02dSjb150015 	struct name_entry	*nbc_entry;
6247b59d02dSjb150015 } nbcache_iter_t;
6257b59d02dSjb150015 
626da6c28aaSamw #define	NETBIOS_EMPTY_NAME (unsigned char *)""
627da6c28aaSamw 
628da6c28aaSamw #define	NETBIOS_NAME_IS_STAR(name) \
629da6c28aaSamw 	(bcmp(name, "*\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", NETBIOS_NAME_SZ) == 0)
630da6c28aaSamw 
631*a0aa776eSAlan Wright 
632*a0aa776eSAlan Wright /*
633*a0aa776eSAlan Wright  * NetBIOS service state machine interface
634*a0aa776eSAlan Wright  */
635*a0aa776eSAlan Wright void smb_netbios_event(netbios_event_t);
636*a0aa776eSAlan Wright void smb_netbios_wait(netbios_event_t);
637*a0aa776eSAlan Wright void smb_netbios_sleep(time_t);
638*a0aa776eSAlan Wright boolean_t smb_netbios_running(void);
639*a0aa776eSAlan Wright boolean_t smb_netbios_error(void);
640da6c28aaSamw 
641da6c28aaSamw /*
642da6c28aaSamw  * Name Cache Functions
643da6c28aaSamw  */
644da6c28aaSamw int  smb_netbios_cache_init(void);
645da6c28aaSamw void smb_netbios_cache_fini(void);
646*a0aa776eSAlan Wright void smb_netbios_cache_dump(FILE *fp);
647da6c28aaSamw int smb_netbios_cache_count(void);
648da6c28aaSamw void smb_netbios_cache_clean(void);
649da6c28aaSamw void smb_netbios_cache_reset_ttl(void);
6507b59d02dSjb150015 void smb_netbios_cache_delete_locals(name_queue_t *);
6517b59d02dSjb150015 void smb_netbios_cache_refresh(name_queue_t *);
652da6c28aaSamw 
653da6c28aaSamw int smb_netbios_cache_insert(struct name_entry *name);
654da6c28aaSamw int smb_netbios_cache_insert_list(struct name_entry *name);
655da6c28aaSamw void smb_netbios_cache_delete(struct name_entry *name);
656da6c28aaSamw int smb_netbios_cache_delete_addr(struct name_entry *name);
657da6c28aaSamw struct name_entry *smb_netbios_cache_lookup(struct name_entry *name);
658da6c28aaSamw struct name_entry *smb_netbios_cache_lookup_addr(struct name_entry *name);
6597b59d02dSjb150015 void smb_netbios_cache_update_entry(struct name_entry *, struct name_entry *);
6607b59d02dSjb150015 void smb_netbios_cache_unlock_entry(struct name_entry *);
6617b59d02dSjb150015 unsigned char *smb_netbios_cache_status(unsigned char *, int, unsigned char *);
6627b59d02dSjb150015 int smb_netbios_cache_getfirst(nbcache_iter_t *);
6637b59d02dSjb150015 int smb_netbios_cache_getnext(nbcache_iter_t *);
664da6c28aaSamw 
665*a0aa776eSAlan Wright void smb_netbios_name_dump(FILE *fp, struct name_entry *entry);
666da6c28aaSamw void smb_netbios_name_logf(struct name_entry *entry);
667da6c28aaSamw void smb_netbios_name_freeaddrs(struct name_entry *entry);
6687b59d02dSjb150015 struct name_entry *smb_netbios_name_dup(struct name_entry *, int);
669da6c28aaSamw 
670da6c28aaSamw /* Name service functions */
671*a0aa776eSAlan Wright void *smb_netbios_name_service(void *);
6727b59d02dSjb150015 void smb_init_name_struct(unsigned char *, char, unsigned char *, uint32_t,
6737b59d02dSjb150015     unsigned short, uint32_t, uint32_t, struct name_entry *);
674da6c28aaSamw 
675da6c28aaSamw struct name_entry *smb_name_find_name(struct name_entry *name);
676da6c28aaSamw int smb_name_add_name(struct name_entry *name);
677da6c28aaSamw int smb_name_delete_name(struct name_entry *name);
678da6c28aaSamw void smb_name_unlock_name(struct name_entry *name);
679da6c28aaSamw 
680da6c28aaSamw void smb_netbios_name_config(void);
681da6c28aaSamw void smb_netbios_name_unconfig(void);
682da6c28aaSamw void smb_netbios_name_tick(void);
683da6c28aaSamw 
6847b59d02dSjb150015 int smb_first_level_name_encode(struct name_entry *, unsigned char *, int);
6857b59d02dSjb150015 int smb_first_level_name_decode(unsigned char *, struct name_entry *);
6867b59d02dSjb150015 void smb_encode_netbios_name(unsigned char *, char, unsigned char *,
6877b59d02dSjb150015     struct name_entry *);
688da6c28aaSamw 
689da6c28aaSamw /* Datagram service functions */
690*a0aa776eSAlan Wright void *smb_netbios_datagram_service(void *);
691da6c28aaSamw int smb_netbios_datagram_send(struct name_entry *,
692da6c28aaSamw     struct name_entry *, unsigned char *, int);
693da6c28aaSamw void smb_netbios_datagram_tick(void);
694da6c28aaSamw 
695da6c28aaSamw /* browser functions */
696da6c28aaSamw void *smb_browser_dispatch(void *arg);
697*a0aa776eSAlan Wright void *smb_browser_service(void *);
6987b59d02dSjb150015 int smb_browser_load_transact_header(unsigned char *, int, int, int, char *);
699da6c28aaSamw 
700da6c28aaSamw /* Netlogon function */
7017b59d02dSjb150015 void smb_netlogon_receive(struct datagram *, char *, unsigned char *, int);
70229bd2886SAlan Wright void smb_netlogon_request(struct name_entry *, char *);
703da6c28aaSamw 
704da6c28aaSamw #endif /* _SMB_NETBIOS_H_ */
705