DIRECTORY PupBuffer USING [Buffer], DESFace USING [Block, IV, Key], PupWKS USING [rpc], RPC 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 StartRPCBinding: PROC [RPCPkt.Machine]; StartRPCSecurity: PROC [RPCPkt.Machine]; StartRPCPktStreams: PROC [RPCPkt.Machine]; RollbackRPCBinding: PROC; RollbackRPCSecurity: PROC; RollbackRPCPktStreams: PROC; ExportInstance: TYPE = RECORD[ id: RPCPkt.DispatcherID, dispatcher: RPCLupine.Dispatcher, name: RPC.InterfaceName, stubProtocol: RPC.VersionRange ]; ExportTable: TYPE = RECORD[ used: CARDINAL, entries: SEQUENCE length: RPCPkt.ExportHandle OF ExportInstance]; exportTable: REF ExportTable; ImportInstance: TYPE = RECORD[ host: RPCPkt.Machine, dispatcher: RPCPkt.DispatcherDetails ]; ConversationObject: TYPE = RECORD[ next: REF ConversationObject, id: RPCPkt.ConversationID, level: RPC.SecurityLevel, key: DESFace.Key, -- conversation key -- iv: DESFace.IV, originator: RPC.Principal, responder: RPC.Principal, authenticator: Authenticator]; Authenticator: TYPE = REF AuthenticatorObject; AuthenticatorObject: TYPE = RECORD[ SEQUENCE nBlks: CARDINAL OF DESFace.Block ]; firstConversation: RPCPkt.PktConversationID; -- for unencrypted conversations -- EncryptPkt: PROC[pkt: RPCLupine.RPCPkt, l: RPCLupine.DataLength] RETURNS[CARDINAL]; DecryptPkt: PROC[header: LONG POINTER TO RPCPkt.Header, convHandle: RPC.Conversation] RETURNS[ok: BOOLEAN, l: RPCLupine.DataLength]; GetConnectionState: PROC[ decrypted: BOOLEAN, callPkt: RPCLupine.RPCPkt] RETURNS[ ok: BOOLEAN, id: RPCPkt.ConnectionID, call: RPCPkt.CallCount, conv: RPC.Conversation, l: RPCLupine.DataLength ]; ReplyToRFA: PROC [b: PupBuffer.Buffer,-- incoming packet -- callHeader: LONG POINTER TO RPCPkt.Header, -- encrypted -- callPktID: RPCPkt.PktID-- clear --, convHandle: RPC.Conversation] RETURNS[BOOLEAN]; DoSignal: PROC [b: PupBuffer.Buffer, pktLength: RPCLupine.DataLength, signalHandler: RPCLupine.Dispatcher, convHandle: RPC.Conversation] RETURNS[resumePkt: RPCLupine.RPCPkt, resumeLength: RPCLupine.DataLength, myLocalFrame: POINTER]; ServerMain: PROCEDURE; CopyPrincipal: PROC [from: RPC.Principal, to: LONG POINTER]; EntryGenerate: PROC [ level: RPC.SecurityLevel, iv: DESFace.IV, originator, responder: RPC.Principal, convKey: DESFace.Key, auth: RPCInternal.Authenticator] RETURNS [ conversation: REF RPCInternal.ConversationObject ]; AddToExportTable: PROC [interface: RPC.InterfaceName, dispatcher: RPCLupine.Dispatcher, stubProtocol: RPC.VersionRange] RETURNS [ instance: RPCPkt.ExportHandle ]; AllocBuffer: PROC RETURNS [b: PupBuffer.Buffer]; GiveBackBuffer: PROC [b: PupBuffer.Buffer]; SendBuffer: PROC [b: PupBuffer.Buffer]; pktLengthOverhead: RPCLupine.DataLength = SIZE[RPCPkt.Header] + 1--checksum--; SetupResponse: PROC [header: LONG POINTER TO RPCPkt.Header] = INLINE BEGIN header.destHost _ header.srceHost; header.destSoc _ PupWKS.rpc; header.destPSB _ header.srcePSB; header.outcome _ result; END; PktExchangeState: TYPE = { receiving, sending, call, endCall, authReq }; PktExchange: PROC[inPkt: RPCLupine.RPCPkt, length: RPCLupine.DataLength, maxlength: RPCLupine.DataLength, state: PktExchangeState, signalHandler: RPCLupine.Dispatcher _ NIL] RETURNS[newPkt: BOOLEAN, newLength: RPCLupine.DataLength]; IdleReceive: PROC[pkt: RPCLupine.RPCPkt, maxlength: CARDINAL]; EnqueueAgain: PROC [b: PupBuffer.Buffer]; END. ζRPCInternal.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. RPC: Internal interface Andrew Birrell September 7, 1983 4:12 pm Bob Hagmann February 8, 1985 3:33:38 pm PST Hal Murray, May 12, 1986 11:56:13 am PDT ******** Start-up sequence. Main control is RPCPktIO ******** ******** Binding: exported by RPCBinding ******** Exporter's record of exported interface Importer's record of successful binding ******** Authentication/Security: exported by RPCSecurity ******** Allocated storage for an authenticator. For A talking to B using key CK, contains: {KY}KB, spare, { {CK}KB, spare, time, A }KY . The keys are single cipher blocks. The rest is encrypted with CBC-check using a zero IV Encrypts packet using pkt.convHandle; "l" is data length of pkt; returns Pup length of packet. Decrypts packet using pkt.convHandle; ok iff checksum matches; returns data length of packet 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" Generates RFA response packet if request matches thisPktID ******** Packet stream functions: exported by RPCPktStream ******** Called from inside PktExchange to handle signal-back packets FORK'ed when needed by RPCPktIO, to maintain an adequate stock of them ******** For some Voice kludgery that I don't understand /HGM, Jan 86 ******** ******** For new Communication package /HGM, Jan 86 ******** ******** Moved from RPCPkt /HGM, Apr 86 ******** Difference between RPCLupine.DataLength and transmitted Pup length for unencrypted packets Reliable transmission of given packet, and receipt of next packet; "newLength" is data length of incoming packet, if any. Returns when new packet arrives; "maxlength" is number of words in the pkt buffer starting from pkt.header (total, including all overheads) Dispatches packet to appropriate process; used by idler processes to requeue pkt that had incorrect destPSB. ΚT˜headšœ™Icodešœ Οmœ1™<—šœ™Jšœ*™*L™+L™(—J˜šΟk ˜ Jšœ žœ ˜Jšœžœžœ˜Jšœžœ˜JšœžœF˜PJšœ žœ!˜1Jšœžœ„˜‘J˜—Jšœ ž œ˜J˜Jšž˜J˜Jšœ>™>˜JšΟnœžœ˜'JšŸœžœ˜(JšŸœžœ˜*J˜JšŸœžœ˜JšŸœžœ˜JšŸœžœ˜J˜J˜J˜—Jšœ2™2˜šœžœžœ˜Jšœ'™'J˜J˜!J˜J˜!—J˜šœ žœžœ˜Jšœžœ˜Jšœ žœžœ˜A—J˜Jšœ žœ ˜J˜šœžœžœ˜Jšœ'™'J˜J˜'—J˜J˜J˜—JšœB™B˜šœžœžœ˜"Jšœžœ˜J˜J˜JšœΟc˜(Jšœ žœ˜J˜J˜Jšœ˜—J˜Jšœžœžœ˜.J˜šœžœžœ˜#Jšœ-žœ žœ žœ žœžœ žœžœžœžœAžœž™ΩJšžœžœžœ˜,—J˜Jšœ- #˜PJ˜šŸ œžœ0˜@Jšžœžœ˜Jšœ@ ™^—J˜š Ÿ œžœ žœžœžœ˜7J˜Jšžœžœ˜.Jšœ> ™\—J˜šŸœžœ žœ˜Hšžœžœ˜J˜J˜J˜J˜—Jšœ“ 8™Λ—J˜šŸ œžœ ˜;Jšœ žœžœžœ ˜:Jšœ  œ˜#J˜Jšžœžœ˜Jšœ:™:—J˜J˜J˜—JšœC™C˜šŸœžœ6˜EJ˜$J˜šžœ˜$J˜#Jšœžœ˜—Jšœ<™<—J˜šŸ œž œ˜JšœF™F—J˜J˜—šœN™NJ™Jš Ÿ œžœžœžœžœ˜JšœF E™‹—J˜šŸ œžœ˜)Jšœm™m—L˜J˜—Jšžœ˜J˜—…—<v