diff options
author | Naveen Thanikachalam <nthanikachal@vmware.com> | 2019-05-08 11:58:27 +0200 |
---|---|---|
committer | Naveen Thanikachalam <nthanikachal@vmware.com> | 2019-05-09 06:22:23 +0200 |
commit | 6c3247bd2a937b136bca61eb0089a884b558dec3 (patch) | |
tree | 5b6570cfffe365ebdf8fa0a75628dfaf7cb00fd1 /lib/routemap.c | |
parent | zebra: Memory allocations do not fail (diff) | |
download | frr-6c3247bd2a937b136bca61eb0089a884b558dec3.tar.xz frr-6c3247bd2a937b136bca61eb0089a884b558dec3.zip |
lib, bgpd: Disallow processing of duplicate config.
This fix aims to reduce the load on BGPD when certain
exisiting configurations are replayed.
Specifically, the fix prevents BGPD from processing
routes when the following already existing configurations
are replayed:
1) A match criteria is configured within a route-map.
2) When "call" is invoked within a route-map.
3) When a route-map is tied to a BGP neighbor.
Signed-off-by: NaveenThanikachalam <nthanikachal@vmware.com>
Diffstat (limited to '')
-rw-r--r-- | lib/routemap.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/routemap.c b/lib/routemap.c index 4898a8d0f..e9c8d9c4c 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -1308,6 +1308,16 @@ int route_map_add_match(struct route_map_index *index, const char *match_name, for (rule = index->match_list.head; rule; rule = next) { next = rule->next; if (rule->cmd == cmd) { + /* If the configured route-map match rule is exactly + * the same as the existing configuration then, + * ignore the duplicate configuration. + */ + if (strcmp(match_arg, rule->rule_str) == 0) { + if (cmd->func_free) + (*cmd->func_free)(compile); + return RMAP_COMPILE_SUCCESS; + } + route_map_rule_delete(&index->match_list, rule); replaced = 1; } @@ -2803,6 +2813,13 @@ DEFUN (rmap_call, assert(index); + /* If "call" is invoked with the same route-map name as + * the one previously configured then, ignore the duplicate + * configuration. + */ + if (index->nextrm && (strcmp(index->nextrm, rmap) == 0)) + return CMD_SUCCESS; + if (index->nextrm) { route_map_upd8_dependency(RMAP_EVENT_CALL_DELETED, index->nextrm, index->map->name); |