mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 16:24:45 +00:00
Discovery wire format cleanup
Drop origin_coords from LookupRequest — unused since reverse-path routing became primary. Saves 2+16*depth bytes per request. Wire up min_mtu: populated from TUN MTU config (default 1280) at origination. Transit nodes skip peers whose link MTU is below the request's min_mtu requirement. path_mtu on LookupResponse was already wired (transit min() applied). Add TLV extension to LookupRequest (after min_mtu) and LookupResponse (after proof). Uses same TlvEntry format as negotiation. Transit nodes forward TLV bytes verbatim.
This commit is contained in:
@@ -326,6 +326,7 @@ impl Node {
|
||||
}
|
||||
|
||||
// Collect full tree peers whose bloom filter contains the target
|
||||
let min_mtu = request.min_mtu;
|
||||
let forward_to: Vec<NodeAddr> = self
|
||||
.peers
|
||||
.iter()
|
||||
@@ -333,6 +334,7 @@ impl Node {
|
||||
peer.peer_profile() == crate::protocol::NodeProfile::Full
|
||||
&& self.is_tree_peer(addr)
|
||||
&& peer.may_reach(&request.target)
|
||||
&& self.peer_meets_mtu(peer, min_mtu)
|
||||
})
|
||||
.map(|(addr, _)| *addr)
|
||||
.collect();
|
||||
@@ -346,6 +348,7 @@ impl Node {
|
||||
peer.peer_profile() == crate::protocol::NodeProfile::Full
|
||||
&& !self.is_tree_peer(addr)
|
||||
&& peer.may_reach(&request.target)
|
||||
&& self.peer_meets_mtu(peer, min_mtu)
|
||||
})
|
||||
.map(|(addr, _)| *addr)
|
||||
.collect();
|
||||
@@ -404,8 +407,8 @@ impl Node {
|
||||
self.stats_mut().discovery.req_initiated += 1;
|
||||
|
||||
let origin = *self.node_addr();
|
||||
let origin_coords = self.tree_state().my_coords().clone();
|
||||
let request = LookupRequest::generate(*target, origin, origin_coords, ttl, 0);
|
||||
let min_mtu = self.config.tun.mtu();
|
||||
let request = LookupRequest::generate(*target, origin, ttl, min_mtu);
|
||||
|
||||
// Send only to full tree peers whose bloom filter contains the target
|
||||
let peer_addrs: Vec<NodeAddr> = self
|
||||
@@ -415,6 +418,7 @@ impl Node {
|
||||
peer.peer_profile() == crate::protocol::NodeProfile::Full
|
||||
&& self.is_tree_peer(addr)
|
||||
&& peer.may_reach(target)
|
||||
&& self.peer_meets_mtu(peer, request.min_mtu)
|
||||
})
|
||||
.map(|(addr, _)| *addr)
|
||||
.collect();
|
||||
@@ -593,6 +597,28 @@ impl Node {
|
||||
}
|
||||
}
|
||||
|
||||
/// Check if a peer's outgoing link MTU meets the min_mtu requirement.
|
||||
///
|
||||
/// Returns true if min_mtu is 0 (no requirement) or if the peer's
|
||||
/// transport link MTU is >= min_mtu.
|
||||
fn peer_meets_mtu(&self, peer: &crate::peer::ActivePeer, min_mtu: u16) -> bool {
|
||||
if min_mtu == 0 {
|
||||
return true;
|
||||
}
|
||||
if let Some(tid) = peer.transport_id()
|
||||
&& let Some(transport) = self.transports.get(&tid)
|
||||
{
|
||||
let link_mtu = peer
|
||||
.current_addr()
|
||||
.map(|addr| transport.link_mtu(addr))
|
||||
.unwrap_or_else(|| transport.mtu());
|
||||
link_mtu >= min_mtu
|
||||
} else {
|
||||
// No transport info available — don't prune
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
/// Remove expired entries from the recent_requests cache.
|
||||
fn purge_expired_requests(&mut self, current_time_ms: u64) {
|
||||
let expiry_ms = self.config.node.discovery.recent_expiry_secs * 1000;
|
||||
|
||||
@@ -32,9 +32,8 @@ async fn test_request_dedup() {
|
||||
let from = make_node_addr(0xAA);
|
||||
let target = make_node_addr(0xBB);
|
||||
let origin = make_node_addr(0xCC);
|
||||
let coords = TreeCoordinate::from_addrs(vec![origin, make_node_addr(0)]).unwrap();
|
||||
|
||||
let request = LookupRequest::new(999, target, origin, coords, 5, 0);
|
||||
let request = LookupRequest::new(999, target, origin, 5, 0);
|
||||
let payload = &request.encode()[1..]; // skip msg_type byte
|
||||
|
||||
// First request: accepted
|
||||
@@ -52,10 +51,9 @@ async fn test_request_target_is_self() {
|
||||
let from = make_node_addr(0xAA);
|
||||
let origin = make_node_addr(0xCC);
|
||||
let my_addr = *node.node_addr();
|
||||
let coords = TreeCoordinate::from_addrs(vec![origin, make_node_addr(0)]).unwrap();
|
||||
|
||||
// Request targeting us
|
||||
let request = LookupRequest::new(777, my_addr, origin, coords, 5, 0);
|
||||
let request = LookupRequest::new(777, my_addr, origin, 5, 0);
|
||||
let payload = &request.encode()[1..];
|
||||
|
||||
// Should succeed without panic (response send will fail silently
|
||||
@@ -70,9 +68,8 @@ async fn test_request_ttl_zero_not_forwarded() {
|
||||
let from = make_node_addr(0xAA);
|
||||
let target = make_node_addr(0xBB);
|
||||
let origin = make_node_addr(0xCC);
|
||||
let coords = TreeCoordinate::from_addrs(vec![origin, make_node_addr(0)]).unwrap();
|
||||
|
||||
let request = LookupRequest::new(666, target, origin, coords, 0, 0);
|
||||
let request = LookupRequest::new(666, target, origin, 0, 0);
|
||||
let payload = &request.encode()[1..];
|
||||
|
||||
node.handle_lookup_request(&from, payload).await;
|
||||
@@ -331,8 +328,7 @@ async fn test_recent_request_expiry() {
|
||||
// Trigger purge via a new lookup request
|
||||
let target = make_node_addr(0xBB);
|
||||
let origin = make_node_addr(0xCC);
|
||||
let coords = TreeCoordinate::from_addrs(vec![origin, make_node_addr(0)]).unwrap();
|
||||
let request = LookupRequest::new(789, target, origin, coords, 3, 0);
|
||||
let request = LookupRequest::new(789, target, origin, 3, 0);
|
||||
let payload = &request.encode()[1..];
|
||||
node.handle_lookup_request(&make_node_addr(0xAA), payload)
|
||||
.await;
|
||||
@@ -357,10 +353,8 @@ async fn test_request_forwarding_two_node() {
|
||||
|
||||
let node0_addr = *nodes[0].node.node_addr();
|
||||
let target = *nodes[1].node.node_addr(); // target node1 (in bloom filters)
|
||||
let root = make_node_addr(0);
|
||||
|
||||
let coords = TreeCoordinate::from_addrs(vec![node0_addr, root]).unwrap();
|
||||
let request = LookupRequest::new(42, target, node0_addr, coords, 5, 0);
|
||||
let request = LookupRequest::new(42, target, node0_addr, 5, 0);
|
||||
let payload = &request.encode()[1..];
|
||||
|
||||
// Handle on node0 as if we received it from outside
|
||||
@@ -481,10 +475,8 @@ async fn test_request_dedup_convergent_paths() {
|
||||
|
||||
let node0_addr = *nodes[0].node.node_addr();
|
||||
let target = *nodes[2].node.node_addr(); // target node2 (in bloom filters)
|
||||
let root = make_node_addr(0);
|
||||
|
||||
let coords = TreeCoordinate::from_addrs(vec![node0_addr, root]).unwrap();
|
||||
let request = LookupRequest::new(300, target, node0_addr, coords, 5, 0);
|
||||
let request = LookupRequest::new(300, target, node0_addr, 5, 0);
|
||||
let payload = &request.encode()[1..];
|
||||
|
||||
// Node0 handles the request (forwards to peers whose bloom filter
|
||||
@@ -841,9 +833,8 @@ async fn test_request_min_mtu_preserved_through_encode_decode() {
|
||||
// Verify min_mtu survives encode/decode in the handler test context
|
||||
let target = make_node_addr(0xBB);
|
||||
let origin = make_node_addr(0xCC);
|
||||
let coords = TreeCoordinate::from_addrs(vec![origin, make_node_addr(0)]).unwrap();
|
||||
|
||||
let request = LookupRequest::new(100, target, origin, coords, 5, 1386);
|
||||
let request = LookupRequest::new(100, target, origin, 5, 1386);
|
||||
let encoded = request.encode();
|
||||
let decoded = LookupRequest::decode(&encoded[1..]).unwrap();
|
||||
assert_eq!(decoded.min_mtu, 1386);
|
||||
|
||||
Reference in New Issue
Block a user