use std::net::Ipv4Addr;
use tun_rs::{AsyncDevice, DeviceBuilder};
use crate::config::TunConfig;
pub struct TunDevice {
inner: AsyncDevice,
}
impl TunDevice {
pub fn create(cfg: &TunConfig) -> std::io::Result<Self> {
let mut builder = DeviceBuilder::new()
.mtu(cfg.mtu)
.ipv4(cfg.ip, cfg.netmask, Some(cfg.peer_ip));
if let Some(name) = &cfg.name {
builder = builder.name(name.clone());
}
let inner = builder.build_async()?;
Ok(Self { inner })
}
pub async fn recv(&self, buf: &mut [u8]) -> std::io::Result<usize> {
self.inner.recv(buf).await
}
pub async fn send(&self, packet: &[u8]) -> std::io::Result<usize> {
self.inner.send(packet).await
}
pub fn name(&self) -> std::io::Result<String> {
self.inner.name()
}
pub fn mtu(&self) -> std::io::Result<u16> {
self.inner.mtu()
}
pub fn local_ip(cfg: &TunConfig) -> Ipv4Addr {
cfg.ip
}
}