+}
+
+static int
+print_locator_in_locator_set(vat_main_t * vam, u8 filter)
+{
+ locator_set_msg_t * ls;
+ locator_msg_t * loc;
+ u8 * tmp_str = 0;
+ int i = 0, ret = 0;
+
+ vec_foreach(ls, vam->locator_set_msg) {
+ ret = lisp_locator_dump_send_msg(vam, ls->locator_set_index, filter);
+ if (ret) {
+ vec_free(ls->locator_set_name);
+ vec_free(vam->locator_msg);
+ vec_free(vam->locator_set_msg);
+ return ret;
+ }
+
+ tmp_str = format(0, "%=20s%=16d%s", ls->locator_set_name,
+ ls->locator_set_index,
+ vec_len(vam->locator_msg) ? "" : "\n");
+ i = 0;
+ vec_foreach(loc, vam->locator_msg) {
+ if (i) {
+ tmp_str = format(tmp_str, "%=37s", " ");
+ }
+ if (loc->local) {
+ tmp_str = format(tmp_str, "%=16d%=16d%=16d\n",
+ loc->sw_if_index,
+ loc->priority,
+ loc->weight);
+ } else {
+ tmp_str = format(tmp_str, "%=16U%=16d%=16d\n",
+ loc->is_ipv6 ? format_ip6_address :
+ format_ip4_address,
+ loc->ip_address,
+ loc->priority,
+ loc->weight);
+ }
+ i++;
+ }
+
+ fformat(vam->ofp, "%s", tmp_str);
+ vec_free(tmp_str);
+ vec_free(ls->locator_set_name);
+ vec_free(vam->locator_msg);
+ }
+
+ vec_free(vam->locator_set_msg);
+
+ return ret;
+}
+
+static int
+json_locator_in_locator_set(vat_main_t * vam, u8 filter)
+{
+ locator_set_msg_t * ls;
+ locator_msg_t * loc;
+ vat_json_node_t * node = NULL;
+ vat_json_node_t * locator_array;
+ vat_json_node_t * locator;
+ struct in6_addr ip6;
+ struct in_addr ip4;
+ int ret = 0;
+
+ if (!vec_len(vam->locator_set_msg)) {
+ /* just print [] */
+ vat_json_init_array(&vam->json_tree);
+ vat_json_print(vam->ofp, &vam->json_tree);
+ vam->json_tree.type = VAT_JSON_NONE;
+ return ret;
+ }
+
+ if (VAT_JSON_ARRAY != vam->json_tree.type) {
+ ASSERT(VAT_JSON_NONE == vam->json_tree.type);
+ vat_json_init_array(&vam->json_tree);
+ }
+
+ vec_foreach(ls, vam->locator_set_msg) {
+ ret = lisp_locator_dump_send_msg(vam, ls->locator_set_index, filter);
+ if (ret) {
+ vec_free(ls->locator_set_name);
+ vec_free(vam->locator_msg);
+ vec_free(vam->locator_set_msg);
+ vat_json_free(&vam->json_tree);
+ vam->json_tree.type = VAT_JSON_NONE;
+ return ret;
+ }
+
+ node = vat_json_array_add(&vam->json_tree);
+ vat_json_init_object(node);
+
+ vat_json_object_add_uint(node, "locator-set-index",
+ ls->locator_set_index);
+ vat_json_object_add_string_copy(node, "locator-set",
+ ls->locator_set_name);
+ locator_array = vat_json_object_add_list(node, "locator");
+ vec_foreach(loc, vam->locator_msg) {
+ locator = vat_json_array_add(locator_array);
+ vat_json_init_object(locator);
+ if (loc->local) {
+ vat_json_object_add_uint(locator, "locator-index",
+ loc->sw_if_index);
+ } else {
+ if (loc->is_ipv6) {
+ clib_memcpy(&ip6, loc->ip_address, sizeof(ip6));
+ vat_json_object_add_ip6(locator, "locator", ip6);
+ } else {
+ clib_memcpy(&ip4, loc->ip_address, sizeof(ip4));
+ vat_json_object_add_ip4(locator, "locator", ip4);
+ }
+ }
+ vat_json_object_add_uint(locator, "priority", loc->priority);
+ vat_json_object_add_uint(locator, "weight", loc->weight);
+ }
+
+ vec_free(ls->locator_set_name);
+ vec_free(vam->locator_msg);
+ }
+
+ vat_json_print(vam->ofp, &vam->json_tree);
+ vat_json_free(&vam->json_tree);
+ vam->json_tree.type = VAT_JSON_NONE;
+
+ vec_free(vam->locator_set_msg);
+
+ return ret;
+}
+
+static int
+get_locator_set_index_from_msg(vat_main_t * vam, u8 * locator_set,
+ u32 * locator_set_index)
+{
+ locator_set_msg_t * ls;
+ int ret = 0;
+
+ * locator_set_index = ~0;
+
+ if (!vec_len(vam->locator_set_msg)) {
+ return ret;
+ }
+
+ vec_foreach(ls, vam->locator_set_msg) {
+ if (!strcmp((char *) locator_set, (char *) ls->locator_set_name)) {
+ * locator_set_index = ls->locator_set_index;
+ vec_free(vam->locator_set_msg);
+ return ret;
+ }
+ }
+
+ vec_free(vam->locator_set_msg);
+
+ return ret;
+}
+
+static int
+get_locator_set_index(vat_main_t * vam, u8 * locator_set,
+ u32 * locator_set_index)
+{
+ vl_api_lisp_locator_set_dump_t *mp;
+ f64 timeout = ~0;
+
+ M(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
+ /* send it... */
+ S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_noprint_control_ping_t * mp;
+ M(NOPRINT_CONTROL_PING, noprint_control_ping);
+ S;
+ }
+
+ vam->noprint_msg = 1;
+ /* Wait for a reply... */
+ W_L({
+ get_locator_set_index_from_msg(vam, locator_set, locator_set_index);
+ vam->noprint_msg = 0;
+ })
+
+ /* NOTREACHED */
+ return 0;
+}
+
+static inline int
+lisp_locator_dump(vat_main_t * vam, u32 locator_set_index, u8 * locator_set,
+ u8 filter)
+{
+ int ret = 0;
+
+ ASSERT(vam);
+
+ if (!vam->json_output) {
+ fformat(vam->ofp, "%=20s%=16s%=16s\n",
+ "locator", "priority", "weight");
+ }
+
+ if (locator_set) {
+ ret = get_locator_set_index(vam, locator_set, &locator_set_index);
+ }
+
+ if (!ret && ~0 == locator_set_index) {
+ return -99;
+ }
+
+ ret = lisp_locator_dump_send_msg(vam, locator_set_index, filter);
+
+ return ret;
+}
+
+static int
+lisp_locator_set_dump(vat_main_t * vam, u8 filter)
+{
+ vl_api_lisp_locator_set_dump_t *mp;
+ f64 timeout = ~0;
+
+ if (!vam->json_output) {
+ fformat(vam->ofp, "%=20s%=16s%=16s%=16s%=16s\n",
+ "locator-set", "locator-set-index", "locator", "priority",
+ "weight");
+ }
+
+ vam->noprint_msg = 1;
+
+ M(LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump);
+
+ mp->filter = filter;
+
+ /* send it... */
+ S;
+
+ /* Use a control ping for synchronization */
+ {
+ vl_api_noprint_control_ping_t * mp;
+ M(NOPRINT_CONTROL_PING, noprint_control_ping);
+ S;
+ }
+
+ /* Wait for a reply... */
+ W_L({
+ if (vam->noprint_msg) {
+ if (!vam->json_output) {
+ print_locator_in_locator_set(vam, filter);
+ } else {
+ json_locator_in_locator_set(vam, filter);
+ }
+ }
+
+ vam->noprint_msg = 0;
+ });