View Source dns (dns_erlang v3.1.1)

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

additional()

-type additional() :: [optrr() | rr()].

alg()

-type alg() :: 3 | 6 | 5 | 7 | 8 | 10.

answers()

-type answers() :: [rr()].

authority()

-type authority() :: [rr()].

class()

-type class() :: uint16().

compmap()

-opaque compmap()

decode_error()

-type decode_error() :: formerr | truncated | trailing_garbage.

dname()

-type dname() :: binary().

encode_message_opt()

-type encode_message_opt() ::
          {max_size, 512..65535} |
          {tc_mode, default | axfr | llq_event} |
          {tsig, [encode_message_tsig_opt()]}.

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().

eoptcode()

-type eoptcode() :: 0..65535.

ercode()

-type ercode() :: 0 | 16.

label()

-type label() :: binary().

llqerrcode()

-type llqerrcode() :: 0..6.

llqopcode()

-type llqopcode() :: 1..3.

message()

-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()}.

message_bin()

-type message_bin() :: <<_:64, _:_*8>>.

message_id()

-type message_id() :: uint16().

opcode()

-type opcode() :: uint4().

opt_ecs()

-type opt_ecs() ::
          #dns_opt_ecs{family :: dns:uint16(),
                       source_prefix_length :: dns:uint8(),
                       scope_prefix_length :: dns:uint8(),
                       address :: binary()}.

opt_llq()

-type opt_llq() ::
          #dns_opt_llq{opcode :: dns:uint16(),
                       errorcode :: dns:uint16(),
                       id :: dns:uint64(),
                       leaselife :: dns:uint32()}.

opt_nsid()

-type opt_nsid() :: #dns_opt_nsid{data :: binary()}.

opt_owner()

-type opt_owner() ::
          #dns_opt_owner{seq :: dns:uint8(),
                         primary_mac :: <<_:(6 * 8)>>,
                         wakeup_mac :: <<>> | <<_:(6 * 8)>>,
                         password :: <<>> | <<_:(6 * 8)>>}.

opt_ul()

-type opt_ul() :: #dns_opt_ul{lease :: dns:uint32()}.

opt_unknown()

-type opt_unknown() :: #dns_opt_unknown{id :: integer(), bin :: binary()}.

optrr()

-type optrr() ::
          #dns_optrr{udp_payload_size :: dns:uint16(),
                     ext_rcode :: dns:uint8(),
                     version :: dns:uint8(),
                     dnssec :: boolean(),
                     data :: [dns:optrr_elem()]}.

optrr_elem()

-type optrr_elem() :: opt_nsid() | opt_ul() | opt_unknown() | opt_ecs() | opt_llq() | opt_owner().

query()

-type query() :: #dns_query{name :: dns:dname(), class :: dns:class(), type :: dns:type()}.

questions()

-type questions() :: [query()].

rcode()

-type rcode() :: uint4().

rr()

-type rr() ::
          #dns_rr{name :: dns:dname(),
                  type :: dns:type(),
                  class :: dns:class(),
                  ttl :: dns:ttl(),
                  data :: dns:rrdata()}.

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()]}.

rrdata_rrsig()

-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()}.

svcb_svc_params()

-type svcb_svc_params() :: #{1..6 => none | char() | binary()}.

tsig_alg()

-type tsig_alg() :: binary().

tsig_error()

-type tsig_error() :: 0 | 16..18.

tsig_mac()

-type tsig_mac() :: binary().

tsig_opt()

-type tsig_opt() ::
          {time, unix_time()} | {fudge, non_neg_integer()} | {mac, tsig_mac()} | {tail, boolean()}.

ttl()

-type ttl() :: 0..1 bsl 31 - 1.

type()

-type type() :: uint16().

uint2()

-type uint2() :: 0..1.

uint4()

-type uint4() :: 0..15.

uint8()

-type uint8() :: 0..1 bsl 8 - 1.

uint16()

-type uint16() :: 0..1 bsl 16 - 1.

uint32()

-type uint32() :: 0..1 bsl 32 - 1.

uint48()

-type uint48() :: 0..1 bsl 48 - 1.

uint64()

-type uint64() :: 0..1 bsl 64 - 1.

unix_time()

-type unix_time() :: 0..4294967295.

Functions

add_tsig(Msg, Alg, Name, Secret, ErrCode)

-spec add_tsig(message(), tsig_alg(), dname(), binary(), tsig_error()) -> message().

add_tsig(Msg, Alg, Name, Secret, ErrCode, Options)

-spec add_tsig(message(), tsig_alg(), dname(), binary(), tsig_error(), [tsig_opt()]) -> message().

alg_name(Int)

-spec alg_name(alg()) -> binary() | undefined.

class_name(Int)

-spec class_name(class()) -> binary() | undefined.

compare_dname/2

-spec compare_dname(dname(), dname()) -> boolean().

const_compare/2

-spec const_compare(dname(), dname()) -> boolean().

decode_message/1

-spec decode_message(message_bin()) -> {decode_error(), message() | undefined, binary()} | message().

decode_rrdata(Class, Type, Data)

-spec decode_rrdata(uint16(), uint16(), binary()) -> rrdata().

dname_to_labels/1

-spec dname_to_labels(dname()) -> [label()].

dname_to_lower/1

-spec dname_to_lower(dname()) -> dname().

dname_to_upper/1

-spec dname_to_upper(dname()) -> dname().

encode_dname(Name)

-spec encode_dname(binary()) -> nonempty_binary().

encode_message/1

-spec encode_message(message()) -> message_bin().

encode_message/2

-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()}.

encode_rrdata(Class, Data)

-spec encode_rrdata(_, rrdata()) -> binary().

eoptcode_name(Int)

-spec eoptcode_name(eoptcode()) -> binary() | undefined.

ercode_name(Int)

-spec ercode_name(ercode()) -> binary() | undefined.

escape_label(Label)

-spec escape_label(label()) -> label().

labels_to_dname(Labels)

-spec labels_to_dname([label()]) -> dname().

llqerrcode_name(Int)

-spec llqerrcode_name(llqerrcode()) -> binary() | undefined.

llqopcode_name(Int)

-spec llqopcode_name(llqopcode()) -> binary() | undefined.

opcode_name(Int)

-spec opcode_name(opcode()) -> binary() | undefined.

random_id()

-spec random_id() -> message_id().

rcode_name(Int)

-spec rcode_name(rcode()) -> binary() | undefined.

tsigerr_name(Int)

-spec tsigerr_name(tsig_error()) -> binary() | undefined.

type_name(Int)

-spec type_name(type()) -> binary() | undefined.

unix_time()

-spec unix_time() -> unix_time().

unix_time/1

-spec unix_time(erlang:timestamp() | calendar:datetime1970()) -> unix_time().

verify_tsig(MsgBin, Name, Secret)

-spec verify_tsig(message_bin(), dname(), binary()) -> {ok, tsig_mac()} | {error, tsig_error()}.

verify_tsig(MsgBin, Name, Secret, Options)

-spec verify_tsig(message_bin(), dname(), binary(), [tsig_opt()]) ->
                     {ok, tsig_mac()} | {error, tsig_error()}.