First draft of subnet generation function. Still not complete, does overflow but I believe it is only small logic changes
This commit is contained in:
		@@ -8,7 +8,7 @@ mod networking;
 | 
			
		||||
#[allow(unused_variables, unused_mut, unused_assignments)]
 | 
			
		||||
fn main() {
 | 
			
		||||
 | 
			
		||||
    let networks = Network::create_subnet(&networking::ip::IpAddr::V4(127, 0, 0, 1), 23);
 | 
			
		||||
    let networks = Network::create_subnet(&networking::ip::IpAddr::V4(192, 222, 222, 222), 25);
 | 
			
		||||
    if networks.is_err() {
 | 
			
		||||
        println!("Hello!");
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
use std::str::FromStr;
 | 
			
		||||
use std::{str::FromStr, vec};
 | 
			
		||||
use ip::IpAddr;
 | 
			
		||||
 | 
			
		||||
pub mod ip;
 | 
			
		||||
@@ -51,7 +51,7 @@ impl Network {
 | 
			
		||||
    /// ```
 | 
			
		||||
    /// let networks = Network::create_subnet(&IpAddr::V4(127, 0, 0, 1), 32);
 | 
			
		||||
    /// ```
 | 
			
		||||
    pub fn create_subnet(network_address: &IpAddr, cidr: u8) -> Result<Vec<Network>, NetworkingErr> {
 | 
			
		||||
    pub fn create_subnet(network_address: &IpAddr, cidr: u8) -> Result<Vec<IpAddr>, NetworkingErr> {
 | 
			
		||||
        //Get number of host and network bits.
 | 
			
		||||
        let network_class = Network::get_network_class(network_address)?;
 | 
			
		||||
        let network_address = network_address.to_arr()?;
 | 
			
		||||
@@ -64,11 +64,36 @@ impl Network {
 | 
			
		||||
        
 | 
			
		||||
        let num_borrowed_bits = cidr - network_class as u8;
 | 
			
		||||
 | 
			
		||||
        //If no subnetting is required, just return the base address
 | 
			
		||||
        if num_borrowed_bits == 0 {
 | 
			
		||||
            unimplemented!();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Determine the starting network
 | 
			
		||||
        // Determine the networking gaps
 | 
			
		||||
        let mut base_network = network_address.clone();
 | 
			
		||||
        let most_sig_octet: u8 = match network_class {
 | 
			
		||||
            NetworkClass::A => 1,
 | 
			
		||||
            NetworkClass::B => 2,
 | 
			
		||||
            NetworkClass::C => 3
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        for i in most_sig_octet..4 {
 | 
			
		||||
            base_network[i as usize] = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Determine how many networks available
 | 
			
		||||
        // We know that this value is >0 at this point
 | 
			
		||||
        let num_networks = u8::pow(2, num_borrowed_bits as u32);
 | 
			
		||||
 | 
			
		||||
        // Determine the networking gaps
 | 
			
		||||
        let network_spacing: u8 = u8::pow(2, 8 - num_borrowed_bits as u32);
 | 
			
		||||
        
 | 
			
		||||
        let networks = vec![];
 | 
			
		||||
        //Create the subnets
 | 
			
		||||
        let mut networks = vec![];
 | 
			
		||||
        for i in 0..num_networks {
 | 
			
		||||
            networks.push(IpAddr::from_arr(&base_network.clone())?);
 | 
			
		||||
            base_network[most_sig_octet as usize] += network_spacing;
 | 
			
		||||
        }
 | 
			
		||||
        Ok(networks)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user