atm0s_sdn_virtual_socket/
vnet.rs

1use std::{net::SocketAddrV4, sync::Arc};
2
3use atm0s_sdn_identity::NodeId;
4use atm0s_sdn_router::RouterTable;
5
6use self::{internal::VirtualNetInternal, udp_socket::VirtualUdpSocket};
7
8mod async_queue;
9pub(crate) mod internal;
10pub(crate) mod udp_socket;
11
12#[derive(Debug, PartialEq, Clone)]
13pub struct VirtualSocketPkt {
14    pub src: SocketAddrV4,
15    pub payload: Vec<u8>,
16    /// ecn, only 2 bits
17    pub ecn: Option<u8>,
18}
19
20#[derive(Debug, PartialEq)]
21pub enum VirtualNetError {
22    QueueFull,
23    Unreachable,
24    AllreadyExists,
25    NoAvailablePort,
26}
27
28#[derive(Clone)]
29pub struct VirtualNet {
30    pub(crate) internal: VirtualNetInternal,
31}
32
33impl VirtualNet {
34    pub(crate) fn new(node_id: NodeId, router: Arc<dyn RouterTable>) -> (Self, VirtualNetInternal) {
35        log::info!("[VirtualNet] Create new virtual socket service");
36        let internal = VirtualNetInternal::new(node_id, router);
37        let net = Self { internal: internal.clone() };
38        (net, internal)
39    }
40
41    pub fn create_udp_socket(&self, port: u16, buffer_size: usize) -> Result<VirtualUdpSocket, VirtualNetError> {
42        VirtualUdpSocket::new(self.internal.clone(), port, buffer_size)
43    }
44}