diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-01-23 20:17:47 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-02-06 12:05:57 +0000 |
| commit | bb8a326c679857d442e3fbcfb00f006ac94cd5a2 (patch) | |
| tree | 763fa940398732b02df00382adf17fd4ce83c064 | |
| parent | b51b2220449774eb99ab9bf7648246fb427324bd (diff) | |
| download | mullvadvpn-bb8a326c679857d442e3fbcfb00f006ac94cd5a2.tar.xz mullvadvpn-bb8a326c679857d442e3fbcfb00f006ac94cd5a2.zip | |
Impl. `IpNetworkSub` for `T: AbstractIpNetwork`
| -rw-r--r-- | talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs b/talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs index d2fa1afbad..ab5e6309c9 100644 --- a/talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs +++ b/talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs @@ -153,3 +153,36 @@ pub trait IpNetworkSub: Copy + Sized + 'static { result } } + +impl<T> IpNetworkSub for T +where + T: AbstractIpNetwork, +{ + type Output = IpNetworks<T>; + + fn sub(self, other: Self) -> Self::Output { + let subtrahend = self.network(); + let minuend = other.network(); + let mask = self.mask(); + + if minuend & mask == subtrahend { + let max_bit_position = T::MAX_PREFIX - self.prefix(); + let bit_position = T::MAX_PREFIX - other.prefix(); + + IpNetworks::MultipleNetworks(IpNetworkRange { + network: minuend, + bit_position, + max_bit_position, + _network_type: PhantomData, + }) + } else { + let other_mask = other.mask(); + + if subtrahend & other_mask == minuend { + IpNetworks::Empty + } else { + IpNetworks::SingleNetwork(self) + } + } + } +} |
