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