base: apply Red Bear patches on latest upstream/main

251 files: init, acpid, ipcd, netcfg, ihdgd, virtio-gpud, scheme-utils,
inputd, block driver, ptyd, ramfs, randd, initfs bootstrap, path deps,
version +rb0.3.1, author attribution
This commit is contained in:
Red Bear OS
2026-07-11 11:39:24 +03:00
parent 1b17b3fc24
commit bd595851e2
251 changed files with 24641 additions and 5993 deletions
+65 -38
View File
@@ -13,54 +13,48 @@ use smoltcp::wire::EthernetAddress;
mod buffer_pool;
mod error;
mod filter;
mod icmp_error;
mod link;
mod logger;
mod observer;
mod port_set;
mod router;
mod scheme;
mod slaac;
fn get_network_adapter() -> Result<String> {
fn get_all_network_adapters() -> Result<Vec<String>> {
use std::fs;
let mut adapters = vec![];
for entry_res in fs::read_dir("/scheme")? {
let Ok(entry) = entry_res else {
continue;
};
let Ok(scheme) = entry.file_name().into_string() else {
continue;
};
if !scheme.starts_with("network") {
continue;
}
let Ok(entry) = entry_res else { continue };
let Ok(scheme) = entry.file_name().into_string() else { continue };
if !scheme.starts_with("network") { continue; }
adapters.push(scheme);
}
if adapters.is_empty() {
bail!("no network adapter found");
} else {
let adapter = adapters.remove(0);
if !adapters.is_empty() {
// FIXME allow using multiple network adapters at the same time
warn!("Multiple network adapters found. Only {adapter} will be used");
}
Ok(adapter)
}
info!("Found {} network adapter(s): {:?}", adapters.len(), adapters);
Ok(adapters)
}
fn run(daemon: daemon::Daemon) -> Result<()> {
let adapter = get_network_adapter()?;
trace!("opening {adapter}:");
let network_fd = Fd::open(&format!("/scheme/{adapter}"), O_RDWR | O_NONBLOCK, 0)
.map_err(|e| anyhow!("failed to open {adapter}: {e}"))?;
let adapters = get_all_network_adapters()?;
trace!("found {} network adapter(s)", adapters.len());
let hardware_addr = std::fs::read(format!("/scheme/{adapter}/mac"))
.map(|mac_address| EthernetAddress::from_bytes(&mac_address))
.context("failed to get mac address from network adapter")?;
let mut network_fds = Vec::new();
for name in &adapters {
let fd = Fd::open(&format!("/scheme/{name}"), O_RDWR | O_NONBLOCK, 0)
.map_err(|e| anyhow!("failed to open {name}: {e}"))?;
let hw = std::fs::read(format!("/scheme/{name}/mac"))
.map(|mac| EthernetAddress::from_bytes(&mac))
.with_context(|| format!("failed to get mac for {name}"))?;
network_fds.push((fd, hw, name.clone()));
}
trace!("opening ip scheme socket");
let ip_fd = Socket::nonblock()
@@ -82,6 +76,14 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
let netcfg_fd =
Socket::nonblock().map_err(|e| anyhow!("failed to open netcfg scheme socket {:?}", e))?;
trace!("opening netfilter scheme socket");
let netfilter_fd =
Socket::nonblock().map_err(|e| anyhow!("failed to open netfilter scheme socket: {:?}", e))?;
trace!("opening tun scheme socket");
let tun_fd =
Socket::nonblock().map_err(|e| anyhow!("failed to open tun scheme socket: {:?}", e))?;
let time_path = format!("/scheme/time/{}", syscall::CLOCK_MONOTONIC);
let time_fd = Fd::open(&time_path, O_RDWR, 0).context("failed to open /scheme/time")?;
@@ -94,6 +96,8 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
TcpScheme,
IcmpScheme,
NetcfgScheme,
NetfilterScheme,
TunScheme,
}
}
@@ -102,9 +106,13 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
daemon.ready();
event_queue
.subscribe(network_fd.raw(), EventSource::Network, EventFlags::READ)
.map_err(|e| anyhow!("failed to listen to network events: {:?}", e))?;
// Subscribe to the first adapter for I/O events; the router handles
// packet dispatch across all adapters in the DeviceList.
if let Some((first_fd, _, _)) = network_fds.first() {
event_queue
.subscribe(first_fd.raw(), EventSource::Network, EventFlags::READ)
.map_err(|e| anyhow!("failed to listen to network events: {:?}", e))?;
}
event_queue
.subscribe(time_fd.raw(), EventSource::Time, EventFlags::READ)
@@ -112,7 +120,7 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
event_queue
.subscribe(ip_fd.inner().raw(), EventSource::IpScheme, EventFlags::READ)
.context("failed to listen to ip scheme events")?;
.map_err(|e| anyhow!("failed to listen to ip scheme events: {:?}", e))?;
event_queue
.subscribe(
@@ -120,7 +128,7 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
EventSource::UdpScheme,
EventFlags::READ,
)
.context("failed to listen to udp scheme events")?;
.map_err(|e| anyhow!("failed to listen to udp scheme events: {:?}", e))?;
event_queue
.subscribe(
@@ -128,7 +136,7 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
EventSource::TcpScheme,
EventFlags::READ,
)
.context("failed to listen to tcp scheme events")?;
.map_err(|e| anyhow!("failed to listen to tcp scheme events: {:?}", e))?;
event_queue
.subscribe(
@@ -136,7 +144,7 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
EventSource::IcmpScheme,
EventFlags::READ,
)
.context("failed to listen to icmp scheme events")?;
.map_err(|e| anyhow!("failed to listen to icmp scheme events: {:?}", e))?;
event_queue
.subscribe(
@@ -144,17 +152,34 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
EventSource::NetcfgScheme,
EventFlags::READ,
)
.context("failed to listen to netcfg scheme events")?;
.map_err(|e| anyhow!("failed to listen to netcfg scheme events: {:?}", e))?;
event_queue
.subscribe(
netfilter_fd.inner().raw(),
EventSource::NetfilterScheme,
EventFlags::READ,
)
.map_err(|e| anyhow!("failed to listen to netfilter scheme events: {:?}", e))?;
event_queue
.subscribe(
tun_fd.inner().raw(),
EventSource::TunScheme,
EventFlags::READ,
)
.map_err(|e| anyhow!("failed to listen to tun scheme events: {:?}", e))?;
let mut smolnetd = Smolnetd::new(
network_fd,
hardware_addr,
network_fds,
ip_fd,
udp_fd,
tcp_fd,
icmp_fd,
time_fd,
netcfg_fd,
netfilter_fd,
tun_fd,
)
.context("smolnetd: failed to initialize smolnetd")?;
@@ -162,7 +187,7 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
let all = {
use EventSource::*;
[Network, Time, IpScheme, UdpScheme, IcmpScheme, NetcfgScheme].map(Ok)
[Network, Time, IpScheme, UdpScheme, TcpScheme, IcmpScheme, NetcfgScheme, NetfilterScheme, TunScheme].map(Ok)
};
for event_res in all
@@ -177,6 +202,8 @@ fn run(daemon: daemon::Daemon) -> Result<()> {
EventSource::TcpScheme => smolnetd.on_tcp_scheme_event(),
EventSource::IcmpScheme => smolnetd.on_icmp_scheme_event(),
EventSource::NetcfgScheme => smolnetd.on_netcfg_scheme_event(),
EventSource::NetfilterScheme => smolnetd.on_netfilter_scheme_event(),
EventSource::TunScheme => smolnetd.on_tun_scheme_event(),
}
.map_err(|e| error!("Received packet error: {:?}", e));
}