-- RPC: Internal interface -- RPCInternal.mesa -- Andrew Birrell March 10, 1983 12:28 pm DIRECTORY BufferDefs USING[ PupBuffer ], DESFace USING[ IV, Key ], MesaRPC USING[ Conversation, InterfaceName, Principal, SecurityLevel, VersionRange ], RPCLupine USING[ DataLength, Dispatcher, RPCPkt], RPCPkt USING[ CallCount, ConnectionID, ConversationID, DispatcherDetails, DispatcherID, ExportHandle, Header, PktConversationID, PktID, Machine]; RPCInternal: DEFINITIONS = BEGIN -- ******** Modules for start-up sequence. Main control is RPCPktIO ******** -- RPCBinding: PROGRAM; RPCSecurity: PROGRAM; RPCPktStreams: PROGRAM; -- ******** Binding: exported by RPCBinding ******** -- ExportInstance: TYPE = RECORD[ -- Exporter's record of exported interface -- id: RPCPkt.DispatcherID, dispatcher: RPCLupine.Dispatcher, mds: CARDINAL, name: MesaRPC.InterfaceName, stubProtocol: MesaRPC.VersionRange ]; ExportTable: TYPE = RECORD[ used: CARDINAL, entries: SEQUENCE length: RPCPkt.ExportHandle OF ExportInstance]; exportTable: LONG POINTER TO ExportTable; ImportInstance: TYPE = RECORD[ -- Importer's record of successful binding -- host: RPCPkt.Machine, dispatcher: RPCPkt.DispatcherDetails ]; -- ******** Authentication/Security: exported by RPCSecurity ******** -- ConversationObject: TYPE = RECORD[ next: LONG POINTER TO ConversationObject, id: RPCPkt.ConversationID, level: MesaRPC.SecurityLevel, key: DESFace.Key, -- conversation key -- iv: DESFace.IV, originator: MesaRPC.Principal, responder: MesaRPC.Principal, authenticator: LONG DESCRIPTOR FOR ARRAY OF WORD]; firstConversation: RPCPkt.PktConversationID; -- for unencrypted conversations -- EncryptPkt: PROC[pkt: RPCLupine.RPCPkt, l: RPCLupine.DataLength] RETURNS[CARDINAL]; -- Encrypts packet using pkt.convHandle; "l" is data length of pkt; -- Returns Pup length of packet. -- DecryptPkt: PROC[header: LONG POINTER TO RPCPkt.Header, convHandle: MesaRPC.Conversation] RETURNS[ok: BOOLEAN, l: RPCLupine.DataLength]; -- Decrypts packet using pkt.convHandle; ok iff checksum matches; -- Returns data length of packet -- GetConnectionState: PROC[ decrypted: BOOLEAN, callPkt: RPCLupine.RPCPkt] RETURNS[ ok: BOOLEAN, id: RPCPkt.ConnectionID, call: RPCPkt.CallCount, conv: MesaRPC.Conversation, l: RPCLupine.DataLength ]; -- On entry, packet is decrypted iff "decrypted". -- On exit, packet is decrypted if "ok". -- If "ok" and not "decrypted", returns pkt data length in "l". -- Sends RFA and accepts response; results valid iff "ok" -- ReplyToRFA: PROC[b: BufferDefs.PupBuffer,-- incoming packet -- callHeader: LONG POINTER TO RPCPkt.Header, -- encrypted -- callPktID: RPCPkt.PktID-- clear --, convHandle: MesaRPC.Conversation] RETURNS[BOOLEAN]; -- Generates RFA response packet if request matches thisPktID -- -- ******** Packet stream functions: exported by RPCPktStream ******** -- DoSignal: PROC[b: BufferDefs.PupBuffer, pktLength: RPCLupine.DataLength, signalHandler: RPCLupine.Dispatcher, convHandle: MesaRPC.Conversation] RETURNS[resumePkt: RPCLupine.RPCPkt, resumeLength: RPCLupine.DataLength, myLocalFrame: POINTER]; -- Called from inside PktExchange to handle signal-back packets -- ServerMain: PROCEDURE; -- FORK'ed when needed by RPCPktIO, to maintain an adequate stock of them -- END. Ę—˜Jš¸Īcœœ,œĪk œ žœžœžœžœ\žœ,žœ¤ž œžœPœžœžœžœ8œžœžœ-œhžœgžœžœžœžœžœ žœžœžœžœžœ-œNHœžœžœžœžœžœœžœgžœž œžœžœžœžœ1#œĪn œžœ3žœžœDœ#œŸ œžœ žœžœžœ;žœžœBœ#œŸœžœ žœ9žœžœ‘2œ)œ@œ<œŸ œžœœžœžœžœœ) œ1žœžœ@œIœŸœžœ žœgžœBœŸ œž œLœžœ˜ũ—…—€