kratanet/proxynat/
mod.rs

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}