xref: /onnv-gate/usr/src/lib/smbsrv/libmlrpc/common/ndr_marshal.c (revision 9914:15092dda0737)
15772Sas200622 /*
25772Sas200622  * CDDL HEADER START
35772Sas200622  *
45772Sas200622  * The contents of this file are subject to the terms of the
55772Sas200622  * Common Development and Distribution License (the "License").
65772Sas200622  * You may not use this file except in compliance with the License.
75772Sas200622  *
85772Sas200622  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95772Sas200622  * or http://www.opensolaris.org/os/licensing.
105772Sas200622  * See the License for the specific language governing permissions
115772Sas200622  * and limitations under the License.
125772Sas200622  *
135772Sas200622  * When distributing Covered Code, include this CDDL HEADER in each
145772Sas200622  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155772Sas200622  * If applicable, add the following below this CDDL HEADER, with the
165772Sas200622  * fields enclosed by brackets "[]" replaced with your own identifying
175772Sas200622  * information: Portions Copyright [yyyy] [name of copyright owner]
185772Sas200622  *
195772Sas200622  * CDDL HEADER END
205772Sas200622  */
215772Sas200622 /*
22*9914Samw@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
235772Sas200622  * Use is subject to license terms.
245772Sas200622  */
255772Sas200622 
26*9914Samw@Sun.COM #include <assert.h>
275772Sas200622 #include <strings.h>
285772Sas200622 #include <sys/param.h>
295772Sas200622 
305772Sas200622 #include <smbsrv/libsmb.h>
318334SJose.Borrego@Sun.COM #include <smbsrv/libmlrpc.h>
325772Sas200622 
335772Sas200622 #ifdef _BIG_ENDIAN
348334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_BIG_ENDIAN;
355772Sas200622 #else
368334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_LITTLE_ENDIAN;
375772Sas200622 #endif
385772Sas200622 
39*9914Samw@Sun.COM static int ndr_decode_hdr_common(ndr_stream_t *, ndr_common_header_t *);
40*9914Samw@Sun.COM 
41*9914Samw@Sun.COM static int
42*9914Samw@Sun.COM ndr_encode_decode_common(ndr_stream_t *nds, unsigned opnum,
438334SJose.Borrego@Sun.COM     ndr_typeinfo_t *ti, void *datum)
445772Sas200622 {
45*9914Samw@Sun.COM 	int rc;
465772Sas200622 
475772Sas200622 	/*
485772Sas200622 	 * Perform the (un)marshalling
495772Sas200622 	 */
508334SJose.Borrego@Sun.COM 	if (ndo_operation(nds, ti, opnum, datum))
518334SJose.Borrego@Sun.COM 		return (NDR_DRC_OK);
525772Sas200622 
538334SJose.Borrego@Sun.COM 	switch (nds->error) {
545772Sas200622 	case NDR_ERR_MALLOC_FAILED:
558334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_OUT_OF_MEMORY;
565772Sas200622 		break;
575772Sas200622 
585772Sas200622 	case NDR_ERR_SWITCH_VALUE_INVALID:
598334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_PARAM_0_INVALID;
605772Sas200622 		break;
615772Sas200622 
625772Sas200622 	case NDR_ERR_UNDERFLOW:
638334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_RECEIVED_RUNT;
645772Sas200622 		break;
655772Sas200622 
665772Sas200622 	case NDR_ERR_GROW_FAILED:
678334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_ENCODE_TOO_BIG;
685772Sas200622 		break;
695772Sas200622 
705772Sas200622 	default:
71*9914Samw@Sun.COM 		if (nds->m_op == NDR_M_OP_MARSHALL)
728334SJose.Borrego@Sun.COM 			rc = NDR_DRC_FAULT_ENCODE_FAILED;
735772Sas200622 		else
748334SJose.Borrego@Sun.COM 			rc = NDR_DRC_FAULT_DECODE_FAILED;
755772Sas200622 		break;
765772Sas200622 	}
775772Sas200622 
785772Sas200622 	return (rc);
795772Sas200622 }
805772Sas200622 
81*9914Samw@Sun.COM ndr_buf_t *
82*9914Samw@Sun.COM ndr_buf_init(ndr_typeinfo_t *ti)
83*9914Samw@Sun.COM {
84*9914Samw@Sun.COM 	ndr_buf_t		*nbuf;
85*9914Samw@Sun.COM 
86*9914Samw@Sun.COM 	if ((nbuf = calloc(1, sizeof (ndr_buf_t))) == NULL)
87*9914Samw@Sun.COM 		return (NULL);
88*9914Samw@Sun.COM 
89*9914Samw@Sun.COM 	if ((nbuf->nb_heap = ndr_heap_create()) == NULL) {
90*9914Samw@Sun.COM 		free(nbuf);
91*9914Samw@Sun.COM 		return (NULL);
92*9914Samw@Sun.COM 	}
93*9914Samw@Sun.COM 
94*9914Samw@Sun.COM 	nbuf->nb_ti = ti;
95*9914Samw@Sun.COM 	nbuf->nb_magic = NDR_BUF_MAGIC;
96*9914Samw@Sun.COM 	return (nbuf);
97*9914Samw@Sun.COM }
98*9914Samw@Sun.COM 
99*9914Samw@Sun.COM void
100*9914Samw@Sun.COM ndr_buf_fini(ndr_buf_t *nbuf)
101*9914Samw@Sun.COM {
102*9914Samw@Sun.COM 	assert(nbuf->nb_magic == NDR_BUF_MAGIC);
103*9914Samw@Sun.COM 
104*9914Samw@Sun.COM 	nds_destruct(&nbuf->nb_nds);
105*9914Samw@Sun.COM 	ndr_heap_destroy(nbuf->nb_heap);
106*9914Samw@Sun.COM 	nbuf->nb_magic = 0;
107*9914Samw@Sun.COM 	free(nbuf);
108*9914Samw@Sun.COM }
109*9914Samw@Sun.COM 
110*9914Samw@Sun.COM /*
111*9914Samw@Sun.COM  * Decode an NDR encoded buffer.  The buffer is expected to contain
112*9914Samw@Sun.COM  * a single fragment packet with a valid PDU header followed by NDR
113*9914Samw@Sun.COM  * encoded data.  The structure to which result points should be
114*9914Samw@Sun.COM  * of the appropriate type to hold the decoded output.  For example:
115*9914Samw@Sun.COM  *
116*9914Samw@Sun.COM  *	pac_info_t info;
117*9914Samw@Sun.COM  *
118*9914Samw@Sun.COM  * 	if ((nbuf = ndr_buf_init(&TYPEINFO(ndr_pac)) != NULL) {
119*9914Samw@Sun.COM  *		rc = ndr_decode_buf(nbuf, opnum, data, datalen, &info);
120*9914Samw@Sun.COM  *		...
121*9914Samw@Sun.COM  *		ndr_buf_fini(nbuf);
122*9914Samw@Sun.COM  *	}
123*9914Samw@Sun.COM  */
124*9914Samw@Sun.COM int
125*9914Samw@Sun.COM ndr_buf_decode(ndr_buf_t *nbuf, unsigned opnum, const char *data,
126*9914Samw@Sun.COM     size_t datalen, void *result)
127*9914Samw@Sun.COM {
128*9914Samw@Sun.COM 	ndr_common_header_t	hdr;
129*9914Samw@Sun.COM 	unsigned		pdu_size_hint;
130*9914Samw@Sun.COM 	int			rc;
131*9914Samw@Sun.COM 
132*9914Samw@Sun.COM 	assert(nbuf->nb_magic == NDR_BUF_MAGIC);
133*9914Samw@Sun.COM 	assert(nbuf->nb_heap != NULL);
134*9914Samw@Sun.COM 	assert(nbuf->nb_ti != NULL);
135*9914Samw@Sun.COM 
136*9914Samw@Sun.COM 	if (datalen < NDR_PDU_SIZE_HINT_DEFAULT)
137*9914Samw@Sun.COM 		pdu_size_hint = NDR_PDU_SIZE_HINT_DEFAULT;
138*9914Samw@Sun.COM 	else
139*9914Samw@Sun.COM 		pdu_size_hint = datalen;
140*9914Samw@Sun.COM 
141*9914Samw@Sun.COM 	nds_destruct(&nbuf->nb_nds);
142*9914Samw@Sun.COM 	nds_initialize(&nbuf->nb_nds, pdu_size_hint, NDR_MODE_BUF_DECODE,
143*9914Samw@Sun.COM 	    nbuf->nb_heap);
144*9914Samw@Sun.COM 	bcopy(data, nbuf->nb_nds.pdu_base_addr, datalen);
145*9914Samw@Sun.COM 
146*9914Samw@Sun.COM 	rc = ndr_decode_hdr_common(&nbuf->nb_nds, &hdr);
147*9914Samw@Sun.COM 	if (NDR_DRC_IS_FAULT(rc))
148*9914Samw@Sun.COM 		return (rc);
149*9914Samw@Sun.COM 
150*9914Samw@Sun.COM 	if (!NDR_IS_SINGLE_FRAG(hdr.pfc_flags))
151*9914Samw@Sun.COM 		return (rc);
152*9914Samw@Sun.COM 
153*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(&nbuf->nb_nds, opnum, nbuf->nb_ti,
154*9914Samw@Sun.COM 	    result);
155*9914Samw@Sun.COM 	return (rc);
156*9914Samw@Sun.COM }
157*9914Samw@Sun.COM 
158*9914Samw@Sun.COM /*
159*9914Samw@Sun.COM  * Use the receive stream to unmarshall data (NDR_MODE_CALL_RECV).
160*9914Samw@Sun.COM  */
1615772Sas200622 int
1628334SJose.Borrego@Sun.COM ndr_decode_call(ndr_xa_t *mxa, void *params)
1635772Sas200622 {
164*9914Samw@Sun.COM 	ndr_stream_t	*nds = &mxa->recv_nds;
165*9914Samw@Sun.COM 	int		rc;
1665772Sas200622 
167*9914Samw@Sun.COM 	if (!NDR_MODE_MATCH(nds, NDR_MODE_CALL_RECV))
168*9914Samw@Sun.COM 		return (NDR_DRC_FAULT_MODE_MISMATCH);
169*9914Samw@Sun.COM 
170*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(nds, mxa->opnum,
171*9914Samw@Sun.COM 	    mxa->binding->service->interface_ti, params);
1725772Sas200622 
1738334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_REQUEST);
1745772Sas200622 }
1755772Sas200622 
176*9914Samw@Sun.COM /*
177*9914Samw@Sun.COM  * Use the send stream to marshall data (NDR_MODE_RETURN_SEND).
178*9914Samw@Sun.COM  */
1795772Sas200622 int
1808334SJose.Borrego@Sun.COM ndr_encode_return(ndr_xa_t *mxa, void *params)
1815772Sas200622 {
182*9914Samw@Sun.COM 	ndr_stream_t	*nds = &mxa->send_nds;
183*9914Samw@Sun.COM 	int		rc;
1845772Sas200622 
185*9914Samw@Sun.COM 	if (!NDR_MODE_MATCH(nds, NDR_MODE_RETURN_SEND))
186*9914Samw@Sun.COM 		return (NDR_DRC_FAULT_MODE_MISMATCH);
187*9914Samw@Sun.COM 
188*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(nds, mxa->opnum,
189*9914Samw@Sun.COM 	    mxa->binding->service->interface_ti, params);
1905772Sas200622 
1918334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_RESPONSE);
1925772Sas200622 }
1935772Sas200622 
194*9914Samw@Sun.COM /*
195*9914Samw@Sun.COM  * Use the send stream to marshall data (NDR_MODE_CALL_SEND).
196*9914Samw@Sun.COM  */
1975772Sas200622 int
1988334SJose.Borrego@Sun.COM ndr_encode_call(ndr_xa_t *mxa, void *params)
1995772Sas200622 {
200*9914Samw@Sun.COM 	ndr_stream_t	*nds = &mxa->send_nds;
201*9914Samw@Sun.COM 	int		rc;
2025772Sas200622 
203*9914Samw@Sun.COM 	if (!NDR_MODE_MATCH(nds, NDR_MODE_CALL_SEND))
204*9914Samw@Sun.COM 		return (NDR_DRC_FAULT_MODE_MISMATCH);
205*9914Samw@Sun.COM 
206*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(nds, mxa->opnum,
207*9914Samw@Sun.COM 	    mxa->binding->service->interface_ti, params);
2085772Sas200622 
2098334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_REQUEST);
2105772Sas200622 }
2115772Sas200622 
212*9914Samw@Sun.COM /*
213*9914Samw@Sun.COM  * Use the receive stream to unmarshall data (NDR_MODE_RETURN_RECV).
214*9914Samw@Sun.COM  */
2155772Sas200622 int
2168334SJose.Borrego@Sun.COM ndr_decode_return(ndr_xa_t *mxa, void *params)
2175772Sas200622 {
218*9914Samw@Sun.COM 	ndr_stream_t	*nds = &mxa->recv_nds;
219*9914Samw@Sun.COM 	int		rc;
2205772Sas200622 
221*9914Samw@Sun.COM 	if (!NDR_MODE_MATCH(nds, NDR_MODE_RETURN_RECV))
222*9914Samw@Sun.COM 		return (NDR_DRC_FAULT_MODE_MISMATCH);
223*9914Samw@Sun.COM 
224*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(nds, mxa->opnum,
225*9914Samw@Sun.COM 	    mxa->binding->service->interface_ti, params);
2265772Sas200622 
2278334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_RESPONSE);
2285772Sas200622 }
2295772Sas200622 
2305772Sas200622 int
2318334SJose.Borrego@Sun.COM ndr_decode_pdu_hdr(ndr_xa_t *mxa)
2325772Sas200622 {
2338334SJose.Borrego@Sun.COM 	ndr_common_header_t	*hdr = &mxa->recv_hdr.common_hdr;
2348334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = &mxa->recv_nds;
235*9914Samw@Sun.COM 	int			rc;
236*9914Samw@Sun.COM 
237*9914Samw@Sun.COM 	rc = ndr_decode_hdr_common(nds, hdr);
238*9914Samw@Sun.COM 	if (NDR_DRC_IS_FAULT(rc))
239*9914Samw@Sun.COM 		return (rc);
240*9914Samw@Sun.COM 
241*9914Samw@Sun.COM 	/*
242*9914Samw@Sun.COM 	 * Verify the protocol version.
243*9914Samw@Sun.COM 	 */
244*9914Samw@Sun.COM 	if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0))
245*9914Samw@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED));
246*9914Samw@Sun.COM 
247*9914Samw@Sun.COM 	mxa->ptype = hdr->ptype;
248*9914Samw@Sun.COM 	return (NDR_DRC_OK);
249*9914Samw@Sun.COM }
250*9914Samw@Sun.COM 
251*9914Samw@Sun.COM static int
252*9914Samw@Sun.COM ndr_decode_hdr_common(ndr_stream_t *nds, ndr_common_header_t *hdr)
253*9914Samw@Sun.COM {
2545772Sas200622 	int			ptype;
2555772Sas200622 	int			rc;
2565772Sas200622 	int			charset;
2575772Sas200622 	int			byte_order;
2585772Sas200622 
2598334SJose.Borrego@Sun.COM 	if (nds->m_op != NDR_M_OP_UNMARSHALL)
2608334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH));
2615772Sas200622 
2625772Sas200622 	/*
2635772Sas200622 	 * All PDU headers are at least this big
2645772Sas200622 	 */
2658334SJose.Borrego@Sun.COM 	rc = NDS_GROW_PDU(nds, sizeof (ndr_common_header_t), 0);
2665772Sas200622 	if (!rc)
2678334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_RECEIVED_RUNT));
2685772Sas200622 
2695772Sas200622 	/*
2705772Sas200622 	 * Peek at the first eight bytes to figure out what we're doing.
2715772Sas200622 	 */
2728334SJose.Borrego@Sun.COM 	rc = NDS_GET_PDU(nds, 0, 8, (char *)hdr, 0, 0);
2735772Sas200622 	if (!rc)
2748334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED));
2755772Sas200622 
2765772Sas200622 	/*
2775772Sas200622 	 * Check for ASCII as the character set.  This is an ASCII
2785772Sas200622 	 * versus EBCDIC option and has nothing to do with Unicode.
2795772Sas200622 	 */
2808334SJose.Borrego@Sun.COM 	charset = hdr->packed_drep.intg_char_rep & NDR_REPLAB_CHAR_MASK;
2818334SJose.Borrego@Sun.COM 	if (charset != NDR_REPLAB_CHAR_ASCII)
2828334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED));
2835772Sas200622 
2845772Sas200622 	/*
2855772Sas200622 	 * Set the byte swap flag if the PDU byte-order
2865772Sas200622 	 * is different from the local byte-order.
2875772Sas200622 	 */
2888334SJose.Borrego@Sun.COM 	byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK;
2898334SJose.Borrego@Sun.COM 	nds->swap = (byte_order != ndr_native_byte_order) ? 1 : 0;
2905772Sas200622 
2915772Sas200622 	ptype = hdr->ptype;
2928334SJose.Borrego@Sun.COM 	if (ptype == NDR_PTYPE_REQUEST &&
2938334SJose.Borrego@Sun.COM 	    (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) {
2948334SJose.Borrego@Sun.COM 		ptype = NDR_PTYPE_REQUEST_WITH;	/* fake for sizing */
2955772Sas200622 	}
2965772Sas200622 
297*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(nds, ptype, &TYPEINFO(ndr_hdr), hdr);
2985772Sas200622 
2998334SJose.Borrego@Sun.COM 	return (NDR_DRC_PTYPE_RPCHDR(rc));
3005772Sas200622 }
3015772Sas200622 
3025772Sas200622 /*
3038334SJose.Borrego@Sun.COM  * Decode an RPC fragment header.  Use ndr_decode_pdu_hdr() to process
3045772Sas200622  * the first fragment header then this function to process additional
3055772Sas200622  * fragment headers.
3065772Sas200622  */
3075772Sas200622 void
3088334SJose.Borrego@Sun.COM ndr_decode_frag_hdr(ndr_stream_t *nds, ndr_common_header_t *hdr)
3095772Sas200622 {
3107619SJose.Borrego@Sun.COM 	ndr_common_header_t *tmp;
3115772Sas200622 	uint8_t *pdu;
3125772Sas200622 	int byte_order;
3135772Sas200622 
3148334SJose.Borrego@Sun.COM 	pdu = (uint8_t *)nds->pdu_base_offset + nds->pdu_scan_offset;
3158334SJose.Borrego@Sun.COM 	bcopy(pdu, hdr, NDR_RSP_HDR_SIZE);
3165772Sas200622 
3175772Sas200622 	/*
3185772Sas200622 	 * Swap non-byte fields if the PDU byte-order
3195772Sas200622 	 * is different from the local byte-order.
3205772Sas200622 	 */
3218334SJose.Borrego@Sun.COM 	byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK;
3225772Sas200622 
3238334SJose.Borrego@Sun.COM 	if (byte_order != ndr_native_byte_order) {
3245772Sas200622 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
3257619SJose.Borrego@Sun.COM 		tmp = (ndr_common_header_t *)pdu;
3265772Sas200622 
3278334SJose.Borrego@Sun.COM 		nds_bswap(&tmp->frag_length, &hdr->frag_length,
3285772Sas200622 		    sizeof (WORD));
3298334SJose.Borrego@Sun.COM 		nds_bswap(&tmp->auth_length, &hdr->auth_length,
3305772Sas200622 		    sizeof (WORD));
3318334SJose.Borrego@Sun.COM 		nds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD));
3325772Sas200622 	}
3335772Sas200622 }
3345772Sas200622 
3355772Sas200622 int
3368334SJose.Borrego@Sun.COM ndr_encode_pdu_hdr(ndr_xa_t *mxa)
3375772Sas200622 {
3388334SJose.Borrego@Sun.COM 	ndr_common_header_t	*hdr = &mxa->send_hdr.common_hdr;
3398334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = &mxa->send_nds;
3405772Sas200622 	int			ptype;
3415772Sas200622 	int			rc;
3425772Sas200622 
3438334SJose.Borrego@Sun.COM 	if (nds->m_op != NDR_M_OP_MARSHALL)
3448334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH));
3455772Sas200622 
3465772Sas200622 	ptype = hdr->ptype;
3478334SJose.Borrego@Sun.COM 	if (ptype == NDR_PTYPE_REQUEST &&
3488334SJose.Borrego@Sun.COM 	    (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) {
3498334SJose.Borrego@Sun.COM 		ptype = NDR_PTYPE_REQUEST_WITH;	/* fake for sizing */
3505772Sas200622 	}
3515772Sas200622 
352*9914Samw@Sun.COM 	rc = ndr_encode_decode_common(nds, ptype, &TYPEINFO(ndr_hdr), hdr);
3535772Sas200622 
3548334SJose.Borrego@Sun.COM 	return (NDR_DRC_PTYPE_RPCHDR(rc));
3555772Sas200622 }
3565772Sas200622 
3575772Sas200622 /*
3585772Sas200622  * This is a hand-coded derivative of the automatically generated
3595772Sas200622  * (un)marshalling routine for bind_ack headers. bind_ack headers
3605772Sas200622  * have an interior conformant array, which is inconsistent with
3615772Sas200622  * IDL/NDR rules.
3625772Sas200622  */
3635772Sas200622 extern struct ndr_typeinfo ndt__uchar;
3645772Sas200622 extern struct ndr_typeinfo ndt__ushort;
3655772Sas200622 extern struct ndr_typeinfo ndt__ulong;
3665772Sas200622 
3678334SJose.Borrego@Sun.COM int ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref);
3688334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_bind_ack_hdr = {
3695772Sas200622     1,		/* NDR version */
3705772Sas200622     3,		/* alignment */
3715772Sas200622     NDR_F_STRUCT,	/* flags */
3728334SJose.Borrego@Sun.COM     ndr__ndr_bind_ack_hdr,	/* ndr_func */
3735772Sas200622     68,		/* pdu_size_fixed_part */
3745772Sas200622     0,		/* pdu_size_variable_part */
3755772Sas200622     68,		/* c_size_fixed_part */
3765772Sas200622     0,		/* c_size_variable_part */
3775772Sas200622 };
3785772Sas200622 
3795772Sas200622 /*
3805772Sas200622  * [_no_reorder]
3815772Sas200622  */
3825772Sas200622 int
3838334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref)
3845772Sas200622 {
3858334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = encl_ref->stream;
3867619SJose.Borrego@Sun.COM 	struct ndr_bind_ack_hdr	*val = /*LINTED E_BAD_PTR_CAST_ALIGN*/
3877619SJose.Borrego@Sun.COM 	    (struct ndr_bind_ack_hdr *)encl_ref->datum;
3888334SJose.Borrego@Sun.COM 	ndr_ref_t		myref;
3895772Sas200622 	unsigned long		offset;
3905772Sas200622 
3915772Sas200622 	bzero(&myref, sizeof (myref));
3925772Sas200622 	myref.enclosing = encl_ref;
3935772Sas200622 	myref.stream = encl_ref->stream;
3945772Sas200622 	myref.packed_alignment = 0;
3955772Sas200622 
3965772Sas200622 	/* do all members in order */
3977619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_common_header, common_hdr, 0UL);
3985772Sas200622 	NDR_MEMBER(_ushort, max_xmit_frag, 16UL);
3995772Sas200622 	NDR_MEMBER(_ushort, max_recv_frag, 18UL);
4005772Sas200622 	NDR_MEMBER(_ulong, assoc_group_id, 20UL);
4015772Sas200622 
4025772Sas200622 	/* port any is the conformant culprit */
4035772Sas200622 	offset = 24UL;
4045772Sas200622 
4058334SJose.Borrego@Sun.COM 	switch (nds->m_op) {
4065772Sas200622 	case NDR_M_OP_MARSHALL:
4075772Sas200622 		val->sec_addr.length =
4085772Sas200622 		    strlen((char *)val->sec_addr.port_spec) + 1;
4095772Sas200622 		break;
4105772Sas200622 
4115772Sas200622 	case NDR_M_OP_UNMARSHALL:
4125772Sas200622 		break;
4135772Sas200622 
4145772Sas200622 	default:
4155772Sas200622 		NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID);
4165772Sas200622 		return (0);
4175772Sas200622 	}
4185772Sas200622 
4195772Sas200622 	NDR_MEMBER(_ushort, sec_addr.length, offset);
4205772Sas200622 	NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec,
4215772Sas200622 	    offset+2UL, val->sec_addr.length);
4225772Sas200622 
4235772Sas200622 	offset += 2;
4245772Sas200622 	offset += val->sec_addr.length;
4258334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
4265772Sas200622 
4278334SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_p_result_list, p_result_list, offset);
4285772Sas200622 	return (1);
4295772Sas200622 }
4305772Sas200622 
4317619SJose.Borrego@Sun.COM /*
4327619SJose.Borrego@Sun.COM  * Assume a single presentation context element in the result list.
4337619SJose.Borrego@Sun.COM  */
4345772Sas200622 unsigned
4358334SJose.Borrego@Sun.COM ndr_bind_ack_hdr_size(ndr_xa_t *mxa)
4365772Sas200622 {
4377619SJose.Borrego@Sun.COM 	ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr;
4385772Sas200622 	unsigned	offset;
4395772Sas200622 	unsigned	length;
4405772Sas200622 
4415772Sas200622 	/* port any is the conformant culprit */
4425772Sas200622 	offset = 24UL;
4435772Sas200622 
4445772Sas200622 	length = strlen((char *)bahdr->sec_addr.port_spec) + 1;
4455772Sas200622 
4465772Sas200622 	offset += 2;
4475772Sas200622 	offset += length;
4488334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
4498334SJose.Borrego@Sun.COM 	offset += sizeof (ndr_p_result_list_t);
4505772Sas200622 	return (offset);
4515772Sas200622 }
4527619SJose.Borrego@Sun.COM 
4537619SJose.Borrego@Sun.COM /*
4547619SJose.Borrego@Sun.COM  * This is a hand-coded derivative of the automatically generated
4557619SJose.Borrego@Sun.COM  * (un)marshalling routine for alter_context_rsp headers.
4567619SJose.Borrego@Sun.COM  * Alter context response headers have an interior conformant array,
4577619SJose.Borrego@Sun.COM  * which is inconsistent with IDL/NDR rules.
4587619SJose.Borrego@Sun.COM  */
4598334SJose.Borrego@Sun.COM int ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref);
4608334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_alter_context_rsp_hdr = {
4617619SJose.Borrego@Sun.COM     1,			/* NDR version */
4627619SJose.Borrego@Sun.COM     3,			/* alignment */
4637619SJose.Borrego@Sun.COM     NDR_F_STRUCT,	/* flags */
4648334SJose.Borrego@Sun.COM     ndr__ndr_alter_context_rsp_hdr,	/* ndr_func */
4657619SJose.Borrego@Sun.COM     56,			/* pdu_size_fixed_part */
4667619SJose.Borrego@Sun.COM     0,			/* pdu_size_variable_part */
4677619SJose.Borrego@Sun.COM     56,			/* c_size_fixed_part */
4687619SJose.Borrego@Sun.COM     0,			/* c_size_variable_part */
4697619SJose.Borrego@Sun.COM };
4707619SJose.Borrego@Sun.COM 
4717619SJose.Borrego@Sun.COM /*
4727619SJose.Borrego@Sun.COM  * [_no_reorder]
4737619SJose.Borrego@Sun.COM  */
4747619SJose.Borrego@Sun.COM int
4758334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref)
4767619SJose.Borrego@Sun.COM {
4778334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = encl_ref->stream;
4787619SJose.Borrego@Sun.COM 	ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/
4797619SJose.Borrego@Sun.COM 	    (ndr_alter_context_rsp_hdr_t *)encl_ref->datum;
4808334SJose.Borrego@Sun.COM 	ndr_ref_t		myref;
4817619SJose.Borrego@Sun.COM 	unsigned long		offset;
4827619SJose.Borrego@Sun.COM 
4837619SJose.Borrego@Sun.COM 	bzero(&myref, sizeof (myref));
4847619SJose.Borrego@Sun.COM 	myref.enclosing = encl_ref;
4857619SJose.Borrego@Sun.COM 	myref.stream = encl_ref->stream;
4867619SJose.Borrego@Sun.COM 	myref.packed_alignment = 0;
4877619SJose.Borrego@Sun.COM 
4887619SJose.Borrego@Sun.COM 	/* do all members in order */
4897619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_common_header, common_hdr, 0UL);
4907619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, max_xmit_frag, 16UL);
4917619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, max_recv_frag, 18UL);
4927619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ulong, assoc_group_id, 20UL);
4937619SJose.Borrego@Sun.COM 
4947619SJose.Borrego@Sun.COM 	offset = 24UL;	/* offset of sec_addr */
4957619SJose.Borrego@Sun.COM 
4968334SJose.Borrego@Sun.COM 	switch (nds->m_op) {
4977619SJose.Borrego@Sun.COM 	case NDR_M_OP_MARSHALL:
4987619SJose.Borrego@Sun.COM 		val->sec_addr.length = 0;
4997619SJose.Borrego@Sun.COM 		break;
5007619SJose.Borrego@Sun.COM 
5017619SJose.Borrego@Sun.COM 	case NDR_M_OP_UNMARSHALL:
5027619SJose.Borrego@Sun.COM 		break;
5037619SJose.Borrego@Sun.COM 
5047619SJose.Borrego@Sun.COM 	default:
5057619SJose.Borrego@Sun.COM 		NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID);
5067619SJose.Borrego@Sun.COM 		return (0);
5077619SJose.Borrego@Sun.COM 	}
5087619SJose.Borrego@Sun.COM 
5097619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, sec_addr.length, offset);
5107619SJose.Borrego@Sun.COM 	NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec,
5117619SJose.Borrego@Sun.COM 	    offset+2UL, val->sec_addr.length);
5127619SJose.Borrego@Sun.COM 
5137619SJose.Borrego@Sun.COM 	offset += 2;	/* sizeof (sec_addr.length) */
5148334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
5157619SJose.Borrego@Sun.COM 
5168334SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_p_result_list, p_result_list, offset);
5177619SJose.Borrego@Sun.COM 	return (1);
5187619SJose.Borrego@Sun.COM }
5197619SJose.Borrego@Sun.COM 
5207619SJose.Borrego@Sun.COM /*
5217619SJose.Borrego@Sun.COM  * Assume a single presentation context element in the result list.
5227619SJose.Borrego@Sun.COM  */
5237619SJose.Borrego@Sun.COM unsigned
5248334SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_size(void)
5257619SJose.Borrego@Sun.COM {
5267619SJose.Borrego@Sun.COM 	unsigned	offset;
5277619SJose.Borrego@Sun.COM 
5287619SJose.Borrego@Sun.COM 	offset = 24UL;	/* offset of sec_addr */
5297619SJose.Borrego@Sun.COM 	offset += 2;	/* sizeof (sec_addr.length) */
5308334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
5318334SJose.Borrego@Sun.COM 	offset += sizeof (ndr_p_result_list_t);
5327619SJose.Borrego@Sun.COM 	return (offset);
5337619SJose.Borrego@Sun.COM }
534