summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/smbsrv/netbios.h
blob: 4b1f7814e0ca036aeb74b31dc19879df914573cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SMBSRV_NETBIOS_H
#define	_SMBSRV_NETBIOS_H

/*
 * NetBIOS over TCP/IP interface definitions. NetBIOS over TCP/IP is
 * documented in the following RFC documents:
 *
 * RFC 1001: Protocol Standard for a NetBIOS Service on a TCP/UDP
 *           Transport: Concepts and Methods
 *
 * RFC 1002: Protocol Standard for a NetBIOS Service on a TCP/UDP
 *           Transport: Detailed Specifications
 *
 * These documents reference RCF883.
 * RFC 883:  Domain Names - Implementation and Specification
 */

#ifdef __cplusplus
extern "C" {
#endif


/*
 * NetBIOS names in NetBIOS packets are valid domain names as defined in
 * RFC 883. Each label is limited to 63 bytes with an overall length of
 * 255 bytes as described in RFC 1002 section 4.1. This is known as
 * second-level encoding. In first-level encoding the label lengths are
 * represented as dots (.).
 *
 * RFC 1001 section 14.1 describes first-level encoding of the NetBIOS
 * name (hostname) and scope. The ASCII name is padded to 15 bytes using
 * spaces and a one byte type or suffix is written to the 16th byte.
 * This is then encoded as a 32 byte string.
 *
 * NetBIOS Name:  NetBIOS
 * NetBIOS Scope: DOMAIN.COM
 * First Level:   EOGFHEECEJEPFDCACACACACACACACACA.DOMAIN.COM
 * Second Level:  <32>EOGFHEECEJEPFDCACACACACACACACACA<6>DOMAIN<3>COM<0>
 */
#define	NETBIOS_NAME_SZ			16
#define	NETBIOS_ENCODED_NAME_SZ		32
#define	NETBIOS_LABEL_MAX		63
#define	NETBIOS_DOMAIN_NAME_MAX		255
#define	NETBIOS_DOMAIN_NAME_BUFLEN	(NETBIOS_DOMAIN_NAME_MAX + 1)
#define	NETBIOS_SESSION_REQUEST_DATA_LENGTH \
	((NETBIOS_ENCODED_NAME_SZ + 2) * 2)

#define	NETBIOS_HDR_SZ			4	/* bytes */

/*
 * NetBIOS name type/suffix: 16th byte of the NetBIOS name.
 * The NetBIOS suffix is used by to identify computer services.
 */
#define	NBT_WKSTA			0x00	/* Workstation Service */
#define	NBT_CLIENT			0x03	/* Messenger Service */
#define	NBT_RASSRVR			0x06	/* RAS Server Service */
#define	NBT_DMB				0x1B	/* Domain Master Browser */
#define	NBT_IP				0x1C	/* Domain Controller */
#define	NBT_MB				0x1D	/* Master Browser */
#define	NBT_BS				0x1E	/* Browser Elections */
#define	NBT_NETDDE			0x1F	/* NetDDE Service */
#define	NBT_SERVER			0x20	/* Server Service */
#define	NBT_RASCLNT			0x21	/* RAS Client Service */

/*
 * Session Packet Types (RFC 1002 4.3.1).
 */
#define	SESSION_MESSAGE			0x00
#define	SESSION_REQUEST			0x81
#define	POSITIVE_SESSION_RESPONSE	0x82
#define	NEGATIVE_SESSION_RESPONSE	0x83
#define	RETARGET_SESSION_RESPONSE	0x84
#define	SESSION_KEEP_ALIVE		0x85

/*
 * NEGATIVE SESSION RESPONSE packet error code values (RFC 1002 4.3.4).
 */
#define	SESSION_NOT_LISTENING_ON_CALLED_NAME	0x80
#define	SESSION_NOT_LISTENING_FOR_CALLING_NAME	0x81
#define	SESSION_CALLED_NAME_NOT_PRESENT		0x82
#define	SESSION_INSUFFICIENT_RESOURCES		0x83
#define	SESSION_UNSPECIFIED_ERROR		0x8F

/*
 * Time conversions
 */
#define	MILLISECONDS	1
#define	SECONDS		(1000 * MILLISECONDS)
#define	MINUTES		(60 * SECONDS)
#define	HOURS		(60 * MINUTES)
#define	TO_SECONDS(x)		((x) / 1000)
#define	TO_MILLISECONDS(x)	((x) * 1000)

/*
 * DATAGRAM service definitions
 */
#define	DATAGRAM_DESTINATION_NAME_NOT_PRESENT		0x82
#define	DATAGRAM_INVALID_SOURCE_NAME_FORMAT		0x83
#define	DATAGRAM_INVALID_DESTINATION_NAME_FORMAT	0x84

#define	MAX_DATAGRAM_LENGTH		576
#define	DATAGRAM_HEADER_LENGTH		14
#define	DATAGRAM_ERR_HEADER_LENGTH	11
#define	MAX_NAME_LENGTH			256
#define	BCAST_REQ_RETRY_COUNT		2
#define	UCAST_REQ_RETRY_COUNT		2
#define	BCAST_REQ_RETRY_TIMEOUT		(500 * MILLISECONDS)
#define	UCAST_REQ_RETRY_TIMEOUT		(500 * MILLISECONDS)
#define	CONFLICT_TIMER			(1 * SECONDS)
#define	INFINITE_TTL			0
#define	DEFAULT_TTL			(600 * SECONDS)
#define	SSN_RETRY_COUNT			4
#define	SSN_CLOSE_TIMEOUT		(30 * SECONDS)
/*
 * K.L. The keep alive time out use to be default to
 * 900 seconds. It is not long enough for some applications
 * i.e. MS Access. Therefore, the timeout is increased to
 * 5400 seconds.
 */
#define	SSN_KEEP_ALIVE_TIMEOUT	(90 * 60) /* seconds */
#define	FRAGMENT_TIMEOUT	(2 * SECONDS)

/* smb_netbios_util.c */
extern int netbios_first_level_name_decode(char *in, char *name, char *scope);
extern int netbios_first_level_name_encode(unsigned char *name,
    unsigned char *scope, unsigned char *out, int max_out);
extern int netbios_name_isvalid(char *in, char *out);

#ifdef __cplusplus
}
#endif

#endif /* _SMBSRV_NETBIOS_H */