<> <> <> DIRECTORY DriverDefs USING [Network], BufferDefs USING [PupBuffer, Byte, PupNetID, PupHostID, Queue], PupTypes USING [Pair, PupAddress, PupErrorCode], Rope USING [ROPE]; PupRouterDefs: DEFINITIONS = BEGIN OPEN DriverDefs, BufferDefs; wordsPerPupHeader: CARDINAL = 11; bytesPerPupHeader: CARDINAL = wordsPerPupHeader*2; BeSurePupIsOn: PROCEDURE; NextPupConnectionID: PROCEDURE RETURNS [PupTypes.Pair]; PupRouterKnowAboutSocket: PROCEDURE [PupRouterSocket]; PupRouterForgetAboutSocket: PROCEDURE [PupRouterSocket]; GetFirstPupSocket: PROCEDURE RETURNS [PupRouterSocket]; PupRouterSocket: TYPE = LONG POINTER TO PupRouterSocketObject; PupRouterSocketObject: TYPE = RECORD [ next: PupRouterSocket, local: PupTypes.PupAddress, remote: PupTypes.PupAddress, -- this lives here only for debugging ready: CONDITION, input: BufferDefs.Queue, checkit: BOOLEAN, id: PupTypes.Pair]; -- only used by listeners SetPupChecksum: PROCEDURE [PupBuffer]; TestPupChecksum: PROCEDURE [PupBuffer] RETURNS [BOOLEAN]; SetBadPupProc: PROCEDURE [PROCEDURE [PupBuffer]]; GetRoutingTableEntry: PROCEDURE [PupNetID] RETURNS [RoutingTableEntry]; EnumerateRoutingTable: PROCEDURE [PROCEDURE [RoutingTableEntry]]; GetRoutingTable: PROCEDURE RETURNS [RoutingTable]; PupGatewaySee: PROCEDURE [PupBuffer] RETURNS [BOOLEAN]; RoutingTable: TYPE = REF RoutingTableSeq; RoutingTableSeq: TYPE = RECORD[SEQUENCE length: CARDINAL OF RoutingTableObject]; RoutingTableEntry: TYPE = LONG POINTER TO RoutingTableObject; RoutingTableObject: TYPE = RECORD [ net: PupNetID, hop: Byte, time: Byte, route: PupHostID, network: DriverDefs.Network]; maxHop: CARDINAL = 15; <> <> <> PupGateInfo: TYPE = MACHINE DEPENDENT RECORD [ net: PupNetID, viaNet: PupNetID, viaHost: PupHostID, hop: Byte]; <> PupInputer: PROCEDURE [PupBuffer]; PupBroadcaster: PROCEDURE [PupBuffer]; DontForwardPupBuffer: PROCEDURE [PupBuffer]; DoForwardPupBuffer: PROCEDURE [PupBuffer]; SetPupForwarder: PROCEDURE [PROCEDURE [PupBuffer]]; SneakySendUnlocked: PROCEDURE [PupBuffer]; RejectPupWithBadChecksum: PROCEDURE [PupBuffer]; Reject: PROCEDURE [PupBuffer, PupErrorCode]; Timeout: PROCEDURE; <> PupErrorCode: TYPE = PupTypes.PupErrorCode; BuildErrorPup: PROCEDURE [PupBuffer, PupErrorCode, Rope.ROPE] RETURNS [ok: BOOLEAN]; <> routerLock: MONITORLOCK; routingTableUpdateTimeout: CONDITION; probeResponse: CONDITION; numberOfNetworks: CARDINAL; dataWordsPerPup: CARDINAL; routerIsActive: BOOLEAN; routingTable: RoutingTable; firstSocket: PupRouterSocket; outThings: OutThings; OutThings: TYPE = RECORD [ outStormy: BOOLEAN, showOut: BOOLEAN, outShower: PROCEDURE [CARDINAL, PupBuffer]]; inThings: InThings; InThings: TYPE = RECORD [ inStormy: BOOLEAN, watcherIsWatching: BOOLEAN, watcherSeesBroadcast: BOOLEAN, watcherCallsThis: PROCEDURE [PupBuffer] RETURNS [BOOLEAN], badChecksumProc: PROCEDURE [PupBuffer], showIn: BOOLEAN, inShower: PROCEDURE [CARDINAL, PupBuffer]]; Checksum: TYPE = {none, software, alto, princOps}; checksum: Checksum; PupRouterCold, PupRouterOut, PupRouterIn, PupChecksums: PROGRAM; PupSockets, PupErrors: PROGRAM; END.