sysctl: add /scheme/netcfg/sysctl tree with ip_forward toggle

Router gains Rc<Cell<bool>> ip_forward flag (default: true).
When false, forward_packets() returns immediately — no packets forwarded
between interfaces. Security best practice for non-router hosts.

netcfg scheme gains sysctl subtree:
  /scheme/netcfg/sysctl/net/ipv4/ip_forward  (rw: 0 or 1)

Read:  echo /scheme/netcfg/sysctl/net/ipv4/ip_forward  →  1
Write: echo 0 > /scheme/netcfg/sysctl/net/ipv4/ip_forward  (disable)
Restore: echo 1 > /scheme/netcfg/sysctl/net/ipv4/ip_forward

Mirrors Linux /proc/sys/net/ipv4/ip_forward.
Shared via Rc<Cell<bool>> between Router and NetCfgScheme.
This commit is contained in:
Red Bear OS
2026-07-08 15:20:21 +03:00
parent 25d6decc85
commit ba5a7cd3fc
3 changed files with 40 additions and 2 deletions
+6 -1
View File
@@ -1,4 +1,4 @@
use std::cell::RefCell;
use std::cell::{Cell, RefCell};
use std::rc::Rc;
use smoltcp::phy::{Device, DeviceCapabilities, Medium};
@@ -21,6 +21,7 @@ pub struct Router {
tx_buffer: PacketBuffer,
devices: Rc<RefCell<DeviceList>>,
route_table: Rc<RefCell<RouteTable>>,
pub ip_forward: Rc<Cell<bool>>,
}
impl Router {
@@ -38,6 +39,7 @@ impl Router {
tx_buffer,
devices,
route_table,
ip_forward: Rc::new(Cell::new(true)),
}
}
@@ -93,6 +95,9 @@ impl Router {
}
pub fn forward_packets(&mut self, filter_table: &Rc<RefCell<FilterTable>>, now: Instant) {
if !self.ip_forward.get() {
return;
}
let mut forwarded: Vec<Vec<u8>> = Vec::new();
let mut local: Vec<Vec<u8>> = Vec::new();