smbrdr.h revision 11963:061945695ce1
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _SMBRDR_H_
27#define	_SMBRDR_H_
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <syslog.h>
32#include <synch.h>
33#include <sys/types.h>
34
35#include <smbsrv/libsmb.h>
36#include <smbsrv/libsmbrdr.h>
37#include <smbsrv/smb.h>
38#include <smbsrv/smbinfo.h>
39#include <smbsrv/smb.h>
40#include <smbsrv/wintypes.h>
41
42#define	SMBRDR_REQ_BUFSZ	4096
43
44#define	MAX_ACCOUNT_NAME	32
45#define	MAX_SHARE_NAME		32
46#define	MAX_SCOPE_NAME		64
47#define	MAX_FILE_PATH		128
48
49/*
50 * The number of shares and pipes is limited to 48 based on the note
51 * below. This really shouldn't cause a problem because we always
52 * our shares and named pipes are always opened and closed round every
53 * RPC transaction. This also tends to limit the number of active
54 * logons because we (currently) need two named pipes per logon.
55 *
56 * Q141709 Limit of 49 named pipe connections from a single workstation.
57 * If a named pipe server creates more than 49 distincly named pipes, a
58 * single client cannot connect more than 49 pipes on the named pipe
59 * server. Chapter 4, p113. Network Programming for Microsoft Windows
60 * Anthony Jones and Jim Ohlund, Microsoft Press, ISBN: 0-7356-0560-2
61 */
62#define	N_NETUSE_TABLE		256
63#define	N_OFILE_TABLE		256
64
65/*
66 * Logon's states
67 */
68#define	SDB_LSTATE_START	0
69#define	SDB_LSTATE_INIT		1
70#define	SDB_LSTATE_LOGGING_OFF	2
71#define	SDB_LSTATE_SETUP	3
72
73#define	SDB_LOGON_NONE		0
74#define	SDB_LOGON_GUEST		1
75#define	SDB_LOGON_ANONYMOUS	2
76#define	SDB_LOGON_USER		3
77
78typedef struct sdb_logon {
79	struct sdb_session *session;
80	char username[MAX_ACCOUNT_NAME];
81	unsigned short uid;
82	unsigned int type;
83	unsigned short state;
84	smb_auth_info_t auth;
85	unsigned char ssn_key[SMBAUTH_SESSION_KEY_SZ];
86} sdb_logon_t;
87
88/*
89 * Session's states
90 *
91 *   SDB_SSTATE_START             ready to be used
92 *   SDB_SSTATE_INIT              initialized
93 *   SDB_SSTATE_STALE             lost transport connection
94 *   SDB_SSTATE_DISCONNECTING     disconnecting: logoff the user
95 *                                disconnect trees, close files
96 *   SDB_SSTATE_CLEANING          was in STALE state now just
97 *                                cleaning up
98 *   SDB_SSTATE_CONNECTED         got transport connection
99 *   SDB_SSTATE_NEGOTIATED        did SMB negotiate
100 */
101#define	SDB_SSTATE_START		0
102#define	SDB_SSTATE_INIT			1
103#define	SDB_SSTATE_STALE		2
104#define	SDB_SSTATE_DISCONNECTING	3
105#define	SDB_SSTATE_CLEANING		4
106#define	SDB_SSTATE_CONNECTED		5
107#define	SDB_SSTATE_NEGOTIATED		6
108
109#define	SDB_SLCK_READ   1
110#define	SDB_SLCK_WRITE  2
111
112struct sdb_session {
113	char srv_name[MAXHOSTNAMELEN];
114	smb_inaddr_t srv_ipaddr;
115	char domain[MAXHOSTNAMELEN];
116	char scope[SMB_PI_MAX_SCOPE];
117	char native_os[SMB_PI_MAX_NATIVE_OS];
118	char native_lanman[SMB_PI_MAX_LANMAN];
119	int sock;
120	short port;
121	uint16_t secmode;
122	uint32_t sesskey;
123	uint32_t challenge_len;
124	uint8_t challenge_key[32];
125	uint8_t smb_flags;
126	uint16_t smb_flags2;
127	uint16_t vc;
128	uint32_t remote_caps;
129	uint8_t state;
130	uint32_t sid;	/* session id */
131	int remote_os;
132	int remote_lm;
133	int pdc_type;
134	smb_sign_ctx_t sign_ctx;
135	sdb_logon_t logon;
136	rwlock_t rwl;
137};
138
139/*
140 * Netuse's states
141 */
142#define	SDB_NSTATE_START		0
143#define	SDB_NSTATE_INIT			1
144#define	SDB_NSTATE_DISCONNECTING	2
145#define	SDB_NSTATE_CONNECTED		3
146
147struct sdb_netuse {
148	struct sdb_session *session;
149	unsigned short state;
150	int letter;		/* local identity */
151	unsigned int sid;
152	unsigned short uid;
153	unsigned short tid;		/* remote identity */
154	char share[MAX_SHARE_NAME];
155	mutex_t mtx;
156};
157
158/*
159 * Ofile's states
160 */
161#define	SDB_FSTATE_START	0
162#define	SDB_FSTATE_INIT		1
163#define	SDB_FSTATE_CLOSING	2
164#define	SDB_FSTATE_OPEN		3
165
166struct sdb_ofile {
167	struct sdb_session *session;
168	struct sdb_netuse *netuse;
169	unsigned short state;
170	unsigned int sid;
171	unsigned short uid;
172	unsigned short tid;
173	unsigned short fid;		/* remote identity */
174	char path[MAX_FILE_PATH];
175	mutex_t mtx;
176};
177
178typedef struct smbrdr_handle {
179	unsigned char *srh_buf;
180	smb_msgbuf_t srh_mbuf;
181	unsigned int srh_mbflags;
182	unsigned char srh_cmd;
183	struct sdb_session *srh_session;
184	struct sdb_logon *srh_user;
185	struct sdb_netuse *srh_tree;
186} smbrdr_handle_t;
187
188typedef struct smb_nt_negotiate_rsp {
189	uint8_t word_count;
190	uint16_t dialect_index;
191	uint8_t security_mode;
192	uint16_t max_mpx;
193	uint16_t max_vc;
194	uint32_t max_buffer_size;
195	uint32_t max_raw_size;
196	uint32_t session_key;
197	uint32_t capabilities;
198	uint32_t time_low;
199	uint32_t time_high;
200	uint16_t server_tz;
201	uint8_t security_len;
202	uint16_t byte_count;
203	uint8_t *guid;
204	uint8_t *challenge;
205	uint8_t *oem_domain;
206} smb_nt_negotiate_rsp_t;
207
208/*
209 * SMB_COM_TRANSACTION
210 */
211typedef struct smb_transact_rsp {
212	uint8_t WordCount;		/* Count of data bytes */
213					/* value = 10 + SetupCount */
214	uint16_t TotalParamCount;	/* Total parameter bytes being sent */
215	uint16_t TotalDataCount;	/* Total data bytes being sent */
216	uint16_t Reserved;
217	uint16_t ParamCount;		/* Parameter bytes sent this buffer */
218	uint16_t ParamOffset;		/* Offset (from hdr start) to params */
219	uint16_t ParamDisplacement;	/* Displacement of these param bytes */
220	uint16_t DataCount;		/* Data bytes sent this buffer */
221	uint16_t DataOffset;		/* Offset (from hdr start) to data */
222	uint16_t DataDisplacement;	/* Displacement of these data bytes */
223	uint8_t SetupCount;		/* Count of setup words */
224	uint16_t BCC;
225#if 0
226	uint8_t Reserved2;		/* Reserved (pad above to word) */
227	uint8_t Buffer[1];		/* Buffer containing: */
228	uint16_t Setup[];		/*  Setup words (# = SetupWordCount) */
229	uint16_t ByteCount;		/*  Count of data bytes */
230	uint8_t Pad[];			/*  Pad to SHORT or LONG */
231	uint8_t Params[];		/*  Param. bytes (# = ParamCount) */
232	uint8_t Pad1[];			/*  Pad to SHORT or LONG */
233	uint8_t Data[];			/*  Data bytes (# = DataCount) */
234#endif
235} smb_transact_rsp_t;
236
237/*
238 * SMBreadX
239 */
240typedef struct smb_read_andx_rsp {
241	uint8_t WordCount;
242	uint8_t AndXCmd;
243	uint8_t AndXReserved;
244	uint16_t AndXOffset;
245	uint16_t Remaining;
246	uint16_t DataCompactionMode;
247	uint16_t Reserved;
248	uint16_t DataLength;
249	uint16_t DataOffset;
250	uint32_t DataLengthHigh;
251	uint16_t Reserved2[3];
252	uint16_t ByteCount;
253#if 0
254	uint8_t Pad[];
255	uint8_t Data[];
256#endif
257} smb_read_andx_rsp_t;
258
259/*
260 * smbrdr_netbios.c
261 */
262void nb_lock(void);
263void nb_unlock(void);
264void nb_close(int);
265int nb_keep_alive(int, short);
266
267int nb_send(int, unsigned char *, unsigned);
268int nb_rcv(int, unsigned char *, unsigned, long);
269int nb_exchange(int, unsigned char *, unsigned,
270    unsigned char *, unsigned, long);
271int nb_session_request(int, char *, char *, char *, char *);
272
273/*
274 * smbrdr_session.c
275 */
276int smbrdr_negotiate(char *, char *);
277struct sdb_session *smbrdr_session_lock(const char *, int);
278void smbrdr_session_unlock(struct sdb_session *);
279
280/*
281 * smbrdr_logon.c
282 */
283int smbrdr_logoffx(struct sdb_logon *);
284
285/* smbrdr_netuse.c */
286void smbrdr_netuse_logoff(unsigned short);
287struct sdb_netuse *smbrdr_netuse_get(int);
288DWORD smbrdr_tree_connect(char *, char *, char *, char *, unsigned short *);
289int smbrdr_tree_disconnect(unsigned short);
290void smbrdr_netuse_put(struct sdb_netuse *);
291int smbrdr_tdcon(struct sdb_netuse *);
292
293/*
294 * smbrdr_rpcpipe.c
295 */
296void smbrdr_ofile_end_of_share(unsigned short);
297struct sdb_ofile *smbrdr_ofile_get(int);
298void smbrdr_ofile_put(struct sdb_ofile *);
299
300/* smbrdr_lib.c */
301DWORD smbrdr_request_init(smbrdr_handle_t *, unsigned char,
302    struct sdb_session *, struct sdb_logon *, struct sdb_netuse *);
303DWORD smbrdr_send(smbrdr_handle_t *);
304DWORD smbrdr_rcv(smbrdr_handle_t *, int);
305DWORD smbrdr_exchange(smbrdr_handle_t *, smb_hdr_t *, long);
306void smbrdr_handle_free(smbrdr_handle_t *);
307int smbrdr_sign_init(struct sdb_session *, struct sdb_logon *);
308void smbrdr_sign_fini(struct sdb_session *);
309void smbrdr_sign_unset_key(struct sdb_session *);
310
311void smbrdr_lock_transport(void);
312void smbrdr_unlock_transport(void);
313
314#endif /* _SMBRDR_H_ */
315