summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--talpid-wireguard/Cargo.toml5
-rw-r--r--talpid-wireguard/src/boringtun/mod.rs75
3 files changed, 64 insertions, 17 deletions
diff --git a/Cargo.lock b/Cargo.lock
index f6c6c26dfb..9c4da7770c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -444,7 +444,6 @@ dependencies = [
[[package]]
name = "boringtun"
version = "0.6.0"
-source = "git+https://github.com/mullvad/boringtun?rev=ad10b7b1aecc8bbd73925bf6c332f97f27923c77#ad10b7b1aecc8bbd73925bf6c332f97f27923c77"
dependencies = [
"aead",
"async-trait",
diff --git a/talpid-wireguard/Cargo.toml b/talpid-wireguard/Cargo.toml
index a4f12408b6..34a3234d78 100644
--- a/talpid-wireguard/Cargo.toml
+++ b/talpid-wireguard/Cargo.toml
@@ -45,8 +45,9 @@ tokio-stream = { version = "0.1", features = ["io-util"] }
[dependencies.boringtun]
optional = true
features = ["device", "tun"]
-git = "https://github.com/mullvad/boringtun"
-rev = "ad10b7b1aecc8bbd73925bf6c332f97f27923c77"
+#git = "https://github.com/mullvad/boringtun"
+#rev = "ad10b7b1aecc8bbd73925bf6c332f97f27923c77"
+path = "../../boringtun/boringtun"
[target.'cfg(unix)'.dependencies]
nix = { workspace = true, features = ["fs"] }
diff --git a/talpid-wireguard/src/boringtun/mod.rs b/talpid-wireguard/src/boringtun/mod.rs
index 89b0272956..56b87d3380 100644
--- a/talpid-wireguard/src/boringtun/mod.rs
+++ b/talpid-wireguard/src/boringtun/mod.rs
@@ -7,14 +7,13 @@ use crate::{
use boringtun::udp::UdpTransportFactory;
use boringtun::{
device::{
- DeviceConfig, DeviceHandle,
- api::{ApiClient, ApiServer, command::*},
- peer::AllowedIP,
+ api::{command::*, ApiClient, ApiServer}, peer::{AllowedIP, SingleDeviceFwd, SinglePeerTun}, DeviceConfig, DeviceHandle
},
- udp::{UdpSocketFactory, channel::PacketChannel},
+ udp::{channel::PacketChannel, UdpSocketFactory, UdpTransport, UdpTransportFactory, UdpTransportFactoryParams},
};
#[cfg(not(target_os = "android"))]
use ipnetwork::IpNetwork;
+use tokio::net::UdpSocket;
#[cfg(target_os = "android")]
use std::os::fd::IntoRawFd;
use std::{
@@ -58,8 +57,9 @@ pub struct BoringTun {
enum Devices {
Singlehop {
- device: SinglehopDevice,
- api: ApiClient,
+ //device: SinglehopDevice,
+ //api: ApiClient,
+ device: SingleDeviceFwd,
},
Multihop {
@@ -199,7 +199,7 @@ async fn create_devices(
if config.exit_peer.is_some() {
// multihop
- let source_v4 = config.tunnel.addresses.iter().find_map(|ip| match ip {
+ let source_v4: Option<Ipv4Addr> = config.tunnel.addresses.iter().find_map(|ip| match ip {
&IpAddr::V4(ipv4_addr) => Some(ipv4_addr),
IpAddr::V6(..) => None,
});
@@ -242,7 +242,7 @@ async fn create_devices(
exit_api,
}
} else {
- #[cfg(target_os = "android")]
+ /*#[cfg(target_os = "android")]
let factory = AndroidUdpSocketFactory { tun };
#[cfg(not(target_os = "android"))]
@@ -259,6 +259,39 @@ async fn create_devices(
Devices::Singlehop {
device,
api: entry_api,
+ }*/
+ let source_v4 = config.tunnel.addresses.iter().find_map(|ip| match ip {
+ &IpAddr::V4(ipv4_addr) => Some(ipv4_addr),
+ IpAddr::V6(..) => None,
+ });
+
+ let source_v6 = config.tunnel.addresses.iter().find_map(|ip| match ip {
+ &IpAddr::V6(ipv6_addr) => Some(ipv6_addr),
+ IpAddr::V4(..) => None,
+ });
+ let endpoint_socket = UdpSocket::bind("0.0.0.0:0")
+ .await
+ .expect("Failed to bind UDP socket");
+ if let Some(fwmark) = config.fwmark {
+ endpoint_socket
+ .set_fwmark(fwmark)
+ .expect("Failed to set fwmark on UDP socket");
+ }
+
+ let peer_tun = SinglePeerTun::new(
+ config.tunnel.private_key.to_bytes().into(),
+ (*config.entry_peer.public_key.as_bytes()).into(),
+ config.entry_peer.endpoint,
+ // TODO
+ None,
+ &config.entry_peer.allowed_ips.iter().map(|ip| AllowedIP {
+ addr: ip.ip(),
+ cidr: ip.prefix(),
+ }).collect::<Vec<_>>(),
+ );
+
+ Devices::Singlehop {
+ device: SingleDeviceFwd::new(async_tun, Arc::new(endpoint_socket), peer_tun),
}
}
}
@@ -274,7 +307,7 @@ impl Tunnel for BoringTun {
tokio::runtime::Handle::current().block_on(async {
match self.devices.take().unwrap() {
Devices::Singlehop { device, .. } => {
- device.stop().await;
+ device.stop();
}
Devices::Multihop {
entry_device,
@@ -294,7 +327,18 @@ impl Tunnel for BoringTun {
let mut stats = StatsMap::default();
let apis = match self.devices.as_ref().unwrap() {
- Devices::Singlehop { api, .. } => [Some(api), None],
+ //Devices::Singlehop { api, .. } => [Some(api), None],
+ Devices::Singlehop { device, .. } => {
+ let (tx_bytes, rx_bytes) = device.stats();
+ stats.insert(
+ self.config.entry_peer.public_key.as_bytes().to_owned(),
+ Stats {
+ tx_bytes: tx_bytes as u64,
+ rx_bytes: rx_bytes as u64,
+ },
+ );
+ return Ok(stats);
+ }
Devices::Multihop {
entry_api,
exit_api,
@@ -328,13 +372,15 @@ impl Tunnel for BoringTun {
config: Config,
) -> std::pin::Pin<Box<dyn Future<Output = Result<(), TunnelError>> + Send + 'a>> {
Box::pin(async move {
- let old_config = std::mem::replace(&mut self.config, config);
+ log::warn!("set_config is ignored");
+ /*let old_config = std::mem::replace(&mut self.config, config);
if old_config.is_multihop() != self.config.is_multihop() {
// TODO: Update existing tunnels?
match self.devices.take().unwrap() {
Devices::Singlehop { device, .. } => {
- device.stop().await;
+ //device.stop().await;
+ log::warn!("set_config is ignored");
}
Devices::Multihop {
entry_device,
@@ -358,7 +404,8 @@ impl Tunnel for BoringTun {
}
match self.devices.as_mut().unwrap() {
Devices::Singlehop { api, .. } => {
- set_boringtun_config(api, &self.config).await?;
+ //set_boringtun_config(api, &self.config).await?;
+ log::warn!("set_config is ignored");
}
Devices::Multihop {
entry_api,
@@ -368,7 +415,7 @@ impl Tunnel for BoringTun {
set_boringtun_entry_config(entry_api, &self.config).await?;
set_boringtun_exit_config(exit_api, &self.config).await?;
}
- }
+ }*/
Ok(())
})
}