mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-06 06:14:35 +00:00
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 <vivek@cumulusnetworks.com>
This commit is contained in:
parent
18abc1ebfd
commit
884930764f
@ -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,
|
||||
|
@ -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",
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user