-- File: AltoSlaDefs.mesa, Last Edit: HGM December 7, 1980 10:55 PM DIRECTORY InlineDefs USING [BcplLongNumber], Mopcodes USING [zPOP], Password USING [Encrypted], StatsDefs USING [StatCounterIndex], BufferDefs USING [Buffer, QueueObject]; AltoSlaDefs: DEFINITIONS = BEGIN NIL0: POINTER = LOOPHOLE[0]; noLCB: LCB = NIL0; maxLine: CARDINAL = 16; Line: TYPE = [0..maxLine); LTE: TYPE = POINTER TO LineTableEntry; LineTableEntry: TYPE = MACHINE DEPENDENT RECORD [ -- EVEN WORD BOUNDARY link: POINTER, -- not used by microcode hardwareStatus: WORD, inputLCB: LCB, inputState: State, outputLCB: LCB, outputState: State]; LCB: TYPE = POINTER TO LineControlBlock; LongLCB: TYPE = LONG POINTER TO LineControlBlock; LineControlBlock: TYPE = MACHINE DEPENDENT RECORD [ -- EVEN WORD BOUNDARY next: LCB, interruptBit: WORD, finished: BOOLEAN, microcodeError: Error, hardwareStatus: WORD, -- this is really just one variant of several, but it is the only one we use half: {left, right}, bytesLeft: [0..77777B], currentData: POINTER, partialCrc: WORD, unused: WORD]; State: TYPE = MACHINE DEPENDENT{ reset(0B), rIdle(1B), tIdle(2B), rCaat(3B), tCaat(4B), tUIdl(5B), -- Initial states rDLE1(10B), rData, rDLE2, rETX1, rETX2, -- Bisync Recv states tSYN1, tSYN2, tSYN3, tDLE1, tData, tDLE2, tDLE3, tETX1, tETX2, tEnd(26B), tUblk(27B), (177777B)}; Error: TYPE = MACHINE DEPENDENT{ ok(0B), hardware(1B), missingStx(3B), bufferOverflow(4B), trashAfterDle(5B), crc(6B), (77777B)}; maxSlaHost: CARDINAL = 64; SlaHost: TYPE = (0..maxSlaHost]; noPartner: CARDINAL = 0; maxByte: CARDINAL = 256; Byte: TYPE = [0..377B]; syn: Byte = 26B; dle: Byte = 20B; stx: Byte = 2B; etx: Byte = 203B; fill: Byte = 377B; -- doesn't count dle doubling overheadPerPacket: CARDINAL = 9; -- syn, syn, syn dle, stx, ... dle, etx, crc, crc eiaControlAddr: POINTER TO WORD = LOOPHOLE[177700B]; commProcControlAddr: POINTER TO WORD = LOOPHOLE[177300B]; eiaShift: CARDINAL = 1000B; -- shift line number into EIA control word commProcShift: CARDINAL = 4; -- shift line number into ComProc address offset ShortenIocb: PROCEDURE [LongLCB] RETURNS [LCB] = MACHINE CODE BEGIN Mopcodes.zPOP; END; ShortenData: PROCEDURE [LONG POINTER] RETURNS [POINTER] = MACHINE CODE BEGIN Mopcodes.zPOP; END; -- Things used by SLA driver. Needed by GatePrint LIB: TYPE = POINTER TO LineInfoBlock; LineInfoBlock: TYPE = RECORD [ sendBuffer: BufferDefs.Buffer, -- there should normally be only one or none recvBuffer: BufferDefs.Buffer, -- there should normally be two state: LineState, lineNeedsPassword: BOOLEAN, partner: Byte, -- SlaHost number of other end of this line, 0 if none timeOfLastRT, timeSendStarted: CARDINAL, hiPriQueue, lowPriQueue: BufferDefs.QueueObject, hiPacketsSent, hiBytesSent, hiQueueDelay: LONG CARDINAL, queueDelay: LONG CARDINAL, connRejections, hiRejections, rejections: LONG CARDINAL, deaths, stuck, timeout, overrun: CARDINAL, -- The following statistics are the same as the ones kept by the Novas packetsSent, packetsRecv: LONG CARDINAL, bytesSent, bytesRecv: LONG CARDINAL, syncErrors, crcErrors, controlErrors: CARDINAL]; LineState: TYPE = { down, up, loopedBack, missing, halfUp, passwordOk, needPassword, badPassword}; RoutingTableEntry: TYPE = RECORD [hops: Byte, line: Byte]; maxHops: Byte = 15; -- highest legal hop count longHop: Byte = 377B; -- flag for can't get there RoutingTablePacket: TYPE = RECORD [ sourceHost: Byte, numEntries: Byte, rt: ARRAY SlaHost OF RoutingTableEntry]; -- Password things RememberDialinPassword: PROCEDURE [Password.Encrypted]; -- listener RememberDialoutPassword: PROCEDURE [STRING]; -- sender LineNeedsPassword: PROCEDURE [Line]; GetSlaLineTable: PROCEDURE RETURNS [POINTER TO ARRAY Line OF LineTableEntry]; GetCrcTable: PROCEDURE RETURNS [POINTER TO ARRAY [0..maxByte) OF WORD]; GetSlaRoutingTable: PROCEDURE RETURNS [POINTER TO ARRAY SlaHost OF RoutingTableEntry]; GetSlaInfoBlocks: PROCEDURE RETURNS [DESCRIPTOR FOR ARRAY OF LineInfoBlock]; SetupSlaThings: PROCEDURE; statSlaPacketsSent: StatsDefs.StatCounterIndex; statSlaWordsSent: StatsDefs.StatCounterIndex; statSlaPacketsRecv: StatsDefs.StatCounterIndex; statSlaWordsRecv: StatsDefs.StatCounterIndex; statSlaRoutingPacketsSent: StatsDefs.StatCounterIndex; statSlaRoutingPacketsReceived: StatsDefs.StatCounterIndex; statSlaEmptyFreeQueue: StatsDefs.StatCounterIndex; statSlaROR: StatsDefs.StatCounterIndex; statSlaCRCError: StatsDefs.StatCounterIndex; statSlaSyncError: StatsDefs.StatCounterIndex; statSlaControlError: StatsDefs.StatCounterIndex; statSlaNoRoute: StatsDefs.StatCounterIndex; statSlaQueueFull: StatsDefs.StatCounterIndex; statSlaConnectionLimit: StatsDefs.StatCounterIndex; statSlaPacketsStuck: StatsDefs.StatCounterIndex; statSlaLineTimeout: StatsDefs.StatCounterIndex; statSlaLineDied: StatsDefs.StatCounterIndex; statSlaFCT: StatsDefs.StatCounterIndex; -- Statistics info for GateControl or whatever... slaStatsReply: WORD = 4; -- The second word of the reply is the version number. The third word is the number of hosts in the routing table, then comes the routing table itself. (Don't forget to skip host 0.) The next word is the highest line number, and it is followed by an array of info for each line. slaVersion: WORD = 1; SlaStatsEntry: TYPE = RECORD [ packetsSent: InlineDefs.BcplLongNumber, packetsRecv: InlineDefs.BcplLongNumber, bytesSent: InlineDefs.BcplLongNumber, bytesRecv: InlineDefs.BcplLongNumber, syncErrors: CARDINAL, badCrc: CARDINAL, controlError: CARDINAL, state: LineState]; END.