12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152openFunctoria.DSLopenFunctoria.ActionopenMisctypenetwork=NETWORKletnetwork=typNETWORKletall_networks=ref[]letadd_new_networkname=all_networks:=name::!all_networksletnetwork_conf?(intf:stringruntime_argoption)name=letruntime_args=Option.to_list(Option.mapRuntime_arg.vintf)inletpackages_v=Key.match_Key.(valuetarget)@@function|`Unix->[package~min:"3.0.0"~max:"4.0.0""mirage-net-unix"]|`MacOSX->[package~min:"1.8.0"~max:"2.0.0""mirage-net-macosx"]|`Xen->[package~min:"2.1.0"~max:"3.0.0""mirage-net-xen"]|`Qubes->[package~min:"2.1.0"~max:"3.0.0""mirage-net-xen";Qubesdb.pkg]|#Key.mode_solo5->[package~min:"0.8.0"~max:"0.9.0""mirage-net-solo5"]inletconnect_modname=function|[]->code~pos:__POS__"%s.connect %S"modnamename|[intf]->code~pos:__POS__"%s.connect %s"modnameintf|_->connect_err"network_conf"0~max:1inletconfigure_=add_new_networkname;ok()inimpl~runtime_args~packages_v~connect~configure"Netif"networkletnetif?groupdev=if_implKey.is_solo5(network_confdev)(network_conf~intf:(Runtime_arg.interface?groupdev)dev)letdefault_network=match_implKey.(valuetarget)[(`Unix,netif"tap0");(`MacOSX,netif"tap0");(* On Solo5 targets, a single default network is customarily
* named just 'service' *)(`Hvt,netif"service");(`Spt,netif"service");(`Virtio,netif"service");(`Muen,netif"service");(`Genode,netif"service");]~default:(netif"0")