Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
233 changes: 1 addition & 232 deletions awkernel_lib/src/net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@ use self::{
net_device::{LinkStatus, NetCapabilities, NetDevice},
};

#[cfg(not(feature = "std"))]
use self::tcp::TcpPort;

#[cfg(not(feature = "std"))]
use alloc::collections::BTreeSet;

#[cfg(not(feature = "std"))]
use alloc::{string::String, vec::Vec};

Expand All @@ -34,6 +28,7 @@ pub mod ip_addr;
pub mod ipv6;
pub mod multicast;
pub mod net_device;
mod port_alloc;
pub mod tcp;
pub mod tcp_listener;
pub mod tcp_stream;
Expand Down Expand Up @@ -132,30 +127,6 @@ impl Display for IfStatus {
static NET_MANAGER: RwLock<NetManager> = RwLock::new(NetManager {
interfaces: BTreeMap::new(),
interface_id: 0,

#[cfg(not(feature = "std"))]
udp_ports_ipv4: BTreeSet::new(),

#[cfg(not(feature = "std"))]
udp_port_ipv4_ephemeral: u16::MAX >> 2,

#[cfg(not(feature = "std"))]
udp_ports_ipv6: BTreeSet::new(),

#[cfg(not(feature = "std"))]
udp_port_ipv6_ephemeral: u16::MAX >> 2,

#[cfg(not(feature = "std"))]
tcp_ports_ipv4: BTreeMap::new(),

#[cfg(not(feature = "std"))]
tcp_port_ipv4_ephemeral: u16::MAX >> 2,

#[cfg(not(feature = "std"))]
tcp_ports_ipv6: BTreeMap::new(),

#[cfg(not(feature = "std"))]
tcp_port_ipv6_ephemeral: u16::MAX >> 2,
});

static IRQ_WAKERS: Mutex<BTreeMap<u16, IRQWaker>> = Mutex::new(BTreeMap::new());
Expand All @@ -164,208 +135,6 @@ static POLL_WAKERS: Mutex<BTreeMap<u64, IRQWaker>> = Mutex::new(BTreeMap::new())
pub struct NetManager {
interfaces: BTreeMap<u64, Arc<IfNet>>,
interface_id: u64,

#[cfg(not(feature = "std"))]
udp_ports_ipv4: BTreeSet<u16>,

#[cfg(not(feature = "std"))]
udp_port_ipv4_ephemeral: u16,

#[cfg(not(feature = "std"))]
udp_ports_ipv6: BTreeSet<u16>,

#[cfg(not(feature = "std"))]
udp_port_ipv6_ephemeral: u16,

#[cfg(not(feature = "std"))]
tcp_ports_ipv4: BTreeMap<u16, u64>,

#[cfg(not(feature = "std"))]
tcp_port_ipv4_ephemeral: u16,

#[cfg(not(feature = "std"))]
tcp_ports_ipv6: BTreeMap<u16, u64>,

#[cfg(not(feature = "std"))]
tcp_port_ipv6_ephemeral: u16,
}

impl NetManager {
#[cfg(not(feature = "std"))]
fn get_ephemeral_port_udp_ipv4(&mut self) -> Option<u16> {
let mut ephemeral_port = None;
for i in 0..(u16::MAX >> 2) {
let port = self.udp_port_ipv4_ephemeral.wrapping_add(i);
let port = if port == 0 { u16::MAX >> 2 } else { port };

if !self.udp_ports_ipv4.contains(&port) {
self.udp_ports_ipv4.insert(port);
self.udp_port_ipv4_ephemeral = port;
ephemeral_port = Some(port);
break;
}
}

ephemeral_port
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn set_port_in_use_udp_ipv4(&mut self, port: u16) {
self.udp_ports_ipv4.insert(port);
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn is_port_in_use_udp_ipv4(&mut self, port: u16) -> bool {
self.udp_ports_ipv4.contains(&port)
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn free_port_udp_ipv4(&mut self, port: u16) {
self.udp_ports_ipv4.remove(&port);
}

#[cfg(not(feature = "std"))]
fn get_ephemeral_port_udp_ipv6(&mut self) -> Option<u16> {
let mut ephemeral_port = None;
for i in 0..(u16::MAX >> 2) {
let port = self.udp_port_ipv6_ephemeral.wrapping_add(i);
let port = if port == 0 { u16::MAX >> 2 } else { port };

if !self.udp_ports_ipv6.contains(&port) {
self.udp_ports_ipv6.insert(port);
self.udp_port_ipv4_ephemeral = port;
ephemeral_port = Some(port);
break;
}
}

ephemeral_port
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn set_port_in_use_udp_ipv6(&mut self, port: u16) {
self.udp_ports_ipv6.insert(port);
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn is_port_in_use_udp_ipv6(&mut self, port: u16) -> bool {
self.udp_ports_ipv6.contains(&port)
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn free_port_udp_ipv6(&mut self, port: u16) {
self.udp_ports_ipv6.remove(&port);
}

#[cfg(not(feature = "std"))]
fn get_ephemeral_port_tcp_ipv4(&mut self) -> Option<TcpPort> {
let mut ephemeral_port = None;
for i in 0..(u16::MAX >> 2) {
let port = self.tcp_port_ipv4_ephemeral.wrapping_add(i);
let port = if port == 0 { u16::MAX >> 2 } else { port };

let entry = self.tcp_ports_ipv4.entry(i);

match entry {
Entry::Occupied(_) => (),
Entry::Vacant(e) => {
e.insert(1);
ephemeral_port = Some(TcpPort::new(port, true));
self.tcp_port_ipv4_ephemeral = port;
break;
}
}
}

ephemeral_port
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn is_port_in_use_tcp_ipv4(&mut self, port: u16) -> bool {
self.tcp_ports_ipv4.contains_key(&port)
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn port_in_use_tcp_ipv4(&mut self, port: u16) -> TcpPort {
if let Some(e) = self.tcp_ports_ipv4.get_mut(&port) {
*e += 1;
} else {
self.tcp_ports_ipv4.insert(port, 1);
}

TcpPort::new(port, true)
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn decrement_port_in_use_tcp_ipv4(&mut self, port: u16) {
if let Some(e) = self.tcp_ports_ipv4.get_mut(&port) {
*e -= 1;
if *e == 0 {
self.tcp_ports_ipv4.remove(&port);
}
}
}

#[cfg(not(feature = "std"))]
fn get_ephemeral_port_tcp_ipv6(&mut self) -> Option<TcpPort> {
let mut ephemeral_port = None;
for i in 0..(u16::MAX >> 2) {
let port = self.tcp_port_ipv6_ephemeral.wrapping_add(i);
let port = if port == 0 { u16::MAX >> 2 } else { port };

let entry = self.tcp_ports_ipv6.entry(i);

match entry {
Entry::Occupied(_) => (),
Entry::Vacant(e) => {
e.insert(1);
ephemeral_port = Some(TcpPort::new(port, false));
self.tcp_port_ipv6_ephemeral = port;
break;
}
}
}

ephemeral_port
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn is_port_in_use_tcp_ipv6(&mut self, port: u16) -> bool {
self.tcp_ports_ipv6.contains_key(&port)
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn port_in_use_tcp_ipv6(&mut self, port: u16) -> TcpPort {
if let Some(e) = self.tcp_ports_ipv6.get_mut(&port) {
*e += 1;
} else {
self.tcp_ports_ipv6.insert(port, 1);
}

TcpPort::new(port, true)
}

#[cfg(not(feature = "std"))]
#[inline(always)]
fn decrement_port_in_use_tcp_ipv6(&mut self, port: u16) {
if let Some(e) = self.tcp_ports_ipv6.get_mut(&port) {
*e -= 1;
if *e == 0 {
self.tcp_ports_ipv6.remove(&port);
}
}
}
}

pub fn get_interface(interface_id: u64) -> Result<IfStatus, NetManagerError> {
Expand Down
Loading
Loading