incorporate wireguard daemon with network interface

This commit is contained in:
Jett Chen 2023-11-09 08:08:09 +08:00
parent f1649ce3b2
commit bf15221a7b
3 changed files with 25 additions and 8 deletions

View file

@ -1,4 +1,4 @@
use std::net::SocketAddr; use std::net::{Ipv4Addr, SocketAddr, ToSocketAddrs};
mod command; mod command;
@ -41,11 +41,13 @@ pub async fn daemon_main() -> Result<()> {
let mut inst = DaemonInstance::new(commands_rx, response_tx); let mut inst = DaemonInstance::new(commands_rx, response_tx);
// tokio::try_join!(inst.run(), listen(commands_tx, response_rx)).map(|_| ()) // tokio::try_join!(inst.run(), listen(commands_tx, response_rx)).map(|_| ())
let tun = tun::tokio::TunInterface::new(tun::TunInterface::new()?)?; let mut _tun = tun::TunInterface::new()?;
_tun.set_ipv4_addr(Ipv4Addr::from([192, 168, 1, 10]))?;
let tun = tun::tokio::TunInterface::new(_tun)?;
let private_key = parse_secret_key("sIxpokQPnWctJKNaQ3DRdcQbL2S5OMbUrvr4bbsvTHw=")?; let private_key = parse_secret_key("GNqIAOCRxjl/cicZyvkvpTklgQuUmGUIEkH7IXF/sEE=")?;
let public_key = parse_public_key("EKZXvHlSDeqAjfC/m9aQR0oXfQ6Idgffa9L0DH5yaCo=")?; let public_key = parse_public_key("uy75leriJay0+oHLhRMpV+A5xAQ0hCJ+q7Ww81AOvT4=")?;
let endpoint = "146.70.173.66:51820".parse::<SocketAddr>()?; let endpoint = "wg.burrow.rs:51820".to_socket_addrs()?.next().unwrap();
let iface = Interface::new(tun, vec![Peer { let iface = Interface::new(tun, vec![Peer {
endpoint, endpoint,
private_key, private_key,

View file

@ -4,6 +4,7 @@ use anyhow::Error;
use async_trait::async_trait; use async_trait::async_trait;
use fehler::throws; use fehler::throws;
use ip_network_table::IpNetworkTable; use ip_network_table::IpNetworkTable;
use log::log;
use tokio::{ use tokio::{
join, join,
sync::Mutex, sync::Mutex,
@ -104,19 +105,29 @@ impl Interface {
continue continue
} }
}; };
log::debug!("read {} bytes from interface", src.len());
log::debug!("bytes: {:?}", src);
let mut pcbs = pcbs.lock().await; let mut pcbs = pcbs.lock().await;
let dst_addr = match Tunnel::dst_address(src) { let dst_addr = match Tunnel::dst_address(src) {
Some(addr) => addr, Some(addr) => addr,
None => continue, None => {
log::debug!("no destination found");
continue
},
}; };
log::debug!("dst_addr: {}", dst_addr);
let Some(idx) = pcbs.find(dst_addr) else { let Some(idx) = pcbs.find(dst_addr) else {
continue continue
}; };
log::debug!("found peer {}", idx);
match pcbs.pcbs[idx].send(src).await { match pcbs.pcbs[idx].send(src).await {
Ok(..) => {} Ok(..) => {log::debug!("sent packet to peer {}", dst_addr);}
Err(e) => log::error!("failed to send packet {}", e), Err(e) => log::error!("failed to send packet {}", e),
} }
} }

View file

@ -44,7 +44,11 @@ impl TunInterface {
#[throws] #[throws]
#[instrument] #[instrument]
pub fn recv(&mut self, buf: &mut [u8]) -> usize { pub fn recv(&mut self, buf: &mut [u8]) -> usize {
self.socket.read(buf)? // there might be a more efficient way to implement this
let tmp_buf = &mut [0u8; 1500];
let len = self.socket.read(tmp_buf)?;
buf[..len-4].copy_from_slice(&tmp_buf[4..len]);
len-4
} }
} }