-- File: PupPktOps.mesa
-- Last Edit: HGM February 10, 1981 6:39 PM
-- Last Edit: BLyon June 30, 1980 5:22 PM
DIRECTORY
Mopcodes USING [zEXCH],
System USING [Pulses],
PupStream USING [PupOpenMode, CloseReason],
PupPktDefs USING [PupPktStreamObject],
PupDefs USING [Pair, PupBuffer, PupSocket],
BufferDefs USING [QueueObject],
PupTypes USING [Pair, PupAddress, PupSocketID];
PupPktOps: DEFINITIONS =
BEGIN
bytesPerPupHeader: CARDINAL = 22;
bytesPerAck: CARDINAL = bytesPerPupHeader + 6;
dataBytesPerRFC: CARDINAL = 6;
byteAllocate: CARDINAL = 32000; -- lots and lots
retransmitionsBeforeAbort: CARDINAL = probesBeforePanic + 3*60/5; -- about 3 min
initialRetransmissions: CARDINAL = 2*retransmitionsBeforeAbort/3; -- 1 min
pingRetransmissions: CARDINAL = retransmitionsBeforeAbort/3; -- 2 (more) min
probesBeforePanic: CARDINAL = 10;
maxRetransmitTime: CARDINAL = 5000;
maxRetransmitPulses: System.Pulses; -- 5 sec
minRetransmitPulses: System.Pulses; -- 100 ms
initialRetransmitPulses: System.Pulses; -- 5 sec
ctlRetransmitPulses: System.Pulses; -- 2 sec
pingPulses: System.Pulses; -- 1 min
duplicateWindow: CARDINAL = 10000;
clumpsBeforeBump: CARDINAL = 10;
Flip: PROCEDURE [PupDefs.Pair] RETURNS [LONG INTEGER] = MACHINE CODE
BEGIN Mopcodes.zEXCH; END;
Flop: PROCEDURE [LONG INTEGER] RETURNS [PupDefs.Pair] = MACHINE CODE
BEGIN Mopcodes.zEXCH; END;
Instance: TYPE = POINTER TO InstanceData;
InstanceData: TYPE = RECORD [
state: {idle, halfOpen, open, talking, finishing, end, closed},
-- halfOpen is when we have an unanswered RFC outstanding
-- talking is like open except that we have unAcked packets out
-- end is when we have an unanswered End outstanding
-- finishing is when we get an end, but we have unAcked packets out
c: PupDefs.PupBuffer, -- this is a kludge
socket: PupDefs.PupSocket,
dontWait: BOOLEAN,
local: PupTypes.PupAddress,
remote: PupTypes.PupAddress,
mode: PupStream.PupOpenMode,
dataBytesPerPup: CARDINAL,
stateChange: CONDITION,
inputReady: CONDITION,
retransmitterReady: CONDITION,
inputQueue: BufferDefs.QueueObject,
sentQueue: BufferDefs.QueueObject,
retransmitterFork: PROCESS,
slurpFork: PROCESS,
waitingForInterrupt: CONDITION,
outIntSeq, inIntSeq, seenIntSeq: LONG INTEGER,
outIntPending: BOOLEAN,
outIntTime: System.Pulses,
outEnd: CARDINAL,
probeCounter: CARDINAL,
ping: BOOLEAN,
myMaxAllocate: CARDINAL,
pathMaxAllocate: CARDINAL,
hisMaxAllocate: CARDINAL,
throttle: CARDINAL,
unackedPups, allocatedPups: CARDINAL,
clumpsSinceBump: CARDINAL,
sentBuffer: PupDefs.PupBuffer,
pleaseDie, sameNet, sendAck, aDataOut: BOOLEAN,
timer: System.Pulses,
-- mostly used by send side, but used for pinging if state=open
retransmitPulses: System.Pulses,
connectionID: PupDefs.Pair,
nextInputID, nextOutputID, maxOutputID, ackedID: LONG INTEGER,
allocationID, allocatedID: LONG INTEGER,
whyClosed: PupStream.CloseReason,
text: STRING,
lock: MONITORLOCK,
slurp: PROCEDURE,
retransmitter: PROCEDURE,
me: PupPktDefs.PupPktStreamObject,
next: Instance];
PupPktHot: PROGRAM RETURNS [Instance];
MakeLocal: PROCEDURE [
him: Instance, l: PupTypes.PupSocketID, r: PupTypes.PupAddress,
m: PupStream.PupOpenMode, id: PupTypes.Pair];
DestroyLocalLocked: PROCEDURE [him: Instance];
GetSenderSizeLimit: PROCEDURE [Instance] RETURNS [CARDINAL];
GetLocalAddress: PROCEDURE [Instance] RETURNS [PupTypes.PupAddress];
GotOther: PROCEDURE [Instance, PupDefs.PupBuffer];
SmashClosed: PROCEDURE [Instance, PupStream.CloseReason];
SendRfc: PROCEDURE [Instance];
SendEnd: PROCEDURE [Instance];
SendInt: PROCEDURE [Instance];
SendAbort: PROCEDURE [Instance];
StreamDied: PROCEDURE [Instance, PupDefs.PupBuffer];
-- Kludge to make things work if the Dispatcher runs at Priority 2 in an Alto Gateway
SetLockRequeueProcedureFlag: PROCEDURE [lockit: BOOLEAN];
END.