diff options
author | Philippe Guibert <philippe.guibert@6wind.com> | 2019-04-16 14:18:12 +0200 |
---|---|---|
committer | Philippe Guibert <philippe.guibert@6wind.com> | 2019-05-07 16:01:47 +0200 |
commit | 6f37416509509a529bbf7bd56f51d8921e578c16 (patch) | |
tree | 3dbf81fff04456571739f2f81c8b8e9ee01d0293 /bfdd/bfdd_vty.c | |
parent | bfdd: add show bfd [vrf NAME] peers command (diff) | |
download | frr-6f37416509509a529bbf7bd56f51d8921e578c16.tar.xz frr-6f37416509509a529bbf7bd56f51d8921e578c16.zip |
bfdd: add show bfd [vrf NAME] counters command
that command permits to filter bfd peer counter contexts per vrf.
Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
Diffstat (limited to 'bfdd/bfdd_vty.c')
-rw-r--r-- | bfdd/bfdd_vty.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/bfdd/bfdd_vty.c b/bfdd/bfdd_vty.c index 6a353085e..96a9386d1 100644 --- a/bfdd/bfdd_vty.c +++ b/bfdd/bfdd_vty.c @@ -72,7 +72,7 @@ static struct json_object *__display_peer_counters_json(struct bfd_session *bs); static void _display_peer_counters_json(struct vty *vty, struct bfd_session *bs); static void _display_peer_counter_iter(struct hash_bucket *hb, void *arg); static void _display_peer_counter_json_iter(struct hash_bucket *hb, void *arg); -static void _display_peers_counter(struct vty *vty, bool use_json); +static void _display_peers_counter(struct vty *vty, char *vrfname, bool use_json); static struct bfd_session * _find_peer_or_error(struct vty *vty, int argc, struct cmd_token **argv, const char *label, const char *peer_str, @@ -658,16 +658,38 @@ static void _display_peer_counters_json(struct vty *vty, struct bfd_session *bs) static void _display_peer_counter_iter(struct hash_bucket *hb, void *arg) { - struct vty *vty = arg; + struct bfd_vrf_tuple *bvt = arg; + struct vty *vty; struct bfd_session *bs = hb->data; + if (!bvt) + return; + vty = bvt->vty; + + if (bvt->vrfname) { + if (!bs->key.vrfname[0] || + !strmatch(bs->key.vrfname, bvt->vrfname)) + return; + } + _display_peer_counter(vty, bs); } static void _display_peer_counter_json_iter(struct hash_bucket *hb, void *arg) { - struct json_object *jo = arg, *jon = NULL; + struct json_object *jo, *jon = NULL; struct bfd_session *bs = hb->data; + struct bfd_vrf_tuple *bvt = arg; + + if (!bvt) + return; + jo = bvt->jo; + + if (bvt->vrfname) { + if (!bs->key.vrfname[0] || + !strmatch(bs->key.vrfname, bvt->vrfname)) + return; + } jon = __display_peer_counters_json(bs); if (jon == NULL) { @@ -678,17 +700,22 @@ static void _display_peer_counter_json_iter(struct hash_bucket *hb, void *arg) json_object_array_add(jo, jon); } -static void _display_peers_counter(struct vty *vty, bool use_json) +static void _display_peers_counter(struct vty *vty, char *vrfname, bool use_json) { struct json_object *jo; + struct bfd_vrf_tuple bvt; + memset(&bvt, 0, sizeof(struct bfd_vrf_tuple)); + bvt.vrfname = vrfname; if (!use_json) { + bvt.vty = vty; vty_out(vty, "BFD Peers:\n"); - bfd_id_iterate(_display_peer_counter_iter, vty); + bfd_id_iterate(_display_peer_counter_iter, &bvt); return; } jo = json_object_new_array(); + bvt.jo = jo; bfd_id_iterate(_display_peer_counter_json_iter, jo); vty_out(vty, "%s\n", json_object_to_json_string_ext(jo, 0)); @@ -838,14 +865,21 @@ DEFPY(bfd_show_peer_counters, bfd_show_peer_counters_cmd, } DEFPY(bfd_show_peers_counters, bfd_show_peers_counters_cmd, - "show bfd peers counters [json]", + "show bfd [vrf <NAME>] peers counters [json]", SHOW_STR "Bidirection Forwarding Detection\n" + VRF_CMD_HELP_STR "BFD peers status\n" "Show BFD peer counters information\n" JSON_STR) { - _display_peers_counter(vty, use_json(argc, argv)); + char *vrf_name = NULL; + int idx_vrf = 0; + + if (argv_find(argv, argc, "vrf", &idx_vrf)) + vrf_name = argv[idx_vrf + 1]->arg; + + _display_peers_counter(vty, vrf_name, use_json(argc, argv)); return CMD_SUCCESS; } |