+static void
+send_lisp_locator_details (lisp_cp_main_t *lcm,
+ locator_t *loc,
+ unix_shared_memory_queue_t *q,
+ u32 context)
+{
+ vl_api_lisp_locator_details_t *rmp;
+
+ rmp = vl_msg_api_alloc (sizeof (*rmp));
+ memset (rmp, 0, sizeof (*rmp));
+ rmp->_vl_msg_id = ntohs(VL_API_LISP_LOCATOR_DETAILS);
+ rmp->context = context;
+
+ rmp->local = loc->local;
+ if (loc->local) {
+ rmp->sw_if_index = ntohl(loc->sw_if_index);
+ } else {
+ rmp->is_ipv6 = gid_address_ip_version(&loc->address);
+ ip_address_copy_addr(rmp->ip_address, &gid_address_ip(&loc->address));
+ }
+ rmp->priority = loc->priority;
+ rmp->weight = loc->weight;
+
+ vl_msg_api_send_shmem (q, (u8 *)&rmp);
+}
+
+static void
+vl_api_lisp_locator_dump_t_handler (vl_api_lisp_locator_dump_t *mp)
+{
+ unix_shared_memory_queue_t * q = 0;
+ lisp_cp_main_t * lcm = vnet_lisp_cp_get_main();
+ locator_set_t * lsit = 0;
+ locator_t * loc = 0;
+ u32 ls_index = ~0, * locit = 0;
+ u8 filter;
+
+ q = vl_api_client_index_to_input_queue (mp->client_index);
+ if (q == 0) {
+ return;
+ }
+
+ ls_index = htonl(mp->locator_set_index);
+
+ lsit = pool_elt_at_index(lcm->locator_set_pool, ls_index);
+
+ filter = mp->filter;
+ if (filter && !((1 == filter && lsit->local) ||
+ (2 == filter && !lsit->local))) {
+ return;
+ }
+
+ vec_foreach(locit, lsit->locator_indices) {
+ loc = pool_elt_at_index(lcm->locator_pool, locit[0]);
+ send_lisp_locator_details(lcm, loc, q, mp->context);
+ };
+}
+