|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_FREE_COPYRIGHT@ ! 24: * ! 25: */ ! 26: /* ! 27: * HISTORY ! 28: * ! 29: * Revision 1.1.1.1 1998/09/22 21:05:30 wsanchez ! 30: * Import of Mac OS X kernel (~semeria) ! 31: * ! 32: * Revision 1.2 1998/04/29 17:36:39 mburg ! 33: * MK7.3 merger ! 34: * ! 35: * Revision 1.1.37.1 1998/02/03 09:32:57 gdt ! 36: * Merge up to MK7.3 ! 37: * [1998/02/03 09:17:05 gdt] ! 38: * ! 39: * Revision 1.1.34.1 1997/02/17 11:24:51 ferranti ! 40: * Removed handling of physical buffers for DIPC introduced during ! 41: * the port on HP_PA platform. ! 42: * [1997/02/17 11:16:56 ferranti] ! 43: * ! 44: * Revision 1.1.13.5 1996/07/31 09:57:12 paire ! 45: * Merged with nmk20b7_shared (1.1.27.2 -> 1.1.27.1) ! 46: * [96/06/10 paire] ! 47: * ! 48: * Revision 1.1.27.2 1996/07/30 15:15:27 ferranti ! 49: * Use virtual memory buffers (io_scatter) for SCSI NORMA ! 50: * clusters. Changed ios_phys_addr field of kkt_sglist ! 51: * struct into ios_address. ! 52: * [1996/07/30 15:12:57 ferranti] ! 53: * ! 54: * Revision 1.1.27.1 1996/05/10 16:38:38 ferranti ! 55: * Modified kkt_sglist_t structure in order to record ! 56: * in the ios_phys_address field both physical memory ! 57: * or virtual memory buffers. The ios_is_phys field ! 58: * making the difference. ! 59: * [1996/05/10 16:24:33 ferranti] ! 60: * ! 61: * Revision 1.1.35.1 1997/06/17 03:00:59 devrcs ! 62: * Activate uid node incarnation. ! 63: * [1996/09/11 20:08:24 watkins] ! 64: * ! 65: * Merge with rt3_merge. ! 66: * [1996/03/25 17:34:47 watkins] ! 67: * ! 68: * Revision 1.1.22.2 1996/03/21 19:16:33 watkins ! 69: * Add kkt channel for rt rpc service. ! 70: * ! 71: * Revision 1.1.13.4 1995/06/13 18:19:47 sjs ! 72: * Merge from flipc_shared. ! 73: * [95/05/22 sjs] ! 74: * ! 75: * Revision 1.1.13.2 1995/05/15 18:08:36 rwd ! 76: * Add CHAN_DEVICE_KT. ! 77: * [95/04/10 rwd] ! 78: * ! 79: * Revision 1.1.10.4 1995/01/06 15:39:19 rwd ! 80: * Merged up to dipc_b2 ! 81: * [1995/01/05 20:16:59 rwd] ! 82: * ! 83: * Revision 1.1.10.3 1994/12/12 19:04:43 rwd ! 84: * Merged with changes from 1.1.10.2 ! 85: * [1994/12/12 19:03:29 rwd] ! 86: * ! 87: * Define KKT_MIN_ERRNO and KKT_MAX_ERRNO. ! 88: * [94/12/12 rwd] ! 89: * ! 90: * Revision 1.1.10.2 1994/12/12 17:46:32 randys ! 91: * Added channel for use by FLIPC ! 92: * [1994/12/12 05:14:58 randys] ! 93: * ! 94: * Revision 1.1.10.1 1994/12/09 15:46:33 rwd ! 95: * Pulled from dipc2_shared ! 96: * [1994/12/08 18:52:39 rwd] ! 97: * ! 98: * Revision 1.1.6.9 1994/12/06 20:12:58 alanl ! 99: * Add KKT_NODE_SELF and KKT_NODE_IS_VALID prototypes. ! 100: * [94/12/05 rwd] ! 101: * ! 102: * Revision 1.1.6.10 1994/12/27 21:10:02 mmp ! 103: * Add thread_context arg to kkt callback typedef. ! 104: * [1994/12/24 03:25:04 mmp] ! 105: * ! 106: * Revision 1.1.6.9 1994/12/06 20:12:58 alanl ! 107: * Add KKT_NODE_SELF and KKT_NODE_IS_VALID prototypes. ! 108: * [94/12/05 rwd] ! 109: * ! 110: * Revision 1.1.6.8 1994/11/09 03:42:14 alanl ! 111: * DIPC and KKT restructuring for transports that provide ! 112: * their own threads. (w/travos) ! 113: * [94/11/02 alanl] ! 114: * ! 115: * Revision 1.1.6.7 1994/10/28 18:59:42 rwd ! 116: * Add kkt_bootstrap_init prototype. ! 117: * [94/10/28 rwd] ! 118: * ! 119: * Revision 1.1.6.6 1994/10/05 22:09:09 alanl ! 120: * Revamped implementation error code and specification until they ! 121: * are largely in agreement. ! 122: * [94/10/05 alanl] ! 123: * ! 124: * Rationalized KKT_HANDLE_ABORT error passing conventions. ! 125: * Callbacks always receive KKT_SUCCESS, KKT_ABORT or a KKT ! 126: * transport error. Handles have an opaque error argument ! 127: * recording the "reason" supplied by the caller of ! 128: * KKT_HANDLE_ABORT. The caller's error space thus does not ! 129: * conflict with the KKT error space. ! 130: * [94/10/03 alanl] ! 131: * ! 132: * Revision 1.1.6.5 1994/09/29 13:34:40 rwd ! 133: * Remove unncessary receiver argument from KKT_HANDLE_ABORT. ! 134: * [94/09/29 rwd] ! 135: * ! 136: * Revision 1.1.6.4 1994/09/28 15:55:05 alanl ! 137: * Defined new error codes, KKT_ENDPOINT_DEAD and ! 138: * KKT_MKMSG_DESTROYED, to use in conjunction with ! 139: * KKT_HANDLE_ABORT. Because ABORT invokes callbacks and ! 140: * supplies them with a "reason" argument, callbacks must ! 141: * use the same error code space that contains KKT_SUCCESS. ! 142: * [94/09/23 alanl] ! 143: * ! 144: * Revision 1.1.6.3 1994/08/11 14:43:23 rwd ! 145: * Prototype pointers to functions. ! 146: * [94/08/09 rwd] ! 147: * ! 148: * Revision 1.1.6.2 1994/08/05 19:42:32 mmp ! 149: * Added new scatter/gather bit to interface ! 150: * [94/07/22 rwd] ! 151: * ! 152: * Revision 1.1.6.1 1994/08/04 02:27:42 mmp ! 153: * Brought forward from dipc_shared. ! 154: * [1994/08/03 20:38:49 mmp] ! 155: * ! 156: * Revision 1.1.2.14 1994/07/18 19:25:31 rwd ! 157: * Merged with changes from 1.1.2.13 ! 158: * [1994/07/18 19:24:35 rwd] ! 159: * ! 160: * Fix malloc in KKT_CHANNEL_INIT and KKT_RPC_INIT. Fix KKT_RPC_REPLY. ! 161: * [94/07/08 rwd] ! 162: * ! 163: * Revision 1.1.2.13 1994/07/13 20:19:59 sjs ! 164: * Added new channel for raw testing of transport interfaces. ! 165: * [94/07/13 sjs] ! 166: * ! 167: * Revision 1.1.2.12 1994/07/08 01:58:49 alanl ! 168: * Add prototypes and some comments for ! 169: * KKT interfaces. ! 170: * [1994/07/08 01:56:46 alanl] ! 171: * ! 172: * Revision 1.1.2.11 1994/06/14 13:23:28 rwd ! 173: * Remove typedefs to kkt_types.h ! 174: * [94/06/10 rwd] ! 175: * ! 176: * Revision 1.1.2.10 1994/06/09 14:40:12 rwd ! 177: * Merged with changes from 1.1.2.9 ! 178: * [1994/06/09 14:37:51 rwd] ! 179: * ! 180: * Add comment in #endif ! 181: * [94/06/06 rwd] ! 182: * ! 183: * Revision 1.1.2.9 1994/06/08 15:56:00 sjs ! 184: * Fixed #endif to be ANSII compliant. ! 185: * [94/06/08 sjs] ! 186: * ! 187: * Revision 1.1.2.8 1994/05/20 18:33:38 alanl ! 188: * Added CHAN_DIPC_MIGRATION ! 189: * [94/05/17 rwd] ! 190: * ! 191: * Revision 1.1.2.7 1994/05/17 16:08:08 mmp ! 192: * Added CHAN_DIPC_RPC_INTR. ! 193: * Changed the buf field in struct rpc_buf to buff to match both ! 194: * the spec and the similar field in struct transmit. ! 195: * [1994/05/17 16:07:17 mmp] ! 196: * ! 197: * Revision 1.1.2.6 1994/05/16 20:11:31 sjs ! 198: * Added error codes, new channel designator. ! 199: * [94/05/16 sjs] ! 200: * ! 201: * Revision 1.1.2.5 1994/05/13 16:23:52 sjs ! 202: * Added rpc_buf definitions. ! 203: * [94/05/13 sjs] ! 204: * ! 205: * Revision 1.1.2.4 1994/05/11 18:49:10 mmp ! 206: * added channel_t typedef and channel declarations (moved here from kkt.h). ! 207: * [1994/05/11 18:48:32 mmp] ! 208: * ! 209: * Revision 1.1.2.3 1994/04/29 19:59:26 sjs ! 210: * Merged with changes from 1.1.2.2 ! 211: * [1994/04/29 19:59:05 sjs] ! 212: * ! 213: * Added transmit and endpoint structures, added correct ! 214: * platform specific include file. More error codes. ! 215: * [94/04/13 sjs] ! 216: * ! 217: * Revision 1.1.2.2 1994/04/20 18:44:10 alanl ! 218: * Replace temporary kkt dipc.h with permanent one. ! 219: * File resides in mach/, not dipc/, so the ifdef ! 220: * should refer to MACH instead of DIPC. ! 221: * [1994/04/20 18:31:19 alanl] ! 222: * ! 223: * Revision 1.1.2.1 1994/03/25 14:54:38 sjs ! 224: * Initial revision. ! 225: * [1994/03/25 14:53:43 sjs] ! 226: * ! 227: * $EndLog$ ! 228: */ ! 229: ! 230: /* ! 231: * KKT machine independent request parameters ! 232: */ ! 233: ! 234: #ifndef _DIPC_KKT_REQUEST_H_ ! 235: #define _DIPC_KKT_REQUEST_H_ ! 236: ! 237: #include <mach/mach_types.h> ! 238: #include <mach/error.h> ! 239: #include <mach/boolean.h> ! 240: #include <mach/vm_prot.h> ! 241: #include <kern/assert.h> ! 242: #include <mach_kdb.h> ! 243: #include <mach/kkt_types.h> ! 244: #include <machine/kkt.h> ! 245: #include <device/io_scatter.h> ! 246: ! 247: ! 248: /* ! 249: * KKT exports an SPL level at which callbacks will happen ! 250: * from KKT to a client. The client needs to know this ! 251: * level for synchronizing access to data structures shared ! 252: * between callbacks and thread context operations. ! 253: * ! 254: * This spl level is referred to as splkkt, and may be ! 255: * used in the traditional fashion, e.g., ! 256: * s = splkkt(); ! 257: * ... ! 258: * splx(s); ! 259: * ! 260: * The definition comes from machine/kkt.h. ! 261: */ ! 262: ! 263: ! 264: /* ! 265: * A transport request comes in two pieces: half of it is a ! 266: * type designator, and half of it is the status of the ! 267: * operation (and may be unnecessary, let's see). ! 268: */ ! 269: typedef struct transport_request { ! 270: short type; ! 271: short status; ! 272: } tran_req; ! 273: ! 274: /* ! 275: * Valid transport request types ! 276: */ ! 277: #define REQUEST_SEND 0x001 ! 278: #define REQUEST_RECV 0x002 ! 279: #define REQUEST_COMMANDS (REQUEST_SEND|REQUEST_RECV) ! 280: #define REQUEST_SG 0x100 ! 281: ! 282: typedef io_scatter_t kkt_sglist_t; ! 283: ! 284: /* ! 285: * Primary request block. Allocated by the user and handed to ! 286: * KKT_REQUEST. ! 287: */ ! 288: typedef struct request_block *request_block_t; ! 289: typedef unsigned int request_t; ! 290: typedef kern_return_t kkt_return_t; ! 291: typedef unsigned int channel_t; ! 292: ! 293: ! 294: typedef void (*kkt_callback_t)( ! 295: kkt_return_t, ! 296: handle_t, ! 297: request_block_t, ! 298: boolean_t); ! 299: ! 300: ! 301: struct request_block { ! 302: unsigned int request_type; ! 303: union { ! 304: vm_offset_t address; ! 305: kkt_sglist_t list; ! 306: } data; ! 307: vm_size_t data_length; ! 308: kkt_callback_t callback; ! 309: unsigned int args[2]; ! 310: request_block_t next; ! 311: transport_t transport; ! 312: }; ! 313: ! 314: #define NULL_REQUEST (request_block_t)0 ! 315: ! 316: /* ! 317: * Error codes ! 318: */ ! 319: #define KKTSUB 9 ! 320: #define KKTERR(errno) (err_kern | err_sub(KKTSUB) | errno) ! 321: ! 322: #define KKT_MIN_ERRNO KKTERR(0) /* MIN ERRNO */ ! 323: #define KKT_SUCCESS KKTERR(0) /* operation succeeded */ ! 324: #define KKT_DATA_RECEIVED KKTERR(1) /* data received immediately, ! 325: ...no callback forthcoming */ ! 326: #define KKT_DATA_SENT KKTERR(2) /* data sent immediately, no ! 327: ...callback forthcoming */ ! 328: #define KKT_ERROR KKTERR(3) /* vague: probably a lower-level ! 329: ...transport error */ ! 330: #define KKT_ABORT KKTERR(4) /* operation was aborted, handle ! 331: ...has aborted or is aborting */ ! 332: #define KKT_INVALID_ARGUMENT KKTERR(5) /* bad argument or range error */ ! 333: #define KKT_INVALID_HANDLE KKTERR(6) /* illegal handle value */ ! 334: #define KKT_NODE_DOWN KKTERR(7) /* can't reach node */ ! 335: #define KKT_RESOURCE_SHORTAGE KKTERR(8) /* requested or required resource ! 336: ...can't be allocated */ ! 337: #define KKT_NODE_PRESENT KKTERR(9) /* node already in map */ ! 338: #define KKT_MAP_EMPTY KKTERR(10) /* no nodes left in map */ ! 339: #define KKT_INVALID_REQUEST KKTERR(11) /* illegal operation requested */ ! 340: #define KKT_RELEASE KKTERR(12) /* resources no longer in use, ! 341: ...caller can free at will */ ! 342: #define KKT_INVALID_CHANNEL KKTERR(13) /* illegal channel specifier */ ! 343: #define KKT_HANDLE_BUSY KKTERR(14) /* connection is active */ ! 344: #define KKT_HANDLE_UNUSED KKTERR(15) /* handle is unconnected */ ! 345: #define KKT_HANDLE_MIGRATED KKTERR(16) /* handle already migrated */ ! 346: #define KKT_CHANNEL_IN_USE KKTERR(17) /* channel already exists */ ! 347: #define KKT_HANDLE_TYPE KKTERR(18) /* handle is of wrong type, ! 348: ...possibly aborted */ ! 349: #define KKT_INVALID_NODE KKTERR(19) /* no such node */ ! 350: #define KKT_MAX_ERRNO KKTERR(19) /* MAX ERRNO */ ! 351: ! 352: ! 353: struct rpc_buf { ! 354: unsigned int *ulink; /* user available field */ ! 355: handle_t handle; /* RPC handle */ ! 356: unsigned int buff[1]; /* variable sized buffer */ ! 357: }; ! 358: ! 359: typedef struct rpc_buf *rpc_buf_t; ! 360: ! 361: /* channel declarations */ ! 362: #define CHAN_KKT 0 /* KKT internal channel */ ! 363: #define CHAN_USER_KMSG 1 /* user kmsg channel */ ! 364: #define CHAN_DIPC_RPC 2 /* dipc rpc, thread delivery */ ! 365: #define CHAN_DIPC_RPC_INTR 3 /* dipc rpc, interrupt delivery */ ! 366: #define CHAN_TEST_KMSG 4 /* kkt test channel */ ! 367: #define CHAN_TEST_RPC 5 /* kkt rpc test channel */ ! 368: #define CHAN_DIPC_MIGRATION 6 /* dipc migration threads */ ! 369: #define CHAN_RESERVE_TEST 7 /* Raw RPC/RDMA testing */ ! 370: #define CHAN_FLIPC 8 /* FLIPC channel */ ! 371: #define CHAN_DEVICE_KT 9 /* KKT "kt" ethernet device */ ! 372: #define CHAN_MACH_RPC 10 /* mach rpc service */ ! 373: ! 374: /* ! 375: * KKT properties. This is configuration information ! 376: * exported from KKT at run-time. ! 377: */ ! 378: typedef enum kkt_upcall { ! 379: KKT_THREAD_UPCALLS, /* all upcalls happen in thread context */ ! 380: KKT_INTERRUPT_UPCALLS, /* all upcalls happen in interrupt context */ ! 381: KKT_MIXED_UPCALLS /* upcalls can happen in EITHER context */ ! 382: } kkt_upcall_t; ! 383: ! 384: typedef struct kkt_properties { ! 385: /* ! 386: * How does KKT invoke client services during upcalls? ! 387: */ ! 388: kkt_upcall_t kkt_upcall_methods; ! 389: /* ! 390: * Total number of *usable* bytes that a client can ! 391: * fit into an inline KKT buffer during an RPC. ! 392: * When sending data via KKT_SEND_CONNECT, KKT may ! 393: * be able to optimize the send by cramming the ! 394: * inline data into an RPC buffer (but specifying ! 395: * larger amounts of inline data still works). ! 396: */ ! 397: vm_size_t kkt_buffer_size; ! 398: } kkt_properties_t; ! 399: ! 400: ! 401: /* ! 402: * KKT interfaces. ! 403: * ! 404: * Refer to the document, "Kernel to Kernel Transport Interface ! 405: * for the Mach Kernel", Open Software Foundation Research ! 406: * Institute, 1994. ! 407: */ ! 408: ! 409: typedef void (*kkt_channel_deliver_t)(channel_t, handle_t, endpoint_t *, ! 410: vm_size_t, boolean_t, boolean_t); ! 411: typedef void (*kkt_rpc_deliver_t)(channel_t, rpc_buf_t, boolean_t); ! 412: typedef void *(*kkt_malloc_t)(channel_t, vm_size_t); ! 413: typedef void (*kkt_free_t)(channel_t, vm_offset_t, vm_size_t); ! 414: typedef void (*kkt_error_t)(kkt_return_t, handle_t, request_block_t); ! 415: ! 416: void kkt_bootstrap_init(void); ! 417: ! 418: /* ! 419: * Set up a general communications path, called a ! 420: * channel, which has a defined set of resources ! 421: * and operations. The resources include buffers ! 422: * for sending and receiving operations. The ! 423: * operations include upcalls from KKT to the ! 424: * client code. ! 425: * ! 426: * Individual communications endpoints, or handles, ! 427: * are allocated in the context of a channel. ! 428: * ! 429: * channel identifier specified by caller ! 430: * ("channel name") ! 431: * senders number of sending buffers ! 432: * receivers number of receiving buffers ! 433: * (*deliver)() upcall for incoming data ! 434: * (*malloc)() upcall when KKT needs memory ! 435: * (*free)() upcall to free (*malloc)()'d memory ! 436: */ ! 437: kkt_return_t KKT_CHANNEL_INIT( ! 438: channel_t channel, ! 439: unsigned int senders, ! 440: unsigned int receivers, ! 441: kkt_channel_deliver_t deliver, ! 442: kkt_malloc_t malloc, ! 443: kkt_free_t free); ! 444: ! 445: /* ! 446: * Allocate a handle within a channel. A handle ! 447: * is a connection endpoint; both receiver and ! 448: * sender must have a handle in order to communicate. ! 449: * A handle is not associated with a node at this time. ! 450: * Requesting a handle may be thought of as requesting ! 451: * a class of service -- and possibly having to wait ! 452: * until resources become available. ! 453: * ! 454: * channel channel name ! 455: * uhandle handle returned from KKT to caller ! 456: * (*error)() upcall if transmission error encountered ! 457: * wait TRUE=block awaiting handle availability ! 458: * must_request TRUE=data flows only on receiver request ! 459: * (i.e., receiver-pull); FALSE=transport ! 460: * may optimize (possibly do sender-push) ! 461: */ ! 462: kkt_return_t KKT_HANDLE_ALLOC( ! 463: channel_t channel, ! 464: handle_t *uhandle, ! 465: kkt_error_t error, ! 466: boolean_t wait, ! 467: boolean_t must_request); ! 468: ! 469: /* ! 470: * Free up a handle. ! 471: */ ! 472: kkt_return_t KKT_HANDLE_FREE( ! 473: handle_t handle); ! 474: ! 475: /* ! 476: * Initiate arbitrary-length kernel-to-kernel ! 477: * data transfer. The sender blocks until the ! 478: * receiver responds. This call causes a (*deliver)() ! 479: * upcall on the receiver's channel. ! 480: * ! 481: * handle KKT-level communications endpoint ! 482: * node destination for data ! 483: * endpoint client-code's communications endpoint ! 484: * request initial data to move ! 485: * more hint as to whether more data will follow ! 486: * *ret return values from KKT_CONNECT_REPLY ! 487: */ ! 488: kkt_return_t KKT_SEND_CONNECT( ! 489: handle_t handle, ! 490: node_name node, ! 491: endpoint_t *endpoint, ! 492: request_block_t request, ! 493: boolean_t more, ! 494: kern_return_t *ret); ! 495: ! 496: /* ! 497: * Respond to KKT_SEND_CONNECT. ! 498: * ! 499: * handle KKT handle ! 500: * status user-defined success/error indicator ! 501: * substatus user-defined success/error indicator ! 502: */ ! 503: kkt_return_t KKT_CONNECT_REPLY( ! 504: handle_t handle, ! 505: kern_return_t status, ! 506: kern_return_t substatus); ! 507: ! 508: /* ! 509: * Enqueue a request block on the handle. Initiate ! 510: * transmission if necessary, otherwise, transmit ! 511: * the data when the opportunity arises. ! 512: * ! 513: * handle KKT handle ! 514: * request request block describing data to be transferred ! 515: */ ! 516: kkt_return_t KKT_REQUEST( ! 517: handle_t handle, ! 518: request_block_t request); ! 519: ! 520: /* ! 521: * Copy the entire RPC buffer contents into the ! 522: * caller's buffer. The buffer and size are ! 523: * inferred from the handle; the caller takes ! 524: * responsibility for supplying a region large ! 525: * enough to contain the data to be copied. ! 526: */ ! 527: kkt_return_t KKT_COPYOUT_RECV_BUFFER( ! 528: handle_t handle, ! 529: char *dest); ! 530: ! 531: /* ! 532: * Abort ongoing operations on the specified handle. ! 533: * This need should rarely arise. ! 534: * ! 535: * handle KKT handle ! 536: * reason status information to be supplied to ! 537: * any parties currently involved in a ! 538: * data transfer or otherwise somehow ! 539: * using this handle ! 540: */ ! 541: kkt_return_t KKT_HANDLE_ABORT( ! 542: handle_t handle, ! 543: kern_return_t reason); ! 544: ! 545: /* ! 546: * Obtain status information on a handle. ! 547: * ! 548: * handle KKT handle ! 549: * info Whatever information KKT can ! 550: * supply about a handle ! 551: */ ! 552: kkt_return_t KKT_HANDLE_INFO( ! 553: handle_t handle, ! 554: handle_info_t info); ! 555: ! 556: /* ! 557: * Move the state associated with old_handle on ! 558: * node *node* to new_handle. The new_handle ! 559: * must have already been created as a valid handle ! 560: * prior to invoking this call. ! 561: * ! 562: * node node from which handle is migrating ! 563: * old_handle identifier of handle on node *node* ! 564: * new_handle valid handle on current node ! 565: */ ! 566: kkt_return_t KKT_HANDLE_MIGRATE( ! 567: node_name node, ! 568: int old_handle, ! 569: handle_t new_handle); ! 570: ! 571: /* ! 572: * Allocate a map capable of tracking nodes ! 573: * within a KKT/NORMA domain. This map need ! 574: * not be dense. For instance, an Ethernet- ! 575: * based cluster may use sparse node names ! 576: * based on IP addresses. A node map may be ! 577: * dynamic, i.e., adding a node to a map may ! 578: * require dynamic memory allocation. For ! 579: * this reason, we define a "fallback" map; ! 580: * such a map is allocated with sufficient ! 581: * resources to track every node in the domain. ! 582: * (A fallback map is necessary when a node is ! 583: * very low on memory and has no other way to ! 584: * remember what is going on.) ! 585: * ! 586: * map pointer to a map created by KKT ! 587: * full TRUE=caller requests creation of ! 588: * a fallback map ! 589: */ ! 590: kkt_return_t KKT_MAP_ALLOC( ! 591: node_map_t *map, ! 592: boolean_t full); ! 593: ! 594: /* ! 595: * Destroy a map. The map need not be empty. ! 596: * There is no concept of a reference-counted ! 597: * map, so destruction takes place immediately. ! 598: */ ! 599: kkt_return_t KKT_MAP_FREE( ! 600: node_map_t map); ! 601: ! 602: /* ! 603: * Add a node to a map. This call may block ! 604: * for memory allocation unless the map is ! 605: * known to be a fallback map. ! 606: * ! 607: * map KKT node map ! 608: * node node to add to map (returns ! 609: * error if node already in map) ! 610: */ ! 611: kkt_return_t KKT_ADD_NODE( ! 612: node_map_t map, ! 613: node_name node); ! 614: ! 615: /* ! 616: * Remove the next node from a map. The caller ! 617: * does not specify the node to be removed; ! 618: * rather, KKT returns the node_name of the ! 619: * next node in the map. ! 620: * ! 621: * map KKT node map ! 622: * node name of node removed from map ! 623: */ ! 624: kkt_return_t KKT_REMOVE_NODE( ! 625: node_map_t map, ! 626: node_name *node); ! 627: ! 628: kkt_return_t KKT_RPC_INIT( ! 629: channel_t channel, ! 630: unsigned int senders, ! 631: unsigned int receivers, ! 632: kkt_rpc_deliver_t deliver, ! 633: kkt_malloc_t malloc, ! 634: kkt_free_t free, ! 635: unsigned int max_send_size); ! 636: ! 637: kkt_return_t KKT_RPC_HANDLE_ALLOC( ! 638: channel_t channel, ! 639: handle_t *uhandle, ! 640: vm_size_t size); ! 641: ! 642: kkt_return_t KKT_RPC_HANDLE_BUF( ! 643: handle_t handle, ! 644: void **userbuf); ! 645: ! 646: kkt_return_t KKT_RPC_HANDLE_FREE( ! 647: handle_t handle); ! 648: ! 649: kkt_return_t KKT_RPC( ! 650: node_name node, ! 651: handle_t handle); ! 652: ! 653: kkt_return_t KKT_RPC_REPLY( ! 654: handle_t handle); ! 655: ! 656: kkt_return_t KKT_PROPERTIES( ! 657: kkt_properties_t *prop); ! 658: ! 659: node_name KKT_NODE_SELF(void); ! 660: ! 661: boolean_t KKT_NODE_IS_VALID(node_name node); ! 662: ! 663: kkt_return_t KKT_NODE_INCARN(node_name node, unsigned int *incarn); ! 664: ! 665: #endif /* _DIPC_KKT_REQUEST_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.