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:
+65
-38
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user