bluefin 0.1.6

An experimental, secure, P2P, transport-layer protocol.
Documentation
use std::net::SocketAddr;

use common::BluefinResult;
use tokio::net::UdpSocket;

pub mod common;
pub mod window;

#[inline]
pub(crate) fn get_udp_socket(src_addr: SocketAddr) -> BluefinResult<UdpSocket> {
    let s = get_udp_socket_impl(src_addr)?;
    let udp_sock: std::net::UdpSocket = s.into();
    let socket = udp_sock.try_into()?;

    Ok(socket)
}

#[inline]
pub(crate) fn get_connected_udp_socket(
    src_addr: SocketAddr,
    dst_addr: SocketAddr,
) -> BluefinResult<UdpSocket> {
    let socket = get_udp_socket_impl(src_addr)?;
    socket.connect(&socket2::SockAddr::from(dst_addr))?;

    let udp_sock: std::net::UdpSocket = socket.into();
    let s = udp_sock.try_into()?;

    Ok(s)
}

#[inline]
fn get_udp_socket_impl(src_addr: SocketAddr) -> BluefinResult<socket2::Socket> {
    let udp_sock = socket2::Socket::new(socket2::Domain::IPV4, socket2::Type::DGRAM, None)?;
    udp_sock.set_reuse_address(true)?;
    udp_sock.set_reuse_port(true)?;
    udp_sock.set_cloexec(true)?;
    udp_sock.set_nonblocking(true).unwrap();
    udp_sock.bind(&socket2::SockAddr::from(src_addr))?;
    Ok(udp_sock)
}