]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: Do not forget to update conditional advertisements rmaps for peer-groups 10987/head
authorDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 7 Apr 2022 20:01:02 +0000 (23:01 +0300)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 8 Apr 2022 19:43:01 +0000 (22:43 +0300)
When the peer is configured for the first time:
```
neighbor P1 peer-group
neighbor P1 remote-as external
neighbor P1 advertise-map ADV exist-map EXIST
neighbor 10.10.10.1 peer-group P1
```

Conditional advertisements route-maps are not updated and cond. advertisements
do not work until FRR restarted. BGP sessions clear does not help.

Or even changing peer-group for a peer, causes this bug to kick in.

```
no neighbor 10.10.10.1
neighbor 10.10.10.1 peer-group P2
```

With this fix, cond. advertisements start working immediatelly.

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

index 1d87641a2d92d20d5000bf6b4fa5bcf27bb3e22d..2fd30368d85e7fbd7ea353e1ffdef58af912b6c0 100644 (file)
@@ -3809,6 +3809,14 @@ static void bgp_route_map_update_peer_group(const char *rmap_name,
                        if (filter->usmap.name
                            && (strcmp(rmap_name, filter->usmap.name) == 0))
                                filter->usmap.map = map;
+
+                       if (filter->advmap.aname &&
+                           (strcmp(rmap_name, filter->advmap.aname) == 0))
+                               filter->advmap.amap = map;
+
+                       if (filter->advmap.cname &&
+                           (strcmp(rmap_name, filter->advmap.cname) == 0))
+                               filter->advmap.cmap = map;
                }
        }
 }
index 6f06ad5a4079d2ddda9b0d241689d818278cde34..827da19777d88c3df59c12ea4658b8894aac6200 100644 (file)
@@ -2103,6 +2103,20 @@ static void peer_group2peer_config_copy_af(struct peer_group *group,
                PEER_ATTR_INHERIT(peer, group, filter[afi][safi].usmap.map);
        }
 
+       /* Conditional Advertisements */
+       if (!CHECK_FLAG(pfilter_ovrd[RMAP_OUT], PEER_FT_ADVERTISE_MAP)) {
+               PEER_STR_ATTR_INHERIT(peer, group,
+                                     filter[afi][safi].advmap.aname,
+                                     MTYPE_BGP_FILTER_NAME);
+               PEER_ATTR_INHERIT(peer, group, filter[afi][safi].advmap.amap);
+               PEER_STR_ATTR_INHERIT(peer, group,
+                                     filter[afi][safi].advmap.cname,
+                                     MTYPE_BGP_FILTER_NAME);
+               PEER_ATTR_INHERIT(peer, group, filter[afi][safi].advmap.cmap);
+               PEER_ATTR_INHERIT(peer, group,
+                                 filter[afi][safi].advmap.condition);
+       }
+
        if (peer->addpath_type[afi][safi] == BGP_ADDPATH_NONE) {
                peer->addpath_type[afi][safi] = conf->addpath_type[afi][safi];
                bgp_addpath_type_changed(conf->bgp);