summaryrefslogtreecommitdiff
path: root/usr/src/lib/libmlrpc/common/rpcpdu.ndl
blob: f0bd9578e4204adbf5908554c1cd05da5f7bf618 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 * Copyright 2021 Tintri by DDN, Inc. All rights reserved.
 */

#ifndef _RPCPDU_NDL_
#define _RPCPDU_NDL_

#include "ndrtypes.ndl"

/*
 * Normally, constructs are (un)marshalled atoms first, then
 * constructs, then pointers. This can be confusing sometimes
 * when debugging. We know that everything in here can be
 * safely (un)marshalled in member order, so we say so.
 */
#ifdef NDRGEN
#define _NO_REORDER_ [_no_reorder]
#else
#define _NO_REORDER_
#endif

#define NDR_TRANSFER_SYNTAX_UUID	"8a885d04-1ceb-11c9-9fe8-08002b104860"

/*
 * UUID (Universal Unique IDentifier)
 */
/* (X/Open CAE Spec Appendix A) */
struct ndr_dce_uuid {
	DWORD		time_low;
	WORD		time_mid;
	WORD		time_hi_and_version;
	BYTE		clock_seq_hi_and_reserved;
	BYTE		clock_seq_low;
	BYTE		node[6];
};

struct ndr_uuid {
	DWORD		data1;
	WORD		data2;
	WORD		data3;
	BYTE		data4[8];
};
typedef struct ndr_uuid ndr_uuid_t;

/*
 * Representation label -- needed for RPC header
 * (X/Open CAE Spec Chapter 14.1)
 *
 * Bits   Data Type   Description
 * ----   ---------   -----------
 * 0-3    charset     0=ASCII
 *                    1=EBCDIC
 * 4-7    byte-order  0=big-endian
 *                    1=little-endian
 * 8-15   float       0=IEEE
 *                    1=VAX
 *                    2=Cray
 *                    3=IBM
 * 16-31  reserved
 */
#define NDR_REPLAB_CHAR_MASK		0x0F	/* low nibble of intg_char */
#define NDR_REPLAB_CHAR_ASCII		0x00	/* ASCII */
#define NDR_REPLAB_CHAR_EBCDIC		0x01	/* EBCDIC (never happen) */
#define NDR_REPLAB_INTG_MASK		0xF0	/* hi nibble of intg_char */
#define NDR_REPLAB_INTG_BIG_ENDIAN	0x00	/* big endian */
#define NDR_REPLAB_INTG_LITTLE_ENDIAN	0x10	/* little endian (x86) */
#define NDR_REPLAB_FLOAT_IEEE		0x00
#define NDR_REPLAB_FLOAT_VAX		0x01
#define NDR_REPLAB_FLOAT_CRAY		0x02
#define NDR_REPLAB_FLOAT_IBM		0x03

struct ndr_representation_label {
	BYTE		intg_char_rep;		/* integer and charset */
	BYTE		float_rep;
	BYTE		_spare[2];
};
typedef struct ndr_representation_label	ndr_replab_t;



/*
 * RPC PDU (Protocol Data Unit) types
 ****************************************************************
 * (X/Open CAE Spec 12.1)
 */

#define NDR_PTYPE_REQUEST		0x00	/* CO/CL */
#define NDR_PTYPE_PING			0x01	/*    CL */
#define NDR_PTYPE_RESPONSE		0x02	/* CO/CL */
#define NDR_PTYPE_FAULT			0x03	/* CL/CL */
#define NDR_PTYPE_WORKING		0x04	/*    CL */
#define NDR_PTYPE_NOCALL		0x05	/*    CL */
#define NDR_PTYPE_REJECT		0x06	/*    CL */
#define NDR_PTYPE_ACK			0x07	/*    CL */
#define NDR_PTYPE_CL_CANCEL		0x08	/*    CL */
#define NDR_PTYPE_FACK			0x09	/*    CL */
#define NDR_PTYPE_CANCEL_ACK		0x0A	/*    CL */
#define NDR_PTYPE_BIND			0x0B	/* CO    */
#define NDR_PTYPE_BIND_ACK		0x0C	/* CO    */
#define NDR_PTYPE_BIND_NAK		0x0D	/* CO    */
#define NDR_PTYPE_ALTER_CONTEXT		0x0E	/* CO    */
#define NDR_PTYPE_ALTER_CONTEXT_RESP	0x0F	/* CO    */
						/* 0x10 missing from DCE/RPC */
