summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-01-23 20:00:09 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-02-06 12:05:57 +0000
commit5d51935f4018f903c7ccc64e35e9cbfbb2652b86 (patch)
treef934d64af2cd515f67968075dfaf3b7edf79f089
parent391829b302256cd37c39cc854b528721ff4fc039 (diff)
downloadmullvadvpn-5d51935f4018f903c7ccc64e35e9cbfbb2652b86.tar.xz
mullvadvpn-5d51935f4018f903c7ccc64e35e9cbfbb2652b86.zip
Create `IpNetworkRange` helper type
Used to calculate IP networks resulting from a subtraction of an IP network from another.
-rw-r--r--talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs31
1 files changed, 31 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 a4feb1f0f7..8f013ef530 100644
--- a/talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs
+++ b/talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs
@@ -1,6 +1,7 @@
use ipnetwork::{Ipv4Network, Ipv6Network};
use std::{
fmt::Debug,
+ marker::PhantomData,
ops::{Add, BitAnd, BitXor, Not, Shl, Sub},
};
@@ -73,3 +74,33 @@ impl AbstractIpNetwork for Ipv6Network {
Ipv6Network::prefix(&self)
}
}
+
+#[derive(Clone, Copy, Debug)]
+pub struct IpNetworkRange<T: AbstractIpNetwork> {
+ network: T::Representation,
+ bit_position: u8,
+ max_bit_position: u8,
+ _network_type: PhantomData<T>,
+}
+
+impl<T> Iterator for IpNetworkRange<T>
+where
+ T: AbstractIpNetwork,
+{
+ type Item = T;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.bit_position < self.max_bit_position {
+ let bit_mask = T::ONE << self.bit_position;
+ let prefix_mask = !(bit_mask - T::ONE);
+ let address = (self.network ^ bit_mask) & prefix_mask;
+ let prefix = T::MAX_PREFIX - self.bit_position;
+
+ self.bit_position += 1;
+
+ Some(T::new(address, prefix))
+ } else {
+ None
+ }
+ }
+}