summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs33
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)
+ }
+ }
+ }
+}