RPCPkt.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
RPC: layout of packets
Andrew Birrell September 7, 1983 3:34 pm
Bob Hagmann February 8, 1985 3:32:26 pm PST
Hal Murray, April 14, 1986 8:10:23 pm PST
DIRECTORY
PrincOps USING [PsbIndex],
Pup USING [Host, Net, Socket];
RPCPkt: DEFINITIONS = {
******** Layout of stub-packets ********
Header: TYPE = MACHINE DEPENDENT RECORD[
length (0:0..14): [0..77777B],
oddByte (0:15..15): { no(0), yes(1) },
type (1): PktType,
destPSB (2): PrincOps.PsbIndex,-- field has 6 extra bits
srcePSB (3): PrincOps.PsbIndex,-- field has 6 extra bits
destHost (4): Machine,
destSoc (5): Pup.Socket,
srceHost (7): Machine,
srceSoc (8): Pup.Socket,
end of standard Pup header
conv (10): PktConversationID,
For secure conversations, the remainder of the packet must be encrypted
pktID (12): PktID,
call (16): SELECT OVERLAID * FROM
calling => [
dispatcher (16): DispatcherDetails],
responding => [
outcome (16): Outcome,
fill (17): ARRAY[SIZE[Outcome]..SIZE[DispatcherDetails]) OF WORD],
ENDCASE ];
PktType: TYPE = MACHINE DEPENDENT RECORD[ -- "type" word of a Pup --
transport (0:0..7): [0..255], -- should be zero before sending --
subType (0:8..10): { rpc(3B), (7B) },
eom (0:11..11): { end(0), notEnd(1) },
ack (0:12..12): { dontAck(0), pleaseAck(1) },
class (0:13..15): { call(0), data(1), ack(2), rfa(4), (7) } ];
Mapping from Pup pkt types to RPC pkt types:
140B = [end,  dontAck,  call ]
141B = [end,  dontAck,  data ]
142B = [,   dontAck,  ack ] (also 162B)
143B = unused        (also 163B)
144B = [,   dontAck,  rfa ] (also 164B)
150B = [end,  pleaseAck, call ]
151B = [end,  pleaseAck, data ]
152B = [,   pleaseAck, ack ] (also 172B)
153B = unused        (also 173B)
154B = [,   pleaseAck, rfa ] (also 174B)
160B = [notEnd, dontAck,  call ]
161B = [notEnd, dontAck,  data ]
170B = [notEnd, pleaseAck, call ]
171B = [notEnd, pleaseAck, data ]
Machine: TYPE = MACHINE DEPENDENT RECORD[
Unambiguous name of a host
net: Pup.Net,
host: Pup.Host ];
HostConversationID: TYPE = MACHINE DEPENDENT RECORD[
Host-relative ID of a conversation; unique for all time
ls(0): CARDINAL,
ms(1): [0..77777B] ];
ConversationID: TYPE = RECORD[
Absolute ID of a conversation; unique for all hosts and all time
originator: Machine,
count: HostConversationID];
PktConversationID: TYPE = MACHINE DEPENDENT RECORD[
Same as ConversationID, but abbreviated for within a packet. Assumes originator is always caller or callee
ls(0): CARDINAL,
originator(1:0..0): { caller, callee },
ms(1:1..15): [0..77777B] ];
ConnectionID: TYPE = MACHINE DEPENDENT RECORD[
Uniquely identifies an independent sequence of calls
conv(0): PktConversationID,
caller(2): Machine,
activity(3): PrincOps.PsbIndex ];
CallCount: TYPE = LONG CARDINAL;
[ConnectionID,CallCount] uniquely identifies call for all hosts and time
PktID: TYPE = MACHINE DEPENDENT RECORD[
[ConversationID,PktID] uniquely identifies pkt for all hosts and time.
activity(0): PrincOps.PsbIndex,-- field has 6 extra bits--
callSeq(1): CallCount,
pktSeq(3): CARDINAL ];
Outcome: TYPE = MACHINE DEPENDENT { -- possible responses to call or signal --
result(0), -- normal --
unbound(1), -- dispatcher not known --
signal(2), -- signal propagation --
unwind(3), -- signal is unwinding --
protocol(4), -- stub protocol error detected --
(LAST[CARDINAL]) -- room for expansion? --
};
DispatcherDetails: TYPE = MACHINE DEPENDENT RECORD[
mds: CARDINAL, -- crock
dispatcherID: DispatcherID, -- exporter-relative UID of interface instance
dispatcherHint: ExportHandle]; -- hint to exporter host's export table
DispatcherID: TYPE = LONG CARDINAL;
noDispatcher: DispatcherID = 0;
ExportHandle: TYPE = CARDINAL;
}.