<> <> <<>> <> <<>> DIRECTORY Arpa USING [Address, NetNumber], ArpaTranslation USING [NetAndSubnetMask, NetAndSubnetMaskObject], Basics USING [HighByte, LowByte], CommDriver USING [Network] ; ArpaTranslationImpl: CEDAR PROGRAM IMPORTS Arpa, Basics EXPORTS ArpaTranslation ~ { Address: TYPE ~ Arpa.Address; Network: TYPE ~ CommDriver.Network; XeroxSubnetMask: Arpa.Address ~ [0FFH, 0FFH, 0FCH, 000H]; DetermineAddressAndSubnetMaskForInterface: PUBLIC PROC [n: Network] RETURNS [ok: BOOL _ TRUE] ~ { p: ArpaTranslation.NetAndSubnetMask _ NEW[ArpaTranslation.NetAndSubnetMaskObject]; n.arpa.translation _ p; SELECT n.type FROM <> ethernet => ok _ DoEthernet[n, p]; ethernetOne => ok _ DoEthernetOne[n, p]; ENDCASE => ok _ FALSE; }; DoEthernetOne: PROC [n: Network, p: ArpaTranslation.NetAndSubnetMask] RETURNS [ok: BOOL _ TRUE] ~ { <> <> <<8 bit network number = 13 (decimal)>> <<14-bit subnet number = pup network number>> <<10-bit host number = pup host number>> arpaAddress: Address; temp: CARD16; IF (temp _ 4*CARD16[n.pup.net]) # 0 THEN arpaAddress _ [13, Basics.HighByte[temp], Basics.LowByte[temp], n.pup.host] ELSE ok _ FALSE; IF ok THEN { n.arpa.host _ arpaAddress; p.net _ Arpa.NetNumber[arpaAddress]; p.subnetMask _ XeroxSubnetMask; }; }; DoEthernet: PROC [n: Network, p: ArpaTranslation.NetAndSubnetMask] RETURNS [ok: BOOL _ TRUE] ~ { <> <> <<8 bit network number = 13 (decimal)>> <<14-bit subnet number = pup network number>> <<10-bit host number = pup host number>> arpaAddress: Address; temp: CARD16; IF (temp _ 4*CARD16[n.pup.net]) # 0 THEN arpaAddress _ [13, Basics.HighByte[temp], Basics.LowByte[temp], n.pup.host] ELSE ok _ FALSE; IF ok THEN { n.arpa.host _ arpaAddress; p.net _ Arpa.NetNumber[arpaAddress]; p.subnetMask _ XeroxSubnetMask; }; }; <> <> <> <