DIRECTORY
BufferDefs USING [BufferAccessHandle, GetFreeBuffer, SppBuffer],
OISCPTypes USING [bytesPerPktHeader, bytesPerLevel2SppHeader, ConnectionID],
NetworkStream USING [defaultWaitTime, FailureReason, SuspendReason, WaitTime, ClassOfService],
NSAddress USING [NetworkAddress];
PacketStream:
DEFINITIONS
IMPORTS BufferDefs =
BEGIN
definitions
Handle: TYPE = POINTER TO Object;
Object:
TYPE =
RECORD [
pool: BufferDefs.BufferAccessHandle,
put: PROCEDURE [BufferDefs.SppBuffer],
get: PROCEDURE RETURNS [BufferDefs.SppBuffer],
waitForAttention: PROCEDURE RETURNS [BufferDefs.SppBuffer],
setWaitTime: PROCEDURE [WaitTime],
findAddresses: PROCEDURE RETURNS [local, remote: NSAddress.NetworkAddress],
getSenderSizeLimit: PROCEDURE RETURNS [CARDINAL],
returnGetSppDataBuffer: PROCEDURE [BufferDefs.SppBuffer]];
Byte: TYPE = [0..256);
bytesPerSequencedPktHeader:
CARDINAL =
OISCPTypes.bytesPerLevel2SppHeader + OISCPTypes.bytesPerPktHeader;
WaitTime: TYPE = NetworkStream.WaitTime;
ClassOfService: TYPE = NetworkStream.ClassOfService;
defaultWaitTime: WaitTime = NetworkStream.defaultWaitTime;
infiniteWaitTime: READONLY WaitTime;
State:
TYPE = {
unestablished, activeEstablish, waitEstablish, established, open, terminating,
suspended};
SuspendReason: TYPE = NetworkStream.SuspendReason;
FailureReason: TYPE = NetworkStream.FailureReason;
interface
exported by PacketStreamMgr
Make:
PROCEDURE [
local, remote: NSAddress.NetworkAddress, localConnID, remoteConnID:
OISCPTypes.ConnectionID, establishConnection: BOOLEAN,
timeout: WaitTime ← defaultWaitTime, classOfService: ClassOfService]
RETURNS [Handle];
Destroy: PROCEDURE [Handle];
these are INLINEs in order to make call Pilot procedure calls similar in style.
Put:
PROCEDURE [psH: Handle, b: BufferDefs.SppBuffer] =
INLINE
BEGIN psH.put[b]; END;
Get:
PROCEDURE [psH: Handle]
RETURNS [BufferDefs.SppBuffer] =
INLINE
BEGIN RETURN[psH.get[]]; END;
WaitForAttention:
PROCEDURE [psH: Handle]
RETURNS [BufferDefs.SppBuffer] =
INLINE
BEGIN RETURN[psH.waitForAttention[]]; END;
SetWaitTime:
PROCEDURE [psH: Handle, time: WaitTime] =
INLINE
BEGIN psH.setWaitTime[time]; END;
FindAddresses:
PROCEDURE [psH: Handle]
RETURNS [local, remote: NSAddress.NetworkAddress] = INLINE
BEGIN [local, remote] ← psH.findAddresses[]; END;
GetSendSppBuffer:
PROCEDURE [psH: Handle]
RETURNS [BufferDefs.SppBuffer] =
INLINE {
RETURN[LOOPHOLE[BufferDefs.GetFreeBuffer[oisSpp, psH.pool, send], BufferDefs.SppBuffer]]};
GetSenderSizeLimit:
PROCEDURE [psH: Handle]
RETURNS [
CARDINAL] =
INLINE
BEGIN RETURN[psH.getSenderSizeLimit[]]; END;
ReturnGetSppDataBuffer:
PROCEDURE [psH: Handle, b: BufferDefs.SppBuffer] =
INLINE
BEGIN psH.returnGetSppDataBuffer[b]; END;
connection table routines
InsertIntoConnectionTable:
PROCEDURE [
remote: NSAddress.NetworkAddress, remoteConnID: OISCPTypes.ConnectionID];
RemoveFromConnectionTable:
PROCEDURE [
remote: NSAddress.NetworkAddress, remoteConnID: OISCPTypes.ConnectionID];
ConnectionAlreadyThere:
PROCEDURE [
remote: NSAddress.NetworkAddress, remoteConnID: OISCPTypes.ConnectionID] RETURNS [BOOLEAN];
errors and signals
ConnectionSuspended: ERROR [why: SuspendReason];
ConnectionFailed: SIGNAL [why: FailureReason];
END.