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, maxTransmissions: CARDINAL _ 0, timeoutEnable: TimeoutEnable _ dontCare ]; TimeoutEnable: TYPE = { dontCare, always, never }; 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, 1986 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 Swinehart, November 24, 1986 7:44:54 am PST ******** 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 ******** Can be set through RPCTimeouts.SetMaxTransmissions[] to override the standard maximum number of unacknowledged packet retransmissions before timing out. Some calls must complete quickly or are best abandoned. If 0, the standard value is used. Can be set through RPCTimeouts.SetMaxTransmissions[] to override the determination of whether unacknowledged packet retransmissions are ever timed out. When distributed systems are being developed, sometimes they are unresponsive for long periods of time. always means that timeouts will raise an error signal. never means that RPC will try forever to complete the call. If dontCare, the standard value is used. 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. ส˜headšœ™Icodešœ ฯmœ7™B—šœ™Jšœ*™*L™+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˜'Jšœ˜—Jšœžœ˜2J˜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˜—…—ธๅ