1use async_trait::async_trait;
2
3use bytes::BytesMut;
4use log::warn;
5
6use tokio::sync::mpsc::channel;
7
8use crate::proxynat::udp::ProxyUdpHandler;
9
10use crate::nat::handler::{NatHandler, NatHandlerContext, NatHandlerFactory};
11use crate::nat::key::NatKeyProtocol;
12
13use self::icmp::ProxyIcmpHandler;
14use self::tcp::ProxyTcpHandler;
15
16mod icmp;
17mod tcp;
18mod udp;
19
20const RX_CHANNEL_QUEUE_LEN: usize = 1000;
21
22pub struct ProxyNatHandlerFactory {}
23
24impl Default for ProxyNatHandlerFactory {
25 fn default() -> Self {
26 Self::new()
27 }
28}
29
30impl ProxyNatHandlerFactory {
31 pub fn new() -> Self {
32 Self {}
33 }
34}
35
36#[async_trait]
37impl NatHandlerFactory for ProxyNatHandlerFactory {
38 async fn nat(&self, context: NatHandlerContext) -> Option<Box<dyn NatHandler>> {
39 match context.key.protocol {
40 NatKeyProtocol::Udp => {
41 let (rx_sender, rx_receiver) = channel::<BytesMut>(RX_CHANNEL_QUEUE_LEN);
42 let mut handler = ProxyUdpHandler::new(rx_sender);
43
44 if let Err(error) = handler.spawn(context, rx_receiver).await {
45 warn!("unable to spawn udp proxy handler: {}", error);
46 None
47 } else {
48 Some(Box::new(handler))
49 }
50 }
51
52 NatKeyProtocol::Icmp => {
53 let (rx_sender, rx_receiver) = channel::<BytesMut>(RX_CHANNEL_QUEUE_LEN);
54 let mut handler = ProxyIcmpHandler::new(rx_sender);
55
56 if let Err(error) = handler.spawn(context, rx_receiver).await {
57 warn!("unable to spawn icmp proxy handler: {}", error);
58 None
59 } else {
60 Some(Box::new(handler))
61 }
62 }
63
64 NatKeyProtocol::Tcp => {
65 let (rx_sender, rx_receiver) = channel::<BytesMut>(RX_CHANNEL_QUEUE_LEN);
66 let mut handler = ProxyTcpHandler::new(rx_sender);
67
68 if let Err(error) = handler.spawn(context, rx_receiver).await {
69 warn!("unable to spawn tcp proxy handler: {}", error);
70 None
71 } else {
72 Some(Box::new(handler))
73 }
74 }
75 }
76 }
77}