1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20%%
21%% Defintion for Domain Name System
22%%
23
24%%
25%% Currently defined opcodes
26%%
27-define(QUERY,    16#0).          %% standard query
28-define(IQUERY,   16#1).	      %% inverse query
29-define(STATUS,   16#2).	      %% nameserver status query
30%% -define(xxx,   16#3)  %% 16#3 reserved
31%%  non standard
32-define(UPDATEA,  16#9).	       %% add resource record
33-define(UPDATED,  16#a).	       %% delete a specific resource record
34-define(UPDATEDA, 16#b).	       %% delete all nemed resource record
35-define(UPDATEM,  16#c).	       %% modify a specific resource record
36-define(UPDATEMA, 16#d).	       %% modify all named resource record
37
38-define(ZONEINIT, 16#e).	       %% initial zone transfer
39-define(ZONEREF,  16#f).	       %% incremental zone referesh
40
41
42%%
43%% Currently defined response codes
44%%
45-define(NOERROR,  0).		%% no error
46-define(FORMERR,  1).		%% format error
47-define(SERVFAIL, 2).		%% server failure
48-define(NXDOMAIN, 3).		%% non existent domain
49-define(NOTIMP,	  4).		%% not implemented
50-define(REFUSED,  5).		%% query refused
51%%	non standard
52-define(NOCHANGE, 16#f).		%% update failed to change db
53-define(BADVERS,  16).
54
55%%
56%% Type values for resources and queries
57%%
58-define(T_A,		1).		%% host address
59-define(T_NS,		2).		%% authoritative server
60-define(T_MD,		3).		%% mail destination
61-define(T_MF,		4).		%% mail forwarder
62-define(T_CNAME,	5).		%% connonical name
63-define(T_SOA,		6).		%% start of authority zone
64-define(T_MB,		7).		%% mailbox domain name
65-define(T_MG,		8).		%% mail group member
66-define(T_MR,		9).		%% mail rename name
67-define(T_NULL,		10).		%% null resource record
68-define(T_WKS,		11).		%% well known service
69-define(T_PTR,		12).		%% domain name pointer
70-define(T_HINFO,	13).		%% host information
71-define(T_MINFO,	14).		%% mailbox information
72-define(T_MX,		15).		%% mail routing information
73-define(T_TXT,		16).		%% text strings
74-define(T_AAAA,         28).            %% ipv6 address
75%% SRV (RFC 2052)
76-define(T_SRV,          33).            %% services
77%% NAPTR (RFC 2915)
78-define(T_NAPTR,        35).            %% naming authority pointer
79-define(T_OPT,          41).            %% EDNS pseudo-rr RFC2671(7)
80%% SPF (RFC 4408)
81-define(T_SPF,          99).            %% server policy framework
82%%      non standard
83-define(T_UINFO,	100).		%% user (finger) information
84-define(T_UID,		101).		%% user ID
85-define(T_GID,		102).		%% group ID
86-define(T_UNSPEC,	103).		%% Unspecified format (binary data)
87%%	Query type values which do not appear in resource records
88-define(T_AXFR,		252).		%% transfer zone of authority
89-define(T_MAILB,	253).		%% transfer mailbox records
90-define(T_MAILA,	254).		%% transfer mail agent records
91-define(T_ANY,		255).		%% wildcard match
92%% URI (RFC 7553)
93-define(T_URI,		256).		%% uniform resource identifier
94%% CAA (RFC 6844)
95-define(T_CAA,		257).		%% certification authority authorization
96
97%%
98%% Symbolic Type values for resources and queries
99%%
100-define(S_A,		a).		%% host address
101-define(S_NS,		ns).		%% authoritative server
102-define(S_MD,		md).		%% mail destination
103-define(S_MF,		mf).		%% mail forwarder
104-define(S_CNAME,	cname).		%% connonical name
105-define(S_SOA,		soa).		%% start of authority zone
106-define(S_MB,		mb).		%% mailbox domain name
107-define(S_MG,		mg).		%% mail group member
108-define(S_MR,		mr).		%% mail rename name
109-define(S_NULL,		null).		%% null resource record
110-define(S_WKS,		wks).		%% well known service
111-define(S_PTR,		ptr).		%% domain name pointer
112-define(S_HINFO,	hinfo).		%% host information
113-define(S_MINFO,	minfo).		%% mailbox information
114-define(S_MX,		mx).		%% mail routing information
115-define(S_TXT,		txt).		%% text strings
116-define(S_AAAA,         aaaa).          %% ipv6 address
117%% SRV (RFC 2052)
118-define(S_SRV,          srv).           %% services
119%% NAPTR (RFC 2915)
120-define(S_NAPTR,        naptr).         %% naming authority pointer
121-define(S_OPT,          opt).           %% EDNS pseudo-rr RFC2671(7)
122%% SPF (RFC 4408)
123-define(S_SPF,          spf).           %% server policy framework
124%%      non standard
125-define(S_UINFO,	uinfo).		%% user (finger) information
126-define(S_UID,		uid).		%% user ID
127-define(S_GID,		gid).		%% group ID
128-define(S_UNSPEC,	unspec).        %% Unspecified format (binary data)
129%%	Query type values which do not appear in resource records
130-define(S_AXFR,		axfr).		%% transfer zone of authority
131-define(S_MAILB,	mailb).		%% transfer mailbox records
132-define(S_MAILA,	maila).		%% transfer mail agent records
133-define(S_ANY,		any).		%% wildcard match
134%% URI (RFC 7553)
135-define(S_URI,		uri).		%% uniform resource identifier
136%% CAA (RFC 6844)
137-define(S_CAA,		caa).		%% certification authority authorization
138
139%%
140%% Values for class field
141%%
142
143-define(C_IN,		1).      	%% the arpa internet
144-define(C_CHAOS,	3).		%% for chaos net at MIT
145-define(C_HS,		4).		%% for Hesiod name server at MIT
146%%  Query class values which do not appear in resource records
147-define(C_ANY,		255).		%% wildcard match
148
149
150%% indirection mask for compressed domain names
151-define(INDIR_MASK, 16#c0).
152
153%%
154%% Structure for query header, the order of the fields is machine and
155%% compiler dependent, in our case, the bits within a byte are assignd
156%% least significant first, while the order of transmition is most
157%% significant first.  This requires a somewhat confusing rearrangement.
158%%
159-record(dns_header,
160	{
161	 id = 0,       %% ushort query identification number
162	 %% byte F0
163	 qr = 0,       %% :1   response flag
164	 opcode = 0,   %% :4   purpose of message
165	 aa = 0,       %% :1   authoritive answer
166	 tc = 0,       %% :1   truncated message
167	 rd = 0,       %% :1   recursion desired
168	 %% byte F1
169	 ra = 0,       %% :1   recursion available
170	 pr = 0,       %% :1   primary server required (non standard)
171	               %% :2   unused bits
172	 rcode = 0     %% :4   response code
173	}).
174
175-record(dns_rec,
176	{
177	 header,       %% dns_header record
178	 qdlist = [],  %% list of question entries
179	 anlist = [],  %% list of answer entries
180	 nslist = [],  %% list of authority entries
181	 arlist = []   %% list of resource entries
182	}).
183
184%% DNS resource record
185-record(dns_rr,
186	{
187	 domain = "",   %% resource domain
188	 type = any,    %% resource type
189	 class = in,    %% reource class
190	 cnt = 0,       %% access count
191	 ttl = 0,       %% time to live
192	 data = [],     %% raw data
193	  %%
194	 tm,            %% creation time
195         bm = [],       %% Bitmap storing domain character case information.
196         func = false   %% Was: Optional function calculating the data field.
197         %%                Now: cache-flush Class flag from mDNS RFC 6762
198	}).
199
200-define(DNS_UDP_PAYLOAD_SIZE, 1280).
201
202-record(dns_rr_opt,           %% EDNS RR OPT (RFC2671), dns_rr{type=opt}
203	{
204	  domain = "",        %% should be the root domain
205	  type = opt,
206	  udp_payload_size = ?DNS_UDP_PAYLOAD_SIZE, %% RFC2671(4.5 CLASS)
207	  ext_rcode = 0,      %% RFC2671(4.6 EXTENDED-RCODE)
208	  version = 0,        %% RFC2671(4.6 VERSION)
209	  z = 0,              %% RFC2671(4.6 Z)
210	  data = []           %% RFC2671(4.4)
211	 }).
212
213-record(dns_query,
214	{
215	 domain,                    %% query domain
216	 type,                      %% query type
217	 class,                     %% query class
218         unicast_response = false   %% mDNS RFC 6762 Class flag
219	 }).
220