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