summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-09-25 13:36:24 +0200
committerDavid Lönnhager <david.l@mullvad.net>2025-09-25 13:36:24 +0200
commit3ab4829a7a14e087807f807a4e0e643f18d26db8 (patch)
treeacebd01a8ba01d4d74c4c6347b333bae421b35f5
parent56c3745b7852ec992e629d3f66b3e206a70f624e (diff)
parentd9b16dec23976e71aaa7ff3624c435c855435e84 (diff)
downloadmullvadvpn-3ab4829a7a14e087807f807a4e0e643f18d26db8.tar.xz
mullvadvpn-3ab4829a7a14e087807f807a4e0e643f18d26db8.zip
Merge branch 'choose-random-quic-addr'
-rw-r--r--mullvad-management-interface/src/types/conversions/relay_constraints.rs2
-rw-r--r--mullvad-relay-selector/src/relay_selector/helpers.rs8
-rw-r--r--mullvad-relay-selector/src/relay_selector/matcher.rs4
-rw-r--r--mullvad-types/src/relay_list.rs12
4 files changed, 14 insertions, 12 deletions
diff --git a/mullvad-management-interface/src/types/conversions/relay_constraints.rs b/mullvad-management-interface/src/types/conversions/relay_constraints.rs
index 2a513b58fe..6fa52b3fa5 100644
--- a/mullvad-management-interface/src/types/conversions/relay_constraints.rs
+++ b/mullvad-management-interface/src/types/conversions/relay_constraints.rs
@@ -65,7 +65,7 @@ impl TryFrom<&proto::OpenvpnConstraints> for mullvad_types::relay_constraints::O
Ok(mullvad_constraints::OpenVpnConstraints {
port: Constraint::from(match &constraints.port {
- Some(port) => Some(mullvad_constraints::TransportPort::try_from(port.clone())?),
+ Some(port) => Some(mullvad_constraints::TransportPort::try_from(*port)?),
None => None,
}),
})
diff --git a/mullvad-relay-selector/src/relay_selector/helpers.rs b/mullvad-relay-selector/src/relay_selector/helpers.rs
index 23a050b6c6..977b92b26e 100644
--- a/mullvad-relay-selector/src/relay_selector/helpers.rs
+++ b/mullvad-relay-selector/src/relay_selector/helpers.rs
@@ -201,10 +201,12 @@ pub fn get_quic_obfuscator(
let quic = relay.wireguard()?.quic()?;
let config = {
let hostname = quic.hostname().to_string();
- let endpoint = match ip_version {
- IpVersion::V4 => SocketAddr::from((quic.in_ipv4()?, quic.port())),
- IpVersion::V6 => SocketAddr::from((quic.in_ipv6()?, quic.port())),
+ let addrs: Vec<IpAddr> = match ip_version {
+ IpVersion::V4 => quic.in_ipv4().map(IpAddr::from).collect(),
+ IpVersion::V6 => quic.in_ipv6().map(IpAddr::from).collect(),
};
+ let &in_ip = addrs.iter().choose(&mut rand::rng())?;
+ let endpoint = SocketAddr::from((in_ip, quic.port()));
let auth_token = quic.auth_token().to_string();
ObfuscatorConfig::Quic {
hostname,
diff --git a/mullvad-relay-selector/src/relay_selector/matcher.rs b/mullvad-relay-selector/src/relay_selector/matcher.rs
index 14402feb67..e0efca03a4 100644
--- a/mullvad-relay-selector/src/relay_selector/matcher.rs
+++ b/mullvad-relay-selector/src/relay_selector/matcher.rs
@@ -140,8 +140,8 @@ fn filter_on_obfuscation(
ObfuscationQuery::Quic => match endpoint_data.quic() {
Some(quic) => match query.ip_version {
Constraint::Any => true,
- Constraint::Only(IpVersion::V4) => quic.in_ipv4().is_some(),
- Constraint::Only(IpVersion::V6) => quic.in_ipv6().is_some(),
+ Constraint::Only(IpVersion::V4) => quic.in_ipv4().next().is_some(),
+ Constraint::Only(IpVersion::V6) => quic.in_ipv6().next().is_some(),
},
None => false,
},
diff --git a/mullvad-types/src/relay_list.rs b/mullvad-types/src/relay_list.rs
index ee3c107b7e..d28ed88e74 100644
--- a/mullvad-types/src/relay_list.rs
+++ b/mullvad-types/src/relay_list.rs
@@ -165,26 +165,26 @@ impl Quic {
}
}
- /// In address as an IPv4 address.
+ /// Return IPv4 in-addresses.
///
/// Use this if you want to connect to the masque-proxy using IPv4.
- pub fn in_ipv4(&self) -> Option<Ipv4Addr> {
+ pub fn in_ipv4(&self) -> impl Iterator<Item = Ipv4Addr> {
let ipv4 = |ipaddr: &IpAddr| match ipaddr {
IpAddr::V4(ipv4_addr) => Some(*ipv4_addr),
IpAddr::V6(_) => None,
};
- self.addr_in.iter().find_map(ipv4)
+ self.addr_in.iter().filter_map(ipv4)
}
- /// In address as an IPv6 address.
+ /// Return IPv6 in-addresses.
///
/// Use this if you want to connect to the masque-proxy using IPv6.
- pub fn in_ipv6(&self) -> Option<Ipv6Addr> {
+ pub fn in_ipv6(&self) -> impl Iterator<Item = Ipv6Addr> {
let ipv6 = |ipaddr: &IpAddr| match ipaddr {
IpAddr::V4(_) => None,
IpAddr::V6(ipv6_addr) => Some(*ipv6_addr),
};
- self.addr_in.iter().find_map(ipv6)
+ self.addr_in.iter().filter_map(ipv6)
}
/// Port of the masque-proxy daemon.