diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-10-09 13:43:50 +0200 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2024-11-22 17:42:38 +0100 |
| commit | 848ddea38dcd93a1cf1575f87f8fada316dff590 (patch) | |
| tree | 855e9ef69fbd3f1e9e3943cb2c15502190f76cca /talpid-wireguard/src | |
| parent | 734abdd7fcafa3d1b4553460de1b2199d4043b51 (diff) | |
| download | mullvadvpn-848ddea38dcd93a1cf1575f87f8fada316dff590.tar.xz mullvadvpn-848ddea38dcd93a1cf1575f87f8fada316dff590.zip | |
Add initial multihop config on Android
- Add some minor wireguard go changes
Diffstat (limited to 'talpid-wireguard/src')
| -rw-r--r-- | talpid-wireguard/src/wireguard_go/mod.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/talpid-wireguard/src/wireguard_go/mod.rs b/talpid-wireguard/src/wireguard_go/mod.rs index 25ebb45a38..5caab06d09 100644 --- a/talpid-wireguard/src/wireguard_go/mod.rs +++ b/talpid-wireguard/src/wireguard_go/mod.rs @@ -5,6 +5,7 @@ use once_cell::sync::OnceCell; use std::{ffi::CString, fs, path::PathBuf}; use std::{ future::Future, + net::IpAddr, os::unix::io::{AsRawFd, RawFd}, path::Path, pin::Pin, @@ -59,6 +60,34 @@ pub struct WgGoTunnel { config: Config, } +// TODO: move into impl of Config +fn exit_config(multihop_config: &Config) -> Option<Config> { + let mut exit_config = multihop_config.clone(); + exit_config.entry_peer = multihop_config.exit_peer.clone()?; + Some(exit_config) +} + +// TODO: move into impl of Config +fn entry_config(multihop_config: &Config) -> Config { + let mut entry_config = multihop_config.clone(); + entry_config.exit_peer = None; + entry_config +} + +// TODO: move into impl of Config +fn private_ip(config: &Config) -> CString { + if let Some(ip) = config + .tunnel + .addresses + .iter() + .find(|addr| matches!(addr, IpAddr::V4(_))) { + CString::new(ip.to_string()).unwrap() + } + else { + CString::default() + } +} + impl WgGoTunnel { pub fn start_tunnel( config: &Config, @@ -81,6 +110,27 @@ impl WgGoTunnel { #[cfg(not(target_os = "android"))] let mtu = config.mtu as isize; + + let entry_config = entry_config(config); + let exit_config = exit_config(config); + + #[cfg(target_os = "android")] + if let Some(exit_config) = exit_config { + let entry_config_str = entry_config.to_userspace_format(); + let exit_config_str = exit_config.to_userspace_format(); + let private_ip = private_ip(config); + + let handle = wireguard_go_rs::Tunnel::turn_on_multihop( + exit_config_str, + entry_config_str, + private_ip, + tunnel_fd, + Some(logging::wg_go_logging_callback), + logging_context.0, + ) + .map_err(|e| TunnelError::FatalStartWireguardError(Box::new(e)))?; + } + let handle = wireguard_go_rs::Tunnel::turn_on( #[cfg(not(target_os = "android"))] mtu, |
