View Source dns (dns_erlang v3.1.0)
The dns
module is the primary entry point for the functionality in this library.
The module exports various types used in type specs, such as message/0
, which indicates
a #dns_message{}
record, query/0
which represents a single #dns_query{}
record,
questions/0
, which represents a list of queries, etc.
It also exports functions for encoding and decoding messages, TSIG supporting functions, and various utility functions for comparing domain names, converting domain names into different cases, converting to and from label lists, etc.
Summary
Types
-type alg() :: 3 | 6 | 5 | 7 | 8 | 10.
-type answers() :: [rr()].
-type authority() :: [rr()].
-type class() :: uint16().
-opaque compmap()
-type decode_error() :: formerr | truncated | trailing_garbage.
-type dname() :: binary().
-type encode_message_opt() :: {max_size, 512..65535} | {tc_mode, default | axfr | llq_event} | {tsig, [encode_message_tsig_opt()]}.
-type encode_message_tsig_opt() :: {msgid, message_id()} | {alg, tsig_alg()} | {name, dname()} | {secret, binary()} | {errcode, tsig_error()} | {other, binary()} | tsig_opt().
-type eoptcode() :: 0..65535.
-type ercode() :: 0 | 16.
-type label() :: binary().
-type llqerrcode() :: 0..6.
-type llqopcode() :: 1..3.
-type message() :: #dns_message{id :: dns:message_id(), qr :: boolean(), oc :: dns:opcode(), aa :: boolean(), tc :: boolean(), rd :: boolean(), ra :: boolean(), ad :: boolean(), cd :: boolean(), rc :: dns:rcode(), qc :: dns:uint16(), anc :: dns:uint16(), auc :: dns:uint16(), adc :: dns:uint16(), questions :: dns:questions(), answers :: dns:answers(), authority :: dns:authority(), additional :: dns:additional()}.
-type message_bin() :: <<_:64, _:_*8>>.
-type message_id() :: uint16().
-type opcode() :: uint4().
-type opt_ecs() :: #dns_opt_ecs{family :: dns:uint16(), source_prefix_length :: dns:uint8(), scope_prefix_length :: dns:uint8(), address :: binary()}.
-type opt_llq() :: #dns_opt_llq{opcode :: dns:uint16(), errorcode :: dns:uint16(), id :: dns:uint64(), leaselife :: dns:uint32()}.
-type opt_nsid() :: #dns_opt_nsid{data :: binary()}.
-type opt_owner() :: #dns_opt_owner{seq :: dns:uint8(), primary_mac :: <<_:(6 * 8)>>, wakeup_mac :: <<>> | <<_:(6 * 8)>>, password :: <<>> | <<_:(6 * 8)>>}.
-type opt_ul() :: #dns_opt_ul{lease :: dns:uint32()}.
-type optrr() :: #dns_optrr{udp_payload_size :: dns:uint16(), ext_rcode :: dns:uint8(), version :: dns:uint8(), dnssec :: boolean(), data :: [dns:optrr_elem()]}.
-type questions() :: [query()].
-type rcode() :: uint4().
-type rr() :: #dns_rr{name :: dns:dname(), type :: dns:type(), class :: dns:class(), ttl :: dns:ttl(), data :: dns:rrdata()}.
-type rrdata() :: binary() | #dns_rrdata_a{ip :: inet:ip4_address()} | #dns_rrdata_aaaa{ip :: inet:ip6_address()} | #dns_rrdata_afsdb{subtype :: dns:uint16(), hostname :: dns:dname()} | #dns_rrdata_caa{flags :: dns:uint8(), tag :: binary(), value :: binary()} | #dns_rrdata_cdnskey{flags :: dns:uint16(), protocol :: dns:uint8(), alg :: dns:uint8(), public_key :: iodata(), key_tag :: integer()} | #dns_rrdata_cds{keytag :: dns:uint16(), alg :: dns:uint8(), digest_type :: dns:uint8(), digest :: binary()} | #dns_rrdata_cert{type :: dns:uint16(), key_tag :: dns:uint16(), alg :: dns:uint8(), cert :: binary()} | #dns_rrdata_cname{dname :: dns:dname()} | #dns_rrdata_dhcid{data :: binary()} | #dns_rrdata_dlv{keytag :: dns:uint16(), alg :: dns:uint8(), digest_type :: dns:uint8(), digest :: binary()} | #dns_rrdata_dname{dname :: dns:dname()} | #dns_rrdata_dnskey{flags :: dns:uint16(), protocol :: dns:uint8(), alg :: dns:uint8(), public_key :: iodata(), key_tag :: integer()} | #dns_rrdata_ds{keytag :: dns:uint16(), alg :: dns:uint8(), digest_type :: dns:uint8(), digest :: binary()} | #dns_rrdata_hinfo{cpu :: binary(), os :: binary()} | #dns_rrdata_ipseckey{precedence :: dns:uint8(), alg :: dns:uint8(), gateway :: dns:dname() | inet:ip_address(), public_key :: binary()} | #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()} | #dns_rrdata_kx{preference :: dns:uint16(), exchange :: dns:dname()} | #dns_rrdata_loc{size :: integer(), horiz :: integer(), vert :: integer(), lat :: dns:uint32(), lon :: dns:uint32(), alt :: dns:uint32()} | #dns_rrdata_mb{madname :: dns:dname()} | #dns_rrdata_mg{madname :: dns:dname()} | #dns_rrdata_minfo{rmailbx :: dns:dname(), emailbx :: dns:dname()} | #dns_rrdata_mr{newname :: dns:dname()} | #dns_rrdata_mx{preference :: dns:uint16(), exchange :: dns:dname()} | #dns_rrdata_naptr{order :: dns:uint16(), preference :: dns:uint16(), flags :: binary(), services :: binary(), regexp :: binary(), replacement :: dns:dname()} | #dns_rrdata_ns{dname :: dns:dname()} | #dns_rrdata_nsec{next_dname :: dns:dname(), types :: [non_neg_integer()]} | #dns_rrdata_nsec3{hash_alg :: dns:uint8(), opt_out :: boolean(), iterations :: dns:uint16(), salt :: binary(), hash :: binary(), types :: [non_neg_integer()]} | #dns_rrdata_nsec3param{hash_alg :: dns:uint8(), flags :: dns:uint8(), iterations :: dns:uint16(), salt :: binary()} | #dns_rrdata_nxt{dname :: dns:dname(), types :: [non_neg_integer()]} | #dns_rrdata_ptr{dname :: dns:dname()} | #dns_rrdata_rp{mbox :: dns:dname(), txt :: dns:dname()} | #dns_rrdata_rrsig{type_covered :: dns:uint16(), alg :: 3 | 5 | 6 | 7 | 8 | 10, labels :: dns:uint8(), original_ttl :: dns:uint32(), expiration :: dns:uint32(), inception :: dns:uint32(), key_tag :: dns:uint16(), signers_name :: dns:dname(), signature :: binary()} | #dns_rrdata_rt{preference :: dns:uint16(), host :: dns:dname()} | #dns_rrdata_soa{mname :: dns:dname(), rname :: dns:dname(), serial :: dns:uint32(), refresh :: dns:uint32(), retry :: dns:uint32(), expire :: dns:uint32(), minimum :: dns:uint32()} | #dns_rrdata_spf{spf :: [binary()]} | #dns_rrdata_srv{priority :: dns:uint16(), weight :: dns:uint16(), port :: dns:uint16(), target :: dns:dname()} | #dns_rrdata_svcb{svc_priority :: dns:uint16(), target_name :: dns:dname(), svc_params :: dns:svcb_svc_params()} | #dns_rrdata_sshfp{alg :: dns:uint8(), fp_type :: dns:uint8(), fp :: binary()} | #dns_rrdata_tsig{alg :: dns:tsig_alg(), time :: dns:uint48(), fudge :: dns:uint16(), mac :: binary(), msgid :: dns:uint16(), err :: dns:uint16(), other :: binary()} | #dns_rrdata_txt{txt :: [binary()]}.
-type rrdata_rrsig() :: #dns_rrdata_rrsig{type_covered :: dns:uint16(), alg :: 3 | 5 | 6 | 7 | 8 | 10, labels :: dns:uint8(), original_ttl :: dns:uint32(), expiration :: dns:uint32(), inception :: dns:uint32(), key_tag :: dns:uint16(), signers_name :: dns:dname(), signature :: binary()}.
-type tsig_alg() :: binary().
-type tsig_error() :: 0 | 16..18.
-type tsig_mac() :: binary().
-type tsig_opt() :: {time, unix_time()} | {fudge, non_neg_integer()} | {mac, tsig_mac()} | {tail, boolean()}.
-type ttl() :: 0..1 bsl 31 - 1.
-type type() :: uint16().
-type uint2() :: 0..1.
-type uint4() :: 0..15.
-type uint8() :: 0..1 bsl 8 - 1.
-type uint16() :: 0..1 bsl 16 - 1.
-type uint32() :: 0..1 bsl 32 - 1.
-type uint48() :: 0..1 bsl 48 - 1.
-type uint64() :: 0..1 bsl 64 - 1.
-type unix_time() :: 0..4294967295.
Functions
-spec decode_message(message_bin()) -> {decode_error(), message() | undefined, binary()} | message().
-spec encode_dname(binary()) -> nonempty_binary().
-spec encode_message(message()) -> message_bin().
-spec encode_message(message(), [encode_message_opt()]) -> {false, message_bin()} | {true, message_bin(), message()} | {false, message_bin(), tsig_mac()} | {true, message_bin(), tsig_mac(), message()}.
-spec llqerrcode_name(llqerrcode()) -> binary() | undefined.
-spec random_id() -> message_id().
-spec tsigerr_name(tsig_error()) -> binary() | undefined.
-spec unix_time() -> unix_time().
-spec unix_time(erlang:timestamp() | calendar:datetime1970()) -> unix_time().
-spec verify_tsig(message_bin(), dname(), binary()) -> {ok, tsig_mac()} | {error, tsig_error()}.
-spec verify_tsig(message_bin(), dname(), binary(), [tsig_opt()]) -> {ok, tsig_mac()} | {error, tsig_error()}.