-- Copyright (C) 1984 by Xerox Corporation. All rights reserved.
-- GateParameterNoDisk.mesa, HGM, 29-Nov-84 19:04:07
-- And various stubs...
DIRECTORY
CmFile USING [Handle, TableError],
Format USING [NetworkNumber],
Process USING [Priority, priorityForeground],
Put USING [Decimal, NetworkNumber, Octal, Text, Line],
StringLookUp USING [noMatch, TableDesc],
String USING [
AppendChar, AppendDecimal, AppendNumber, AppendOctal, AppendString, EqualString],
System USING [NetworkNumber, nullNetworkNumber],
Token USING [Boolean, Decimal, FreeTokenString, Item, NetworkNumber, Octal],
BufferOps USING [Defaults, GetDefaults, SetDefaults],
DriverTypes USING [DeviceType],
Driver USING [GetDeviceChain, GetPupRouter, Network],
ForwarderDefs USING [],
PupDefs USING [SmashMyHostNumber],
Router USING [SetNetworkID],
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, RoutingFudges, Trouble
EXPORTS GateDefs =
BEGIN
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, 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,
extraHops: "Extra Hops"L];
phoneLines: CARDINAL ← 0;
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;
extraHops => -- <boolean>
BEGIN
IF Token.Boolean[cmFile] THEN
BEGIN
Message["Adding Extra Hops"L];
RoutingFudges.SetPupFudge[1];
RoutingFudges.SetNSFudge[1];
END
ELSE Message["Didn't add any Extra Hops"L];
END;
ENDCASE => ERROR;
ENDLOOP;
Indirect.Close[cmFile];
END;
SetPupNetworkID: PROCEDURE [
physicalOrder: CARDINAL, medium: DriverTypes.DeviceType, newNetID: CARDINAL] =
BEGIN
ENABLE UNWIND => NULL;
network: Driver.Network ← GetNthDevice[physicalOrder, medium];
IF network.pupNetNumber = 0 THEN network.pupNetNumber ← newNetID;
IF network.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, network.pupNetNumber, 8];
Trouble.Bug[text];
END;
Driver.GetPupRouter[].addNetwork[network];
END;
CheckNSNetworkID: PROCEDURE [
physicalOrder: CARDINAL, medium: DriverTypes.DeviceType,
newNetID: System.NetworkNumber] =
BEGIN
ENABLE UNWIND => NULL;
network: Driver.Network ← GetNthDevice[physicalOrder, medium];
IF network.netNumber # System.nullNetworkNumber
AND network.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, network.netNumber];
Trouble.Bug[text];
END;
network ← NIL; -- Compiler and Debugger don't agree
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.Octal[NIL, board]; END;
Put.Text[NIL, " is Pup network "L];
Put.Octal[NIL, pupNet];
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 "L];
Put.Octal[NIL, line];
Put.Text[NIL, " is Pup "L];
Put.Octal[NIL, pupNet];
Put.Text[NIL, "#"L];
Put.Octal[NIL, pupHost];
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.AppendOctal[text, num];
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.