use nym_crypto::asymmetric::x25519;
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
pub const DEFAULT_EXIT_WG_CLIENT_PORT: u16 = 54001;
pub struct PeerConfig {
pub gateway_public_key: x25519::PublicKey,
pub client_private_key: x25519::PrivateKey,
pub preshared_key: Option<[u8; 32]>,
pub endpoint: SocketAddr,
pub assigned_ipv4: Ipv4Addr,
pub assigned_ipv6: Option<Ipv6Addr>,
}
impl std::fmt::Debug for PeerConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PeerConfig")
.field("gateway_public_key", &self.gateway_public_key.as_bytes())
.field("client_private_key", &"<redacted>")
.field("preshared_key", &self.preshared_key.map(|_| "<redacted>"))
.field("endpoint", &self.endpoint)
.field("assigned_ipv4", &self.assigned_ipv4)
.field("assigned_ipv6", &self.assigned_ipv6)
.finish()
}
}
#[derive(Clone, Copy, Debug)]
pub struct MtuConfig {
pub entry: usize,
pub exit: usize,
}
impl MtuConfig {
pub const OVERHEAD_PER_HOP: usize = 80;
pub const DESKTOP: MtuConfig = MtuConfig {
entry: 1420,
exit: 1340,
};
pub const MOBILE: MtuConfig = MtuConfig {
entry: 1360,
exit: 1280,
};
}
impl Default for MtuConfig {
fn default() -> Self {
#[cfg(any(target_os = "ios", target_os = "android"))]
{
Self::MOBILE
}
#[cfg(not(any(target_os = "ios", target_os = "android")))]
{
Self::DESKTOP
}
}
}
#[derive(Clone, Copy, Debug, Default)]
pub enum DnsMode {
#[default]
InTunnel,
InTunnelServer(SocketAddr),
Disabled,
}
#[derive(Clone, Debug)]
pub struct TunnelConfig {
pub mtu: MtuConfig,
pub dns: DnsMode,
pub exit_client_port: u16,
}
impl Default for TunnelConfig {
fn default() -> Self {
Self {
mtu: MtuConfig::default(),
dns: DnsMode::default(),
exit_client_port: DEFAULT_EXIT_WG_CLIENT_PORT,
}
}
}