-- File: BufferDefs.Mesa, Last Edit: HGM October 15, 1979 10:39 PM

-- Copyright Xerox Corporation 1979, 1980

DIRECTORY
PupTypes: FROM "PupTypes" USING [
maxDataWordsPerGatewayPup,
Pair, PupAddress, PupErrorCode, PupHostID, PupNetID, PupSocketID, PupType,
RppAddress],
DriverTypes: FROM "DriverTypes" USING [DeviceType, Encapsulation, Seal];


BufferDefs: DEFINITIONS = BEGIN

-- Basic Data TYPEs
Byte: TYPE = [0..377B];

PupAddress: TYPE = PupTypes.PupAddress;
PupHostID: TYPE = PupTypes.PupHostID;
PupNetID: TYPE = PupTypes.PupNetID;
PupSocketID: TYPE = PupTypes.PupSocketID;

RppAddress: TYPE = PupTypes.RppAddress;

-- QUEUE
Queue: TYPE = POINTER TO QueueObject;
QueueObject: TYPE = PRIVATE RECORD [
length: PUBLIC CARDINAL,
first, last: Buffer,
seal: DriverTypes.Seal ];

-- BufferPool
BufferPool: TYPE = POINTER TO BufferPoolObject;
BufferPoolObject: TYPE = PRIVATE MONITORED RECORD [
freeQueue: QueueObject,
seal: DriverTypes.Seal,
freeQueueNotEmpty: CONDITION,
total, reserve, send, recveive: CARDINAL,
dataWordsPerBuffer: CARDINAL,
firstBuffer: Buffer,
bufferSize: BufferSize,
wordsPerBuffer: CARDINAL ];


Enqueue: PROCEDURE [Queue, Buffer];
Dequeue: PROCEDURE [Queue] RETURNS [Buffer];
ExtractFromQueue: PUBLIC PROCEDURE [Queue, Buffer] RETURNS [Buffer];
QueueLength: PROCEDURE [q: Queue] RETURNS [CARDINAL] = INLINE
BEGIN RETURN[q.length]; END;
QueueEmpty: PROCEDURE [q: Queue] RETURNS [BOOLEAN] = INLINE
BEGIN RETURN[q.length=0]; END;
QueueInitialize: PROCEDURE [Queue];
QueueCleanup: PROCEDURE [Queue];


PupBufferObject: TYPE = pup BufferObject;
PupBuffer: TYPE = POINTER TO PupBufferObject;
RppBufferObject: TYPE = rpp BufferObject;
RppBuffer: TYPE = POINTER TO RppBufferObject;


-- From specified BufferPool
BufferPoolMake: PROCEDURE [
pool: BufferPool, numberOfBuffers, dataWordsPerBuffer: CARDINAL];
BufferPoolDestroy: PROCEDURE [BufferPool];
GetBufferFromPool: PROCEDURE [BufferPool] RETURNS [Buffer];
MaybeGetBufferFromPool: PROCEDURE [BufferPool] RETURNS [Buffer];
ReturnBufferToPool: PROCEDURE [BufferPool, Buffer];
BuffersLeftInPool: PROCEDURE [BufferPool] RETURNS [CARDINAL];
EnumerateBuffersInPool: PROCEDURE [BufferPool, PROCEDURE[Buffer]];

-- From SystemPool
GetFreeBuffer: PROCEDURE RETURNS [Buffer];
ReturnFreeBuffer: PROCEDURE [Buffer];
BuffersLeft: PROCEDURE RETURNS [CARDINAL];
EnumerateBuffers: PROCEDURE [PROCEDURE[Buffer]];
AdjustBufferParms: PROCEDURE [bufferPoolSize, bufferSize: CARDINAL];
GetBufferParms: PROCEDURE RETURNS [bufferPoolSize, bufferSize: CARDINAL];

DataWordsPerRawBuffer: PROCEDURE RETURNS [CARDINAL];
DataWordsPerPupBuffer: PROCEDURE RETURNS [CARDINAL];

defaultBufferPoolSize: CARDINAL = 15;
buffersToReserve: CARDINAL = 2;
defaultDataWordsPerBuffer: CARDINAL = PupTypes.maxDataWordsPerGatewayPup;

-- BUFFER
BufferType: TYPE = {raw, pup, rpp, rejected, processed};
BufferSize: TYPE = {big, small, user};

Buffer: TYPE = POINTER TO BufferObject;
BufferObject: TYPE = MACHINE DEPENDENT RECORD [
next: PRIVATE Buffer,
queue: PRIVATE Queue,
pool: PRIVATE BufferPool,
requeueProcedure: PROCEDURE [Buffer],
seal: PRIVATE DriverTypes.Seal,
length: PRIVATE CARDINAL,
network: PRIVATE POINTER, -- DriverDefs.Network
iocbChain: PRIVATE LONG POINTER,
userPtr: PRIVATE LONG POINTER,
userData: PRIVATE LONG POINTER,
userDataLength: PRIVATE CARDINAL,
status: PRIVATE WORD,
time: PRIVATE LONG INTEGER,
tries: PRIVATE CARDINAL,
allNets: PRIVATE BOOLEAN,
bypassZeroNet: PRIVATE BOOLEAN,
device: PRIVATE DriverTypes.DeviceType,
type: BufferType,
size: BufferSize,
spare: [0..37B],
bufferNumber: CARDINAL,
debug: PRIVATE UNSPECIFIED,
encapsulation: PRIVATE DriverTypes.Encapsulation,


bufferBody: SELECT OVERLAID BufferType FROM
raw => [ rawWords: ARRAY [0..0) OF WORD ],

pup => [
pupLength: CARDINAL, -- in bytes, includes header
pupTransportControl: Byte, -- 4 bits of hopcount, 4 spares
pupType: PupTypes.PupType,
pupID: PupTypes.Pair,
dest, source: PupAddress,
pupBody: SELECT OVERLAID * FROM
pupWords => [ pupWords: ARRAY [0..0) OF WORD ],
pupBytes => [ pupBytes: PACKED ARRAY [0..0) OF Byte ],
pupChars => [ pupChars: PACKED ARRAY [0..0) OF CHARACTER ],
pupString => [ pupString: StringBody ],
rfc => [ address: PupAddress ],
ack => [
maximumBytesPerPup: CARDINAL,
numberOfPupsAhead: CARDINAL,
numberOfBytesAhead: CARDINAL ],
abort => [
abortCode: WORD,
abortText: PACKED ARRAY [0..0) OF CHARACTER ],
error => [ -- see [MAXC]<PUP>Error.ears
errorHeader: ARRAY [0..9] OF WORD,
errorCode: PupTypes.PupErrorCode,
errorOptions: WORD,
errorText: PACKED ARRAY [0..0) OF CHARACTER ],
ENDCASE ],
-- software checksum (1 word) comes after all the data

rpp => [ -- variant of Pup NOTE: header is one word longer
rppPupLength: CARDINAL, -- in bytes, includes header
rppTransportControl: Byte,
rppPupType: [0..37B], -- 4
system, sendAck, notify: BOOLEAN,
seqNumber, ackNumber: CARDINAL,
rppDest, rppSource: RppAddress,
allocation, subType: Byte,
rppBody: SELECT OVERLAID * FROM
rppWords => [ rppWords: ARRAY [0..0) OF WORD ],
rppBytes => [ rppBytes: PACKED ARRAY [0..0) OF Byte ],
rppChars => [ rppChars: PACKED ARRAY [0..0) OF CHARACTER ],
rppString => [ rppString: StringBody ],
ENDCASE ],
-- software checksum (1 word) comes after all the data
ENDCASE ];

END.