From 7df407eda8b501b6319f9c563ee5f72f9199d8a6 Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Tue, 31 Jul 2018 18:45:39 -0700 Subject: [PATCH] bgpd: check existing l3vni for any l2vni creation Scan all bgp vrf instances and respective L3VNI against the VNI which is being configured. Ticket:CM-21859 Testing Done: Configure l3vni, try to configure same vni as l2vni under router bgp, address-family l2vpn evpn. The configuration is rejected. show evpn vni VNI Type VxLAN IF # MACs # ARPs # Remote VTEPs Tenant VRF 4001 L3 vx-4001 0 0 n/a vrf1 TOR(config)# router bgp 5546 TOR(config-router)# address-family l2vpn evpn TOR(config-router-af)# vni 4001 % Failed to create VNI Signed-off-by: Chirag Shah --- bgpd/bgp_evpn.c | 17 +++++++++++++++++ bgpd/bgp_evpn_private.h | 1 + bgpd/bgp_evpn_vty.c | 8 ++++++++ 3 files changed, 26 insertions(+) diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index ce9f93f8a2..9e814516b7 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -4931,6 +4931,23 @@ void bgp_evpn_derive_auto_rd(struct bgp *bgp, struct bgpevpn *vpn) UNSET_FLAG(vpn->flags, VNI_FLAG_RD_CFGD); } +/* + * Lookup L3-VNI + */ +bool bgp_evpn_lookup_l3vni_l2vni_table(vni_t vni) +{ + struct list *inst = bm->bgp; + struct listnode *node; + struct bgp *bgp_vrf; + + for (ALL_LIST_ELEMENTS_RO(inst, node, bgp_vrf)) { + if (bgp_vrf->l3vni == vni) + return true; + } + + return false; +} + /* * Lookup VNI. */ diff --git a/bgpd/bgp_evpn_private.h b/bgpd/bgp_evpn_private.h index 8d71c3123e..f0017f3533 100644 --- a/bgpd/bgp_evpn_private.h +++ b/bgpd/bgp_evpn_private.h @@ -503,4 +503,5 @@ extern struct evpnes *bgp_evpn_lookup_es(struct bgp *bgp, esi_t *esi); extern struct evpnes *bgp_evpn_es_new(struct bgp *bgp, esi_t *esi, struct ipaddr *originator_ip); extern void bgp_evpn_es_free(struct bgp *bgp, struct evpnes *es); +extern bool bgp_evpn_lookup_l3vni_l2vni_table(vni_t vni); #endif /* _BGP_EVPN_PRIVATE_H */ diff --git a/bgpd/bgp_evpn_vty.c b/bgpd/bgp_evpn_vty.c index 3828ce216b..b553cb42a5 100644 --- a/bgpd/bgp_evpn_vty.c +++ b/bgpd/bgp_evpn_vty.c @@ -1888,6 +1888,14 @@ static struct bgpevpn *evpn_create_update_vni(struct bgp *bgp, vni_t vni) vpn = bgp_evpn_lookup_vni(bgp, vni); if (!vpn) { + /* Check if this L2VNI is already configured as L3VNI */ + if (bgp_evpn_lookup_l3vni_l2vni_table(vni)) { + flog_err(BGP_ERR_VNI, + "%u: Failed to create L2VNI %u, it is configured as L3VNI", + bgp->vrf_id, vni); + return NULL; + } + /* tenant vrf will be updated when we get local_vni_add from * zebra */ -- 2.39.5