netfilter: add counters/reset path — preserves rules

Previously '/reset' replaced the entire FilterTable (destructive).
Added '/counters/reset' that clears:
- chain_counters (per-chain packets/bytes)
- rule.match_count (per-rule match counts)
WITHOUT removing rules or resetting policies.

FilterTable gains reset_counters() method.

Usage:
  echo > /scheme/netfilter/reset           # wipe everything
  echo > /scheme/netfilter/counters/reset  # clear metrics only

Mirrors Linux 'iptables -Z' (zero counters) vs full flush.
This commit is contained in:
Red Bear OS
2026-07-08 19:41:05 +03:00
parent 48cb44cb3e
commit ecc0ef33de
2 changed files with 15 additions and 0 deletions
+12
View File
@@ -180,6 +180,18 @@ impl FilterTable {
pub fn set_default_policy(&mut self, hook: Hook, verdict: Verdict) {
self.default_policy.insert(hook, verdict);
}
/// Clear per-chain counters and per-rule match counts.
/// Rules themselves are preserved. Use this to restart metrics
/// without losing configuration.
pub fn reset_counters(&mut self) {
for counter in self.chain_counters.values_mut() {
*counter = (0, 0);
}
for rule in &mut self.rules {
rule.match_count = 0;
}
}
}
fn format_rule(rule: &FilterRule) -> String {
+3
View File
@@ -282,6 +282,9 @@ impl NetFilterFile {
} else if path == "/reset" {
*table = FilterTable::new();
log::info!("netfilter: table reset to defaults");
} else if path == "/counters/reset" {
table.reset_counters();
log::info!("netfilter: counters reset (rules preserved)");
} else if let Some(rest) = path.strip_prefix("/policy/") {
let hook = parse_hook_name(rest).ok_or(SyscallError::new(syscall::EINVAL))?;
let verdict = match line.to_uppercase().as_str() {