mod device;
mod sys;
use crate::error::Result;
use crate::{AbstractDevice, configuration::Configuration};
pub use device::{Device, Reader, Tun, Writer};
use std::ffi::OsString;
use std::time::Duration;
pub trait AbstractDeviceExt: AbstractDevice {
fn tun_luid(&self) -> u64;
}
#[derive(Clone, Debug)]
pub struct PlatformConfig {
pub(crate) device_guid: Option<u128>,
pub(crate) wait_for_ipv4_interface: bool,
pub(crate) wait_for_ipv6_interface: bool,
pub(crate) wait_for_interface_timeout: Duration,
pub(crate) wintun_file: OsString,
pub(crate) dns_servers: Option<Vec<std::net::IpAddr>>,
}
impl Default for PlatformConfig {
fn default() -> Self {
Self {
device_guid: None,
wait_for_ipv4_interface: true,
wait_for_ipv6_interface: false,
wait_for_interface_timeout: Duration::from_secs(5),
wintun_file: "wintun.dll".into(),
dns_servers: None,
}
}
}
impl PlatformConfig {
pub fn device_guid(&mut self, device_guid: u128) {
log::trace!("Windows configuration device GUID");
self.device_guid = Some(device_guid);
}
pub fn wintun_file<S: Into<OsString>>(&mut self, wintun_file: S) {
self.wintun_file = wintun_file.into();
}
pub fn dns_servers(&mut self, dns_servers: &[std::net::IpAddr]) {
self.dns_servers = Some(dns_servers.to_vec());
}
pub fn wait_for_interfaces(&mut self, ipv4: bool, ipv6: bool, timeout: Duration) {
self.wait_for_ipv4_interface = ipv4;
self.wait_for_ipv6_interface = ipv6;
self.wait_for_interface_timeout = timeout;
}
}
pub fn create(configuration: &Configuration) -> Result<Device> {
Device::new(configuration)
}