Home | History | Annotate | Download | only in ndl
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _RPCPDU_NDL_
     27 #define _RPCPDU_NDL_
     28 
     29 #include "ndrtypes.ndl"
     30 
     31 /*
     32  * Normally, constructs are (un)marshalled atoms first, then
     33  * constructs, then pointers. This can be confusing sometimes
     34  * when debugging. We know that everything in here can be
     35  * safely (un)marshalled in member order, so we say so.
     36  */
     37 #ifdef NDRGEN
     38 #define _NO_REORDER_ [_no_reorder]
     39 #else
     40 #define _NO_REORDER_
     41 #endif
     42 
     43 #define NDR_TRANSFER_SYNTAX_UUID	"8a885d04-1ceb-11c9-9fe8-08002b104860"
     44 
     45 /*
     46  * UUID (Universal Unique IDentifier)
     47  */
     48 /* (X/Open CAE Spec Appendix A) */
     49 struct ndr_dce_uuid {
     50 	DWORD		time_low;
     51 	WORD		time_mid;
     52 	WORD		time_hi_and_version;
     53 	BYTE		clock_seq_hi_and_reserved;
     54 	BYTE		clock_seq_low;
     55 	BYTE		node[6];
     56 };
     57 
     58 struct ndr_uuid {
     59 	DWORD		data1;
     60 	WORD		data2;
     61 	WORD		data3;
     62 	BYTE		data4[8];
     63 };
     64 typedef struct ndr_uuid ndr_uuid_t;
     65 
     66 /*
     67  * Representation label -- needed for RPC header
     68  * (X/Open CAE Spec Chapter 14.1)
     69  *
     70  * Bits   Data Type   Description
     71  * ----   ---------   -----------
     72  * 0-3    charset     0=ASCII
     73  *                    1=EBCDIC
     74  * 4-7    byte-order  0=big-endian
     75  *                    1=little-endian
     76  * 8-15   float       0=IEEE
     77  *                    1=VAX
     78  *                    2=Cray
     79  *                    3=IBM
     80  * 16-31  reserved
     81  */
     82 #define NDR_REPLAB_CHAR_MASK		0x0F	/* low nibble of intg_char */
     83 #define NDR_REPLAB_CHAR_ASCII		0x00	/* ASCII */
     84 #define NDR_REPLAB_CHAR_EBCDIC		0x01	/* EBCDIC (never happen) */
     85 #define NDR_REPLAB_INTG_MASK		0xF0	/* hi nibble of intg_char */
     86 #define NDR_REPLAB_INTG_BIG_ENDIAN	0x00	/* big endian */
     87 #define NDR_REPLAB_INTG_LITTLE_ENDIAN	0x10	/* little endian (x86) */
     88 #define NDR_REPLAB_FLOAT_IEEE		0x00
     89 #define NDR_REPLAB_FLOAT_VAX		0x01
     90 #define NDR_REPLAB_FLOAT_CRAY		0x02
     91 #define NDR_REPLAB_FLOAT_IBM		0x03
     92 
     93 struct ndr_representation_label {
     94 	BYTE		intg_char_rep;		/* integer and charset */
     95 	BYTE		float_rep;
     96 	BYTE		_spare[2];
     97 };
     98 typedef struct ndr_representation_label	ndr_replab_t;
     99 
    100 
    101 
    102 /*
    103  * RPC PDU (Protocol Data Unit) types
    104  ****************************************************************
    105  * (X/Open CAE Spec 12.1)
    106  */
    107 
    108 #define NDR_PTYPE_REQUEST		0x00	/* CO/CL */
    109 #define NDR_PTYPE_PING			0x01	/*    CL */
    110 #define NDR_PTYPE_RESPONSE		0x02	/* CO/CL */
    111 #define NDR_PTYPE_FAULT			0x03	/* CL/CL */
    112 #define NDR_PTYPE_WORKING		0x04	/*    CL */
    113 #define NDR_PTYPE_NOCALL		0x05	/*    CL */
    114 #define NDR_PTYPE_REJECT		0x06	/*    CL */
    115 #define NDR_PTYPE_ACK			0x07	/*    CL */
    116 #define NDR_PTYPE_CL_CANCEL		0x08	/*    CL */
    117 #define NDR_PTYPE_FACK			0x09	/*    CL */
    118 #define NDR_PTYPE_CANCEL_ACK		0x0A	/*    CL */
    119 #define NDR_PTYPE_BIND			0x0B	/* CO    */
    120 #define NDR_PTYPE_BIND_ACK		0x0C	/* CO    */
    121 #define NDR_PTYPE_BIND_NAK		0x0D	/* CO    */
    122 #define NDR_PTYPE_ALTER_CONTEXT		0x0E	/* CO    */
    123 #define NDR_PTYPE_ALTER_CONTEXT_RESP	0x0F	/* CO    */
    124 						/* 0x10 missing from DCE/RPC */
    125 #define NDR_PTYPE_SHUTDOWN		0x11	/* CO    */
    126 #define NDR_PTYPE_CO_CANCEL		0x12	/* CO    */
    127 #define NDR_PTYPE_ORPHANED		0x13	/* CO    */
    128 
    129 /*
    130  * Flags in the RPC header for Connection-oriented PDU data types
    131  * (X/Open CAE Spec 12.6.3.1)
    132  */
    133 #define NDR_PFC_FIRST_FRAG		0x01	/* First fragment */
    134 #define NDR_PFC_LAST_FRAG		0x02	/* Last framgent */
    135 #define NDR_PFC_PENDING_CANCEL		0x04	/* Cancel was pending@sender*/
    136 #define NDR_PFC_RESERVED_1		0x08	/* */
    137 #define NDR_PFC_CONC_MPX		0x10	/* supports concurrent muxing
    138 						 * of single connection */
    139 #define NDR_PFC_DID_NOT_EXECUTE		0x20	/* for PTYPE_FAULT, guarantee
    140 						 * call did not execute */
    141 #define NDR_PFC_MAYBE			0x40	/* "maybe" semantics req'ed*/
    142 #define NDR_PFC_OBJECT_UUID		0x80	/* */
    143 
    144 
    145 /*
    146  * Header common to all Connection-oriented RPC PDUs
    147  ****************************************************************
    148  * (X/Open CAE Spec 12.6.3.1)
    149  */
    150 _NO_REORDER_
    151 struct ndr_common_header {
    152 	BYTE		rpc_vers;	/* 00:01 5 */
    153 	BYTE		rpc_vers_minor;	/* 01:01 0 */
    154 	BYTE		ptype;		/* 02:01 NDR_PTYPE_... */
    155 	BYTE		pfc_flags;	/* 03:01 NDR_PFC_... */
    156 	struct ndr_representation_label
    157 			packed_drep;	/* 04:04 NDR representation label */
    158 	WORD		frag_length;	/* 08:02 total length of frag */
    159 	WORD		auth_length;	/* 10:02 length of auth_value */
    160 	DWORD		call_id;	/* 12:04 call identifier */
    161 					/* 16: */
    162 };
    163 typedef struct ndr_common_header	ndr_common_header_t;
    164 EXTERNTYPEINFO(ndr_common_header)
    165 
    166 
    167 /*
    168  * A plethora of supporting types, only defined the ones we need
    169  * (X/Open CAE Spec 12.6.3.1)
    170  */
    171 typedef WORD	ndr_p_context_id_t;
    172 
    173 _NO_REORDER_
    174 struct ndr_p_syntax_id {
    175 	ndr_uuid_t	if_uuid;
    176 	DWORD		if_version;
    177 };
    178 typedef struct ndr_p_syntax_id	ndr_p_syntax_id_t;
    179 
    180 _NO_REORDER_
    181 struct ndr_p_cont_elem {
    182 	ndr_p_context_id_t	p_cont_id;
    183 	BYTE			n_transfer_syn;
    184 	BYTE			_reserved;
    185 	ndr_p_syntax_id_t	abstract_syntax;
    186     /*SIZE_IS(n_transfer_syn)*/
    187 	ndr_p_syntax_id_t	transfer_syntaxes[1];
    188 };
    189 typedef struct ndr_p_cont_elem	ndr_p_cont_elem_t;
    190 EXTERNTYPEINFO(ndr_p_cont_elem)
    191 
    192 _NO_REORDER_
    193 struct ndr_p_cont_list {
    194 	BYTE		n_context_elem;
    195 	BYTE		_reserved;
    196 	WORD		_reserved2;
    197     /*SIZE_IS(n_context_elem)*/
    198 	ndr_p_cont_elem_t p_cont_elem[1];
    199 };
    200 typedef struct ndr_p_cont_list	ndr_p_cont_list_t;
    201 EXTERNTYPEINFO(ndr_p_cont_list)
    202 
    203 typedef WORD	ndr_p_cont_def_result_t;
    204 #define NDR_PCDR_ACCEPTANCE					0
    205 #define NDR_PCDR_USER_REJECTION					1
    206 #define NDR_PCDR_PROVIDER_REJECTION				2
    207 
    208 typedef WORD	ndr_p_provider_reason_t;
    209 #define NDR_PPR_REASON_NOT_SPECIFIED				0
    210 #define NDR_PPR_ABSTRACT_SYNTAX_NOT_SUPPORTED			1
    211 #define NDR_PPR_PROPOSED_TRANSFER_SYNTAXES_NOT_SUPPORTED	2
    212 #define NDR_PPR_LOCAL_LIMIT_EXCEEDED				3
    213 
    214 
    215 _NO_REORDER_
    216 struct ndr_p_result {
    217 	ndr_p_cont_def_result_t	result;		/* NDR_PCDR_... */
    218 	ndr_p_provider_reason_t	reason;		/* NDR_PPR_... */
    219 	ndr_p_syntax_id_t		transfer_syntax; /* 0-fill if
    220 							  * result!=ACCEPT*/
    221 };
    222 typedef struct ndr_p_result		ndr_p_result_t;
    223 EXTERNTYPEINFO(ndr_p_result)
    224 
    225 _NO_REORDER_
    226 struct ndr_p_result_list {
    227 	BYTE		n_results;
    228 	BYTE		reserved;
    229 	WORD		reserved2;
    230     /*SIZE_IS(n_results)*/
    231 	ndr_p_result_t p_results[1];
    232 };
    233 typedef struct ndr_p_result_list	ndr_p_result_list_t;
    234 EXTERNTYPEINFO(ndr_p_result_list)
    235 
    236 #define NDR_PORT_ANY_MAX_PORT_SPEC	30
    237 _NO_REORDER_
    238 struct ndr_port_any {
    239 	WORD		length;		/* always 18 */
    240     /*SIZE_IS(length)*/
    241 	BYTE		port_spec[NDR_PORT_ANY_MAX_PORT_SPEC];
    242 					/* \PIPE\ntsvcs */
    243 	/* We cheat by using 18, and pad on the right with zeroes */
    244 };
    245 typedef struct ndr_port_any		ndr_port_any_t;
    246 EXTERNTYPEINFO(ndr_port_any)
    247 
    248 
    249 /*
    250  * Alter Context PDU (0x0E)
    251  * (X/Open CAE Spec 12.6.4.1)
    252  */
    253 _NO_REORDER_
    254 struct ndr_alter_context_hdr {
    255 	ndr_common_header_t common_hdr; /* 00:16 (see above) */
    256 
    257 	WORD max_xmit_frag;		/* 16:02 ignored */
    258 	WORD max_recv_frag;		/* 18:02 ignored */
    259 	DWORD assoc_group_id;		/* 20:04 ignored */
    260 
    261 	/*
    262 	 * Presentation context list (see bind hdr comments).
    263 	 */
    264 	ndr_p_cont_list_t p_context_elem;	/* 24: */
    265 
    266 	/* optional authentication verifier if auth_length != 0 */
    267 	/* auth_verifier_co_t auth_verifier; */
    268 };
    269 typedef struct ndr_alter_context_hdr ndr_alter_context_hdr_t;
    270 
    271 
    272 /*
    273  * Alter Context Response PDU (0x0F)
    274  * (X/Open CAE Spec 12.6.4.2)
    275  *
    276  * We can't automatically generate an alter context response header because
    277  * the sec_addr is an interior conformant (variable length) array, which is
    278  * inconsistent with IDL/NDR rules.  We mark this import-extern and provide
    279  * a hand-coded marshalling function.
    280  */
    281 IMPORT_EXTERN
    282 _NO_REORDER_
    283 struct ndr_alter_context_rsp_hdr {
    284 	ndr_common_header_t common_hdr; /* 00:16 (see above) */
    285 
    286 	WORD max_xmit_frag;		/* 16:02 ignored */
    287 	WORD max_recv_frag;		/* 18:02 ignored */
    288 	DWORD assoc_group_id;		/* 20:04 ignored */
    289 	ndr_port_any_t sec_addr;	/* 24:20 ignored */
    290 
    291 	/*
    292 	 * Presentation context list (see bind hdr comments).
    293 	 */
    294 	ndr_p_result_list_t p_result_list; /* 44:nn */
    295 
    296 	/* optional authentication verifier if auth_length != 0 */
    297 	/* auth_verifier_co_t auth_verifier; */
    298 };
    299 typedef struct ndr_alter_context_rsp_hdr ndr_alter_context_rsp_hdr_t;
    300 
    301 
    302 /*
    303  * Bind PDU (0x0B)
    304  * (X/Open CAE Spec 12.6.4.3)
    305  */
    306 _NO_REORDER_
    307 struct ndr_bind_hdr {
    308 	ndr_common_header_t	common_hdr; /* 00:16 (see above) */
    309 
    310 	WORD		max_xmit_frag;	/* 16:02 max xmit frag size, bytes */
    311 	WORD		max_recv_frag;	/* 18:02 max recv frag size, bytes */
    312 	DWORD		assoc_group_id;	/* 20:04 association group */
    313 					/* 24: */
    314 
    315 	/* presentation, a variable**2 list, of presentation contexts */
    316 	ndr_p_cont_list_t p_context_elem;
    317 
    318 	/*
    319 	 * This could be followed by more transfer_syntaxes[] for the
    320 	 * p_cont_elem[0], and subsequently followed by more p_cont_elem[],
    321 	 * each with one or more transfer_syntaxes[].  A single
    322 	 * p_cont_elem[] with a single transfer_syntaxes[] is so common,
    323 	 * though, we embed it in the bind_hdr but the bind processor must
    324 	 * walk through this tail if there is one.
    325 	 */
    326 
    327 	/* optional authentication verifier iff auth_length != 0 */
    328 	/* auth_verifier_co_t	auth_verifier; */
    329 };
    330 typedef struct ndr_bind_hdr	ndr_bind_hdr_t;
    331 
    332 
    333 /*
    334  * Bind_Ack PDU (0x0C)
    335  * (X/Open CAE Spec 12.6.4.4)
    336  *
    337  * We can't automatically generate a bind ack header because the sec_addr
    338  * is an interior conformant (variable length) array, which is inconsistent
    339  * with IDL/NDR rules.  We mark this import-extern and provide a hand-coded
    340  * marshalling function.
    341  */
    342 IMPORT_EXTERN
    343 _NO_REORDER_
    344 struct ndr_bind_ack_hdr {
    345 	ndr_common_header_t	common_hdr; /* 00:16 (see above) */
    346 
    347 	WORD		max_xmit_frag;	/* 16:02 max xmit frag size, bytes */
    348 	WORD		max_recv_frag;	/* 18:02 max recv frag size, bytes */
    349 	DWORD		assoc_group_id;	/* 20:04 association group */
    350 	ndr_port_any_t	sec_addr;	/* 24:20 */
    351 
    352 	ndr_p_result_list_t p_result_list; /* 44:nn */
    353 	/* This could be followed by more. See bind_hdr above */
    354 
    355 	/* optional authentication verifier iff auth_length != 0 */
    356 	/* auth_verifier_co_t	auth_verifier; */
    357 };
    358 typedef struct ndr_bind_ack_hdr	ndr_bind_ack_hdr_t;
    359 
    360 
    361 /*
    362  * Request PDU (0x00)
    363  ****************************************************************
    364  * Two flavors, selected based on PFC_OBJECT_UUID in hdr.pfc_flags
    365  *	one without the "object" (flag clear)
    366  *	one with the "object" (flag set)
    367  * (X/Open CAE Spec 12.6.4.9)
    368  */
    369 
    370 _NO_REORDER_
    371 struct ndr_request_hdr {
    372 	ndr_common_header_t	common_hdr; /* 00:16 (see above) */
    373 
    374 	/* needed for request, response, or fault */
    375 	DWORD		alloc_hint;	/* 16:04 allocation hint */
    376 	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */
    377 	WORD		opnum;		/* 22:02 op number w/i interface */
    378 
    379 	/* optional field if PFC_OBJECT_UUID, not present */
    380 	/* ndr_uuid_t	object; */
    381 
    382 	/* stub-data, 8-octet aligned */ /* 24:nn */
    383 	/* nn = frag_len - sizeof(common_header) - auth_len */
    384 
    385 	/* optional authentication verifier iff auth_length != 0 */
    386 	/* auth_verifier_co_t	auth_verifier; */
    387 };
    388 typedef struct ndr_request_hdr	ndr_request_hdr_t;
    389 
    390 _NO_REORDER_
    391 struct ndr_request_hdr_with_object {
    392 	ndr_common_header_t	common_hdr; /* 00:16 (see above) */
    393 
    394 	/* needed for request, response, or fault */
    395 	DWORD		alloc_hint;	/* 16:04 allocation hint */
    396 	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */
    397 	WORD		opnum;		/* 22:02 op number w/i interface */
    398 
    399 	/* optional field if PFC_OBJECT_UUID, is present */
    400 	ndr_uuid_t	object;		/* 24:16 object UUID, unknown purpose*/
    401 
    402 	/* stub-data, 8-octet aligned */ /* 28:nn */
    403 	/* nn = frag_len - sizeof(common_header) - auth_len */
    404 	/* nn -= sizeof(ndr_uuid_t); */
    405 
    406 	/* optional authentication verifier iff auth_length != 0 */
    407 	/* auth_verifier_co_t	auth_verifier; */
    408 };
    409 
    410 
    411 /*
    412  * Convenient for response header sizing and multi-fragment responses.
    413  * We know the header is going to be 24 bytes.
    414  */
    415 #define NDR_RSP_HDR_SIZE			24
    416 
    417 
    418 /*
    419  * Response PDU (0x02)
    420  * (X/Open CAE Spec 12.6.4.10)
    421  */
    422 
    423 _NO_REORDER_
    424 struct ndr_response_hdr {
    425 	ndr_common_header_t	common_hdr; /* 00:16 (see above) */
    426 
    427 	/* needed for request, response, or fault */
    428 	DWORD		alloc_hint;	/* 16:04 allocation hint */
    429 	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */
    430 
    431 	/* needed for response or fault */
    432 	BYTE		cancel_count;	/* 22:01 cancel count */
    433 	BYTE		reserved;	/* 23:01 mbz */
    434 
    435 	/* stub-data, 8-octet aligned */ /* 24:nn */
    436 	/* nn = frag_len - sizeof(common_header) - auth_len */
    437 
    438 	/* optional authentication verifier iff auth_length != 0 */
    439 	/* auth_verifier_co_t	auth_verifier; */
    440 };
    441 typedef struct ndr_response_hdr	ndr_response_hdr_t;
    442 
    443 
    444 /*
    445  * Fault PDU (0x03)
    446  * (X/Open CAE Spec 12.6.4.7)
    447  */
    448 
    449 _NO_REORDER_
    450 struct ndr_fault_hdr {
    451 	ndr_common_header_t	common_hdr; /* 00:16 (see above) */
    452 
    453 	DWORD		alloc_hint;	/* 16:04 allocation hint */
    454 	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */
    455 
    456 	/* needed for response or fault */
    457 	BYTE		cancel_count;	/* 22:01 cancel count */
    458 	BYTE		reserved;	/* 23:01 mbz */
    459 
    460 	/* fault code */
    461 	DWORD		status;		/* 24:04 run-time fault code or 0 */
    462 
    463 	/* pad to 8-byte alignment */
    464 	BYTE		reserved2[4];	/* 28:04 must-be-zero */
    465 
    466 	/* stub-data here if status==0. We do not use this mode. */
    467 
    468 	/* optional authentication verifier iff auth_length != 0 */
    469 	/* auth_verifier_co_t	auth_verifier; */
    470 };
    471 typedef struct ndr_fault_hdr	ndr_fault_hdr_t;
    472 
    473 
    474 /* Fault status code (X/Open CAE Spec Appendix E) */
    475 #define NDR_FAULT_NCA_RPC_VERSION_MISMATCH	0x1c000008	/* CO/CL */
    476 #define NDR_FAULT_NCA_UNSPEC_REJECT		0x1c000009	/* CO/CL */
    477 #define NDR_FAULT_NCA_S_BAD_ACTID		0x1c00000A	/*    CL */
    478 #define NDR_FAULT_NCA_WHO_ARE_YOU_FAILED	0x1c00000B	/*    CL */
    479 #define NDR_FAULT_NCA_MANAGER_NOT_ENTERED	0x1c00000C	/* CO/CL */
    480 #define NDR_FAULT_NCA_OP_RNG_ERROR		0x1c010002	/* CO/CL */
    481 #define NDR_FAULT_NCA_UNK_IF			0x1c010003	/* CO/CL */
    482 #define NDR_FAULT_NCA_WRONG_BOOT_TIME		0x1c010006	/*    CL */
    483 #define NDR_FAULT_NCA_S_YOU_CRASHED		0x1c010009	/*    CL */
    484 #define NDR_FAULT_NCA_PROTO_ERROR		0x1c01000B	/* CO/CL */
    485 #define NDR_FAULT_NCA_OUT_ARGS_TOO_BIG		0x1c010013	/* CO/CL */
    486 #define NDR_FAULT_NCA_SERVER_TOO_BUSY		0x1c010014	/* CO/CL */
    487 #define NDR_FAULT_NCA_UNSUPPORTED_TYPE		0x1c010017	/* CO/CL */
    488 #define NDR_FAULT_NCA_INVALID_PRES_CONTEXT_ID	0x1c00001c	/* CO    */
    489 #define NDR_FAULT_NCA_UNSUPPORTED_AUTHN_LEVEL	0x1c00001d	/* CO/CL */
    490 #define NDR_FAULT_NCA_INVALID_CHECKSUM		0x1c00001f	/* CO/CL */
    491 #define NDR_FAULT_NCA_INVALID_CRC		0x1c000020	/* CO/CL */
    492 
    493 
    494 /*
    495  * The Header Union/Switch
    496  ****************************************************************
    497  */
    498 
    499 #define NDR_PTYPE_COMMON		999
    500 #define NDR_PTYPE_REQUEST_WITH		998
    501 
    502 
    503 INTERFACE(0)
    504 union ndr_hdr {
    505     CASE(NDR_PTYPE_COMMON)	/* exceeds BYTE range, obtains common hdr */
    506 	struct ndr_common_header		common_hdr;
    507 
    508     CASE(NDR_PTYPE_BIND)
    509 	struct ndr_bind_hdr			bind_hdr;
    510 
    511     CASE(NDR_PTYPE_BIND_ACK)
    512 	struct ndr_bind_ack_hdr			bind_ack_hdr;
    513 
    514     CASE(NDR_PTYPE_REQUEST)
    515 	struct ndr_request_hdr			request_hdr;
    516 
    517     CASE(NDR_PTYPE_REQUEST_WITH)	/* exceeds BYTE range, ... */
    518 	struct ndr_request_hdr_with_object	request_hdr_with;
    519 
    520     CASE(NDR_PTYPE_RESPONSE)
    521 	struct ndr_response_hdr			response_hdr;
    522 
    523     CASE(NDR_PTYPE_ALTER_CONTEXT)
    524 	struct ndr_alter_context_hdr		alter_context_hdr;
    525 
    526     CASE(NDR_PTYPE_ALTER_CONTEXT_RESP)
    527 	struct ndr_alter_context_rsp_hdr	alter_context_rsp_hdr;
    528 
    529     CASE(NDR_PTYPE_FAULT)
    530 	struct ndr_fault_hdr			fault_hdr;
    531 };
    532 typedef union ndr_hdr	ndr_hdr_t;
    533 EXTERNTYPEINFO(ndr_hdr)
    534 
    535 #endif /* _RPCPDU_NDL_ */
    536 
    537