diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2019-06-20 14:10:44 -0400 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2019-06-20 14:10:44 -0400 |
| commit | 1fa305095af42c21c934db8c251e20c3e9825f5d (patch) | |
| tree | e85047e0647ce1b01ded511c16873f8973a8cb46 /lib | |
| parent | 67e42128db3c380e8b8067da164675c282a1dca5 (diff) | |
lib: Add `clear route-map counters [WORD]` command
This will allow the end-user to clear the counters associated
with the route-map. Subsuquent `show route-map ..` commands
will display counters since the last clear.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/routemap.c | 46 | ||||
| -rw-r--r-- | lib/routemap.h | 2 |
2 files changed, 46 insertions, 2 deletions
diff --git a/lib/routemap.c b/lib/routemap.c index 47cc2e294a..b666852bee 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -960,12 +960,12 @@ static void vty_show_route_map_entry(struct vty *vty, struct route_map *map) struct route_map_rule *rule; vty_out(vty, "route-map: %s Invoked: %" PRIu64 "\n", - map->name, map->applied); + map->name, map->applied - map->applied_clear); for (index = map->head; index; index = index->next) { vty_out(vty, " %s, sequence %d Invoked %" PRIu64 "\n", route_map_type_str(index->type), index->pref, - index->applied); + index->applied - index->applied_clear); /* Description */ if (index->description) @@ -2956,6 +2956,46 @@ DEFUN (no_rmap_continue, return no_rmap_onmatch_goto(self, vty, argc, argv); } +static void clear_route_map_helper(struct route_map *map) +{ + struct route_map_index *index; + + map->applied_clear = map->applied; + for (index = map->head; index; index = index->next) + index->applied_clear = index->applied; +} + +DEFUN (rmap_clear_counters, + rmap_clear_counters_cmd, + "clear route-map counters [WORD]", + CLEAR_STR + "route-map information\n" + "counters associated with the specified route-map\n" + "route-map name\n") +{ + int idx_word = 2; + struct route_map *map; + + const char *name = (argc == 3 ) ? argv[idx_word]->arg : NULL; + + if (name) { + map = route_map_lookup_by_name(name); + + if (map) + clear_route_map_helper(map); + else { + vty_out(vty, "%s: 'route-map %s' not found\n", + frr_protonameinst, name); + return CMD_SUCCESS; + } + } else { + for (map = route_map_master.head; map; map = map->next) + clear_route_map_helper(map); + } + + return CMD_SUCCESS; + +} DEFUN (rmap_show_name, rmap_show_name_cmd, @@ -3291,6 +3331,8 @@ void route_map_init(void) install_element(RMAP_NODE, &no_rmap_description_cmd); /* Install show command */ + install_element(ENABLE_NODE, &rmap_clear_counters_cmd); + install_element(ENABLE_NODE, &rmap_show_name_cmd); install_element(ENABLE_NODE, &rmap_show_unused_cmd); diff --git a/lib/routemap.h b/lib/routemap.h index 3781d227df..90df1048ed 100644 --- a/lib/routemap.h +++ b/lib/routemap.h @@ -153,6 +153,7 @@ struct route_map_index { /* Keep track how many times we've try to apply */ uint64_t applied; + uint64_t applied_clear; QOBJ_FIELDS }; @@ -177,6 +178,7 @@ struct route_map { /* How many times have we applied this route-map */ uint64_t applied; + uint64_t applied_clear; /* Counter to track active usage of this route-map */ uint16_t use_count; |
