242 lines
6.8 KiB
Groff
242 lines
6.8 KiB
Groff
with System;
|
|
|
|
--# inherit System;
|
|
package DNS_Types is
|
|
Packet_Size : constant := 8192;
|
|
Header_Bits : constant := 96;
|
|
|
|
type QNAME_PTR_RANGE is range 0..2**14-1;
|
|
|
|
type Packet_Length_Range is range 0..Packet_Size;
|
|
--# assert Packet_Length_Range'Base is Integer;
|
|
UDP_Max_Size : constant Packet_Length_Range := 512;
|
|
|
|
type Packet_Bytes_Range is range 1..(Packet_Size - Header_Bits/8);
|
|
--# assert Packet_Bytes_Range'Base is Integer;
|
|
|
|
type Byte is mod 256;
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Byte'Size use 8;
|
|
--# end accept;
|
|
|
|
|
|
type Unsigned_Short is range 0 .. 2**16 - 1;
|
|
--# assert Unsigned_Short'Base is Integer;
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Unsigned_Short'Size use 16;
|
|
--# end accept;
|
|
|
|
-- used in OPCODE field below
|
|
type Opcode_Type is (Query, IQuery, Status);
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Opcode_Type'Size use 4;
|
|
--# end accept;
|
|
|
|
-- used in RCODE field below
|
|
type Response_Code is
|
|
(No_Error,
|
|
Format_Error,
|
|
Server_Failure,
|
|
Name_Error,
|
|
Not_Implemented,
|
|
Refused);
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Response_Code'Size use 4;
|
|
--# end accept;
|
|
|
|
|
|
-- See http://www.zytrax.com/books/dns/ch15/ for a description
|
|
-- of these fields.
|
|
type Header_Type is
|
|
record
|
|
-- 16 bit message ID supplied by requester and mirrored by responder
|
|
MessageID : Unsigned_Short;
|
|
-- False for query, true for response
|
|
QR : Boolean;
|
|
-- 0 for query, 1 for inverse query, 2 for status request
|
|
Opcode : Opcode_Type;
|
|
-- Authoritative Answer (response only)
|
|
AA : Boolean;
|
|
-- Truncated (partial message, true until last portion)
|
|
TC : Boolean;
|
|
-- recursion desired (query)
|
|
RD : Boolean;
|
|
-- recursion available (response)
|
|
RA : Boolean;
|
|
-- Reserved for future use (zone transfers??)
|
|
Res1 : Boolean;
|
|
Res2 : Boolean;
|
|
Res3 : Boolean;
|
|
-- response code.
|
|
RCODE : Response_Code;
|
|
-- number of queries (echo in answer!)
|
|
QDCOUNT : Unsigned_Short;
|
|
-- number of answers
|
|
ANCOUNT : Unsigned_Short;
|
|
-- number of name server resource records
|
|
NSCOUNT : Unsigned_Short;
|
|
-- number of additional records
|
|
ARCOUNT : Unsigned_Short;
|
|
end record;
|
|
-- for Header use record
|
|
-- MessageID at 0 range 0..15;
|
|
-- QR at 0 range 23..23;
|
|
-- Opcode at 0 range 19..22;
|
|
-- AA at 0 range 18..18;
|
|
-- TC at 0 range 17..17;
|
|
-- RD at 0 range 16..16;
|
|
-- RA at 0 range 31..31;
|
|
-- Res1 at 0 range 30..30;
|
|
-- Res2 at 0 range 29..29;
|
|
-- Res3 at 0 range 28..28;
|
|
-- RCODE at 0 range 24..27;
|
|
-- QDCOUNT at 4 range 0..15;
|
|
-- ANCOUNT at 4 range 16..31;
|
|
-- NSCOUNT at 8 range 0..15;
|
|
-- ARCOUNT at 8 range 16..31;
|
|
-- end record;
|
|
-- for Header'Bit_Order use System.Low_Order_First;
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Header_Type use record
|
|
MessageID at 0 range 16..31;
|
|
QR at 0 range 8..8;
|
|
Opcode at 0 range 9..12;
|
|
AA at 0 range 13..13;
|
|
TC at 0 range 14..14;
|
|
RD at 0 range 15..15;
|
|
RA at 0 range 0..0;
|
|
Res1 at 0 range 1..1;
|
|
Res2 at 0 range 2..2;
|
|
Res3 at 0 range 3..3;
|
|
RCODE at 0 range 4..7;
|
|
QDCOUNT at 4 range 16..31;
|
|
ANCOUNT at 4 range 0..15;
|
|
NSCOUNT at 8 range 16..31;
|
|
ARCOUNT at 8 range 0..15;
|
|
end record;
|
|
for Header_Type'Size use Header_Bits;
|
|
for Header_Type'Bit_Order use System.High_Order_First;
|
|
--# end accept;
|
|
|
|
Empty_Header : constant Header_Type := Header_Type'(
|
|
MessageID => 0,
|
|
QR => False,
|
|
Opcode => Query,
|
|
Rcode => No_Error,
|
|
AA => False,
|
|
TC => False,
|
|
RD => False,
|
|
RA => False,
|
|
Res1 => False,
|
|
Res2 => False,
|
|
Res3 => False,
|
|
QDCOUNT => 0,
|
|
ANCOUNT => 0,
|
|
NSCOUNT => 0,
|
|
ARCOUNT => 0);
|
|
|
|
function Byte_Swap_US(U : Unsigned_Short) return Unsigned_Short;
|
|
--# accept Warning, 3, "Inline ok";
|
|
pragma Inline(Byte_Swap_US);
|
|
--# end accept;
|
|
|
|
-- swap bytes in Unsigned_Short fields
|
|
-- to switch between network and host order for little endian machines
|
|
procedure Byte_Swap (
|
|
H : in out Header_Type);
|
|
--# derives H from H;
|
|
--# post H = H~[MessageID => Byte_Swap_US(H~.MessageID);
|
|
--# QDCount => Byte_Swap_US(H~.QDCount);
|
|
--# ANCount => Byte_Swap_US(H~.ANCount);
|
|
--# NSCount => Byte_Swap_US(H~.NSCount);
|
|
--# ARCount => Byte_Swap_US(H~.ARCount)];
|
|
type Query_Class is
|
|
(IN_CLASS,
|
|
CH_CLASS,
|
|
HS_CLASS,
|
|
NONE_CLASS,
|
|
ANY_CLASS);
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Query_Class use
|
|
(
|
|
IN_CLASS => 1,
|
|
CH_CLASS => 3,
|
|
HS_CLASS => 4,
|
|
NONE_CLASS => 254,
|
|
ANY_CLASS => 255);
|
|
for Query_Class'Size use 16;
|
|
--# end accept;
|
|
|
|
type Query_Type is
|
|
(A,
|
|
NS,
|
|
CNAME,
|
|
SOA,
|
|
WKS,
|
|
PTR,
|
|
MX,
|
|
AAAA,
|
|
SRV,
|
|
A6,
|
|
OPT,
|
|
--DNSSEC
|
|
DS,
|
|
RRSIG,
|
|
NSEC,
|
|
DNSKEY,
|
|
--
|
|
ANY,
|
|
CAA,
|
|
ERROR,
|
|
UNIMPLEMENTED);
|
|
--# accept Warning, 2, "representation clause ok";
|
|
for Query_Type use
|
|
(
|
|
A => 1,
|
|
NS => 2,
|
|
CNAME => 5,
|
|
SOA => 6,
|
|
WKS => 11,
|
|
PTR => 12,
|
|
MX => 15,
|
|
AAAA => 28,
|
|
SRV => 33,
|
|
A6 => 38,
|
|
OPT => 41,
|
|
DS => 43,
|
|
RRSIG => 46,
|
|
NSEC => 47,
|
|
DNSKEY => 48,
|
|
ANY => 255,
|
|
CAA => 257,
|
|
ERROR => 65280,
|
|
UNIMPLEMENTED => 65281);
|
|
for Query_Type'Size use 16;
|
|
--# end accept;
|
|
|
|
type EDNS_Record is record
|
|
Root : Character;
|
|
Code : Query_Type;
|
|
Payload_Size : Unsigned_Short;
|
|
RCode : Byte;
|
|
Version : Byte;
|
|
ZTop : Byte;
|
|
ZBottom : Byte;
|
|
end record;
|
|
--this record won't pack b/c payload_size isn't aligned correctly.
|
|
--for EDNS_Record'Size use 9*8;
|
|
--for EDNS_Record'Bit_Order use System.High_Order_First;
|
|
|
|
type Bytes_Array_Type is array(Packet_Bytes_Range) of Byte;
|
|
|
|
type DNS_Packet is record
|
|
Header : Header_Type;
|
|
Bytes : Bytes_Array_Type;
|
|
end record;
|
|
type DNS_Tcp_Packet is record
|
|
Length : Unsigned_Short;
|
|
Rest : DNS_Packet;
|
|
end record;
|
|
end Dns_Types;
|
|
|