-- File: PupShow.mesa - last edit:
-- MAS May 19, 1980 6:20 PM
-- HGM November 19, 1979 12:06 PM

-- Copyright Xerox Corporation 1979, 1980

DIRECTORY
IODefs: FROM "IODefs" USING [
TAB, CR, LF, FF,
WriteChar, WriteDecimal, WriteLine, WriteOctal, WriteString],
InlineDefs: FROM "InlineDefs" USING [LowHalf, HighHalf],
CommUtilDefs: FROM "CommUtilDefs" USING [GetTicks, GetEthernetHostNumber],
PupDefs: FROM "PupDefs" USING [
incomingPup, outgoingPup,
PupAddress, PupBuffer, PupHostID, PupSocketID],
BufferDefs: FROM "BufferDefs"; -- SHAREs

PupShow: MONITOR
IMPORTS IODefs, InlineDefs, CommUtilDefs
EXPORTS PupDefs
SHARES BufferDefs =
BEGIN OPEN IODefs, PupDefs;

myHost: PupHostID ← [CommUtilDefs.GetEthernetHostNumber[]];

s: ARRAY [0..9] OF PupSocketID;
i: CARDINAL;
h1, h2, h3, h4: PupHostID;

ShowPupBuffer: PUBLIC ENTRY PROCEDURE [c: CARDINAL, b: PupBuffer] =
BEGIN
IF b.pupType=gatewayInfo THEN RETURN;
WriteDecimal[b.bufferNumber];
SELECT c FROM
0 => NULL;
incomingPup => WriteString[" incoming"];
outgoingPup => WriteString[" outgoing "];
ENDCASE => BEGIN WriteString[" code="]; WriteDecimal[c]; END;
IF b.queue#NIL THEN
BEGIN
low: WORD ← InlineDefs.LowHalf[b.queue];
high: WORD ← InlineDefs.HighHalf[b.queue];
WriteString[" on queue "];
IF high#0 THEN
BEGIN
WriteOctal[high];
WriteChar[’|];
END;
WriteOctal[low];
END;
WriteString[" "];
ShowPupPacket[0,b];
WriteLine[" "];
END;

ShowPupPacket: PUBLIC PROCEDURE [c: CARDINAL,b: PupBuffer] =
BEGIN
char: CHARACTER;
IF c#0 THEN BEGIN WriteString[" call="]; WriteDecimal[c]; END;
WriteString["lengths "];
WriteDecimal[b.length];
WriteString[" "];
WriteDecimal[b.pupLength];
WriteString[" "];
WriteDecimal[b.pupLength-22];
WriteString[" "];
WriteString["Encap: to="];
WriteOctal[b.encapsulation.etherDest];
WriteString[", from="];
WriteOctal[b.encapsulation.etherSource];
WriteString[", type="];
WriteOctal[b.encapsulation.ethernetType];
WriteLine[" "];
SELECT b.pupType FROM
error => WriteString["ERROR "];
rfc => WriteString["RFC "];
abort => WriteString["ABORT "];
end => WriteString["END "];
endRep => WriteString["ENDREPLY "];
data => WriteString["DATA "];
aData => WriteString["ADATA "];
ack => WriteString["ACK "];
mark => WriteString["MARK "];
aMark => WriteString["AMARK "];
ENDCASE =>
BEGIN
WriteString["pup Type "];
WriteOctal[LOOPHOLE[b.pupType,CARDINAL]];
END;
WriteString[" From: "];
ShowPupAddress[b.source];
WriteString[" "];
WriteString[" To: "];
ShowPupAddress[b.dest];
WriteLine[""];
WriteString["id: "];
WriteDecimal[b.pupID.a]; WriteChar[’|]; WriteDecimal[b.pupID.b];
WriteString[" t: "];
WriteDecimal[CommUtilDefs.GetTicks[]];
WriteLine[" "];
SELECT b.pupType FROM
rfc => ShowPupAddress[b.address];
ack => FOR i IN [0..2] DO
WriteDecimal[LOOPHOLE[b.pupWords[i]]];
WriteString[" "];
ENDLOOP;
ENDCASE => FOR i IN [22..b.pupLength) DO
SELECT (char←b.pupChars[i-22]) FROM
IN [’ ..’~] => WriteChar[char];
IODefs.TAB => WriteString["<TAB>"L];
IODefs.CR => WriteString["<CR>"L];
IODefs.LF => WriteString["<LF>"L];
IODefs.FF => WriteString["<FF>"L];
ENDCASE =>
BEGIN
WriteChar[’<];
WriteOctal[char];
WriteChar[’>];
END;
ENDLOOP;
WriteLine[" "];
END;

ShowPupSocket: PROCEDURE [x: PupSocketID] =
BEGIN
WriteString[" "];
WriteDecimal[x.a];
WriteChar[’|];
WriteDecimal[x.b];
END;

ShowPupAddress: PROCEDURE [x: PupAddress]=
BEGIN
WriteString[" "];
SELECT x.host FROM
myHost => WriteString["ME"];
0 => WriteString["BC"];
4 => WriteString["POR"];
h1 => WriteString["H1"];
h2 => WriteString["H2"];
h3 => WriteString["H3"];
h4 => WriteString["H4"];
ENDCASE =>
BEGIN
SELECT 0 FROM
h1 => BEGIN h1←x.host; WriteString["H1 = "]; END;
h2 => BEGIN h2←x.host; WriteString["H2 = "]; END;
h3 => BEGIN h3←x.host; WriteString["H3 = "]; END;
h4 => BEGIN h4←x.host; WriteString["H4 = "]; END;
ENDCASE;
WriteDecimal[x.host];
END;
FOR i IN [0..9] DO
IF s[i]=[0,0] THEN BEGIN s[i]←x.socket; ShowPupSocket[x.socket]; END;
IF s[i]=x.socket THEN BEGIN WriteString[" Soc"]; WriteDecimal[i]; EXIT; END
REPEAT FINISHED=> ShowPupSocket[x.socket];
ENDLOOP;
END;

-- initialization
FOR i IN [0..9] DO s[i]←[0,0]; ENDLOOP;
s[0]←[0,3];
h1←h2←h3←h4←[0];
END.