Compare commits

...

4 commits

Author SHA1 Message Date
rhaskia
98ce57bba0 Set up works, daemon still bugs out 2024-03-13 15:33:01 -07:00
rhaskia
982cfc39b6 dummy set_up function for macos 2024-03-13 15:33:01 -07:00
Rhaskia
5c6a705d7f tun_interface set_up fix hang
Co-authored-by: Conrad Kramer <conrad@conradkramer.com>
2024-03-13 15:33:01 -07:00
rhaskia
80ae0f9d0f Add setup command to TunInterface 2024-03-13 15:33:01 -07:00
7 changed files with 186 additions and 2 deletions

133
Cargo.lock generated
View file

@ -956,6 +956,20 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "handlebars"
version = "3.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3"
dependencies = [
"log",
"pest",
"pest_derive",
"quick-error",
"serde",
"serde_json",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.12.3" version = "0.12.3"
@ -1159,6 +1173,22 @@ dependencies = [
"yaml-rust", "yaml-rust",
] ]
[[package]]
name = "interfaces"
version = "0.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb6250a98af259a26fd5a4a6081fccea9ac116e4c3178acf4aeb86d32d2b7715"
dependencies = [
"bitflags 2.4.2",
"cc",
"handlebars",
"lazy_static",
"libc",
"nix 0.26.4",
"serde",
"serde_derive",
]
[[package]] [[package]]
name = "ip_network" name = "ip_network"
version = "0.4.1" version = "0.4.1"
@ -1416,6 +1446,43 @@ dependencies = [
"tempfile", "tempfile",
] ]
[[package]]
name = "netlink-packet-core"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4"
dependencies = [
"anyhow",
"byteorder",
"netlink-packet-utils",
]
[[package]]
name = "netlink-packet-route"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74c171cd77b4ee8c7708da746ce392440cb7bcf618d122ec9ecc607b12938bf4"
dependencies = [
"anyhow",
"byteorder",
"libc",
"log",
"netlink-packet-core",
"netlink-packet-utils",
]
[[package]]
name = "netlink-packet-utils"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34"
dependencies = [
"anyhow",
"byteorder",
"paste",
"thiserror",
]
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.26.4" version = "0.26.4"
@ -1591,6 +1658,12 @@ dependencies = [
"subtle", "subtle",
] ]
[[package]]
name = "paste"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]] [[package]]
name = "pbkdf2" name = "pbkdf2"
version = "0.11.0" version = "0.11.0"
@ -1615,6 +1688,51 @@ version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "pest"
version = "2.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8"
dependencies = [
"memchr",
"thiserror",
"ucd-trie",
]
[[package]]
name = "pest_derive"
version = "2.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026"
dependencies = [
"pest",
"pest_generator",
]
[[package]]
name = "pest_generator"
version = "2.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
"syn 2.0.48",
]
[[package]]
name = "pest_meta"
version = "2.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293"
dependencies = [
"once_cell",
"pest",
"sha2",
]
[[package]] [[package]]
name = "pin-project" name = "pin-project"
version = "1.1.4" version = "1.1.4"
@ -1733,6 +1851,12 @@ dependencies = [
"prost", "prost",
] ]
[[package]]
name = "quick-error"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.35" version = "1.0.35"
@ -2529,10 +2653,13 @@ dependencies = [
"byteorder", "byteorder",
"fehler", "fehler",
"futures", "futures",
"interfaces",
"lazy_static", "lazy_static",
"libc", "libc",
"libloading 0.7.4", "libloading 0.7.4",
"log", "log",
"netlink-packet-core",
"netlink-packet-route",
"nix 0.26.4", "nix 0.26.4",
"reqwest", "reqwest",
"schemars", "schemars",
@ -2553,6 +2680,12 @@ version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
[[package]]
name = "ucd-trie"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.15" version = "0.3.15"

View file

@ -51,6 +51,8 @@ impl DaemonInstance {
} }
RunState::Idle => { RunState::Idle => {
let tun_if = st.tun.open()?; let tun_if = st.tun.open()?;
tun_if.set_up(true)?;
debug!("Setting tun on wg_interface"); debug!("Setting tun on wg_interface");
self.wg_interface.read().await.set_tun(tun_if).await; self.wg_interface.read().await.set_tun(tun_if).await;
debug!("tun set on wg_interface"); debug!("tun set on wg_interface");
@ -59,7 +61,6 @@ impl DaemonInstance {
self.tun_interface = self.wg_interface.read().await.get_tun(); self.tun_interface = self.wg_interface.read().await.get_tun();
debug!("tun_interface set: {:?}", self.tun_interface); debug!("tun_interface set: {:?}", self.tun_interface);
debug!("Cloning wg_interface"); debug!("Cloning wg_interface");
let tmp_wg = self.wg_interface.clone(); let tmp_wg = self.wg_interface.clone();
debug!("wg_interface cloned"); debug!("wg_interface cloned");

View file

@ -16,6 +16,9 @@ serde = { version = "1", features = ["derive"], optional = true }
schemars = { version = "0.8", optional = true } schemars = { version = "0.8", optional = true }
futures = { version = "0.3.28", optional = true } futures = { version = "0.3.28", optional = true }
netlink-packet-route = "0.19.0"
netlink-packet-core = "0.7.0"
[features] [features]
serde = ["dep:serde", "dep:schemars"] serde = ["dep:serde", "dep:schemars"]
@ -24,6 +27,9 @@ tokio = ["tokio/net", "dep:futures"]
[target.'cfg(feature = "tokio")'.dev-dependencies] [target.'cfg(feature = "tokio")'.dev-dependencies]
tokio = { features = ["rt", "macros"] } tokio = { features = ["rt", "macros"] }
[target.'cfg(target_os = "linux")'.dependencies]
interfaces = "0.0.9"
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
lazy_static = "1.4" lazy_static = "1.4"
libloading = "0.7" libloading = "0.7"

View file

@ -1,6 +1,6 @@
use std::io; use std::io;
use tokio::io::unix::AsyncFd; use tokio::io::unix::{AsyncFd, TryIoError};
use tracing::instrument; use tracing::instrument;
#[derive(Debug)] #[derive(Debug)]
@ -15,6 +15,11 @@ impl TunInterface {
Ok(Self { inner: AsyncFd::new(tun)? }) Ok(Self { inner: AsyncFd::new(tun)? })
} }
#[instrument]
pub fn set_up(&self, up: bool) -> io::Result<()> {
self.inner.get_ref().set_up(up)
}
#[instrument] #[instrument]
pub async fn send(&self, buf: &[u8]) -> io::Result<usize> { pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
loop { loop {

View file

@ -247,4 +247,10 @@ impl TunInterface {
.try_into() .try_into()
.map_err(|_| Error::new(ErrorKind::Other, "Conversion error"))? .map_err(|_| Error::new(ErrorKind::Other, "Conversion error"))?
} }
#[throws]
#[instrument]
pub fn set_up(&self, up: bool) {
tracing::warn!("Setting tun up is not supported yet on apple.");
}
} }

View file

@ -95,6 +95,24 @@ impl TunInterface {
unsafe { iff.ifr_ifru.ifru_ifindex } unsafe { iff.ifr_ifru.ifru_ifindex }
} }
#[throws]
#[instrument]
pub fn set_up(&self, up: bool) {
let mut inter = interfaces::Interface::get_by_name(&self.name()?)
.unwrap()
.unwrap();
inter.set_up(up).unwrap();
}
#[throws]
#[instrument]
pub fn is_up(&self) -> bool {
let inter = interfaces::Interface::get_by_name(&self.name()?)
.unwrap()
.unwrap();
inter.is_up()
}
#[throws] #[throws]
#[instrument] #[instrument]
pub fn set_ipv4_addr(&self, addr: Ipv4Addr) { pub fn set_ipv4_addr(&self, addr: Ipv4Addr) {

View file

@ -24,6 +24,21 @@ fn test_set_get_broadcast_addr() {
assert_eq!(broadcast_addr, result); assert_eq!(broadcast_addr, result);
} }
#[test]
#[throws]
#[cfg(not(any(target_os = "windows", target_vendor = "apple")))]
fn test_set_get_up() {
let tun = TunInterface::new()?;
let addr = Ipv4Addr::new(10, 0, 0, 1);
tun.set_ipv4_addr(addr)?;
let broadcast_addr = Ipv4Addr::new(255, 255, 255, 0);
tun.set_broadcast_addr(broadcast_addr)?;
tun.set_up(true)?;
assert!(tun.is_up()?);
}
#[test] #[test]
#[throws] #[throws]
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]