From 5226326caafca9f1c914d417e19204f799d9b76f Mon Sep 17 00:00:00 2001 From: Jett Chen Date: Thu, 7 Dec 2023 00:51:52 +0800 Subject: [PATCH] add write to network on received packets --- burrow/src/wireguard/iface.rs | 6 +++--- burrow/src/wireguard/pcb.rs | 12 ++++++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/burrow/src/wireguard/iface.rs b/burrow/src/wireguard/iface.rs index cfd19a5..7d1b1ec 100755 --- a/burrow/src/wireguard/iface.rs +++ b/burrow/src/wireguard/iface.rs @@ -84,12 +84,12 @@ pub struct Interface { impl Interface { #[throws] pub fn new>(tun: TunInterface, peers: I) -> Self { - let mut pcbs: IndexedPcbs = peers + let tun = Arc::new(RwLock::new(tun)); + let pcbs: IndexedPcbs = peers .into_iter() - .map(|peer| PeerPcb::new(peer)) + .map(|peer| PeerPcb::new(peer, tun.clone())) .collect::>()?; - let tun = Arc::new(RwLock::new(tun)); let pcbs = Arc::new(pcbs); Self { tun, pcbs } } diff --git a/burrow/src/wireguard/pcb.rs b/burrow/src/wireguard/pcb.rs index 2e467b1..313913e 100755 --- a/burrow/src/wireguard/pcb.rs +++ b/burrow/src/wireguard/pcb.rs @@ -13,6 +13,7 @@ use tokio::{net::UdpSocket, task::JoinHandle}; use tokio::sync::{Mutex, RwLock}; use tokio::time::timeout; use uuid::uuid; +use tun::tokio::TunInterface; use super::{ iface::PacketInterface, @@ -27,11 +28,12 @@ pub struct PeerPcb { pub handle: Option>, socket: Option, tunnel: RwLock, + tun_interface: Arc> } impl PeerPcb { #[throws] - pub fn new(peer: Peer) -> Self { + pub fn new(peer: Peer, tun_interface: Arc>) -> Self { let tunnel = RwLock::new(Tunnel::new(peer.private_key, peer.public_key, peer.preshared_key, None, 1, None) .map_err(|s| anyhow::anyhow!("{}", s))?); @@ -41,6 +43,7 @@ impl PeerPcb { handle: None, socket: None, tunnel, + tun_interface } } @@ -102,9 +105,14 @@ impl PeerPcb { } TunnResult::WriteToTunnelV4(packet, addr) => { tracing::debug!("WriteToTunnelV4: {:?}, {:?}", packet, addr); + self.tun_interface.read().await.send(packet).await?; + continue; + } + TunnResult::WriteToTunnelV6(packet, addr) => { + tracing::debug!("WriteToTunnelV6: {:?}, {:?}", packet, addr); + self.tun_interface.read().await.send(packet).await?; continue; } - e => panic!("Unexpected result from decapsulate: {:?}", e), } } return Ok(len)