-- 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]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.(2048)