<> <> <> <> <> <> DIRECTORY IPDefs USING [Byte, Datagram, DByte, Address, InternetHeader]; ICMP: CEDAR DEFINITIONS = BEGIN minLength: INT = 8; maxLength: INT = minLength+512; DataBuffer: TYPE = PACKED ARRAY INT [minLength..maxLength) OF IPDefs.Byte; <> EchoReply: IPDefs.Byte = 0; DestinationUnreachable: IPDefs.Byte = 3; SourceQuench: IPDefs.Byte = 4; Redirect: IPDefs.Byte = 5; Echo: IPDefs.Byte = 8; TimeExceeded: IPDefs.Byte = 11; ParameterProblem: IPDefs.Byte = 12; Timestamp: IPDefs.Byte = 13; TimestampReply: IPDefs.Byte = 14; InformationRequest: IPDefs.Byte = 15; InformationReply: IPDefs.Byte = 16; <> redirectForNet: INT = 0; redirectForHost: INT = 1; redirectForServiceAndNet: INT = 2; redirectForServiceAndHost: INT = 3; ID: TYPE = IPDefs.DByte; -- Beware, only contained in some types of messages default: ID = LAST[ID]; BodyRec: TYPE = MACHINE DEPENDENT RECORD[ -- body of ICMP messages that have an ID type (0: 0..7): IPDefs.Byte, code (0: 8..15): IPDefs.Byte, checksum (1): IPDefs.DByte, id (2): ID, sequenceNo (3): IPDefs.DByte, data (4): DataBuffer ]; RedirectBody: TYPE = MACHINE DEPENDENT RECORD[ -- body of ICMP Redirect message type (0: 0..7): IPDefs.Byte, code (0: 8..15): IPDefs.Byte, checksum (1): IPDefs.DByte, gateway (2): IPDefs.Address, header (4): IPDefs.InternetHeader]; Handle: TYPE = REF HandleRec; HandleRec: TYPE = RECORD [ local: ID, him: IPDefs.Address ]; Create: PROC [him: IPDefs.Address, local: ID _ default] RETURNS [Handle]; Destroy: PROC [Handle]; Receive: PROC [handle: Handle, timeout: INT] RETURNS [data: IPDefs.Datagram]; < Forever>> Send: PROC [handle: Handle, data: IPDefs.Datagram, length: INT]; SendReply: PROC [data: IPDefs.Datagram]; END.