#define NDR_PTYPE_SHUTDOWN		0x11	/* CO    */
#define NDR_PTYPE_CO_CANCEL		0x12	/* CO    */
#define NDR_PTYPE_ORPHANED		0x13	/* CO    */

/*
 * Flags in the RPC header for Connection-oriented PDU data types
 * (X/Open CAE Spec 12.6.3.1)
 *
 * MS-RPCE 2.2.2.3 PFC_SUPPORT_HEADER_SIGN
 * For PDU types bind, bind_ack, alter_context and alter_context_resp,
 * 0x04 means PFC_SUPPORT_HEADER_SIGN.
 * For other PDU types 0x04 means PFC_PENDING_CANCEL.
 */
#define NDR_PFC_FIRST_FRAG		0x01	/* First fragment */
#define NDR_PFC_LAST_FRAG		0x02	/* Last framgent */
#define NDR_PFC_PENDING_CANCEL		0x04	/* Cancel was pending@sender*/
#define NDR_PFC_SUPPORT_HEADER_SIGN	NDR_PFC_PENDING_CANCEL
#define NDR_PFC_RESERVED_1		0x08	/* */
#define NDR_PFC_CONC_MPX		0x10	/* supports concurrent muxing
						 * of single connection */
#define NDR_PFC_DID_NOT_EXECUTE		0x20	/* for PTYPE_FAULT, guarantee
						 * call did not execute */
#define NDR_PFC_MAYBE			0x40	/* "maybe" semantics req'ed*/
#define NDR_PFC_OBJECT_UUID		0x80	/* */

/*
 * Security Providers
 * MS-RPCE 2.2.1.1.6
 */
#define	NDR_C_AUTHN_NONE			0x00	/* No authentication */
#define	NDR_C_AUTHN_GSS_NEGOTIATE		0x09	/* SPNEGO */
#define	NDR_C_AUTHN_WINNT			0x0A	/* NTLM */
#define	NDR_C_AUTHN_GSS_KERBEROS		0x10	/* Kerberos */
#define	NDR_C_AUTHN_GSS_NETLOGON		0x44	/* Netlogon */
#define	NDR_C_AUTHN_GSS_DEFAULT			0xFF	/* Default is NTLM */

/*
 * Encoding protection levels
 * X/Open CAE Spec 13.1.2.1
 * MS-RPCE 2.2.1.1.7
 */
#define	NDR_C_AUTHN_LEVEL_DEFAULT		0x00	/* Same as Connect */
#define	NDR_C_AUTHN_LEVEL_NONE			0x01
#define	NDR_C_AUTHN_LEVEL_CONNECT		0x02
#define	NDR_C_AUTHN_LEVEL_CALL			0x03
#define	NDR_C_AUTHN_LEVEL_PKT			0x04
#define	NDR_C_AUTHN_LEVEL_PKT_INTEGRITY		0x05
#define	NDR_C_AUTHN_LEVEL_PKT_PRIVACY		0x06

/*
 * Header common to all Connection-oriented RPC PDUs
 * (X/Open CAE Spec 12.6.3.1)
 */
_NO_REORDER_
struct ndr_p_syntax_id {
	ndr_uuid_t	if_uuid;
	DWORD		if_version;
};
typedef struct ndr_p_syntax_id	ndr_p_syntax_id_t;

_NO_REORDER_
struct ndr_common_header {
	BYTE		rpc_vers;	/* 00:01 5 */
	BYTE		rpc_vers_minor;	/* 01:01 0 */
	BYTE		ptype;		/* 02:01 NDR_PTYPE_... */
	BYTE		pfc_flags;	/* 03:01 NDR_PFC_... */
	struct ndr_representation_label
			packed_drep;	/* 04:04 NDR representation label */
	WORD		frag_length;	/* 08:02 total length of frag */
	WORD		auth_length;	/* 10:02 length of auth_value */
	DWORD		call_id;	/* 12:04 call identifier */
					/* 16: */
};
typedef struct ndr_common_header	ndr_common_header_t;
EXTERNTYPEINFO(ndr_common_header)

