diff options
| author | tv <tv@krebsco.de> | 2026-10-31 21:58:21 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-10-31 21:58:21 +0100 |
| commit | 189cd36d9e015968b751117688fa4f0fd64bde36 (patch) | |
| tree | 1a1261153cdcad7e23cee91ea13a846e44d9fc7b /src/transport/libp2p/config.rs | |
| parent | d1e49f0920e4c10f7822ab94099ffd03a4ba3d6c (diff) | |
libp2p: warn/refuse bad prefer/ignore combos
Diffstat (limited to 'src/transport/libp2p/config.rs')
| -rw-r--r-- | src/transport/libp2p/config.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/transport/libp2p/config.rs b/src/transport/libp2p/config.rs index 8b172ba..4db8444 100644 --- a/src/transport/libp2p/config.rs +++ b/src/transport/libp2p/config.rs @@ -59,8 +59,14 @@ pub(crate) fn check(settings: &crate::config::Settings) -> Result<()> { parse_addresses("libp2p-listen", &settings.libp2p_listen)?; parse_addresses("libp2p-announce", &settings.libp2p_announce)?; parse_addresses("libp2p-relays", &settings.libp2p_relays)?; - parse_ranges("libp2p-ignore", &settings.libp2p_ignore)?; - parse_ranges("libp2p-prefer", &settings.libp2p_prefer)?; + let ignore = parse_ranges("libp2p-ignore", &settings.libp2p_ignore)?; + let prefer = parse_ranges("libp2p-prefer", &settings.libp2p_prefer)?; + check_preferred( + &ignore, + &prefer, + &settings.libp2p_ignore, + &settings.libp2p_prefer, + )?; if settings.relay_only { if settings.libp2p_listen.is_empty() { bail!("relay-only needs libp2p-listen: where nodes reach the relay"); @@ -74,6 +80,33 @@ pub(crate) fn check(settings: &crate::config::Settings) -> Result<()> { Ok(()) } +/// A range both ignored and preferred: refused where all of the preferred one is +/// ignored (it would name nothing usable), a warning where only part of it is (the +/// ignored part stays left out). `ignore_given` and `prefer_given`: as written, for +/// the messages. Ranges nest or are apart, so there's nothing in between. +pub(super) fn check_preferred( + ignore: &[IpRange], + prefer: &[IpRange], + ignore_given: &[String], + prefer_given: &[String], +) -> Result<()> { + for (preferred, preferred_given) in prefer.iter().zip(prefer_given) { + for (ignored, ignored_given) in ignore.iter().zip(ignore_given) { + if ignored.covers(preferred) { + bail!( + "libp2p-prefer {preferred_given:?} is all in libp2p-ignore {ignored_given:?}: nothing there is used" + ); + } + if preferred.covers(ignored) { + warn!( + "libp2p-prefer {preferred_given:?} has libp2p-ignore {ignored_given:?} in it: addresses there stay left out" + ); + } + } + } + Ok(()) +} + impl Libp2pConfig { /// The configuration `settings` give; `relay_only`: a relay that is no node /// (`--relay-only`). |
