-- PacketExchangeInternal.mesa (last edited by: BLyon on: January 20, 1981  2:50 PM)

DIRECTORY
  BufferDefs USING [OisBuffer],
  OISCP USING [ReturnFreeOisBuffer],
  OISCPTypes USING [ExchangeClientType, WaitTime],
  PacketExchange USING [defaultWaitTime, ExchangeHandle],
  SpecialSystem USING [SocketNumber];

PacketExchangeInternal: DEFINITIONS IMPORTS OISCP =
  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.

  -- procedures
  Create: PROCEDURE [
    localSocket: SpecialSystem.SocketNumber, receiveRequestCount: CARDINAL ← 1,
    privateBuffers: BOOLEAN ← TRUE,
    waitTime: OISCPTypes.WaitTime ← PacketExchange.defaultWaitTime]
    RETURNS [PacketExchange.ExchangeHandle];
  -- receiveRequestCount is estimate of number of "to be queued" requests;  privateBuffers TRUE mean the buffers will be allocated, FALSE mean buffer will be shared with the system buffer pool.

  CreateTypicalServer: PROCEDURE [
    localSocket: SpecialSystem.SocketNumber, privateBuffers: BOOLEAN ← FALSE]
    RETURNS [PacketExchange.ExchangeHandle] = INLINE {
    RETURN[Create[localSocket, 2, privateBuffers]]};

  CreateTypicalUser: PROCEDURE [localSocket: SpecialSystem.SocketNumber]
    RETURNS [PacketExchange.ExchangeHandle] = INLINE {
    RETURN[Create[localSocket, 1, TRUE]]};

  Delete: PROCEDURE [PacketExchange.ExchangeHandle];

  -- in SendRequestPacket, user is responsible for requestB and replyB when not NIL;
  -- the user CANNOT depend on the value of requestB.requeueProcedure!!
  SendRequestPacket: PROCEDURE [
    h: PacketExchange.ExchangeHandle, requestB: BufferDefs.OisBuffer,
    replyFilter: OISCPTypes.ExchangeClientType ← unspecified]
    RETURNS [replyB: BufferDefs.OisBuffer];

  WaitForRequestPacket: PROCEDURE [
    h: PacketExchange.ExchangeHandle,
    request: OISCPTypes.ExchangeClientType ← unspecified]
    RETURNS [requestB: BufferDefs.OisBuffer];

  -- in SendReplyPacket, caller loses ownership of replyB (he can get it back via
  -- replyB.requeueProcedure  
  SendReplyPacket: PROCEDURE [
    h: PacketExchange.ExchangeHandle, replyB: BufferDefs.OisBuffer];

  GetFreeSendPacket: PROCEDURE [h: PacketExchange.ExchangeHandle]
    RETURNS [BufferDefs.OisBuffer];

  ReturnFreeSendPacket: PROCEDURE [b: BufferDefs.OisBuffer] = INLINE {
    OISCP.ReturnFreeOisBuffer[b]};

  END.

LOG

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