open Functoria.DSL

type v4
type v6
type v4v6
type 'a ip
type ipv4 = v4 ip
type ipv6 = v6 ip
type ipv4v6 = v4v6 ip

val ip : 'a ip typ
val ipv4 : ipv4 typ
val ipv6 : ipv6 typ
val ipv4v6 : ipv4v6 typ

val create_ipv4 :
  ?group:string -> Ethernet.ethernet impl -> Arp.arpv4 impl -> ipv4 impl

val keyed_create_ipv4 :
  ?group:string ->
  ?network:Ipaddr.V4.Prefix.t ->
  ?gateway:Ipaddr.V4.t ->
  no_init:bool runtime_arg ->
  Ethernet.ethernet impl ->
  Arp.arpv4 impl ->
  ipv4 impl

val create_ipv6 :
  ?group:string -> Network.network impl -> Ethernet.ethernet impl -> ipv6 impl

val keyed_create_ipv6 :
  ?group:string ->
  ?network:Ipaddr.V6.Prefix.t ->
  ?gateway:Ipaddr.V6.t ->
  no_init:bool runtime_arg ->
  Network.network impl ->
  Ethernet.ethernet impl ->
  ipv6 impl

val ipv4_of_dhcp :
  Network.network impl -> Ethernet.ethernet impl -> Arp.arpv4 impl -> ipv4 impl

val ipv4_qubes :
  Qubesdb.qubesdb impl -> Ethernet.ethernet impl -> Arp.arpv4 impl -> ipv4 impl

val create_ipv4v6 : ?group:string -> ipv4 impl -> ipv6 impl -> ipv4v6 impl

val keyed_ipv4v6 :
  ipv4_only:bool runtime_arg ->
  ipv6_only:bool runtime_arg ->
  ipv4 impl ->
  ipv6 impl ->
  ipv4v6 impl

val right_tcpip_library :
  ?libs:string list -> sublibs:string list -> string -> package list value
