1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/// IPv4 の範囲をサブネットに分割する際に、 /// CIDR ブロックをどのサイズで切るか決めるためのユーティリティ。 /// 範囲[current, end]の中で取れる最大の CIDR ブロックサイズを返す。 /// 例: currentが192.168.0.0(=0xc0a80000), endが192.168.0.255(=0xc0a800ff)なら/24など pub fn largest_ipv4_block(current: u32, end: u32) -> u8 { let tz = current.trailing_zeros(); let span = (end - current + 1).ilog2_sub1(); let max_block = tz.min(span); (32 - max_block) as u8 } /// u32用のヘルパートレイト。 /// RIRが出力するIPv4範囲の計算に利用する。 pub trait ILog2Sub1 { fn ilog2_sub1(&self) -> u32; } impl ILog2Sub1 for u32 { fn ilog2_sub1(&self) -> u32 { if *self == 0 { 0 } else { // 2のべき乗の範囲を求めるためのヘルパー 31 - self.leading_zeros() } } }