ip: Replace Sematics for Interface IP addresses
[vpp.git] / src / vnet / ip / lookup.c
index a0cb28b..5d4e137 100644 (file)
  *
  */
 
-clib_error_t *
-ip_interface_address_add_del (ip_lookup_main_t * lm,
-                             u32 sw_if_index,
-                             void *addr_fib,
-                             u32 address_length,
-                             u32 is_del, u32 * result_if_address_index)
-{
-  vnet_main_t *vnm = vnet_get_main ();
-  ip_interface_address_t *a, *prev, *next;
-  uword *p = mhash_get (&lm->address_to_if_address_index, addr_fib);
-
-  vec_validate_init_empty (lm->if_address_pool_index_by_sw_if_index,
-                          sw_if_index, ~0);
-  a = p ? pool_elt_at_index (lm->if_address_pool, p[0]) : 0;
-
-  /* Verify given length. */
-  if ((a && (address_length != a->address_length)) ||
-      (address_length == 0) ||
-      (lm->is_ip6 && address_length > 128) ||
-      (!lm->is_ip6 && address_length > 32))
-    {
-      vnm->api_errno = VNET_API_ERROR_ADDRESS_LENGTH_MISMATCH;
-      return clib_error_create
-       ("%U wrong length (expected %d) for interface %U",
-        lm->format_address_and_length, addr_fib,
-        address_length, a ? a->address_length : -1,
-        format_vnet_sw_if_index_name, vnm, sw_if_index);
-    }
-
-  if (is_del)
-    {
-      if (!a)
-       {
-         vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index);
-         vnm->api_errno = VNET_API_ERROR_ADDRESS_NOT_FOUND_FOR_INTERFACE;
-         return clib_error_create ("%U not found for interface %U",
-                                   lm->format_address_and_length,
-                                   addr_fib, address_length,
-                                   format_vnet_sw_interface_name, vnm, si);
-       }
-
-      if (a->prev_this_sw_interface != ~0)
-       {
-         prev =
-           pool_elt_at_index (lm->if_address_pool,
-                              a->prev_this_sw_interface);
-         prev->next_this_sw_interface = a->next_this_sw_interface;
-       }
-      if (a->next_this_sw_interface != ~0)
-       {
-         next =
-           pool_elt_at_index (lm->if_address_pool,
-                              a->next_this_sw_interface);
-         next->prev_this_sw_interface = a->prev_this_sw_interface;
-
-         if (a->prev_this_sw_interface == ~0)
-           lm->if_address_pool_index_by_sw_if_index[sw_if_index] =
-             a->next_this_sw_interface;
-       }
-
-      if ((a->next_this_sw_interface == ~0)
-         && (a->prev_this_sw_interface == ~0))
-       lm->if_address_pool_index_by_sw_if_index[sw_if_index] = ~0;
-
-      mhash_unset (&lm->address_to_if_address_index, addr_fib,
-                  /* old_value */ 0);
-      pool_put (lm->if_address_pool, a);
-
-      if (result_if_address_index)
-       *result_if_address_index = ~0;
-    }
-
-  else if (!a)
-    {
-      u32 pi;                  /* previous index */
-      u32 ai;
-      u32 hi;                  /* head index */
-
-      pool_get (lm->if_address_pool, a);
-      clib_memset (a, ~0, sizeof (a[0]));
-      ai = a - lm->if_address_pool;
-
-      hi = pi = lm->if_address_pool_index_by_sw_if_index[sw_if_index];
-      prev = 0;
-      while (pi != (u32) ~ 0)
-       {
-         prev = pool_elt_at_index (lm->if_address_pool, pi);
-         pi = prev->next_this_sw_interface;
-       }
-      pi = prev ? prev - lm->if_address_pool : (u32) ~ 0;
-
-      a->address_key = mhash_set (&lm->address_to_if_address_index,
-                                 addr_fib, ai, /* old_value */ 0);
-      a->address_length = address_length;
-      a->sw_if_index = sw_if_index;
-      a->flags = 0;
-      a->prev_this_sw_interface = pi;
-      a->next_this_sw_interface = ~0;
-      if (prev)
-       prev->next_this_sw_interface = ai;
-
-      lm->if_address_pool_index_by_sw_if_index[sw_if_index] =
-       (hi != ~0) ? hi : ai;
-      if (result_if_address_index)
-       *result_if_address_index = ai;
-    }
-  else
-    {
-      if (sw_if_index != a->sw_if_index)
-       {
-         if (result_if_address_index)
-           *result_if_address_index = ~0;
-         vnm->api_errno = VNET_API_ERROR_DUPLICATE_IF_ADDRESS;
-         return clib_error_create
-           ("Prefix %U already found on interface %U",
-            lm->format_address_and_length, addr_fib, address_length,
-            format_vnet_sw_if_index_name, vnm, a->sw_if_index);
-       }
-
-      if (result_if_address_index)
-       *result_if_address_index = a - lm->if_address_pool;
-    }
-
-  return /* no error */ 0;
-}
-
 static clib_error_t *
 ip_sw_interface_add_del (vnet_main_t * vnm, u32 sw_if_index, u32 is_add)
 {