diff options
author | Alexander Chernavin <achernavin@netgate.com> | 2022-05-12 14:56:24 +0000 |
---|---|---|
committer | Matthew Smith <mgsmith@netgate.com> | 2022-05-16 20:53:19 +0000 |
commit | 86c7856edae44483e7303fb4cf4efdec626716c8 (patch) | |
tree | fb30caa5131691d52b610543b9b7815d8e7489a0 /src/plugins/flowprobe/flowprobe_test.c | |
parent | 99b96398452ac13114d54f47a163dc06f7c23f12 (diff) |
flowprobe: add api messages to obtain current state
Type: improvement
With this change:
- add dump/details messages to obtain interfaces for which IPFIX flow
record generation is enabled;
- add get message to obtain parameters;
- add a new message to set parameters with validation present and to
correspond with get/set naming;
- add tests for get/set parameters and dump/details interfaces.
Change-Id: I09f6ec990171ac8bcb9d2f5c92629803b8ab6c28
Signed-off-by: Alexander Chernavin <achernavin@netgate.com>
Diffstat (limited to 'src/plugins/flowprobe/flowprobe_test.c')
-rw-r--r-- | src/plugins/flowprobe/flowprobe_test.c | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/src/plugins/flowprobe/flowprobe_test.c b/src/plugins/flowprobe/flowprobe_test.c index ae2a3edf64a..37b91207e29 100644 --- a/src/plugins/flowprobe/flowprobe_test.c +++ b/src/plugins/flowprobe/flowprobe_test.c @@ -150,6 +150,79 @@ api_flowprobe_interface_add_del (vat_main_t *vam) } static int +api_flowprobe_interface_dump (vat_main_t *vam) +{ + unformat_input_t *i = vam->input; + vl_api_flowprobe_interface_dump_t *mp; + vl_api_control_ping_t *mp_ping; + u32 sw_if_index = ~0; + int ret; + + /* Parse args required to build the message */ + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "%d", &sw_if_index)) + ; + else + break; + } + + /* Construct the API message */ + M (FLOWPROBE_INTERFACE_DUMP, mp); + mp->sw_if_index = htonl (sw_if_index); + + /* Send it... */ + S (mp); + + /* Use control ping for synchronization */ + PING (&flowprobe_test_main, mp_ping); + S (mp_ping); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +static void +vl_api_flowprobe_interface_details_t_handler ( + vl_api_flowprobe_interface_details_t *mp) +{ + vat_main_t *vam = flowprobe_test_main.vat_main; + u32 sw_if_index; + u8 which; + u8 direction; + u8 *out = 0; + const char *variants[] = { + [FLOWPROBE_WHICH_IP4] = "ip4", + [FLOWPROBE_WHICH_IP6] = "ip6", + [FLOWPROBE_WHICH_L2] = "l2", + "Erroneous variant", + }; + const char *directions[] = { + [FLOWPROBE_DIRECTION_RX] = "rx", + [FLOWPROBE_DIRECTION_TX] = "tx", + [FLOWPROBE_DIRECTION_BOTH] = "rx tx", + "Erroneous direction", + }; + + sw_if_index = ntohl (mp->sw_if_index); + + which = mp->which; + if (which > ARRAY_LEN (variants) - 2) + which = ARRAY_LEN (variants) - 1; + + direction = mp->direction; + if (direction > ARRAY_LEN (directions) - 2) + direction = ARRAY_LEN (directions) - 1; + + out = format (0, "sw_if_index: %u, variant: %s, direction: %s\n%c", + sw_if_index, variants[which], directions[direction], 0); + + fformat (vam->ofp, (char *) out); + vec_free (out); +} + +static int api_flowprobe_params (vat_main_t * vam) { unformat_input_t *i = vam->input; @@ -202,6 +275,94 @@ api_flowprobe_params (vat_main_t * vam) return ret; } +static int +api_flowprobe_set_params (vat_main_t *vam) +{ + unformat_input_t *i = vam->input; + vl_api_flowprobe_set_params_t *mp; + u32 active_timer = ~0; + u32 passive_timer = ~0; + u8 record_flags = 0; + int ret; + + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "active %d", &active_timer)) + ; + else if (unformat (i, "passive %d", &passive_timer)) + ; + else if (unformat (i, "record")) + while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT) + { + if (unformat (i, "l2")) + record_flags |= FLOWPROBE_RECORD_FLAG_L2; + else if (unformat (i, "l3")) + record_flags |= FLOWPROBE_RECORD_FLAG_L3; + else if (unformat (i, "l4")) + record_flags |= FLOWPROBE_RECORD_FLAG_L4; + else + break; + } + else + break; + } + + /* Construct the API message */ + M (FLOWPROBE_SET_PARAMS, mp); + mp->record_flags = record_flags; + mp->active_timer = ntohl (active_timer); + mp->passive_timer = ntohl (passive_timer); + + /* send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + + return ret; +} + +static int +api_flowprobe_get_params (vat_main_t *vam) +{ + vl_api_flowprobe_get_params_t *mp; + int ret; + + /* Construct the API message */ + M (FLOWPROBE_GET_PARAMS, mp); + + /* Send it... */ + S (mp); + + /* Wait for a reply... */ + W (ret); + return ret; +} + +static void +vl_api_flowprobe_get_params_reply_t_handler ( + vl_api_flowprobe_get_params_reply_t *mp) +{ + vat_main_t *vam = flowprobe_test_main.vat_main; + u8 *out = 0; + + out = + format (0, "active: %u, passive: %u, record:", ntohl (mp->active_timer), + ntohl (mp->passive_timer)); + + if (mp->record_flags & FLOWPROBE_RECORD_FLAG_L2) + out = format (out, " l2"); + if (mp->record_flags & FLOWPROBE_RECORD_FLAG_L3) + out = format (out, " l3"); + if (mp->record_flags & FLOWPROBE_RECORD_FLAG_L4) + out = format (out, " l4"); + + out = format (out, "\n%c", 0); + fformat (vam->ofp, (char *) out); + vec_free (out); + vam->result_ready = 1; +} + /* * List of messages that the api test plugin sends, * and that the data plane plugin processes |