use crate::{packet, stream::recv};
use s2n_codec::DecoderBufferMut;
use s2n_quic_core::inet::{ExplicitCongestionNotification, SocketAddress};
pub trait Dispatch {
#[inline(always)]
fn tag_len(&self) -> usize {
16
}
fn on_packet(
&mut self,
remote_addr: &SocketAddress,
ecn: ExplicitCongestionNotification,
packet: packet::Packet,
) -> Result<(), recv::Error>;
#[inline]
fn on_datagram_segment(
&mut self,
remote_addr: &SocketAddress,
ecn: ExplicitCongestionNotification,
segment: &mut [u8],
) -> Result<(), recv::Error> {
let tag_len = self.tag_len();
let segment_len = segment.len();
let mut decoder = DecoderBufferMut::new(segment);
while !decoder.is_empty() {
let packet = match decoder.decode_parameterized(tag_len) {
Ok((packet, remaining)) => {
decoder = remaining;
packet
}
Err(decoder_error) => {
tracing::warn!(
%decoder_error,
segment_len
);
break;
}
};
self.on_packet(remote_addr, ecn, packet)?;
}
Ok(())
}
}