/*
 * MS-RPCE 2.2.6 Type Serialization Version 1 extensions to IDL/+ pickle
 * One header per serialization stream: the header must be little endian.
 * The filler must be set to 0xcccccccc during marshaling and ignored
 * during unmarshaling.
 */
_NO_REORDER_
struct ndr_serialtype1_hdr {
	BYTE		version;	/* 00:01 1 */
	BYTE		endianness;	/* 01:01 0=big, 1=little */
	WORD		hdrlen;		/* 02:02 8 */
	DWORD		filler;		/* 04:04 0xcccccccc */
					/* 8: */
};
typedef struct ndr_serialtype1_hdr  ndr_serialtype1_hdr_t;
EXTERNTYPEINFO(ndr_serialtype1_hdr)

/*
 * Type Serialization Version 1 Private Header.
 * A private header must precede a top-level NDR constructed type.
 */
_NO_REORDER_
struct ndr_serialtype1_priv_hdr {
	DWORD		buflen;		/* 00:04 */
	DWORD		filler;		/* 04:04 must be zero */
					/* 8: */
};
typedef struct ndr_serialtype1_priv_hdr	ndr_serialtype1_priv_hdr_t;
EXTERNTYPEINFO(ndr_serialtype1_priv_hdr)

/*
 * MS-RPCE 2.2.7 Type Serialization Version 2 extensions Version 1 (2.2.6).
 * The header must be little endian.
 * The endianinfo and reserved fields must be set to 0xcccccccc during
 * marshaling and ignored during unmarshaling.
 */
_NO_REORDER_
struct ndr_serialtype2_hdr {
	BYTE		version;	/* 00:01 1 */
	BYTE		endianness;	/* 01:01 0=big, 1=little */
	WORD		hdrlen;		/* 02:02 8 */
	DWORD		endianinfo;	/* 04:04 0xcccccccc */
	DWORD		reserved[4];	/* 08:16 0xcccccccc */
	ndr_p_syntax_id_t	transfer_syntax;	/* 24:20 */
	ndr_p_syntax_id_t	interface_id;		/* 44:20 */
					/* 64: */
};
typedef struct ndr_serialtype2_hdr  ndr_serialtype2_hdr_t;
EXTERNTYPEINFO(ndr_serialtype2_hdr)

/*
 * Type Serialization Version 2 Private Header.
 * A private header must precede a top-level NDR constructed type.
 */
_NO_REORDER_
struct ndr_serialtype2_priv_hdr {
	DWORD		buflen;		/* 00:04 */
	DWORD		filler[3];	/* 04:12 must be zero */
					/* 16: */
};
typedef struct ndr_serialtype2_priv_hdr	ndr_serialtype2_priv_hdr_t;
EXTERNTYPEINFO(ndr_serialtype2_priv_hdr)

/*
 * This header comes before the NDR-encoded KERB_VALIDATION_INFO structure,
 * which can be found in one of the info buffers of the PAC.
 */
_NO_REORDER_
struct ndr_pac_hdr {
	ndr_serialtype1_hdr_t		common_hdr;
	ndr_serialtype1_priv_hdr_t	priv_hdr;
	DWORD				ref_pointer;
};
typedef struct ndr_pac_hdr	ndr_pac_hdr_t;
EXTERNTYPEINFO(ndr_pac_hdr)

/*
 * Supporting types (X/Open CAE Spec 12.6.3.1)
 */
typedef WORD	ndr_p_context_id_t;

_NO_REORDER_
struct ndr_p_cont_elem {
	ndr_p_context_id_t	p_cont_id;
	BYTE			n_transfer_syn;
	BYTE			_reserved;
	ndr_p_syntax_id_t	abstract_syntax;
    /*SIZE_IS(n_transfer_syn)*/
	ndr_p_syntax_id_t	transfer_syntaxes[1];
};
typedef struct ndr_p_cont_elem	ndr_p_cont_elem_t;
EXTERNTYPEINFO(ndr_p_cont_elem)

