refactor checkpoint
This commit is contained in:
@@ -38,6 +38,7 @@ use xx::*;
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
pub const RELAY_MANAGEMENT_INTERVAL_SECS: u32 = 1;
|
||||
pub const PRIVATE_ROUTE_MANAGEMENT_INTERVAL_SECS: u32 = 1;
|
||||
pub const MAX_MESSAGE_SIZE: usize = MAX_ENVELOPE_SIZE;
|
||||
pub const IPADDR_TABLE_SIZE: usize = 1024;
|
||||
pub const IPADDR_MAX_INACTIVE_DURATION_US: u64 = 300_000_000u64; // 5 minutes
|
||||
@@ -148,11 +149,6 @@ struct NetworkManagerInner {
|
||||
BTreeMap<PublicAddressCheckCacheKey, LruCache<IpAddr, SocketAddress>>,
|
||||
public_address_inconsistencies_table:
|
||||
BTreeMap<PublicAddressCheckCacheKey, HashMap<IpAddr, u64>>,
|
||||
protocol_config: Option<ProtocolConfig>,
|
||||
public_inbound_dial_info_filter: Option<DialInfoFilter>,
|
||||
local_inbound_dial_info_filter: Option<DialInfoFilter>,
|
||||
public_outbound_dial_info_filter: Option<DialInfoFilter>,
|
||||
local_outbound_dial_info_filter: Option<DialInfoFilter>,
|
||||
}
|
||||
|
||||
struct NetworkManagerUnlockedInner {
|
||||
@@ -163,6 +159,7 @@ struct NetworkManagerUnlockedInner {
|
||||
// Background processes
|
||||
rolling_transfers_task: TickTask<EyreReport>,
|
||||
relay_management_task: TickTask<EyreReport>,
|
||||
private_route_management_task: TickTask<EyreReport>,
|
||||
bootstrap_task: TickTask<EyreReport>,
|
||||
peer_minimum_refresh_task: TickTask<EyreReport>,
|
||||
ping_validator_task: TickTask<EyreReport>,
|
||||
@@ -186,11 +183,6 @@ impl NetworkManager {
|
||||
client_whitelist: LruCache::new_unbounded(),
|
||||
public_address_check_cache: BTreeMap::new(),
|
||||
public_address_inconsistencies_table: BTreeMap::new(),
|
||||
protocol_config: None,
|
||||
public_inbound_dial_info_filter: None,
|
||||
local_inbound_dial_info_filter: None,
|
||||
public_outbound_dial_info_filter: None,
|
||||
local_outbound_dial_info_filter: None,
|
||||
}
|
||||
}
|
||||
fn new_unlocked_inner(config: VeilidConfig) -> NetworkManagerUnlockedInner {
|
||||
@@ -201,6 +193,7 @@ impl NetworkManager {
|
||||
update_callback: RwLock::new(None),
|
||||
rolling_transfers_task: TickTask::new(ROLLING_TRANSFERS_INTERVAL_SECS),
|
||||
relay_management_task: TickTask::new(RELAY_MANAGEMENT_INTERVAL_SECS),
|
||||
private_route_management_task: TickTask::new(PRIVATE_ROUTE_MANAGEMENT_INTERVAL_SECS),
|
||||
bootstrap_task: TickTask::new(1),
|
||||
peer_minimum_refresh_task: TickTask::new_ms(c.network.dht.min_peer_refresh_time_ms),
|
||||
ping_validator_task: TickTask::new(1),
|
||||
@@ -248,6 +241,23 @@ impl NetworkManager {
|
||||
)
|
||||
});
|
||||
}
|
||||
// Set private route management tick task
|
||||
{
|
||||
let this2 = this.clone();
|
||||
this.unlocked_inner
|
||||
.private_route_management_task
|
||||
.set_routine(move |s, l, t| {
|
||||
Box::pin(
|
||||
this2
|
||||
.clone()
|
||||
.private_route_management_task_routine(s, l, t)
|
||||
.instrument(trace_span!(
|
||||
parent: None,
|
||||
"private route management task routine"
|
||||
)),
|
||||
)
|
||||
});
|
||||
}
|
||||
// Set bootstrap tick task
|
||||
{
|
||||
let this2 = this.clone();
|
||||
@@ -434,41 +444,6 @@ impl NetworkManager {
|
||||
return Err(e);
|
||||
}
|
||||
|
||||
// Store copy of protocol config and dial info filters
|
||||
{
|
||||
let pc = self.net().get_protocol_config().unwrap();
|
||||
|
||||
let mut inner = self.inner.lock();
|
||||
|
||||
inner.public_inbound_dial_info_filter = Some(
|
||||
DialInfoFilter::all()
|
||||
.with_protocol_type_set(pc.inbound)
|
||||
.with_address_type_set(pc.family_global),
|
||||
);
|
||||
inner.local_inbound_dial_info_filter = Some(
|
||||
DialInfoFilter::all()
|
||||
.with_protocol_type_set(pc.inbound)
|
||||
.with_address_type_set(pc.family_local),
|
||||
);
|
||||
inner.public_outbound_dial_info_filter = Some(
|
||||
DialInfoFilter::all()
|
||||
.with_protocol_type_set(pc.outbound)
|
||||
.with_address_type_set(pc.family_global),
|
||||
);
|
||||
inner.local_outbound_dial_info_filter = Some(
|
||||
DialInfoFilter::all()
|
||||
.with_protocol_type_set(pc.outbound)
|
||||
.with_address_type_set(pc.family_local),
|
||||
);
|
||||
|
||||
inner.protocol_config = Some(pc);
|
||||
}
|
||||
|
||||
// Inform routing table entries that our dial info has changed
|
||||
for rd in RoutingDomain::all() {
|
||||
self.send_node_info_updates(rd, true).await;
|
||||
}
|
||||
|
||||
// Inform api clients that things have changed
|
||||
self.send_network_update();
|
||||
|
||||
@@ -527,12 +502,7 @@ impl NetworkManager {
|
||||
// reset the state
|
||||
debug!("resetting network manager state");
|
||||
{
|
||||
let mut inner = self.inner.lock();
|
||||
inner.public_inbound_dial_info_filter = None;
|
||||
inner.local_inbound_dial_info_filter = None;
|
||||
inner.public_outbound_dial_info_filter = None;
|
||||
inner.local_outbound_dial_info_filter = None;
|
||||
inner.protocol_config = None;
|
||||
*self.inner.lock() = NetworkManager::new_inner();
|
||||
}
|
||||
|
||||
// send update
|
||||
@@ -640,15 +610,6 @@ impl NetworkManager {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Return what network class we are in
|
||||
pub fn get_network_class(&self, routing_domain: RoutingDomain) -> Option<NetworkClass> {
|
||||
if let Some(components) = self.unlocked_inner.components.read().as_ref() {
|
||||
components.net.get_network_class(routing_domain)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
// Get our node's capabilities
|
||||
fn generate_public_internet_node_status(&self) -> PublicInternetNodeStatus {
|
||||
let node_info = self
|
||||
@@ -694,58 +655,6 @@ impl NetworkManager {
|
||||
}
|
||||
}
|
||||
|
||||
// Return what protocols we have enabled
|
||||
pub fn get_protocol_config(&self) -> ProtocolConfig {
|
||||
let inner = self.inner.lock();
|
||||
inner.protocol_config.as_ref().unwrap().clone()
|
||||
}
|
||||
|
||||
// Return a dial info filter for what we can receive
|
||||
pub fn get_inbound_dial_info_filter(&self, routing_domain: RoutingDomain) -> DialInfoFilter {
|
||||
let inner = self.inner.lock();
|
||||
match routing_domain {
|
||||
RoutingDomain::PublicInternet => inner
|
||||
.public_inbound_dial_info_filter
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.clone(),
|
||||
RoutingDomain::LocalNetwork => inner
|
||||
.local_inbound_dial_info_filter
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.clone(),
|
||||
}
|
||||
}
|
||||
pub fn get_inbound_node_ref_filter(&self, routing_domain: RoutingDomain) -> NodeRefFilter {
|
||||
let dif = self.get_inbound_dial_info_filter(routing_domain);
|
||||
NodeRefFilter::new()
|
||||
.with_routing_domain(routing_domain)
|
||||
.with_dial_info_filter(dif)
|
||||
}
|
||||
|
||||
// Return a dial info filter for what we can send out
|
||||
pub fn get_outbound_dial_info_filter(&self, routing_domain: RoutingDomain) -> DialInfoFilter {
|
||||
let inner = self.inner.lock();
|
||||
match routing_domain {
|
||||
RoutingDomain::PublicInternet => inner
|
||||
.public_outbound_dial_info_filter
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.clone(),
|
||||
RoutingDomain::LocalNetwork => inner
|
||||
.local_outbound_dial_info_filter
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.clone(),
|
||||
}
|
||||
}
|
||||
pub fn get_outbound_node_ref_filter(&self, routing_domain: RoutingDomain) -> NodeRefFilter {
|
||||
let dif = self.get_outbound_dial_info_filter(routing_domain);
|
||||
NodeRefFilter::new()
|
||||
.with_routing_domain(routing_domain)
|
||||
.with_dial_info_filter(dif)
|
||||
}
|
||||
|
||||
// Generates a multi-shot/normal receipt
|
||||
#[instrument(level = "trace", skip(self, extra_data, callback), err)]
|
||||
pub fn generate_receipt<D: AsRef<[u8]>>(
|
||||
@@ -890,7 +799,7 @@ impl NetworkManager {
|
||||
};
|
||||
|
||||
// Get the udp direct dialinfo for the hole punch
|
||||
let outbound_nrf = self
|
||||
let outbound_nrf = routing_table
|
||||
.get_outbound_node_ref_filter(RoutingDomain::PublicInternet)
|
||||
.with_protocol_type(ProtocolType::UDP);
|
||||
peer_nr.set_filter(Some(outbound_nrf));
|
||||
@@ -1027,7 +936,10 @@ impl NetworkManager {
|
||||
#[instrument(level = "trace", skip(self), ret)]
|
||||
fn get_contact_method_public(&self, target_node_ref: NodeRef) -> ContactMethod {
|
||||
// Scope noderef down to protocols we can do outbound
|
||||
let public_outbound_nrf = self.get_outbound_node_ref_filter(RoutingDomain::PublicInternet);
|
||||
let routing_table = self.routing_table();
|
||||
|
||||
let public_outbound_nrf =
|
||||
routing_table.get_outbound_node_ref_filter(RoutingDomain::PublicInternet);
|
||||
let target_node_ref = target_node_ref.filtered_clone(public_outbound_nrf.clone());
|
||||
|
||||
// Get the best match internet dial info if we have it
|
||||
@@ -1047,16 +959,14 @@ impl NetworkManager {
|
||||
// Can we reach the inbound relay?
|
||||
if inbound_relay_nr.first_filtered_dial_info_detail().is_some() {
|
||||
// Can we receive anything inbound ever?
|
||||
let our_network_class = self
|
||||
let our_network_class = routing_table
|
||||
.get_network_class(RoutingDomain::PublicInternet)
|
||||
.unwrap_or(NetworkClass::Invalid);
|
||||
if matches!(our_network_class, NetworkClass::InboundCapable) {
|
||||
let routing_table = self.routing_table();
|
||||
|
||||
///////// Reverse connection
|
||||
|
||||
// Get the best match dial info for an reverse inbound connection
|
||||
let reverse_dif = self
|
||||
let reverse_dif = routing_table
|
||||
.get_inbound_dial_info_filter(RoutingDomain::PublicInternet)
|
||||
.filtered(
|
||||
&target_node_ref
|
||||
@@ -1090,7 +1000,7 @@ impl NetworkManager {
|
||||
udp_target_nr.first_filtered_dial_info_detail()
|
||||
{
|
||||
// Does the self node have a direct udp dialinfo the target can reach?
|
||||
let inbound_udp_dif = self
|
||||
let inbound_udp_dif = routing_table
|
||||
.get_inbound_dial_info_filter(RoutingDomain::PublicInternet)
|
||||
.filtered(
|
||||
&target_node_ref
|
||||
@@ -1151,7 +1061,10 @@ impl NetworkManager {
|
||||
#[instrument(level = "trace", skip(self), ret)]
|
||||
fn get_contact_method_local(&self, target_node_ref: NodeRef) -> ContactMethod {
|
||||
// Scope noderef down to protocols we can do outbound
|
||||
let local_outbound_nrf = self.get_outbound_node_ref_filter(RoutingDomain::LocalNetwork);
|
||||
let routing_table = self.routing_table();
|
||||
|
||||
let local_outbound_nrf =
|
||||
routing_table.get_outbound_node_ref_filter(RoutingDomain::LocalNetwork);
|
||||
let target_node_ref = target_node_ref.filtered_clone(local_outbound_nrf);
|
||||
|
||||
// Get the best matching local direct dial info if we have it
|
||||
@@ -1865,7 +1778,7 @@ impl NetworkManager {
|
||||
let mut bad_public_address_detection_punishment: Option<
|
||||
Box<dyn FnOnce() + Send + 'static>,
|
||||
> = None;
|
||||
let public_internet_network_class = net
|
||||
let public_internet_network_class = routing_table
|
||||
.get_network_class(RoutingDomain::PublicInternet)
|
||||
.unwrap_or(NetworkClass::Invalid);
|
||||
let needs_public_address_detection =
|
||||
|
||||
@@ -40,11 +40,9 @@ struct NetworkInner {
|
||||
/// such as dhcp release or change of address or interfaces being added or removed
|
||||
network_needs_restart: bool,
|
||||
/// the calculated protocol configuration for inbound/outbound protocols
|
||||
protocol_config: Option<ProtocolConfig>,
|
||||
protocol_config: ProtocolConfig,
|
||||
/// set of statically configured protocols with public dialinfo
|
||||
static_public_dialinfo: ProtocolTypeSet,
|
||||
/// network class per routing domain
|
||||
network_class: [Option<NetworkClass>; RoutingDomain::count()],
|
||||
/// join handles for all the low level network background tasks
|
||||
join_handles: Vec<MustJoinHandle<()>>,
|
||||
/// stop source for shutting down the low level network background tasks
|
||||
@@ -120,9 +118,8 @@ impl Network {
|
||||
needs_public_dial_info_check: false,
|
||||
doing_public_dial_info_check: false,
|
||||
public_dial_info_check_punishment: None,
|
||||
protocol_config: None,
|
||||
protocol_config: Default::default(),
|
||||
static_public_dialinfo: ProtocolTypeSet::empty(),
|
||||
network_class: [None, None],
|
||||
join_handles: Vec::new(),
|
||||
stop_source: None,
|
||||
udp_port: 0u16,
|
||||
@@ -620,7 +617,7 @@ impl Network {
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
pub fn get_protocol_config(&self) -> Option<ProtocolConfig> {
|
||||
pub fn get_protocol_config(&self) -> ProtocolConfig {
|
||||
self.inner.lock().protocol_config
|
||||
}
|
||||
|
||||
@@ -734,7 +731,8 @@ impl Network {
|
||||
family_local,
|
||||
}
|
||||
};
|
||||
inner.protocol_config = Some(protocol_config);
|
||||
inner.protocol_config = protocol_config;
|
||||
|
||||
protocol_config
|
||||
};
|
||||
|
||||
@@ -771,27 +769,37 @@ impl Network {
|
||||
// that we have ports available to us
|
||||
self.free_bound_first_ports();
|
||||
|
||||
// If we have static public dialinfo, upgrade our network class
|
||||
// set up the routing table's network config
|
||||
// if we have static public dialinfo, upgrade our network class
|
||||
|
||||
editor_public_internet.setup_network(
|
||||
protocol_config.inbound,
|
||||
protocol_config.outbound,
|
||||
protocol_config.family_global,
|
||||
);
|
||||
editor_local_network.setup_network(
|
||||
protocol_config.inbound,
|
||||
protocol_config.outbound,
|
||||
protocol_config.family_local,
|
||||
);
|
||||
let detect_address_changes = {
|
||||
let c = self.config.get();
|
||||
c.network.detect_address_changes
|
||||
};
|
||||
|
||||
if !detect_address_changes {
|
||||
let mut inner = self.inner.lock();
|
||||
let inner = self.inner.lock();
|
||||
if !inner.static_public_dialinfo.is_empty() {
|
||||
inner.network_class[RoutingDomain::PublicInternet as usize] =
|
||||
Some(NetworkClass::InboundCapable);
|
||||
editor_public_internet.set_network_class(Some(NetworkClass::InboundCapable));
|
||||
}
|
||||
}
|
||||
|
||||
info!("network started");
|
||||
self.inner.lock().network_started = true;
|
||||
|
||||
// commit routing table edits
|
||||
editor_public_internet.commit().await;
|
||||
editor_local_network.commit().await;
|
||||
|
||||
info!("network started");
|
||||
self.inner.lock().network_started = true;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -873,11 +881,6 @@ impl Network {
|
||||
inner.doing_public_dial_info_check
|
||||
}
|
||||
|
||||
pub fn get_network_class(&self, routing_domain: RoutingDomain) -> Option<NetworkClass> {
|
||||
let inner = self.inner.lock();
|
||||
inner.network_class[routing_domain as usize]
|
||||
}
|
||||
|
||||
//////////////////////////////////////////
|
||||
|
||||
#[instrument(level = "trace", skip(self), err)]
|
||||
@@ -939,6 +942,7 @@ impl Network {
|
||||
// If we need to figure out our network class, tick the task for it
|
||||
if detect_address_changes {
|
||||
let public_internet_network_class = self
|
||||
.routing_table()
|
||||
.get_network_class(RoutingDomain::PublicInternet)
|
||||
.unwrap_or(NetworkClass::Invalid);
|
||||
let needs_public_dial_info_check = self.needs_public_dial_info_check();
|
||||
|
||||
@@ -125,7 +125,7 @@ impl DiscoveryContext {
|
||||
RoutingDomain::PublicInternet,
|
||||
dial_info_filter.clone(),
|
||||
);
|
||||
let disallow_relays_filter = move |e: &BucketEntryInner| {
|
||||
let disallow_relays_filter = move |_rti, e: &BucketEntryInner| {
|
||||
if let Some(n) = e.node_info(RoutingDomain::PublicInternet) {
|
||||
n.relay_peer_info.is_none()
|
||||
} else {
|
||||
@@ -610,12 +610,14 @@ impl Network {
|
||||
_l: u64,
|
||||
_t: u64,
|
||||
) -> EyreResult<()> {
|
||||
let routing_table = self.routing_table();
|
||||
|
||||
// Figure out if we can optimize TCP/WS checking since they are often on the same port
|
||||
let (protocol_config, existing_network_class, tcp_same_port) = {
|
||||
let inner = self.inner.lock();
|
||||
let protocol_config = inner.protocol_config.unwrap_or_default();
|
||||
let protocol_config = inner.protocol_config;
|
||||
let existing_network_class =
|
||||
inner.network_class[RoutingDomain::PublicInternet as usize];
|
||||
routing_table.get_network_class(RoutingDomain::PublicInternet);
|
||||
let tcp_same_port = if protocol_config.inbound.contains(ProtocolType::TCP)
|
||||
&& protocol_config.inbound.contains(ProtocolType::WS)
|
||||
{
|
||||
@@ -625,7 +627,6 @@ impl Network {
|
||||
};
|
||||
(protocol_config, existing_network_class, tcp_same_port)
|
||||
};
|
||||
let routing_table = self.routing_table();
|
||||
|
||||
// Process all protocol and address combinations
|
||||
let mut futures = FuturesUnordered::new();
|
||||
@@ -849,17 +850,16 @@ impl Network {
|
||||
|
||||
// Is the network class different?
|
||||
if existing_network_class != new_network_class {
|
||||
self.inner.lock().network_class[RoutingDomain::PublicInternet as usize] =
|
||||
new_network_class;
|
||||
editor.set_network_class(new_network_class);
|
||||
changed = true;
|
||||
log_net!(debug "PublicInternet network class changed to {:?}", new_network_class);
|
||||
}
|
||||
} else if existing_network_class.is_some() {
|
||||
// Network class could not be determined
|
||||
editor.clear_dial_info_details();
|
||||
self.inner.lock().network_class[RoutingDomain::PublicInternet as usize] = None;
|
||||
editor.set_network_class(None);
|
||||
changed = true;
|
||||
log_net!(debug "network class cleared");
|
||||
log_net!(debug "PublicInternet network class cleared");
|
||||
}
|
||||
|
||||
// Punish nodes that told us our public address had changed when it didn't
|
||||
|
||||
@@ -495,8 +495,8 @@ impl NetworkManager {
|
||||
// even the unreliable ones, and ask them to find nodes close to our node too
|
||||
let noderefs = routing_table.find_fastest_nodes(
|
||||
min_peer_count,
|
||||
|_k, _v| true,
|
||||
|k: DHTKey, v: Option<Arc<BucketEntry>>| {
|
||||
|_rti, _k, _v| true,
|
||||
|_rti, k: DHTKey, v: Option<Arc<BucketEntry>>| {
|
||||
NodeRef::new(routing_table.clone(), k, v.unwrap().clone(), None)
|
||||
},
|
||||
);
|
||||
@@ -525,7 +525,7 @@ impl NetworkManager {
|
||||
// Get our node's current node info and network class and do the right thing
|
||||
let routing_table = self.routing_table();
|
||||
let node_info = routing_table.get_own_node_info(RoutingDomain::PublicInternet);
|
||||
let network_class = self.get_network_class(RoutingDomain::PublicInternet);
|
||||
let network_class = routing_table.get_network_class(RoutingDomain::PublicInternet);
|
||||
|
||||
// Get routing domain editor
|
||||
let mut editor = routing_table.edit_routing_domain(RoutingDomain::PublicInternet);
|
||||
@@ -594,6 +594,34 @@ impl NetworkManager {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Keep private routes assigned and accessible
|
||||
#[instrument(level = "trace", skip(self), err)]
|
||||
pub(super) async fn private_route_management_task_routine(
|
||||
self,
|
||||
_stop_token: StopToken,
|
||||
_last_ts: u64,
|
||||
cur_ts: u64,
|
||||
) -> EyreResult<()> {
|
||||
// Get our node's current node info and network class and do the right thing
|
||||
let routing_table = self.routing_table();
|
||||
let node_info = routing_table.get_own_node_info(RoutingDomain::PublicInternet);
|
||||
let network_class = routing_table.get_network_class(RoutingDomain::PublicInternet);
|
||||
|
||||
// Get routing domain editor
|
||||
let mut editor = routing_table.edit_routing_domain(RoutingDomain::PublicInternet);
|
||||
|
||||
// Do we know our network class yet?
|
||||
if let Some(network_class) = network_class {
|
||||
|
||||
// see if we have any routes that need extending
|
||||
}
|
||||
|
||||
// Commit the changes
|
||||
editor.commit().await;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Compute transfer statistics for the low level network
|
||||
#[instrument(level = "trace", skip(self), err)]
|
||||
pub(super) async fn rolling_transfers_task_routine(
|
||||
|
||||
@@ -12,7 +12,7 @@ use std::io;
|
||||
struct NetworkInner {
|
||||
network_started: bool,
|
||||
network_needs_restart: bool,
|
||||
protocol_config: Option<ProtocolConfig>,
|
||||
protocol_config: ProtocolConfig,
|
||||
}
|
||||
|
||||
struct NetworkUnlockedInner {
|
||||
@@ -34,7 +34,7 @@ impl Network {
|
||||
NetworkInner {
|
||||
network_started: false,
|
||||
network_needs_restart: false,
|
||||
protocol_config: None, //join_handle: None,
|
||||
protocol_config: Default::default(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,7 +247,7 @@ impl Network {
|
||||
|
||||
pub async fn startup(&self) -> EyreResult<()> {
|
||||
// get protocol config
|
||||
self.inner.lock().protocol_config = Some({
|
||||
self.inner.lock().protocol_config = {
|
||||
let c = self.config.get();
|
||||
let inbound = ProtocolTypeSet::new();
|
||||
let mut outbound = ProtocolTypeSet::new();
|
||||
@@ -269,7 +269,7 @@ impl Network {
|
||||
family_global,
|
||||
family_local,
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
self.inner.lock().network_started = true;
|
||||
Ok(())
|
||||
@@ -337,7 +337,7 @@ impl Network {
|
||||
};
|
||||
}
|
||||
|
||||
pub fn get_protocol_config(&self) -> Option<ProtocolConfig> {
|
||||
pub fn get_protocol_config(&self) -> ProtocolConfig {
|
||||
self.inner.lock().protocol_config.clone()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user