diff options
| -rw-r--r-- | bgpd/bgp_evpn.c | 5 | ||||
| -rw-r--r-- | bgpd/bgp_evpn.h | 26 | ||||
| -rw-r--r-- | bgpd/bgp_route.c | 2 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.c | 14 | 
4 files changed, 36 insertions, 11 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index d9f99bc089..ec526a3129 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); diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h index 343327a667..dd8d6e2e8e 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 e4769fe1d6..e65354038d 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -569,7 +569,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 e07701d42d..94d141300a 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 @@ -1403,11 +1400,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) {  | 
