summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_mac.c21
-rw-r--r--bgpd/bgp_route.c13
-rw-r--r--bgpd/bgp_route.h7
-rw-r--r--bgpd/bgp_rpki.c2
-rw-r--r--bgpd/bgpd.c15
5 files changed, 33 insertions, 25 deletions
diff --git a/bgpd/bgp_mac.c b/bgpd/bgp_mac.c
index 02b7e64869..b9649ac4da 100644
--- a/bgpd/bgp_mac.c
+++ b/bgpd/bgp_mac.c
@@ -242,19 +242,18 @@ static void bgp_mac_rescan_evpn_table(struct bgp *bgp, struct ethaddr *macaddr)
if (!peer_established(peer))
continue;
- if (CHECK_FLAG(peer->af_flags[afi][safi],
- PEER_FLAG_SOFT_RECONFIG)) {
- if (bgp_debug_update(peer, NULL, NULL, 1))
- zlog_debug("Processing EVPN MAC interface change on peer %s (inbound, soft-reconfig)",
- peer->host);
-
- bgp_soft_reconfig_in(peer, afi, safi);
- } else {
+ if (bgp_debug_update(peer, NULL, NULL, 1))
+ zlog_debug(
+ "Processing EVPN MAC interface change on peer %s %s",
+ peer->host,
+ CHECK_FLAG(peer->af_flags[afi][safi],
+ PEER_FLAG_SOFT_RECONFIG)
+ ? "(inbound, soft-reconfig)"
+ : "");
+
+ if (!bgp_soft_reconfig_in(peer, afi, safi)) {
struct bgp_table *table = bgp->rib[afi][safi];
- if (bgp_debug_update(peer, NULL, NULL, 1))
- zlog_debug("Processing EVPN MAC interface change on peer %s",
- peer->host);
bgp_process_mac_rescan_table(bgp, peer, table, macaddr);
}
}
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 1a2408adea..130a0b4abd 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -5342,7 +5342,10 @@ void bgp_soft_reconfig_table_task_cancel(const struct bgp *bgp,
}
}
-void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi)
+/*
+ * Returns false if the peer is not configured for soft reconfig in
+ */
+bool bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi)
{
struct bgp_dest *dest;
struct bgp_table *table;
@@ -5350,14 +5353,14 @@ void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi)
struct peer *npeer;
struct peer_af *paf;
- if (!peer_established(peer))
- return;
+ if (!CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
+ return false;
if ((safi != SAFI_MPLS_VPN) && (safi != SAFI_ENCAP)
&& (safi != SAFI_EVPN)) {
table = peer->bgp->rib[afi][safi];
if (!table)
- return;
+ return true;
table->soft_reconfig_init = true;
@@ -5417,6 +5420,8 @@ void bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi)
bgp_soft_reconfig_table(peer, afi, safi, table, &prd);
}
+
+ return true;
}
diff --git a/bgpd/bgp_route.h b/bgpd/bgp_route.h
index dfe741914d..c85551634a 100644
--- a/bgpd/bgp_route.h
+++ b/bgpd/bgp_route.h
@@ -676,7 +676,12 @@ extern void bgp_default_originate(struct peer *, afi_t, safi_t, int);
extern void bgp_soft_reconfig_table_task_cancel(const struct bgp *bgp,
const struct bgp_table *table,
const struct peer *peer);
-extern void bgp_soft_reconfig_in(struct peer *, afi_t, safi_t);
+
+/*
+ * If this peer is configured for soft reconfig in then do the work
+ * and return true. If it is not return false; and do nothing
+ */
+extern bool bgp_soft_reconfig_in(struct peer *peer, afi_t afi, safi_t safi);
extern void bgp_clear_route(struct peer *, afi_t, safi_t);
extern void bgp_clear_route_all(struct peer *);
extern void bgp_clear_adj_in(struct peer *, afi_t, safi_t);
diff --git a/bgpd/bgp_rpki.c b/bgpd/bgp_rpki.c
index b2abd51508..d458b72a1b 100644
--- a/bgpd/bgp_rpki.c
+++ b/bgpd/bgp_rpki.c
@@ -490,6 +490,8 @@ static void revalidate_all_routes(void)
if (!peer->bgp->rib[afi][safi])
continue;
+ if (!peer_established(peer))
+ continue;
bgp_soft_reconfig_in(peer, afi, safi);
}
}
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 8273c78f1e..a10fa7e706 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -5517,11 +5517,11 @@ void peer_on_policy_change(struct peer *peer, afi_t afi, safi_t safi,
if (!peer_established(peer))
return;
- if (CHECK_FLAG(peer->af_flags[afi][safi],
- PEER_FLAG_SOFT_RECONFIG)) {
- bgp_soft_reconfig_in(peer, afi, safi);
- } else if (CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_OLD_RCV) ||
- CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_NEW_RCV)) {
+ if (bgp_soft_reconfig_in(peer, afi, safi))
+ return;
+
+ if (CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_OLD_RCV) ||
+ CHECK_FLAG(peer->cap, PEER_CAP_REFRESH_NEW_RCV)) {
if (CHECK_FLAG(peer->af_cap[afi][safi],
PEER_CAP_ORF_PREFIX_SM_ADV) &&
(CHECK_FLAG(peer->af_cap[afi][safi],
@@ -7777,10 +7777,7 @@ int peer_clear_soft(struct peer *peer, afi_t afi, safi_t safi,
|| stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX) {
/* If neighbor has soft reconfiguration inbound flag.
Use Adj-RIB-In database. */
- if (CHECK_FLAG(peer->af_flags[afi][safi],
- PEER_FLAG_SOFT_RECONFIG))
- bgp_soft_reconfig_in(peer, afi, safi);
- else {
+ if (!bgp_soft_reconfig_in(peer, afi, safi)) {
/* If neighbor has route refresh capability, send route
refresh
message to the peer. */