-- Copyright (C) 1984, 1985 by Xerox Corporation. All rights reserved. -- GateParameterNoDisk.mesa, HGM, 5-Oct-85 20:02:31 -- Updated: WIrish, 22-Jul-86 9:26:25 -- And various stubs... DIRECTORY CmFile USING [Handle, TableError], Format USING [NetworkNumber], Process USING [Priority, priorityForeground], Put USING [Decimal, NetworkNumber, Number, Text, Line], StringLookUp USING [noMatch, TableDesc], String USING [ AppendChar, AppendDecimal, AppendNumber, AppendString, EqualString], System USING [NetworkNumber, nullNetworkNumber], Token USING [Boolean, Decimal, FreeStringHandle, FreeTokenString, Handle, Item, NetworkNumber, Octal, StringToHandle, SyntaxError], Buffer USING [], BufferOps USING [Defaults, GetDefaults, SetDefaults], DriverTypes USING [DeviceType], Driver USING [GetDeviceChain, Network], ForwarderDefs USING [], Protocol1 USING [Family, GetContext, GetFamiltyUnit], PupDefs USING [PupPackageMake, SmashMyHostNumber], PupRouterDefs USING [NetworkContext], Router USING [SetNetworkID], RoutingTable USING [NetworkContext], GateDefs USING [], Indirect USING [Close, NextValue, OpenSection], PhoneCreate USING [CreatePhone], RoutingFudges USING [SetNSFudge, SetPupFudge], Trouble USING [Bug]; GateParameterNoDisk: PROGRAM IMPORTS CmFile, Format, Process, Put, String, Token, BufferOps, Driver, Indirect, PupDefs, Router, PhoneCreate, Protocol1, RoutingFudges, Trouble EXPORTS Buffer, GateDefs = BEGIN Network: PUBLIC TYPE = Driver.Network; SetupWindow: PUBLIC PROCEDURE = BEGIN END; ScanParameterFile: PUBLIC PROCEDURE RETURNS [ priority: Process.Priority ← Process.priorityForeground, disableNSRouting: BOOLEAN ← FALSE] = BEGIN cmFile: CmFile.Handle; Option: TYPE = MACHINE DEPENDENT{ ethernetOne(0), ethernet, sdlc, pupHostNumber, buffers, priority, disableNSRouting, extraPupHops, extraNsHops, extraHops, noMatch(StringLookUp.noMatch)}; DefinedOption: TYPE = Option [ethernetOne..extraHops]; CheckType: PROCEDURE [h: CmFile.Handle, table: StringLookUp.TableDesc] RETURNS [index: CARDINAL] = Indirect.NextValue; MyNextValue: PROCEDURE [ h: CmFile.Handle, table: LONG DESCRIPTOR FOR ARRAY DefinedOption OF LONG STRING] RETURNS [index: Option] = LOOPHOLE[CheckType]; optionTable: ARRAY DefinedOption OF LONG STRING ← [ ethernetOne: "EthernetOne"L, ethernet: "Ethernet"L, sdlc: "SDLC"L, pupHostNumber: "Pup Host Number"L, buffers: "Buffers"L, priority: "Priority"L, disableNSRouting: "Disable NS Routing"L, extraPupHops: "Extra PUP Hops"L, extraNsHops: "Extra NS Hops"L, extraHops: "Extra Hops"L]; phoneLines: CARDINAL ← 0; [] ← PupDefs.PupPackageMake[]; -- Probably redundant cmFile ← Indirect.OpenSection["Gateway"L]; IF cmFile = NIL THEN BEGIN Message["Can't find [Gateway] section in Parameter file"L]; RETURN; END; DO option: Option; option ← MyNextValue[cmFile, DESCRIPTOR[optionTable] ! CmFile.TableError => BEGIN IF name[0] # '; THEN Message["Unrecognized parameter: ", name]; RETRY; END]; SELECT option FROM noMatch => EXIT; ethernetOne => -- <board> <Pup Net> <NS net> (octal) BEGIN board: CARDINAL ← Token.Decimal[cmFile]; pupNet: CARDINAL ← Token.Octal[cmFile]; nsNet: System.NetworkNumber ← Token.NetworkNumber[cmFile, octal]; SetPupNetworkID[board, ethernetOne, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[board, ethernetOne, nsNet]; [] ← Router.SetNetworkID[board, ethernetOne, nsNet]; END; PrintHost["EthernetOne"L, board, pupNet, nsNet]; END; ethernet => -- <board> <Pup Net> <NS net> (octal) BEGIN board: CARDINAL ← Token.Decimal[cmFile]; pupNet: CARDINAL ← Token.Octal[cmFile]; nsNet: System.NetworkNumber ← Token.NetworkNumber[cmFile, octal]; SetPupNetworkID[board, ethernet, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[board, ethernet, nsNet]; [] ← Router.SetNetworkID[board, ethernet, nsNet]; END; PrintHost["Ethernet"L, board, pupNet, nsNet]; END; sdlc => -- <Pup Host> <Pup Net> <Lines> (octal) BEGIN -- Line 0 must come first line: CARDINAL ← Token.Octal[cmFile]; pupNet: CARDINAL ← Token.Octal[cmFile]; nsNet: System.NetworkNumber ← Token.NetworkNumber[cmFile, octal]; pupHost: CARDINAL ← Token.Octal[cmFile]; password: LONG STRING ← Token.Item[cmFile]; IF String.EqualString[password, "NIL"L] THEN BEGIN [] ← Token.FreeTokenString[password]; password ← NIL; END; phoneLines ← phoneLines + 1; PhoneCreate.CreatePhone[pupHost, pupNet, line, password]; IF password # NIL THEN [] ← Token.FreeTokenString[password]; SetPupNetworkID[phoneLines, phonenet, pupNet]; IF nsNet # System.nullNetworkNumber THEN BEGIN CheckNSNetworkID[phoneLines, phonenet, nsNet]; [] ← Router.SetNetworkID[phoneLines, phonenet, nsNet]; END; PrintSdlcInfo[pupHost, pupNet, line, phoneLines]; END; pupHostNumber => BEGIN me: CARDINAL ← Token.Octal[cmFile]; PupDefs.SmashMyHostNumber[me]; MessageOctal["Set my Pup Host Number to "L, me]; END; buffers => -- <number> (decimal) BEGIN defaults: ARRAY BufferOps.Defaults OF CARDINAL ← BufferOps.GetDefaults[]; buffers: CARDINAL ← Token.Decimal[cmFile]; defaults[bias] ← defaults[bias] + buffers; BufferOps.SetDefaults[defaults]; MessageDecimal["Added "L, buffers, " buffers to the system pool"L]; END; priority => -- <priority> (decimal) BEGIN priority ← Token.Decimal[cmFile]; MessageDecimal["Priority will be "L, priority]; END; disableNSRouting => -- <boolean> BEGIN IF Token.Boolean[cmFile] THEN BEGIN Message["Deactivating NS Router"L]; disableNSRouting ← TRUE; END ELSE Message["Didn't deactivate NS Router"L]; END; extraPupHops => -- <decimal> BEGIN SetExtraPupHops[Token.Decimal[cmFile]]; END; extraNsHops => -- <decimal> BEGIN SetExtraNsHops[Token.Decimal[cmFile]]; END; extraHops => -- <boolean> or <decimal> -- FALSE -> 0, TRUE -> 1 BEGIN hopsToAdd: CARDINAL ← 0; item: LONG STRING ← Token.Item[cmFile]; th: Token.Handle ← Token.StringToHandle[item]; th1: Token.Handle ← Token.StringToHandle[item]; IF Token.Boolean[th ! Token.SyntaxError => BEGIN hopsToAdd ← Token.Decimal[th1]; CONTINUE; END;] THEN hopsToAdd ← 1; [] ← Token.FreeStringHandle[th]; [] ← Token.FreeStringHandle[th1]; [] ← Token.FreeTokenString[item]; SetExtraPupHops[hopsToAdd]; SetExtraNsHops[hopsToAdd]; END; ENDCASE => ERROR; ENDLOOP; Indirect.Close[cmFile]; END; SetExtraPupHops: PROCEDURE [hops: CARDINAL] = BEGIN IF hops > 0 THEN BEGIN MessageDecimal["Setting Extra PUP Hops to "L, hops]; RoutingFudges.SetPupFudge[hops]; END ELSE Message["There are no Extra PUP Hops"L]; END; SetExtraNsHops: PROCEDURE [hops: CARDINAL] = BEGIN IF hops > 0 THEN BEGIN MessageDecimal["Setting Extra NS Hops to "L, hops]; RoutingFudges.SetNSFudge[hops]; END ELSE Message["There are no Extra NS Hops"L]; END; SetPupNetworkID: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: CARDINAL] = BEGIN ENABLE UNWIND => NULL; network: Driver.Network ← GetNthDevice[physicalOrder, medium]; context: PupRouterDefs.NetworkContext ← Protocol1.GetContext[network, pup]; family: Protocol1.Family ← Protocol1.GetFamiltyUnit[pup]; IF context.pupNetNumber # 0 AND context.pupNetNumber # newNetID THEN BEGIN text: STRING = [200]; String.AppendString[text, "Wrong Pup network number. Expected: "L]; String.AppendNumber[text, newNetID, 8]; String.AppendString[text, ", Found: "L]; String.AppendNumber[text, context.pupNetNumber, 8]; Trouble.Bug[text]; END; context.pupNetNumber ← newNetID; family.stateChanged[network, context, add]; END; CheckNSNetworkID: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: System.NetworkNumber] = BEGIN ENABLE UNWIND => NULL; network: Driver.Network ← GetNthDevice[physicalOrder, medium]; context: RoutingTable.NetworkContext ← Protocol1.GetContext[network, ns]; IF context.netNumber # System.nullNetworkNumber AND context.netNumber # newNetID THEN BEGIN text: STRING = [200]; String.AppendString[text, "Wrong NS network number. Expected: "L]; AppendNetNumbers[text, newNetID]; String.AppendString[text, ", Found: "L]; AppendNetNumbers[text, context.netNumber]; Trouble.Bug[text]; END; network ← NIL; -- Compiler and Debugger don't cooperate END; GetNthDevice: PROCEDURE [ physicalOrder: CARDINAL, medium: DriverTypes.DeviceType] RETURNS [network: Driver.Network] = BEGIN i: CARDINAL ← 0; FOR network ← Driver.GetDeviceChain[], network.next UNTIL network = NIL DO IF network.device = medium THEN IF (i ← i + 1) = physicalOrder THEN RETURN; ENDLOOP; Trouble.Bug["Driver doesn't exist"L]; network ← NIL; -- Compiler and Debugger don't agree END; PrintHost: PROCEDURE [ name: LONG STRING, board, pupNet: CARDINAL, nsNet: System.NetworkNumber] = BEGIN Put.Text[NIL, name]; IF board # LAST[CARDINAL] THEN BEGIN Put.Text[NIL, " number "L]; Put.Number[NIL, board, [8, FALSE, TRUE, 0] ]; END; Put.Text[NIL, " is Pup network "L]; Put.Number[NIL, pupNet, [8, FALSE, TRUE, 0] ]; Put.Text[NIL, " and NS network "L]; Put.NetworkNumber[NIL, nsNet, octal]; Put.Text[NIL, " ("L]; Put.NetworkNumber[NIL, nsNet, productSoftware]; Put.Line[NIL, ")."L]; END; PrintSdlcInfo: PROCEDURE [pupHost, pupNet: CARDINAL, line, driver: CARDINAL] = BEGIN Put.Text[NIL, "The "L]; SELECT driver FROM 1 => Put.Text[NIL, "first"L]; 2 => Put.Text[NIL, "second"L]; 3 => Put.Text[NIL, "third"L]; 4 => Put.Text[NIL, "forth"L]; 5 => Put.Text[NIL, "fifth"L]; 6 => Put.Text[NIL, "sixth"L]; 7 => Put.Text[NIL, "seventh"L]; 8 => Put.Text[NIL, "eighth"L]; ENDCASE => {Put.Decimal[NIL, driver]; Put.Text[NIL, "th"L]; }; Put.Text[NIL, " SDLC line (line "L]; Put.Number[NIL, line, [8, FALSE, TRUE, 0] ]; Put.Text[NIL, ") is Pup "L]; Put.Number[NIL, pupNet, [8, FALSE, TRUE, 0] ]; Put.Text[NIL, "#"L]; Put.Number[NIL, pupHost, [8, FALSE, TRUE, 0] ]; Put.Text[NIL, "#"L]; Put.Line[NIL, "."L]; END; MessageDecimal: PROCEDURE [ one: LONG STRING, num: CARDINAL, two, three: LONG STRING ← NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; String.AppendDecimal[text, num]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; LogString[text]; END; MessageOctal: PROCEDURE [ one: LONG STRING, num: CARDINAL, two, three: LONG STRING ← NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; String.AppendNumber[text, num, 8]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; LogString[text]; END; Message: PROCEDURE [one, two, three: LONG STRING ← NIL] = BEGIN text: STRING = [100]; String.AppendString[text, one]; IF two # NIL THEN String.AppendString[text, two]; IF three # NIL THEN String.AppendString[text, three]; String.AppendChar[text, '.]; LogString[text]; END; LogString: PROCEDURE [text: LONG STRING] = BEGIN Put.Line[NIL, text]; END; AppendNetNumbers: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN words: RECORD [a, b: WORD] = LOOPHOLE[net]; AppendNetNumber[string, net]; IF words.b < 256 THEN BEGIN String.AppendString[string, " ("L]; AppendNetNumberOctal[string, net]; String.AppendString[string, ")"L]; END; END; AppendNetNumber: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[string, s]; END; Format.NetworkNumber[Append, net, productSoftware]; END; AppendNetNumberOctal: PROCEDURE [string: LONG STRING, net: System.NetworkNumber] = BEGIN Append: PROCEDURE [s: LONG STRING, clientData: LONG POINTER] = BEGIN String.AppendString[string, s]; END; Format.NetworkNumber[Append, net, octal]; END; END.