_NO_REORDER_
struct ndr_p_cont_list {
	BYTE		n_context_elem;
	BYTE		_reserved;
	WORD		_reserved2;
    /*SIZE_IS(n_context_elem)*/
	ndr_p_cont_elem_t p_cont_elem[1];
};
typedef struct ndr_p_cont_list	ndr_p_cont_list_t;
EXTERNTYPEINFO(ndr_p_cont_list)

typedef WORD	ndr_p_cont_def_result_t;
#define NDR_PCDR_ACCEPTANCE					0
#define NDR_PCDR_USER_REJECTION					1
#define NDR_PCDR_PROVIDER_REJECTION				2

/*
 * Reasons for provider rejection.
 * X/Open CAE Spec 12.6.3.1
 */
typedef WORD	ndr_p_provider_reason_t;
#define	NDR_PPR_REASON_NOT_SPECIFIED				0
#define	NDR_PPR_ABSTRACT_SYNTAX_NOT_SUPPORTED			1
#define	NDR_PPR_PROPOSED_TRANSFER_SYNTAXES_NOT_SUPPORTED	2
#define	NDR_PPR_LOCAL_LIMIT_EXCEEDED				3

_NO_REORDER_
struct ndr_p_result {
	ndr_p_cont_def_result_t	result;		/* NDR_PCDR_... */
	ndr_p_provider_reason_t	reason;		/* NDR_PPR_... */
	ndr_p_syntax_id_t	transfer_syntax; /* 0-fill if result!=ACCEPT */
};
typedef struct ndr_p_result		ndr_p_result_t;
EXTERNTYPEINFO(ndr_p_result)

_NO_REORDER_
struct ndr_p_result_list {
	BYTE		n_results;
	BYTE		reserved;
	WORD		reserved2;
    /*SIZE_IS(n_results)*/
	ndr_p_result_t p_results[1];
};
typedef struct ndr_p_result_list	ndr_p_result_list_t;
EXTERNTYPEINFO(ndr_p_result_list)

#define NDR_PORT_ANY_MAX_PORT_SPEC	30
_NO_REORDER_
struct ndr_port_any {
	WORD		length;		/* always 18 */
    /*SIZE_IS(length)*/
	BYTE		port_spec[NDR_PORT_ANY_MAX_PORT_SPEC];
					/* \PIPE\ntsvcs */
	/* We cheat by using 18, and pad on the right with zeroes */
};
typedef struct ndr_port_any		ndr_port_any_t;
EXTERNTYPEINFO(ndr_port_any)

/*
 * Reasons for rejecting an association in the bind_nak PDU.
 * X/Open CAE Spec 12.6.3.1
 * MS-RPCE 2.2.2.5
 */
#define	NDR_REASON_NOT_SPECIFIED				0
#define NDR_TEMPORARY_CONGESTION				1
#define NDR_LOCAL_LIMIT_EXCEEDED				2
#define NDR_CALLED_PADDR_UNKNOWN				3
#define NDR_PROTOCOL_VERSION_NOT_SUPPORTED			4
#define NDR_DEFAULT_CONTEXT_NOT_SUPPORTED			5
#define NDR_USER_DATA_NOT_READABLE				6
#define NDR_NO_PSAP_AVAILABLE					7
#define NDR_AUTH_TYPE_NOT_RECOGNIZED				8
#define NDR_INVALID_CHECKSUM					9

/*
 * NDRGEN can't handle variable-length arrays, so we provide our own
 * marshal/unmarshal routine, so that we can convert to and from
 * our pointer and a fixed-size array.
 *
 * NOTE: MS-RPCE calls this a sec_trailer_t, so we use ndr_sec_t.
 * auth_value should also be an ANY_SIZE_ARRAY, but NDRGEN can't handle
 * variable-sized arrays.
 */
IMPORT_EXTERN
_NO_REORDER_
struct auth_verifier_co {
	/* restore 16 byte alignment */
	/* SIZE_IS(auth_pad_len) */
	/* BYTE auth_pad[ANY_SIZE_ARRAY] */ /* align(16) */
	BYTE auth_type; /* 00:01 */
	BYTE auth_level; /* 01:01 */
	BYTE auth_pad_len; /* 02:01 */
	BYTE auth_rsvd; /* 03:01 */
	DWORD auth_context_id; /* 04:04 */
	/* SIZE_IS(hdr->auth_length) */
	BYTE *auth_value; /* 08:* credentials */
};
typedef struct auth_verifier_co ndr_sec_t;
EXTERNTYPEINFO(auth_verifier_co)

