use crate::types::Error;
use crate::types::ObjectVisibility;
use serde::{Serialize, Deserialize};
pub type RawIpv6Addr = [u8; 16];
pub fn ipv6_subnet_mask(prefix_len: u8) -> RawIpv6Addr {
let mut mask = 0xffffffff_ffffffff_ffffffff_ffffffffu128;
mask = mask.checked_shr(prefix_len as u32).unwrap_or(0);
mask = !mask;
let mask = mask.to_be_bytes();
mask
}
pub fn ipv6_wildcard_mask(prefix_len: u8) -> RawIpv6Addr {
let mut mask = 0xffffffff_ffffffff_ffffffff_ffffffffu128;
mask = mask.checked_shr(prefix_len as u32).unwrap_or(0);
let mask = mask.to_be_bytes();
mask
}
pub fn ipv6_network_address(ip: RawIpv6Addr, prefix_len: u8) -> RawIpv6Addr {
let mask = ipv6_subnet_mask(prefix_len);
let mut addr = [0; 16];
for i in 0..16 {
addr[i] = ip[i] & mask[i];
}
addr
}
pub fn ipv6_broadcast_address(ip: RawIpv6Addr, prefix_len: u8) -> RawIpv6Addr {
let wildcard = ipv6_wildcard_mask(prefix_len);
let mut addr = [0; 16];
for i in 0..16 {
addr[i] = ip[i] | wildcard[i];
}
addr
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentSpaceIpv6 {
#[serde(default)]
pub id: i32,
pub name: String,
pub description: String,
pub space_visibility: ObjectVisibility,
pub ipv6_prefix: [u8; 16],
pub ipv6_prefix_len: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentPoolIpv6 {
#[serde(default)]
pub id: i32,
pub assignment_space_id: i32,
pub name: String,
pub description: String,
pub pool_visibility: ObjectVisibility,
pub ipv6_prefix: [u8; 16],
pub ipv6_prefix_len: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssignmentIpv6 {
#[serde(default)]
pub id: i32,
pub assignment_pool_id: i32,
pub name: String,
pub description: String,
pub assignment_visibility: ObjectVisibility,
pub ipv6_prefix: [u8; 16],
pub ipv6_prefix_len: i32,
}
pub trait Ipv6AssignmentStore {
fn get_space(&self, space_id: i32) -> Result<AssignmentSpaceIpv6, Error>;
fn get_spaces(&self) -> Result<Vec<AssignmentSpaceIpv6>, Error>;
fn create_space(&self, space: &AssignmentSpaceIpv6) -> Result<i32, Error>;
fn update_space(&self, id: i32, name: &str, description: &str) -> Result<(), Error>;
fn delete_space(&self, space_id: i32) -> Result<(), Error>;
fn get_pool(&self, pool_id: i32) -> Result<AssignmentPoolIpv6, Error>;
fn get_pools(&self, space_id: i32) -> Result<Vec<AssignmentPoolIpv6>, Error>;
fn create_pool(&self, pool: &AssignmentPoolIpv6) -> Result<i32, Error>;
fn update_pool(&self, id: i32, name: &str, description: &str) -> Result<(), Error>;
fn delete_pool(&self, pool_id: i32) -> Result<(), Error>;
fn get_assignment(&self, assignment_id: i32) -> Result<AssignmentIpv6, Error>;
fn get_assignments(&self, pool_id: i32) -> Result<Vec<AssignmentIpv6>, Error>;
fn create_assignment(&self, assignment: &AssignmentIpv6) -> Result<i32, Error>;
fn update_assignment(&self, id: i32, name: &str, description: &str) -> Result<(), Error>;
fn delete_assignment(&self, assignment_id: i32) -> Result<(), Error>;
}