Packages
An Erlang DNS message library that supports most common record types, TSIG authenticated messages, EDNS0 and DNSSEC.
Current section
Files
Jump to
Current section
Files
include/dns_records.hrl
-ifndef('DNS_RECORDS').
-define('DNS_RECORDS', ok).
-include("./dns_terms.hrl").
%% DNS Message format. See RFC 1035: §4.1.1.
-record(dns_message, {
id = dns:random_id() :: dns:message_id(),
qr = false :: boolean(),
oc = ?DNS_OPCODE_QUERY :: dns:opcode(),
aa = false :: boolean(),
tc = false :: boolean(),
rd = false :: boolean(),
ra = false :: boolean(),
ad = false :: boolean(),
cd = false :: boolean(),
rc = ?DNS_RCODE_NOERROR :: dns:rcode(),
qc = 0 :: dns:uint16(),
anc = 0 :: dns:uint16(),
auc = 0 :: dns:uint16(),
adc = 0 :: dns:uint16(),
questions = [] :: dns:questions(),
answers = [] :: dns:answers(),
authority = [] :: dns:authority(),
additional = [] :: dns:additional()
}).
%% DNS Query format. See RFC 1035.
-record(dns_query, {
name :: dns:dname(),
class = ?DNS_CLASS_IN :: dns:class(),
type :: dns:type()
}).
%% DNS Resource Record format. See RFC 1035.
-record(dns_rr, {
name :: dns:dname(),
type :: dns:type(),
class = ?DNS_CLASS_IN :: dns:class(),
ttl = 0 :: dns:ttl(),
data :: dns:rrdata()
}).
%% A record for IPv4 addresses. See RFC 1035.
-record(dns_rrdata_a, {
ip :: inet:ip4_address()
}).
%% AAAA record for IPv6 addresses. See RFC 3596.
-record(dns_rrdata_aaaa, {
ip :: inet:ip6_address()
}).
%% AFSDB record for AFS database location. See RFC 1183.
-record(dns_rrdata_afsdb, {
subtype :: dns:uint16(),
hostname :: dns:dname()
}).
%% CAA record for Certificate Authority Authorization. See RFC 6844: §5.
-record(dns_rrdata_caa, {
flags :: dns:uint8(),
tag :: binary(),
value :: binary()
}).
%% CERT record for storing certificates in DNS. See RFC 4398.
-record(dns_rrdata_cert, {
type :: dns:uint16(),
keytag :: dns:uint16(),
alg :: dns:uint8(),
cert :: binary()
}).
%% CNAME record for canonical name. See RFC 1035: §3.3.1.
-record(dns_rrdata_cname, {
dname :: dns:dname()
}).
%% DHCID record for DHCP Information. See RFC 4701: §3.1.
-record(dns_rrdata_dhcid, {
data :: binary()
}).
%% OPENPGPKEY record for OpenPGP public key. See RFC 7929.
-record(dns_rrdata_openpgpkey, {
data :: binary()
}).
%% DLV record for DNSSEC Lookaside Validation. See RFC 4431. As dns_rrdata_ds.
-record(dns_rrdata_dlv, {
keytag :: dns:uint16(),
alg :: dns:uint8(),
digest_type :: dns:uint8(),
digest :: binary()
}).
%% DNAME record for delegation of reverse mapping. See RFC 6672: §2.1.
-record(dns_rrdata_dname, {
dname :: dns:dname()
}).
%% DNSKEY record for DNSSEC public key. See RFC 4034: §2.1.
-record(dns_rrdata_dnskey, {
flags :: dns:uint16(),
protocol :: dns:uint8(),
alg :: dns:uint8(),
public_key :: iodata(),
keytag :: integer()
}).
%% CDNSKEY record for Child DNSKEY. See RFC 7344.
-record(dns_rrdata_cdnskey, {
flags :: dns:uint16(),
protocol :: dns:uint8(),
alg :: dns:uint8(),
public_key :: iodata(),
keytag :: integer()
}).
%% DS record for Delegation Signer. See RFC 4034: §5.1.
-record(dns_rrdata_ds, {
keytag :: dns:uint16(),
alg :: dns:uint8(),
digest_type :: dns:uint8(),
digest :: binary()
}).
%% CDS record for Child DS. See RFC 7344.
-record(dns_rrdata_cds, {
keytag :: dns:uint16(),
alg :: dns:uint8(),
digest_type :: dns:uint8(),
digest :: binary()
}).
%% ZONEMD record for Zone Metadata. See RFC 8976: §2.2.
-record(dns_rrdata_zonemd, {
serial :: dns:uint32(),
scheme :: dns:uint8(),
algorithm :: dns:uint8(),
hash :: binary()
}).
%% HINFO record for host information. See RFC 1035: §3.3.2.
-record(dns_rrdata_hinfo, {
%% each binary is less than 255 bytes
cpu :: binary(),
os :: binary()
}).
%% IPSECKEY record for storing IPsec keying material. See RFC 4025: §2.
-record(dns_rrdata_ipseckey, {
precedence :: dns:uint8(),
alg :: dns:uint8(),
gateway :: dns:dname() | inet:ip_address(),
public_key :: binary()
}).
%% KEY record for storing public keys. See RFC 2535: §3.1.
-record(dns_rrdata_key, {
type :: dns:uint2(),
xt :: 0..1,
name_type :: dns:uint2(),
sig :: dns:uint4(),
protocol :: dns:uint8(),
alg :: dns:uint8(),
public_key :: binary()
}).
%% KX record for Key Exchanger. See RFC 2230: §3.1.
-record(dns_rrdata_kx, {
preference :: dns:uint16(),
exchange :: dns:dname()
}).
%% LOC record for geographical location. See RFC 1876: §2.
-record(dns_rrdata_loc, {
size :: integer(),
horiz :: integer(),
vert :: integer(),
lat :: dns:uint32(),
lon :: dns:uint32(),
alt :: dns:uint32()
}).
%% MB record for mailbox domain name. See RFC 1035: §3.3.3.
-record(dns_rrdata_mb, {
madname :: dns:dname()
}).
%% MG record for mail group member. See RFC 1035: §3.3.6.
-record(dns_rrdata_mg, {
madname :: dns:dname()
}).
%% MINFO record for mailbox information. See RFC 1035: §3.3.7.
-record(dns_rrdata_minfo, {
rmailbx :: dns:dname(),
emailbx :: dns:dname()
}).
%% MR record for mail rename domain name. See RFC 1035: §3.3.8.
-record(dns_rrdata_mr, {
newname :: dns:dname()
}).
%% MX record for mail exchange. See RFC 1035: §3.3.9.
-record(dns_rrdata_mx, {
preference :: dns:uint16(),
exchange :: dns:dname()
}).
%% NAPTR record for Naming Authority Pointer. See RFC 3403: §4.1.
-record(dns_rrdata_naptr, {
order :: dns:uint16(),
preference :: dns:uint16(),
flags :: binary(),
services :: binary(),
regexp :: binary(),
replacement :: dns:dname()
}).
%% NS record for authoritative name server. See RFC 1035.
-record(dns_rrdata_ns, {
dname :: dns:dname()
}).
%% NSEC record for DNSSEC authenticated denial of existence. See RFC 4034: §4.1.
-record(dns_rrdata_nsec, {
next_dname :: dns:dname(),
types :: [non_neg_integer()]
}).
%% CSYNC record for child-to-parent synchronization. See RFC 7477.
-record(dns_rrdata_csync, {
soa_serial :: dns:uint32(),
flags :: dns:uint16(),
types :: [non_neg_integer()]
}).
%% DSYNC record for delegation synchronization. See RFC 9859.
-record(dns_rrdata_dsync, {
rrtype :: dns:uint16(),
scheme :: dns:uint8(),
port :: dns:uint16(),
target :: dns:dname()
}).
%% NSEC3 record for DNSSEC authenticated denial of existence. See RFC 5155: §4.2.
-record(dns_rrdata_nsec3, {
hash_alg :: dns:uint8(),
opt_out :: boolean(),
iterations :: dns:uint16(),
salt :: binary(),
hash :: binary(),
types :: [non_neg_integer()]
}).
%% NSEC3PARAM record for NSEC3 parameters. See RFC 5155.
-record(dns_rrdata_nsec3param, {
hash_alg :: dns:uint8(),
flags :: dns:uint8(),
iterations :: dns:uint16(),
salt :: binary()
}).
%% TLSA record for DANE TLS. See RFC 6698.
-record(dns_rrdata_tlsa, {
usage :: dns:uint8(),
selector :: dns:uint8(),
matching_type :: dns:uint8(),
certificate :: binary()
}).
%% SMIMEA record for S/MIME cert association. See RFC 8162.
-record(dns_rrdata_smimea, {
usage :: dns:uint8(),
selector :: dns:uint8(),
matching_type :: dns:uint8(),
certificate :: binary()
}).
%% NXT record for next domain (obsoleted by NSEC). See RFC 2535.
-record(dns_rrdata_nxt, {
dname :: dns:dname(),
types :: [non_neg_integer()]
}).
%% PTR record for domain name pointer. See RFC 1035: §3.3.12.
-record(dns_rrdata_ptr, {
dname :: dns:dname()
}).
%% RP record for responsible person. See RFC 1183: §2.2.
-record(dns_rrdata_rp, {
mbox :: dns:dname(),
txt :: dns:dname()
}).
%% RRSIG record for DNSSEC signature. See RFC 4034: §3.1.
-record(dns_rrdata_rrsig, {
type_covered :: dns:uint16(),
alg ::
?DNS_ALG_DSA
| ?DNS_ALG_RSASHA1
| ?DNS_ALG_NSEC3DSA
| ?DNS_ALG_NSEC3RSASHA1
| ?DNS_ALG_RSASHA256
| ?DNS_ALG_RSASHA512
| ?DNS_ALG_ECDSAP256SHA256
| ?DNS_ALG_ECDSAP384SHA384
| ?DNS_ALG_ED25519
| ?DNS_ALG_ED448,
labels :: dns:uint8(),
original_ttl :: dns:uint32(),
expiration :: dns:uint32(),
inception :: dns:uint32(),
keytag :: dns:uint16(),
signers_name :: dns:dname(),
signature = <<>> :: binary()
}).
%% RT record for route through. See RFC 1183: §3.3.
-record(dns_rrdata_rt, {
preference :: dns:uint16(),
host :: dns:dname()
}).
%% SOA record for start of authority. See RFC 1035: §3.3.13.
-record(dns_rrdata_soa, {
mname :: dns:dname(),
rname :: dns:dname(),
serial :: dns:uint32(),
refresh :: dns:uint32(),
retry :: dns:uint32(),
expire :: dns:uint32(),
minimum :: dns:uint32()
}).
%% SPF record for Sender Policy Framework. See RFC 4408.
-record(dns_rrdata_spf, {
%% each binary is less than 255 bytes
spf :: [binary()]
}).
%% SRV record for service location. See RFC 2782.
-record(dns_rrdata_srv, {
priority :: dns:uint16(),
weight :: dns:uint16(),
port :: dns:uint16(),
target :: dns:dname()
}).
%% SSHFP record for SSH key fingerprints. See RFC 4255: §3.1.
-record(dns_rrdata_sshfp, {
alg :: dns:uint8(),
fp_type :: dns:uint8(),
fp :: binary()
}).
%% SVCB record for service binding. See RFC 9460.
-record(dns_rrdata_svcb, {
svc_priority :: dns:uint16(),
target_name :: dns:dname(),
svc_params :: dns:svcb_svc_params()
}).
%% HTTPS record for service binding. See RFC 9460.
%% It is identical to dns_rrdata_svcb but we keep it for more consistent pattern-matching
-record(dns_rrdata_https, {
svc_priority :: dns:uint16(),
target_name :: dns:dname(),
svc_params :: dns:svcb_svc_params()
}).
%% EUI48 record for EUI-48 address. See RFC 7043.
-record(dns_rrdata_eui48, {
address :: <<_:48>>
}).
%% EUI64 record for EUI-64 address. See RFC 7043.
-record(dns_rrdata_eui64, {
address :: <<_:64>>
}).
%% URI record for uniform resource identifier. See RFC 7553.
-record(dns_rrdata_uri, {
priority :: dns:uint16(),
weight :: dns:uint16(),
target :: binary()
}).
%% RESINFO record for resource information. See RFC 9606
-record(dns_rrdata_resinfo, {
data :: [binary()]
}).
%% WALLET record for public wallet address (IANA WALLET).
%% Wire format: one or more character-strings, same as TXT.
-record(dns_rrdata_wallet, {
data :: [binary()]
}).
%% TSIG record for transaction signature. See RFC 2845: §2.3.
-record(dns_rrdata_tsig, {
alg :: dns:tsig_alg(),
time :: dns:uint48(),
fudge :: dns:uint16(),
mac :: binary(),
msgid :: dns:uint16(),
err :: dns:uint16(),
other :: binary()
}).
%% TXT record for text strings. See RFC 1035: §3.3.14.
-record(dns_rrdata_txt, {
%% each binary is less than 255 bytes
txt :: [binary()]
}).
%% OPT pseudo-RR for EDNS. See RFC 6891: §6.1.2.
-record(dns_optrr, {
udp_payload_size = 4096 :: dns:uint16(),
ext_rcode = ?DNS_ERCODE_NOERROR :: dns:uint8(),
version = 0 :: dns:uint8(),
dnssec = false :: boolean(),
data = [] :: [dns:optrr_elem()]
}).
%% LLQ EDNS option. See RFC 8764: §3.2.
-record(dns_opt_llq, {
opcode :: dns:uint16(),
errorcode :: dns:uint16(),
id :: dns:uint64(),
leaselife :: dns:uint32()
}).
%% NSID EDNS option. See RFC 5001.
-record(dns_opt_nsid, {
data :: binary()
}).
%% OWNER EDNS option. See RFC draft-cheshire-edns0-owner-option-00: §3.1.
-record(dns_opt_owner, {
seq = 0 :: dns:uint8(),
primary_mac :: <<_:48>>,
wakeup_mac :: <<>> | <<_:48>>,
password :: <<>> | <<_:48>>
}).
%% UL EDNS option. See RFC draft-sekar-dns-ul-01: §4.
-record(dns_opt_ul, {
lease :: dns:uint32()
}).
%% ECS EDNS Client Subnet option. See RFC 7871: $6:
-record(dns_opt_ecs, {
family :: dns:uint16(),
source_prefix_length :: dns:uint8(),
scope_prefix_length :: dns:uint8(),
address :: binary()
}).
%% EDNS Cookie. See RFC 7873: §4
-record(dns_opt_cookie, {
client :: <<_:64>>,
server :: undefined | <<_:64, _:_*8>>
}).
%% Extended DNS Error. See RFC 8914: §2
-record(dns_opt_ede, {
info_code :: dns:uint16(),
extra_text = <<>> :: binary()
}).
%% Unknown EDNS option.
-record(dns_opt_unknown, {
id :: integer(),
bin :: binary()
}).
-endif.