u32
ip4_mask_to_preflen (ip4_address_t * mask)
{
+ if (mask->as_u32 == 0)
+ return 0;
return (32 - log2_first_set (clib_net_to_host_u32 (mask->as_u32)));
}
ip6_address_t * res)
{
u64 not_mask;
- if (plen <= 64)
+ if (plen == 0)
{
- not_mask = (1 << (64 - plen)) - 1;
+ res->as_u64[0] = 0xffffffffffffffffL;
+ res->as_u64[1] = 0xffffffffffffffffL;
+ }
+ else if (plen <= 64)
+ {
+ not_mask = ((u64) 1 << (64 - plen)) - 1;
res->as_u64[0] = clib_net_to_host_u64 (ip->as_u64[0]) + not_mask;
res->as_u64[1] = 0xffffffffffffffffL;
}
else
{
- not_mask = (1 << (128 - plen)) - 1;
+ not_mask = ((u64) 1 << (128 - plen)) - 1;
res->as_u64[1] = clib_net_to_host_u64 (ip->as_u64[1]) + not_mask;
}
}
{
u8 first1, first0;
if (mask->as_u64[0] == 0 && mask->as_u64[1] == 0)
- return 128;
- first1 = log2_first_set (mask->as_u64[1]);
- first0 = log2_first_set (mask->as_u64[0]);
+ return 0;
+ first1 = log2_first_set (clib_net_to_host_u64 (mask->as_u64[1]));
+ first0 = log2_first_set (clib_net_to_host_u64 (mask->as_u64[0]));
if (first1 != 0)
return 128 - first1;