xref: /onnv-gate/usr/src/lib/smbsrv/libmlrpc/common/ndr_marshal.c (revision 8334:5f1c6a3b0fad)
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 /*
227619SJose.Borrego@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
235772Sas200622  * Use is subject to license terms.
245772Sas200622  */
255772Sas200622 
265772Sas200622 #include <strings.h>
275772Sas200622 #include <sys/param.h>
285772Sas200622 
295772Sas200622 #include <smbsrv/libsmb.h>
30*8334SJose.Borrego@Sun.COM #include <smbsrv/libmlrpc.h>
315772Sas200622 
325772Sas200622 #ifdef _BIG_ENDIAN
33*8334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_BIG_ENDIAN;
345772Sas200622 #else
35*8334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_LITTLE_ENDIAN;
365772Sas200622 #endif
375772Sas200622 
385772Sas200622 int
39*8334SJose.Borrego@Sun.COM ndr_encode_decode_common(ndr_xa_t *mxa, int mode, unsigned opnum,
40*8334SJose.Borrego@Sun.COM     ndr_typeinfo_t *ti, void *datum)
415772Sas200622 {
42*8334SJose.Borrego@Sun.COM 	ndr_stream_t	*nds;
43*8334SJose.Borrego@Sun.COM 	int		m_op = NDR_MODE_TO_M_OP(mode);
44*8334SJose.Borrego@Sun.COM 	int		rc;
455772Sas200622 
465772Sas200622 	if (m_op == NDR_M_OP_MARSHALL)
47*8334SJose.Borrego@Sun.COM 		nds = &mxa->send_nds;
485772Sas200622 	else
49*8334SJose.Borrego@Sun.COM 		nds = &mxa->recv_nds;
505772Sas200622 
515772Sas200622 	/*
52*8334SJose.Borrego@Sun.COM 	 * Make sure that nds is in the correct mode
535772Sas200622 	 */
54*8334SJose.Borrego@Sun.COM 	if (!NDR_MODE_MATCH(nds, mode))
55*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_FAULT_MODE_MISMATCH);
565772Sas200622 
575772Sas200622 	/*
585772Sas200622 	 * Perform the (un)marshalling
595772Sas200622 	 */
60*8334SJose.Borrego@Sun.COM 	if (ndo_operation(nds, ti, opnum, datum))
61*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_OK);
625772Sas200622 
63*8334SJose.Borrego@Sun.COM 	switch (nds->error) {
645772Sas200622 	case NDR_ERR_MALLOC_FAILED:
65*8334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_OUT_OF_MEMORY;
665772Sas200622 		break;
675772Sas200622 
685772Sas200622 	case NDR_ERR_SWITCH_VALUE_INVALID:
69*8334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_PARAM_0_INVALID;
705772Sas200622 		break;
715772Sas200622 
725772Sas200622 	case NDR_ERR_UNDERFLOW:
73*8334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_RECEIVED_RUNT;
745772Sas200622 		break;
755772Sas200622 
765772Sas200622 	case NDR_ERR_GROW_FAILED:
77*8334SJose.Borrego@Sun.COM 		rc = NDR_DRC_FAULT_ENCODE_TOO_BIG;
785772Sas200622 		break;
795772Sas200622 
805772Sas200622 	default:
815772Sas200622 		if (m_op == NDR_M_OP_MARSHALL)
82*8334SJose.Borrego@Sun.COM 			rc = NDR_DRC_FAULT_ENCODE_FAILED;
835772Sas200622 		else
84*8334SJose.Borrego@Sun.COM 			rc = NDR_DRC_FAULT_DECODE_FAILED;
855772Sas200622 		break;
865772Sas200622 	}
875772Sas200622 
885772Sas200622 	return (rc);
895772Sas200622 }
905772Sas200622 
915772Sas200622 int
92*8334SJose.Borrego@Sun.COM ndr_decode_call(ndr_xa_t *mxa, void *params)
935772Sas200622 {
945772Sas200622 	int rc;
955772Sas200622 
96*8334SJose.Borrego@Sun.COM 	rc = ndr_encode_decode_common(mxa, NDR_MODE_CALL_RECV,
975772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
985772Sas200622 
99*8334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_REQUEST);
1005772Sas200622 }
1015772Sas200622 
1025772Sas200622 int
103*8334SJose.Borrego@Sun.COM ndr_encode_return(ndr_xa_t *mxa, void *params)
1045772Sas200622 {
1055772Sas200622 	int rc;
1065772Sas200622 
107*8334SJose.Borrego@Sun.COM 	rc = ndr_encode_decode_common(mxa, NDR_MODE_RETURN_SEND,
1085772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
1095772Sas200622 
110*8334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_RESPONSE);
1115772Sas200622 }
1125772Sas200622 
1135772Sas200622 int
114*8334SJose.Borrego@Sun.COM ndr_encode_call(ndr_xa_t *mxa, void *params)
1155772Sas200622 {
1165772Sas200622 	int rc;
1175772Sas200622 
118*8334SJose.Borrego@Sun.COM 	rc = ndr_encode_decode_common(mxa, NDR_MODE_CALL_SEND,
1195772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
1205772Sas200622 
121*8334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_REQUEST);
1225772Sas200622 }
1235772Sas200622 
1245772Sas200622 int
125*8334SJose.Borrego@Sun.COM ndr_decode_return(ndr_xa_t *mxa, void *params)
1265772Sas200622 {
1275772Sas200622 	int rc;
1285772Sas200622 
129*8334SJose.Borrego@Sun.COM 	rc = ndr_encode_decode_common(mxa, NDR_MODE_RETURN_RECV,
1305772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
1315772Sas200622 
132*8334SJose.Borrego@Sun.COM 	return (rc + NDR_PTYPE_RESPONSE);
1335772Sas200622 }
1345772Sas200622 
1355772Sas200622 int
136*8334SJose.Borrego@Sun.COM ndr_decode_pdu_hdr(ndr_xa_t *mxa)
1375772Sas200622 {
138*8334SJose.Borrego@Sun.COM 	ndr_common_header_t	*hdr = &mxa->recv_hdr.common_hdr;
139*8334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = &mxa->recv_nds;
1405772Sas200622 	int			ptype;
1415772Sas200622 	int			rc;
1425772Sas200622 	int			charset;
1435772Sas200622 	int			byte_order;
1445772Sas200622 
145*8334SJose.Borrego@Sun.COM 	if (nds->m_op != NDR_M_OP_UNMARSHALL)
146*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH));
1475772Sas200622 
1485772Sas200622 	/*
1495772Sas200622 	 * All PDU headers are at least this big
1505772Sas200622 	 */
151*8334SJose.Borrego@Sun.COM 	rc = NDS_GROW_PDU(nds, sizeof (ndr_common_header_t), 0);
1525772Sas200622 	if (!rc)
153*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_RECEIVED_RUNT));
1545772Sas200622 
1555772Sas200622 	/*
1565772Sas200622 	 * Peek at the first eight bytes to figure out what we're doing.
1575772Sas200622 	 */
158*8334SJose.Borrego@Sun.COM 	rc = NDS_GET_PDU(nds, 0, 8, (char *)hdr, 0, 0);
1595772Sas200622 	if (!rc)
160*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED));
1615772Sas200622 
1625772Sas200622 	/*
1635772Sas200622 	 * Verify the protocol version.
1645772Sas200622 	 */
1655772Sas200622 	if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0))
166*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED));
1675772Sas200622 
1685772Sas200622 	/*
1695772Sas200622 	 * Check for ASCII as the character set.  This is an ASCII
1705772Sas200622 	 * versus EBCDIC option and has nothing to do with Unicode.
1715772Sas200622 	 */
172*8334SJose.Borrego@Sun.COM 	charset = hdr->packed_drep.intg_char_rep & NDR_REPLAB_CHAR_MASK;
173*8334SJose.Borrego@Sun.COM 	if (charset != NDR_REPLAB_CHAR_ASCII)
174*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED));
1755772Sas200622 
1765772Sas200622 	/*
1775772Sas200622 	 * Set the byte swap flag if the PDU byte-order
1785772Sas200622 	 * is different from the local byte-order.
1795772Sas200622 	 */
180*8334SJose.Borrego@Sun.COM 	byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK;
181*8334SJose.Borrego@Sun.COM 	nds->swap = (byte_order != ndr_native_byte_order) ? 1 : 0;
1825772Sas200622 
1835772Sas200622 	ptype = hdr->ptype;
184*8334SJose.Borrego@Sun.COM 	if (ptype == NDR_PTYPE_REQUEST &&
185*8334SJose.Borrego@Sun.COM 	    (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) {
186*8334SJose.Borrego@Sun.COM 		ptype = NDR_PTYPE_REQUEST_WITH;	/* fake for sizing */
1875772Sas200622 	}
1885772Sas200622 
1895772Sas200622 	mxa->ptype = hdr->ptype;
1905772Sas200622 
191*8334SJose.Borrego@Sun.COM 	rc = ndr_encode_decode_common(mxa,
192*8334SJose.Borrego@Sun.COM 	    NDR_M_OP_AND_DIR_TO_MODE(nds->m_op, nds->dir),
1937619SJose.Borrego@Sun.COM 	    ptype, &TYPEINFO(ndr_hdr), hdr);
1945772Sas200622 
195*8334SJose.Borrego@Sun.COM 	return (NDR_DRC_PTYPE_RPCHDR(rc));
1965772Sas200622 }
1975772Sas200622 
1985772Sas200622 /*
199*8334SJose.Borrego@Sun.COM  * Decode an RPC fragment header.  Use ndr_decode_pdu_hdr() to process
2005772Sas200622  * the first fragment header then this function to process additional
2015772Sas200622  * fragment headers.
2025772Sas200622  */
2035772Sas200622 void
204*8334SJose.Borrego@Sun.COM ndr_decode_frag_hdr(ndr_stream_t *nds, ndr_common_header_t *hdr)
2055772Sas200622 {
2067619SJose.Borrego@Sun.COM 	ndr_common_header_t *tmp;
2075772Sas200622 	uint8_t *pdu;
2085772Sas200622 	int byte_order;
2095772Sas200622 
210*8334SJose.Borrego@Sun.COM 	pdu = (uint8_t *)nds->pdu_base_offset + nds->pdu_scan_offset;
211*8334SJose.Borrego@Sun.COM 	bcopy(pdu, hdr, NDR_RSP_HDR_SIZE);
2125772Sas200622 
2135772Sas200622 	/*
2145772Sas200622 	 * Swap non-byte fields if the PDU byte-order
2155772Sas200622 	 * is different from the local byte-order.
2165772Sas200622 	 */
217*8334SJose.Borrego@Sun.COM 	byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK;
2185772Sas200622 
219*8334SJose.Borrego@Sun.COM 	if (byte_order != ndr_native_byte_order) {
2205772Sas200622 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
2217619SJose.Borrego@Sun.COM 		tmp = (ndr_common_header_t *)pdu;
2225772Sas200622 
223*8334SJose.Borrego@Sun.COM 		nds_bswap(&tmp->frag_length, &hdr->frag_length,
2245772Sas200622 		    sizeof (WORD));
225*8334SJose.Borrego@Sun.COM 		nds_bswap(&tmp->auth_length, &hdr->auth_length,
2265772Sas200622 		    sizeof (WORD));
227*8334SJose.Borrego@Sun.COM 		nds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD));
2285772Sas200622 	}
2295772Sas200622 }
2305772Sas200622 
2315772Sas200622 int
232*8334SJose.Borrego@Sun.COM ndr_encode_pdu_hdr(ndr_xa_t *mxa)
2335772Sas200622 {
234*8334SJose.Borrego@Sun.COM 	ndr_common_header_t	*hdr = &mxa->send_hdr.common_hdr;
235*8334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = &mxa->send_nds;
2365772Sas200622 	int			ptype;
2375772Sas200622 	int			rc;
2385772Sas200622 
239*8334SJose.Borrego@Sun.COM 	if (nds->m_op != NDR_M_OP_MARSHALL)
240*8334SJose.Borrego@Sun.COM 		return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH));
2415772Sas200622 
2425772Sas200622 	ptype = hdr->ptype;
243*8334SJose.Borrego@Sun.COM 	if (ptype == NDR_PTYPE_REQUEST &&
244*8334SJose.Borrego@Sun.COM 	    (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) {
245*8334SJose.Borrego@Sun.COM 		ptype = NDR_PTYPE_REQUEST_WITH;	/* fake for sizing */
2465772Sas200622 	}
2475772Sas200622 
248*8334SJose.Borrego@Sun.COM 	rc = ndr_encode_decode_common(mxa,
249*8334SJose.Borrego@Sun.COM 	    NDR_M_OP_AND_DIR_TO_MODE(nds->m_op, nds->dir),
2507619SJose.Borrego@Sun.COM 	    ptype, &TYPEINFO(ndr_hdr), hdr);
2515772Sas200622 
252*8334SJose.Borrego@Sun.COM 	return (NDR_DRC_PTYPE_RPCHDR(rc));
2535772Sas200622 }
2545772Sas200622 
2555772Sas200622 /*
2565772Sas200622  * This is a hand-coded derivative of the automatically generated
2575772Sas200622  * (un)marshalling routine for bind_ack headers. bind_ack headers
2585772Sas200622  * have an interior conformant array, which is inconsistent with
2595772Sas200622  * IDL/NDR rules.
2605772Sas200622  */
2615772Sas200622 extern struct ndr_typeinfo ndt__uchar;
2625772Sas200622 extern struct ndr_typeinfo ndt__ushort;
2635772Sas200622 extern struct ndr_typeinfo ndt__ulong;
2645772Sas200622 
265*8334SJose.Borrego@Sun.COM int ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref);
266*8334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_bind_ack_hdr = {
2675772Sas200622     1,		/* NDR version */
2685772Sas200622     3,		/* alignment */
2695772Sas200622     NDR_F_STRUCT,	/* flags */
270*8334SJose.Borrego@Sun.COM     ndr__ndr_bind_ack_hdr,	/* ndr_func */
2715772Sas200622     68,		/* pdu_size_fixed_part */
2725772Sas200622     0,		/* pdu_size_variable_part */
2735772Sas200622     68,		/* c_size_fixed_part */
2745772Sas200622     0,		/* c_size_variable_part */
2755772Sas200622 };
2765772Sas200622 
2775772Sas200622 /*
2785772Sas200622  * [_no_reorder]
2795772Sas200622  */
2805772Sas200622 int
281*8334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref)
2825772Sas200622 {
283*8334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = encl_ref->stream;
2847619SJose.Borrego@Sun.COM 	struct ndr_bind_ack_hdr	*val = /*LINTED E_BAD_PTR_CAST_ALIGN*/
2857619SJose.Borrego@Sun.COM 	    (struct ndr_bind_ack_hdr *)encl_ref->datum;
286*8334SJose.Borrego@Sun.COM 	ndr_ref_t		myref;
2875772Sas200622 	unsigned long		offset;
2885772Sas200622 
2895772Sas200622 	bzero(&myref, sizeof (myref));
2905772Sas200622 	myref.enclosing = encl_ref;
2915772Sas200622 	myref.stream = encl_ref->stream;
2925772Sas200622 	myref.packed_alignment = 0;
2935772Sas200622 
2945772Sas200622 	/* do all members in order */
2957619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_common_header, common_hdr, 0UL);
2965772Sas200622 	NDR_MEMBER(_ushort, max_xmit_frag, 16UL);
2975772Sas200622 	NDR_MEMBER(_ushort, max_recv_frag, 18UL);
2985772Sas200622 	NDR_MEMBER(_ulong, assoc_group_id, 20UL);
2995772Sas200622 
3005772Sas200622 	/* port any is the conformant culprit */
3015772Sas200622 	offset = 24UL;
3025772Sas200622 
303*8334SJose.Borrego@Sun.COM 	switch (nds->m_op) {
3045772Sas200622 	case NDR_M_OP_MARSHALL:
3055772Sas200622 		val->sec_addr.length =
3065772Sas200622 		    strlen((char *)val->sec_addr.port_spec) + 1;
3075772Sas200622 		break;
3085772Sas200622 
3095772Sas200622 	case NDR_M_OP_UNMARSHALL:
3105772Sas200622 		break;
3115772Sas200622 
3125772Sas200622 	default:
3135772Sas200622 		NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID);
3145772Sas200622 		return (0);
3155772Sas200622 	}
3165772Sas200622 
3175772Sas200622 	NDR_MEMBER(_ushort, sec_addr.length, offset);
3185772Sas200622 	NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec,
3195772Sas200622 	    offset+2UL, val->sec_addr.length);
3205772Sas200622 
3215772Sas200622 	offset += 2;
3225772Sas200622 	offset += val->sec_addr.length;
323*8334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
3245772Sas200622 
325*8334SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_p_result_list, p_result_list, offset);
3265772Sas200622 	return (1);
3275772Sas200622 }
3285772Sas200622 
3297619SJose.Borrego@Sun.COM /*
3307619SJose.Borrego@Sun.COM  * Assume a single presentation context element in the result list.
3317619SJose.Borrego@Sun.COM  */
3325772Sas200622 unsigned
333*8334SJose.Borrego@Sun.COM ndr_bind_ack_hdr_size(ndr_xa_t *mxa)
3345772Sas200622 {
3357619SJose.Borrego@Sun.COM 	ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr;
3365772Sas200622 	unsigned	offset;
3375772Sas200622 	unsigned	length;
3385772Sas200622 
3395772Sas200622 	/* port any is the conformant culprit */
3405772Sas200622 	offset = 24UL;
3415772Sas200622 
3425772Sas200622 	length = strlen((char *)bahdr->sec_addr.port_spec) + 1;
3435772Sas200622 
3445772Sas200622 	offset += 2;
3455772Sas200622 	offset += length;
346*8334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
347*8334SJose.Borrego@Sun.COM 	offset += sizeof (ndr_p_result_list_t);
3485772Sas200622 	return (offset);
3495772Sas200622 }
3507619SJose.Borrego@Sun.COM 
3517619SJose.Borrego@Sun.COM /*
3527619SJose.Borrego@Sun.COM  * This is a hand-coded derivative of the automatically generated
3537619SJose.Borrego@Sun.COM  * (un)marshalling routine for alter_context_rsp headers.
3547619SJose.Borrego@Sun.COM  * Alter context response headers have an interior conformant array,
3557619SJose.Borrego@Sun.COM  * which is inconsistent with IDL/NDR rules.
3567619SJose.Borrego@Sun.COM  */
357*8334SJose.Borrego@Sun.COM int ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref);
358*8334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_alter_context_rsp_hdr = {
3597619SJose.Borrego@Sun.COM     1,			/* NDR version */
3607619SJose.Borrego@Sun.COM     3,			/* alignment */
3617619SJose.Borrego@Sun.COM     NDR_F_STRUCT,	/* flags */
362*8334SJose.Borrego@Sun.COM     ndr__ndr_alter_context_rsp_hdr,	/* ndr_func */
3637619SJose.Borrego@Sun.COM     56,			/* pdu_size_fixed_part */
3647619SJose.Borrego@Sun.COM     0,			/* pdu_size_variable_part */
3657619SJose.Borrego@Sun.COM     56,			/* c_size_fixed_part */
3667619SJose.Borrego@Sun.COM     0,			/* c_size_variable_part */
3677619SJose.Borrego@Sun.COM };
3687619SJose.Borrego@Sun.COM 
3697619SJose.Borrego@Sun.COM /*
3707619SJose.Borrego@Sun.COM  * [_no_reorder]
3717619SJose.Borrego@Sun.COM  */
3727619SJose.Borrego@Sun.COM int
373*8334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref)
3747619SJose.Borrego@Sun.COM {
375*8334SJose.Borrego@Sun.COM 	ndr_stream_t		*nds = encl_ref->stream;
3767619SJose.Borrego@Sun.COM 	ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/
3777619SJose.Borrego@Sun.COM 	    (ndr_alter_context_rsp_hdr_t *)encl_ref->datum;
378*8334SJose.Borrego@Sun.COM 	ndr_ref_t		myref;
3797619SJose.Borrego@Sun.COM 	unsigned long		offset;
3807619SJose.Borrego@Sun.COM 
3817619SJose.Borrego@Sun.COM 	bzero(&myref, sizeof (myref));
3827619SJose.Borrego@Sun.COM 	myref.enclosing = encl_ref;
3837619SJose.Borrego@Sun.COM 	myref.stream = encl_ref->stream;
3847619SJose.Borrego@Sun.COM 	myref.packed_alignment = 0;
3857619SJose.Borrego@Sun.COM 
3867619SJose.Borrego@Sun.COM 	/* do all members in order */
3877619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_common_header, common_hdr, 0UL);
3887619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, max_xmit_frag, 16UL);
3897619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, max_recv_frag, 18UL);
3907619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ulong, assoc_group_id, 20UL);
3917619SJose.Borrego@Sun.COM 
3927619SJose.Borrego@Sun.COM 	offset = 24UL;	/* offset of sec_addr */
3937619SJose.Borrego@Sun.COM 
394*8334SJose.Borrego@Sun.COM 	switch (nds->m_op) {
3957619SJose.Borrego@Sun.COM 	case NDR_M_OP_MARSHALL:
3967619SJose.Borrego@Sun.COM 		val->sec_addr.length = 0;
3977619SJose.Borrego@Sun.COM 		break;
3987619SJose.Borrego@Sun.COM 
3997619SJose.Borrego@Sun.COM 	case NDR_M_OP_UNMARSHALL:
4007619SJose.Borrego@Sun.COM 		break;
4017619SJose.Borrego@Sun.COM 
4027619SJose.Borrego@Sun.COM 	default:
4037619SJose.Borrego@Sun.COM 		NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID);
4047619SJose.Borrego@Sun.COM 		return (0);
4057619SJose.Borrego@Sun.COM 	}
4067619SJose.Borrego@Sun.COM 
4077619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, sec_addr.length, offset);
4087619SJose.Borrego@Sun.COM 	NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec,
4097619SJose.Borrego@Sun.COM 	    offset+2UL, val->sec_addr.length);
4107619SJose.Borrego@Sun.COM 
4117619SJose.Borrego@Sun.COM 	offset += 2;	/* sizeof (sec_addr.length) */
412*8334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
4137619SJose.Borrego@Sun.COM 
414*8334SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_p_result_list, p_result_list, offset);
4157619SJose.Borrego@Sun.COM 	return (1);
4167619SJose.Borrego@Sun.COM }
4177619SJose.Borrego@Sun.COM 
4187619SJose.Borrego@Sun.COM /*
4197619SJose.Borrego@Sun.COM  * Assume a single presentation context element in the result list.
4207619SJose.Borrego@Sun.COM  */
4217619SJose.Borrego@Sun.COM unsigned
422*8334SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_size(void)
4237619SJose.Borrego@Sun.COM {
4247619SJose.Borrego@Sun.COM 	unsigned	offset;
4257619SJose.Borrego@Sun.COM 
4267619SJose.Borrego@Sun.COM 	offset = 24UL;	/* offset of sec_addr */
4277619SJose.Borrego@Sun.COM 	offset += 2;	/* sizeof (sec_addr.length) */
428*8334SJose.Borrego@Sun.COM 	offset += NDR_ALIGN4(offset);
429*8334SJose.Borrego@Sun.COM 	offset += sizeof (ndr_p_result_list_t);
4307619SJose.Borrego@Sun.COM 	return (offset);
4317619SJose.Borrego@Sun.COM }
432