Skip to main content

IpAllocator

Struct IpAllocator 

Source
pub struct IpAllocator { /* private fields */ }
Expand description

IP allocator for overlay network addresses

Tracks allocated IP addresses and provides next-available allocation from a configured CIDR range. Supports both IPv4 and IPv6 networks.

Implementations§

Source§

impl IpAllocator

Source

pub fn new(cidr: &str) -> Result<Self>

Create a new IP allocator for the given CIDR range

Supports both IPv4 (e.g., “10.200.0.0/16”) and IPv6 (e.g., fd00::/48).

§Arguments
  • cidr - Network CIDR notation
§Errors

Returns OverlayError::InvalidCidr if the CIDR string cannot be parsed.

§Example
use zlayer_overlay::allocator::IpAllocator;

let v4 = IpAllocator::new("10.200.0.0/16").unwrap();
let v6 = IpAllocator::new("fd00::/48").unwrap();
Source

pub fn from_state(state: IpAllocatorState) -> Result<Self>

Create an allocator from persisted state

§Errors

Returns an error if the CIDR is invalid or any IP is out of range.

Source

pub fn to_state(&self) -> IpAllocatorState

Get the current state for persistence

Source

pub async fn load(path: &Path) -> Result<Self>

Load allocator state from a file

§Errors

Returns an error if the file cannot be read or the state is invalid.

Source

pub async fn save(&self, path: &Path) -> Result<()>

Save allocator state to a file

§Errors

Returns an error if the file cannot be written or serialization fails.

Source

pub fn allocate(&mut self) -> Option<IpAddr>

Allocate the next available IP address

For IPv4, skips the network and broadcast addresses. For IPv6, skips the network address.

Returns None if all addresses in the CIDR range are allocated.

§Example
use zlayer_overlay::allocator::IpAllocator;

let mut allocator = IpAllocator::new("10.200.0.0/24").unwrap();
let ip = allocator.allocate().unwrap();
assert_eq!(ip.to_string(), "10.200.0.1");
Source

pub fn allocate_specific(&mut self, ip: IpAddr) -> Result<()>

Allocate a specific IP address

§Errors

Returns an error if the IP is already allocated or not in the CIDR range.

Source

pub fn allocate_first(&mut self) -> Result<IpAddr>

Allocate the first usable IP in the range (typically for the leader)

§Example
use zlayer_overlay::allocator::IpAllocator;

let mut allocator = IpAllocator::new("10.200.0.0/24").unwrap();
let ip = allocator.allocate_first().unwrap();
assert_eq!(ip.to_string(), "10.200.0.1");
§Errors

Returns an error if no IPs are available or the first IP is already allocated.

Source

pub fn mark_allocated(&mut self, ip: IpAddr) -> Result<()>

Mark an IP address as allocated (for restoring state)

§Errors

Returns an error if the IP is not in the CIDR range.

Source

pub fn release(&mut self, ip: IpAddr) -> bool

Release an IP address back to the pool

Returns true if the IP was released, false if it wasn’t allocated.

Source

pub fn is_allocated(&self, ip: IpAddr) -> bool

Check if an IP address is allocated

Source

pub fn contains(&self, ip: IpAddr) -> bool

Check if an IP address is within the CIDR range

Source

pub fn allocated_count(&self) -> usize

Get the number of allocated addresses

Source

pub fn total_hosts(&self) -> u32

Get the total number of usable addresses in the range

For IPv6 networks with large host spaces, this saturates at u32::MAX.

Source

pub fn available_count(&self) -> u32

Get the number of available addresses

Source

pub fn cidr(&self) -> String

Get the CIDR string

Source

pub fn network_addr(&self) -> IpAddr

Get the network address

Source

pub fn broadcast_addr(&self) -> IpAddr

Get the broadcast address

For IPv6, returns the last address in the range (all host bits set to 1).

Source

pub fn prefix_len(&self) -> u8

Get the prefix length

Source

pub fn host_prefix_len(&self) -> u8

Get the host prefix length (32 for IPv4, 128 for IPv6)

Source

pub fn allocated_ips(&self) -> Vec<IpAddr>

Get all allocated IPs

Trait Implementations§

Source§

impl Clone for IpAllocator

Source§

fn clone(&self) -> IpAllocator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for IpAllocator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more