/* This API is used during router-id change, reflect VPNs
* auto RD and RT values and readvertise routes to VPN table.
*/
-void vpn_handle_router_id_update(struct bgp *bgp, bool withdraw)
+void vpn_handle_router_id_update(struct bgp *bgp, bool withdraw,
+ bool is_config)
{
afi_t afi;
int debug;
}
} else {
+ /*
+ * Router-id changes that are not explicit config
+ * changes should not replace configured RD/RT.
+ */
+ if (!is_config) {
+ if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
+ BGP_VPN_POLICY_TOVPN_RD_SET)) {
+ if (debug)
+ zlog_debug("%s: auto router-id change skipped",
+ __func__);
+ goto postchange;
+ }
+ }
+
/* New router-id derive auto RD and RT and export
* to VPN
*/
= ecommunity_dup(ecom);
}
+
+postchange:
/* Update routes to VPN */
vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN,
afi, bgp_get_default(),
return CHECK_FLAG(bgp->config, config);
}
-/* Set BGP router identifier. */
-static int bgp_router_id_set(struct bgp *bgp, const struct in_addr *id)
+/* Set BGP router identifier; distinguish between explicit config and other
+ * cases.
+ */
+static int bgp_router_id_set(struct bgp *bgp, const struct in_addr *id,
+ bool is_config)
{
struct peer *peer;
struct listnode *node, *nnode;
if (is_evpn_enabled())
bgp_evpn_handle_router_id_update(bgp, TRUE);
- vpn_handle_router_id_update(bgp, TRUE);
+ vpn_handle_router_id_update(bgp, TRUE, is_config);
IPV4_ADDR_COPY(&bgp->router_id, id);
if (is_evpn_enabled())
bgp_evpn_handle_router_id_update(bgp, FALSE);
- vpn_handle_router_id_update(bgp, FALSE);
+ vpn_handle_router_id_update(bgp, FALSE, is_config);
return 0;
}
if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("RID change : vrf %u, RTR ID %s",
bgp->vrf_id, inet_ntoa(*addr));
- bgp_router_id_set(bgp, addr);
+ bgp_router_id_set(bgp, addr, FALSE);
}
}
}
if (BGP_DEBUG(zebra, ZEBRA))
zlog_debug("RID change : vrf %u, RTR ID %s",
bgp->vrf_id, inet_ntoa(*addr));
- bgp_router_id_set(bgp, addr);
+ bgp_router_id_set(bgp, addr, FALSE);
}
}
int bgp_router_id_static_set(struct bgp *bgp, struct in_addr id)
{
bgp->router_id_static = id;
- bgp_router_id_set(bgp, id.s_addr ? &id : &bgp->router_id_zebra);
+ bgp_router_id_set(bgp, id.s_addr ? &id : &bgp->router_id_zebra,
+ TRUE /* is config */);
return 0;
}
bgp = bgp_create(as, name, inst_type);
if (bgp_option_check(BGP_OPT_NO_ZEBRA) && name)
bgp->vrf_id = vrf_generate_id();
- bgp_router_id_set(bgp, &bgp->router_id_zebra);
+ bgp_router_id_set(bgp, &bgp->router_id_zebra, TRUE);
bgp_address_init(bgp);
bgp_tip_hash_init(bgp);
bgp_scan_init(bgp);