-- PacketExchange.mesa (last edited by: BLyon on: January 20, 1981 3:00 PM)

DIRECTORY
Environment USING [Block],
OISCPTypes USING [ExchangeClientType, ExchangeID, maxDataBytePerExchange, WaitTime],
SpecialSystem USING [SocketNumber],
System USING [NetworkAddress];

PacketExchange: DEFINITIONS =
BEGIN

-- The Packet Exchange Protocol is a request/reply protocol that provides a little more
-- reliability than raw packets transmitetd from a socket, and less reliabilty than the
-- Sequenced Packet Protocol. Usually one end will provide some service at a
-- well known socket or at a network address that is available through a binding
-- process involving the Clearinghouse. The other end acquires a socket and sends a
-- request. The request will be retransmitted a number of times with the interval
-- between retransmissions based on the delay to the remote entity.

-- definitions
-- types and constants.
ExchangeHandle: TYPE [2];
RequestHandle: TYPE = LONG POINTER TO RequestObject;
-- returned by WaitForRequest
RequestObject: TYPE = RECORD [
nBytes: CARDINAL,
-- the byte size of the request Block
requestType: OISCPTypes.ExchangeClientType,

-- the next to fields are used in the reply; clients should not touch these.

requestersExchangeID: PRIVATE OISCPTypes.ExchangeID,
requestersAddress: PRIVATE System.NetworkAddress];

maxBlockLength: CARDINAL = OISCPTypes.maxDataBytePerExchange;
-- in bytes
ErrorReason: TYPE = {
blockTooBig, blockTooSmall, noDestinationSocket,
noRouteToDestination, hardwareProblem, aborted, timeout};
defaultWaitTime: OISCPTypes.WaitTime = 60000;
-- in msecs

-- interface
-- errors and signals
Error: ERROR [why: ErrorReason];
Timeout: SIGNAL; -- this may be RESUMEd

-- procedures
-- the requestor
CreateRequestor: PROCEDURE [waitTime: OISCPTypes.WaitTime ← defaultWaitTime] RETURNS [ExchangeHandle]; -- at any socket number

SendRequest
: PUBLIC PROCEDURE [h: ExchangeHandle, remote: System.NetworkAddress,
requestBlk, replyBlk: Environment.Block,
requestType: OISCPTypes.ExchangeClientType ← unspecified]
RETURNS [nBytes: CARDINAL, replyType: OISCPTypes.ExchangeClientType];

-- the replyer
CreateReplyer: PROCEDURE [localSocket: SpecialSystem.SocketNumber,
requestCount: CARDINAL ← 1
, waitTime: OISCPTypes.WaitTime ← defaultWaitTime]
RETURNS [
ExchangeHandle]; -- requestCount is estimate of number of "to be queued" requests

-- user must save rH inorder to send a reply
WaitForRequest: PROCEDURE [h: ExchangeHandle, requestBlk: Environment.Block,
requiredRequestType: OISCPTypes.ExchangeClientType ← unspecified]
RETURNS [rH: RequestHandle];

-- upon success return of SendReply, rH is invalid.

SendReply: PUBLIC PROCEDURE [h: ExchangeHandle, rH: RequestHandle, replyBlk: Environment.Block, replyType: OISCPTypes.ExchangeClientType ← unspecified];

-- request and reply can both point to the same piece of storage.
Delete: PROCEDURE [h: ExchangeHandle];
SetWaitTime: PROCEDURE [h: ExchangeHandle, waitTime: OISCPTypes.WaitTime];
END.

LOG

Time: October 23, 1980 1:50 PM By: Dalal Action: created file.
Time: January 13, 1981 5:01 PM By: BLyon Action: moved file to Pilot Communication.