2024-02-10 12:29:33 +00:00
|
|
|
use async_trait::async_trait;
|
|
|
|
|
2024-02-10 14:30:41 +00:00
|
|
|
use log::warn;
|
2024-02-10 12:29:33 +00:00
|
|
|
|
|
|
|
use tokio::sync::mpsc::channel;
|
|
|
|
use tokio::sync::mpsc::Sender;
|
|
|
|
|
|
|
|
use crate::proxynat::udp::ProxyUdpHandler;
|
|
|
|
|
|
|
|
use crate::nat::{NatHandler, NatHandlerFactory, NatKey, NatKeyProtocol};
|
|
|
|
|
2024-02-10 14:02:54 +00:00
|
|
|
mod udp;
|
|
|
|
|
2024-02-10 12:29:33 +00:00
|
|
|
pub struct ProxyNatHandlerFactory {}
|
|
|
|
|
|
|
|
impl ProxyNatHandlerFactory {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
Self {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[async_trait]
|
|
|
|
impl NatHandlerFactory for ProxyNatHandlerFactory {
|
2024-02-10 14:02:54 +00:00
|
|
|
async fn nat(
|
|
|
|
&self,
|
|
|
|
key: NatKey,
|
|
|
|
tx_sender: Sender<Vec<u8>>,
|
|
|
|
reclaim_sender: Sender<NatKey>,
|
|
|
|
) -> Option<Box<dyn NatHandler>> {
|
2024-02-10 12:29:33 +00:00
|
|
|
match key.protocol {
|
|
|
|
NatKeyProtocol::Udp => {
|
|
|
|
let (rx_sender, rx_receiver) = channel::<Vec<u8>>(4);
|
|
|
|
let mut handler = ProxyUdpHandler::new(key, rx_sender);
|
|
|
|
|
2024-02-10 14:02:54 +00:00
|
|
|
if let Err(error) = handler.spawn(rx_receiver, tx_sender, reclaim_sender).await {
|
2024-02-10 12:29:33 +00:00
|
|
|
warn!("unable to spawn udp proxy handler: {}", error);
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
Some(Box::new(handler))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_ => None,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-02-10 14:30:41 +00:00
|
|
|
pub(crate) enum ProxyNatSelect {
|
2024-02-10 12:29:33 +00:00
|
|
|
External(usize),
|
|
|
|
Internal(Vec<u8>),
|
2024-02-10 14:02:54 +00:00
|
|
|
Close,
|
2024-02-10 12:29:33 +00:00
|
|
|
}
|