Skip to content

Commit dcbebe9

Browse files
refactor(iroh)!: rework net_report (#3314)
## Description - Use more `Watchable` in more places - Drops STUN, ICMP and hairpin probes, they are not actually needed in our world - restructure report generation - Keep QAD connections open, instead of recreating them on every report - Removes `STUN` functionality from the relay server **Fixes** - #3315 ## Breaking Changes - removes `iroh_relay::protos::stun::StunError` - removes `iroh_relay::server::testing::stun_config` - removes `iroh_relay::protos::stun` - removes `iroh_relay::quic::QuicClient::get_addr_and_latency` - removes `DEFAULT_STUN_PORT` ## Depends on - [x] #3279 - [x] n0-computer/net-tools#27 --------- Co-authored-by: Kasey <kasey@n0.computer>
1 parent 518400b commit dcbebe9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+2170
-5753
lines changed

Cargo.lock

Lines changed: 23 additions & 46 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docker/Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ FROM rust:alpine AS chef
22

33
RUN update-ca-certificates
44
RUN apk add --no-cache musl-dev openssl-dev pkgconfig
5-
RUN cargo install cargo-chef
5+
RUN cargo install cargo-chef
66
WORKDIR /iroh
77

88
FROM chef AS planner
@@ -40,7 +40,7 @@ RUN chmod +x /iroh-relay
4040
WORKDIR /
4141

4242
# expose the default ports
43-
# http, https, stun, metrics
43+
# http, https, metrics
4444
EXPOSE 80 443 3478/udp 9090
4545
ENTRYPOINT ["/iroh-relay"]
4646
CMD [""]
@@ -62,4 +62,4 @@ WORKDIR /
6262
# dns, metrics
6363
EXPOSE 53/udp 9090
6464
ENTRYPOINT ["/iroh-dns-server"]
65-
CMD [""]
65+
CMD [""]

example.config.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
11
[[relay_nodes]]
22
url = "https://foo.bar"
3-
stun_only = false
4-
stun_port = 1244
5-

iroh-relay/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ reqwest = { version = "0.12", default-features = false, features = [
5151
rustls = { version = "0.23", default-features = false, features = ["ring"] }
5252
serde = { version = "1", features = ["derive", "rc"] }
5353
strum = { version = "0.26", features = ["derive"] }
54-
stun-rs = "0.1.11"
5554
tokio = { version = "1", features = [
5655
"io-util",
5756
"macros",

iroh-relay/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ relays, including:
1515
- Relay Protocol: The protocol used to communicate between relay servers and
1616
clients
1717
- Relay Server: A fully-fledged iroh-relay server over HTTP or HTTPS.
18-
Optionally will also expose a stun endpoint and metrics.
18+
Optionally will also expose a QAD endpoint and metrics.
1919
- Relay Client: A client for establishing connections to the relay.
2020
- Server Binary: A CLI for running your own relay server. It can be configured
21-
to also offer STUN support and expose metrics.
21+
to also expose metrics.
2222

2323

2424
Used in [iroh], created with love by the [n0 team](https://n0.computer/).

iroh-relay/src/defaults.rs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
//! Default values used in the relay.
22
3-
/// The default STUN port used by the Relay server.
4-
///
5-
/// The STUN port as defined by [RFC 8489](<https://www.rfc-editor.org/rfc/rfc8489#section-18.6>)
6-
pub const DEFAULT_STUN_PORT: u16 = 3478;
7-
83
/// The default QUIC port used by the Relay server to accept QUIC connections
94
/// for QUIC address discovery
105
///

iroh-relay/src/dns.rs

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::{
44
fmt,
55
future::Future,
66
net::{IpAddr, Ipv6Addr, SocketAddr},
7+
sync::Arc,
78
};
89

910
use hickory_resolver::{name_server::TokioConnectionProvider, TokioResolver};
@@ -14,6 +15,7 @@ use n0_future::{
1415
};
1516
use nested_enum_utils::common_fields;
1617
use snafu::{Backtrace, GenerateImplicitData, OptionExt, Snafu};
18+
use tokio::sync::RwLock;
1719
use url::Url;
1820

1921
use crate::node_info::{LookupError, NodeInfo};
@@ -77,7 +79,10 @@ impl<E: std::fmt::Debug + std::fmt::Display> StaggeredError<E> {
7779

7880
/// The DNS resolver used throughout `iroh`.
7981
#[derive(Debug, Clone)]
80-
pub struct DnsResolver(TokioResolver);
82+
pub struct DnsResolver {
83+
resolver: Arc<RwLock<TokioResolver>>,
84+
nameserver: Option<SocketAddr>,
85+
}
8186

8287
impl DnsResolver {
8388
/// Create a new DNS resolver with sensible cross-platform defaults.
@@ -86,6 +91,14 @@ impl DnsResolver {
8691
/// This does not work at least on some Androids, therefore we fallback
8792
/// to the default `ResolverConfig` which uses eg. to google's `8.8.8.8` or `8.8.4.4`.
8893
pub fn new() -> Self {
94+
let resolver = Self::new_inner();
95+
Self {
96+
resolver: Arc::new(RwLock::new(resolver)),
97+
nameserver: None,
98+
}
99+
}
100+
101+
fn new_inner() -> TokioResolver {
89102
let (system_config, mut options) =
90103
hickory_resolver::system_conf::read_system_conf().unwrap_or_default();
91104

@@ -110,11 +123,19 @@ impl DnsResolver {
110123
let mut builder =
111124
TokioResolver::builder_with_config(config, TokioConnectionProvider::default());
112125
*builder.options_mut() = options;
113-
DnsResolver(builder.build())
126+
builder.build()
114127
}
115128

116129
/// Create a new DNS resolver configured with a single UDP DNS nameserver.
117130
pub fn with_nameserver(nameserver: SocketAddr) -> Self {
131+
let resolver = Self::with_nameserver_inner(nameserver);
132+
Self {
133+
resolver: Arc::new(RwLock::new(resolver)),
134+
nameserver: Some(nameserver),
135+
}
136+
}
137+
138+
fn with_nameserver_inner(nameserver: SocketAddr) -> TokioResolver {
118139
let mut config = hickory_resolver::config::ResolverConfig::new();
119140
let nameserver_config = hickory_resolver::config::NameServerConfig::new(
120141
nameserver,
@@ -124,12 +145,24 @@ impl DnsResolver {
124145

125146
let builder =
126147
TokioResolver::builder_with_config(config, TokioConnectionProvider::default());
127-
DnsResolver(builder.build())
148+
builder.build()
128149
}
129150

130151
/// Removes all entries from the cache.
131-
pub fn clear_cache(&self) {
132-
self.0.clear_cache();
152+
pub async fn clear_cache(&self) {
153+
self.resolver.read().await.clear_cache();
154+
}
155+
156+
/// Recreate the inner resolver
157+
pub async fn reset(&self) {
158+
let mut this = self.resolver.write().await;
159+
let resolver = if let Some(nameserver) = self.nameserver {
160+
Self::with_nameserver_inner(nameserver)
161+
} else {
162+
Self::new_inner()
163+
};
164+
165+
*this = resolver;
133166
}
134167

135168
/// Lookup a TXT record.
@@ -139,7 +172,8 @@ impl DnsResolver {
139172
timeout: Duration,
140173
) -> Result<TxtLookup, DnsError> {
141174
let host = host.to_string();
142-
let res = time::timeout(timeout, self.0.txt_lookup(host)).await??;
175+
let this = self.resolver.read().await;
176+
let res = time::timeout(timeout, this.txt_lookup(host)).await??;
143177
Ok(TxtLookup(res))
144178
}
145179

@@ -150,7 +184,8 @@ impl DnsResolver {
150184
timeout: Duration,
151185
) -> Result<impl Iterator<Item = IpAddr>, DnsError> {
152186
let host = host.to_string();
153-
let addrs = time::timeout(timeout, self.0.ipv4_lookup(host)).await??;
187+
let this = self.resolver.read().await;
188+
let addrs = time::timeout(timeout, this.ipv4_lookup(host)).await??;
154189
Ok(addrs.into_iter().map(|ip| IpAddr::V4(ip.0)))
155190
}
156191

@@ -161,7 +196,8 @@ impl DnsResolver {
161196
timeout: Duration,
162197
) -> Result<impl Iterator<Item = IpAddr>, DnsError> {
163198
let host = host.to_string();
164-
let addrs = time::timeout(timeout, self.0.ipv6_lookup(host)).await??;
199+
let this = self.resolver.read().await;
200+
let addrs = time::timeout(timeout, this.ipv6_lookup(host)).await??;
165201
Ok(addrs.into_iter().map(|ip| IpAddr::V6(ip.0)))
166202
}
167203

@@ -349,7 +385,10 @@ impl Default for DnsResolver {
349385

350386
impl From<TokioResolver> for DnsResolver {
351387
fn from(resolver: TokioResolver) -> Self {
352-
DnsResolver(resolver)
388+
DnsResolver {
389+
resolver: Arc::new(RwLock::new(resolver)),
390+
nameserver: None,
391+
}
353392
}
354393
}
355394

iroh-relay/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
doc = "- `server`: A fully-fledged iroh-relay server over HTTP or HTTPS."
2121
)]
2222
//!
23-
//! Optionally will also expose a stun endpoint and metrics. (requires the feature flag `server`)
23+
//! Optionally will also expose a QAD endpoint and metrics. (requires the feature flag `server`)
2424
//! - [`client`]: A client for establishing connections to the relay.
2525
//! - *Server Binary*: A CLI for running your own relay server. It can be configured to also offer
26-
//! STUN support and expose metrics.
26+
//! QAD support and expose metrics.
2727
// Based on tailscale/derp/derp.go
2828

2929
#![cfg_attr(iroh_docsrs, feature(doc_auto_cfg))]

0 commit comments

Comments
 (0)