91 lines
3.3 KiB
OCaml
91 lines
3.3 KiB
OCaml
|
|
(** DNS cache - a least recently used cache of DNS responses
|
||
|
|
|
||
|
|
This data structure allows to insert and retrieve entries into a least
|
||
|
|
recently used data structure. An [`Entry] weights the cardinality of the
|
||
|
|
resource record map, all other entries have a weight of 1.
|
||
|
|
|
||
|
|
The time to live is preserved, and when it is exceeded the entry is no
|
||
|
|
longer returned.
|
||
|
|
*)
|
||
|
|
|
||
|
|
(* (c) 2017, 2018 Hannes Mehnert, all rights reserved *)
|
||
|
|
open Dns
|
||
|
|
|
||
|
|
(** The variant of the rank in the cache. *)
|
||
|
|
type rank =
|
||
|
|
| ZoneFile
|
||
|
|
| ZoneTransfer
|
||
|
|
| AuthoritativeAnswer of Rrsig.t option
|
||
|
|
| AuthoritativeAuthority of Rrsig.t option
|
||
|
|
| ZoneGlue
|
||
|
|
| NonAuthoritativeAnswer
|
||
|
|
| Additional
|
||
|
|
|
||
|
|
val pp_rank : rank Fmt.t
|
||
|
|
(** [pp_rank ppf rank] pretty-prints the [rank] on [ppf]. *)
|
||
|
|
|
||
|
|
val compare_rank : rank -> rank -> int
|
||
|
|
(** [compare_rank a b] compares the ranks [a] with [b]. *)
|
||
|
|
|
||
|
|
(** The type of a DNS cache. *)
|
||
|
|
type t
|
||
|
|
|
||
|
|
val empty : int -> t
|
||
|
|
(** [empty maximum_size] is an empty DNS cache with the maximum size as
|
||
|
|
capacity. *)
|
||
|
|
|
||
|
|
val size : t -> int
|
||
|
|
(** [size cache] is the number of bindings currently in the [cache]. *)
|
||
|
|
|
||
|
|
val capacity : t -> int
|
||
|
|
(** [capacity cache] is the used weight. *)
|
||
|
|
|
||
|
|
val pp : t Fmt.t
|
||
|
|
(** [pp ppf t] pretty prints the cache [t] on [ppf]. *)
|
||
|
|
|
||
|
|
(** The polymorphic variant of an entry: a resource record, or no data,
|
||
|
|
no domain, or a server failure. *)
|
||
|
|
type 'a entry = [
|
||
|
|
| `Entry of 'a
|
||
|
|
| `No_data of [ `raw ] Domain_name.t * Soa.t
|
||
|
|
| `No_domain of [ `raw ] Domain_name.t * Soa.t
|
||
|
|
| `Serv_fail of [ `raw ] Domain_name.t * Soa.t
|
||
|
|
]
|
||
|
|
|
||
|
|
val pp_entry : 'a Rr_map.key -> 'a entry Fmt.t
|
||
|
|
(** [pp_entry ppf entry] pretty-prints [entry] on [ppf]. *)
|
||
|
|
|
||
|
|
val get : t -> int64 -> [ `raw ] Domain_name.t -> 'a Rr_map.key ->
|
||
|
|
t * ('a entry * rank, [ `Cache_miss | `Cache_drop ]) result
|
||
|
|
(** [get cache timestamp type name] retrieves the query [type, name] from the
|
||
|
|
[cache] using [timestamp]. If the time to live is exceeded, a [`Cache_drop]
|
||
|
|
is returned. If there is no entry in the cache, a [`Cache_miss] is
|
||
|
|
returned. *)
|
||
|
|
|
||
|
|
val get_or_cname : t -> int64 -> [ `raw ] Domain_name.t -> 'a Rr_map.key ->
|
||
|
|
t * ([ 'a entry | `Alias of int32 * [`raw] Domain_name.t] * rank,
|
||
|
|
[ `Cache_miss | `Cache_drop ]) result
|
||
|
|
(** [get_or_cname cache timestamp type name] is the same as [get], but if a
|
||
|
|
[`Cache_miss] is encountered, a lookup for an alias (CNAME) is done. *)
|
||
|
|
|
||
|
|
val get_any : t -> int64 -> [ `raw ] Domain_name.t ->
|
||
|
|
t * ([ `Entries of Rr_map.t
|
||
|
|
| `No_domain of [ `raw ] Domain_name.t * Soa.t ] * rank,
|
||
|
|
[ `Cache_miss | `Cache_drop ]) result
|
||
|
|
(** [get_any cache timestamp name] retrieves all resource records for [name]
|
||
|
|
in [cache]. *)
|
||
|
|
|
||
|
|
val get_nsec3 : t -> int64 -> [ `raw ] Domain_name.t ->
|
||
|
|
t * (([`raw] Domain_name.t * int32 * Nsec3.t * rank) list, [ `Cache_miss | `Cache_drop ]) result
|
||
|
|
(** [get_nsec3 cache timestamp name] retrieves all nsec3 resource records for
|
||
|
|
the zone [name]. *)
|
||
|
|
|
||
|
|
val set : t -> int64 -> [ `raw ] Domain_name.t -> 'a Rr_map.key -> rank ->
|
||
|
|
'a entry -> t
|
||
|
|
(** [set cache timestamp type name rank value] attempts to insert
|
||
|
|
[type, name, value] into the [cache] using the [timestamp] and [rank]. If
|
||
|
|
an entry already exists with a higher [rank], the [cache] is unchanged. *)
|
||
|
|
|
||
|
|
val remove : t -> [ `raw ] Domain_name.t -> t
|
||
|
|
(** [remove cache name] removes [name] from [cache]. *)
|