diff options
Diffstat (limited to '')
-rw-r--r-- | src/platform/linux/mod.rs | 6 | ||||
-rw-r--r-- | src/platform/linux/tun.rs | 2 | ||||
-rw-r--r-- | src/platform/linux/uapi.rs | 31 | ||||
-rw-r--r-- | src/platform/linux/udp.rs | 76 |
4 files changed, 102 insertions, 13 deletions
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 7d6a61c..82731de 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -1,5 +1,7 @@ mod tun; +mod uapi; mod udp; -pub use tun::LinuxTun; -pub use udp::LinuxBind; +pub use tun::LinuxTun as Tun; +pub use uapi::LinuxUAPI as UAPI; +pub use udp::LinuxBind as Bind; diff --git a/src/platform/linux/tun.rs b/src/platform/linux/tun.rs index 090569a..0bbae81 100644 --- a/src/platform/linux/tun.rs +++ b/src/platform/linux/tun.rs @@ -125,7 +125,7 @@ impl Tun for LinuxTun { type MTU = LinuxTunMTU; } -impl Platform for LinuxTun { +impl PlatformTun for LinuxTun { fn create(name: &str) -> Result<(Vec<Self::Reader>, Self::Writer, Self::MTU), Self::Error> { // construct request struct let mut req = Ifreq { diff --git a/src/platform/linux/uapi.rs b/src/platform/linux/uapi.rs new file mode 100644 index 0000000..fdf2bf0 --- /dev/null +++ b/src/platform/linux/uapi.rs @@ -0,0 +1,31 @@ +use super::super::uapi::*; + +use std::fs; +use std::io; +use std::os::unix::net::{UnixListener, UnixStream}; + +const SOCK_DIR: &str = "/var/run/wireguard/"; + +pub struct LinuxUAPI {} + +impl PlatformUAPI for LinuxUAPI { + type Error = io::Error; + type Bind = UnixListener; + + fn bind(name: &str) -> Result<UnixListener, io::Error> { + let socket_path = format!("{}{}.sock", SOCK_DIR, name); + let _ = fs::create_dir_all(SOCK_DIR); + let _ = fs::remove_file(&socket_path); + UnixListener::bind(socket_path) + } +} + +impl BindUAPI for UnixListener { + type Stream = UnixStream; + type Error = io::Error; + + fn accept(&self) -> Result<UnixStream, io::Error> { + let (stream, _) = self.accept()?; + Ok(stream) + } +} diff --git a/src/platform/linux/udp.rs b/src/platform/linux/udp.rs index 52e4c45..d3d61b6 100644 --- a/src/platform/linux/udp.rs +++ b/src/platform/linux/udp.rs @@ -1,26 +1,82 @@ use super::super::bind::*; use super::super::Endpoint; -use std::net::SocketAddr; +use std::io; +use std::net::{SocketAddr, UdpSocket}; +use std::sync::Arc; -pub struct LinuxEndpoint {} +#[derive(Clone)] +pub struct LinuxBind(Arc<UdpSocket>); -pub struct LinuxBind {} +pub struct LinuxOwner(Arc<UdpSocket>); -impl Endpoint for LinuxEndpoint { +impl Endpoint for SocketAddr { fn clear_src(&mut self) {} fn from_address(addr: SocketAddr) -> Self { - LinuxEndpoint {} + addr } fn into_address(&self) -> SocketAddr { - "127.0.0.1:6060".parse().unwrap() + *self } } -/* -impl Bind for PlatformBind { - type Endpoint = PlatformEndpoint; +impl Reader<SocketAddr> for LinuxBind { + type Error = io::Error; + + fn read(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr), Self::Error> { + self.0.recv_from(buf) + } +} + +impl Writer<SocketAddr> for LinuxBind { + type Error = io::Error; + + fn write(&self, buf: &[u8], dst: &SocketAddr) -> Result<(), Self::Error> { + self.0.send_to(buf, dst)?; + Ok(()) + } +} + +impl Owner for LinuxOwner { + type Error = io::Error; + + fn get_port(&self) -> u16 { + 1337 + } + + fn get_fwmark(&self) -> Option<u32> { + None + } + + fn set_fwmark(&mut self, value: Option<u32>) -> Option<Self::Error> { + None + } +} + +impl Drop for LinuxOwner { + fn drop(&mut self) {} +} + +impl Bind for LinuxBind { + type Error = io::Error; + type Endpoint = SocketAddr; + type Reader = LinuxBind; + type Writer = LinuxBind; +} + +impl PlatformBind for LinuxBind { + type Owner = LinuxOwner; + + fn bind(port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error> { + let socket = UdpSocket::bind(format!("0.0.0.0:{}", port))?; + let socket = Arc::new(socket); + + Ok(( + vec![LinuxBind(socket.clone())], + LinuxBind(socket.clone()), + LinuxOwner(socket), + )) + } } -*/ |