pub struct UdpDispatcher { /* private fields */ }Expand description
UDP L4 dispatcher (DP-01, #234): per-client session tracking with datagram forwarding and idle-session eviction.
The dispatcher owns the listener-side UdpSocket and a session
table keyed by client SocketAddr. Each unique client gets a
dedicated upstream UdpSocket; datagrams from the client are
forwarded to the upstream, and responses from the upstream are
forwarded back to the client. Sessions that are idle for longer
than session_timeout are evicted.
Implementations§
Source§impl UdpDispatcher
impl UdpDispatcher
Sourcepub fn new(config: L4ProxyConfig) -> Self
pub fn new(config: L4ProxyConfig) -> Self
Build a UDP dispatcher from the compiled config.
Sourcepub async fn run(
&self,
listener: Arc<UdpSocket>,
dp: &DataPlane,
gateway: &Gateway,
) -> Result<(), L4Error>
pub async fn run( &self, listener: Arc<UdpSocket>, dp: &DataPlane, gateway: &Gateway, ) -> Result<(), L4Error>
Run the UDP dispatch loop: receive datagrams on the listener socket, forward them to per-client upstream sockets, and forward responses back. Sessions are evicted after the idle timeout.
This method runs until the listener socket is closed (graceful shutdown). It spawns two tasks per session: one for client->upstream forwarding (handled inline on recv) and one for upstream->client forwarding (spawned per session).
Auto Trait Implementations§
impl Freeze for UdpDispatcher
impl RefUnwindSafe for UdpDispatcher
impl Send for UdpDispatcher
impl Sync for UdpDispatcher
impl Unpin for UdpDispatcher
impl UnwindSafe for UdpDispatcher
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more