rename public->global, private->local, and fix up local interface detection

This commit is contained in:
John Smith 2021-12-07 21:41:57 -05:00
parent ebe16cd5da
commit b77f0dbcec
10 changed files with 64 additions and 69 deletions

View File

@ -833,7 +833,7 @@ impl Network {
// Add all resolved addresses as public dialinfo
for pdi_addr in &mut public_sockaddrs {
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
DialInfo::udp_from_socketaddr(pdi_addr),
Some(NetworkClass::Server),
DialInfoOrigin::Static,
@ -844,7 +844,7 @@ impl Network {
// Register local dial info as public if it is publicly routable
for x in &dial_infos {
if x.is_public().unwrap_or(false) {
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
x.clone(),
Some(NetworkClass::Server),
DialInfoOrigin::Static,
@ -895,13 +895,13 @@ impl Network {
let public_port = public_port
.ok_or_else(|| "port must be specified for public WS address".to_owned())?;
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
DialInfo::ws(fqdn, public_port, public_fqdn),
Some(NetworkClass::Server),
DialInfoOrigin::Static,
);
} else {
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
DialInfo::ws(fqdn, port, path.clone()),
Some(NetworkClass::Server),
DialInfoOrigin::Static,
@ -950,13 +950,13 @@ impl Network {
let public_port = public_port
.ok_or_else(|| "port must be specified for public WSS address".to_owned())?;
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
DialInfo::wss(fqdn, public_port, public_fqdn),
None,
DialInfoOrigin::Static,
);
} else {
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
DialInfo::wss(fqdn, port, path.clone()),
None,
DialInfoOrigin::Static,
@ -1004,7 +1004,7 @@ impl Network {
// Add all resolved addresses as public dialinfo
for pdi_addr in &mut public_sockaddrs {
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
DialInfo::tcp_from_socketaddr(pdi_addr),
None,
DialInfoOrigin::Static,
@ -1015,7 +1015,7 @@ impl Network {
// Register local dial info as public if it is publicly routable
for x in &dial_infos {
if x.is_public().unwrap_or(false) {
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
x.clone(),
Some(NetworkClass::Server),
DialInfoOrigin::Static,
@ -1079,7 +1079,7 @@ impl Network {
// Drop all dial info
routing_table.clear_local_dial_info();
routing_table.clear_public_dial_info();
routing_table.clear_global_dial_info();
// Cancels all async background tasks by dropping join handles
*self.inner.lock() = Self::new_inner(network_manager);
@ -1099,7 +1099,7 @@ impl Network {
// Go through our public dialinfo and see what our best network class is
let mut network_class = NetworkClass::Invalid;
for x in routing_table.public_dial_info() {
for x in routing_table.global_dial_info() {
if let Some(nc) = x.network_class {
if nc < network_class {
network_class = nc;
@ -1141,7 +1141,7 @@ impl Network {
&& (network_class.inbound_capable() || network_class == NetworkClass::Invalid)
{
let need_udpv4_dialinfo = routing_table
.public_dial_info_for_protocol_address_type(ProtocolAddressType::UDPv4)
.global_dial_info_for_protocol_address_type(ProtocolAddressType::UDPv4)
.is_empty();
if need_udpv4_dialinfo {
// If we have no public UDPv4 dialinfo, then we need to run a NAT check
@ -1159,7 +1159,7 @@ impl Network {
&& (network_class.inbound_capable() || network_class == NetworkClass::Invalid)
{
let need_tcpv4_dialinfo = routing_table
.public_dial_info_for_protocol_address_type(ProtocolAddressType::TCPv4)
.global_dial_info_for_protocol_address_type(ProtocolAddressType::TCPv4)
.is_empty();
if need_tcpv4_dialinfo {
// If we have no public TCPv4 dialinfo, then we need to run a NAT check

View File

@ -46,30 +46,25 @@ impl Network {
Err("no peers responded with an external address".to_owned())
}
fn discover_local_address(
fn get_interface_addresses(
&self,
protocol_address_type: ProtocolAddressType,
) -> Result<SocketAddr, String> {
) -> Vec<SocketAddr> {
let routing_table = self.routing_table();
match routing_table
.get_own_peer_info(PeerScope::Public)
routing_table
.get_own_peer_info(PeerScope::Local)
.dial_infos
.iter()
.find_map(|di| {
.filter_map(|di| {
if di.protocol_address_type() == protocol_address_type {
if let Ok(addr) = di.to_socket_addr() {
return Some(addr);
}
}
None
}) {
None => Err(format!(
"no local address for protocol address type: {:?}",
protocol_address_type
)),
Some(addr) => Ok(addr),
}
})
.collect()
}
async fn validate_dial_info(
@ -96,9 +91,9 @@ impl Network {
}
}
async fn try_port_mapping(
async fn try_port_mapping<I: AsRef<[SocketAddr]>>(
&self,
_local_addr: SocketAddr,
_intf_addrs: I,
_protocol_address_type: ProtocolAddressType,
) -> Option<SocketAddr> {
//xxx
@ -114,8 +109,8 @@ impl Network {
c.network.restricted_nat_retries
};
// Get our local address
let local1 = self.discover_local_address(ProtocolAddressType::UDPv4)?;
// Get our interface addresses
let intf_addrs = self.get_interface_addresses(ProtocolAddressType::UDPv4);
// Loop for restricted NAT retries
loop {
@ -125,8 +120,8 @@ impl Network {
.await?;
let external1_dial_info = DialInfo::udp_from_socketaddr(external1);
// If local1 == external1 then there is no NAT in place
if local1 == external1 {
// If our local interface list contains external1 then there is no NAT in place
if intf_addrs.contains(&external1) {
// No NAT
// Do a validate_dial_info on the external address from a routed node
if self
@ -134,7 +129,7 @@ impl Network {
.await
{
// Add public dial info with Server network class
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
external1_dial_info,
Some(NetworkClass::Server),
DialInfoOrigin::Discovered,
@ -150,12 +145,12 @@ impl Network {
// There is -some NAT-
// Attempt a UDP port mapping via all available and enabled mechanisms
if let Some(external_mapped) = self
.try_port_mapping(local1, ProtocolAddressType::UDPv4)
.try_port_mapping(&intf_addrs, ProtocolAddressType::UDPv4)
.await
{
// Got a port mapping, let's use it
let external_mapped_dial_info = DialInfo::udp_from_socketaddr(external_mapped);
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
external_mapped_dial_info,
Some(NetworkClass::Mapped),
DialInfoOrigin::Mapped,
@ -178,7 +173,7 @@ impl Network {
{
// Yes, another machine can use the dial info directly, so Full Cone
// Add public dial info with full cone NAT network class
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
external1_dial_info,
Some(NetworkClass::FullNAT),
DialInfoOrigin::Discovered,
@ -220,14 +215,14 @@ impl Network {
.await
{
// Got a reply from a non-default port, which means we're only address restricted
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
external1_dial_info,
Some(NetworkClass::AddressRestrictedNAT),
DialInfoOrigin::Discovered,
);
} else {
// Didn't get a reply from a non-default port, which means we are also port restricted
routing_table.register_public_dial_info(
routing_table.register_global_dial_info(
external1_dial_info,
Some(NetworkClass::PortRestrictedNAT),
DialInfoOrigin::Discovered,

View File

@ -158,7 +158,7 @@ impl Network {
// Drop all dial info
routing_table.clear_local_dial_info();
routing_table.clear_public_dial_info();
routing_table.clear_global_dial_info();
// Cancels all async background tasks by dropping join handles
*self.inner.lock() = Self::new_inner(network_manager);

View File

@ -135,7 +135,7 @@ impl LeaseManager {
// xxx: depends on who is asking?
// signaling requires inbound ability, so check to see if we have public dial info
let routing_table = inner.network_manager.routing_table();
if !routing_table.has_public_dial_info() {
if !routing_table.has_global_dial_info() {
return false;
}
@ -178,7 +178,7 @@ impl LeaseManager {
// xxx: depends on who is asking?
// relaying requires inbound ability, so check to see if we have public dial info
let routing_table = inner.network_manager.routing_table();
if !routing_table.has_public_dial_info() {
if !routing_table.has_global_dial_info() {
return false;
}
true

View File

@ -105,7 +105,7 @@ impl BucketEntry {
.collect()
}
pub fn public_dial_info(&self) -> Vec<DialInfo> {
pub fn global_dial_info(&self) -> Vec<DialInfo> {
self.dial_info_entries
.iter()
.filter_map(|e| {
@ -118,7 +118,7 @@ impl BucketEntry {
.collect()
}
pub fn public_dial_info_for_protocol(&self, protocol_type: ProtocolType) -> Vec<DialInfo> {
pub fn global_dial_info_for_protocol(&self, protocol_type: ProtocolType) -> Vec<DialInfo> {
self.dial_info_entries
.iter()
.filter_map(|e| {
@ -133,7 +133,7 @@ impl BucketEntry {
.collect()
}
pub fn private_dial_info(&self) -> Vec<DialInfo> {
pub fn local_dial_info(&self) -> Vec<DialInfo> {
self.dial_info_entries
.iter()
.filter_map(|e| {
@ -146,7 +146,7 @@ impl BucketEntry {
.collect()
}
pub fn private_dial_info_for_protocol(&mut self, protocol_type: ProtocolType) -> Vec<DialInfo> {
pub fn local_dial_info_for_protocol(&mut self, protocol_type: ProtocolType) -> Vec<DialInfo> {
self.dial_info_entries
.iter_mut()
.filter_map(|e| {
@ -166,8 +166,8 @@ impl BucketEntry {
node_id: NodeId::new(key),
dial_infos: match scope {
PeerScope::All => self.dial_info(),
PeerScope::Public => self.public_dial_info(),
PeerScope::Private => self.private_dial_info(),
PeerScope::Global => self.global_dial_info(),
PeerScope::Local => self.local_dial_info(),
},
}
}

View File

@ -37,8 +37,8 @@ impl DialInfoEntry {
pub fn matches_peer_scope(&self, scope: PeerScope) -> bool {
match scope {
PeerScope::All => true,
PeerScope::Public => self.is_public(),
PeerScope::Private => self.is_private(),
PeerScope::Global => self.is_public(),
PeerScope::Local => self.is_private(),
}
}

View File

@ -30,7 +30,7 @@ impl RoutingTable {
.dial_info_entries_as_ref()
.iter()
.find_map(|die| {
if die.matches_peer_scope(PeerScope::Public)
if die.matches_peer_scope(PeerScope::Global)
&& die.dial_info().protocol_address_type()
== protocol_address_type
{
@ -63,13 +63,13 @@ impl RoutingTable {
pub fn get_own_peer_info(&self, scope: PeerScope) -> PeerInfo {
let dial_infos = match scope {
PeerScope::All => {
let mut divec = self.public_dial_info();
let mut divec = self.global_dial_info();
divec.append(&mut self.local_dial_info());
divec.dedup();
divec
}
PeerScope::Public => self.public_dial_info(),
PeerScope::Private => self.local_dial_info(),
PeerScope::Global => self.global_dial_info(),
PeerScope::Local => self.local_dial_info(),
};
PeerInfo {

View File

@ -44,7 +44,7 @@ struct RoutingTableInner {
node_id_secret: DHTKeySecret,
buckets: Vec<Bucket>,
local_dial_info: Vec<DialInfoDetail>,
public_dial_info: Vec<DialInfoDetail>,
global_dial_info: Vec<DialInfoDetail>,
bucket_entry_count: usize,
// Waiters
eventual_changed_dial_info: Eventual,
@ -77,7 +77,7 @@ impl RoutingTable {
node_id_secret: DHTKeySecret::default(),
buckets: Vec::new(),
local_dial_info: Vec::new(),
public_dial_info: Vec::new(),
global_dial_info: Vec::new(),
bucket_entry_count: 0,
eventual_changed_dial_info: Eventual::new(),
stats_accounting: StatsAccounting::new(),
@ -219,23 +219,23 @@ impl RoutingTable {
self.inner.lock().local_dial_info.clear();
}
pub fn has_public_dial_info(&self) -> bool {
pub fn has_global_dial_info(&self) -> bool {
let inner = self.inner.lock();
!inner.public_dial_info.is_empty()
!inner.global_dial_info.is_empty()
}
pub fn public_dial_info(&self) -> Vec<DialInfoDetail> {
pub fn global_dial_info(&self) -> Vec<DialInfoDetail> {
let inner = self.inner.lock();
inner.public_dial_info.clone()
inner.global_dial_info.clone()
}
pub fn public_dial_info_for_protocol(
pub fn global_dial_info_for_protocol(
&self,
protocol_type: ProtocolType,
) -> Vec<DialInfoDetail> {
let inner = self.inner.lock();
inner
.public_dial_info
.global_dial_info
.iter()
.filter_map(|di| {
if di.dial_info.protocol_type() != protocol_type {
@ -246,13 +246,13 @@ impl RoutingTable {
})
.collect()
}
pub fn public_dial_info_for_protocol_address_type(
pub fn global_dial_info_for_protocol_address_type(
&self,
protocol_address_type: ProtocolAddressType,
) -> Vec<DialInfoDetail> {
let inner = self.inner.lock();
inner
.public_dial_info
.global_dial_info
.iter()
.filter_map(|di| {
if di.dial_info.protocol_address_type() != protocol_address_type {
@ -264,7 +264,7 @@ impl RoutingTable {
.collect()
}
pub fn register_public_dial_info(
pub fn register_global_dial_info(
&self,
dial_info: DialInfo,
network_class: Option<NetworkClass>,
@ -273,7 +273,7 @@ impl RoutingTable {
let ts = get_timestamp();
let mut inner = self.inner.lock();
inner.public_dial_info.push(DialInfoDetail {
inner.global_dial_info.push(DialInfoDetail {
dial_info: dial_info.clone(),
origin,
network_class,
@ -292,8 +292,8 @@ impl RoutingTable {
);
}
pub fn clear_public_dial_info(&self) {
self.inner.lock().public_dial_info.clear();
pub fn clear_global_dial_info(&self) {
self.inner.lock().global_dial_info.clear();
}
pub async fn wait_changed_dial_info(&self) {

View File

@ -1194,7 +1194,7 @@ impl RPCProcessor {
// find N nodes closest to the target node in our routing table
let peer_scope = if address_filter {
PeerScope::Public
PeerScope::Global
} else {
PeerScope::All
};
@ -1671,7 +1671,7 @@ impl RPCProcessor {
let mut peer_info_builder = fnq.reborrow().init_peer_info();
let own_peer_info = self.routing_table().get_own_peer_info(if address_filter {
PeerScope::Public
PeerScope::Global
} else {
PeerScope::All
});

View File

@ -470,8 +470,8 @@ impl Default for DialInfo {
#[derive(Clone, Copy, Debug)]
pub enum PeerScope {
All,
Public,
Private,
Global,
Local,
}
#[derive(Clone, Debug, Default)]