impl Node {
async fn queue_packet_mover2_unrouted_endpoint_batch(
&mut self,
remote: PeerIdentity,
payloads: Vec<Vec<u8>>,
enqueued_at_ms: u64,
) {
let dest_addr = *remote.node_addr();
let dest_pubkey = remote.pubkey_full();
self.register_identity(dest_addr, dest_pubkey);
let _ = self
.queue_packet_mover2_unrouted_endpoint_payloads(
dest_addr,
dest_pubkey,
payloads,
enqueued_at_ms,
)
.await;
}
async fn queue_packet_mover2_unrouted_endpoint_payloads(
&mut self,
dest_addr: NodeAddr,
dest_pubkey: secp256k1::PublicKey,
payloads: Vec<Vec<u8>>,
enqueued_at_ms: u64,
) -> Result<(), NodeError> {
if payloads.is_empty() {
return Ok(());
}
match self.packet_mover2_outbound_session_state(&dest_addr) {
OutboundSessionState::Established => {
let route_available = self.find_next_hop(&dest_addr).is_some();
self.queue_pending_endpoint_data_batch_with_enqueued_at_ms(
dest_addr,
payloads,
enqueued_at_ms,
);
if !route_available {
self.maybe_initiate_path_recovery_lookup(&dest_addr).await;
}
Ok(())
}
OutboundSessionState::Pending => {
self.queue_pending_endpoint_data_batch_with_enqueued_at_ms(
dest_addr,
payloads,
enqueued_at_ms,
);
let should_discover = self.config.node.routing.mode
== crate::config::RoutingMode::ReplyLearned
|| self.find_next_hop(&dest_addr).is_none();
if should_discover {
self.maybe_initiate_lookup(&dest_addr).await;
}
Ok(())
}
OutboundSessionState::Missing => {
if self.find_next_hop(&dest_addr).is_none() {
self.queue_pending_endpoint_data_batch_with_enqueued_at_ms(
dest_addr,
payloads,
enqueued_at_ms,
);
self.maybe_initiate_lookup(&dest_addr).await;
return Ok(());
}
match self.initiate_session(dest_addr, dest_pubkey).await {
Ok(()) => {}
Err(NodeError::SendFailed { node_addr, reason })
if node_addr == dest_addr && reason == "no route to destination" =>
{
self.queue_pending_endpoint_data_batch_with_enqueued_at_ms(
dest_addr,
payloads,
enqueued_at_ms,
);
self.maybe_initiate_lookup(&dest_addr).await;
return Ok(());
}
Err(error) => return Err(error),
}
self.queue_pending_endpoint_data_batch_with_enqueued_at_ms(
dest_addr,
payloads,
enqueued_at_ms,
);
Ok(())
}
}
}
}