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}