summaryrefslogtreecommitdiffstats
path: root/lib/routemap.c
diff options
context:
space:
mode:
authorNaveen Thanikachalam <nthanikachal@vmware.com>2019-05-08 11:58:27 +0200
committerNaveen Thanikachalam <nthanikachal@vmware.com>2019-05-09 06:22:23 +0200
commit6c3247bd2a937b136bca61eb0089a884b558dec3 (patch)
tree5b6570cfffe365ebdf8fa0a75628dfaf7cb00fd1 /lib/routemap.c
parentzebra: Memory allocations do not fail (diff)
downloadfrr-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.c17
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);