diff options
author | Keith Burns (alagalah) <alagalah@gmail.com> | 2016-07-19 14:47:43 -0700 |
---|---|---|
committer | Keith Burns (alagalah) <alagalah@gmail.com> | 2016-07-19 14:47:43 -0700 |
commit | c61080e76c9771de6f2beaba23fabe3aa4764a9b (patch) | |
tree | 254a447737a2c2797252629fc56e7f1a9a5c9b0e | |
parent | 3b2944d5f1bc7b42b31293d0d19f36b237490cd6 (diff) |
VPP-203 Find the relative next node index by node names
vat# get_next_index node-name vxlan4-input next-node-name l2-input
next node index 1
Change-Id: Ib71be8a408d08d59b0ed7dfb6ada9711cf29bd69
Signed-off-by: Keith Burns (alagalah) <alagalah@gmail.com>
-rw-r--r-- | vpp-api-test/vat/api_format.c | 81 | ||||
-rw-r--r-- | vpp/vpp-api/api.c | 45 | ||||
-rw-r--r-- | vpp/vpp-api/custom_dump.c | 17 | ||||
-rw-r--r-- | vpp/vpp-api/vpe.api | 24 |
4 files changed, 162 insertions, 5 deletions
diff --git a/vpp-api-test/vat/api_format.c b/vpp-api-test/vat/api_format.c index 4c96cc1745b..53450769f9f 100644 --- a/vpp-api-test/vat/api_format.c +++ b/vpp-api-test/vat/api_format.c @@ -923,6 +923,38 @@ static void vl_api_get_node_index_reply_t_handler_json vam->result_ready = 1; } +static void vl_api_get_next_index_reply_t_handler +(vl_api_get_next_index_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; + if (retval == 0) + errmsg ("next node index %d\n", ntohl(mp->next_index)); + vam->result_ready = 1; + } +} + +static void vl_api_get_next_index_reply_t_handler_json +(vl_api_get_next_index_reply_t * mp) +{ + vat_main_t * vam = &vat_main; + vat_json_node_t node; + + vat_json_init_object(&node); + vat_json_object_add_int(&node, "retval", ntohl(mp->retval)); + vat_json_object_add_uint(&node, "next_index", ntohl(mp->next_index)); + + vat_json_print(vam->ofp, &node); + vat_json_free(&node); + + vam->retval = ntohl(mp->retval); + vam->result_ready = 1; +} + static void vl_api_add_node_next_reply_t_handler (vl_api_add_node_next_reply_t * mp) { @@ -3013,7 +3045,8 @@ _(CLASSIFY_TABLE_BY_INTERFACE_REPLY, classify_table_by_interface_reply) \ _(CLASSIFY_TABLE_INFO_REPLY, classify_table_info_reply) \ _(CLASSIFY_SESSION_DETAILS, classify_session_details) \ _(IPFIX_ENABLE_REPLY, ipfix_enable_reply) \ -_(IPFIX_DETAILS, ipfix_details) +_(IPFIX_DETAILS, ipfix_details) \ +_(GET_NEXT_INDEX_REPLY, get_next_index_reply) /* M: construct, but don't yet send a message */ @@ -7661,6 +7694,49 @@ static int api_get_node_index (vat_main_t * vam) return 0; } +static int api_get_next_index (vat_main_t * vam) +{ + unformat_input_t * i = vam->input; + vl_api_get_next_index_t * mp; + f64 timeout; + u8 * node_name = 0, * next_node_name = 0; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) { + if (unformat (i, "node-name %s", &node_name)) + ; + else if (unformat (i, "next-node-name %s", &next_node_name)) + break; + } + + if (node_name == 0) { + errmsg ("node name required\n"); + return -99; + } + if (vec_len (node_name) >= ARRAY_LEN(mp->node_name)) { + errmsg ("node name too long, max %d\n", ARRAY_LEN(mp->node_name)); + return -99; + } + + if (next_node_name == 0) { + errmsg ("next node name required\n"); + return -99; + } + if (vec_len (next_node_name) >= ARRAY_LEN(mp->next_name)) { + errmsg ("next node name too long, max %d\n", ARRAY_LEN(mp->next_name)); + return -99; + } + + M(GET_NEXT_INDEX, get_next_index); + clib_memcpy (mp->node_name, node_name, vec_len(node_name)); + clib_memcpy (mp->next_name, next_node_name, vec_len(next_node_name)); + vec_free(node_name); + vec_free(next_node_name); + + S; W; + /* NOTREACHED */ + return 0; +} + static int api_add_node_next (vat_main_t * vam) { unformat_input_t * i = vam->input; @@ -12702,7 +12778,8 @@ _(classify_session_dump, "table_id <nn>") \ _(ipfix_enable, "collector_address <ip4> [collector_port <nn>] " \ "src_address <ip4> [fib_id <nn>] [path_mtu <nn>] " \ "[template_interval <nn>]") \ -_(ipfix_dump, "") +_(ipfix_dump, "") \ +_(get_next_index, "node-name <node-name> next-node-name <node-name>") /* List of command functions, CLI names map directly to functions */ #define foreach_cli_function \ diff --git a/vpp/vpp-api/api.c b/vpp/vpp-api/api.c index f3909287c17..f6b1b739251 100644 --- a/vpp/vpp-api/api.c +++ b/vpp/vpp-api/api.c @@ -368,7 +368,8 @@ _(CLASSIFY_TABLE_INFO,classify_table_info) \ _(CLASSIFY_SESSION_DUMP,classify_session_dump) \ _(CLASSIFY_SESSION_DETAILS,classify_session_details) \ _(IPFIX_ENABLE,ipfix_enable) \ -_(IPFIX_DUMP,ipfix_dump) +_(IPFIX_DUMP,ipfix_dump) \ +_(GET_NEXT_INDEX, get_next_index) #define QUOTE_(x) #x #define QUOTE(x) QUOTE_(x) @@ -4243,6 +4244,48 @@ static void vl_api_get_node_index_t_handler })) } +static void vl_api_get_next_index_t_handler +(vl_api_get_next_index_t * mp) +{ + vlib_main_t * vm = vlib_get_main(); + vl_api_get_next_index_reply_t * rmp; + vlib_node_t * node, * next_node; + int rv = 0; + u32 next_node_index = ~0, next_index = ~0; + uword * p; + + node = vlib_get_node_by_name (vm, mp->node_name); + + if (node == 0) { + rv = VNET_API_ERROR_NO_SUCH_NODE; + goto out; + } + + next_node = vlib_get_node_by_name (vm, mp->next_name); + + if (next_node == 0) { + rv = VNET_API_ERROR_NO_SUCH_NODE2; + goto out; + } + else + next_node_index = next_node->index; + + p = hash_get (node->next_slot_by_node, next_node_index); + + if (p == 0) { + rv = VNET_API_ERROR_NO_SUCH_ENTRY; + goto out; + } + else + next_index = p[0]; + + out: + REPLY_MACRO2(VL_API_GET_NEXT_INDEX_REPLY, + ({ + rmp->next_index = ntohl(next_index); + })); +} + static void vl_api_add_node_next_t_handler (vl_api_add_node_next_t * mp) { diff --git a/vpp/vpp-api/custom_dump.c b/vpp/vpp-api/custom_dump.c index 9967d5b9630..4e8b0642763 100644 --- a/vpp/vpp-api/custom_dump.c +++ b/vpp/vpp-api/custom_dump.c @@ -1875,6 +1875,18 @@ static void *vl_api_ipfix_dump_t_print FINISH; } +static void *vl_api_get_next_index_t_print +(vl_api_get_next_index_t * mp, void *handle) +{ + u8 * s; + + s = format (0, "SCRIPT: get_next_index "); + s = format (s, "node-name %s ", mp->node_name); + s = format (s, "next-node-name %s ", mp->next_name); + + FINISH; +} + #define foreach_custom_print_function \ _(CREATE_LOOPBACK, create_loopback) \ _(SW_INTERFACE_SET_FLAGS, sw_interface_set_flags) \ @@ -1972,9 +1984,10 @@ _(CLASSIFY_TABLE_BY_INTERFACE, classify_table_by_interface) \ _(CLASSIFY_TABLE_INFO,classify_table_info) \ _(CLASSIFY_SESSION_DUMP,classify_session_dump) \ _(IPFIX_ENABLE,ipfix_enable) \ -_(IPFIX_DUMP,ipfix_dump) +_(IPFIX_DUMP,ipfix_dump) \ +_(GET_NEXT_INDEX, get_next_index) -void vl_msg_api_custom_dump_configure (api_main_t *am) +void vl_msg_api_custom_dump_configure (api_main_t *am) { #define _(n,f) am->msg_print_handlers[VL_API_##n] \ = (void *) vl_api_##f##_t_print; diff --git a/vpp/vpp-api/vpe.api b/vpp/vpp-api/vpe.api index dd50d8400f8..25e6ebaacc9 100644 --- a/vpp/vpp-api/vpe.api +++ b/vpp/vpp-api/vpe.api @@ -4087,3 +4087,27 @@ manual_java define ipfix_details { u32 path_mtu; u32 template_interval; }; + +/** \brief Query relative index via node names + @param client_index - opaque cookie to identify the sender + @param context - sender context, to match reply w/ request + @param node_name - name of node to find relative index from + @param next_name - next node from node_name to find relative index of +*/ +define get_next_index { + u32 client_index; + u32 context; + u8 node_name[64]; + u8 next_name[64]; +}; + +/** \brief Reply for get next node index + @param context - sender context which was passed in the request + @param retval - return value + @param next_index - index of the next_node +*/ +define get_next_index_reply { + u32 context; + i32 retval; + u32 next_index; +}; |