xref: /titanic_50/usr/src/uts/common/smbsrv/ndl/rpcpdu.ndl (revision b5d3ab78446c645a1150b57b7a58b535229ee742)
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 _MLRPCPDU_NDL_
27#define _MLRPCPDU_NDL_
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#include "ndrtypes.ndl"
32
33/*
34 * Normally, constructs are (un)marshalled atoms first, then
35 * constructs, then pointers. This can be confusing sometimes
36 * when debugging. We know that everything in here can be
37 * safely (un)marshalled in member order, so we say so.
38 */
39#ifdef NDRGEN
40#define _NO_REORDER_ [_no_reorder]
41#else
42#define _NO_REORDER_
43#endif
44
45/*
46 * UUID (Universal Unique IDentifier)
47 */
48/* (X/Open CAE Spec Appendix A) */
49struct 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
58struct ndr_uuid {
59	DWORD		data1;
60	WORD		data2;
61	WORD		data3;
62	BYTE		data4[8];
63};
64typedef 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 MLRPC_REPLAB_CHAR_MASK		0x0F	/* low nibble of intg_char */
83#define MLRPC_REPLAB_CHAR_ASCII		0x00	/* ASCII */
84#define MLRPC_REPLAB_CHAR_EBCDIC	0x01	/* EBCDIC (never happen) */
85#define MLRPC_REPLAB_INTG_MASK		0xF0	/* hi nibble of intg_char */
86#define MLRPC_REPLAB_INTG_BIG_ENDIAN	0x00	/* big endian */
87#define MLRPC_REPLAB_INTG_LITTLE_ENDIAN	0x10	/* little endian (x86) */
88#define MLRPC_REPLAB_FLOAT_IEEE		0x00
89#define MLRPC_REPLAB_FLOAT_VAX		0x01
90#define MLRPC_REPLAB_FLOAT_CRAY		0x02
91#define MLRPC_REPLAB_FLOAT_IBM		0x03
92
93struct mlrpc_representation_label {
94	BYTE		intg_char_rep;		/* integer and charset */
95	BYTE		float_rep;
96	BYTE		_spare[2];
97};
98
99
100
101/*
102 * RPC PDU (Protocol Data Unit) types
103 ****************************************************************
104 * (X/Open CAE Spec 12.1)
105 */
106
107#define MLRPC_PTYPE_REQUEST		0x00	/* CO/CL */
108#define MLRPC_PTYPE_PING		0x01	/*    CL */
109#define MLRPC_PTYPE_RESPONSE		0x02	/* CO/CL */
110#define MLRPC_PTYPE_FAULT		0x03	/* CL/CL */
111#define MLRPC_PTYPE_WORKING		0x04	/*    CL */
112#define MLRPC_PTYPE_NOCALL		0x05	/*    CL */
113#define MLRPC_PTYPE_REJECT		0x06	/*    CL */
114#define MLRPC_PTYPE_ACK			0x07	/*    CL */
115#define MLRPC_PTYPE_CL_CANCEL		0x08	/*    CL */
116#define MLRPC_PTYPE_FACK		0x09	/*    CL */
117#define MLRPC_PTYPE_CANCEL_ACK		0x0A	/*    CL */
118#define MLRPC_PTYPE_BIND		0x0B	/* CO    */
119#define MLRPC_PTYPE_BIND_ACK		0x0C	/* CO    */
120#define MLRPC_PTYPE_BIND_NAK		0x0D	/* CO    */
121#define MLRPC_PTYPE_ALTER_CONTEXT	0x0E	/* CO    */
122#define MLRPC_PTYPE_ALTER_CONTEXT_RESP	0x0F	/* CO    */
123						/* 0x10 missing from DCE/RPC */
124#define MLRPC_PTYPE_SHUTDOWN		0x11	/* CO    */
125#define MLRPC_PTYPE_CO_CANCEL		0x12	/* CO    */
126#define MLRPC_PTYPE_ORPHANED		0x13	/* CO    */
127
128/*
129 * Flags in the RPC header for Connection-oriented PDU data types
130 * (X/Open CAE Spec 12.6.3.1)
131 */
132#define MLRPC_PFC_FIRST_FRAG		0x01	/* First fragment */
133#define MLRPC_PFC_LAST_FRAG		0x02	/* Last framgent */
134#define MLRPC_PFC_PENDING_CANCEL	0x04	/* Cancel was pending@sender*/
135#define MLRPC_PFC_RESERVED_1		0x08	/* */
136#define MLRPC_PFC_CONC_MPX		0x10	/* supports concurrent muxing
137						 * of single connection */
138#define MLRPC_PFC_DID_NOT_EXECUTE	0x20	/* for PTYPE_FAULT, guarantee
139						 * call did not execute */
140#define MLRPC_PFC_MAYBE			0x40	/* "maybe" semantics req'ed*/
141#define MLRPC_PFC_OBJECT_UUID		0x80	/* */
142
143
144/*
145 * Header common to all Connection-oriented RPC PDUs
146 ****************************************************************
147 * (X/Open CAE Spec 12.6.3.1)
148 */
149_NO_REORDER_
150struct mlrpcconn_common_header {
151	BYTE		rpc_vers;	/* 00:01 5 */
152	BYTE		rpc_vers_minor;	/* 01:01 0 */
153	BYTE		ptype;		/* 02:01 MLRPC_PTYPE_... */
154	BYTE		pfc_flags;	/* 03:01 MLRPC_PFC_... */
155	struct mlrpc_representation_label
156			packed_drep;	/* 04:04 NDR representation label */
157	WORD		frag_length;	/* 08:02 total length of frag */
158	WORD		auth_length;	/* 10:02 length of auth_value */
159	DWORD		call_id;	/* 12:04 call identifier */
160					/* 16: */
161};
162typedef struct mlrpcconn_common_header	mlrpcconn_common_header_t;
163EXTERNTYPEINFO(mlrpcconn_common_header)
164
165
166/*
167 * A plethora of supporting types, only defined the ones we need
168 * (X/Open CAE Spec 12.6.3.1)
169 */
170typedef WORD	mlrpc_p_context_id_t;
171
172_NO_REORDER_
173struct mlrpc_p_syntax_id {
174	ndr_uuid_t	if_uuid;
175	DWORD		if_version;
176};
177typedef struct mlrpc_p_syntax_id	mlrpc_p_syntax_id_t;
178
179_NO_REORDER_
180struct mlrpc_p_cont_elem {
181	mlrpc_p_context_id_t	p_cont_id;
182	BYTE			n_transfer_syn;
183	BYTE			_reserved;
184	mlrpc_p_syntax_id_t	abstract_syntax;
185    /*SIZE_IS(n_transfer_syn)*/
186	mlrpc_p_syntax_id_t	transfer_syntaxes[1];
187};
188typedef struct mlrpc_p_cont_elem	mlrpc_p_cont_elem_t;
189EXTERNTYPEINFO(mlrpc_p_cont_elem)
190
191_NO_REORDER_
192struct mlrpc_p_cont_list {
193	BYTE		n_context_elem;
194	BYTE		_reserved;
195	WORD		_reserved2;
196    /*SIZE_IS(n_context_elem)*/
197	mlrpc_p_cont_elem_t p_cont_elem[1];
198};
199typedef struct mlrpc_p_cont_list	mlrpc_p_cont_list_t;
200EXTERNTYPEINFO(mlrpc_p_cont_list)
201
202typedef WORD	mlrpc_p_cont_def_result_t;
203#define MLRPC_PCDR_ACCEPTANCE		0
204#define MLRPC_PCDR_USER_REJECTION	1
205#define MLRPC_PCDR_PROVIDER_REJECTION	2
206
207typedef WORD	mlrpc_p_provider_reason_t;
208#define MLRPC_PPR_REASON_NOT_SPECIFIED		0
209#define MLRPC_PPR_ABSTRACT_SYNTAX_NOT_SUPPORTED	1
210#define MLRPC_PPR_PROPOSED_TRANSFER_SYNTAXES_NOT_SUPPORTED 2
211#define MLRPC_PPR_LOCAL_LIMIT_EXCEEDED		3
212
213
214_NO_REORDER_
215struct mlrpc_p_result {
216	mlrpc_p_cont_def_result_t	result;		/* MLRPC_PCDR_... */
217	mlrpc_p_provider_reason_t	reason;		/* MLRPC_PPR_... */
218	mlrpc_p_syntax_id_t		transfer_syntax; /* 0-fill if
219							  * result!=ACCEPT*/
220};
221typedef struct mlrpc_p_result		mlrpc_p_result_t;
222EXTERNTYPEINFO(mlrpc_p_result)
223
224_NO_REORDER_
225struct mlrpc_p_result_list {
226	BYTE		n_results;
227	BYTE		reserved;
228	WORD		reserved2;
229    /*SIZE_IS(n_results)*/
230	mlrpc_p_result_t p_results[1];
231};
232typedef struct mlrpc_p_result_list	mlrpc_p_result_list_t;
233EXTERNTYPEINFO(mlrpc_p_result_list)
234
235#define MLRPC_PORT_ANY_MAX_PORT_SPEC	30
236_NO_REORDER_
237struct mlrpc_port_any {
238	WORD		length;		/* always 18 */
239    /*SIZE_IS(length)*/
240	BYTE		port_spec[MLRPC_PORT_ANY_MAX_PORT_SPEC];
241					/* \PIPE\ntsvcs */
242	/* We cheat by using 18, and pad on the right with zeroes */
243};
244typedef struct mlrpc_port_any		mlrpc_port_any_t;
245EXTERNTYPEINFO(mlrpc_port_any)
246
247
248/*
249 * Alter Context PDU (0x0E)
250 * (X/Open CAE Spec 12.6.4.1)
251 */
252_NO_REORDER_
253struct mlrpcconn_alter_context_hdr {
254	mlrpcconn_common_header_t common_hdr; /* 00:16 (see above) */
255
256	WORD max_xmit_frag;		/* 16:02 ignored */
257	WORD max_recv_frag;		/* 18:02 ignored */
258	DWORD assoc_group_id;	/* 20:04 ignored */
259
260	/*
261	 * Presentation context list (see bind hdr comments).
262	 */
263	mlrpc_p_cont_list_t p_context_elem;	/* 24: */
264
265	/* optional authentication verifier if auth_length != 0 */
266	/* auth_verifier_co_t auth_verifier; */
267};
268typedef struct mlrpcconn_alter_context_hdr mlrpcconn_alter_context_hdr_t;
269
270
271/*
272 * Alter Context Response PDU (0x0F)
273 * (X/Open CAE Spec 12.6.4.2)
274 */
275_NO_REORDER_
276struct mlrpcconn_alter_context_rsp_hdr {
277	mlrpcconn_common_header_t common_hdr; /* 00:16 (see above) */
278
279	WORD max_xmit_frag;			/* 16:02 ignored */
280	WORD max_recv_frag;			/* 18:02 ignored */
281	DWORD assoc_group_id;		/* 20:04 ignored */
282	mlrpc_port_any_t sec_addr;	/* 24:20 ignored */
283
284	/*
285	 * Presentation context list (see bind hdr comments).
286	 */
287	mlrpc_p_result_list_t p_result_list; /* 44:nn */
288
289	/* optional authentication verifier if auth_length != 0 */
290	/* auth_verifier_co_t auth_verifier; */
291};
292typedef struct mlrpcconn_alter_context_rsp_hdr mlrpcconn_alter_context_rsp_hdr_t;
293
294
295/*
296 * Bind PDU (0x0B)
297 ****************************************************************
298 * (X/Open CAE Spec 12.6.4.3)
299 */
300
301_NO_REORDER_
302struct mlrpcconn_bind_hdr {
303	mlrpcconn_common_header_t	common_hdr; /* 00:16 (see above) */
304
305	WORD		max_xmit_frag;	/* 16:02 max xmit frag size, bytes */
306	WORD		max_recv_frag;	/* 18:02 max recv frag size, bytes */
307	DWORD		assoc_group_id;	/* 20:04 incarnation of client-server
308					 * association group (???) */
309					/* 24: */
310
311	/* presentation, a variable**2 list, of presentation contexts */
312	mlrpc_p_cont_list_t p_context_elem;
313	/*
314	 * This could be follow by more transfer_syntaxes[] for
315	 * the p_cont_elem[0], and subsequently followed by
316	 * more p_cont_elem[] each with one ore more
317	 * transfer_syntaxes[]. The single p_cont_elem[]
318	 * with a single transfer_syntaxes[] is so common,
319	 * though, we embed such right in the bind_hdr.
320	 * The mlrpc_s_bind() processor must walk through
321	 * this tail if there is one.
322	 */
323
324	/* optional authentication verifier iff auth_length != 0 */
325	/* auth_verifier_co_t	auth_verifier; */
326};
327typedef struct mlrpcconn_bind_hdr	mlrpcconn_bind_hdr_t;
328
329
330
331
332/*
333 * Bind_Ack PDU (0x0C)
334 ****************************************************************
335 * (X/Open CAE Spec 12.6.4.4)
336 */
337
338/*
339 * hand coded in mlrpc_encdec.c because sec_addr is an
340 * interior conformant (variable length) array.
341 */
342
343IMPORT_EXTERN /* don't generate function */
344_NO_REORDER_
345struct mlrpcconn_bind_ack_hdr {
346	mlrpcconn_common_header_t	common_hdr; /* 00:16 (see above) */
347
348	WORD		max_xmit_frag;	/* 16:02 max xmit frag size, bytes */
349	WORD		max_recv_frag;	/* 18:02 max recv frag size, bytes */
350	DWORD		assoc_group_id;	/* 20:04 incarnation of client-server
351					 * association group (???) */
352					/* 24: */
353
354	mlrpc_port_any_t sec_addr;	/* 24:20 */
355
356	mlrpc_p_result_list_t p_result_list; /* 44:nn */
357	/* This could be followed by more. See bind_hdr above */
358
359	/* optional authentication verifier iff auth_length != 0 */
360	/* auth_verifier_co_t	auth_verifier; */
361};
362typedef struct mlrpcconn_bind_ack_hdr	mlrpcconn_bind_ack_hdr_t;
363
364
365
366
367/*
368 * Request PDU (0x00)
369 ****************************************************************
370 * Two flavors, selected based on MLRPC_PFC_OBJECT_UUID in hdr.pfc_flags
371 *	one without the "object" (flag clear)
372 *	one with the "object" (flag set)
373 * (X/Open CAE Spec 12.6.4.9)
374 */
375
376_NO_REORDER_
377struct mlrpcconn_request_hdr {
378	mlrpcconn_common_header_t	common_hdr; /* 00:16 (see above) */
379
380	/* needed for request, response, or fault */
381	DWORD		alloc_hint;	/* 16:04 allocation hint */
382	mlrpc_p_context_id_t
383			p_cont_id;	/* 20:02 pres context, i.e. data rep */
384
385	WORD		opnum;		/* 22:02 op number w/i interface */
386
387	/* optional field if PFC_OBJECT_UUID, not present */
388	/* ndr_uuid_t	object; */
389
390	/* stub-data, 8-octet aligned */ /* 24:nn */
391	/* nn = frag_len - sizeof(common_header) - auth_len */
392
393	/* optional authentication verifier iff auth_length != 0 */
394	/* auth_verifier_co_t	auth_verifier; */
395};
396typedef struct mlrpcconn_request_hdr	mlrpcconn_request_hdr_t;
397
398_NO_REORDER_
399struct mlrpcconn_request_hdr_with_object {
400	mlrpcconn_common_header_t	common_hdr; /* 00:16 (see above) */
401
402	/* needed for request, response, or fault */
403	DWORD		alloc_hint;	/* 16:04 allocation hint */
404	mlrpc_p_context_id_t
405			p_cont_id;	/* 20:02 pres context, i.e. data rep */
406
407	WORD		opnum;		/* 22:02 op number w/i interface */
408
409	/* optional field if PFC_OBJECT_UUID, is present */
410	ndr_uuid_t	object;		/* 24:16 object UUID, unknown purpose*/
411
412	/* stub-data, 8-octet aligned */ /* 28:nn */
413	/* nn = frag_len - sizeof(common_header) - auth_len */
414	/* nn -= sizeof(ndr_uuid_t); */
415
416	/* optional authentication verifier iff auth_length != 0 */
417	/* auth_verifier_co_t	auth_verifier; */
418};
419
420
421
422/*
423 * Hack for response header sizing and multi-fragment responses.
424 * We know the header is going to be 24 bytes.
425 */
426#define MLRPC_RSP_HDR_SIZE			24
427
428
429/*
430 * Response PDU (0x02)
431 * (X/Open CAE Spec 12.6.4.10)
432 */
433
434_NO_REORDER_
435struct mlrpcconn_response_hdr {
436	mlrpcconn_common_header_t	common_hdr; /* 00:16 (see above) */
437
438	/* needed for request, response, or fault */
439	DWORD		alloc_hint;	/* 16:04 allocation hint */
440	mlrpc_p_context_id_t
441			p_cont_id;	/* 20:02 pres context, i.e. data rep */
442
443	/* needed for response or fault */
444	BYTE		cancel_count;	/* 22:01 cancel count */
445	BYTE		reserved;	/* 23:01 mbz */
446
447	/* stub-data, 8-octet aligned */ /* 24:nn */
448	/* nn = frag_len - sizeof(common_header) - auth_len */
449
450	/* optional authentication verifier iff auth_length != 0 */
451	/* auth_verifier_co_t	auth_verifier; */
452};
453typedef struct mlrpcconn_response_hdr	mlrpcconn_response_hdr_t;
454
455
456
457/*
458 * Fault PDU (0x03)
459 * (X/Open CAE Spec 12.6.4.7)
460 */
461
462_NO_REORDER_
463struct mlrpcconn_fault_hdr {
464	mlrpcconn_common_header_t	common_hdr; /* 00:16 (see above) */
465
466	DWORD		alloc_hint;	/* 16:04 allocation hint */
467	mlrpc_p_context_id_t
468			p_cont_id;	/* 20:02 pres context, i.e. data rep */
469
470	/* needed for response or fault */
471	BYTE		cancel_count;	/* 22:01 cancel count */
472	BYTE		reserved;	/* 23:01 mbz */
473
474	/* fault code */
475	DWORD		status;		/* 24:04 run-time fault code or 0 */
476
477	/* pad to 8-byte alignment */
478	BYTE		reserved2[4];	/* 28:04 must-be-zero */
479
480	/* stub-data here if status==0. We do not use this mode. */
481
482	/* optional authentication verifier iff auth_length != 0 */
483	/* auth_verifier_co_t	auth_verifier; */
484};
485typedef struct mlrpcconn_fault_hdr	mlrpcconn_fault_hdr_t;
486
487
488/* Fault status code (X/Open CAE Spec Appendix E) */
489#define MLRPC_FAULT_NCA_RPC_VERSION_MISMATCH	0x1c000008	/* CO/CL */
490#define MLRPC_FAULT_NCA_UNSPEC_REJECT		0x1c000009	/* CO/CL */
491#define MLRPC_FAULT_NCA_S_BAD_ACTID		0x1c00000A	/*    CL */
492#define MLRPC_FAULT_NCA_WHO_ARE_YOU_FAILED	0x1c00000B	/*    CL */
493#define MLRPC_FAULT_NCA_MANAGER_NOT_ENTERED	0x1c00000C	/* CO/CL */
494#define MLRPC_FAULT_NCA_OP_RNG_ERROR		0x1c010002	/* CO/CL */
495#define MLRPC_FAULT_NCA_UNK_IF			0x1c010003	/* CO/CL */
496#define MLRPC_FAULT_NCA_WRONG_BOOT_TIME		0x1c010006	/*    CL */
497#define MLRPC_FAULT_NCA_S_YOU_CRASHED		0x1c010009	/*    CL */
498#define MLRPC_FAULT_NCA_PROTO_ERROR		0x1c01000B	/* CO/CL */
499#define MLRPC_FAULT_NCA_OUT_ARGS_TOO_BIG	0x1c010013	/* CO/CL */
500#define MLRPC_FAULT_NCA_SERVER_TOO_BUSY		0x1c010014	/* CO/CL */
501#define MLRPC_FAULT_NCA_UNSUPPORTED_TYPE	0x1c010017	/* CO/CL */
502#define MLRPC_FAULT_NCA_INVALID_PRES_CONTEXT_ID	0x1c00001c	/* CO    */
503#define MLRPC_FAULT_NCA_UNSUPPORTED_AUTHN_LEVEL	0x1c00001d	/* CO/CL */
504#define MLRPC_FAULT_NCA_INVALID_CHECKSUM	0x1c00001f	/* CO/CL */
505#define MLRPC_FAULT_NCA_INVALID_CRC		0x1c000020	/* CO/CL */
506
507
508
509
510/*
511 * The Header Union/Switch
512 ****************************************************************
513 */
514
515#define MLRPC_PTYPE_COMMON		999
516#define MLRPC_PTYPE_REQUEST_WITH	998
517
518
519INTERFACE(0)
520union mlrpcconn_hdr {
521    CASE(MLRPC_PTYPE_COMMON)	/* exceeds BYTE range, obtains common hdr */
522	struct mlrpcconn_common_header		common_hdr;
523
524    CASE(MLRPC_PTYPE_BIND)
525	struct mlrpcconn_bind_hdr		bind_hdr;
526
527    CASE(MLRPC_PTYPE_BIND_ACK)
528	struct mlrpcconn_bind_ack_hdr		bind_ack_hdr;
529
530    CASE(MLRPC_PTYPE_REQUEST)
531	struct mlrpcconn_request_hdr		request_hdr;
532
533    CASE(MLRPC_PTYPE_REQUEST_WITH)	/* exceeds BYTE range, ... */
534	struct mlrpcconn_request_hdr_with_object request_hdr_with;
535
536    CASE(MLRPC_PTYPE_RESPONSE)
537	struct mlrpcconn_response_hdr		response_hdr;
538
539    CASE(MLRPC_PTYPE_ALTER_CONTEXT)
540	struct mlrpcconn_alter_context_hdr	alter_context_hdr;
541
542    CASE(MLRPC_PTYPE_ALTER_CONTEXT_RESP)
543	struct mlrpcconn_alter_context_rsp_hdr	alter_context_rsp_hdr;
544
545    CASE(MLRPC_PTYPE_FAULT)
546	struct mlrpcconn_fault_hdr		fault_hdr;
547};
548typedef union mlrpcconn_hdr	mlrpcconn_hdr_t;
549EXTERNTYPEINFO(mlrpcconn_hdr)
550
551#endif /* _MLRPCPDU_NDL_ */
552
553