1 /* 2 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 3 * unrestricted use provided that this legend is included on all tape 4 * media and as a part of the software program in whole or part. Users 5 * may copy or modify Sun RPC without charge, but are not authorized 6 * to license or distribute it to anyone else except as part of a product or 7 * program developed by the user. 8 * 9 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 10 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 11 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 12 * 13 * Sun RPC is provided with no support and without any obligation on the 14 * part of Sun Microsystems, Inc. to assist in its use, correction, 15 * modification or enhancement. 16 * 17 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 18 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 19 * OR ANY PART THEREOF. 20 * 21 * In no event will Sun Microsystems, Inc. be liable for any lost revenue 22 * or profits or other special, indirect and consequential damages, even if 23 * Sun has been advised of the possibility of such damages. 24 * 25 * Sun Microsystems, Inc. 26 * 2550 Garcia Avenue 27 * Mountain View, California 94043 28 */ 29 30 /* fixincludes should not add extern "C" to this file */ 31 /* 32 * Rpc additions to <sys/types.h> 33 */ 34 35 #ifndef RPCXDRTYPES_H 36 #define RPCXDRTYPES_H 37 38 /* 39 * XDR provides a conventional way for converting between C data 40 * types and an external bit-string representation. Library supplied 41 * routines provide for the conversion on built-in C data types. These 42 * routines and utility routines defined here are used to help implement 43 * a type encode/decode routine for each user-defined type. 44 * 45 * Each data type provides a single procedure which takes two arguments: 46 * 47 * bool_t 48 * xdrproc(xdrs, argresp) 49 * XDR *xdrs; 50 * <type> *argresp; 51 * 52 * xdrs is an instance of a XDR handle, to which or from which the data 53 * type is to be converted. argresp is a pointer to the structure to be 54 * converted. The XDR handle contains an operation field which indicates 55 * which of the operations (ENCODE, DECODE * or FREE) is to be performed. 56 * 57 * XDR_DECODE may allocate space if the pointer argresp is null. This 58 * data can be freed with the XDR_FREE operation. 59 * 60 * We write only one procedure per data type to make it easy 61 * to keep the encode and decode procedures for a data type consistent. 62 * In many cases the same code performs all operations on a user defined type, 63 * because all the hard work is done in the component type routines. 64 * decode as a series of calls on the nested data types. 65 */ 66 67 #ifdef __cplusplus 68 extern "C" { 69 #endif 70 71 /* The version of ONCRPC supported */ 72 #define RPC_MSG_VERSION ((u_long) 2) 73 74 #include <inttypes.h> 75 #include <string.h> 76 #include <pthread.h> 77 78 typedef int bool_t; /* This has to be a long, as it is used for XDR boolean too, which is a 4-byte value */ 79 typedef unsigned long rpcprog_t; 80 typedef unsigned long rpcproc_t; 81 typedef unsigned long rpcvers_t; 82 typedef unsigned long rpcprot_t; 83 typedef uint64_t uint64; 84 typedef uint32_t uint32; 85 typedef uint16_t uint16; 86 typedef uint8_t uint8; 87 typedef int32_t int32; 88 typedef int16_t int16; 89 typedef int8_t int8; 90 typedef int32_t enum_t; 91 typedef int64_t quad_t; 92 typedef uint64_t u_quad_t; 93 //typedef uint16_t u_short; /* defined in kernel_headers */ 94 #define TRUE 1 95 #define FALSE 0 96 static inline void* mem_alloc(size_t size) { return malloc(size); } 97 static inline void mem_free(void* ptr) { free(ptr); } 98 99 /* 100 * Xdr operations. XDR_ENCODE causes the type to be encoded into the 101 * stream. XDR_DECODE causes the type to be extracted from the stream. 102 * XDR_FREE can be used to release the space allocated by an XDR_DECODE 103 * request. 104 */ 105 enum xdr_op { 106 XDR_ENCODE = 0, 107 XDR_DECODE = 1, 108 XDR_FREE = 2 109 }; 110 111 /* 112 * This is the number of bytes per unit of external data. 113 */ 114 #define BYTES_PER_XDR_UNIT (4) 115 116 /* 117 * The XDR handle. 118 * Contains operation which is being applied to the stream, 119 * an operations vector for the particular implementation (e.g. see xdr_mem.c), 120 * and two private fields for the use of the particular implementation. 121 */ 122 typedef struct xdr_struct XDR; 123 /* 124 * A xdrproc_t exists for each data type which is to be encoded or decoded. 125 * 126 * The second argument to the xdrproc_t is a pointer to an opaque pointer. 127 * The opaque pointer generally points to a structure of the data type 128 * to be decoded. If this pointer is 0, then the type routines should 129 * allocate dynamic storage of the appropriate size and return it. 130 * bool_t (*xdrproc_t)(XDR *, caddr_t *); 131 */ 132 typedef bool_t (*xdrproc_t) (XDR *, void *,...); 133 134 135 #define ONCRPC_CONTROL_GET_MTU (1) 136 #define ONCRPC_CONTROL_GET_TX_QUOTA (2) 137 #define ONCRPC_CONTROL_GET_RX_BUFFER_SIZE (3) 138 #define ONCRPC_CONTROL_REGISTER_SERVER (4) 139 #define ONCRPC_CONTROL_UNREGISTER_SERVER (5) 140 #define ONCRPC_CONTROL_GET_DEST (6) 141 #define ONCRPC_CONTROL_OPEN_XPORT (7) 142 #define ONCRPC_CONTROL_CLOSE_XPORT (8) 143 #define ONCRPC_CONTROL_SET_DEST (9) 144 #define ONCRPC_CONTROL_GET_SOURCE_ADDR (10) 145 146 typedef struct oncrpc_prog_ver_struct 147 { 148 rpcprog_t prog; 149 rpcvers_t ver; 150 void (*dispatch)(); 151 } oncrpc_prog_ver_type; 152 153 typedef uint64 oncrpc_addr_type; 154 155 typedef struct { 156 oncrpc_addr_type addr; 157 oncrpc_prog_ver_type prog_ver; 158 } oncrpc_control_get_dest_type; 159 160 typedef struct { 161 oncrpc_addr_type addr; 162 } oncrpc_control_get_source_type; 163 164 typedef struct{ 165 oncrpc_prog_ver_type prog_ver; 166 } oncrpc_control_register_server_type; 167 168 typedef struct{ 169 oncrpc_prog_ver_type prog_ver; 170 } oncrpc_control_unregister_server_type; 171 172 typedef struct{ 173 oncrpc_addr_type dest; 174 } oncrpc_control_set_dest_type; 175 176 typedef struct{ 177 unsigned int xp; 178 unsigned int port; 179 } oncrpc_control_open_xport_type; 180 181 #define NULL_xdrproc_t ((xdrproc_t)0) 182 183 /* 184 * Support struct for discriminated unions. 185 * You create an array of xdrdiscrim structures, terminated with 186 * a entry with a null procedure pointer. The xdr_union routine gets 187 * the discriminant value and then searches the array of structures 188 * for a matching value. If a match is found the associated xdr routine 189 * is called to handle that part of the union. If there is 190 * no match, then a default routine may be called. 191 * If there is no match and no default routine it is an error. 192 */ 193 struct xdr_discrim 194 { 195 int value; 196 xdrproc_t proc; 197 }; 198 199 /* Message enums */ 200 typedef enum { 201 RPC_MSG_CALL=0, 202 RPC_MSG_REPLY=1, 203 RPC_MSG_UNDEF = 2, 204 } rpc_msg_e_type; 205 206 typedef enum { 207 RPC_MSG_ACCEPTED=0, 208 RPC_MSG_DENIED=1 209 } rpc_reply_stat_e_type; 210 211 typedef enum { 212 RPC_ACCEPT_SUCCESS = 0, 213 RPC_PROG_UNAVAIL = 1, 214 RPC_PROG_MISMATCH = 2, 215 RPC_PROC_UNAVAIL = 3, 216 RPC_GARBAGE_ARGS = 4, 217 RPC_SYSTEM_ERR = 5, 218 RPC_PROG_LOCKED = 6 219 } rpc_accept_stat_e_type; 220 221 typedef enum { 222 RPC_MISMATCH=0, 223 RPC_AUTH_ERROR=1 224 } rpc_reject_stat_e_type ; 225 226 /* Auth types */ 227 228 /* 229 * Status returned from authentication check 230 */ 231 typedef enum { 232 AUTH_OK=0, 233 /* 234 * failed at remote end 235 */ 236 AUTH_BADCRED=1, /* bogus credentials (seal broken) */ 237 AUTH_REJECTEDCRED=2, /* client should begin new session */ 238 AUTH_BADVERF=3, /* bogus verifier (seal broken) */ 239 AUTH_REJECTEDVERF=4, /* verifier expired or was replayed */ 240 AUTH_TOOWEAK=5, /* rejected due to security reasons */ 241 /* 242 * failed locally 243 */ 244 AUTH_INVALIDRESP=6, /* bogus response verifier */ 245 AUTH_FAILED=7 /* some unknown reason */ 246 } auth_stat; 247 248 typedef enum { 249 AUTH_NONE =0, /* no authentication */ 250 AUTH_NULL =0, /* backward compatibility */ 251 AUTH_SYS =1, /* unix style (uid, gids) */ 252 AUTH_UNIX =1, 253 AUTH_SHORT =2 /* short hand unix style */ 254 } oncrpc_auth_types; 255 /* 256 * Authentication info. Opaque to client. 257 */ 258 typedef struct opaque_auth { 259 oncrpc_auth_types oa_flavor; /* flavor of auth */ 260 caddr_t oa_base; /* address of more auth stuff */ 261 u_int oa_length; /* not to exceed MAX_AUTH_BYTES */ 262 } opaque_auth; 263 264 #define MAX_AUTH_BYTES 400 265 #define MAXNETNAMELEN 255 /* maximum length of network user's name */ 266 267 /* Error types */ 268 /* 269 * Reply header to an rpc request that was accepted by the server. 270 * Note: there could be an error even though the request was 271 * accepted. 272 */ 273 struct rpc_accepted_reply_header 274 { 275 opaque_auth verf; 276 rpc_accept_stat_e_type stat; 277 union 278 { 279 struct 280 { 281 uint32 low; 282 uint32 high; 283 } versions; 284 } u; 285 }; 286 287 /* 288 * Reply to an rpc request that was denied by the server. 289 */ 290 struct rpc_denied_reply 291 { 292 rpc_reject_stat_e_type stat; 293 union 294 { 295 struct 296 { 297 uint32 low; 298 uint32 high; 299 } versions; 300 auth_stat why; /* why authentication did not work */ 301 } u; 302 }; 303 304 /* 305 * RPC reply header structure. The reply header contains error codes in 306 * case of errors in the server side or the RPC call being rejected. 307 */ 308 typedef struct rpc_reply_header 309 { 310 rpc_reply_stat_e_type stat; 311 union 312 { 313 struct rpc_accepted_reply_header ar; 314 struct rpc_denied_reply dr; 315 } u; 316 } rpc_reply_header; 317 318 /* XDR memory wrapper structure */ 319 typedef struct oncrpcxdr_mem_struct { 320 struct oncrpcxdr_mem_struct *next; 321 322 #ifdef IMAGE_APPS_PROC 323 /* make structure size 8-bytes so we 324 keep 8-byte alignment */ 325 uint32 padding; 326 #endif 327 } oncrpcxdr_mem_s_type; 328 329 // TODO - keep XPORT objects on queue to help track down memory leaks 330 331 /*=========================================================================== 332 Defining the XPORT structure 333 ===========================================================================*/ 334 335 #define XPORT_FLAG_XPORT_ALLOCED 0x0001 336 337 /*=========================================================================== 338 Defining the XDR structure 339 ===========================================================================*/ 340 341 typedef struct xdr_struct xdr_s_type; 342 343 /* Call back definition for non-blocking RPC calls */ 344 typedef void (*rpc_reply_cb_type)(xdr_s_type *xdr, void *data); 345 346 /* Entry points that must be provided by xdr */ 347 struct xdr_ops_struct { 348 /* Transport control functions */ 349 void (*xdr_destroy) (xdr_s_type *xdr); 350 bool_t (*xdr_control) (xdr_s_type *xdr, int request, void *info); 351 352 /* Incoming message control functions */ 353 bool_t (*read) (xdr_s_type *xdr); 354 bool_t (*msg_done) (xdr_s_type *xdr); 355 356 /* Outgoing message control functions */ 357 bool_t (*msg_start) (xdr_s_type *xdr, rpc_msg_e_type rpc_msg_type); 358 bool_t (*msg_abort) (xdr_s_type *xdr); 359 bool_t (*msg_send) (xdr_s_type *xdr); 360 361 /* Message data functions */ 362 bool_t (*send_int8) (xdr_s_type *xdr, const int8 *value); 363 bool_t (*send_uint8) (xdr_s_type *xdr, const uint8 *value); 364 bool_t (*send_int16) (xdr_s_type *xdr, const int16 *value); 365 bool_t (*send_uint16) (xdr_s_type *xdr, const uint16 *value); 366 bool_t (*send_int32) (xdr_s_type *xdr, const int32 *value); 367 bool_t (*send_uint32) (xdr_s_type *xdr, const uint32 *value); 368 bool_t (*send_bytes) (xdr_s_type *xdr, const uint8 *buf, uint32 len); 369 370 bool_t (*recv_int8) (xdr_s_type *xdr, int8 *value); 371 bool_t (*recv_uint8) (xdr_s_type *xdr, uint8 *value); 372 bool_t (*recv_int16) (xdr_s_type *xdr, int16 *value); 373 bool_t (*recv_uint16) (xdr_s_type *xdr, uint16 *value); 374 bool_t (*recv_int32) (xdr_s_type *xdr, int32 *value); 375 bool_t (*recv_uint32) (xdr_s_type *xdr, uint32 *value); 376 bool_t (*recv_bytes) (xdr_s_type *xdr, uint8 *buf, uint32 len); 377 }; 378 379 typedef struct xdr_ops_struct xdr_ops_s_type; 380 381 /*=========================================================================== 382 XDR structure definition - provides a generic interface to each 383 supported transport. The xdr structure is used both for clients and 384 for servers. 385 ===========================================================================*/ 386 387 #define RPCROUTER_MSGSIZE_MAX (2048) 388 389 struct xdr_struct { 390 const xdr_ops_s_type *xops; 391 enum xdr_op x_op; /* used for ENCODE and DECODE */ 392 uint32 x_prog; /* program number */ 393 uint32 x_vers; /* program version */ 394 uint32 x_proc; /* for debug output */ 395 396 opaque_auth verf; /* verf to send back */ 397 uint32 xid; 398 int fd; 399 int is_client; 400 401 /* RPC-call message (if XDR is a client) or RPC-reply message (if 402 XDR is a server). */ 403 404 uint8 out_msg[RPCROUTER_MSGSIZE_MAX]; 405 int out_next; 406 407 /* Reply message or incoming-call message. For a client XDR, this 408 buffer always contains the reply received in response to an RPC 409 call. For a server XDR, this buffer always contains an incoming 410 RPC call. 411 */ 412 uint8 in_msg[RPCROUTER_MSGSIZE_MAX]; 413 int in_next; 414 int in_len; 415 }; 416 417 // Transport flag definitions 418 #define XDR_FLAG_XDR_ALLOCED 0x0001 419 #define XDR_FLAG_DEDICATED 0x0002 420 #define XDR_FLAG_DESTROYING 0x0004 421 #define XDR_FLAG_RETRY 0x0008 422 423 424 /// @todo FIXME this goes with the callback stuff in oncrpcxdr.c. Move 425 /// elsewhere and pick better symbol names. 426 typedef struct rpc_cb_data_type { 427 void * cb_handler; 428 uint32 cb_id; 429 rpcprot_t protocol; 430 oncrpc_addr_type cb_source; 431 } rpc_cb_data_type; 432 433 #ifdef __cplusplus 434 } 435 #endif 436 437 #endif /* _RPC_XDR_TYPES_H */ 438