From c015a375b193e1bef37bf01c212ecf9e46218644 Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Wed, 8 Jul 2026 17:57:16 +0300 Subject: [PATCH] mtu: per-interface MTU configuration via netcfg MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LinkDevice trait gains set_mtu(mtu) with default no-op. EthernetLink stores mtu in field, clamped to 576-9000 (RFC 791 min/max). netcfg/ifaces/eth0/mtu becomes rw: cat /scheme/netcfg/ifaces/eth0/mtu → '1500' (default) echo 1400 > .../mtu → VPN MTU echo 9000 > .../mtu → jumbo frames Clamped to [576, 9000]: - 576: minimum for IPv4 (RFC 791) - 9000: standard jumbo frame MTU Useful for VPNs (MTU 1400 to avoid fragmentation through tunnel overhead), jumbo frames (MTU 9000 on datacenter networks), and constrained paths. --- netstack/src/link/ethernet.rs | 10 ++++++++++ netstack/src/link/mod.rs | 2 ++ netstack/src/scheme/netcfg/mod.rs | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/netstack/src/link/ethernet.rs b/netstack/src/link/ethernet.rs index b9a4c45d35..6a3eb84a96 100644 --- a/netstack/src/link/ethernet.rs +++ b/netstack/src/link/ethernet.rs @@ -86,6 +86,7 @@ pub struct EthernetLink { hardware_address: Option, ip_address: Option, qdisc_config: QdiscConfig, + mtu: usize, stats: Stats, arp_requests: u64, arp_replies: u64, @@ -121,6 +122,7 @@ impl EthernetLink { ndp_state: Default::default(), slaac_state: Default::default(), qdisc_config: QdiscConfig::default(), + mtu: Self::MTU, stats: Stats::default(), neighbor_cache: Default::default(), arp_requests: 0, @@ -894,5 +896,13 @@ impl LinkDevice for EthernetLink { } } } + + fn mtu(&self) -> usize { + self.mtu + } + + fn set_mtu(&mut self, mtu: usize) { + self.mtu = mtu.clamp(576, 9000); + } } diff --git a/netstack/src/link/mod.rs b/netstack/src/link/mod.rs index b73401434c..cf2dcba3f5 100644 --- a/netstack/src/link/mod.rs +++ b/netstack/src/link/mod.rs @@ -57,6 +57,8 @@ pub trait LinkDevice { 1500 } + fn set_mtu(&mut self, _mtu: usize) {} + fn link_state(&self) -> &'static str { "unknown" } diff --git a/netstack/src/scheme/netcfg/mod.rs b/netstack/src/scheme/netcfg/mod.rs index 78763bebbc..a464c43ed5 100644 --- a/netstack/src/scheme/netcfg/mod.rs +++ b/netstack/src/scheme/netcfg/mod.rs @@ -452,12 +452,25 @@ fn mk_root_node( } }, "mtu" => { - ro [devices] || { + rw [devices] (Option, None) + || { match devices.borrow().get("eth0") { Some(dev) => format!("{}\n", dev.mtu()), None => "Device not found\n".into(), } } + |cur_value, line| { + let mtu = line.trim().parse::() + .map_err(|_| SyscallError::new(syscall::EINVAL))?; + if let Some(dev) = devices.borrow_mut().get_mut("eth0") { + dev.set_mtu(mtu); + *cur_value = Some(mtu); + Ok(()) + } else { + Err(SyscallError::new(syscall::ENODEV)) + } + } + |_cur_value| { Ok(()) } }, "qdisc" => { ro [devices] || {