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 (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
23 */
24
25#ifndef _SMB_IOCTL_H_
26#define	_SMB_IOCTL_H_
27
28#ifdef	__cplusplus
29extern "C" {
30#endif
31
32#include <sys/types.h>
33#include <sys/param.h>
34#include <smbsrv/smbinfo.h>
35
36#define	SMB_IOC_VERSION		0x534D4201	/* SMB1 */
37
38#define	SMB_IOC_BASE		(('S' << 16) | ('B' << 8))
39
40#define	SMB_IOC_CONFIG		_IOW(SMB_IOC_BASE, 1, int)
41#define	SMB_IOC_START		_IOW(SMB_IOC_BASE, 2, int)
42#define	SMB_IOC_GMTOFF		_IOW(SMB_IOC_BASE, 3, int)
43#define	SMB_IOC_SHARE		_IOW(SMB_IOC_BASE, 4, int)
44#define	SMB_IOC_UNSHARE		_IOW(SMB_IOC_BASE, 5, int)
45#define	SMB_IOC_NUMOPEN		_IOW(SMB_IOC_BASE, 6, int)
46#define	SMB_IOC_SVCENUM		_IOW(SMB_IOC_BASE, 7, int)
47#define	SMB_IOC_FILE_CLOSE	_IOW(SMB_IOC_BASE, 8, int)
48#define	SMB_IOC_SESSION_CLOSE	_IOW(SMB_IOC_BASE, 9, int)
49#define	SMB_IOC_STOP		_IOW(SMB_IOC_BASE, 10, int)
50#define	SMB_IOC_EVENT		_IOW(SMB_IOC_BASE, 11, int)
51#define	SMB_IOC_SHAREINFO	_IOW(SMB_IOC_BASE, 12, int)
52#define	SMB_IOC_SPOOLDOC	_IOW(SMB_IOC_BASE, 13, int)
53
54typedef struct smb_ioc_header {
55	uint32_t	version;
56	uint32_t	crc;
57	uint32_t	len;
58	int		cmd;
59} smb_ioc_header_t;
60
61typedef	struct smb_ioc_spooldoc {
62	smb_ioc_header_t hdr;
63	smb_inaddr_t	ipaddr;
64	uint32_t	spool_num;
65	char		username[MAXNAMELEN];
66	char		path[MAXPATHLEN];
67} smb_ioc_spooldoc_t;
68
69typedef	struct {
70	smb_ioc_header_t hdr;
71	int32_t 	offset;
72} smb_ioc_gmt_t;
73
74typedef struct smb_ioc_share {
75	smb_ioc_header_t hdr;
76	uint32_t	shrlen;
77	char		shr[1];
78} smb_ioc_share_t;
79
80typedef struct smb_ioc_shareinfo {
81	smb_ioc_header_t hdr;
82	char		shrname[MAXNAMELEN];
83	uint32_t	shortnames;
84} smb_ioc_shareinfo_t;
85
86typedef	struct smb_ioc_start {
87	smb_ioc_header_t hdr;
88	int		opipe;
89	int		lmshrd;
90	int		udoor;
91} smb_ioc_start_t;
92
93typedef	struct smb_ioc_event {
94	smb_ioc_header_t hdr;
95	uint32_t	txid;
96} smb_ioc_event_t;
97
98typedef	struct smb_ioc_opennum {
99	smb_ioc_header_t hdr;
100	uint32_t	open_users;
101	uint32_t	open_trees;
102	uint32_t	open_files;
103	uint32_t	qualtype;
104	char		qualifier[MAXNAMELEN];
105} smb_ioc_opennum_t;
106
107/*
108 * For enumeration, user and session are synonymous, as are
109 * connection and tree.
110 */
111#define	SMB_SVCENUM_TYPE_USER	0x55534552	/* 'USER' */
112#define	SMB_SVCENUM_TYPE_TREE	0x54524545	/* 'TREE' */
113#define	SMB_SVCENUM_TYPE_FILE	0x46494C45	/* 'FILE' */
114#define	SMB_SVCENUM_TYPE_SHARE	0x53484152	/* 'SHAR' */
115
116typedef struct smb_svcenum {
117	uint32_t	se_type;	/* object type to enumerate */
118	uint32_t	se_level;	/* level of detail being requested */
119	uint32_t	se_prefmaxlen;	/* client max size buffer preference */
120	uint32_t	se_resume;	/* client resume handle */
121	uint32_t	se_bavail;	/* remaining buffer space in bytes */
122	uint32_t	se_bused;	/* consumed buffer space in bytes */
123	uint32_t	se_ntotal;	/* total number of objects */
124	uint32_t	se_nlimit;	/* max number of objects to return */
125	uint32_t	se_nitems;	/* number of objects in buf */
126	uint32_t	se_nskip;	/* number of objects to skip */
127	uint32_t	se_status;	/* enumeration status */
128	uint32_t	se_buflen;	/* length of the buffer in bytes */
129	uint8_t		se_buf[1];	/* buffer to hold enumeration data */
130} smb_svcenum_t;
131
132typedef	struct smb_ioc_svcenum {
133	smb_ioc_header_t hdr;
134	smb_svcenum_t	svcenum;
135} smb_ioc_svcenum_t;
136
137typedef struct smb_ioc_session {
138	smb_ioc_header_t hdr;
139	char		client[MAXNAMELEN];
140	char		username[MAXNAMELEN];
141} smb_ioc_session_t;
142
143typedef	struct smb_ioc_fileid {
144	smb_ioc_header_t hdr;
145	uint32_t	uniqid;
146} smb_ioc_fileid_t;
147
148typedef struct smb_ioc_cfg {
149	smb_ioc_header_t hdr;
150	uint32_t	maxworkers;
151	uint32_t	maxconnections;
152	uint32_t	keepalive;
153	int32_t		restrict_anon;
154	int32_t		signing_enable;
155	int32_t		signing_required;
156	int32_t		oplock_enable;
157	int32_t		sync_enable;
158	int32_t		secmode;
159	int32_t		ipv6_enable;
160	int32_t		print_enable;
161	uint32_t	exec_flags;
162	smb_version_t	version;
163	char		nbdomain[NETBIOS_NAME_SZ];
164	char		fqdn[SMB_PI_MAX_DOMAIN];
165	char		hostname[SMB_PI_MAX_HOST];
166	char		system_comment[SMB_PI_MAX_COMMENT];
167} smb_ioc_cfg_t;
168
169typedef union smb_ioc {
170	smb_ioc_header_t	ioc_hdr;
171	smb_ioc_gmt_t		ioc_gmt;
172	smb_ioc_cfg_t		ioc_cfg;
173	smb_ioc_start_t		ioc_start;
174	smb_ioc_event_t		ioc_event;
175	smb_ioc_opennum_t	ioc_opennum;
176	smb_ioc_svcenum_t	ioc_svcenum;
177	smb_ioc_session_t	ioc_session;
178	smb_ioc_fileid_t	ioc_fileid;
179	smb_ioc_share_t		ioc_share;
180	smb_ioc_shareinfo_t	ioc_shareinfo;
181	smb_ioc_spooldoc_t	ioc_spooldoc;
182} smb_ioc_t;
183
184uint32_t smb_crc_gen(uint8_t *, size_t);
185
186#ifdef __cplusplus
187}
188#endif
189
190#endif /* _SMB_IOCTL_H_ */
191