summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_evpn.c11
-rw-r--r--bgpd/bgp_evpn.h1
-rw-r--r--bgpd/bgpd.c3
3 files changed, 15 insertions, 0 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 5ce5b19b18..5d6a5a59f5 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -6984,6 +6984,17 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni, vrf_id_t vrf_id)
}
/*
+ * When bgp instance goes down also clean up what might have been left over
+ * from evpn.
+ */
+void bgp_evpn_instance_down(struct bgp *bgp)
+{
+ /* If we have a stale local vni, delete it */
+ if (bgp->l3vni)
+ bgp_evpn_local_l3vni_del(bgp->l3vni, bgp->vrf_id);
+}
+
+/*
* Handle del of a local VNI.
*/
int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni)
diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h
index 223f18a177..dc82bcfba9 100644
--- a/bgpd/bgp_evpn.h
+++ b/bgpd/bgp_evpn.h
@@ -153,6 +153,7 @@ extern int bgp_evpn_local_l3vni_add(vni_t vni, vrf_id_t vrf_id,
struct in_addr originator_ip, int filter,
ifindex_t svi_ifindex, bool is_anycast_mac);
extern int bgp_evpn_local_l3vni_del(vni_t vni, vrf_id_t vrf_id);
+extern void bgp_evpn_instance_down(struct bgp *bgp);
extern int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni);
extern int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni,
struct in_addr originator_ip,
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 869d2b4552..2ec6a66bef 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -3875,6 +3875,9 @@ void bgp_instance_down(struct bgp *bgp)
struct listnode *node;
struct listnode *next;
+ /* Cleanup evpn instance state */
+ bgp_evpn_instance_down(bgp);
+
/* Stop timers. */
if (bgp->t_rmap_def_originate_eval)
EVENT_OFF(bgp->t_rmap_def_originate_eval);