<> <> <> DIRECTORY ArpaBuf USING [Hdr], ArpaUDPBuf USING [Hdr, maxBodyBytes], Basics USING [FWORD, HWORD], CommBuffer USING [Overhead]; ArpaNameUDPBuf: CEDAR DEFINITIONS = BEGIN HWORD: TYPE ~ Basics.HWORD; FWORD: TYPE ~ Basics.FWORD; maxBytes: CARDINAL ~ ArpaUDPBuf.maxBodyBytes; Type: TYPE = MACHINE DEPENDENT { query(0), response(1)}; Opcode: TYPE = MACHINE DEPENDENT { query(0), iquery(1), -- inverse query (obsolete) cquerym(2), -- completion query - multiple (obsolete) cqueryu(3), -- completion query - unique (obsolete) spare(15)}; ResponseCode: TYPE = MACHINE DEPENDENT { ok(0), -- no errors format(1), -- format error serverFailed(2), -- server failure nameError(3), -- no such name exists notImplemented(4), -- name server doesn't support query type refused(5), -- name server refused operation spare(15)}; <
> Hdr: TYPE = MACHINE DEPENDENT RECORD [ <> id (0): CARD16, -- packet id qr(1: 0..0): Type _ query, -- packet type opcode (1: 1..4): Opcode _ query, -- operation authoritative (1: 5..5): BOOL _ FALSE, -- authority asserted for answer resource records truncated (1: 6..6): BOOL _ FALSE, -- packet truncated ( > 512 byte datagram) recurDesired (1: 7..7): BOOL _ FALSE, -- recursion desired recurAvail (1: 8..8): BOOL _ FALSE, -- recursion available spare (1: 9..11): BOOL, rcode (1: 12..15): ResponseCode _ ok, -- response code qdCount(2): CARD16 _ 0, -- query record count anCount(3): CARD16 _ 0, -- answer record count nsCount(4): CARD16 _ 0, -- name server record count arCount(5): CARD16 _ 0]; -- additional record count hdrBytes: CARDINAL ~ BYTES[Hdr]; <> Body: TYPE ~ MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM bytes => [bytes: PACKED ARRAY [0..maxBodyBytes) OF BYTE], chars => [chars: PACKED ARRAY [0..maxBodyChars) OF CHAR], hWords => [hWords: PACKED ARRAY [0..maxBodyHWords) OF HWORD], fWords => [fWords: PACKED ARRAY [0..maxBodyFWords) OF FWORD] ENDCASE ]; maxBodyBytes: CARDINAL ~ maxBytes - hdrBytes; maxBodyChars: CARDINAL ~ maxBodyBytes; maxBodyHWords: CARDINAL ~ maxBodyBytes/BYTES[HWORD]; maxBodyFWords: CARDINAL ~ maxBodyBytes/BYTES[FWORD]; <<>> <> Packet: TYPE ~ REF PacketObject; PacketObject: TYPE ~ MACHINE DEPENDENT RECORD [ hdr: Hdr, body: Body]; <> <> <<>> Buffer: TYPE ~ REF BufferObject; BufferObject: TYPE ~ MACHINE DEPENDENT RECORD [ ovh: CommBuffer.Overhead, hdr1: ArpaBuf.Hdr, hdr2: ArpaUDPBuf.Hdr, hdr3: Hdr, body: Body]; END.