diff options
author | Filip Tehlar <ftehlar@cisco.com> | 2016-09-02 12:14:31 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2016-09-13 07:26:17 +0000 |
commit | c5bb0d6667ca36affe9fb30e58c852e4f1b47f93 (patch) | |
tree | 685a3956fa65dc287914bc860be1b8845d21593e /vpp-api-test/vat/api_format.c | |
parent | 22aa3e970da0f0c772c5a16103a5dcf1f2875285 (diff) |
VPP-376: Refactor LISP dump API + VAT
- refactor VAT so it won't cache data
- remove unused filter flag from locator dump API call
- json structure changed for locator and EID table dump calls
- remote mapping VAT cli now accepts string for negative mapping action
Change-Id: I776fb50659aaa7e98ad93715d282a83f78287344
Signed-off-by: Filip Tehlar <ftehlar@cisco.com>
Diffstat (limited to 'vpp-api-test/vat/api_format.c')
-rw-r--r-- | vpp-api-test/vat/api_format.c | 1126 |
1 files changed, 230 insertions, 896 deletions
diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c index 0df2051e6c7..e29b47e3862 100644 --- a/vpp-api-test/vat/api_format.c +++ b/vpp-api-test/vat/api_format.c @@ -1315,53 +1315,6 @@ static void vl_api_control_ping_reply_t_handler_json vam->result_ready = 1; } -static void vl_api_noprint_control_ping_reply_t_handler - (vl_api_noprint_control_ping_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); - if (vam->async_mode) - { - vam->async_errors += (retval < 0); - } - else - { - vam->retval = retval; - vam->result_ready = 1; - } -} - -static void vl_api_noprint_control_ping_reply_t_handler_json - (vl_api_noprint_control_ping_reply_t * mp) -{ - vat_main_t *vam = &vat_main; - i32 retval = ntohl (mp->retval); - - if (vam->noprint_msg) - { - vam->retval = retval; - vam->result_ready = 1; - return; - } - - if (VAT_JSON_NONE != vam->json_tree.type) - { - vat_json_print (vam->ofp, &vam->json_tree); - vat_json_free (&vam->json_tree); - vam->json_tree.type = VAT_JSON_NONE; - } - else - { - /* just print [] */ - vat_json_init_array (&vam->json_tree); - vat_json_print (vam->ofp, &vam->json_tree); - vam->json_tree.type = VAT_JSON_NONE; - } - - vam->retval = retval; - vam->result_ready = 1; -} - static void vl_api_l2_flags_reply_t_handler (vl_api_l2_flags_reply_t * mp) { @@ -2277,47 +2230,23 @@ static void vl_api_lisp_locator_details_t_handler (vl_api_lisp_locator_details_t * mp) { vat_main_t *vam = &vat_main; - locator_msg_t loc; - u8 *tmp_str = 0; + u8 *s = 0; - memset (&loc, 0, sizeof (loc)); - if (vam->noprint_msg) + if (mp->local) { - loc.local = mp->local; - loc.priority = mp->priority; - loc.weight = mp->weight; - if (loc.local) - { - loc.sw_if_index = ntohl (mp->sw_if_index); - } - else - { - loc.is_ipv6 = mp->is_ipv6; - clib_memcpy (loc.ip_address, mp->ip_address, - sizeof (loc.ip_address)); - } - vec_add1 (vam->locator_msg, loc); + s = format (s, "%=16d%=16d%=16d\n", + ntohl (mp->sw_if_index), mp->priority, mp->weight); } else { - if (mp->local) - { - tmp_str = format (tmp_str, "%=16d%=16d%=16d\n", - ntohl (mp->sw_if_index), - mp->priority, mp->weight); - } - else - { - tmp_str = format (tmp_str, "%=16U%=16d%=16d\n", - mp->is_ipv6 ? format_ip6_address : - format_ip4_address, - mp->ip_address, mp->priority, mp->weight); - } - - fformat (vam->ofp, "%s", tmp_str); - - vec_free (tmp_str); + s = format (s, "%=16U%=16d%=16d\n", + mp->is_ipv6 ? format_ip6_address : + format_ip4_address, + mp->ip_address, mp->priority, mp->weight); } + + fformat (vam->ofp, "%v", s); + vec_free (s); } static void @@ -2326,59 +2255,37 @@ vl_api_lisp_locator_details_t_handler_json (vl_api_lisp_locator_details_t * { vat_main_t *vam = &vat_main; vat_json_node_t *node = NULL; - locator_msg_t loc; struct in6_addr ip6; struct in_addr ip4; - memset (&loc, 0, sizeof (loc)); - if (vam->noprint_msg) - { - loc.local = mp->local; - loc.priority = mp->priority; - loc.weight = mp->weight; - if (loc.local) - { - loc.sw_if_index = ntohl (mp->sw_if_index); - } - else - { - loc.is_ipv6 = mp->is_ipv6; - clib_memcpy (loc.ip_address, mp->ip_address, - sizeof (loc.ip_address)); - } - vec_add1 (vam->locator_msg, loc); - return; - } - if (VAT_JSON_ARRAY != vam->json_tree.type) { ASSERT (VAT_JSON_NONE == vam->json_tree.type); vat_json_init_array (&vam->json_tree); } node = vat_json_array_add (&vam->json_tree); - vat_json_init_object (node); + vat_json_object_add_uint (node, "local", mp->local ? 1 : 0); + vat_json_object_add_uint (node, "priority", mp->priority); + vat_json_object_add_uint (node, "weight", mp->weight); + if (mp->local) - { - vat_json_object_add_uint (node, "locator_index", - ntohl (mp->sw_if_index)); - } + vat_json_object_add_uint (node, "sw_if_index", + clib_net_to_host_u32 (mp->sw_if_index)); else { if (mp->is_ipv6) { clib_memcpy (&ip6, mp->ip_address, sizeof (ip6)); - vat_json_object_add_ip6 (node, "locator", ip6); + vat_json_object_add_ip6 (node, "address", ip6); } else { clib_memcpy (&ip4, mp->ip_address, sizeof (ip4)); - vat_json_object_add_ip4 (node, "locator", ip4); + vat_json_object_add_ip4 (node, "address", ip4); } } - vat_json_object_add_uint (node, "priority", mp->priority); - vat_json_object_add_uint (node, "weight", mp->weight); } static void @@ -2386,11 +2293,13 @@ vl_api_lisp_locator_set_details_t_handler (vl_api_lisp_locator_set_details_t * mp) { vat_main_t *vam = &vat_main; - locator_set_msg_t ls; + u8 *ls_name = 0; - ls.locator_set_index = ntohl (mp->locator_set_index); - ls.locator_set_name = format (0, "%s", mp->locator_set_name); - vec_add1 (vam->locator_set_msg, ls); + ls_name = format (0, "%s", mp->ls_name); + + fformat (vam->ofp, "%=10d%=15v\n", clib_net_to_host_u32 (mp->ls_index), + ls_name); + vec_free (ls_name); } static void @@ -2398,37 +2307,88 @@ static void (vl_api_lisp_locator_set_details_t * mp) { vat_main_t *vam = &vat_main; - locator_set_msg_t ls; + vat_json_node_t *node = 0; + u8 *ls_name = 0; + + ls_name = format (0, "%s", mp->ls_name); + vec_add1 (ls_name, 0); + + if (VAT_JSON_ARRAY != vam->json_tree.type) + { + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); + } + node = vat_json_array_add (&vam->json_tree); - ls.locator_set_index = ntohl (mp->locator_set_index); - ls.locator_set_name = format (0, "%s", mp->locator_set_name); - vec_add1 (vam->locator_set_msg, ls); + vat_json_init_object (node); + vat_json_object_add_string_copy (node, "ls_name", ls_name); + vat_json_object_add_uint (node, "ls_index", + clib_net_to_host_u32 (mp->ls_index)); + vec_free (ls_name); } -static void -add_lisp_eid_table_entry (vat_main_t * vam, - vl_api_lisp_eid_table_details_t * mp) +static u8 * +format_lisp_flat_eid (u8 * s, va_list * args) { - eid_table_t eid_table; + u32 type = va_arg (*args, u32); + u8 *eid = va_arg (*args, u8 *); + u32 eid_len = va_arg (*args, u32); - memset (&eid_table, 0, sizeof (eid_table)); - eid_table.is_local = mp->is_local; - eid_table.locator_set_index = clib_net_to_host_u32 (mp->locator_set_index); - eid_table.eid_type = mp->eid_type; - eid_table.vni = clib_net_to_host_u32 (mp->vni); - eid_table.eid_prefix_len = mp->eid_prefix_len; - eid_table.ttl = clib_net_to_host_u32 (mp->ttl); - eid_table.action = mp->action; - eid_table.authoritative = mp->authoritative; - clib_memcpy (eid_table.eid, mp->eid, sizeof (eid_table.eid)); - vec_add1 (vam->eid_tables, eid_table); + switch (type) + { + case 0: + return format (s, "%U/%d", format_ip4_address, eid, eid_len); + case 1: + return format (s, "%U/%d", format_ip6_address, eid, eid_len); + case 2: + return format (s, "%U", format_ethernet_address, eid); + } + return 0; +} + +static u8 * +format_lisp_eid_vat (u8 * s, va_list * args) +{ + u32 type = va_arg (*args, u32); + u8 *eid = va_arg (*args, u8 *); + u32 eid_len = va_arg (*args, u32); + u8 *seid = va_arg (*args, u8 *); + u32 seid_len = va_arg (*args, u32); + u32 is_src_dst = va_arg (*args, u32); + + if (is_src_dst) + s = format (s, "%U|", format_lisp_flat_eid, type, seid, seid_len); + + s = format (s, "%U", format_lisp_flat_eid, type, eid, eid_len); + + return s; } static void vl_api_lisp_eid_table_details_t_handler (vl_api_lisp_eid_table_details_t * mp) { vat_main_t *vam = &vat_main; - add_lisp_eid_table_entry (vam, mp); + u8 *s = 0, *eid = 0; + + if (~0 == mp->locator_set_index) + s = format (0, "action: %d", mp->action); + else + s = format (0, "%d", clib_net_to_host_u32 (mp->locator_set_index)); + + eid = format (0, "%U", format_lisp_eid_vat, + mp->eid_type, + mp->eid, + mp->eid_prefix_len, + mp->seid, mp->seid_prefix_len, mp->is_src_dst); + vec_add1 (eid, 0); + + fformat (vam->ofp, "[%d] %-35s%-20s%-30s%-20d%-d\n", + clib_net_to_host_u32 (mp->vni), + eid, + mp->is_local ? "local" : "remote", + s, clib_net_to_host_u32 (mp->ttl), mp->authoritative); + vec_free (s); + vec_free (eid); } static void @@ -2436,7 +2396,35 @@ vl_api_lisp_eid_table_details_t_handler_json (vl_api_lisp_eid_table_details_t * mp) { vat_main_t *vam = &vat_main; - add_lisp_eid_table_entry (vam, mp); + vat_json_node_t *node = 0; + u8 *eid = 0; + + if (VAT_JSON_ARRAY != vam->json_tree.type) + { + ASSERT (VAT_JSON_NONE == vam->json_tree.type); + vat_json_init_array (&vam->json_tree); + } + node = vat_json_array_add (&vam->json_tree); + + vat_json_init_object (node); + if (~0 == mp->locator_set_index) + vat_json_object_add_uint (node, "action", mp->action); + else + vat_json_object_add_uint (node, "locator_set_index", + clib_net_to_host_u32 (mp->locator_set_index)); + + vat_json_object_add_uint (node, "is_local", mp->is_local ? 1 : 0); + eid = format (0, "%U", format_lisp_eid_vat, + mp->eid_type, + mp->eid, + mp->eid_prefix_len, + mp->seid, mp->seid_prefix_len, mp->is_src_dst); + vec_add1 (eid, 0); + vat_json_object_add_string_copy (node, "eid", eid); + vat_json_object_add_uint (node, "vni", clib_net_to_host_u32 (mp->vni)); + vat_json_object_add_uint (node, "ttl", clib_net_to_host_u32 (mp->ttl)); + vat_json_object_add_uint (node, "authoritative", (mp->authoritative)); + vec_free (eid); } static void @@ -3477,7 +3465,6 @@ _(SW_INTERFACE_DETAILS, sw_interface_details) \ _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ _(SW_INTERFACE_SET_FLAGS_REPLY, sw_interface_set_flags_reply) \ _(CONTROL_PING_REPLY, control_ping_reply) \ -_(NOPRINT_CONTROL_PING_REPLY, noprint_control_ping_reply) \ _(CLI_REPLY, cli_reply) \ _(CLI_INBAND_REPLY, cli_inband_reply) \ _(SW_INTERFACE_ADD_DEL_ADDRESS_REPLY, \ @@ -3712,21 +3699,6 @@ do { \ return -99; \ } while(0); -/* W_L: wait for results, with timeout */ -#define W_L(body) \ -do { \ - timeout = vat_time_now (vam) + 1.0; \ - \ - while (vat_time_now (vam) < timeout) { \ - if (vam->result_ready == 1) { \ - (body); \ - return (vam->retval); \ - } \ - } \ - vam->noprint_msg = 0; \ - return -99; \ -} while(0); - typedef struct { u8 *name; @@ -12525,6 +12497,35 @@ api_lisp_eid_table_add_del_map (vat_main_t * vam) return 0; } +uword +unformat_negative_mapping_action (unformat_input_t * input, va_list * args) +{ + u32 *action = va_arg (*args, u32 *); + u8 *s = 0; + + if (unformat (input, "%s", &s)) + { + if (!strcmp ((char *) s, "no-action")) + action[0] = 0; + else if (!strcmp ((char *) s, "natively-forward")) + action[0] = 1; + else if (!strcmp ((char *) s, "send-map-request")) + action[0] = 2; + else if (!strcmp ((char *) s, "drop")) + action[0] = 3; + else + { + clib_warning ("invalid action: '%s'", s); + action[0] = 3; + } + } + else + return 0; + + vec_free (s); + return 1; +} + /** * Add/del remote mapping to/from LISP control plane * @@ -12538,10 +12539,9 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) vl_api_lisp_add_del_remote_mapping_t *mp; f64 timeout = ~0; u32 vni = 0; - //TODO: seid need remove lisp_eid_vat_t _eid, *eid = &_eid; lisp_eid_vat_t _seid, *seid = &_seid; - u8 is_add = 1, del_all = 0, eid_set = 0; + u8 is_add = 1, del_all = 0, eid_set = 0, seid_set = 0; u32 action = ~0, p, w; ip4_address_t rloc4; ip6_address_t rloc6; @@ -12564,13 +12564,13 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) { is_add = 1; } - else if (unformat (input, "deid %U", unformat_lisp_eid_vat, eid)) + else if (unformat (input, "eid %U", unformat_lisp_eid_vat, eid)) { eid_set = 1; } - else if (unformat (input, "seid %U", unformat_lisp_eid_vat, &seid)) + else if (unformat (input, "seid %U", unformat_lisp_eid_vat, seid)) { - //TODO: Need remove, but first must be remove from CSIT test + seid_set = 1; } else if (unformat (input, "vni %d", &vni)) { @@ -12600,7 +12600,8 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) vec_add1 (rlocs, rloc); curr_rloc = &rlocs[vec_len (rlocs) - 1]; } - else if (unformat (input, "action %d", &action)) + else if (unformat (input, "action %U", + unformat_negative_mapping_action, &action)) { ; } @@ -12627,10 +12628,13 @@ api_lisp_add_del_remote_mapping (vat_main_t * vam) mp->is_add = is_add; mp->vni = htonl (vni); mp->action = (u8) action; + mp->is_src_dst = seid_set; mp->eid_len = eid->len; + mp->seid_len = seid->len; mp->del_all = del_all; mp->eid_type = eid->type; lisp_eid_put_vat (mp->eid, eid->addr, eid->type); + lisp_eid_put_vat (mp->seid, seid->addr, seid->type); mp->rloc_num = clib_host_to_net_u32 (vec_len (rlocs)); clib_memcpy (mp->rlocs, rlocs, (sizeof (rloc_t) * vec_len (rlocs))); @@ -12913,320 +12917,73 @@ api_lisp_add_del_map_request_itr_rlocs (vat_main_t * vam) } static int -lisp_locator_dump_send_msg (vat_main_t * vam, u32 locator_set_index, - u8 filter) +api_lisp_locator_dump (vat_main_t * vam) { + unformat_input_t *input = vam->input; vl_api_lisp_locator_dump_t *mp; f64 timeout = ~0; + u8 is_index_set = 0, is_name_set = 0; + u8 *ls_name = 0; + u32 ls_index = ~0; - M (LISP_LOCATOR_DUMP, lisp_locator_dump); - - mp->locator_set_index = htonl (locator_set_index); - 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; -} - -static inline void -clean_locator_set_message (vat_main_t * vam) -{ - locator_set_msg_t *ls = 0; - - vec_foreach (ls, vam->locator_set_msg) - { - vec_free (ls->locator_set_name); - } - - vec_free (vam->locator_set_msg); -} - -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 (vam->locator_msg); - clean_locator_set_message (vam); - 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) + /* Parse args required to build the message */ + while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (i) - { - tmp_str = format (tmp_str, "%=37s", " "); - } - if (loc->local) + if (unformat (input, "ls_name %_%v%_", &ls_name)) { - tmp_str = format (tmp_str, "%=16d%=16d%=16d\n", - loc->sw_if_index, loc->priority, loc->weight); + is_name_set = 1; } - 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 (vam->locator_msg); - } - - clean_locator_set_message (vam); - - 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) + else if (unformat (input, "ls_index %d", &ls_index)) { - vat_json_object_add_uint (locator, "locator-index", - loc->sw_if_index); + is_index_set = 1; } 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); - } + errmsg ("parse error '%U'", format_unformat_error, input); + return -99; } - 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)) + if (!is_index_set && !is_name_set) { - 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... */ - /* *INDENT-OFF* */ - W_L - ({ - get_locator_set_index_from_msg (vam, locator_set, locator_set_index); - vam->noprint_msg = 0; - }); - /* *INDENT-ON* */ - - /* 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); + errmsg ("error: expected one of index or name!\n"); + return -99; } - if (!ret && ~0 == locator_set_index) + if (is_index_set && is_name_set) { + errmsg ("error: only one param expected!\n"); 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", + fformat (vam->ofp, "%=16s%=16s%=16s\n", "locator", "priority", "weight"); } - vam->noprint_msg = 1; - - M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump); + M (LISP_LOCATOR_DUMP, lisp_locator_dump); + mp->is_index_set = is_index_set; - mp->filter = filter; + if (is_index_set) + mp->ls_index = clib_host_to_net_u32 (ls_index); + else + { + vec_add1 (ls_name, 0); + strcpy ((char *) mp->ls_name, (char *) ls_name); + } /* send it... */ S; /* Use a control ping for synchronization */ { - vl_api_noprint_control_ping_t *mp; - M (NOPRINT_CONTROL_PING, noprint_control_ping); + vl_api_control_ping_t *mp; + M (CONTROL_PING, control_ping); S; } - /* Wait for a reply... */ - /* *INDENT-OFF* */ - 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; - }); - /* *INDENT-ON* */ + W; /* NOTREACHED */ return 0; @@ -13235,27 +12992,15 @@ lisp_locator_set_dump (vat_main_t * vam, u8 filter) static int api_lisp_locator_set_dump (vat_main_t * vam) { + vl_api_lisp_locator_set_dump_t *mp; unformat_input_t *input = vam->input; - vam->noprint_msg = 0; - u32 locator_set_index = ~0; - u8 locator_set_index_set = 0; - u8 *locator_set = 0; - u8 locator_set_set = 0; + f64 timeout = ~0; u8 filter = 0; - int ret = 0; /* Parse args required to build the message */ while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT) { - if (unformat (input, "locator-set-index %u", &locator_set_index)) - { - locator_set_index_set = 1; - } - else if (unformat (input, "locator-set %s", &locator_set)) - { - locator_set_set = 1; - } - else if (unformat (input, "local")) + if (unformat (input, "local")) { filter = 1; } @@ -13265,28 +13010,34 @@ api_lisp_locator_set_dump (vat_main_t * vam) } else { - break; + errmsg ("parse error '%U'", format_unformat_error, input); + return -99; } } - if (locator_set_index_set && locator_set_set) + if (!vam->json_output) { - errmsg ("use only input parameter!\n"); - return -99; + fformat (vam->ofp, "%=10s%=15s\n", "ls_index", "ls_name"); } - if (locator_set_index_set || locator_set_set) - { - ret = lisp_locator_dump (vam, locator_set_index, locator_set, filter); - } - else - { - ret = lisp_locator_set_dump (vam, filter); - } + M (LISP_LOCATOR_SET_DUMP, lisp_locator_set_dump); + + mp->filter = filter; + + /* send it... */ + S; - vec_free (locator_set); + /* Use a control ping for synchronization */ + { + vl_api_control_ping_t *mp; + M (CONTROL_PING, control_ping); + S; + } + /* Wait for a reply... */ + W; - return ret; + /* NOTREACHED */ + return 0; } static int @@ -13378,412 +13129,6 @@ api_lisp_eid_table_vni_dump (vat_main_t * vam) } static int -get_locator_set (vat_main_t * vam) -{ - 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; - } - - /* Wait for a reply... */ - W; - - /* NOTREACHED */ - return 0; -} - -static inline u8 * -format_eid_for_eid_table (vat_main_t * vam, u8 * str, eid_table_t * eid_table, - int *ret) -{ - u8 *(*format_eid) (u8 *, va_list *) = 0; - - ASSERT (vam != NULL); - ASSERT (eid_table != NULL); - - if (ret) - { - *ret = 0; - } - - switch (eid_table->eid_type) - { - case 0: - case 1: - format_eid = (eid_table->eid_type ? format_ip6_address : - format_ip4_address); - str = format (0, "[%d] %U/%d", eid_table->vni, - format_eid, eid_table->eid, eid_table->eid_prefix_len); - break; - case 2: - str = format (0, "[%d] %U", eid_table->vni, - format_ethernet_address, eid_table->eid); - break; - default: - errmsg ("unknown EID type %d!", eid_table->eid_type); - if (ret) - { - *ret = -99; - } - return 0; - } - - return str; -} - -static inline u8 * -format_locator_set_for_eid_table (vat_main_t * vam, u8 * str, - eid_table_t * eid_table) -{ - locator_set_msg_t *ls = 0; - - ASSERT (vam != NULL); - ASSERT (eid_table != NULL); - - if (eid_table->is_local) - { - vec_foreach (ls, vam->locator_set_msg) - { - if (ls->locator_set_index == eid_table->locator_set_index) - { - str = format (0, "local(%s)", ls->locator_set_name); - return str; - } - } - - str = format (0, "local(N/A)"); - } - else - { - str = format (0, "remote"); - } - - return str; -} - -static inline u8 * -format_locator_for_eid_table (vat_main_t * vam, u8 * str, - eid_table_t * eid_table) -{ - locator_msg_t *loc = 0; - int first_line = 1; - - ASSERT (vam != NULL); - ASSERT (eid_table != NULL); - - if (~0 == eid_table->locator_set_index) - { - return format (0, "action: %d\n", eid_table->action); - } - - vec_foreach (loc, vam->locator_msg) - { - if (!first_line) - { - if (loc->local) - { - str = format (str, "%-55s%-d\n", " ", loc->sw_if_index); - } - else - { - str = format (str, "%=55s%-U\n", " ", - loc->is_ipv6 ? format_ip6_address : - format_ip4_address, loc->ip_address); - } - - continue; - } - - if (loc->local) - { - str = format (str, "%-30d%-20u%-u\n", loc->sw_if_index, - eid_table->ttl, eid_table->authoritative); - } - else - { - str = format (str, "%-30U%-20u%-u\n", - loc->is_ipv6 ? format_ip6_address : - format_ip4_address, - loc->ip_address, eid_table->ttl, - eid_table->authoritative); - } - first_line = 0; - } - - return str; -} - -static int -print_lisp_eid_table_dump (vat_main_t * vam) -{ - eid_table_t *eid_table = 0; - u8 *tmp_str = 0, *tmp_str2 = 0; - int ret = 0; - - ASSERT (vam != NULL); - - ret = get_locator_set (vam); - if (ret) - { - vec_free (vam->eid_tables); - return ret; - } - - fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", "locators", - "ttl", "authoritative"); - - vec_foreach (eid_table, vam->eid_tables) - { - if (~0 != eid_table->locator_set_index) - { - ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, - 0); - if (ret) - { - vec_free (vam->locator_msg); - clean_locator_set_message (vam); - vec_free (vam->eid_tables); - return ret; - } - } - - tmp_str2 = format_eid_for_eid_table (vam, tmp_str2, eid_table, &ret); - if (ret) - { - vec_free (vam->locator_msg); - clean_locator_set_message (vam); - vec_free (vam->eid_tables); - return ret; - } - - tmp_str = format (0, "%-35s", tmp_str2); - vec_free (tmp_str2); - - tmp_str2 = format_locator_set_for_eid_table (vam, tmp_str2, eid_table); - tmp_str = format (tmp_str, "%-20s", tmp_str2); - vec_free (tmp_str2); - - tmp_str2 = format_locator_for_eid_table (vam, tmp_str2, eid_table); - tmp_str = format (tmp_str, "%-s", tmp_str2); - vec_free (tmp_str2); - - fformat (vam->ofp, "%s", tmp_str); - vec_free (tmp_str); - vec_free (vam->locator_msg); - } - - clean_locator_set_message (vam); - vec_free (vam->eid_tables); - - return ret; -} - -static inline void -json_locator_set_for_eid_table (vat_main_t * vam, vat_json_node_t * node, - eid_table_t * eid_table) -{ - locator_set_msg_t *ls = 0; - u8 *s = 0; - - ASSERT (vam != NULL); - ASSERT (node != NULL); - ASSERT (eid_table != NULL); - - if (eid_table->is_local) - { - vec_foreach (ls, vam->locator_set_msg) - { - if (ls->locator_set_index == eid_table->locator_set_index) - { - vat_json_object_add_string_copy (node, "locator-set", - ls->locator_set_name); - return; - } - } - - s = format (0, "N/A"); - vec_add1 (s, 0); - vat_json_object_add_string_copy (node, "locator-set", s); - vec_free (s); - } - else - { - s = format (0, "remote"); - vec_add1 (s, 0); - vat_json_object_add_string_copy (node, "locator-set", s); - vec_free (s); - } -} - -static inline int -json_eid_for_eid_table (vat_main_t * vam, vat_json_node_t * node, - eid_table_t * eid_table) -{ - u8 *s = 0; - struct in6_addr ip6; - struct in_addr ip4; - - ASSERT (vam != NULL); - ASSERT (node != NULL); - ASSERT (eid_table != NULL); - - switch (eid_table->eid_type) - { - case 0: - clib_memcpy (&ip4, eid_table->eid, sizeof (ip4)); - vat_json_object_add_ip4 (node, "eid", ip4); - vat_json_object_add_uint (node, "eid-prefix-len", - eid_table->eid_prefix_len); - break; - case 1: - clib_memcpy (&ip6, eid_table->eid, sizeof (ip6)); - vat_json_object_add_ip6 (node, "eid", ip6); - vat_json_object_add_uint (node, "eid-prefix-len", - eid_table->eid_prefix_len); - break; - case 2: - s = format (0, "%U", format_ethernet_address, eid_table->eid); - vec_add1 (s, 0); - vat_json_object_add_string_copy (node, "eid", s); - vec_free (s); - break; - default: - errmsg ("unknown EID type %d!", eid_table->eid_type); - return -99; - } - - return 0; -} - -static inline void -json_locator_for_eid_table (vat_main_t * vam, vat_json_node_t * node, - eid_table_t * eid_table) -{ - locator_msg_t *loc = 0; - vat_json_node_t *locator_array = 0; - vat_json_node_t *locator = 0; - struct in6_addr ip6; - struct in_addr ip4; - - ASSERT (vam != NULL); - ASSERT (node != NULL); - ASSERT (eid_table != NULL); - - 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); - } - } - } -} - -static int -json_lisp_eid_table_dump (vat_main_t * vam) -{ - eid_table_t *eid_table; - vat_json_node_t *node = 0; - int ret = 0; - - ASSERT (vam != NULL); - - ret = get_locator_set (vam); - if (ret) - { - vec_free (vam->eid_tables); - return ret; - } - - if (!vec_len (vam->eid_tables)) - { - /* 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 (eid_table, vam->eid_tables) - { - ret = lisp_locator_dump_send_msg (vam, eid_table->locator_set_index, 0); - if (ret) - { - vec_free (vam->locator_msg); - vec_free (vam->eid_tables); - clean_locator_set_message (vam); - 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, "vni", eid_table->vni); - - json_locator_set_for_eid_table (vam, node, eid_table); - ret = json_eid_for_eid_table (vam, node, eid_table); - if (ret) - { - vec_free (vam->locator_msg); - vec_free (vam->eid_tables); - clean_locator_set_message (vam); - vat_json_free (&vam->json_tree); - vam->json_tree.type = VAT_JSON_NONE; - return ret; - } - - json_locator_for_eid_table (vam, node, eid_table); - - vat_json_object_add_uint (node, "ttl", eid_table->ttl); - vat_json_object_add_uint (node, "authoritative", - eid_table->authoritative); - - 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; - - clean_locator_set_message (vam); - vec_free (vam->eid_tables); - - return ret; -} - -static int api_lisp_eid_table_dump (vat_main_t * vam) { unformat_input_t *i = vam->input; @@ -13834,6 +13179,12 @@ api_lisp_eid_table_dump (vat_main_t * vam) } } + if (!vam->json_output) + { + fformat (vam->ofp, "%-35s%-20s%-30s%-20s%-s\n", "EID", "type", + "ls_index", "ttl", "authoritative"); + } + M (LISP_EID_TABLE_DUMP, lisp_eid_table_dump); mp->filter = filter; @@ -13861,36 +13212,18 @@ api_lisp_eid_table_dump (vat_main_t * vam) } } - vam->noprint_msg = 1; - /* send it... */ S; /* Use a control ping for synchronization */ { - vl_api_noprint_control_ping_t *mp; - M (NOPRINT_CONTROL_PING, noprint_control_ping); + vl_api_control_ping_t *mp; + M (CONTROL_PING, control_ping); S; } /* Wait for a reply... */ - /* *INDENT-OFF* */ - W_L - ({ - if (vam->noprint_msg) - { - if (!vam->json_output) - { - vam->retval = print_lisp_eid_table_dump(vam); - } - else - { - vam->retval = json_lisp_eid_table_dump(vam); - } - } - vam->noprint_msg = 0; - }); - /* *INDENT-ON* */ + W; /* NOTREACHED */ return 0; @@ -16036,7 +15369,8 @@ _(lisp_add_del_map_resolver, "<ip4|6-addr> [del]") \ _(lisp_gpe_enable_disable, "enable|disable") \ _(lisp_enable_disable, "enable|disable") \ _(lisp_gpe_add_del_iface, "up|down") \ -_(lisp_add_del_remote_mapping, "add|del vni <vni> deid <dest-eid> " \ +_(lisp_add_del_remote_mapping, "add|del vni <vni> eid <dest-eid> " \ + "[seid <seid>] " \ "rloc <locator> p <prio> " \ "w <weight> [rloc <loc> ... ] " \ "action <action> [del-all]") \ @@ -16046,8 +15380,8 @@ _(lisp_add_del_adjacency, "add|del vni <vni> deid <dest-eid> seid " \ _(lisp_pitr_set_locator_set, "locator-set <loc-set-name> | del") \ _(lisp_add_del_map_request_itr_rlocs, "<loc-set-name> [del]") \ _(lisp_eid_table_add_del_map, "[del] vni <vni> vrf <vrf>") \ -_(lisp_locator_set_dump, "[locator-set-index <ls-index> | " \ - "locator-set <loc-set-name>] [local | remote]")\ +_(lisp_locator_set_dump, "[local | remote]") \ +_(lisp_locator_dump, "ls_index <index> | ls_name <name>") \ _(lisp_eid_table_dump, "[eid <ipv4|ipv6>/<prefix> | <mac>] [vni] " \ "[local] | [remote]") \ _(lisp_eid_table_vni_dump, "") \ |