mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-10 08:37:02 +00:00
Implement reactive MtuExceeded error signal (0x22)
Add a new session-layer error signal that transit routers send back to the source when a forwarded packet exceeds the next-hop transport MTU. This complements the existing proactive path MTU discovery (min'd at each hop) by providing immediate feedback when oversized packets are dropped, closing the transient window before the proactive mechanism converges. Wire format: 36-byte payload (msg_type + flags + dest_addr + reporter + mtu) with FSP phase=0x0 and U flag set, matching the existing CoordsRequired/PathBroken pattern. Changes: - Add SessionMessageType::MtuExceeded (0x22) and MtuExceeded struct with encode/decode methods to protocol/session.rs - Add NodeError::MtuExceeded variant to propagate structured MTU info from TransportError through send_encrypted_link_message() - Catch MtuExceeded in the forwarding path and send error signal back to the datagram source via send_mtu_exceeded_error(), rate-limited by the existing routing_error_rate_limiter - Handle incoming MtuExceeded at the source by calling PathMtuState::apply_notification() for immediate MTU decrease - Add unit tests for encode/decode roundtrip, boundary MTU values, and too-short payload rejection
This commit is contained in:
+14
-4
@@ -25,7 +25,7 @@ use crate::peer::{ActivePeer, PeerConnection};
|
||||
use self::rate_limit::HandshakeRateLimiter;
|
||||
use self::routing_error_rate_limit::RoutingErrorRateLimiter;
|
||||
use crate::transport::{
|
||||
Link, LinkId, PacketRx, PacketTx, TransportAddr, TransportHandle, TransportId,
|
||||
Link, LinkId, PacketRx, PacketTx, TransportAddr, TransportError, TransportHandle, TransportId,
|
||||
};
|
||||
use crate::transport::udp::UdpTransport;
|
||||
use crate::tree::TreeState;
|
||||
@@ -96,6 +96,9 @@ pub enum NodeError {
|
||||
#[error("send failed to {node_addr}: {reason}")]
|
||||
SendFailed { node_addr: NodeAddr, reason: String },
|
||||
|
||||
#[error("mtu exceeded forwarding to {node_addr}: packet {packet_size} > mtu {mtu}")]
|
||||
MtuExceeded { node_addr: NodeAddr, packet_size: usize, mtu: u16 },
|
||||
|
||||
#[error("config error: {0}")]
|
||||
Config(#[from] ConfigError),
|
||||
|
||||
@@ -1156,9 +1159,16 @@ impl Node {
|
||||
.ok_or(NodeError::TransportNotFound(transport_id))?;
|
||||
|
||||
let bytes_sent = transport.send(&remote_addr, &wire_packet).await
|
||||
.map_err(|e| NodeError::SendFailed {
|
||||
node_addr: *node_addr,
|
||||
reason: format!("transport send: {}", e),
|
||||
.map_err(|e| match e {
|
||||
TransportError::MtuExceeded { packet_size, mtu } => NodeError::MtuExceeded {
|
||||
node_addr: *node_addr,
|
||||
packet_size,
|
||||
mtu,
|
||||
},
|
||||
other => NodeError::SendFailed {
|
||||
node_addr: *node_addr,
|
||||
reason: format!("transport send: {}", other),
|
||||
},
|
||||
})?;
|
||||
|
||||
// Update send statistics
|
||||
|
||||
Reference in New Issue
Block a user