xref: /onnv-gate/usr/src/uts/common/smbsrv/ndr.h (revision 8334:5f1c6a3b0fad)
15331Samw /*
25331Samw  * CDDL HEADER START
35331Samw  *
45331Samw  * The contents of this file are subject to the terms of the
55331Samw  * Common Development and Distribution License (the "License").
65331Samw  * You may not use this file except in compliance with the License.
75331Samw  *
85331Samw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95331Samw  * or http://www.opensolaris.org/os/licensing.
105331Samw  * See the License for the specific language governing permissions
115331Samw  * and limitations under the License.
125331Samw  *
135331Samw  * When distributing Covered Code, include this CDDL HEADER in each
145331Samw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155331Samw  * If applicable, add the following below this CDDL HEADER, with the
165331Samw  * fields enclosed by brackets "[]" replaced with your own identifying
175331Samw  * information: Portions Copyright [yyyy] [name of copyright owner]
185331Samw  *
195331Samw  * CDDL HEADER END
205331Samw  */
215331Samw /*
226482Samw  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
235331Samw  * Use is subject to license terms.
245331Samw  */
255331Samw 
265331Samw #ifndef _SMBSRV_NDR_H
275331Samw #define	_SMBSRV_NDR_H
285331Samw 
295331Samw /*
305331Samw  * Network Data Representation (NDR) is a compatible subset of DCE RPC
315331Samw  * and MSRPC NDR.  NDR is used to move parameters consisting of
325331Samw  * complicated trees of data constructs between an RPC client and server.
335331Samw  *
345331Samw  * CAE Specification (1997)
355331Samw  * DCE 1.1: Remote Procedure Call
365331Samw  * Document Number: C706
375331Samw  * The Open Group
385331Samw  * ogspecs@opengroup.org
395331Samw  */
405331Samw 
415331Samw #ifndef _KERNEL
427052Samw #include <sys/types.h>
437052Samw #include <sys/uio.h>
445331Samw #include <syslog.h>
455331Samw #include <stdlib.h>
465331Samw #include <string.h>
47*8334SJose.Borrego@Sun.COM #include <smbsrv/wintypes.h>
48*8334SJose.Borrego@Sun.COM #include <smbsrv/ndl/rpcpdu.ndl>
495521Sas200622 #include <smbsrv/smb_i18n.h>
505331Samw #endif
515331Samw 
525331Samw #ifdef __cplusplus
535331Samw extern "C" {
545331Samw #endif
555331Samw 
565331Samw /*
575331Samw  * Normal sequence:
585331Samw  *	- Application calls client-side stub w/ TOP-MOST arg structure
595331Samw  *	- client stub performs NDR_M_OP_MARSHALL+NDR_DIR_IN
605331Samw  *	- PDU conveyed (request, aka call, aka query)
615331Samw  *	- server stub performs NDR_M_OP_UNMARSHALL+NDR_DIR_IN
625331Samw  *	- server function called w/ TOP-MOST arg structure
635331Samw  *	- server function returns w/ TOP-MOST arg structure modified
645331Samw  *	- server stub performs NDR_M_OP_MARSHALL+NDR_DIR_OUT
655331Samw  *	- PDU conveyed (reply, aka result, aka response)
665331Samw  *	- client stub performs NDR_M_OP_UNMARSHALL+NDR_DIR_OUT
675331Samw  *	- return to Application w/ TOP-MOST arg structure modified
685331Samw  *
695331Samw  * An interface is a sequence of top-most constructs.  Each top-most
705331Samw  * construct corresponds to one parameter, either argument or return
715331Samw  * value.
725331Samw  *
735331Samw  * A top-most construct is a sequence of outer constructs.  The first
745331Samw  * outer construct is the referent of the argument, and the subsequent
755331Samw  * outer constructs are descendents referenced by pointers from prior
765331Samw  * constructs.
775331Samw  *
785331Samw  * An outer construct is a sequence of variable-sized info, fixed-sized
795331Samw  * data, and variable-sized data.
805331Samw  */
815331Samw 
825331Samw /*
835331Samw  * Terminology
845331Samw  *
855331Samw  * The ALL UPPER CASE terms recur in the DCE/RPC documentation.
865331Samw  * The mixed-case names have been introduced as a reading aid.
875331Samw  *
885331Samw  * Size		The size of an array in elements. Think of this
895331Samw  *		as the amount to malloc().
905331Samw  *
915331Samw  * Length	The number of elements of an array which are significant
925331Samw  *		Think of this as the amount to bcopy().
935331Samw  *
945331Samw  * Known	Size/length is known at build time.
955331Samw  *
965331Samw  * Determined	Size/length is determined at run time.
975331Samw  *
985331Samw  * FIXED	The Size and Length are Known.
995331Samw  *		Think of this as a string constant or a DOS 8.3 file name.
1005331Samw  *		char array[] = "A Constant Size/Length";
1015331Samw  *
1025331Samw  * CONFORMANT	The Size is Determined. Length is the same as Size.
1035331Samw  *		Think of this as strdup().
1045331Samw  *		char *array = strdup("Something");
1055331Samw  *
1065331Samw  * VARYING	The Size is Known. The Length is determined.
1075331Samw  *		Think of this as a strcpy() of a variable length string
1085331Samw  *		into a fixed length buffer:
1095331Samw  *		char array[100];
1105331Samw  *		strcpy(array, "very short string");
1115331Samw  *
1125331Samw  * VARYING/CONFORMANT
1135331Samw  *		The Size is Determined. The Length is separately Determined.
1145331Samw  *		Think of this like:
1155331Samw  *		char *array = malloc(size);
1165331Samw  *		strcpy(array, "short string");
1175331Samw  *
1185331Samw  * STRING	Strings can be CONFORMANT, VARYING, or CONFORMANT/VARYING.
1195331Samw  *		A string is fundamentally an array with the last
1205331Samw  *		significant element some sort of NULL.
1215331Samw  */
1225331Samw 
1235331Samw #define	NDR_F_NONE		0x0000	/* no flags */
1245331Samw #define	NDR_F_PARAMS_MASK	0x00FF
1255331Samw #define	NDR_F_SIZE_IS		0x0001	/* [size_is(X)] required/given */
1265331Samw #define	NDR_F_LENGTH_IS		0x0002	/* not implemented */
1275331Samw #define	NDR_F_SWITCH_IS		0x0004	/* [switch_is(X)] req./given */
1285331Samw #define	NDR_F_IS_STRING		0x0008	/* [string] req./given */
1295331Samw #define	NDR_F_IS_POINTER	0x0010	/* TYPE * ... req./given */
1305331Samw #define	NDR_F_IS_REFERENCE	0x0020	/* TYPE & ... req./given */
1315331Samw #define	NDR_F_DIMENSION_IS	0x0040	/* TYPE [N] req./given */
1325331Samw 
1335331Samw #define	NDR_F_WHENCE_MASK	0x00F0
1345331Samw #define	NDR_F_BACKPTR		0x0010	/* ref cause by pointer */
1355331Samw #define	NDR_F_OUTER		0x0020	/* ref caused by outer */
1365331Samw #define	NDR_F_TOPMOST		0x0040	/* ref caused by topmost */
1375331Samw 
1385331Samw #define	NDR_F_TYPEOP_MASK	0x0F00
1395331Samw #define	NDR_F_ARRAY		0x0100	/* type is array of somethings */
1405331Samw #define	NDR_F_POINTER		0x0200	/* type is pointer to something(s) */
1415331Samw #define	NDR_F_STRING		0x0300	/* type is string of somethings */
1425331Samw #define	NDR_F_UNION		0x0400	/* type is a union */
1435331Samw #define	NDR_F_STRUCT		0x0500	/* type is a structure */
1445331Samw #define	NDR_F_OPERATION		0x0600	/* type is a structure, special */
1455331Samw #define	NDR_F_INTERFACE		0x0700	/* type is a union, special */
1465331Samw #define	NDR_F_CONFORMANT	0x1000	/* struct conforming (var-size tail) */
1475331Samw #define	NDR_F_VARYING		0x2000	/* not implemented */
1485331Samw 
149*8334SJose.Borrego@Sun.COM struct ndr_heap;
150*8334SJose.Borrego@Sun.COM struct ndr_stream;
1515331Samw struct ndr_reference;
1525331Samw 
153*8334SJose.Borrego@Sun.COM typedef struct ndr_typeinfo {
1545331Samw 	unsigned char		version;	/* sanity check */
1555331Samw 	unsigned char		alignment;	/* mask */
1565331Samw 	unsigned short		type_flags;	/* NDR_F_... */
157*8334SJose.Borrego@Sun.COM 	int			(*ndr_func)(struct ndr_reference *);
1585331Samw 	unsigned short		pdu_size_fixed_part;
1595331Samw 	unsigned short		pdu_size_variable_part;
1605331Samw 	unsigned short		c_size_fixed_part;
1615331Samw 	unsigned short		c_size_variable_part;
162*8334SJose.Borrego@Sun.COM } ndr_typeinfo_t;
1635331Samw 
164*8334SJose.Borrego@Sun.COM typedef struct ndr_reference {
1655331Samw 	struct ndr_reference	*next;		/* queue list (outer only) */
1665331Samw 	struct ndr_reference	*enclosing;	/* e.g. struct for this memb */
167*8334SJose.Borrego@Sun.COM 	struct ndr_stream	*stream;	/* root of NDR */
168*8334SJose.Borrego@Sun.COM 	ndr_typeinfo_t		*ti;		/* type of data referenced */
1695331Samw 	char			*name;		/* name of this member */
1705331Samw 	unsigned long		pdu_offset;	/* referent in stub data */
1715331Samw 	char			*datum;		/* referent in local memory */
1725331Samw 	char			**backptr;	/* referer to set */
1735331Samw 	unsigned short		outer_flags;	/* XXX_is() from top level */
1745331Samw 	unsigned short		inner_flags;	/* XXX_is() in encapsulated */
1755331Samw 	unsigned short		type_flags;	/* "requires" */
1765331Samw 	unsigned short		packed_alignment;
1775331Samw 	unsigned long		size_is;	/* conforming constructs */
1785331Samw 	unsigned long		strlen_is;	/* strings */
1795331Samw 	unsigned long		switch_is;	/* union arg selector */
1805331Samw 	unsigned long		dimension_is;	/* fixed-len array size */
1815331Samw 	unsigned long		pdu_end_offset;	/* offset for limit of PDU */
182*8334SJose.Borrego@Sun.COM } ndr_ref_t;
1835331Samw 
1845331Samw /*
185*8334SJose.Borrego@Sun.COM  * For all operations, the ndr_stream, which is the root of NDR processing,
186*8334SJose.Borrego@Sun.COM  * is the primary object.  When available, the appropriate ndr_ref_t
1875331Samw  * is passed, NULL otherwise.  Functions that return 'int' should return
1885331Samw  * TRUE (!0) or FALSE (0).  When functions return FALSE, including
189*8334SJose.Borrego@Sun.COM  * ndo_malloc() returning NULL, they should set the stream->error to an
1905331Samw  * appropriate indicator of what went wrong.
1915331Samw  *
192*8334SJose.Borrego@Sun.COM  * Functions ndo_get_pdu(), ndo_put_pdu(), and ndo_pad_pdu() must
1935331Samw  * never grow the PDU data.  A request for out-of-bounds data is an error.
1945331Samw  * The swap_bytes flag is 1 if NDR knows that the byte-order in the PDU
195*8334SJose.Borrego@Sun.COM  * is different from the local system.  ndo_pad_pdu() advised that the
1965331Samw  * affected bytes should be zero filled.
1975331Samw  */
198*8334SJose.Borrego@Sun.COM typedef struct ndr_stream_ops {
199*8334SJose.Borrego@Sun.COM 	char *(*ndo_malloc)(struct ndr_stream *, unsigned, ndr_ref_t *);
200*8334SJose.Borrego@Sun.COM 	int (*ndo_free)(struct ndr_stream *, char *, ndr_ref_t *);
201*8334SJose.Borrego@Sun.COM 	int (*ndo_grow_pdu)(struct ndr_stream *, unsigned long, ndr_ref_t *);
202*8334SJose.Borrego@Sun.COM 	int (*ndo_pad_pdu)(struct ndr_stream *, unsigned long,
203*8334SJose.Borrego@Sun.COM 	    unsigned long, ndr_ref_t *);
204*8334SJose.Borrego@Sun.COM 	int (*ndo_get_pdu)(struct ndr_stream *, unsigned long,
205*8334SJose.Borrego@Sun.COM 	    unsigned long, char *, int, ndr_ref_t *);
206*8334SJose.Borrego@Sun.COM 	int (*ndo_put_pdu)(struct ndr_stream *, unsigned long,
207*8334SJose.Borrego@Sun.COM 	    unsigned long, char *, int, ndr_ref_t *);
208*8334SJose.Borrego@Sun.COM 	void (*ndo_tattle)(struct ndr_stream *, char *, ndr_ref_t *);
209*8334SJose.Borrego@Sun.COM 	void (*ndo_tattle_error)(struct ndr_stream *, ndr_ref_t *);
210*8334SJose.Borrego@Sun.COM 	int (*ndo_reset)(struct ndr_stream *);
211*8334SJose.Borrego@Sun.COM 	void (*ndo_destruct)(struct ndr_stream *);
212*8334SJose.Borrego@Sun.COM } ndr_stream_ops_t;
2135331Samw 
214*8334SJose.Borrego@Sun.COM #define	NDS_MALLOC(NDS, LEN, REF) \
215*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_malloc)(NDS, LEN, REF)
216*8334SJose.Borrego@Sun.COM #define	NDS_GROW_PDU(NDS, WANT_END_OFF, REF) \
217*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_grow_pdu)(NDS, WANT_END_OFF, REF)
218*8334SJose.Borrego@Sun.COM #define	NDS_PAD_PDU(NDS, PDU_OFFSET, N_BYTES, REF) \
219*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_pad_pdu)(NDS, PDU_OFFSET, N_BYTES, REF)
220*8334SJose.Borrego@Sun.COM #define	NDS_GET_PDU(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF) \
221*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_get_pdu)(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF)
222*8334SJose.Borrego@Sun.COM #define	NDS_PUT_PDU(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF) \
223*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_put_pdu)(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF)
224*8334SJose.Borrego@Sun.COM #define	NDS_TATTLE(NDS, WHAT, REF) \
225*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_tattle)(NDS, WHAT, REF)
226*8334SJose.Borrego@Sun.COM #define	NDS_TATTLE_ERROR(NDS, WHAT, REF) \
227*8334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_tattle_error)(NDS, REF)
228*8334SJose.Borrego@Sun.COM #define	NDS_RESET(NDS)		(*(NDS)->ndo->ndo_reset)(NDS)
229*8334SJose.Borrego@Sun.COM #define	NDS_DESTRUCT(NDS)	(*(NDS)->ndo->ndo_destruct)(NDS)
2305331Samw 
2316482Samw typedef struct ndr_frag {
2326482Samw 	struct ndr_frag *next;
2336482Samw 	uint8_t *buf;
2346482Samw 	uint32_t len;
2356482Samw } ndr_frag_t;
2366482Samw 
2377052Samw typedef struct ndr_fraglist {
2387052Samw 	struct uio	uio;
2397052Samw 	iovec_t		*iov;
2407052Samw 	ndr_frag_t	*head;
2417052Samw 	ndr_frag_t	*tail;
2427052Samw 	uint32_t	nfrag;
2437052Samw } ndr_fraglist_t;
2447052Samw 
245*8334SJose.Borrego@Sun.COM typedef struct ndr_stream {
2465331Samw 	unsigned long		pdu_size;
2475331Samw 	unsigned long		pdu_max_size;
2485331Samw 	unsigned long		pdu_base_offset;
2495331Samw 	unsigned long		pdu_scan_offset;
2505331Samw 	unsigned char		*pdu_base_addr;
2515331Samw 
2527052Samw 	ndr_fraglist_t		frags;
253*8334SJose.Borrego@Sun.COM 	ndr_stream_ops_t	*ndo;
2545331Samw 
2555331Samw 	unsigned char		m_op;
2565331Samw 	unsigned char		dir;
2575331Samw 	unsigned char		swap;		/* native/net endian swap */
2585521Sas200622 	unsigned char		flags;
2595331Samw 	short			error;
2605331Samw 	short			error_ref;
2615331Samw 
262*8334SJose.Borrego@Sun.COM 	ndr_ref_t *outer_queue_head;
263*8334SJose.Borrego@Sun.COM 	ndr_ref_t **outer_queue_tailp;
264*8334SJose.Borrego@Sun.COM 	ndr_ref_t *outer_current;
265*8334SJose.Borrego@Sun.COM 	struct ndr_heap *heap;
266*8334SJose.Borrego@Sun.COM } ndr_stream_t;
2675331Samw 
2685331Samw #define	NDR_M_OP_NONE		0x00
2695331Samw #define	NDR_M_OP_MARSHALL	0x01	/* data moving from datum to PDU */
2705331Samw #define	NDR_M_OP_UNMARSHALL	0x02	/* data moving from PDU to datum */
2715331Samw 
2725331Samw #define	NDR_DIR_NONE		0x00
2735331Samw #define	NDR_DIR_IN		0x10	/* data moving from caller to callee */
2745331Samw #define	NDR_DIR_OUT		0x20	/* data moving from callee to caller */
2755331Samw 
2765331Samw #define	NDR_MODE_CALL_SEND	(NDR_M_OP_MARSHALL + NDR_DIR_IN)
2775331Samw #define	NDR_MODE_CALL_RECV	(NDR_M_OP_UNMARSHALL + NDR_DIR_IN)
2785331Samw #define	NDR_MODE_RETURN_SEND	(NDR_M_OP_MARSHALL + NDR_DIR_OUT)
2795331Samw #define	NDR_MODE_RETURN_RECV	(NDR_M_OP_UNMARSHALL + NDR_DIR_OUT)
2805331Samw 
281*8334SJose.Borrego@Sun.COM #define	NDR_MODE_TO_M_OP(MODE)	((MODE) & 0x0F)
282*8334SJose.Borrego@Sun.COM #define	NDR_MODE_TO_DIR(MODE)	((MODE) & 0xF0)
2835331Samw #define	NDR_M_OP_AND_DIR_TO_MODE(M_OP, DIR)	((M_OP)|(DIR))
2845331Samw 
285*8334SJose.Borrego@Sun.COM #define	NDR_MODE_MATCH(NDS, MODE) \
286*8334SJose.Borrego@Sun.COM 	(NDR_M_OP_AND_DIR_TO_MODE((NDS)->m_op, (NDS)->dir) == (MODE))
2875331Samw 
288*8334SJose.Borrego@Sun.COM #define	NDS_F_NONE		0x00
289*8334SJose.Borrego@Sun.COM #define	NDS_F_NOTERM		0x01	/* strings are not null terminated */
290*8334SJose.Borrego@Sun.COM #define	NDS_SETF(S, F)		((S)->flags |= (F))
291*8334SJose.Borrego@Sun.COM #define	NDS_CLEARF(S, F)	((S)->flags &= ~(F))
2925331Samw 
2935331Samw #define	NDR_ERR_MALLOC_FAILED		-1
2945331Samw #define	NDR_ERR_M_OP_INVALID		-2
2955331Samw #define	NDR_ERR_UNDERFLOW		-3
2965331Samw #define	NDR_ERR_GROW_FAILED		-4	/* overflow */
2975331Samw #define	NDR_ERR_PAD_FAILED		-5	/* couldn't possibly happen */
2985331Samw #define	NDR_ERR_OUTER_HEADER_BAD	-6
2995331Samw #define	NDR_ERR_SWITCH_VALUE_ILLEGAL	-7
3005331Samw #define	NDR_ERR_SWITCH_VALUE_INVALID	-8
3015331Samw #define	NDR_ERR_SWITCH_VALUE_MISSING	-9
3025331Samw #define	NDR_ERR_SIZE_IS_MISMATCH_PDU	-10
3035331Samw #define	NDR_ERR_SIZE_IS_MISMATCH_AFTER	-11
3045331Samw #define	NDR_ERR_SIZE_IS_UNEXPECTED	-12
3055331Samw #define	NDR_ERR_SIZE_IS_DUPLICATED	-13
3065331Samw #define	NDR_ERR_OUTER_PARAMS_MISMATCH	-14
3075331Samw #define	NDR_ERR_ARRAY_VARLEN_ILLEGAL	-15
3085331Samw #define	NDR_ERR_ARRAY_UNION_ILLEGAL	-16
3095331Samw #define	NDR_ERR_OUTER_PARAMS_BAD	-17
3105331Samw #define	NDR_ERR_OUTER_UNION_ILLEGAL	-18
3115331Samw #define	NDR_ERR_TOPMOST_UNION_ILLEGAL	-19
3125331Samw #define	NDR_ERR_TOPMOST_VARLEN_ILLEGAL	-20
3135331Samw #define	NDR_ERR_INNER_PARAMS_BAD	-21
3145331Samw #define	NDR_ERR_UNIMPLEMENTED		-22
3155331Samw #define	NDR_ERR_NOT_AN_INTERFACE	-23
3165331Samw #define	NDR_ERR_STRLEN			-24
3175331Samw #define	NDR_ERR_STRING_SIZING		-25
3185331Samw #define	NDR_ERR_BOUNDS_CHECK		-26
3195331Samw 
3205331Samw #define	NDR_SET_ERROR(REF, ERROR)			\
3215331Samw 	((REF)->stream->error = (ERROR),		\
3225331Samw 	(REF)->stream->error_ref = __LINE__,		\
323*8334SJose.Borrego@Sun.COM 	NDS_TATTLE_ERROR((REF)->stream, 0, REF))
3245331Samw 
3255331Samw #define	NDR_TATTLE(REF, WHAT) \
326*8334SJose.Borrego@Sun.COM 	(*(REF)->stream->ndo->ndo_tattle)((REF)->stream, WHAT, REF)
3275331Samw 
3285331Samw #define	MEMBER_STR(MEMBER) #MEMBER
3295331Samw 
3305331Samw #define	NDR_DIR_IS_IN  (encl_ref->stream->dir == NDR_DIR_IN)
3315331Samw #define	NDR_DIR_IS_OUT (encl_ref->stream->dir == NDR_DIR_OUT)
3325331Samw 
3335331Samw #define	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3345331Samw 		ARGFLAGS, ARGMEM, ARGVAL) { \
3355331Samw 		myref.pdu_offset = encl_ref->pdu_offset + (OFFSET);	\
3365331Samw 		myref.name = MEMBER_STR(MEMBER);			\
3375331Samw 		myref.datum = (char *)&val->MEMBER;			\
3385331Samw 		myref.inner_flags = ARGFLAGS;				\
3395331Samw 		myref.ti = &ndt_##TYPE;					\
3405331Samw 		myref.ARGMEM = ARGVAL;					\
341*8334SJose.Borrego@Sun.COM 		if (!ndr_inner(&myref))					\
3425331Samw 			return (0);					\
3435331Samw 	}
3445331Samw 
3455331Samw #define	NDR_MEMBER(TYPE, MEMBER, OFFSET) \
3465331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3475331Samw 		NDR_F_NONE, size_is, 0)
3485331Samw 
3495331Samw #define	NDR_MEMBER_ARR_WITH_SIZE_IS(TYPE, MEMBER, OFFSET, SIZE_IS) \
3505331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3515331Samw 		NDR_F_SIZE_IS, size_is, SIZE_IS)
3525331Samw 
3535331Samw #define	NDR_MEMBER_ARR_WITH_DIMENSION(TYPE, MEMBER, OFFSET, SIZE_IS) \
3545331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3555331Samw 		NDR_F_DIMENSION_IS, dimension_is, SIZE_IS)
3565331Samw 
3575331Samw #define	NDR_MEMBER_PTR_WITH_SIZE_IS(TYPE, MEMBER, OFFSET, SIZE_IS) \
3585331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3595331Samw 		NDR_F_SIZE_IS+NDR_F_IS_POINTER, size_is, SIZE_IS)
3605331Samw 
3615331Samw #define	NDR_MEMBER_PTR(TYPE, MEMBER, OFFSET)		\
3625331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET,	\
3635331Samw 		NDR_F_IS_POINTER, size_is, 0)
3645331Samw 
3655331Samw #define	NDR_MEMBER_WITH_SWITCH_IS(TYPE, MEMBER, OFFSET, SWITCH_IS)	\
3665331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET,			\
3675331Samw 		NDR_F_SWITCH_IS, switch_is, SWITCH_IS)
3685331Samw 
3695331Samw 
3705331Samw #define	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER, \
3715331Samw 		ARGFLAGS, ARGMEM, ARGVAL) { \
3725331Samw 		myref.pdu_offset = -1;					\
3735331Samw 		myref.name = MEMBER_STR(MEMBER);			\
3745331Samw 		myref.datum = (char *)&val->MEMBER;			\
3755331Samw 		myref.inner_flags = ARGFLAGS;				\
3765331Samw 		myref.ti = &ndt_##TYPE;					\
3775331Samw 		myref.ARGMEM = ARGVAL;					\
378*8334SJose.Borrego@Sun.COM 		if (!ndr_topmost(&myref))				\
3795331Samw 			return (0);					\
3805331Samw 	}
3815331Samw 
3825331Samw #define	NDR_TOPMOST_MEMBER(TYPE, MEMBER)	   			\
3835331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
3845331Samw 		NDR_F_NONE, size_is, 0)
3855331Samw 
3865331Samw #define	NDR_TOPMOST_MEMBER_ARR_WITH_SIZE_IS(TYPE, MEMBER, SIZE_IS)	\
3875331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,		    	\
3885331Samw 		NDR_F_SIZE_IS, size_is, SIZE_IS)
3895331Samw 
3905331Samw #define	NDR_TOPMOST_MEMBER_ARR_WITH_DIMENSION(TYPE, MEMBER, SIZE_IS)	\
3915331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,		      	\
3925331Samw 		NDR_F_DIMENSION_IS, dimension_is, SIZE_IS)
3935331Samw 
3945331Samw #define	NDR_TOPMOST_MEMBER_PTR_WITH_SIZE_IS(TYPE, MEMBER, SIZE_IS)	\
3955331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
3965331Samw 		NDR_F_SIZE_IS+NDR_F_IS_POINTER, size_is, SIZE_IS)
3975331Samw 
3985331Samw #define	NDR_TOPMOST_MEMBER_PTR(TYPE, MEMBER)		\
3995331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,	\
4005331Samw 		NDR_F_IS_POINTER, size_is, 0)
4015331Samw 
4025331Samw #define	NDR_TOPMOST_MEMBER_REF(TYPE, MEMBER)		\
4035331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,	\
4045331Samw 		NDR_F_IS_REFERENCE, size_is, 0)
4055331Samw 
4065331Samw #define	NDR_TOPMOST_MEMBER_REF_WITH_SIZE_IS(TYPE, MEMBER, SIZE_IS)	\
4075331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
4085331Samw 		NDR_F_SIZE_IS+NDR_F_IS_REFERENCE, size_is, SIZE_IS)
4095331Samw 
4105331Samw #define	NDR_TOPMOST_MEMBER_WITH_SWITCH_IS(TYPE, MEMBER, SWITCH_IS)	\
4115331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
4125331Samw 		NDR_F_SWITCH_IS, switch_is, SWITCH_IS)
4135331Samw 
4145331Samw /* this is assuming offset+0 */
4155331Samw #define	NDR_PARAMS_MEMBER_WITH_ARG(TYPE, MEMBER, ARGFLAGS, \
4165331Samw 	ARGMEM, ARGVAL) { \
4175331Samw 		myref.pdu_offset = encl_ref->pdu_offset;		\
4185331Samw 		myref.name = MEMBER_STR(MEMBER);			\
4195331Samw 		myref.datum = (char *)&val->MEMBER;			\
4205331Samw 		myref.inner_flags = ARGFLAGS;				\
4215331Samw 		myref.ti = &ndt_##TYPE;					\
4225331Samw 		myref.ARGMEM = ARGVAL;					\
423*8334SJose.Borrego@Sun.COM 		if (!ndr_params(&myref))				\
4245331Samw 			return (0);					\
4255331Samw 	}
4265331Samw 
4275331Samw #define	NDR_PARAMS_MEMBER(TYPE, MEMBER)			\
4285331Samw 	NDR_PARAMS_MEMBER_WITH_ARG(TYPE, MEMBER,	\
4295331Samw 	NDR_F_NONE, size_is, 0)
4305331Samw 
4315331Samw #define	NDR_STRING_DIM		1
4325331Samw #define	NDR_ANYSIZE_DIM		1
4335331Samw 
434*8334SJose.Borrego@Sun.COM int ndo_process(struct ndr_stream *, ndr_typeinfo_t *, char *);
435*8334SJose.Borrego@Sun.COM int ndo_operation(struct ndr_stream *, ndr_typeinfo_t *, int opnum, char *);
436*8334SJose.Borrego@Sun.COM void ndo_printf(struct ndr_stream *, ndr_ref_t *, const char *, ...);
437*8334SJose.Borrego@Sun.COM void ndo_trace(const char *);
438*8334SJose.Borrego@Sun.COM void ndo_fmt(struct ndr_stream *, ndr_ref_t *, char *);
4395331Samw 
440*8334SJose.Borrego@Sun.COM int ndr_params(ndr_ref_t *);
441*8334SJose.Borrego@Sun.COM int ndr_topmost(ndr_ref_t *);
442*8334SJose.Borrego@Sun.COM int ndr_run_outer_queue(struct ndr_stream *);
443*8334SJose.Borrego@Sun.COM int ndr_outer(ndr_ref_t *);
444*8334SJose.Borrego@Sun.COM int ndr_outer_fixed(ndr_ref_t *);
445*8334SJose.Borrego@Sun.COM int ndr_outer_fixed_array(ndr_ref_t *);
446*8334SJose.Borrego@Sun.COM int ndr_outer_conformant_array(ndr_ref_t *);
447*8334SJose.Borrego@Sun.COM int ndr_outer_conformant_construct(ndr_ref_t *);
448*8334SJose.Borrego@Sun.COM int ndr_size_is(ndr_ref_t *);
449*8334SJose.Borrego@Sun.COM int ndr_outer_string(ndr_ref_t *);
450*8334SJose.Borrego@Sun.COM int ndr_outer_peek_sizing(ndr_ref_t *, unsigned, unsigned long *);
451*8334SJose.Borrego@Sun.COM int ndr_outer_poke_sizing(ndr_ref_t *, unsigned, unsigned long *);
452*8334SJose.Borrego@Sun.COM int ndr_outer_align(ndr_ref_t *);
453*8334SJose.Borrego@Sun.COM int ndr_outer_grow(ndr_ref_t *, unsigned);
454*8334SJose.Borrego@Sun.COM int ndr_inner(ndr_ref_t *);
455*8334SJose.Borrego@Sun.COM int ndr_inner_pointer(ndr_ref_t *);
456*8334SJose.Borrego@Sun.COM int ndr_inner_reference(ndr_ref_t *);
457*8334SJose.Borrego@Sun.COM int ndr_inner_array(ndr_ref_t *);
4585521Sas200622 
459*8334SJose.Borrego@Sun.COM size_t ndr_mbstowcs(struct ndr_stream *, mts_wchar_t *, const char *, size_t);
460*8334SJose.Borrego@Sun.COM int ndr_mbtowc(struct ndr_stream *, mts_wchar_t *, const char *, size_t);
4615521Sas200622 
462*8334SJose.Borrego@Sun.COM void nds_bswap(void *src, void *dst, size_t len);
4635331Samw 
4645331Samw #ifdef __cplusplus
4655331Samw }
4665331Samw #endif
4675331Samw 
4685331Samw #endif /* _SMBSRV_NDR_H */
469