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