diff options
| -rw-r--r-- | talpid-core/src/tunnel/tun_provider/android/ipnetwork_sub.rs | 31 |
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 + } + } +} |
