add filter_force_ipv6 option that (only when being set) filters gossip endpoints by their version (false -> V4, true -> V6). this avoids mixups in setups where interfaces are separated by IP version.

This commit is contained in:
Lyn 2025-01-29 16:39:17 +01:00
parent 7d02510878
commit 66ee10619b

View file

@ -85,6 +85,7 @@ struct InterfaceSetting {
name: String, name: String,
/// Specify the external port that should be IGD forwarded to this Wireguard interface. Only used for IPv4. /// Specify the external port that should be IGD forwarded to this Wireguard interface. Only used for IPv4.
upnp_ext_port_v4: Option<u16>, upnp_ext_port_v4: Option<u16>,
filter_force_ipv6: Option<bool>,
} }
fn main() -> Result<()> { fn main() -> Result<()> {
@ -657,7 +658,6 @@ impl State {
Ok(()) Ok(())
} }
fn setup_wg_peers(&mut self, daemon: &Daemon, i: usize) -> Result<()> { fn setup_wg_peers(&mut self, daemon: &Daemon, i: usize) -> Result<()> {
let now = time(); let now = time();
for peer_cfg in daemon.config.peers.iter() { for peer_cfg in daemon.config.peers.iter() {
@ -737,6 +737,15 @@ impl State {
} }
} }
endpoints.sort(); endpoints.sort();
// if prefer_ipv6 option is set, strongly prefer addresses of chosen version
if let Some(interface) = daemon.config.interfaces.iter().find(|ifsetting| ifsetting.name == peer_cfg.interface) {
if let Some(filter_ipv6_only) = interface.filter_force_ipv6 {
endpoints = endpoints.into_iter().filter(|(ep, _)| {
ep.ip().is_ipv6() == filter_ipv6_only
}).collect();
}
}
endpoints = endpoints endpoints = endpoints
.into_iter() .into_iter()
.filter(|(ep, _)| { .filter(|(ep, _)| {
@ -750,7 +759,6 @@ impl State {
endpoints endpoints
} }
}; };
if !endpoints.is_empty() { if !endpoints.is_empty() {
let endpoint = endpoints[i % endpoints.len()].0; let endpoint = endpoints[i % endpoints.len()].0;