xref: /onnv-gate/usr/src/uts/common/smbsrv/ndr.h (revision 11337:1f8fe42c7b83)
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 /*
229914Samw@Sun.COM  * Copyright 2009 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>
478334SJose.Borrego@Sun.COM #include <smbsrv/wintypes.h>
488334SJose.Borrego@Sun.COM #include <smbsrv/ndl/rpcpdu.ndl>
4910966SJordan.Brown@Sun.COM #include <smbsrv/string.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 
1498334SJose.Borrego@Sun.COM struct ndr_heap;
1508334SJose.Borrego@Sun.COM struct ndr_stream;
1515331Samw struct ndr_reference;
1525331Samw 
15310717Samw@Sun.COM typedef uint16_t ndr_wchar_t;
15410717Samw@Sun.COM 
1558334SJose.Borrego@Sun.COM typedef struct ndr_typeinfo {
1565331Samw 	unsigned char		version;	/* sanity check */
1575331Samw 	unsigned char		alignment;	/* mask */
1585331Samw 	unsigned short		type_flags;	/* NDR_F_... */
1598334SJose.Borrego@Sun.COM 	int			(*ndr_func)(struct ndr_reference *);
1605331Samw 	unsigned short		pdu_size_fixed_part;
1615331Samw 	unsigned short		pdu_size_variable_part;
1625331Samw 	unsigned short		c_size_fixed_part;
1635331Samw 	unsigned short		c_size_variable_part;
1648334SJose.Borrego@Sun.COM } ndr_typeinfo_t;
1655331Samw 
1668334SJose.Borrego@Sun.COM typedef struct ndr_reference {
1675331Samw 	struct ndr_reference	*next;		/* queue list (outer only) */
1685331Samw 	struct ndr_reference	*enclosing;	/* e.g. struct for this memb */
1698334SJose.Borrego@Sun.COM 	struct ndr_stream	*stream;	/* root of NDR */
1708334SJose.Borrego@Sun.COM 	ndr_typeinfo_t		*ti;		/* type of data referenced */
1715331Samw 	char			*name;		/* name of this member */
1725331Samw 	unsigned long		pdu_offset;	/* referent in stub data */
1735331Samw 	char			*datum;		/* referent in local memory */
1745331Samw 	char			**backptr;	/* referer to set */
1755331Samw 	unsigned short		outer_flags;	/* XXX_is() from top level */
1765331Samw 	unsigned short		inner_flags;	/* XXX_is() in encapsulated */
1775331Samw 	unsigned short		type_flags;	/* "requires" */
1785331Samw 	unsigned short		packed_alignment;
1795331Samw 	unsigned long		size_is;	/* conforming constructs */
1805331Samw 	unsigned long		strlen_is;	/* strings */
1815331Samw 	unsigned long		switch_is;	/* union arg selector */
1825331Samw 	unsigned long		dimension_is;	/* fixed-len array size */
1835331Samw 	unsigned long		pdu_end_offset;	/* offset for limit of PDU */
1848334SJose.Borrego@Sun.COM } ndr_ref_t;
1855331Samw 
1865331Samw /*
1878334SJose.Borrego@Sun.COM  * For all operations, the ndr_stream, which is the root of NDR processing,
1888334SJose.Borrego@Sun.COM  * is the primary object.  When available, the appropriate ndr_ref_t
1895331Samw  * is passed, NULL otherwise.  Functions that return 'int' should return
1905331Samw  * TRUE (!0) or FALSE (0).  When functions return FALSE, including
1918334SJose.Borrego@Sun.COM  * ndo_malloc() returning NULL, they should set the stream->error to an
1925331Samw  * appropriate indicator of what went wrong.
1935331Samw  *
1948334SJose.Borrego@Sun.COM  * Functions ndo_get_pdu(), ndo_put_pdu(), and ndo_pad_pdu() must
1955331Samw  * never grow the PDU data.  A request for out-of-bounds data is an error.
1965331Samw  * The swap_bytes flag is 1 if NDR knows that the byte-order in the PDU
1978334SJose.Borrego@Sun.COM  * is different from the local system.  ndo_pad_pdu() advised that the
1985331Samw  * affected bytes should be zero filled.
1995331Samw  */
2008334SJose.Borrego@Sun.COM typedef struct ndr_stream_ops {
2018334SJose.Borrego@Sun.COM 	char *(*ndo_malloc)(struct ndr_stream *, unsigned, ndr_ref_t *);
2028334SJose.Borrego@Sun.COM 	int (*ndo_free)(struct ndr_stream *, char *, ndr_ref_t *);
2038334SJose.Borrego@Sun.COM 	int (*ndo_grow_pdu)(struct ndr_stream *, unsigned long, ndr_ref_t *);
2048334SJose.Borrego@Sun.COM 	int (*ndo_pad_pdu)(struct ndr_stream *, unsigned long,
2058334SJose.Borrego@Sun.COM 	    unsigned long, ndr_ref_t *);
2068334SJose.Borrego@Sun.COM 	int (*ndo_get_pdu)(struct ndr_stream *, unsigned long,
2078334SJose.Borrego@Sun.COM 	    unsigned long, char *, int, ndr_ref_t *);
2088334SJose.Borrego@Sun.COM 	int (*ndo_put_pdu)(struct ndr_stream *, unsigned long,
2098334SJose.Borrego@Sun.COM 	    unsigned long, char *, int, ndr_ref_t *);
2108334SJose.Borrego@Sun.COM 	void (*ndo_tattle)(struct ndr_stream *, char *, ndr_ref_t *);
2118334SJose.Borrego@Sun.COM 	void (*ndo_tattle_error)(struct ndr_stream *, ndr_ref_t *);
2128334SJose.Borrego@Sun.COM 	int (*ndo_reset)(struct ndr_stream *);
2138334SJose.Borrego@Sun.COM 	void (*ndo_destruct)(struct ndr_stream *);
2148334SJose.Borrego@Sun.COM } ndr_stream_ops_t;
2155331Samw 
2168334SJose.Borrego@Sun.COM #define	NDS_MALLOC(NDS, LEN, REF) \
2178334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_malloc)(NDS, LEN, REF)
2188334SJose.Borrego@Sun.COM #define	NDS_GROW_PDU(NDS, WANT_END_OFF, REF) \
2198334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_grow_pdu)(NDS, WANT_END_OFF, REF)
2208334SJose.Borrego@Sun.COM #define	NDS_PAD_PDU(NDS, PDU_OFFSET, N_BYTES, REF) \
2218334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_pad_pdu)(NDS, PDU_OFFSET, N_BYTES, REF)
2228334SJose.Borrego@Sun.COM #define	NDS_GET_PDU(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF) \
2238334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_get_pdu)(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF)
2248334SJose.Borrego@Sun.COM #define	NDS_PUT_PDU(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF) \
2258334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_put_pdu)(NDS, PDU_OFFSET, N_BYTES, BUF, SWAP, REF)
2268334SJose.Borrego@Sun.COM #define	NDS_TATTLE(NDS, WHAT, REF) \
2278334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_tattle)(NDS, WHAT, REF)
2288334SJose.Borrego@Sun.COM #define	NDS_TATTLE_ERROR(NDS, WHAT, REF) \
2298334SJose.Borrego@Sun.COM 	(*(NDS)->ndo->ndo_tattle_error)(NDS, REF)
2308334SJose.Borrego@Sun.COM #define	NDS_RESET(NDS)		(*(NDS)->ndo->ndo_reset)(NDS)
2318334SJose.Borrego@Sun.COM #define	NDS_DESTRUCT(NDS)	(*(NDS)->ndo->ndo_destruct)(NDS)
2325331Samw 
2336482Samw typedef struct ndr_frag {
2346482Samw 	struct ndr_frag *next;
2356482Samw 	uint8_t *buf;
2366482Samw 	uint32_t len;
2376482Samw } ndr_frag_t;
2386482Samw 
2397052Samw typedef struct ndr_fraglist {
2407052Samw 	struct uio	uio;
2417052Samw 	iovec_t		*iov;
2427052Samw 	ndr_frag_t	*head;
2437052Samw 	ndr_frag_t	*tail;
2447052Samw 	uint32_t	nfrag;
2457052Samw } ndr_fraglist_t;
2467052Samw 
2478334SJose.Borrego@Sun.COM typedef struct ndr_stream {
2485331Samw 	unsigned long		pdu_size;
2495331Samw 	unsigned long		pdu_max_size;
2505331Samw 	unsigned long		pdu_base_offset;
2515331Samw 	unsigned long		pdu_scan_offset;
2525331Samw 	unsigned char		*pdu_base_addr;
2535331Samw 
2547052Samw 	ndr_fraglist_t		frags;
2558334SJose.Borrego@Sun.COM 	ndr_stream_ops_t	*ndo;
2565331Samw 
2575331Samw 	unsigned char		m_op;
2585331Samw 	unsigned char		dir;
2595331Samw 	unsigned char		swap;		/* native/net endian swap */
2605521Sas200622 	unsigned char		flags;
2615331Samw 	short			error;
2625331Samw 	short			error_ref;
2635331Samw 
2648334SJose.Borrego@Sun.COM 	ndr_ref_t *outer_queue_head;
2658334SJose.Borrego@Sun.COM 	ndr_ref_t **outer_queue_tailp;
2668334SJose.Borrego@Sun.COM 	ndr_ref_t *outer_current;
2678334SJose.Borrego@Sun.COM 	struct ndr_heap *heap;
2688334SJose.Borrego@Sun.COM } ndr_stream_t;
2695331Samw 
2705331Samw #define	NDR_M_OP_NONE		0x00
2715331Samw #define	NDR_M_OP_MARSHALL	0x01	/* data moving from datum to PDU */
2725331Samw #define	NDR_M_OP_UNMARSHALL	0x02	/* data moving from PDU to datum */
2735331Samw 
2745331Samw #define	NDR_DIR_NONE		0x00
2755331Samw #define	NDR_DIR_IN		0x10	/* data moving from caller to callee */
2765331Samw #define	NDR_DIR_OUT		0x20	/* data moving from callee to caller */
2775331Samw 
2785331Samw #define	NDR_MODE_CALL_SEND	(NDR_M_OP_MARSHALL + NDR_DIR_IN)
2795331Samw #define	NDR_MODE_CALL_RECV	(NDR_M_OP_UNMARSHALL + NDR_DIR_IN)
2805331Samw #define	NDR_MODE_RETURN_SEND	(NDR_M_OP_MARSHALL + NDR_DIR_OUT)
2815331Samw #define	NDR_MODE_RETURN_RECV	(NDR_M_OP_UNMARSHALL + NDR_DIR_OUT)
2829914Samw@Sun.COM #define	NDR_MODE_BUF_ENCODE	NDR_MODE_CALL_SEND
2839914Samw@Sun.COM #define	NDR_MODE_BUF_DECODE	NDR_MODE_RETURN_RECV
2845331Samw 
2858334SJose.Borrego@Sun.COM #define	NDR_MODE_TO_M_OP(MODE)	((MODE) & 0x0F)
2868334SJose.Borrego@Sun.COM #define	NDR_MODE_TO_DIR(MODE)	((MODE) & 0xF0)
2875331Samw #define	NDR_M_OP_AND_DIR_TO_MODE(M_OP, DIR)	((M_OP)|(DIR))
2885331Samw 
2898334SJose.Borrego@Sun.COM #define	NDR_MODE_MATCH(NDS, MODE) \
2908334SJose.Borrego@Sun.COM 	(NDR_M_OP_AND_DIR_TO_MODE((NDS)->m_op, (NDS)->dir) == (MODE))
2915331Samw 
2929914Samw@Sun.COM #define	NDR_IS_FIRST_FRAG(F)	((F) & NDR_PFC_FIRST_FRAG)
2939914Samw@Sun.COM #define	NDR_IS_LAST_FRAG(F)	((F) & NDR_PFC_LAST_FRAG)
2949914Samw@Sun.COM #define	NDR_IS_SINGLE_FRAG(F)	\
2959914Samw@Sun.COM 	(NDR_IS_FIRST_FRAG((F)) && NDR_IS_LAST_FRAG((F)))
2969914Samw@Sun.COM 
2978334SJose.Borrego@Sun.COM #define	NDS_F_NONE		0x00
2988334SJose.Borrego@Sun.COM #define	NDS_F_NOTERM		0x01	/* strings are not null terminated */
299*11337SWilliam.Krier@Sun.COM #define	NDS_F_NONULL		0x02	/* strings: no null on size_is */
3008334SJose.Borrego@Sun.COM #define	NDS_SETF(S, F)		((S)->flags |= (F))
3018334SJose.Borrego@Sun.COM #define	NDS_CLEARF(S, F)	((S)->flags &= ~(F))
3025331Samw 
3035331Samw #define	NDR_ERR_MALLOC_FAILED		-1
3045331Samw #define	NDR_ERR_M_OP_INVALID		-2
3055331Samw #define	NDR_ERR_UNDERFLOW		-3
3065331Samw #define	NDR_ERR_GROW_FAILED		-4	/* overflow */
3075331Samw #define	NDR_ERR_PAD_FAILED		-5	/* couldn't possibly happen */
3085331Samw #define	NDR_ERR_OUTER_HEADER_BAD	-6
3095331Samw #define	NDR_ERR_SWITCH_VALUE_ILLEGAL	-7
3105331Samw #define	NDR_ERR_SWITCH_VALUE_INVALID	-8
3115331Samw #define	NDR_ERR_SWITCH_VALUE_MISSING	-9
3125331Samw #define	NDR_ERR_SIZE_IS_MISMATCH_PDU	-10
3135331Samw #define	NDR_ERR_SIZE_IS_MISMATCH_AFTER	-11
3145331Samw #define	NDR_ERR_SIZE_IS_UNEXPECTED	-12
3155331Samw #define	NDR_ERR_SIZE_IS_DUPLICATED	-13
3165331Samw #define	NDR_ERR_OUTER_PARAMS_MISMATCH	-14
3175331Samw #define	NDR_ERR_ARRAY_VARLEN_ILLEGAL	-15
3185331Samw #define	NDR_ERR_ARRAY_UNION_ILLEGAL	-16
3195331Samw #define	NDR_ERR_OUTER_PARAMS_BAD	-17
3205331Samw #define	NDR_ERR_OUTER_UNION_ILLEGAL	-18
3215331Samw #define	NDR_ERR_TOPMOST_UNION_ILLEGAL	-19
3225331Samw #define	NDR_ERR_TOPMOST_VARLEN_ILLEGAL	-20
3235331Samw #define	NDR_ERR_INNER_PARAMS_BAD	-21
3245331Samw #define	NDR_ERR_UNIMPLEMENTED		-22
3255331Samw #define	NDR_ERR_NOT_AN_INTERFACE	-23
3265331Samw #define	NDR_ERR_STRLEN			-24
3275331Samw #define	NDR_ERR_STRING_SIZING		-25
3285331Samw #define	NDR_ERR_BOUNDS_CHECK		-26
3295331Samw 
3305331Samw #define	NDR_SET_ERROR(REF, ERROR)			\
3315331Samw 	((REF)->stream->error = (ERROR),		\
3325331Samw 	(REF)->stream->error_ref = __LINE__,		\
3338334SJose.Borrego@Sun.COM 	NDS_TATTLE_ERROR((REF)->stream, 0, REF))
3345331Samw 
3355331Samw #define	NDR_TATTLE(REF, WHAT) \
3368334SJose.Borrego@Sun.COM 	(*(REF)->stream->ndo->ndo_tattle)((REF)->stream, WHAT, REF)
3375331Samw 
3385331Samw #define	MEMBER_STR(MEMBER) #MEMBER
3395331Samw 
3405331Samw #define	NDR_DIR_IS_IN  (encl_ref->stream->dir == NDR_DIR_IN)
3415331Samw #define	NDR_DIR_IS_OUT (encl_ref->stream->dir == NDR_DIR_OUT)
3425331Samw 
3435331Samw #define	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3445331Samw 		ARGFLAGS, ARGMEM, ARGVAL) { \
3455331Samw 		myref.pdu_offset = encl_ref->pdu_offset + (OFFSET);	\
3465331Samw 		myref.name = MEMBER_STR(MEMBER);			\
3475331Samw 		myref.datum = (char *)&val->MEMBER;			\
3485331Samw 		myref.inner_flags = ARGFLAGS;				\
3495331Samw 		myref.ti = &ndt_##TYPE;					\
3505331Samw 		myref.ARGMEM = ARGVAL;					\
3518334SJose.Borrego@Sun.COM 		if (!ndr_inner(&myref))					\
3525331Samw 			return (0);					\
3535331Samw 	}
3545331Samw 
3555331Samw #define	NDR_MEMBER(TYPE, MEMBER, OFFSET) \
3565331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3575331Samw 		NDR_F_NONE, size_is, 0)
3585331Samw 
3595331Samw #define	NDR_MEMBER_ARR_WITH_SIZE_IS(TYPE, MEMBER, OFFSET, SIZE_IS) \
3605331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3615331Samw 		NDR_F_SIZE_IS, size_is, SIZE_IS)
3625331Samw 
3635331Samw #define	NDR_MEMBER_ARR_WITH_DIMENSION(TYPE, MEMBER, OFFSET, SIZE_IS) \
3645331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3655331Samw 		NDR_F_DIMENSION_IS, dimension_is, SIZE_IS)
3665331Samw 
3675331Samw #define	NDR_MEMBER_PTR_WITH_SIZE_IS(TYPE, MEMBER, OFFSET, SIZE_IS) \
3685331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET, \
3695331Samw 		NDR_F_SIZE_IS+NDR_F_IS_POINTER, size_is, SIZE_IS)
3705331Samw 
3715331Samw #define	NDR_MEMBER_PTR(TYPE, MEMBER, OFFSET)		\
3725331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET,	\
3735331Samw 		NDR_F_IS_POINTER, size_is, 0)
3745331Samw 
3755331Samw #define	NDR_MEMBER_WITH_SWITCH_IS(TYPE, MEMBER, OFFSET, SWITCH_IS)	\
3765331Samw 	NDR_MEMBER_WITH_ARG(TYPE, MEMBER, OFFSET,			\
3775331Samw 		NDR_F_SWITCH_IS, switch_is, SWITCH_IS)
3785331Samw 
3795331Samw 
3805331Samw #define	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER, \
3815331Samw 		ARGFLAGS, ARGMEM, ARGVAL) { \
3825331Samw 		myref.pdu_offset = -1;					\
3835331Samw 		myref.name = MEMBER_STR(MEMBER);			\
3845331Samw 		myref.datum = (char *)&val->MEMBER;			\
3855331Samw 		myref.inner_flags = ARGFLAGS;				\
3865331Samw 		myref.ti = &ndt_##TYPE;					\
3875331Samw 		myref.ARGMEM = ARGVAL;					\
3888334SJose.Borrego@Sun.COM 		if (!ndr_topmost(&myref))				\
3895331Samw 			return (0);					\
3905331Samw 	}
3915331Samw 
3925331Samw #define	NDR_TOPMOST_MEMBER(TYPE, MEMBER)	   			\
3935331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
3945331Samw 		NDR_F_NONE, size_is, 0)
3955331Samw 
3965331Samw #define	NDR_TOPMOST_MEMBER_ARR_WITH_SIZE_IS(TYPE, MEMBER, SIZE_IS)	\
3975331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,		    	\
3985331Samw 		NDR_F_SIZE_IS, size_is, SIZE_IS)
3995331Samw 
4005331Samw #define	NDR_TOPMOST_MEMBER_ARR_WITH_DIMENSION(TYPE, MEMBER, SIZE_IS)	\
4015331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,		      	\
4025331Samw 		NDR_F_DIMENSION_IS, dimension_is, SIZE_IS)
4035331Samw 
4045331Samw #define	NDR_TOPMOST_MEMBER_PTR_WITH_SIZE_IS(TYPE, MEMBER, SIZE_IS)	\
4055331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
4065331Samw 		NDR_F_SIZE_IS+NDR_F_IS_POINTER, size_is, SIZE_IS)
4075331Samw 
4085331Samw #define	NDR_TOPMOST_MEMBER_PTR(TYPE, MEMBER)		\
4095331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,	\
4105331Samw 		NDR_F_IS_POINTER, size_is, 0)
4115331Samw 
4125331Samw #define	NDR_TOPMOST_MEMBER_REF(TYPE, MEMBER)		\
4135331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,	\
4145331Samw 		NDR_F_IS_REFERENCE, size_is, 0)
4155331Samw 
4165331Samw #define	NDR_TOPMOST_MEMBER_REF_WITH_SIZE_IS(TYPE, MEMBER, SIZE_IS)	\
4175331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
4185331Samw 		NDR_F_SIZE_IS+NDR_F_IS_REFERENCE, size_is, SIZE_IS)
4195331Samw 
4205331Samw #define	NDR_TOPMOST_MEMBER_WITH_SWITCH_IS(TYPE, MEMBER, SWITCH_IS)	\
4215331Samw 	NDR_TOPMOST_MEMBER_WITH_ARG(TYPE, MEMBER,			\
4225331Samw 		NDR_F_SWITCH_IS, switch_is, SWITCH_IS)
4235331Samw 
4245331Samw /* this is assuming offset+0 */
4255331Samw #define	NDR_PARAMS_MEMBER_WITH_ARG(TYPE, MEMBER, ARGFLAGS, \
4265331Samw 	ARGMEM, ARGVAL) { \
4275331Samw 		myref.pdu_offset = encl_ref->pdu_offset;		\
4285331Samw 		myref.name = MEMBER_STR(MEMBER);			\
4295331Samw 		myref.datum = (char *)&val->MEMBER;			\
4305331Samw 		myref.inner_flags = ARGFLAGS;				\
4315331Samw 		myref.ti = &ndt_##TYPE;					\
4325331Samw 		myref.ARGMEM = ARGVAL;					\
4338334SJose.Borrego@Sun.COM 		if (!ndr_params(&myref))				\
4345331Samw 			return (0);					\
4355331Samw 	}
4365331Samw 
4375331Samw #define	NDR_PARAMS_MEMBER(TYPE, MEMBER)			\
4385331Samw 	NDR_PARAMS_MEMBER_WITH_ARG(TYPE, MEMBER,	\
4395331Samw 	NDR_F_NONE, size_is, 0)
4405331Samw 
4415331Samw #define	NDR_STRING_DIM		1
4425331Samw #define	NDR_ANYSIZE_DIM		1
4435331Samw 
4448334SJose.Borrego@Sun.COM int ndo_process(struct ndr_stream *, ndr_typeinfo_t *, char *);
4458334SJose.Borrego@Sun.COM int ndo_operation(struct ndr_stream *, ndr_typeinfo_t *, int opnum, char *);
4468334SJose.Borrego@Sun.COM void ndo_printf(struct ndr_stream *, ndr_ref_t *, const char *, ...);
4478334SJose.Borrego@Sun.COM void ndo_trace(const char *);
4488334SJose.Borrego@Sun.COM void ndo_fmt(struct ndr_stream *, ndr_ref_t *, char *);
4495331Samw 
4508334SJose.Borrego@Sun.COM int ndr_params(ndr_ref_t *);
4518334SJose.Borrego@Sun.COM int ndr_topmost(ndr_ref_t *);
4528334SJose.Borrego@Sun.COM int ndr_run_outer_queue(struct ndr_stream *);
4538334SJose.Borrego@Sun.COM int ndr_outer(ndr_ref_t *);
4548334SJose.Borrego@Sun.COM int ndr_outer_fixed(ndr_ref_t *);
4558334SJose.Borrego@Sun.COM int ndr_outer_fixed_array(ndr_ref_t *);
4568334SJose.Borrego@Sun.COM int ndr_outer_conformant_array(ndr_ref_t *);
4578334SJose.Borrego@Sun.COM int ndr_outer_conformant_construct(ndr_ref_t *);
4588334SJose.Borrego@Sun.COM int ndr_size_is(ndr_ref_t *);
4598334SJose.Borrego@Sun.COM int ndr_outer_string(ndr_ref_t *);
4608334SJose.Borrego@Sun.COM int ndr_outer_peek_sizing(ndr_ref_t *, unsigned, unsigned long *);
4618334SJose.Borrego@Sun.COM int ndr_outer_poke_sizing(ndr_ref_t *, unsigned, unsigned long *);
4628334SJose.Borrego@Sun.COM int ndr_outer_align(ndr_ref_t *);
4638334SJose.Borrego@Sun.COM int ndr_outer_grow(ndr_ref_t *, unsigned);
4648334SJose.Borrego@Sun.COM int ndr_inner(ndr_ref_t *);
4658334SJose.Borrego@Sun.COM int ndr_inner_pointer(ndr_ref_t *);
4668334SJose.Borrego@Sun.COM int ndr_inner_reference(ndr_ref_t *);
4678334SJose.Borrego@Sun.COM int ndr_inner_array(ndr_ref_t *);
4685521Sas200622 
46910966SJordan.Brown@Sun.COM size_t ndr_mbstowcs(struct ndr_stream *, smb_wchar_t *, const char *, size_t);
47010966SJordan.Brown@Sun.COM int ndr_mbtowc(struct ndr_stream *, smb_wchar_t *, const char *, size_t);
4715521Sas200622 
4728334SJose.Borrego@Sun.COM void nds_bswap(void *src, void *dst, size_t len);
4735331Samw 
4745331Samw #ifdef __cplusplus
4755331Samw }
4765331Samw #endif
4775331Samw 
4785331Samw #endif /* _SMBSRV_NDR_H */
479