sig
  val id_seq : int Batteries.ref
  val next_id : unit -> int
  type t = {
    tos : int;
    tot_len : int;
    id : int;
    dont_frag : bool;
    more_frags : bool;
    frag_offset : int;
    ttl : int;
    proto : Ip.Proto.t;
    src : Ip.Addr.t;
    dst : Ip.Addr.t;
    options : Bitstring.bitstring;
    payload : Tools.Payload.t;
  }
  val make :
    ?tos:int ->
    ?tot_len:int ->
    ?id:int ->
    ?dont_frag:bool ->
    ?more_frags:bool ->
    ?frag_offset:int ->
    ?ttl:int ->
    ?options:Bitstring.bitstring ->
    Ip.Proto.t -> Ip.Addr.t -> Ip.Addr.t -> Bitstring.bitstring -> Ip.Pdu.t
  val random : unit -> Ip.Pdu.t
  val pseudo_header : Ip.Pdu.t -> unit -> Bitstring.bitstring
  val patch_checksum :
    ?fixit:(int -> int) ->
    int ->
    (unit -> Bitstring.bitstring) -> Tools.Payload.t -> Tools.Payload.t
  val pack : Ip.Pdu.t -> Bitstring.bitstring
  val unpack : string * int * int -> Ip.Pdu.t option
  val unpack_with_ports : string * int * int -> (Ip.Pdu.t * int * int) option
end