#define	SEC_TRAILER_SIZE	8

/*
 * Alter Context PDU (0x0E)
 * (X/Open CAE Spec 12.6.4.1)
 */
_NO_REORDER_
struct ndr_alter_context_hdr {
	ndr_common_header_t common_hdr; /* 00:16 (see above) */

	WORD max_xmit_frag;		/* 16:02 ignored */
	WORD max_recv_frag;		/* 18:02 ignored */
	DWORD assoc_group_id;		/* 20:04 ignored */

	/*
	 * Presentation context list (see bind hdr comments).
	 */
	ndr_p_cont_list_t p_context_elem;	/* 24: */

	/* optional authentication verifier if auth_length != 0 */
	/* auth_verifier_co_t auth_verifier; */
};
typedef struct ndr_alter_context_hdr ndr_alter_context_hdr_t;


/*
 * Alter Context Response PDU (0x0F)
 * (X/Open CAE Spec 12.6.4.2)
 *
 * We can't automatically generate an alter context response header because
 * the sec_addr is an interior conformant (variable length) array, which is
 * inconsistent with IDL/NDR rules.  We mark this import-extern and provide
 * a hand-coded marshalling function.
 */
IMPORT_EXTERN
_NO_REORDER_
struct ndr_alter_context_rsp_hdr {
	ndr_common_header_t common_hdr; /* 00:16 (see above) */

	WORD max_xmit_frag;		/* 16:02 ignored */
	WORD max_recv_frag;		/* 18:02 ignored */
	DWORD assoc_group_id;		/* 20:04 ignored */
	ndr_port_any_t sec_addr;	/* 24:20 ignored */

	/*
	 * Presentation context list (see bind hdr comments).
	 */
	ndr_p_result_list_t p_result_list; /* 44:nn */

	/* optional authentication verifier if auth_length != 0 */
	/* auth_verifier_co_t auth_verifier; */
};
typedef struct ndr_alter_context_rsp_hdr ndr_alter_context_rsp_hdr_t;


/*
 * Bind PDU (0x0B)
 * (X/Open CAE Spec 12.6.4.3)
 */
_NO_REORDER_
struct ndr_bind_hdr {
	ndr_common_header_t	common_hdr; /* 00:16 (see above) */

	WORD		max_xmit_frag;	/* 16:02 max xmit frag size, bytes */
	WORD		max_recv_frag;	/* 18:02 max recv frag size, bytes */
	DWORD		assoc_group_id;	/* 20:04 association group */
					/* 24: */

	/* presentation, a variable**2 list, of presentation contexts */
	ndr_p_cont_list_t p_context_elem;

	/*
	 * This could be followed by more transfer_syntaxes[] for the
	 * p_cont_elem[0], and subsequently followed by more p_cont_elem[],
	 * each with one or more transfer_syntaxes[].  A single
	 * p_cont_elem[] with a single transfer_syntaxes[] is so common,
	 * though, we embed it in the bind_hdr but the bind processor must
	 * walk through this tail if there is one.
	 */

	/* optional authentication verifier iff auth_length != 0 */
	/* auth_verifier_co_t	auth_verifier; */
};
typedef struct ndr_bind_hdr	ndr_bind_hdr_t;


/*
 * Bind_Ack PDU (0x0C)
 * (X/Open CAE Spec 12.6.4.4)
 *
 * We can't automatically generate a bind ack header because the sec_addr
 * is an interior conformant (variable length) array, which is inconsistent
 * with IDL/NDR rules.  We mark this import-extern and provide a hand-coded
 * marshalling function.
 */
IMPORT_EXTERN
_NO_REORDER_
struct ndr_bind_ack_hdr {
	ndr_common_header_t	common_hdr; /* 00:16 (see above) */

	WORD		max_xmit_frag;	/* 16:02 max xmit frag size, bytes */
	WORD		max_recv_frag;	/* 18:02 max recv frag size, bytes */
	DWORD		assoc_group_id;	/* 20:04 association group */
	ndr_port_any_t	sec_addr;	/* 24:20 */

