xref: /titanic_53/usr/src/uts/common/smbsrv/smb.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_SMB_H
27*da6c28aaSamw #define	_SMBSRV_SMB_H
28*da6c28aaSamw 
29*da6c28aaSamw /*
30*da6c28aaSamw  * SMB definitions and interfaces, mostly defined in the CIFS spec.
31*da6c28aaSamw  */
32*da6c28aaSamw 
33*da6c28aaSamw #pragma ident	"%Z%%M%	%I%	%E% SMI"
34*da6c28aaSamw 
35*da6c28aaSamw /*
36*da6c28aaSamw  * SMB definitions and interfaces, mostly defined in the CIFS spec.
37*da6c28aaSamw  */
38*da6c28aaSamw 
39*da6c28aaSamw #ifdef _KERNEL
40*da6c28aaSamw #include <sys/types.h>
41*da6c28aaSamw #endif
42*da6c28aaSamw #include <smbsrv/smb_i18n.h>
43*da6c28aaSamw #include <smbsrv/msgbuf.h>
44*da6c28aaSamw 
45*da6c28aaSamw 
46*da6c28aaSamw #ifdef __cplusplus
47*da6c28aaSamw extern "C" {
48*da6c28aaSamw #endif
49*da6c28aaSamw 
50*da6c28aaSamw 
51*da6c28aaSamw /*
52*da6c28aaSamw  * Typedefs from CIFS section 3.2
53*da6c28aaSamw  */
54*da6c28aaSamw typedef unsigned char UCHAR;
55*da6c28aaSamw typedef unsigned short USHORT;
56*da6c28aaSamw typedef uint32_t ULONG;
57*da6c28aaSamw typedef int32_t LONG;
58*da6c28aaSamw 
59*da6c28aaSamw 
60*da6c28aaSamw /*
61*da6c28aaSamw  * The msgbuf format and length of an SMB header.
62*da6c28aaSamw  */
63*da6c28aaSamw #define	SMB_HEADER_DOS_FMT	"Mbbbwbww10.wwww"
64*da6c28aaSamw #define	SMB_HEADER_NT_FMT	"Mblbww#c2.wwww"
65*da6c28aaSamw #define	SMB_HEADER_LEN		32
66*da6c28aaSamw #define	SMB_SIG_SIZE		8	/* SMB signature size */
67*da6c28aaSamw 
68*da6c28aaSamw /*
69*da6c28aaSamw  * CIFS definition for the SMB header (CIFS Section 3.2). Note that the
70*da6c28aaSamw  * pid_high field is not documented in the 1997 CIFS specificaction. This
71*da6c28aaSamw  * is a decoded or memory-based definition, which may be padded to align
72*da6c28aaSamw  * its elements on word boundaries. See smb_hdrbuf_t for the network
73*da6c28aaSamw  * ready structure.
74*da6c28aaSamw  */
75*da6c28aaSamw typedef struct smb_hdr {
76*da6c28aaSamw 	UCHAR protocol[4];
77*da6c28aaSamw 	UCHAR command;
78*da6c28aaSamw 
79*da6c28aaSamw 	union {
80*da6c28aaSamw 		struct {
81*da6c28aaSamw 			UCHAR error_class;
82*da6c28aaSamw 			UCHAR reserved;
83*da6c28aaSamw 			USHORT error;
84*da6c28aaSamw 		} dos_error;
85*da6c28aaSamw 		ULONG ntstatus;
86*da6c28aaSamw 	}status;
87*da6c28aaSamw 
88*da6c28aaSamw 	UCHAR flags;
89*da6c28aaSamw 	USHORT flags2;
90*da6c28aaSamw 	USHORT pid_high;
91*da6c28aaSamw 
92*da6c28aaSamw 	union {
93*da6c28aaSamw 		USHORT pad[5];
94*da6c28aaSamw 		struct {
95*da6c28aaSamw 			USHORT reserved;
96*da6c28aaSamw 			UCHAR security_sig[SMB_SIG_SIZE];
97*da6c28aaSamw 		} extra;
98*da6c28aaSamw 	} extra;
99*da6c28aaSamw 
100*da6c28aaSamw 	USHORT tid;
101*da6c28aaSamw 	USHORT pid;
102*da6c28aaSamw 	USHORT uid;
103*da6c28aaSamw 	USHORT mid;
104*da6c28aaSamw } smb_hdr_t;
105*da6c28aaSamw 
106*da6c28aaSamw 
107*da6c28aaSamw /*
108*da6c28aaSamw  * Encoded or packed SMB header in network ready format.
109*da6c28aaSamw  */
110*da6c28aaSamw typedef struct smb_hdrbuf {
111*da6c28aaSamw 	unsigned char hdr[SMB_HEADER_LEN];
112*da6c28aaSamw } smb_hdrbuf_t;
113*da6c28aaSamw 
114*da6c28aaSamw typedef struct smb_nethdr {
115*da6c28aaSamw 	uint8_t sh_protocol[4];
116*da6c28aaSamw 	uint8_t sh_command;
117*da6c28aaSamw 
118*da6c28aaSamw 	union {
119*da6c28aaSamw 		struct {
120*da6c28aaSamw 			uint8_t sh_error_class;
121*da6c28aaSamw 			uint8_t sh_reserved;
122*da6c28aaSamw 			uint8_t sh_error[2];
123*da6c28aaSamw 		} dos_error;
124*da6c28aaSamw 		uint8_t sh_ntstatus[4];
125*da6c28aaSamw 	} status;
126*da6c28aaSamw 
127*da6c28aaSamw 	uint8_t sh_flags;
128*da6c28aaSamw 	uint8_t sh_flags2[2];
129*da6c28aaSamw 	uint8_t sh_pid_high[2];
130*da6c28aaSamw 
131*da6c28aaSamw 	union {
132*da6c28aaSamw 		uint8_t sh_pad[10];
133*da6c28aaSamw 		struct {
134*da6c28aaSamw 			uint8_t sh_reserved[2];
135*da6c28aaSamw 			uint8_t sh_security_sig[SMB_SIG_SIZE];
136*da6c28aaSamw 		} extra;
137*da6c28aaSamw 	} extra;
138*da6c28aaSamw 
139*da6c28aaSamw 	uint8_t sh_tid[2];
140*da6c28aaSamw 	uint8_t sh_pid[2];
141*da6c28aaSamw 	uint8_t sh_uid[2];
142*da6c28aaSamw 	uint8_t sh_mid[2];
143*da6c28aaSamw } smb_nethdr_t;
144*da6c28aaSamw 
145*da6c28aaSamw /*
146*da6c28aaSamw  * Protocol magic value as a 32-bit.  This will be 0xff 0x53 0x4d 0x42 on
147*da6c28aaSamw  * the wire.
148*da6c28aaSamw  */
149*da6c28aaSamw 
150*da6c28aaSamw #define	SMB_PROTOCOL_MAGIC	0x424d53ff
151*da6c28aaSamw 
152*da6c28aaSamw /*
153*da6c28aaSamw  * Time and date encoding (CIFS Section 3.6). The date is encoded such
154*da6c28aaSamw  * that the year has a range of 0-119, which represents 1980-2099. The
155*da6c28aaSamw  * month range is 1-12, and the day range is 1-31.
156*da6c28aaSamw  */
157*da6c28aaSamw typedef struct smb_date {
158*da6c28aaSamw 	USHORT day   : 5;
159*da6c28aaSamw 	USHORT month : 4;
160*da6c28aaSamw 	USHORT year  : 7;
161*da6c28aaSamw } smb_date_t;
162*da6c28aaSamw 
163*da6c28aaSamw 
164*da6c28aaSamw /*
165*da6c28aaSamw  * The hours range is 0-23, the minutes range is 0-59 and the two_sec
166*da6c28aaSamw  * range is 0-29.
167*da6c28aaSamw  */
168*da6c28aaSamw typedef struct smb_time {
169*da6c28aaSamw 	USHORT two_sec : 5;
170*da6c28aaSamw 	USHORT minutes : 6;
171*da6c28aaSamw 	USHORT hours    : 5;
172*da6c28aaSamw } smb_time_t;
173*da6c28aaSamw 
174*da6c28aaSamw 
175*da6c28aaSamw /*
176*da6c28aaSamw  * This is a 64-bit signed absolute time representing 100ns increments.
177*da6c28aaSamw  * A positive value represents the absolute time since 1601AD. A
178*da6c28aaSamw  * negative value represents a context specific relative time.
179*da6c28aaSamw  */
180*da6c28aaSamw typedef struct smb_time2 {
181*da6c28aaSamw 	ULONG low_time;
182*da6c28aaSamw 	LONG high_time;
183*da6c28aaSamw } smb_time2_t;
184*da6c28aaSamw 
185*da6c28aaSamw 
186*da6c28aaSamw /*
187*da6c28aaSamw  * The number of seconds since Jan 1, 1970, 00:00:00.0.
188*da6c28aaSamw  */
189*da6c28aaSamw typedef uint32_t smb_utime_t;
190*da6c28aaSamw 
191*da6c28aaSamw 
192*da6c28aaSamw #define	SMB_LM_NEGOTIATE_WORDCNT		13
193*da6c28aaSamw #define	SMB_NT_NEGOTIATE_WORDCNT		17
194*da6c28aaSamw 
195*da6c28aaSamw 
196*da6c28aaSamw typedef struct smb_nt_negotiate_rsp {
197*da6c28aaSamw 	UCHAR word_count;
198*da6c28aaSamw 	USHORT dialect_index;
199*da6c28aaSamw 	UCHAR security_mode;
200*da6c28aaSamw 	USHORT max_mpx;
201*da6c28aaSamw 	USHORT max_vc;
202*da6c28aaSamw 	ULONG max_buffer_size;
203*da6c28aaSamw 	ULONG max_raw_size;
204*da6c28aaSamw 	ULONG session_key;
205*da6c28aaSamw 	ULONG capabilities;
206*da6c28aaSamw 	ULONG time_low;
207*da6c28aaSamw 	ULONG time_high;
208*da6c28aaSamw 	USHORT server_tz;
209*da6c28aaSamw 	UCHAR security_len;
210*da6c28aaSamw 	USHORT byte_count;
211*da6c28aaSamw 	UCHAR *guid;
212*da6c28aaSamw 	UCHAR *challenge;
213*da6c28aaSamw 	UCHAR *oem_domain;
214*da6c28aaSamw } smb_nt_negotiate_rsp_t;
215*da6c28aaSamw 
216*da6c28aaSamw /*
217*da6c28aaSamw  * SMB_COM_TRANSACTION
218*da6c28aaSamw  */
219*da6c28aaSamw typedef struct smb_transact_rsp {
220*da6c28aaSamw 	UCHAR  WordCount;		/* Count of data bytes */
221*da6c28aaSamw 					/* value = 10 + SetupCount */
222*da6c28aaSamw 	USHORT TotalParamCount;		/* Total parameter bytes being sent */
223*da6c28aaSamw 	USHORT TotalDataCount;		/* Total data bytes being sent */
224*da6c28aaSamw 	USHORT Reserved;
225*da6c28aaSamw 	USHORT ParamCount;		/* Parameter bytes sent this buffer */
226*da6c28aaSamw 	USHORT ParamOffset;		/* Offset (from hdr start) to params */
227*da6c28aaSamw 	USHORT ParamDisplacement;	/* Displacement of these param bytes */
228*da6c28aaSamw 	USHORT DataCount;		/* Data bytes sent this buffer */
229*da6c28aaSamw 	USHORT DataOffset;		/* Offset (from hdr start) to data */
230*da6c28aaSamw 	USHORT DataDisplacement;	/* Displacement of these data bytes */
231*da6c28aaSamw 	UCHAR  SetupCount;		/* Count of setup words */
232*da6c28aaSamw 	USHORT BCC;
233*da6c28aaSamw #if 0
234*da6c28aaSamw 	UCHAR Reserved2;		/* Reserved (pad above to word) */
235*da6c28aaSamw 	UCHAR Buffer[1];		/* Buffer containing: */
236*da6c28aaSamw 	USHORT Setup[];			/*  Setup words (# = SetupWordCount) */
237*da6c28aaSamw 	USHORT ByteCount;		/*  Count of data bytes */
238*da6c28aaSamw 	UCHAR Pad[];			/*  Pad to SHORT or LONG */
239*da6c28aaSamw 	UCHAR Params[];			/*  Param. bytes (# = ParamCount) */
240*da6c28aaSamw 	UCHAR Pad1[];			/*  Pad to SHORT or LONG */
241*da6c28aaSamw 	UCHAR Data[];			/*  Data bytes (# = DataCount) */
242*da6c28aaSamw #endif
243*da6c28aaSamw } smb_transact_rsp_t;
244*da6c28aaSamw 
245*da6c28aaSamw /*
246*da6c28aaSamw  * SMBreadX
247*da6c28aaSamw  */
248*da6c28aaSamw typedef struct smb_read_andx_rsp {
249*da6c28aaSamw 	UCHAR WordCount;
250*da6c28aaSamw 	UCHAR AndXCmd;
251*da6c28aaSamw 	UCHAR AndXReserved;
252*da6c28aaSamw 	USHORT AndXOffset;
253*da6c28aaSamw 	USHORT Remaining;
254*da6c28aaSamw 	USHORT DataCompactionMode;
255*da6c28aaSamw 	USHORT Reserved;
256*da6c28aaSamw 	USHORT DataLength;
257*da6c28aaSamw 	USHORT DataOffset;
258*da6c28aaSamw 	ULONG  DataLengthHigh;
259*da6c28aaSamw 	USHORT Reserved2[3];
260*da6c28aaSamw 	USHORT ByteCount;
261*da6c28aaSamw #if 0
262*da6c28aaSamw 	UCHAR Pad[];
263*da6c28aaSamw 	UCHAR Data[];
264*da6c28aaSamw #endif
265*da6c28aaSamw } smb_read_andx_rsp_t;
266*da6c28aaSamw 
267*da6c28aaSamw #ifdef __cplusplus
268*da6c28aaSamw }
269*da6c28aaSamw #endif
270*da6c28aaSamw 
271*da6c28aaSamw 
272*da6c28aaSamw #endif /* _SMBSRV_SMB_H */
273