sig
  type t = {
    src : Eth.Addr.t;
    gw : Eth.gw_addr option;
    proto : Arp.HwProto.t;
    mtu : int;
    mutable my_addresses : Bitstring.bitstring list;
    mutable emit : Bitstring.bitstring -> unit;
    mutable recv : Bitstring.bitstring -> unit;
    mutable promisc : Bitstring.bitstring -> unit;
    arp_cache : Eth.Addr.t option Tools.BitHash.t;
    delayed : Bitstring.bitstring Tools.BitHash.t;
  }
  type eth_trx = {
    trx : Tools.trx;
    set_promiscuous : (Bitstring.bitstring -> unit) -> unit;
    set_addresses : Bitstring.bitstring list -> unit;
    get_source : unit -> Eth.Addr.t;
    arp_set : Bitstring.bitstring -> Eth.Addr.t option -> unit;
  }
  val send :
    Eth.TRX.t -> Arp.HwProto.t -> Eth.Addr.t -> Tools.Payload.outer_t -> unit
  val resolve_proto_addr :
    Eth.TRX.t ->
    Bitstring.bitstring -> Bitstring.bitstring -> Bitstring.bitstring -> unit
  type dst = Delayed | Dst of Eth.Addr.t
  val arp_resolve_ipv4 :
    Eth.TRX.t ->
    Bitstring.bitstring ->
    Bitstring.bitstring -> Tools.BitHash.key -> Eth.TRX.dst
  val dst_for :
    Eth.TRX.t -> Bitstring.bitstring -> Eth.TRX.dst Batteries.Option.Monad.m
  val tx : Eth.TRX.t -> Bitstring.bitstring -> unit
  val rx : Eth.TRX.t -> string * int * int -> unit
  val make :
    ?mtu:int ->
    Eth.Addr.t ->
    ?gw:Eth.gw_addr ->
    ?promisc:(Bitstring.bitstring -> unit) ->
    Arp.HwProto.t -> Bitstring.bitstring list -> Eth.TRX.eth_trx
end