Skip to main content

UdpProxy

Struct UdpProxy 

Source
pub struct UdpProxy { /* private fields */ }
Expand description

The UDP proxy. Holds the listeners, one UdpManager per listener token, the shared BackendMap, the session slab and a cloned registry. Does NOT implement ProxyConfiguration / L7Proxy; the server drives it through the inherent notify plus the activate/give-back helpers.

Implementations§

Source§

impl UdpProxy

Source

pub fn new( registry: Registry, sessions: Rc<RefCell<SessionManager>>, pool: Rc<RefCell<Pool>>, backends: Rc<RefCell<BackendMap>>, max_connections: usize, buffer_size: usize, ) -> UdpProxy

Source

pub fn health_poll(&mut self)

Drive the UDP health prober one event-loop step (server calls this once per iteration, mirroring HealthChecker::poll). Non-blocking.

The prober borrows self.registry directly. It must not clone it: Registry::try_clone is an fcntl(F_DUPFD_CLOEXEC) of the epoll descriptor and dropping the clone is a close, so a clone here cost two syscalls on every event-loop turn, with or without a UDP cluster, and silently skipped health probing whenever the worker was out of descriptors (EMFILE).

Source

pub fn health_ready(&mut self, token: Token)

Record mio readiness for a UDP health-probe socket.

Source

pub fn health_owns_token(&self, token: Token) -> bool

Whether token is a UDP health-probe socket this proxy owns.

Source

pub fn add_listener( &mut self, config: UdpListenerConfig, token: Token, ) -> Result<Token, ProxyError>

Source

pub fn remove_listener(&mut self, address: &ListenerKey) -> bool

Source

pub fn inherited_socket_fate(&self, addr: &ListenerKey) -> InheritedSocketFate

What this proxy would do with a socket handed to activate_listener for addr. See crate::InheritedSocketFate.

The event loop is single-threaded, so nothing can change the listener’s active flag between this answer and the activate_listener call that acts on it.

Source

pub fn activate_listener( &self, addr: &ListenerKey, udp_socket: Option<UdpSocket>, ) -> Result<Token, ProxyError>

Source

pub fn has_listener_session(&self, token: Token) -> bool

Whether the real UdpListenerSession for token is already installed, i.e. build_session has run for it and no teardown has removed it since.

listener_sessions is populated by build_session alone and emptied by give_back_listener (deactivate), remove_listener and soft/hard stop, so membership tracks the installed session exactly. Server reads it to tell a first ActivateListener from a repeat: UdpListener::activate answers Ok(token) for an already-active listener without doing any work, and rebuilding on that answer would destroy the live session.

Source

pub fn listener_token(&self, address: &ListenerKey) -> Option<Token>

The slab token reserved for the listener at address, if this proxy holds one.

A listener owns exactly one slab slot for its whole AddListener -> RemoveListener lifetime, and no remove_listener implementation touches the session slab. Server therefore reads the token here BEFORE dropping the listener, so that reserved slot is released exactly once, at the end of the lifetime.

Source

pub fn build_session( &mut self, token: Token, ) -> Option<Rc<RefCell<UdpListenerSession>>>

Build the UdpListenerSession that drives this listener’s datagrams. The server inserts the returned session into the slab at the listener token, replacing the ListenSession placeholder, so the generic readiness path reaches UdpListenerSession::update_readiness. Returns None if the listener token is unknown.

Source

pub fn give_back_listeners(&mut self) -> Vec<(ListenerKey, UdpSocket)>

Source

pub fn give_back_listener( &mut self, address: &ListenerKey, ) -> Result<(Token, UdpSocket), ProxyError>

Source

pub fn update_listener( &mut self, patch: UpdateUdpListenerConfig, ) -> Result<(), ProxyError>

Source

pub fn add_udp_front( &mut self, front: RequestUdpFrontend, ) -> Result<(), ProxyError>

Source

pub fn remove_udp_front( &mut self, front: RequestUdpFrontend, ) -> Result<(), ProxyError>

Source

pub fn notify(&mut self, message: WorkerRequest) -> WorkerResponse

Inherent dispatch entry point — the server calls this directly (UDP does not implement ProxyConfiguration). Handles UDP frontends, cluster config, listener removal, and stop. No accept / create_session.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.