aboutsummaryrefslogtreecommitdiffstats
path: root/src/platform/linux
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/platform/linux/mod.rs6
-rw-r--r--src/platform/linux/tun.rs2
-rw-r--r--src/platform/linux/uapi.rs31
-rw-r--r--src/platform/linux/udp.rs76
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),
+ ))
+ }
}
-*/