From 18abc1ebfd83718a867206154b414edaa14583e4 Mon Sep 17 00:00:00 2001 From: vivek Date: Fri, 30 Mar 2018 00:13:58 +0000 Subject: [PATCH 1/2] bgpd: Cleanup linkage between L2 VNIs and L3 VNI When an L3 VNI is deleted, cleanup linkage to it from associated L2 VNIs. Updates: bgpd: keep a backpointer to vrf instance in struct bgpevpn [Mitesh Kanjariya] Signed-off-by: Vivek Venkatraman Reviewed-by: Mitesh Kanjariya --- bgpd/bgp_evpn.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index d9f99bc089b8..ec526a3129c2 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -4336,6 +4336,7 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni, vrf_id_t vrf_id) struct bgp *bgp_vrf = NULL; /* bgp vrf instance */ struct bgp *bgp_def = NULL; /* default bgp instance */ struct listnode *node = NULL; + struct listnode *next = NULL; struct bgpevpn *vpn = NULL; bgp_vrf = bgp_lookup_by_vrf_id(vrf_id); @@ -4386,6 +4387,10 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni, vrf_id_t vrf_id) } } + /* If any L2VNIs point to this instance, unlink them. */ + for (ALL_LIST_ELEMENTS(bgp_vrf->l2vnis, node, next, vpn)) + bgpevpn_unlink_from_l3vni(vpn); + /* Delete the instance if it was autocreated */ if (CHECK_FLAG(bgp_vrf->vrf_flags, BGP_VRF_AUTO)) bgp_delete(bgp_vrf); From 884930764f9e568d69aac7ce348c7970d4febe87 Mon Sep 17 00:00:00 2001 From: vivek Date: Fri, 30 Mar 2018 00:24:00 +0000 Subject: [PATCH 2/2] bgpd: Fix use of ROUTE_IMPORTED for EVPN Ensure that only EVPN routes are flagged as such when installing into or withdrawing from zebra, the earlier check broke L3VPN or VRF route-leaked routes. Also, fix an incorrect check related to imported routes in path selection. Updates: bgpd: Use BGP_ROUTE_IMPORTED for EVPN [vivek] Signed-off-by: Vivek Venkatraman --- bgpd/bgp_evpn.h | 26 ++++++++++++++++++++++++++ bgpd/bgp_route.c | 2 +- bgpd/bgp_zebra.c | 14 ++++---------- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h index 343327a667c9..dd8d6e2e8e90 100644 --- a/bgpd/bgp_evpn.h +++ b/bgpd/bgp_evpn.h @@ -74,6 +74,32 @@ static inline int advertise_type5_routes(struct bgp *bgp_vrf, return 0; } +/* Flag if the route's parent is a EVPN route. */ +static inline int is_route_parent_evpn(struct bgp_info *ri) +{ + struct bgp_info *parent_ri; + struct bgp_table *table; + struct bgp_node *rn; + + /* If not imported (or doesn't have a parent), bail. */ + if (ri->sub_type != BGP_ROUTE_IMPORTED || + !ri->extra || + !ri->extra->parent) + return 0; + + /* See if the parent is of family L2VPN/EVPN */ + parent_ri = (struct bgp_info *)ri->extra->parent; + rn = parent_ri->net; + if (!rn) + return 0; + table = bgp_node_table(rn); + if (table && + table->afi == AFI_L2VPN && + table->safi == SAFI_EVPN) + return 1; + return 0; +} + extern void bgp_evpn_advertise_type5_route(struct bgp *bgp_vrf, struct prefix *p, struct attr *src_attr, afi_t afi, diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index a37e709f10b3..1bdcf5e27f3b 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -567,7 +567,7 @@ static int bgp_info_cmp(struct bgp *bgp, struct bgp_info *new, } if (!(exist->sub_type == BGP_ROUTE_NORMAL || - new->sub_type == BGP_ROUTE_IMPORTED)) { + exist->sub_type == BGP_ROUTE_IMPORTED)) { if (debug) zlog_debug( "%s: %s loses to %s due to preferred BGP_ROUTE type", diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index 269dcc7cb67b..6af04a60c451 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -1097,11 +1097,8 @@ void bgp_zebra_announce(struct bgp_node *rn, struct prefix *p, if (info->sub_type == BGP_ROUTE_AGGREGATE) zapi_route_set_blackhole(&api, BLACKHOLE_NULL); - /* If it is an EVPN route mark as such. - * Currently presence of rmac in attr denotes - * this is an EVPN type-2 route - */ - if (info->sub_type == BGP_ROUTE_IMPORTED) + /* If the route's source is EVPN, flag as such. */ + if (is_route_parent_evpn(info)) SET_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE); if (peer->sort == BGP_PEER_IBGP || peer->sort == BGP_PEER_CONFED @@ -1398,11 +1395,8 @@ void bgp_zebra_withdraw(struct prefix *p, struct bgp_info *info, api.safi = safi; api.prefix = *p; - /* If it is an EVPN route mark as such. - * Currently presence of rmac in attr denotes - * this is an EVPN type-2 route - */ - if (info->sub_type == BGP_ROUTE_IMPORTED) + /* If the route's source is EVPN, flag as such. */ + if (is_route_parent_evpn(info)) SET_FLAG(api.flags, ZEBRA_FLAG_EVPN_ROUTE); if (peer->sort == BGP_PEER_IBGP) {