	ndr_p_result_list_t p_result_list; /* 44:nn */
	/* This could be followed by more. See bind_hdr above */

	/* optional authentication verifier iff auth_length != 0 */
	/* auth_verifier_co_t	auth_verifier; */
};
typedef struct ndr_bind_ack_hdr	ndr_bind_ack_hdr_t;


/*
 * Request PDU (0x00)
 ****************************************************************
 * Two flavors, selected based on PFC_OBJECT_UUID in hdr.pfc_flags
 *	one without the "object" (flag clear)
 *	one with the "object" (flag set)
 * (X/Open CAE Spec 12.6.4.9)
 */

_NO_REORDER_
struct ndr_request_hdr {
	ndr_common_header_t	common_hdr; /* 00:16 (see above) */

	/* needed for request, response, or fault */
	DWORD		alloc_hint;	/* 16:04 allocation hint */
	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */
	WORD		opnum;		/* 22:02 op number w/i interface */

	/* optional field if PFC_OBJECT_UUID, not present */
	/* ndr_uuid_t	object; */

	/* stub-data, 8-octet aligned */ /* 24:nn */
	/* nn = frag_len - sizeof(common_header) - auth_len */

	/* optional authentication verifier iff auth_length != 0 */
	/* auth_verifier_co_t	auth_verifier; */
};
typedef struct ndr_request_hdr	ndr_request_hdr_t;

_NO_REORDER_
struct ndr_request_hdr_with_object {
	ndr_common_header_t	common_hdr; /* 00:16 (see above) */

	/* needed for request, response, or fault */
	DWORD		alloc_hint;	/* 16:04 allocation hint */
	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */
	WORD		opnum;		/* 22:02 op number w/i interface */

	/* optional field if PFC_OBJECT_UUID, is present */
	ndr_uuid_t	object;		/* 24:16 object UUID, unknown purpose*/

	/* stub-data, 8-octet aligned */ /* 28:nn */
	/* nn = frag_len - sizeof(common_header) - auth_len */
	/* nn -= sizeof(ndr_uuid_t); */

	/* optional authentication verifier iff auth_length != 0 */
	/* auth_verifier_co_t	auth_verifier; */
};


/*
 * Convenient for response header sizing and multi-fragment responses.
 * We know the header is going to be 24 bytes, and the 'common' part
 * is 16 bytes.
 */
#define	NDR_CMN_HDR_SIZE			16
#define	NDR_RSP_HDR_SIZE			24


/*
 * Response PDU (0x02)
 * (X/Open CAE Spec 12.6.4.10)
 */

_NO_REORDER_
struct ndr_response_hdr {
	ndr_common_header_t	common_hdr; /* 00:16 (see above) */

	/* needed for request, response, or fault */
	DWORD		alloc_hint;	/* 16:04 allocation hint */
	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */

	/* needed for response or fault */
	BYTE		cancel_count;	/* 22:01 cancel count */
	BYTE		reserved;	/* 23:01 mbz */

	/* stub-data, 8-octet aligned */ /* 24:nn */
	/* nn = frag_len - sizeof(common_header) - auth_len */

	/* optional authentication verifier iff auth_length != 0 */
	/* auth_verifier_co_t	auth_verifier; */
};
typedef struct ndr_response_hdr	ndr_response_hdr_t;


/*
 * Fault PDU (0x03)
 * (X/Open CAE Spec 12.6.4.7)
 */

_NO_REORDER_
struct ndr_fault_hdr {
	ndr_common_header_t	common_hdr; /* 00:16 (see above) */

	DWORD		alloc_hint;	/* 16:04 allocation hint */
	ndr_p_context_id_t p_cont_id;	/* 20:02 pres context, i.e. data rep */

	/* needed for response or fault */
	BYTE		cancel_count;	/* 22:01 cancel count */
	BYTE		reserved;	/* 23:01 mbz */

	/* fault code */
	DWORD		status;		/* 24:04 run-time fault code or 0 */

	/* pad to 8-byte alignment */
	BYTE		reserved2[4];	/* 28:04 must-be-zero */

	/* stub-data here if status==0. We do not use this mode. */

	/* optional authentication verifier iff auth_length != 0 */
	/* auth_verifier_co_t	auth_verifier; */
};
typedef struct ndr_fault_hdr	ndr_fault_hdr_t;


