diff options
author | Himbeer <himbeer@disroot.org> | 2025-03-20 17:35:50 +0100 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2025-03-20 17:35:50 +0100 |
commit | 8295db3fbb6717f82b795c0ba4f20eb5d6aa55a2 (patch) | |
tree | 108db0ec13e8255935abfb0e3e170a53bf69d67a /src | |
parent | c06ed776ab8081d89099de3fb7ddc8a29426a8df (diff) |
Create/delete IPv4/v6 rules separately for RuleVersion::Both
This change is needed because rtnetlink does not support multi-protocol
rules.
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/src/main.rs b/src/main.rs index ff0b6ad..0754003 100644 --- a/src/main.rs +++ b/src/main.rs @@ -465,15 +465,26 @@ struct Rule { impl Rule { fn add(self, c: &Connection) -> Result<(), SetupError> { match self.version { - RuleVersion::Both => rsdsl_netlinklib::rule::Rule::<()> { - invert: self.invert, - fwmark: self.fwmark, - dst: None, - src: None, - action: self.action, - table: self.table, + RuleVersion::Both => { + rsdsl_netlinklib::rule::Rule::<Ipv4Addr> { + invert: self.invert, + fwmark: self.fwmark, + dst: None, + src: None, + action: self.action, + table: self.table, + } + .blocking_add(c)?; + rsdsl_netlinklib::rule::Rule::<Ipv6Addr> { + invert: self.invert, + fwmark: self.fwmark, + dst: None, + src: None, + action: self.action, + table: self.table, + } + .blocking_add(c)?; } - .blocking_add(c)?, RuleVersion::Ipv4 => rsdsl_netlinklib::rule::Rule::<Ipv4Addr> { invert: self.invert, fwmark: self.fwmark, @@ -523,15 +534,26 @@ impl Rule { fn delete(self, c: &Connection) -> Result<(), SetupError> { match self.version { - RuleVersion::Both => rsdsl_netlinklib::rule::Rule::<()> { - invert: self.invert, - fwmark: self.fwmark, - dst: None, - src: None, - action: self.action, - table: self.table, + RuleVersion::Both => { + rsdsl_netlinklib::rule::Rule::<Ipv4Addr> { + invert: self.invert, + fwmark: self.fwmark, + dst: None, + src: None, + action: self.action, + table: self.table, + } + .blocking_del(c)?; + rsdsl_netlinklib::rule::Rule::<Ipv6Addr> { + invert: self.invert, + fwmark: self.fwmark, + dst: None, + src: None, + action: self.action, + table: self.table, + } + .blocking_del(c)?; } - .blocking_del(c)?, RuleVersion::Ipv4 => rsdsl_netlinklib::rule::Rule::<Ipv4Addr> { invert: self.invert, fwmark: self.fwmark, |