kratanet/nat/
handler.rs

1use anyhow::Result;
2use async_trait::async_trait;
3use bytes::BytesMut;
4use tokio::sync::mpsc::Sender;
5
6use super::key::NatKey;
7
8#[derive(Debug, Clone)]
9pub struct NatHandlerContext {
10    pub mtu: usize,
11    pub key: NatKey,
12    pub transmit_sender: Sender<BytesMut>,
13    pub reclaim_sender: Sender<NatKey>,
14}
15
16impl NatHandlerContext {
17    pub fn try_transmit(&self, buffer: BytesMut) -> Result<()> {
18        self.transmit_sender.try_send(buffer)?;
19        Ok(())
20    }
21
22    pub async fn reclaim(&self) -> Result<()> {
23        let _ = self.reclaim_sender.try_send(self.key);
24        Ok(())
25    }
26}
27
28#[async_trait]
29pub trait NatHandler: Send {
30    async fn receive(&self, packet: &[u8]) -> Result<bool>;
31}
32
33#[async_trait]
34pub trait NatHandlerFactory: Send {
35    async fn nat(&self, context: NatHandlerContext) -> Option<Box<dyn NatHandler>>;
36}