LISP - fix bug in ip_prefix_normalize_ip6 36/2136/2
authorAndrej Kozemcak <akozemca@cisco.com>
Fri, 29 Jul 2016 13:18:14 +0000 (15:18 +0200)
committerAndrej Kozemcak <akozemca@cisco.com>
Fri, 29 Jul 2016 14:07:05 +0000 (16:07 +0200)
- fix bug
- refactoring code

Change-Id: I2c330f3fbdead567b65c889cfffc2562d99b61db
Signed-off-by: Andrej Kozemcak <akozemca@cisco.com>
vnet/vnet/lisp-cp/lisp_types.c

index b5c7c3e..753b229 100644 (file)
@@ -523,56 +523,72 @@ ip_address_set(ip_address_t * dst, void * src, u8 version)
   ip_addr_version(dst) = version;
 }
 
-void
-ip_prefix_normalize(ip_prefix_t * a)
+static void
+ip_prefix_normalize_ip4 (ip4_address_t * ip4, u8 preflen)
 {
-  ip_address_t * ip;
-  ip4_address_t * ip4;
-  ip6_address_t * ip6;
-  int preflen = ip_prefix_len(a);
   u32 mask = ~0;
-  u64 mask_6[2];
+
+  ASSERT (ip4);
+
+  if (32 <= preflen)
+   {
+     return;
+   }
+
+  mask = pow2_mask (preflen) << (32 - preflen);
+  mask = clib_host_to_net_u32 (mask);
+  ip4->data_u32 &= mask;
+}
+
+static void
+ip_prefix_normalize_ip6 (ip6_address_t * ip6, u8 preflen)
+{
+  u8 mask_6[16];
   u32 * m;
-  u32 j, i0, i1;
+  u8 j ,i0, i1;
 
-  ip = &ip_prefix_addr (a);
-  switch (ip_addr_version (ip))
-  {
-    case IP4:
-      if (32 <= preflen)
-        {
-          break;
-        }
+  ASSERT (ip6);
 
-      ip4 = &ip_addr_v4 (ip);
-      mask = pow2_mask (preflen) << (32 - preflen);
-      mask = clib_host_to_net_u32 (mask);
-      ip4->data_u32 &= mask;
-      break;
+  memset (mask_6, 0, sizeof (mask_6));
 
-    case IP6:
-      if (128 <= preflen)
-        {
-          break;
-        }
-      ip6 = &ip_addr_v6 (ip);
-      memset(mask_6, 0, sizeof(mask_6));
-      m = (u32 * ) mask_6;
+  if (128 <= preflen)
+   {
+     return;
+   }
 
-      i0 = preflen / 32;
-      i1 = preflen % 32;
-      for (j = 0; j < i0; j++)
-        {
-          m[j] = ~0;
-        }
+  i1 = preflen % 32;
+  i0 = preflen / 32;
+  m = (u32 * ) &mask_6[0];
 
-      if (i1)
-        {
-          m[i0] = clib_host_to_net_u32 (pow2_mask(i1) << (32 - i1));
-        }
+  for (j = 0; j < i0; j++)
+    {
+      m[j] = ~0;
+    }
+
+  if (i1)
+   {
+     m[i0] = clib_host_to_net_u32 (pow2_mask(i1) << (32 - i1));
+   }
+
+  for (j = 0; j < sizeof(mask_6); j++)
+    {
+      ip6->as_u8[j] &= mask_6[j];
+    }
+}
+
+void
+ip_prefix_normalize(ip_prefix_t * a)
+{
+  u8 preflen = ip_prefix_len(a);
 
-      ip6->as_u64[0] &= mask_6[0];
-      ip6->as_u64[1] &= mask_6[1];
+  switch (ip_prefix_version (a))
+  {
+    case IP4:
+      ip_prefix_normalize_ip4(&ip_prefix_v4(a), preflen);
+      break;
+
+    case IP6:
+      ip_prefix_normalize_ip6(&ip_prefix_v6(a), preflen);
       break;
 
     default: