Dns_serverDNS Server implementation
module Authentication : sig ... endAuthentication, stored in a Dns_trie with privileges to operations embedded in the name.
type t = private {data : Dns_trie.t;auth : Authentication.t;unauthenticated_zone_transfer : bool;rng : int -> string;tsig_verify : Dns.Tsig_op.verify;tsig_sign : Dns.Tsig_op.sign;}The state of a DNS server.
val create :
?unauthenticated_zone_transfer:bool ->
?tsig_verify:Dns.Tsig_op.verify ->
?tsig_sign:Dns.Tsig_op.sign ->
?auth:Authentication.t ->
Dns_trie.t ->
(int -> string) ->
tcreate ~unauthenticated_zone_transfer ~tsig_verify ~tsig_sign ~auth data rng constructs a t. See Primary.create and Secondary.create for the logic running a primary or secondary server.
val with_data : t -> Dns_trie.t -> twith_data t data is t' where the data field is updated with the provided value. Be aware that this function breaks the semantics of a primary server with secondaries, since secondaries won't be notified and will be out of sync. Use if you know what you do. The data of a secondary will usually come via zone transfer from the primary name services.
val text :
'a Domain_name.t ->
Dns_trie.t ->
(string, [> `Msg of string ]) Stdlib.resulttext name trie results in a string representation (zonefile) of the trie.
val handle_question :
t ->
Dns.Packet.Question.t ->
(Dns.Packet.Flags.t * Dns.Packet.Answer.t * Dns.Name_rr_map.t option,
Dns.Rcode.t * Dns.Packet.Answer.t option)
Stdlib.resulthandle_question t question handles the DNS query question by looking it up in the trie of t. The result is either an answer or an error.
val update_data :
Dns_trie.t ->
'a Domain_name.t ->
(Dns.Packet.Update.prereq list Domain_name.Map.t
* Dns.Packet.Update.update list Domain_name.Map.t) ->
(Dns_trie.t * (Domain_name.Set.elt * Dns.Soa.t) list, Dns.Rcode.t)
Stdlib.resultupdate_data data domain update_content applies the update_content to the data for domain. This function breaks the semantics of a primary server with secondaries, since the secondaries won't be notified of the update and will be out of sync. Use if you know what you are doing.
val handle_update :
t ->
Dns.proto ->
[ `raw ] Domain_name.t option ->
Dns.Packet.Question.t ->
Dns.Packet.Update.t ->
(Dns_trie.t * ([ `raw ] Domain_name.t * Dns.Soa.t) list, Dns.Rcode.t)
Stdlib.resulthandle_update t proto keyname question update authenticates the update request and processes the update. This function breaks the semantics of a primary server with secondaries, since the secondaries won't be notified. Use if you know what you are doing.
val handle_axfr_request :
t ->
Dns.proto ->
[ `raw ] Domain_name.t option ->
Dns.Packet.Question.t ->
(Dns.Packet.Axfr.t, Dns.Rcode.t) Stdlib.resulthandle_axfr_request t proto keyname question authenticates the zone transfer request and processes it. If the request is valid, and the zone available, a zone transfer is returned.
val handle_ixfr_request :
t ->
trie_cache ->
Dns.proto ->
[ `raw ] Domain_name.t option ->
Dns.Packet.Question.t ->
Dns.Soa.t ->
(Dns.Packet.Ixfr.t, Dns.Rcode.t) Stdlib.resulthandle_ixfr_request t cache proto keyname question soa authenticates the incremental zone transfer request and processes it. If valid, an incremental zone transfer is returned.
val handle_tsig :
?mac:string ->
t ->
Ptime.t ->
Dns.Packet.t ->
string ->
(([ `raw ] Domain_name.t * Dns.Tsig.t * string * Dns.Dnskey.t) option,
Dns.Tsig_op.e * string option)
Stdlib.resulthandle_tsig ~mac t now packet buffer verifies the tsig signature if present, returning the keyname, tsig, mac, and used key.
type packet_callback = Dns.Packet.Question.t -> Dns.Packet.reply optionpacket_callback question either returns a reply to a DNS question Some reply or None.
module Primary : sig ... endmodule Secondary : sig ... end