From 9118301e48af0dc0157184554601c767cbd25128 Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Thu, 7 Apr 2022 23:01:02 +0300 Subject: [PATCH] bgpd: Do not forget to update conditional advertisements rmaps for peer-groups 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 --- bgpd/bgp_routemap.c | 8 ++++++++ bgpd/bgpd.c | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 1d87641a2d..2fd30368d8 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -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; } } } diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index 6f06ad5a40..827da19777 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -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); -- 2.39.5