summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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
+ }
+ }
+}