xref: /onnv-gate/usr/src/lib/smbsrv/libmlrpc/common/ndr_marshal.c (revision 7619:0ad244464731)
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*7619SJose.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>
305772Sas200622 #include <smbsrv/ndr.h>
315772Sas200622 #include <smbsrv/mlrpc.h>
325772Sas200622 
335772Sas200622 #ifdef _BIG_ENDIAN
345772Sas200622 static const int mlrpc_native_byte_order = MLRPC_REPLAB_INTG_BIG_ENDIAN;
355772Sas200622 #else
365772Sas200622 static const int mlrpc_native_byte_order = MLRPC_REPLAB_INTG_LITTLE_ENDIAN;
375772Sas200622 #endif
385772Sas200622 
395772Sas200622 int
405772Sas200622 mlrpc_encode_decode_common(struct mlrpc_xaction *mxa, int mode, unsigned opnum,
415772Sas200622     struct ndr_typeinfo *ti, void *datum)
425772Sas200622 {
435772Sas200622 	struct mlndr_stream	*mlnds;
445772Sas200622 	int			m_op = NDR_MODE_TO_M_OP(mode);
455772Sas200622 	int			rc;
465772Sas200622 
475772Sas200622 	if (m_op == NDR_M_OP_MARSHALL)
485772Sas200622 		mlnds = &mxa->send_mlnds;
495772Sas200622 	else
505772Sas200622 		mlnds = &mxa->recv_mlnds;
515772Sas200622 
525772Sas200622 	/*
535772Sas200622 	 * Make sure that mlnds is in the correct mode
545772Sas200622 	 */
555772Sas200622 	if (!NDR_MODE_MATCH(mlnds, mode))
565772Sas200622 		return (MLRPC_DRC_FAULT_MODE_MISMATCH);
575772Sas200622 
585772Sas200622 	/*
595772Sas200622 	 * Perform the (un)marshalling
605772Sas200622 	 */
615772Sas200622 	if (mlndo_operation(mlnds, ti, opnum, datum))
625772Sas200622 		return (MLRPC_DRC_OK);
635772Sas200622 
645772Sas200622 	switch (mlnds->error) {
655772Sas200622 	case NDR_ERR_MALLOC_FAILED:
665772Sas200622 		rc = MLRPC_DRC_FAULT_OUT_OF_MEMORY;
675772Sas200622 		break;
685772Sas200622 
695772Sas200622 	case NDR_ERR_SWITCH_VALUE_INVALID:
705772Sas200622 		rc = MLRPC_DRC_FAULT_PARAM_0_INVALID;
715772Sas200622 		break;
725772Sas200622 
735772Sas200622 	case NDR_ERR_UNDERFLOW:
745772Sas200622 		rc = MLRPC_DRC_FAULT_RECEIVED_RUNT;
755772Sas200622 		break;
765772Sas200622 
775772Sas200622 	case NDR_ERR_GROW_FAILED:
785772Sas200622 		rc = MLRPC_DRC_FAULT_ENCODE_TOO_BIG;
795772Sas200622 		break;
805772Sas200622 
815772Sas200622 	default:
825772Sas200622 		if (m_op == NDR_M_OP_MARSHALL)
835772Sas200622 			rc = MLRPC_DRC_FAULT_ENCODE_FAILED;
845772Sas200622 		else
855772Sas200622 			rc = MLRPC_DRC_FAULT_DECODE_FAILED;
865772Sas200622 		break;
875772Sas200622 	}
885772Sas200622 
895772Sas200622 	return (rc);
905772Sas200622 }
915772Sas200622 
925772Sas200622 int
935772Sas200622 mlrpc_decode_call(struct mlrpc_xaction *mxa, void *params)
945772Sas200622 {
955772Sas200622 	int rc;
965772Sas200622 
975772Sas200622 	rc = mlrpc_encode_decode_common(mxa, NDR_MODE_CALL_RECV,
985772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
995772Sas200622 
1005772Sas200622 	return (rc + MLRPC_PTYPE_REQUEST);
1015772Sas200622 }
1025772Sas200622 
1035772Sas200622 int
1045772Sas200622 mlrpc_encode_return(struct mlrpc_xaction *mxa, void *params)
1055772Sas200622 {
1065772Sas200622 	int rc;
1075772Sas200622 
1085772Sas200622 	rc = mlrpc_encode_decode_common(mxa, NDR_MODE_RETURN_SEND,
1095772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
1105772Sas200622 
1115772Sas200622 	return (rc + MLRPC_PTYPE_RESPONSE);
1125772Sas200622 }
1135772Sas200622 
1145772Sas200622 int
1155772Sas200622 mlrpc_encode_call(struct mlrpc_xaction *mxa, void *params)
1165772Sas200622 {
1175772Sas200622 	int rc;
1185772Sas200622 
1195772Sas200622 	rc = mlrpc_encode_decode_common(mxa, NDR_MODE_CALL_SEND,
1205772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
1215772Sas200622 
1225772Sas200622 	return (rc + MLRPC_PTYPE_REQUEST);
1235772Sas200622 }
1245772Sas200622 
1255772Sas200622 int
1265772Sas200622 mlrpc_decode_return(struct mlrpc_xaction *mxa, void *params)
1275772Sas200622 {
1285772Sas200622 	int rc;
1295772Sas200622 
1305772Sas200622 	rc = mlrpc_encode_decode_common(mxa, NDR_MODE_RETURN_RECV,
1315772Sas200622 	    mxa->opnum, mxa->binding->service->interface_ti, params);
1325772Sas200622 
1335772Sas200622 	return (rc + MLRPC_PTYPE_RESPONSE);
1345772Sas200622 }
1355772Sas200622 
1365772Sas200622 int
1375772Sas200622 mlrpc_decode_pdu_hdr(struct mlrpc_xaction *mxa)
1385772Sas200622 {
139*7619SJose.Borrego@Sun.COM 	ndr_common_header_t *hdr = &mxa->recv_hdr.common_hdr;
1405772Sas200622 	struct mlndr_stream 	*mlnds = &mxa->recv_mlnds;
1415772Sas200622 	int			ptype;
1425772Sas200622 	int			rc;
1435772Sas200622 	int			charset;
1445772Sas200622 	int			byte_order;
1455772Sas200622 
1465772Sas200622 	if (mlnds->m_op != NDR_M_OP_UNMARSHALL)
1475772Sas200622 		return (MLRPC_DRC_FAULT_MODE_MISMATCH + 0xFF);
1485772Sas200622 
1495772Sas200622 	/*
1505772Sas200622 	 * All PDU headers are at least this big
1515772Sas200622 	 */
152*7619SJose.Borrego@Sun.COM 	rc = MLNDS_GROW_PDU(mlnds, sizeof (ndr_common_header_t), 0);
1535772Sas200622 	if (!rc)
1545772Sas200622 		return (MLRPC_DRC_FAULT_RECEIVED_RUNT + 0xFF);
1555772Sas200622 
1565772Sas200622 	/*
1575772Sas200622 	 * Peek at the first eight bytes to figure out what we're doing.
1585772Sas200622 	 */
1595772Sas200622 	rc = MLNDS_GET_PDU(mlnds, 0, 8, (char *)hdr, 0, 0);
1605772Sas200622 	if (!rc)
1615772Sas200622 		return (MLRPC_DRC_FAULT_DECODE_FAILED + 0xFF);
1625772Sas200622 
1635772Sas200622 	/*
1645772Sas200622 	 * Verify the protocol version.
1655772Sas200622 	 */
1665772Sas200622 	if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0))
1675772Sas200622 		return (MLRPC_DRC_FAULT_DECODE_FAILED + 0xFF);
1685772Sas200622 
1695772Sas200622 	/*
1705772Sas200622 	 * Check for ASCII as the character set.  This is an ASCII
1715772Sas200622 	 * versus EBCDIC option and has nothing to do with Unicode.
1725772Sas200622 	 */
1735772Sas200622 	charset = hdr->packed_drep.intg_char_rep & MLRPC_REPLAB_CHAR_MASK;
1745772Sas200622 	if (charset != MLRPC_REPLAB_CHAR_ASCII)
1755772Sas200622 		return (MLRPC_DRC_FAULT_DECODE_FAILED + 0xFF);
1765772Sas200622 
1775772Sas200622 	/*
1785772Sas200622 	 * Set the byte swap flag if the PDU byte-order
1795772Sas200622 	 * is different from the local byte-order.
1805772Sas200622 	 */
1815772Sas200622 	byte_order = hdr->packed_drep.intg_char_rep & MLRPC_REPLAB_INTG_MASK;
1825772Sas200622 	mlnds->swap = (byte_order != mlrpc_native_byte_order) ? 1 : 0;
1835772Sas200622 
1845772Sas200622 	ptype = hdr->ptype;
1855772Sas200622 	if (ptype == MLRPC_PTYPE_REQUEST &&
1865772Sas200622 	    (hdr->pfc_flags & MLRPC_PFC_OBJECT_UUID) != 0) {
1875772Sas200622 		ptype = MLRPC_PTYPE_REQUEST_WITH;	/* fake for sizing */
1885772Sas200622 	}
1895772Sas200622 
1905772Sas200622 	mxa->ptype = hdr->ptype;
1915772Sas200622 
1925772Sas200622 	rc = mlrpc_encode_decode_common(mxa,
1935772Sas200622 	    NDR_M_OP_AND_DIR_TO_MODE(mlnds->m_op, mlnds->dir),
194*7619SJose.Borrego@Sun.COM 	    ptype, &TYPEINFO(ndr_hdr), hdr);
1955772Sas200622 
1965772Sas200622 	return (rc + 0xFF);
1975772Sas200622 }
1985772Sas200622 
1995772Sas200622 /*
2005772Sas200622  * Decode an RPC fragment header.  Use mlrpc_decode_pdu_hdr() to process
2015772Sas200622  * the first fragment header then this function to process additional
2025772Sas200622  * fragment headers.
2035772Sas200622  */
2045772Sas200622 void
205*7619SJose.Borrego@Sun.COM mlrpc_decode_frag_hdr(struct mlndr_stream *mlnds, ndr_common_header_t *hdr)
2065772Sas200622 {
207*7619SJose.Borrego@Sun.COM 	ndr_common_header_t *tmp;
2085772Sas200622 	uint8_t *pdu;
2095772Sas200622 	int byte_order;
2105772Sas200622 
2115772Sas200622 	pdu = (uint8_t *)mlnds->pdu_base_offset + mlnds->pdu_scan_offset;
2125772Sas200622 	bcopy(pdu, hdr, MLRPC_RSP_HDR_SIZE);
2135772Sas200622 
2145772Sas200622 	/*
2155772Sas200622 	 * Swap non-byte fields if the PDU byte-order
2165772Sas200622 	 * is different from the local byte-order.
2175772Sas200622 	 */
2185772Sas200622 	byte_order = hdr->packed_drep.intg_char_rep & MLRPC_REPLAB_INTG_MASK;
2195772Sas200622 
2205772Sas200622 	if (byte_order != mlrpc_native_byte_order) {
2215772Sas200622 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
222*7619SJose.Borrego@Sun.COM 		tmp = (ndr_common_header_t *)pdu;
2235772Sas200622 
2245772Sas200622 		mlnds_bswap(&tmp->frag_length, &hdr->frag_length,
2255772Sas200622 		    sizeof (WORD));
2265772Sas200622 		mlnds_bswap(&tmp->auth_length, &hdr->auth_length,
2275772Sas200622 		    sizeof (WORD));
2285772Sas200622 		mlnds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD));
2295772Sas200622 	}
2305772Sas200622 }
2315772Sas200622 
2325772Sas200622 int
2335772Sas200622 mlrpc_encode_pdu_hdr(struct mlrpc_xaction *mxa)
2345772Sas200622 {
235*7619SJose.Borrego@Sun.COM 	ndr_common_header_t *hdr = &mxa->send_hdr.common_hdr;
2365772Sas200622 	struct mlndr_stream 	*mlnds = &mxa->send_mlnds;
2375772Sas200622 	int			ptype;
2385772Sas200622 	int			rc;
2395772Sas200622 
2405772Sas200622 	if (mlnds->m_op != NDR_M_OP_MARSHALL)
2415772Sas200622 		return (MLRPC_DRC_FAULT_MODE_MISMATCH + 0xFF);
2425772Sas200622 
2435772Sas200622 	ptype = hdr->ptype;
2445772Sas200622 	if (ptype == MLRPC_PTYPE_REQUEST &&
2455772Sas200622 	    (hdr->pfc_flags & MLRPC_PFC_OBJECT_UUID) != 0) {
2465772Sas200622 		ptype = MLRPC_PTYPE_REQUEST_WITH;	/* fake for sizing */
2475772Sas200622 	}
2485772Sas200622 
2495772Sas200622 	rc = mlrpc_encode_decode_common(mxa,
2505772Sas200622 	    NDR_M_OP_AND_DIR_TO_MODE(mlnds->m_op, mlnds->dir),
251*7619SJose.Borrego@Sun.COM 	    ptype, &TYPEINFO(ndr_hdr), hdr);
2525772Sas200622 
2535772Sas200622 	return (rc + 0xFF);
2545772Sas200622 }
2555772Sas200622 
2565772Sas200622 /*
2575772Sas200622  * This is a hand-coded derivative of the automatically generated
2585772Sas200622  * (un)marshalling routine for bind_ack headers. bind_ack headers
2595772Sas200622  * have an interior conformant array, which is inconsistent with
2605772Sas200622  * IDL/NDR rules.
2615772Sas200622  */
2625772Sas200622 extern struct ndr_typeinfo ndt__uchar;
2635772Sas200622 extern struct ndr_typeinfo ndt__ushort;
2645772Sas200622 extern struct ndr_typeinfo ndt__ulong;
2655772Sas200622 
266*7619SJose.Borrego@Sun.COM int mlndr__ndr_bind_ack_hdr(struct ndr_reference *encl_ref);
267*7619SJose.Borrego@Sun.COM struct ndr_typeinfo ndt__ndr_bind_ack_hdr = {
2685772Sas200622     1,		/* NDR version */
2695772Sas200622     3,		/* alignment */
2705772Sas200622     NDR_F_STRUCT,	/* flags */
271*7619SJose.Borrego@Sun.COM     mlndr__ndr_bind_ack_hdr,	/* ndr_func */
2725772Sas200622     68,		/* pdu_size_fixed_part */
2735772Sas200622     0,		/* pdu_size_variable_part */
2745772Sas200622     68,		/* c_size_fixed_part */
2755772Sas200622     0,		/* c_size_variable_part */
2765772Sas200622 };
2775772Sas200622 
2785772Sas200622 /*
2795772Sas200622  * [_no_reorder]
2805772Sas200622  */
2815772Sas200622 int
282*7619SJose.Borrego@Sun.COM mlndr__ndr_bind_ack_hdr(struct ndr_reference *encl_ref)
2835772Sas200622 {
284*7619SJose.Borrego@Sun.COM 	struct mlndr_stream 	*mlnds = encl_ref->stream;
285*7619SJose.Borrego@Sun.COM 	struct ndr_bind_ack_hdr	*val = /*LINTED E_BAD_PTR_CAST_ALIGN*/
286*7619SJose.Borrego@Sun.COM 	    (struct ndr_bind_ack_hdr *)encl_ref->datum;
2875772Sas200622 	struct ndr_reference	myref;
2885772Sas200622 	unsigned long		offset;
2895772Sas200622 
2905772Sas200622 	bzero(&myref, sizeof (myref));
2915772Sas200622 	myref.enclosing = encl_ref;
2925772Sas200622 	myref.stream = encl_ref->stream;
2935772Sas200622 	myref.packed_alignment = 0;
2945772Sas200622 
2955772Sas200622 	/* do all members in order */
296*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_common_header, common_hdr, 0UL);
2975772Sas200622 	NDR_MEMBER(_ushort, max_xmit_frag, 16UL);
2985772Sas200622 	NDR_MEMBER(_ushort, max_recv_frag, 18UL);
2995772Sas200622 	NDR_MEMBER(_ulong, assoc_group_id, 20UL);
3005772Sas200622 
3015772Sas200622 	/* port any is the conformant culprit */
3025772Sas200622 	offset = 24UL;
3035772Sas200622 
3045772Sas200622 	switch (mlnds->m_op) {
3055772Sas200622 	case NDR_M_OP_MARSHALL:
3065772Sas200622 		val->sec_addr.length =
3075772Sas200622 		    strlen((char *)val->sec_addr.port_spec) + 1;
3085772Sas200622 		break;
3095772Sas200622 
3105772Sas200622 	case NDR_M_OP_UNMARSHALL:
3115772Sas200622 		break;
3125772Sas200622 
3135772Sas200622 	default:
3145772Sas200622 		NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID);
3155772Sas200622 		return (0);
3165772Sas200622 	}
3175772Sas200622 
3185772Sas200622 	NDR_MEMBER(_ushort, sec_addr.length, offset);
3195772Sas200622 	NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec,
3205772Sas200622 	    offset+2UL, val->sec_addr.length);
3215772Sas200622 
3225772Sas200622 	offset += 2;
3235772Sas200622 	offset += val->sec_addr.length;
3245772Sas200622 	offset += (4 - offset) & 3;
3255772Sas200622 
3265772Sas200622 	NDR_MEMBER(_mlrpc_p_result_list, p_result_list, offset);
3275772Sas200622 	return (1);
3285772Sas200622 }
3295772Sas200622 
330*7619SJose.Borrego@Sun.COM /*
331*7619SJose.Borrego@Sun.COM  * Assume a single presentation context element in the result list.
332*7619SJose.Borrego@Sun.COM  */
3335772Sas200622 unsigned
334*7619SJose.Borrego@Sun.COM mlrpc_bind_ack_hdr_size(struct mlrpc_xaction *mxa)
3355772Sas200622 {
336*7619SJose.Borrego@Sun.COM 	ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr;
3375772Sas200622 	unsigned	offset;
3385772Sas200622 	unsigned	length;
3395772Sas200622 
3405772Sas200622 	/* port any is the conformant culprit */
3415772Sas200622 	offset = 24UL;
3425772Sas200622 
3435772Sas200622 	length = strlen((char *)bahdr->sec_addr.port_spec) + 1;
3445772Sas200622 
3455772Sas200622 	offset += 2;
3465772Sas200622 	offset += length;
3475772Sas200622 	offset += (4 - offset) & 3;
348*7619SJose.Borrego@Sun.COM 	offset += sizeof (mlrpc_p_result_list_t);
3495772Sas200622 	return (offset);
3505772Sas200622 }
351*7619SJose.Borrego@Sun.COM 
352*7619SJose.Borrego@Sun.COM /*
353*7619SJose.Borrego@Sun.COM  * This is a hand-coded derivative of the automatically generated
354*7619SJose.Borrego@Sun.COM  * (un)marshalling routine for alter_context_rsp headers.
355*7619SJose.Borrego@Sun.COM  * Alter context response headers have an interior conformant array,
356*7619SJose.Borrego@Sun.COM  * which is inconsistent with IDL/NDR rules.
357*7619SJose.Borrego@Sun.COM  */
358*7619SJose.Borrego@Sun.COM int mlndr__ndr_alter_context_rsp_hdr(struct ndr_reference *encl_ref);
359*7619SJose.Borrego@Sun.COM struct ndr_typeinfo ndt__ndr_alter_context_rsp_hdr = {
360*7619SJose.Borrego@Sun.COM     1,			/* NDR version */
361*7619SJose.Borrego@Sun.COM     3,			/* alignment */
362*7619SJose.Borrego@Sun.COM     NDR_F_STRUCT,	/* flags */
363*7619SJose.Borrego@Sun.COM     mlndr__ndr_alter_context_rsp_hdr,	/* ndr_func */
364*7619SJose.Borrego@Sun.COM     56,			/* pdu_size_fixed_part */
365*7619SJose.Borrego@Sun.COM     0,			/* pdu_size_variable_part */
366*7619SJose.Borrego@Sun.COM     56,			/* c_size_fixed_part */
367*7619SJose.Borrego@Sun.COM     0,			/* c_size_variable_part */
368*7619SJose.Borrego@Sun.COM };
369*7619SJose.Borrego@Sun.COM 
370*7619SJose.Borrego@Sun.COM /*
371*7619SJose.Borrego@Sun.COM  * [_no_reorder]
372*7619SJose.Borrego@Sun.COM  */
373*7619SJose.Borrego@Sun.COM int
374*7619SJose.Borrego@Sun.COM mlndr__ndr_alter_context_rsp_hdr(struct ndr_reference *encl_ref)
375*7619SJose.Borrego@Sun.COM {
376*7619SJose.Borrego@Sun.COM 	struct mlndr_stream 	*mlnds = encl_ref->stream;
377*7619SJose.Borrego@Sun.COM 	ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/
378*7619SJose.Borrego@Sun.COM 	    (ndr_alter_context_rsp_hdr_t *)encl_ref->datum;
379*7619SJose.Borrego@Sun.COM 	struct ndr_reference	myref;
380*7619SJose.Borrego@Sun.COM 	unsigned long		offset;
381*7619SJose.Borrego@Sun.COM 
382*7619SJose.Borrego@Sun.COM 	bzero(&myref, sizeof (myref));
383*7619SJose.Borrego@Sun.COM 	myref.enclosing = encl_ref;
384*7619SJose.Borrego@Sun.COM 	myref.stream = encl_ref->stream;
385*7619SJose.Borrego@Sun.COM 	myref.packed_alignment = 0;
386*7619SJose.Borrego@Sun.COM 
387*7619SJose.Borrego@Sun.COM 	/* do all members in order */
388*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ndr_common_header, common_hdr, 0UL);
389*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, max_xmit_frag, 16UL);
390*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, max_recv_frag, 18UL);
391*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ulong, assoc_group_id, 20UL);
392*7619SJose.Borrego@Sun.COM 
393*7619SJose.Borrego@Sun.COM 	offset = 24UL;	/* offset of sec_addr */
394*7619SJose.Borrego@Sun.COM 
395*7619SJose.Borrego@Sun.COM 	switch (mlnds->m_op) {
396*7619SJose.Borrego@Sun.COM 	case NDR_M_OP_MARSHALL:
397*7619SJose.Borrego@Sun.COM 		val->sec_addr.length = 0;
398*7619SJose.Borrego@Sun.COM 		break;
399*7619SJose.Borrego@Sun.COM 
400*7619SJose.Borrego@Sun.COM 	case NDR_M_OP_UNMARSHALL:
401*7619SJose.Borrego@Sun.COM 		break;
402*7619SJose.Borrego@Sun.COM 
403*7619SJose.Borrego@Sun.COM 	default:
404*7619SJose.Borrego@Sun.COM 		NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID);
405*7619SJose.Borrego@Sun.COM 		return (0);
406*7619SJose.Borrego@Sun.COM 	}
407*7619SJose.Borrego@Sun.COM 
408*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_ushort, sec_addr.length, offset);
409*7619SJose.Borrego@Sun.COM 	NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec,
410*7619SJose.Borrego@Sun.COM 	    offset+2UL, val->sec_addr.length);
411*7619SJose.Borrego@Sun.COM 
412*7619SJose.Borrego@Sun.COM 	offset += 2;	/* sizeof (sec_addr.length) */
413*7619SJose.Borrego@Sun.COM 	offset += (4 - offset) & 3;
414*7619SJose.Borrego@Sun.COM 
415*7619SJose.Borrego@Sun.COM 	NDR_MEMBER(_mlrpc_p_result_list, p_result_list, offset);
416*7619SJose.Borrego@Sun.COM 	return (1);
417*7619SJose.Borrego@Sun.COM }
418*7619SJose.Borrego@Sun.COM 
419*7619SJose.Borrego@Sun.COM /*
420*7619SJose.Borrego@Sun.COM  * Assume a single presentation context element in the result list.
421*7619SJose.Borrego@Sun.COM  */
422*7619SJose.Borrego@Sun.COM unsigned
423*7619SJose.Borrego@Sun.COM mlrpc_alter_context_rsp_hdr_size(void)
424*7619SJose.Borrego@Sun.COM {
425*7619SJose.Borrego@Sun.COM 	unsigned	offset;
426*7619SJose.Borrego@Sun.COM 
427*7619SJose.Borrego@Sun.COM 	offset = 24UL;	/* offset of sec_addr */
428*7619SJose.Borrego@Sun.COM 	offset += 2;	/* sizeof (sec_addr.length) */
429*7619SJose.Borrego@Sun.COM 	offset += (4 - offset) & 3;
430*7619SJose.Borrego@Sun.COM 	offset += sizeof (mlrpc_p_result_list_t);
431*7619SJose.Borrego@Sun.COM 	return (offset);
432*7619SJose.Borrego@Sun.COM }
433