atm0s_sdn_virtual_socket/
vnet.rs1use 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 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}