Add setup command to TunInterface
This commit is contained in:
parent
0fe630878d
commit
80ae0f9d0f
5 changed files with 111 additions and 2 deletions
90
Cargo.lock
generated
90
Cargo.lock
generated
|
|
@ -1416,6 +1416,71 @@ 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]]
|
||||||
|
name = "netlink-proto"
|
||||||
|
version = "0.11.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "86b33524dc0968bfad349684447bfce6db937a9ac3332a1fe60c0c5a5ce63f21"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"futures",
|
||||||
|
"log",
|
||||||
|
"netlink-packet-core",
|
||||||
|
"netlink-sys",
|
||||||
|
"thiserror",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "netlink-sys"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411"
|
||||||
|
dependencies = [
|
||||||
|
"bytes",
|
||||||
|
"futures",
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nix"
|
name = "nix"
|
||||||
version = "0.26.4"
|
version = "0.26.4"
|
||||||
|
|
@ -1591,6 +1656,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"
|
||||||
|
|
@ -1877,6 +1948,24 @@ dependencies = [
|
||||||
"windows-sys 0.48.0",
|
"windows-sys 0.48.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rtnetlink"
|
||||||
|
version = "0.14.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b684475344d8df1859ddb2d395dd3dac4f8f3422a1aa0725993cb375fc5caba5"
|
||||||
|
dependencies = [
|
||||||
|
"futures",
|
||||||
|
"log",
|
||||||
|
"netlink-packet-core",
|
||||||
|
"netlink-packet-route",
|
||||||
|
"netlink-packet-utils",
|
||||||
|
"netlink-proto",
|
||||||
|
"netlink-sys",
|
||||||
|
"nix 0.27.1",
|
||||||
|
"thiserror",
|
||||||
|
"tokio",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-demangle"
|
name = "rustc-demangle"
|
||||||
version = "0.1.23"
|
version = "0.1.23"
|
||||||
|
|
@ -2535,6 +2624,7 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"nix 0.26.4",
|
"nix 0.26.4",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
"rtnetlink",
|
||||||
"schemars",
|
"schemars",
|
||||||
"serde",
|
"serde",
|
||||||
"socket2",
|
"socket2",
|
||||||
|
|
|
||||||
|
|
@ -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).await?;
|
||||||
|
|
||||||
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");
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ tracing = "0.1"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
serde = { version = "1", features = ["derive"], optional = true }
|
serde = { version = "1", features = ["derive"], optional = true }
|
||||||
schemars = { version = "0.8", optional = true }
|
schemars = { version = "0.8", optional = true }
|
||||||
|
rtnetlink = "0.14"
|
||||||
|
|
||||||
futures = { version = "0.3.28", optional = true }
|
futures = { version = "0.3.28", optional = true }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,13 @@ impl TunInterface {
|
||||||
Ok(Self { inner: AsyncFd::new(tun)? })
|
Ok(Self { inner: AsyncFd::new(tun)? })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[instrument]
|
||||||
|
pub async fn set_up(&self, up: bool) -> io::Result<()> {
|
||||||
|
let mut guard = self.inner.readable().await?;
|
||||||
|
guard.try_io(|inner| inner.get_ref().set_up(up));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[instrument]
|
#[instrument]
|
||||||
pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
|
pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
|
||||||
loop {
|
loop {
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ use std::{
|
||||||
|
|
||||||
use fehler::throws;
|
use fehler::throws;
|
||||||
use libc::in6_ifreq;
|
use libc::in6_ifreq;
|
||||||
|
use rtnetlink::new_connection;
|
||||||
use socket2::{Domain, SockAddr, Socket, Type};
|
use socket2::{Domain, SockAddr, Socket, Type};
|
||||||
use tracing::{info, instrument};
|
use tracing::{info, instrument};
|
||||||
|
|
||||||
|
|
@ -95,6 +96,15 @@ impl TunInterface {
|
||||||
unsafe { iff.ifr_ifru.ifru_ifindex }
|
unsafe { iff.ifr_ifru.ifru_ifindex }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[throws]
|
||||||
|
#[instrument]
|
||||||
|
pub fn set_up(&self, up: bool) {
|
||||||
|
let connection = new_connection()?;
|
||||||
|
let handle = connection.1;
|
||||||
|
let link = handle.link().set(self.index()? as u32);
|
||||||
|
if up { link.up() } else { link.down() }
|
||||||
|
}
|
||||||
|
|
||||||
#[throws]
|
#[throws]
|
||||||
#[instrument]
|
#[instrument]
|
||||||
pub fn set_ipv4_addr(&self, addr: Ipv4Addr) {
|
pub fn set_ipv4_addr(&self, addr: Ipv4Addr) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue