diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-02-28 18:58:23 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-06-02 10:05:02 +0200 |
| commit | 83f738eb9e4e070c93a2e24461ac03a3ce767269 (patch) | |
| tree | b06ef2cef7091d1fa5b5d2f5c82441824e3039df /talpid-core/src | |
| parent | 2b2f63957a2cfd03a716ef50887a4b268cc6ddda (diff) | |
| download | mullvadvpn-83f738eb9e4e070c93a2e24461ac03a3ce767269.tar.xz mullvadvpn-83f738eb9e4e070c93a2e24461ac03a3ce767269.zip | |
Only create route rule for marked packets if it does not exist
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/split.rs | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/talpid-core/src/split.rs b/talpid-core/src/split.rs index cab42fd265..23955d0f32 100644 --- a/talpid-core/src/split.rs +++ b/talpid-core/src/split.rs @@ -59,22 +59,42 @@ pub enum Error { /// Route PID-associated packets through the physical interface. pub fn route_marked_packets() -> Result<(), Error> { // TODO: IPv6 - // FIXME: we have to check whether this already exists - let mut cmd = Command::new("ip"); - cmd.args(&[ - "-4", - "rule", - "add", - "from", - "all", - "fwmark", - &MARK.to_string(), - "lookup", - ROUTING_TABLE_NAME, - ]); + // Create the rule if it does not exist + let mut cmd = Command::new("ip"); + cmd.args(&["-4", "rule", "list", "table", ROUTING_TABLE_NAME]); log::trace!("running cmd - {:?}", &cmd); - cmd.output().map_err(Error::RoutingTableSetup)?; + let out = cmd.output().map_err(Error::RoutingTableSetup)?; + let out = if !out.status.success() { + "" + } else { + std::str::from_utf8(&out.stdout) + .map_err(|_| { + Error::RoutingTableSetup(io::Error::new( + io::ErrorKind::InvalidData, + "Error parsing ip output", + )) + })? + .trim() + }; + + if out == "" { + let mut cmd = Command::new("ip"); + cmd.args(&[ + "-4", + "rule", + "add", + "from", + "all", + "fwmark", + &MARK.to_string(), + "lookup", + ROUTING_TABLE_NAME, + ]); + + log::trace!("running cmd - {:?}", &cmd); + cmd.output().map_err(Error::RoutingTableSetup)?; + } // Flush table let mut cmd = Command::new("ip"); |
