sig
  type question = string * Dns.QType.t * int
  type rr = string * Dns.QType.t * int * int32 * string
  type t = {
    id : int;
    is_query : bool;
    opcode : int;
    is_auth : bool;
    truncated : bool;
    rec_desired : bool;
    rec_avlb : bool;
    status : int;
    questions : Dns.Pdu.question list;
    answer_rrs : Dns.Pdu.rr list;
    authority_rrs : Dns.Pdu.rr list;
    additional_rrs : Dns.Pdu.rr list;
  }
  val make_query : string -> Dns.Pdu.t
  val random : unit -> Dns.Pdu.t
  val unpack_name : string -> int -> (string * int) Batteries.Option.Monad.m
  val read_n16 : string -> int -> int
  val read_n32 : string -> int -> int32
  val unpack_questions :
    string ->
    int ->
    int -> ((string * Dns.QType.t * int) list * int) Batteries.Option.Monad.m
  val unpack_rrs :
    string ->
    int ->
    int ->
    ((string * Dns.QType.t * int * int32 * string) list * int)
    Batteries.Option.Monad.m
  val unpack : Bitstring.bitstring -> Dns.Pdu.t Batteries.Option.Monad.m
  val pack_n16 : int -> string -> int -> unit
  val pack_n32 : int32 -> string -> int -> unit
  val pack_name : string -> int -> string -> int -> int option
  val pack_question :
    string * Dns.QType.t * int -> string Batteries.Option.Monad.m
  val pack_questions : (string * Dns.QType.t * int) list -> string
  val pack_rr :
    string * Dns.QType.t * int * int32 * string ->
    string Batteries.Option.Monad.m
  val pack_rrs : (string * Dns.QType.t * int * int32 * string) list -> string
  val pack : Dns.Pdu.t -> Bitstring.bitstring
end