ArpaEthernetOneTranslation.mesa
Copyright © 1986 by Xerox Corporation. All rights reserved.
Demers, August 19, 1987 5:33:23 pm PDT
This is a dummy to be used until we get our act together on RARP, ICMP Subnet Mask, ...
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
Encapsulating Arpa Packets
GetEncapsulation: PROC [network: Network, address: Address] RETURNS [Encapsulation] ~ {
Pup host to use is just low order byte of Arpa address. This works for broadcast too.
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]] ] }
};
};
Processing Received Translation Packets
RecvTranslation: CommDriver.RecvProc
[network: Network, buffer: Buffer, bytes: NAT] RETURNS [Buffer]
~ {
RETURN[buffer];
};
Initialization
Init: PROC = {
Install self for each ethernetOne on the chain.
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[];
}.