<> <> <> <<>> <> <<>> DIRECTORY ArpaTranslation USING [DetermineAddressAndSubnetMaskForInterface], CommBuffer USING [Overhead], CommDriver USING [GetNetworkChain, InsertReceiveProc, Network, RecvProc], CommDriverType USING [Encapsulation]; ArpaEthernetOneTranslation: CEDAR MONITOR LOCKS cH USING cH: Cache IMPORTS ArpaTranslation, CommDriver EXPORTS CommBuffer ~ { Buffer: TYPE ~ CommDriver.Buffer; Network: TYPE ~ CommDriver.Network; Encapsulation: PUBLIC TYPE ~ CommDriverType.Encapsulation; -- exported to CommBuffer <> GetEncapsulation: PROC [network: Network, address: Address] RETURNS [Encapsulation] ~ { <> TRUSTED { RETURN[ [ethernetOne[etherSpare1~[0,0], etherSpare2~[0,0], etherSpare3~[0,0], etherSpare4~[0,0], etherSpare5~[0,0], ethernetOneDest~address.d, ethernetOneSource~network.pup.host, ethernetOneType~arpa]] ] } }; }; <> RecvTranslation: CommDriver.RecvProc <<[network: Network, buffer: Buffer, bytes: NAT] RETURNS [Buffer]>> ~ { RETURN[buffer]; }; <> Init: PROC = { <> FOR network: Network _ CommDriver.GetNetworkChain[], network.next UNTIL network = NIL DO IF network.type # ethernetOne THEN LOOP; IF NOT ArpaTranslation.DetermineAddressAndSubnetMaskForInterface[network].ok THEN LOOP; network.arpa.getEncapsulation _ GetEncapsulation; CommDriver.InsertReceiveProc[network~network, type~arpaTranslate, proc~RecvTranslation]; ENDLOOP; }; Init[]; }.