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