/* Fault status code (X/Open CAE Spec Appendix E) */
#define NDR_FAULT_NCA_RPC_VERSION_MISMATCH	0x1c000008	/* CO/CL */
#define NDR_FAULT_NCA_UNSPEC_REJECT		0x1c000009	/* CO/CL */
#define NDR_FAULT_NCA_S_BAD_ACTID		0x1c00000A	/*    CL */
#define NDR_FAULT_NCA_WHO_ARE_YOU_FAILED	0x1c00000B	/*    CL */
#define NDR_FAULT_NCA_MANAGER_NOT_ENTERED	0x1c00000C	/* CO/CL */
#define NDR_FAULT_NCA_OP_RNG_ERROR		0x1c010002	/* CO/CL */
#define NDR_FAULT_NCA_UNK_IF			0x1c010003	/* CO/CL */
#define NDR_FAULT_NCA_WRONG_BOOT_TIME		0x1c010006	/*    CL */
#define NDR_FAULT_NCA_S_YOU_CRASHED		0x1c010009	/*    CL */
#define NDR_FAULT_NCA_PROTO_ERROR		0x1c01000B	/* CO/CL */
#define NDR_FAULT_NCA_OUT_ARGS_TOO_BIG		0x1c010013	/* CO/CL */
#define NDR_FAULT_NCA_SERVER_TOO_BUSY		0x1c010014	/* CO/CL */
#define NDR_FAULT_NCA_UNSUPPORTED_TYPE		0x1c010017	/* CO/CL */
#define NDR_FAULT_NCA_INVALID_PRES_CONTEXT_ID	0x1c00001c	/* CO    */
#define NDR_FAULT_NCA_UNSUPPORTED_AUTHN_LEVEL	0x1c00001d	/* CO/CL */
#define NDR_FAULT_NCA_INVALID_CHECKSUM		0x1c00001f	/* CO/CL */
#define NDR_FAULT_NCA_INVALID_CRC		0x1c000020	/* CO/CL */


/*
 * The Header Union/Switch
 ****************************************************************
 */

#define NDR_PTYPE_COMMON		999
#define NDR_PTYPE_REQUEST_WITH		998
#define	NDR_PTYPE_SERIALTYPE_V1		997
#define	NDR_PTYPE_SERIALTYPE_V2		996
#define	NDR_PTYPE_PAC			995

INTERFACE(0)
union ndr_hdr {
    CASE(NDR_PTYPE_COMMON)	/* exceeds BYTE range, obtains common hdr */
	struct ndr_common_header		common_hdr;

    CASE(NDR_PTYPE_BIND)
	struct ndr_bind_hdr			bind_hdr;

    CASE(NDR_PTYPE_BIND_ACK)
	struct ndr_bind_ack_hdr			bind_ack_hdr;

    CASE(NDR_PTYPE_REQUEST)
	struct ndr_request_hdr			request_hdr;

    CASE(NDR_PTYPE_REQUEST_WITH)	/* exceeds BYTE range, ... */
	struct ndr_request_hdr_with_object	request_hdr_with;

    CASE(NDR_PTYPE_RESPONSE)
	struct ndr_response_hdr			response_hdr;

    CASE(NDR_PTYPE_ALTER_CONTEXT)
	struct ndr_alter_context_hdr		alter_context_hdr;

    CASE(NDR_PTYPE_ALTER_CONTEXT_RESP)
	struct ndr_alter_context_rsp_hdr	alter_context_rsp_hdr;

    CASE(NDR_PTYPE_SERIALTYPE_V1)
	struct ndr_serialtype1_hdr		serialtype1_hdr;

    CASE(NDR_PTYPE_SERIALTYPE_V2)
	struct ndr_serialtype2_hdr		serialtype2_hdr;

    CASE(NDR_PTYPE_PAC)
	struct ndr_pac_hdr			pac_hdr;

    CASE(NDR_PTYPE_FAULT)
	struct ndr_fault_hdr			fault_hdr;
};
typedef union ndr_hdr	ndr_hdr_t;
EXTERNTYPEINFO(ndr_hdr)

#endif /* _RPCPDU_NDL_ */