#include <vnet/vnet_msg_enum.h>
+#define vl_api_remote_locator_t_endian vl_noop_handler
+#define vl_api_remote_locator_t_print vl_noop_handler
+#define vl_api_local_locator_t_endian vl_noop_handler
+#define vl_api_local_locator_t_print vl_noop_handler
+
+#define vl_api_lisp_add_del_locator_set_t_endian vl_noop_handler
+#define vl_api_lisp_add_del_locator_set_t_print vl_noop_handler
+#define vl_api_lisp_add_del_remote_mapping_t_endian vl_noop_handler
+#define vl_api_lisp_add_del_remote_mapping_t_print vl_noop_handler
+
+#define vl_api_one_add_del_locator_set_t_endian vl_noop_handler
+#define vl_api_one_add_del_locator_set_t_print vl_noop_handler
+#define vl_api_one_add_del_remote_mapping_t_endian vl_noop_handler
+#define vl_api_one_add_del_remote_mapping_t_print vl_noop_handler
+
#define vl_typedefs /* define message structures */
#include <vnet/vnet_all_api_h.h>
#undef vl_typedefs
_(LISP_GET_MAP_REQUEST_ITR_RLOCS, lisp_get_map_request_itr_rlocs) \
_(SHOW_LISP_PITR, show_lisp_pitr) \
_(SHOW_LISP_MAP_REQUEST_MODE, show_lisp_map_request_mode) \
-
-/** Used for transferring locators via VPP API */
-/* *INDENT-OFF* */
-typedef CLIB_PACKED (struct {
- u8 is_ip4; /**< is locator an IPv4 address */
- u8 priority; /**< locator priority */
- u8 weight; /**< locator weight */
- u8 addr[16]; /**< IPv4/IPv6 address */
-}) rloc_t;
-/* *INDENT-ON* */
-
-/** Used for transferring locators via VPP API */
-/* *INDENT-OFF* */
-typedef CLIB_PACKED (struct {
- u32 sw_if_index; /**< locator sw_if_index */
- u8 priority; /**< locator priority */
- u8 weight; /**< locator weight */
-}) ls_locator_t;
-/* *INDENT-ON* */
+_(LISP_USE_PETR, lisp_use_petr) \
+_(SHOW_LISP_USE_PETR, show_lisp_use_petr) \
static locator_t *
-unformat_lisp_locs (void *rmt_locs, u32 rloc_num)
+unformat_lisp_locs (vl_api_remote_locator_t * rmt_locs, u32 rloc_num)
{
u32 i;
locator_t *locs = 0, loc;
- rloc_t *r;
+ vl_api_remote_locator_t *r;
for (i = 0; i < rloc_num; i++)
{
/* remote locators */
- r = &((rloc_t *) rmt_locs)[i];
+ r = &rmt_locs[i];
memset (&loc, 0, sizeof (loc));
gid_address_ip_set (&loc.address, &r->addr, r->is_ip4 ? IP4 : IP6);
int rv = 0;
vnet_lisp_add_del_locator_set_args_t _a, *a = &_a;
locator_t locator;
- ls_locator_t *ls_loc;
+ vl_api_local_locator_t *ls_loc;
u32 ls_index = ~0, locator_num;
u8 *locator_name = NULL;
int i;
memset (a, 0, sizeof (a[0]));
+ mp->locator_set_name[63] = 0;
locator_name = format (0, "%s", mp->locator_set_name);
+ vec_terminate_c_string (locator_name);
a->name = locator_name;
a->is_add = mp->is_add;
memset (&locator, 0, sizeof (locator));
for (i = 0; i < locator_num; i++)
{
- ls_loc = &((ls_locator_t *) mp->locators)[i];
+ ls_loc = &mp->locators[i];
VALIDATE_SW_IF_INDEX (ls_loc);
locator.sw_if_index = htonl (ls_loc->sw_if_index);
locator.local = 1;
vec_add1 (locators, locator);
+ mp->locator_set_name[63] = 0;
locator_name = format (0, "%s", mp->locator_set_name);
+ vec_terminate_c_string (locator_name);
a->name = locator_name;
a->locators = locators;
if (rv)
goto out;
+ mp->locator_set_name[63] = 0;
name = format (0, "%s", mp->locator_set_name);
+ vec_terminate_c_string (name);
p = hash_get_mem (lcm->locator_set_index_by_name, name);
if (!p)
{
u8 *ls_name = 0;
ls_name = format (0, "%s", mp->ls_name);
+ vec_terminate_c_string (ls_name);
rv = vnet_lisp_pitr_set_locator_set (ls_name, mp->is_add);
vec_free (ls_name);
REPLY_MACRO (VL_API_LISP_PITR_SET_LOCATOR_SET_REPLY);
}
+static void
+vl_api_lisp_use_petr_t_handler (vl_api_lisp_use_petr_t * mp)
+{
+ vl_api_lisp_use_petr_reply_t *rmp;
+ int rv = 0;
+ ip_address_t addr;
+
+ ip_address_set (&addr, &mp->address, mp->is_ip4 ? IP4 : IP6);
+ rv = vnet_lisp_use_petr (&addr, mp->is_add);
+
+ REPLY_MACRO (VL_API_LISP_USE_PETR_REPLY);
+}
+
+static void
+vl_api_show_lisp_use_petr_t_handler (vl_api_show_lisp_use_petr_t * mp)
+{
+ unix_shared_memory_queue_t *q = NULL;
+ vl_api_show_lisp_use_petr_reply_t *rmp = NULL;
+ lisp_cp_main_t *lcm = vnet_lisp_cp_get_main ();
+ mapping_t *m;
+ locator_set_t *ls = 0;
+ int rv = 0;
+ locator_t *loc = 0;
+ u8 status = 0;
+ gid_address_t addr;
+
+ q = vl_api_client_index_to_input_queue (mp->client_index);
+ if (q == 0)
+ {
+ return;
+ }
+
+ memset (&addr, 0, sizeof (addr));
+ status = lcm->flags & LISP_FLAG_USE_PETR;
+ if (status)
+ {
+ m = pool_elt_at_index (lcm->mapping_pool, lcm->petr_map_index);
+ if (~0 != m->locator_set_index)
+ {
+ ls =
+ pool_elt_at_index (lcm->locator_set_pool, m->locator_set_index);
+ loc = pool_elt_at_index (lcm->locator_pool, ls->locator_indices[0]);
+ gid_address_copy (&addr, &loc->address);
+ }
+ }
+
+ /* *INDENT-OFF* */
+ REPLY_MACRO2 (VL_API_SHOW_LISP_USE_PETR_REPLY,
+ {
+ rmp->status = status;
+ ip_address_t *ip = &gid_address_ip (&addr);
+ switch (ip_addr_version (ip))
+ {
+ case IP4:
+ clib_memcpy (rmp->address, &ip_addr_v4 (ip),
+ sizeof (ip_addr_v4 (ip)));
+ break;
+
+ case IP6:
+ clib_memcpy (rmp->address, &ip_addr_v6 (ip),
+ sizeof (ip_addr_v6 (ip)));
+ break;
+
+ default:
+ ASSERT (0);
+ }
+ rmp->is_ip4 = (gid_address_ip_version (&addr) == IP4);
+ });
+ /* *INDENT-ON* */
+}
+
static void
vl_api_lisp_add_del_map_request_itr_rlocs_t_handler
(vl_api_lisp_add_del_map_request_itr_rlocs_t * mp)
u8 *locator_set_name = NULL;
vnet_lisp_add_del_mreq_itr_rloc_args_t _a, *a = &_a;
+ mp->locator_set_name[63] = 0;
locator_set_name = format (0, "%s", mp->locator_set_name);
+ vec_terminate_c_string (locator_set_name);
a->is_add = mp->is_add;
a->locator_set_name = locator_set_name;
if (!mp->is_add)
{
vnet_lisp_add_del_adjacency_args_t _a, *a = &_a;
+ memset (a, 0, sizeof (*a));
gid_address_copy (&a->reid, eid);
a->is_add = 0;
rv = vnet_lisp_add_del_adjacency (a);
/* NOTE: for now this works as a static remote mapping, i.e.,
* not authoritative and ttl infinite. */
- rv = vnet_lisp_add_del_mapping (eid, rlocs, mp->action, 0, ~0,
- mp->is_add, 1 /* is_static */ , 0);
+ if (mp->is_add)
+ {
+ vnet_lisp_add_del_mapping_args_t _m_args, *m_args = &_m_args;
+ memset (m_args, 0, sizeof (m_args[0]));
+ gid_address_copy (&m_args->eid, eid);
+ m_args->action = mp->action;
+ m_args->is_static = 1;
+ m_args->ttl = ~0;
+ m_args->authoritative = 0;
+ rv = vnet_lisp_add_mapping (m_args, rlocs, NULL, NULL);
+ }
+ else
+ {
+ rv = vnet_lisp_del_mapping (eid, NULL);
+ }
if (mp->del_all)
vnet_lisp_clear_all_remote_adjacencies ();
/* make sure we get a proper C-string */
mp->ls_name[sizeof (mp->ls_name) - 1] = 0;
ls_name = format (0, "%s", mp->ls_name);
+ vec_terminate_c_string (ls_name);
p = hash_get_mem (lcm->locator_set_index_by_name, ls_name);
if (!p)
goto out;
case FID_ADDR_MAC:
return 2;
+ case FID_ADDR_NSH:
+ return 3;
}
return ~0;
return;
}
+ /* don't send PITR generated mapping */
+ if (mapit->pitr_set)
+ return;
+
gid = &mapit->eid;
ip_prefix = &gid_address_ippref (gid);
mac = gid_address_mac (gid);
vl_api_lisp_adjacencies_get_reply_t *rmp = 0;
lisp_adjacency_t *adjs = 0;
int rv = 0;
- vl_api_lisp_adjacency_t a;
u32 size = ~0;
u32 vni = clib_net_to_host_u32 (mp->vni);
adjs = vnet_lisp_adjacencies_get_by_vni (vni);
- size = vec_len (adjs) * sizeof (a);
+ size = vec_len (adjs) * sizeof (vl_api_lisp_adjacency_t);
/* *INDENT-OFF* */
REPLY_MACRO4 (VL_API_LISP_ADJACENCIES_GET_REPLY, size,