]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Reinstall aggregated routes if using route-maps and it was changed
authorDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 30 Jan 2024 13:44:38 +0000 (15:44 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Tue, 30 Jan 2024 13:47:49 +0000 (15:47 +0200)
Without this change when we change the route-map, we never reinstall the route
if the route-map has changed.

We checked only some attributes like aspath, communities, large-communities,
extended-communities, but ignoring the rest of attributes.

With this change, let's check if the route-map has changed.

bgp_route_map_process_update() is triggered on route-map change, and we set
`changed` to true, which treats aggregated route as not the same as it was before.

Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
bgpd/bgp_route.c
bgpd/bgp_route.h
bgpd/bgp_routemap.c

index 8bcbd3dd8cea0b3221abd03cdfe58302e6a050ff..518e848258ff57470b6e3deb21ab6009489847f7 100644 (file)
@@ -7369,8 +7369,9 @@ static void bgp_aggregate_install(
                 * If the aggregate information has not changed
                 * no need to re-install it again.
                 */
-               if (pi && bgp_aggregate_info_same(pi, origin, aspath, community,
-                                                 ecommunity, lcommunity)) {
+               if (pi && (!aggregate->rmap.changed &&
+                          bgp_aggregate_info_same(pi, origin, aspath, community,
+                                                  ecommunity, lcommunity))) {
                        bgp_dest_unlock_node(dest);
 
                        if (aspath)
@@ -8377,6 +8378,7 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi,
                aggregate->rmap.name =
                        XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap);
                aggregate->rmap.map = route_map_lookup_by_name(rmap);
+               aggregate->rmap.changed = true;
                route_map_counter_increment(aggregate->rmap.map);
        }
 
index 0599e8dce1f06ae6d9e647833d06b82c99758c72..935dafccf29ff0e77b3332c039a36e3ef5dbf859 100644 (file)
@@ -419,6 +419,7 @@ struct bgp_aggregate {
        struct {
                char *name;
                struct route_map *map;
+               bool changed;
        } rmap;
 
        /* Suppress-count. */
index 382e8ae409f55531e355a1e7d57010e14dd75119..36e04c5e681e04fb54748051cebfdb1c872e8fa4 100644 (file)
@@ -4596,6 +4596,7 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
                                        route_map_counter_increment(map);
 
                                aggregate->rmap.map = map;
+                               aggregate->rmap.changed = true;
 
                                matched = true;
                        }