-- File: PupRouterCold.Mesa, Last Edit: -- MAS Apr 18, 1980 6:13 PM -- HGM January 5, 1980 3:17 PM -- Copyright Xerox Corporation 1979, 1980 DIRECTORY CommUtilDefs: FROM "CommUtilDefs" USING [ AllocateHeapNode, FreeHeapNode, SetTimeout, MsecToTicks], PupRouterDefs: FROM "PupRouterDefs" USING [ PupRouterIn, PupRouterOut, PupChecksums, PupErrors, inThings, outThings, checksum, GetPupRoutingTable, pupRouterIsActive, BeSurePupIsOn, Timeout, pupRoutingTable, pupRoutingTableOut, PupRoutingTableEntry, firstSocket, dataWordsPerPup, maxHop, PupInputer, PupBroadcaster], DriverDefs: FROM "DriverDefs" USING [ doDebug, giantVector, Network, RouterObject, SetPupRouter, CommPackageGo, CommPackageOff, GetDeviceChain], PupStream: FROM "PupStream", -- EXPORTS PupDefs: FROM "PupDefs" USING [ defaultNumberOfNetworks, GetFreePupBuffer, SetPupContentsWords, PupRouterBroadcastThis], BufferDefs: FROM "BufferDefs" USING [DataWordsPerPupBuffer, PupBuffer], PupTypes: FROM "PupTypes" USING [gatewaySoc]; PupRouterCold: MONITOR LOCKS routerLock IMPORTS CommUtilDefs, PupRouterDefs, DriverDefs, PupDefs, BufferDefs EXPORTS PupStream, PupDefs, PupRouterDefs SHARES BufferDefs = PUBLIC BEGIN OPEN PupRouterDefs; routerLock: PUBLIC MONITORLOCK; routingTableUpdateTimeout: PUBLIC CONDITION; probeResponse: PUBLIC CONDITION; numberOfNetworks: PUBLIC CARDINAL _ PupDefs.defaultNumberOfNetworks; pupUseCount: CARDINAL _ 0; routerTimeoutFork: PROCESS; doDebug: BOOLEAN = DriverDefs.doDebug; pupRouter: DriverDefs.RouterObject _ [ input: LOOPHOLE[PupInputer], broadcast: LOOPHOLE[PupBroadcaster], addNetwork: AddNetwork, removeNetwork: RemoveNetwork ]; PupPackageMake: PUBLIC ENTRY PROCEDURE = BEGIN b: BufferDefs.PupBuffer; i: CARDINAL; routing: DESCRIPTOR FOR ARRAY OF PupRoutingTableEntry; network, firstNetwork: DriverDefs.Network; IF (pupUseCount_pupUseCount+1)>1 THEN RETURN; DriverDefs.CommPackageGo[]; dataWordsPerPup _ BufferDefs.DataWordsPerPupBuffer[]; network _ firstNetwork _ DriverDefs.GetDeviceChain[]; routing _ DESCRIPTOR [ -- allocates network zero too CommUtilDefs.AllocateHeapNode[(numberOfNetworks+1)*SIZE[PupRoutingTableEntry]], numberOfNetworks+1]; pupRoutingTable _ pupRoutingTableOut _ routing; pupRouterIsActive _ TRUE; IF doDebug THEN DriverDefs.giantVector.pupRoutingTable _ routing; FOR i IN [0..LENGTH[routing]) DO routing[i] _ [hop: maxHop+1, time: 210, route: , network: NIL]; ENDLOOP; -- The first network on the chain becomes network zero. routing[0] _ [hop: 0, time: 0, route: [0], network: network]; UNTIL network=NIL DO IF network.netNumber#0 AND network.netNumber