liveness tweaks

This commit is contained in:
John Smith 2022-08-05 18:07:32 -04:00
parent 63aa0dc1f6
commit ef096eb310
4 changed files with 51 additions and 31 deletions

View File

@ -964,12 +964,17 @@ impl NetworkManager {
Some(RoutingDomain::PublicInternet), Some(RoutingDomain::PublicInternet),
&reverse_dif, &reverse_dif,
) { ) {
// Can we receive a direct reverse connection? // Ensure we aren't on the same public IP address (no hairpin nat)
if !reverse_did.class.requires_signal() { if reverse_did.dial_info.to_ip_addr()
return ContactMethod::SignalReverse( != target_public_did.dial_info.to_ip_addr()
inbound_relay_nr, {
target_node_ref, // Can we receive a direct reverse connection?
); if !reverse_did.class.requires_signal() {
return ContactMethod::SignalReverse(
inbound_relay_nr,
target_node_ref,
);
}
} }
} }
@ -979,27 +984,33 @@ impl NetworkManager {
let udp_target_nr = target_node_ref.filtered_clone( let udp_target_nr = target_node_ref.filtered_clone(
DialInfoFilter::global().with_protocol_type(ProtocolType::UDP), DialInfoFilter::global().with_protocol_type(ProtocolType::UDP),
); );
let target_has_udp_dialinfo = udp_target_nr if let Some(target_udp_dialinfo_detail) = udp_target_nr
.first_filtered_dial_info_detail(Some(RoutingDomain::PublicInternet)) .first_filtered_dial_info_detail(Some(RoutingDomain::PublicInternet))
.is_some(); {
// Does the self node have a direct udp dialinfo the target can reach?
// Does the self node have a direct udp dialinfo the target can reach? let inbound_udp_dif = self
let inbound_udp_dif = self .get_inbound_dial_info_filter(RoutingDomain::PublicInternet)
.get_inbound_dial_info_filter(RoutingDomain::PublicInternet) .filtered(target_node_ref.node_info_outbound_filter())
.filtered(target_node_ref.node_info_outbound_filter()) .filtered(
.filtered( DialInfoFilter::global().with_protocol_type(ProtocolType::UDP),
DialInfoFilter::global().with_protocol_type(ProtocolType::UDP), );
); if let Some(self_udp_dialinfo_detail) = routing_table
let self_has_udp_dialinfo = routing_table .first_filtered_dial_info_detail(
.first_filtered_dial_info_detail( Some(RoutingDomain::PublicInternet),
Some(RoutingDomain::PublicInternet), &inbound_udp_dif,
&inbound_udp_dif, )
) {
.is_some(); // Ensure we aren't on the same public IP address (no hairpin nat)
if target_udp_dialinfo_detail.dial_info.to_ip_addr()
// Does the target and ourselves have a udp dialinfo that they can reach? != self_udp_dialinfo_detail.dial_info.to_ip_addr()
if target_has_udp_dialinfo && self_has_udp_dialinfo { {
return ContactMethod::SignalHolePunch(inbound_relay_nr, udp_target_nr); // The target and ourselves have a udp dialinfo that they can reach
return ContactMethod::SignalHolePunch(
inbound_relay_nr,
udp_target_nr,
);
}
}
} }
// Otherwise we have to inbound relay // Otherwise we have to inbound relay
} }

View File

@ -108,14 +108,15 @@ impl BucketEntryInner {
move |e1, e2| Self::cmp_fastest_reliable(cur_ts, e1, e2) move |e1, e2| Self::cmp_fastest_reliable(cur_ts, e1, e2)
} }
pub fn update_node_info(&mut self, signed_node_info: SignedNodeInfo) { // Retuns true if the node info changed
pub fn update_node_info(&mut self, signed_node_info: SignedNodeInfo) -> bool {
// Don't update with older node info, or something less valid // Don't update with older node info, or something less valid
if let Some(current_sni) = &self.opt_signed_node_info { if let Some(current_sni) = &self.opt_signed_node_info {
if current_sni.signature.valid && !signed_node_info.signature.valid { if current_sni.signature.valid && !signed_node_info.signature.valid {
return; return false;
} }
if signed_node_info.timestamp < current_sni.timestamp { if signed_node_info.timestamp < current_sni.timestamp {
return; return false;
} }
} }
self.min_max_version = Some(( self.min_max_version = Some((
@ -123,6 +124,8 @@ impl BucketEntryInner {
signed_node_info.node_info.max_version, signed_node_info.node_info.max_version,
)); ));
self.opt_signed_node_info = Some(signed_node_info); self.opt_signed_node_info = Some(signed_node_info);
true
} }
pub fn update_local_node_info(&mut self, local_node_info: LocalNodeInfo) { pub fn update_local_node_info(&mut self, local_node_info: LocalNodeInfo) {
self.opt_local_node_info = Some(local_node_info) self.opt_local_node_info = Some(local_node_info)

View File

@ -581,7 +581,10 @@ impl RoutingTable {
} }
self.create_node_ref(node_id, |e| { self.create_node_ref(node_id, |e| {
e.update_node_info(signed_node_info); if e.update_node_info(signed_node_info) {
// at least someone thought this node was live and its node info changed so lets try to contact it
e.touch_last_seen(intf::get_timestamp());
}
}) })
} }
@ -596,6 +599,9 @@ impl RoutingTable {
self.create_node_ref(node_id, |e| { self.create_node_ref(node_id, |e| {
// set the most recent node address for connection finding and udp replies // set the most recent node address for connection finding and udp replies
e.set_last_connection(descriptor, timestamp); e.set_last_connection(descriptor, timestamp);
// this node is live because it literally just connected to us
e.touch_last_seen(timestamp);
}) })
} }

View File

@ -93,7 +93,7 @@ core:
set_value_timeout: set_value_timeout:
set_value_count: 20 set_value_count: 20
set_value_fanout: 5 set_value_fanout: 5
min_peer_count: 20 min_peer_count: 2 # 20
min_peer_refresh_time_ms: 2000 min_peer_refresh_time_ms: 2000
validate_dial_info_receipt_time_ms: 2000 validate_dial_info_receipt_time_ms: 2000
upnp: false upnp: false