Our Info panel, hole punch race fix, NAT profiles in relay introduction
- Network Diagnostics: "Our Info" button shows addresses with NAT status, device role, UPnP, HTTP capability. Addresses stacked for mobile. - Hole punch race: re-check for existing connection before and after relay introduction to avoid wasting minutes on redundant punch attempts. - Relay introduction now carries requester/target NAT mapping+filtering so hole punch strategy uses fresh profiles instead of stale stored ones. Critical for phones that switch between WiFi/cellular/VPN. - STUN fix: filter DNS results to IPv4 (was resolving to IPv6 first on dual-stack, causing silent send failure and "NAT unknown"). - Welcome screen: Ready button with loading bar for instant feed access. - LAN addresses show just "LAN" (no misleading punchability label). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e354ccc388
commit
be253e8001
7 changed files with 266 additions and 9 deletions
|
|
@ -349,6 +349,11 @@ impl Network {
|
|||
self.device_role
|
||||
}
|
||||
|
||||
/// Get the explicit bind address (from --bind flag), if any.
|
||||
pub fn bind_addr(&self) -> Option<std::net::SocketAddr> {
|
||||
self.bind_addr
|
||||
}
|
||||
|
||||
/// Whether this node can serve HTTP (has TCP reachability).
|
||||
pub fn is_http_capable(&self) -> bool {
|
||||
self.has_upnp_tcp || self.has_public_v6 || self.bind_addr.is_some()
|
||||
|
|
@ -1952,7 +1957,13 @@ impl Network {
|
|||
}
|
||||
}
|
||||
|
||||
// 4. Try relay introduction + hole punch (no lock during I/O)
|
||||
// 4. Re-check connection — peer may have connected to us while we were trying direct
|
||||
if let Some(conn) = self.conn_handle.get_any_connection(peer_id).await {
|
||||
debug!(peer = hex::encode(peer_id), "Peer connected to us while we were trying — using existing connection");
|
||||
return Ok(conn);
|
||||
}
|
||||
|
||||
// 5. Try relay introduction + hole punch (no lock during I/O)
|
||||
let relay_candidates = self.conn_handle.find_relays_for(peer_id).await;
|
||||
|
||||
if relay_candidates.is_empty() {
|
||||
|
|
@ -1975,10 +1986,28 @@ impl Network {
|
|||
self.send_relay_introduce_standalone(relay_peer, peer_id, *ttl),
|
||||
).await;
|
||||
|
||||
// Re-check: peer may have connected while relay intro was in flight
|
||||
if let Some(conn) = self.conn_handle.get_any_connection(peer_id).await {
|
||||
debug!(peer = hex::encode(peer_id), "Peer connected during relay intro — using existing");
|
||||
return Ok(conn);
|
||||
}
|
||||
|
||||
match intro_result {
|
||||
Ok(Ok(result)) if result.accepted => {
|
||||
Ok(Ok(ref result)) if result.accepted => {
|
||||
let our_profile = self.conn_handle.our_nat_profile().await;
|
||||
let peer_profile = {
|
||||
// Prefer fresh NAT profile from relay response over stale stored profile
|
||||
let peer_profile = if result.nat_mapping.is_some() || result.nat_filtering.is_some() {
|
||||
let mapping = result.nat_mapping.as_deref()
|
||||
.map(crate::types::NatMapping::from_str_label)
|
||||
.unwrap_or(crate::types::NatMapping::Unknown);
|
||||
let filtering = result.nat_filtering.as_deref()
|
||||
.map(crate::types::NatFiltering::from_str_label)
|
||||
.unwrap_or(crate::types::NatFiltering::Unknown);
|
||||
let fresh = crate::types::NatProfile::new(mapping, filtering);
|
||||
let s = self.storage.get().await;
|
||||
let _ = s.set_peer_nat_profile(peer_id, &fresh);
|
||||
fresh
|
||||
} else {
|
||||
let s = self.storage.get().await;
|
||||
s.get_peer_nat_profile(peer_id)
|
||||
};
|
||||
|
|
@ -2274,12 +2303,15 @@ impl Network {
|
|||
}
|
||||
}
|
||||
|
||||
let our_profile = self.conn_handle.our_nat_profile().await;
|
||||
let payload = crate::protocol::RelayIntroducePayload {
|
||||
intro_id,
|
||||
target: *target,
|
||||
requester: self.our_node_id,
|
||||
requester_addresses: our_addrs,
|
||||
ttl,
|
||||
nat_mapping: Some(our_profile.mapping.to_string()),
|
||||
nat_filtering: Some(our_profile.filtering.to_string()),
|
||||
};
|
||||
|
||||
let (mut send, mut recv) = conn.open_bi().await?;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue