mirror of
https://github.com/edera-dev/krata.git
synced 2025-08-03 13:11:31 +00:00
37 lines
842 B
Rust
37 lines
842 B
Rust
use anyhow::Result;
|
|
use async_trait::async_trait;
|
|
use bytes::BytesMut;
|
|
use tokio::sync::mpsc::Sender;
|
|
|
|
use super::key::NatKey;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct NatHandlerContext {
|
|
pub mtu: usize,
|
|
pub key: NatKey,
|
|
pub transmit_sender: Sender<BytesMut>,
|
|
pub reclaim_sender: Sender<NatKey>,
|
|
}
|
|
|
|
impl NatHandlerContext {
|
|
pub fn try_transmit(&self, buffer: BytesMut) -> Result<()> {
|
|
self.transmit_sender.try_send(buffer)?;
|
|
Ok(())
|
|
}
|
|
|
|
pub async fn reclaim(&self) -> Result<()> {
|
|
let _ = self.reclaim_sender.try_send(self.key);
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
pub trait NatHandler: Send {
|
|
async fn receive(&self, packet: &[u8]) -> Result<bool>;
|
|
}
|
|
|
|
#[async_trait]
|
|
pub trait NatHandlerFactory: Send {
|
|
async fn nat(&self, context: NatHandlerContext) -> Option<Box<dyn NatHandler>>;
|
|
}
|