14bff34e3Sthurlow /*
24bff34e3Sthurlow  * Copyright (c) 2000-2001, Boris Popov
34bff34e3Sthurlow  * All rights reserved.
44bff34e3Sthurlow  *
54bff34e3Sthurlow  * Redistribution and use in source and binary forms, with or without
64bff34e3Sthurlow  * modification, are permitted provided that the following conditions
74bff34e3Sthurlow  * are met:
84bff34e3Sthurlow  * 1. Redistributions of source code must retain the above copyright
94bff34e3Sthurlow  *    notice, this list of conditions and the following disclaimer.
104bff34e3Sthurlow  * 2. Redistributions in binary form must reproduce the above copyright
114bff34e3Sthurlow  *    notice, this list of conditions and the following disclaimer in the
124bff34e3Sthurlow  *    documentation and/or other materials provided with the distribution.
134bff34e3Sthurlow  * 3. All advertising materials mentioning features or use of this software
144bff34e3Sthurlow  *    must display the following acknowledgement:
154bff34e3Sthurlow  *    This product includes software developed by Boris Popov.
164bff34e3Sthurlow  * 4. Neither the name of the author nor the names of any co-contributors
174bff34e3Sthurlow  *    may be used to endorse or promote products derived from this software
184bff34e3Sthurlow  *    without specific prior written permission.
194bff34e3Sthurlow  *
204bff34e3Sthurlow  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
214bff34e3Sthurlow  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
224bff34e3Sthurlow  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
234bff34e3Sthurlow  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
244bff34e3Sthurlow  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
254bff34e3Sthurlow  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
264bff34e3Sthurlow  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
274bff34e3Sthurlow  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
284bff34e3Sthurlow  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
294bff34e3Sthurlow  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
304bff34e3Sthurlow  * SUCH DAMAGE.
314bff34e3Sthurlow  *
324bff34e3Sthurlow  * $Id: smb_subr.h,v 1.13 2004/09/14 22:59:08 lindak Exp $
334bff34e3Sthurlow  */
344bff34e3Sthurlow 
354bff34e3Sthurlow /*
36148c5f43SAlan Wright  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
3740c0e231SGordon Ross  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
384bff34e3Sthurlow  */
394bff34e3Sthurlow 
404bff34e3Sthurlow #ifndef _NETSMB_SMB_SUBR_H_
414bff34e3Sthurlow #define	_NETSMB_SMB_SUBR_H_
424bff34e3Sthurlow 
434bff34e3Sthurlow #include <sys/cmn_err.h>
444bff34e3Sthurlow #include <sys/lock.h>
454bff34e3Sthurlow #include <sys/note.h>
46*adee6784SGordon Ross #include <netsmb/mchain.h>
47430b4c46SGordon Ross #include <netsmb/smb_conn.h>
484bff34e3Sthurlow 
49*adee6784SGordon Ross /*
50*adee6784SGordon Ross  * Possible lock commands
51*adee6784SGordon Ross  */
52*adee6784SGordon Ross #define	SMB_LOCK_EXCL		0
53*adee6784SGordon Ross #define	SMB_LOCK_SHARED		1
54*adee6784SGordon Ross #define	SMB_LOCK_RELEASE	2
55*adee6784SGordon Ross 
5633697085SGordon Ross struct msgb;	/* avoiding sys/stream.h here */
5733697085SGordon Ross 
584bff34e3Sthurlow /* Helper function for SMBERROR */
594bff34e3Sthurlow /*PRINTFLIKE3*/
604bff34e3Sthurlow extern void smb_errmsg(int, const char *, const char *, ...)
614bff34e3Sthurlow 	__KPRINTFLIKE(3);
6233697085SGordon Ross void m_dumpm(struct msgb *);
634bff34e3Sthurlow 
644bff34e3Sthurlow /*
654bff34e3Sthurlow  * Let's use C99 standard variadic macros!
664bff34e3Sthurlow  * Also the C99 __func__ (function name) feature.
674bff34e3Sthurlow  */
684bff34e3Sthurlow #define	SMBERROR(...) \
694bff34e3Sthurlow 	smb_errmsg(CE_NOTE, __func__, __VA_ARGS__)
704bff34e3Sthurlow #define	SMBPANIC(...) \
714bff34e3Sthurlow 	smb_errmsg(CE_PANIC, __func__, __VA_ARGS__)
724bff34e3Sthurlow #define	SMBSDEBUG(...) \
734bff34e3Sthurlow 	smb_errmsg(CE_CONT, __func__, __VA_ARGS__)
744bff34e3Sthurlow #define	SMBIODEBUG(...) \
754bff34e3Sthurlow 	smb_errmsg(CE_CONT, __func__, __VA_ARGS__)
764bff34e3Sthurlow #define	NBDEBUG(...) \
774bff34e3Sthurlow 	smb_errmsg(CE_CONT, __func__, __VA_ARGS__)
784bff34e3Sthurlow 
794bff34e3Sthurlow #if defined(DEBUG) || defined(lint)
804bff34e3Sthurlow 
814bff34e3Sthurlow #define	DEBUG_ENTER(str) debug_enter(str)
824bff34e3Sthurlow 
834bff34e3Sthurlow #else /* DEBUG or lint */
844bff34e3Sthurlow 
854bff34e3Sthurlow #define	DEBUG_ENTER(str) ((void)0)
864bff34e3Sthurlow 
874bff34e3Sthurlow #endif /* DEBUG or lint */
884bff34e3Sthurlow 
894bff34e3Sthurlow typedef uint16_t	smb_unichar;
904bff34e3Sthurlow typedef	smb_unichar	*smb_uniptr;
914bff34e3Sthurlow 
924bff34e3Sthurlow extern smb_unichar smb_unieol;
934bff34e3Sthurlow 
944bff34e3Sthurlow struct mbchain;
954bff34e3Sthurlow struct smb_rq;
964bff34e3Sthurlow struct smb_vc;
974bff34e3Sthurlow 
98430b4c46SGordon Ross /*
99430b4c46SGordon Ross  * These are the attributes we can get from the server via
100430b4c46SGordon Ross  * SMB commands such as TRANS2_QUERY_FILE_INFORMATION
101430b4c46SGordon Ross  * with info level SMB_QFILEINFO_ALL_INFO, and directory
102430b4c46SGordon Ross  * FindFirst/FindNext info. levels FIND_DIRECTORY_INFO
103430b4c46SGordon Ross  * and FIND_BOTH_DIRECTORY_INFO, etc.
104430b4c46SGordon Ross  *
105430b4c46SGordon Ross  * Values in this struct are always native endian,
106430b4c46SGordon Ross  * and times are converted converted to Unix form.
107430b4c46SGordon Ross  * Note: zero in any of the times means "unknown".
108430b4c46SGordon Ross  */
109430b4c46SGordon Ross typedef struct smbfattr {
110430b4c46SGordon Ross 	timespec_t	fa_createtime;	/* Note, != ctime */
111430b4c46SGordon Ross 	timespec_t	fa_atime;	/* these 3 are like unix */
112430b4c46SGordon Ross 	timespec_t	fa_mtime;
113430b4c46SGordon Ross 	timespec_t	fa_ctime;
114430b4c46SGordon Ross 	u_offset_t	fa_size;	/* EOF position */
115430b4c46SGordon Ross 	u_offset_t	fa_allocsz;	/* Allocated size. */
116430b4c46SGordon Ross 	uint32_t	fa_attr;	/* Ext. file (DOS) attr */
117430b4c46SGordon Ross } smbfattr_t;
118430b4c46SGordon Ross 
1194bff34e3Sthurlow /*
1204bff34e3Sthurlow  * Tunable timeout values.  See: smb_smb.c
1214bff34e3Sthurlow  */
1224bff34e3Sthurlow extern int smb_timo_notice;
1234bff34e3Sthurlow extern int smb_timo_default;
1244bff34e3Sthurlow extern int smb_timo_open;
1254bff34e3Sthurlow extern int smb_timo_read;
1264bff34e3Sthurlow extern int smb_timo_write;
1274bff34e3Sthurlow extern int smb_timo_append;
12840c0e231SGordon Ross extern dev_t nsmb_dev_tcp;
12940c0e231SGordon Ross extern dev_t nsmb_dev_tcp6;
1304bff34e3Sthurlow 
131*adee6784SGordon Ross /*
132*adee6784SGordon Ross  * Tunable timeout values.  See: smb2_smb.c
133*adee6784SGordon Ross  */
134*adee6784SGordon Ross extern int smb2_timo_notice;
135*adee6784SGordon Ross extern int smb2_timo_default;
136*adee6784SGordon Ross extern int smb2_timo_open;
137*adee6784SGordon Ross extern int smb2_timo_read;
138*adee6784SGordon Ross extern int smb2_timo_write;
139*adee6784SGordon Ross extern int smb2_timo_append;
1404bff34e3Sthurlow 
141613a2f6bSGordon Ross void smb_credinit(struct smb_cred *scred, cred_t *cr);
1424bff34e3Sthurlow void smb_credrele(struct smb_cred *scred);
1434bff34e3Sthurlow 
1444bff34e3Sthurlow int  smb_maperror(int eclass, int eno);
145148c5f43SAlan Wright int  smb_maperr32(uint32_t eno);
14640c0e231SGordon Ross uint_t smb_doserr2status(int, int);
147*adee6784SGordon Ross int smb_get_dstring(struct mdchain *mdc, struct smb_vc *vcp,
148*adee6784SGordon Ross 	char *outbuf, size_t *outlen, int inlen);
1494bff34e3Sthurlow int  smb_put_dmem(struct mbchain *mbp, struct smb_vc *vcp,
1504bff34e3Sthurlow     const char *src, int len, int caseopt, int *lenp);
1514bff34e3Sthurlow int  smb_put_dstring(struct mbchain *mbp, struct smb_vc *vcp,
1524bff34e3Sthurlow     const char *src, int caseopt);
1534bff34e3Sthurlow int  smb_put_string(struct smb_rq *rqp, const char *src);
1544bff34e3Sthurlow int  smb_put_asunistring(struct smb_rq *rqp, const char *src);
155*adee6784SGordon Ross 
156*adee6784SGordon Ross int smb_smb_ntcreate(struct smb_share *ssp, struct mbchain *name_mb,
157*adee6784SGordon Ross 	uint32_t crflag, uint32_t req_acc, uint32_t efa, uint32_t sh_acc,
158*adee6784SGordon Ross 	uint32_t disp, uint32_t createopt,  uint32_t impersonate,
159*adee6784SGordon Ross 	struct smb_cred *scrp, smb_fh_t *fhp,
160*adee6784SGordon Ross 	uint32_t *cr_act_p, struct smbfattr *fap);
161*adee6784SGordon Ross 
162*adee6784SGordon Ross int smb_smb_close(struct smb_share *ssp, smb_fh_t *fhp,
163*adee6784SGordon Ross 	struct smb_cred *scrp);
164*adee6784SGordon Ross 
165*adee6784SGordon Ross int smb_rwuio(smb_fh_t *fhp, uio_rw_t rw,
166*adee6784SGordon Ross 	uio_t *uiop, smb_cred_t *scred, int timo);
1674bff34e3Sthurlow 
1684bff34e3Sthurlow int smb_cmp_sockaddr(struct sockaddr *, struct sockaddr *);
1694bff34e3Sthurlow struct sockaddr *smb_dup_sockaddr(struct sockaddr *sa);
1704bff34e3Sthurlow void smb_free_sockaddr(struct sockaddr *sa);
1714bff34e3Sthurlow 
17240c0e231SGordon Ross int smb_sign_init(struct smb_vc *);
17302d09e03SGordon Ross void smb_rq_sign(struct smb_rq *);
1749c9af259SGordon Ross int smb_rq_verify(struct smb_rq *);
1759c9af259SGordon Ross int smb_calcv2mackey(struct smb_vc *, const uchar_t *,
1769c9af259SGordon Ross 	const uchar_t *, size_t);
1779c9af259SGordon Ross int smb_calcmackey(struct smb_vc *, const uchar_t *,
1789c9af259SGordon Ross 	const uchar_t *, size_t);
1799c9af259SGordon Ross 
180*adee6784SGordon Ross int smb2_sign_init(struct smb_vc *);
181*adee6784SGordon Ross void smb2_rq_sign(struct smb_rq *);
182*adee6784SGordon Ross int smb2_rq_verify(struct smb_rq *);
183430b4c46SGordon Ross 
184430b4c46SGordon Ross /*
185430b4c46SGordon Ross  * SMB protocol level functions
186430b4c46SGordon Ross  */
18740c0e231SGordon Ross int  smb_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred);
18840c0e231SGordon Ross int  smb_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred);
189*adee6784SGordon Ross int  smb_smb_logoff(struct smb_vc *vcp, struct smb_cred *scred);
190430b4c46SGordon Ross int  smb_smb_echo(smb_vc_t *vcp, smb_cred_t *scred, int timo);
191430b4c46SGordon Ross int  smb_smb_treeconnect(smb_share_t *ssp, smb_cred_t *scred);
192430b4c46SGordon Ross int  smb_smb_treedisconnect(smb_share_t *ssp, smb_cred_t *scred);
193430b4c46SGordon Ross 
194*adee6784SGordon Ross int smb1_smb_ntcreate(struct smb_share *ssp, struct mbchain *name_mb,
195430b4c46SGordon Ross 	uint32_t crflag, uint32_t req_acc, uint32_t efa, uint32_t sh_acc,
196430b4c46SGordon Ross 	uint32_t disp, uint32_t createopt,  uint32_t impersonate,
197430b4c46SGordon Ross 	struct smb_cred *scrp, uint16_t *fidp,
198430b4c46SGordon Ross 	uint32_t *cr_act_p, struct smbfattr *fap);
199430b4c46SGordon Ross 
200*adee6784SGordon Ross int smb1_smb_close(struct smb_share *ssp, uint16_t fid,
201430b4c46SGordon Ross 	struct timespec *mtime, struct smb_cred *scrp);
202430b4c46SGordon Ross 
203*adee6784SGordon Ross int smb_smb_open_prjob(struct smb_share *ssp, char *title,
204430b4c46SGordon Ross 	uint16_t setuplen, uint16_t mode,
205430b4c46SGordon Ross 	struct smb_cred *scrp, uint16_t *fidp);
206430b4c46SGordon Ross 
207430b4c46SGordon Ross int  smb_smb_close_prjob(struct smb_share *ssp, uint16_t fid,
208430b4c46SGordon Ross 	struct smb_cred *scrp);
209430b4c46SGordon Ross 
210*adee6784SGordon Ross int smb_smb_readx(smb_fh_t *fhp, uint32_t *lenp,
211*adee6784SGordon Ross 	uio_t *uiop, smb_cred_t *scred, int timo);
212*adee6784SGordon Ross int smb_smb_writex(smb_fh_t *fhp, uint32_t *lenp,
213430b4c46SGordon Ross 	uio_t *uiop, smb_cred_t *scred, int timo);
214430b4c46SGordon Ross 
215430b4c46SGordon Ross /*
216*adee6784SGordon Ross  * SMB2 protocol level functions
217430b4c46SGordon Ross  */
218*adee6784SGordon Ross int  smb2_smb_negotiate(struct smb_vc *vcp, struct smb_cred *scred);
219*adee6784SGordon Ross int  smb2_smb_ssnsetup(struct smb_vc *vcp, struct smb_cred *scred);
220*adee6784SGordon Ross int  smb2_smb_logoff(struct smb_vc *vcp, struct smb_cred *scred);
221*adee6784SGordon Ross int  smb2_smb_echo(smb_vc_t *vcp, smb_cred_t *scred, int timo);
222*adee6784SGordon Ross int  smb2_smb_treeconnect(smb_share_t *ssp, smb_cred_t *scred);
223*adee6784SGordon Ross int  smb2_smb_treedisconnect(smb_share_t *ssp, smb_cred_t *scred);
224*adee6784SGordon Ross 
225*adee6784SGordon Ross int
226*adee6784SGordon Ross smb2_smb_ntcreate(struct smb_share *ssp, struct mbchain *name_mb,
227*adee6784SGordon Ross 	struct mbchain *cctx_in, struct mdchain *cctx_out,
228*adee6784SGordon Ross 	uint32_t crflag, uint32_t req_acc, uint32_t efa, uint32_t sh_acc,
229*adee6784SGordon Ross 	uint32_t disp, uint32_t createopt,  uint32_t impersonate,
230*adee6784SGordon Ross 	struct smb_cred *scrp, smb2fid_t *fidp,
231*adee6784SGordon Ross 	uint32_t *cr_act_p, struct smbfattr *fap);
232*adee6784SGordon Ross 
233*adee6784SGordon Ross int  smb2_smb_close(struct smb_share *ssp, smb2fid_t *fid,
234*adee6784SGordon Ross 	struct smb_cred *scrp);
235*adee6784SGordon Ross 
236*adee6784SGordon Ross int smb2_smb_ioctl(struct smb_share *ssp, smb2fid_t *fid,
237*adee6784SGordon Ross 	struct mbchain *data_in, struct mdchain *data_out,
238*adee6784SGordon Ross 	uint32_t *data_out_sz,	/* max / returned */
239*adee6784SGordon Ross 	uint32_t ctl_code, struct smb_cred *scrp);
240*adee6784SGordon Ross 
241*adee6784SGordon Ross int smb2_smb_read(smb_fh_t *fhp, uint32_t *lenp,
242*adee6784SGordon Ross 	uio_t *uiop, smb_cred_t *scred, int timo);
243*adee6784SGordon Ross int smb2_smb_write(smb_fh_t *fhp, uint32_t *lenp,
244*adee6784SGordon Ross 	uio_t *uiop, smb_cred_t *scred, int timo);
245430b4c46SGordon Ross 
246*adee6784SGordon Ross /*
247*adee6784SGordon Ross  * time conversions
248*adee6784SGordon Ross  */
24902d09e03SGordon Ross 
25002d09e03SGordon Ross void  smb_time_local2server(struct timespec *tsp, int tzoff, long *seconds);
25102d09e03SGordon Ross void  smb_time_server2local(ulong_t seconds, int tzoff, struct timespec *tsp);
25202d09e03SGordon Ross void  smb_time_NT2local(uint64_t nsec, struct timespec *tsp);
25302d09e03SGordon Ross void  smb_time_local2NT(struct timespec *tsp, uint64_t *nsec);
25402d09e03SGordon Ross 
2554bff34e3Sthurlow #endif /* !_NETSMB_SMB_SUBR_H_ */
256