xref: /illumos-gate/usr/src/uts/common/smbsrv/netbios.h (revision da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0)
1*da6c28aaSamw /*
2*da6c28aaSamw  * CDDL HEADER START
3*da6c28aaSamw  *
4*da6c28aaSamw  * The contents of this file are subject to the terms of the
5*da6c28aaSamw  * Common Development and Distribution License (the "License").
6*da6c28aaSamw  * You may not use this file except in compliance with the License.
7*da6c28aaSamw  *
8*da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10*da6c28aaSamw  * See the License for the specific language governing permissions
11*da6c28aaSamw  * and limitations under the License.
12*da6c28aaSamw  *
13*da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14*da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16*da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17*da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18*da6c28aaSamw  *
19*da6c28aaSamw  * CDDL HEADER END
20*da6c28aaSamw  */
21*da6c28aaSamw /*
22*da6c28aaSamw  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*da6c28aaSamw  * Use is subject to license terms.
24*da6c28aaSamw  */
25*da6c28aaSamw 
26*da6c28aaSamw #ifndef _SMBSRV_NETBIOS_H
27*da6c28aaSamw #define	_SMBSRV_NETBIOS_H
28*da6c28aaSamw 
29*da6c28aaSamw #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*da6c28aaSamw 
31*da6c28aaSamw /*
32*da6c28aaSamw  * NetBIOS over TCP/IP interface definitions. NetBIOS over TCP/IP is
33*da6c28aaSamw  * documented in the following RFC documents:
34*da6c28aaSamw  *
35*da6c28aaSamw  * RFC 1001: Protocol Standard for a NetBIOS Service on a TCP/UDP
36*da6c28aaSamw  *           Transport: Concepts and Methods
37*da6c28aaSamw  *
38*da6c28aaSamw  * RFC 1002: Protocol Standard for a NetBIOS Service on a TCP/UDP
39*da6c28aaSamw  *           Transport: Detailed Specifications
40*da6c28aaSamw  *
41*da6c28aaSamw  * These documents reference RCF883.
42*da6c28aaSamw  * RFC 883:  Domain Names - Implementation and Specification
43*da6c28aaSamw  */
44*da6c28aaSamw 
45*da6c28aaSamw #ifdef __cplusplus
46*da6c28aaSamw extern "C" {
47*da6c28aaSamw #endif
48*da6c28aaSamw 
49*da6c28aaSamw 
50*da6c28aaSamw /*
51*da6c28aaSamw  * NetBIOS names in NetBIOS packets are valid domain names as defined in
52*da6c28aaSamw  * RFC 883. Each label is limited to 63 bytes with an overall length of
53*da6c28aaSamw  * 255 bytes as described in RFC 1002 section 4.1. This is known as
54*da6c28aaSamw  * second-level encoding. In first-level encoding the label lengths are
55*da6c28aaSamw  * represented as dots (.).
56*da6c28aaSamw  *
57*da6c28aaSamw  * RFC 1001 section 14.1 describes first-level encoding of the NetBIOS
58*da6c28aaSamw  * name (hostname) and scope. The ASCII name is padded to 15 bytes using
59*da6c28aaSamw  * spaces and a one byte type or suffix is written to the 16th byte.
60*da6c28aaSamw  * This is then encoded as a 32 byte string.
61*da6c28aaSamw  *
62*da6c28aaSamw  * NetBIOS Name:  NetBIOS
63*da6c28aaSamw  * NetBIOS Scope: PROCOM.COM
64*da6c28aaSamw  * First Level:   EOGFHEECEJEPFDCACACACACACACACACA.PROCOM.COM
65*da6c28aaSamw  * Second Level:  <32>EOGFHEECEJEPFDCACACACACACACACACA<6>PROCOM<3>COM<0>
66*da6c28aaSamw  */
67*da6c28aaSamw #define	NETBIOS_NAME_SZ			16
68*da6c28aaSamw #define	NETBIOS_ENCODED_NAME_SZ		32
69*da6c28aaSamw #define	NETBIOS_LABEL_MAX		63
70*da6c28aaSamw #define	NETBIOS_DOMAIN_NAME_MAX		255
71*da6c28aaSamw #define	NETBIOS_DOMAIN_NAME_BUFLEN	(NETBIOS_DOMAIN_NAME_MAX + 1)
72*da6c28aaSamw #define	NETBIOS_SESSION_REQUEST_DATA_LENGTH \
73*da6c28aaSamw 	((NETBIOS_ENCODED_NAME_SZ + 2) * 2)
74*da6c28aaSamw 
75*da6c28aaSamw #define	NETBIOS_HDR_SZ			4	/* bytes */
76*da6c28aaSamw /*
77*da6c28aaSamw  * Session Packet Types (RFC 1002 4.3.1).
78*da6c28aaSamw  */
79*da6c28aaSamw #define	SESSION_MESSAGE			0x00
80*da6c28aaSamw #define	SESSION_REQUEST			0x81
81*da6c28aaSamw #define	POSITIVE_SESSION_RESPONSE	0x82
82*da6c28aaSamw #define	NEGATIVE_SESSION_RESPONSE	0x83
83*da6c28aaSamw #define	RETARGET_SESSION_RESPONSE	0x84
84*da6c28aaSamw #define	SESSION_KEEP_ALIVE		0x85
85*da6c28aaSamw 
86*da6c28aaSamw /*
87*da6c28aaSamw  * NEGATIVE SESSION RESPONSE packet error code values (RFC 1002 4.3.4).
88*da6c28aaSamw  */
89*da6c28aaSamw #define	SESSION_NOT_LISTENING_ON_CALLED_NAME	0x80
90*da6c28aaSamw #define	SESSION_NOT_LISTENING_FOR_CALLING_NAME	0x81
91*da6c28aaSamw #define	SESSION_CALLED_NAME_NOT_PRESENT		0x82
92*da6c28aaSamw #define	SESSION_INSUFFICIENT_RESOURCES		0x83
93*da6c28aaSamw #define	SESSION_UNSPECIFIED_ERROR		0x8F
94*da6c28aaSamw 
95*da6c28aaSamw /*
96*da6c28aaSamw  * Time conversions
97*da6c28aaSamw  */
98*da6c28aaSamw #define	MILLISECONDS	1
99*da6c28aaSamw #define	SECONDS		(1000 * MILLISECONDS)
100*da6c28aaSamw #define	MINUTES		(60 * SECONDS)
101*da6c28aaSamw #define	HOURS		(60 * MINUTES)
102*da6c28aaSamw #define	TO_SECONDS(x)		((x) / 1000)
103*da6c28aaSamw #define	TO_MILLISECONDS(x)	((x) * 1000)
104*da6c28aaSamw 
105*da6c28aaSamw /*
106*da6c28aaSamw  * DATAGRAM service definitions
107*da6c28aaSamw  */
108*da6c28aaSamw #define	DATAGRAM_DESTINATION_NAME_NOT_PRESENT		0x82
109*da6c28aaSamw #define	DATAGRAM_INVALID_SOURCE_NAME_FORMAT		0x83
110*da6c28aaSamw #define	DATAGRAM_INVALID_DESTINATION_NAME_FORMAT	0x84
111*da6c28aaSamw 
112*da6c28aaSamw #define	NAME_SERVICE_TCP_PORT	137
113*da6c28aaSamw #define	NAME_SERVICE_UDP_PORT	137
114*da6c28aaSamw #define	DGM_SRVC_UDP_PORT	138
115*da6c28aaSamw #define	SSN_SRVC_TCP_PORT	139
116*da6c28aaSamw #define	MAX_DATAGRAM_LENGTH	576
117*da6c28aaSamw #define	DATAGRAM_HEADER_LENGTH	14
118*da6c28aaSamw #define	MAX_NAME_LENGTH		256
119*da6c28aaSamw #define	BCAST_REQ_RETRY_COUNT	2
120*da6c28aaSamw #define	UCAST_REQ_RETRY_COUNT	2
121*da6c28aaSamw #define	BCAST_REQ_RETRY_TIMEOUT	(500 * MILLISECONDS)
122*da6c28aaSamw #define	UCAST_REQ_RETRY_TIMEOUT	(500 * MILLISECONDS)
123*da6c28aaSamw #define	CONFLICT_TIMER		(1 * SECONDS)
124*da6c28aaSamw #define	INFINITE_TTL		0
125*da6c28aaSamw #define	DEFAULT_TTL		(600 * SECONDS)
126*da6c28aaSamw #define	SSN_RETRY_COUNT		4
127*da6c28aaSamw #define	SSN_CLOSE_TIMEOUT	(30 * SECONDS)
128*da6c28aaSamw /*
129*da6c28aaSamw  * K.L. The keep alive time out use to be default to
130*da6c28aaSamw  * 900 seconds. It is not long enough for some applications
131*da6c28aaSamw  * i.e. MS Access. Therefore, the timeout is increased to
132*da6c28aaSamw  * 5400 seconds.
133*da6c28aaSamw  */
134*da6c28aaSamw #define	SSN_KEEP_ALIVE_TIMEOUT	(90 * 60) /* seconds */
135*da6c28aaSamw #define	FRAGMENT_TIMEOUT	(2 * SECONDS)
136*da6c28aaSamw 
137*da6c28aaSamw /* smb_netbios_util.c */
138*da6c28aaSamw extern int netbios_first_level_name_decode(char *in, char *name, char *scope);
139*da6c28aaSamw extern int netbios_first_level_name_encode(unsigned char *name,
140*da6c28aaSamw     unsigned char *scope, unsigned char *out, int max_out);
141*da6c28aaSamw extern int netbios_name_isvalid(char *in, char *out);
142*da6c28aaSamw 
143*da6c28aaSamw #ifdef __cplusplus
144*da6c28aaSamw }
145*da6c28aaSamw #endif
146*da6c28aaSamw 
147*da6c28aaSamw #endif /* _SMBSRV_NETBIOS_H */
148