diff --git a/crates/irtt-server/src/runtime.rs b/crates/irtt-server/src/runtime.rs
index 7c6e68f..cbad5b3 100644
--- a/crates/irtt-server/src/runtime.rs
+++ b/crates/irtt-server/src/runtime.rs
@@ -19,9 +19,10 @@ use crate::{
/// Fixed transport receive capacity.
///
-/// Standard UDP payloads fit in this buffer. A datagram reported as filling it
-/// exactly is dropped conservatively instead of passing potentially truncated
-/// bytes to the protocol core. IPv6 jumbograms are not supported.
+/// Standard UDP payloads fit in this buffer; IPv6 jumbograms are not supported.
+/// This is allocation policy only: whether a received datagram may reach the
+/// protocol core — the conservative rejection of one filling the buffer
+/// included — belongs to [`socket_io::receive`].
const RECEIVE_BUFFER_LEN: usize = 65_536;
const MAINTENANCE_INTERVAL: Duration = Duration::from_secs(1);
@@ -218,10 +219,6 @@ impl Server {
Err(source) => return Err(ServerRuntimeError::Receive { source }),
};
let (len, peer) = (received.len, received.peer);
- if len == RECEIVE_BUFFER_LEN {
- continue;
- }
-
if let Some(reply) = self.core.handle_datagram(peer, &self.recv_buffer[..len])? {
if !self.prepare_reply_traffic_class(reply.traffic_class()) {
continue;
diff --git a/crates/irtt-server/src/socket_io.rs b/crates/irtt-server/src/socket_io.rs
index 912801a..32fcab0 100644
--- a/crates/irtt-server/src/socket_io.rs
+++ b/crates/irtt-server/src/socket_io.rs
@@ -90,10 +90,23 @@ pub(crate) fn configure_destination_metadata(
/// `select_reply_source` is the listener's own wildcard-ness, decided once at
/// construction. It is never inferred from a peer address.
///
-/// `Ok(None)` is a datagram the runtime must drop without letting it reach the
-/// core: it was truncated, its ancillary metadata was truncated, or a wildcard
-/// listener could not recover its local destination. Answering it correctly is
-/// impossible, so it must not advance any session's state either.
+/// This is the one place deciding whether a datagram may reach
+/// [`ServerCore`](crate::ServerCore). `Ok(Some(..))` is a datagram the transport
+/// layer accepts; `Ok(None)` is one the caller must consume and drop without
+/// advancing any protocol or session state, because answering it correctly is
+/// impossible. `Ok(None)` covers:
+///
+/// - payload truncation reported by an ancillary receive (`MSG_TRUNC`);
+/// - ancillary metadata truncation (`MSG_CTRUNC`);
+/// - a wildcard listener's missing or unusable local destination;
+/// - a datagram filling `buffer` exactly, which is conservatively treated as
+/// potentially truncated.
+///
+/// That last rule exists because `recv_from` reports no truncation flag, so an
+/// exactly-full result cannot be told apart from a larger datagram cut down to
+/// the supplied capacity. It is expressed against `buffer.len()`, so the policy
+/// follows whatever receive capacity the caller supplies, and it applies to both
+/// receive paths alike.
///
/// Cancel-safe: nothing is consumed until a datagram is fully received.
pub(crate) async fn receive(
@@ -101,16 +114,19 @@ pub(crate) async fn receive(
buffer: &mut [u8],
select_reply_source: bool,
) -> io::Result