From 1fa305095af42c21c934db8c251e20c3e9825f5d Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Thu, 20 Jun 2019 14:10:44 -0400 Subject: [PATCH] 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 --- doc/user/routemap.rst | 18 +++++++++++++++++ lib/routemap.c | 46 +++++++++++++++++++++++++++++++++++++++++-- lib/routemap.h | 2 ++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/doc/user/routemap.rst b/doc/user/routemap.rst index ef9ebe8dd..bac61cbc5 100644 --- a/doc/user/routemap.rst +++ b/doc/user/routemap.rst @@ -85,6 +85,23 @@ deny cont goto next route-map entry +.. _route-map-show-command: + +.. index:: show route-map [WORD] +.. clicmd:: show route-map [WORD] + + Display data about each daemons knowledge of individual route-maps. + If WORD is supplied narrow choice to that particular route-map. + +.. _route-map-clear-counter-command: + +.. index:: clear route-map counter [WORD] +.. clicmd:: clear route-map counter [WORD] + + Clear counters that are being stored about the route-map utilization + so that subsuquent show commands will indicate since the last clear. + If WORD is specified clear just that particular route-map's counters. + .. _route-map-command: Route Map Command @@ -315,6 +332,7 @@ Route Map Exit Action Command Proceed processing the route-map at the first entry whose order is >= N + Route Map Examples ================== diff --git a/lib/routemap.c b/lib/routemap.c index 47cc2e294..b666852be 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 3781d227d..90df1048e 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; -- 2.39.5