session: add support for proxying apps
[vpp.git] / src / vnet / ip / ip.c
index e6d9934..0c4687d 100644 (file)
@@ -190,6 +190,8 @@ ip4_preflen_to_mask (u8 pref_len, ip4_address_t * ip)
 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)));
 }
 
@@ -228,15 +230,20 @@ ip6_prefix_max_address_host_order (ip6_address_t * ip, u8 plen,
                                   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;
     }
 }
@@ -246,7 +253,7 @@ ip6_mask_to_preflen (ip6_address_t * mask)
 {
   u8 first1, first0;
   if (mask->as_u64[0] == 0 && mask->as_u64[1] == 0)
-    return 128;
+    return 0;
   first1 = log2_first_set (mask->as_u64[1]);
   first0 = log2_first_set (mask->as_u64[0]);