]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib, bgpd: Disallow processing of duplicate config.
authorNaveen Thanikachalam <nthanikachal@vmware.com>
Wed, 8 May 2019 09:58:27 +0000 (02:58 -0700)
committerNaveen Thanikachalam <nthanikachal@vmware.com>
Thu, 9 May 2019 04:22:23 +0000 (21:22 -0700)
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>
bgpd/bgpd.c
lib/routemap.c

index b2925cd5122849f17318af7fbca8ef1ae4f40254..6183bbd4714eebc6691263b7e4da1b3ec5dfdd58 100644 (file)
@@ -6186,8 +6186,15 @@ int peer_route_map_set(struct peer *peer, afi_t afi, safi_t safi, int direct,
 
        /* Set configuration on peer. */
        filter = &peer->filter[afi][safi];
-       if (filter->map[direct].name)
+       if (filter->map[direct].name) {
+               /* If the neighbor is configured with the same route-map
+                * again then, ignore the duplicate configuration.
+                */
+               if (strcmp(filter->map[direct].name, name) == 0)
+                       return 0;
+
                XFREE(MTYPE_BGP_FILTER_NAME, filter->map[direct].name);
+       }
        route_map_counter_decrement(filter->map[direct].map);
        filter->map[direct].name = XSTRDUP(MTYPE_BGP_FILTER_NAME, name);
        filter->map[direct].map = route_map;
index 4898a8d0fa776e0650a6b440f4a3e8aa4b201e97..e9c8d9c4cfa7eee814b5f0c501eedc20c98da230 100644 (file)
@@ -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);