summaryrefslogtreecommitdiffhomepage
path: root/tunnel-obfuscation/src/socket.rs
blob: 727a648ba45ddb20d32e9903731b211f44789356 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use std::net::SocketAddr;
use tokio::net::UdpSocket;

use crate::Error;

pub async fn create_remote_socket(
    ipv4: bool,
    #[cfg(target_os = "linux")] fwmark: Option<u32>,
) -> Result<UdpSocket, Error> {
    let random_bind_addr = if ipv4 {
        SocketAddr::new("0.0.0.0".parse().unwrap(), 0)
    } else {
        SocketAddr::new("::".parse().unwrap(), 0)
    };
    let socket = UdpSocket::bind(random_bind_addr)
        .await
        .map_err(Error::BindRemoteUdp)?;
    #[cfg(target_os = "linux")]
    if let Some(fwmark) = fwmark {
        use nix::sys::socket::{setsockopt, sockopt};

        setsockopt(&socket, sockopt::Mark, &fwmark).map_err(Error::SetFwmark)?;
    }

    Ok(socket)
}