Skip to content

Commit

Permalink
bgpd : backpressure - Fix to pop items off zebra_announce FIFO for fe…
Browse files Browse the repository at this point in the history
…w EVPN triggers

In cases such as 'no advertise-all-vni' and L2 VNI DELETE, we need to
pop all the VPN routes present in the bgp_zebra_announce FIFO yet to
be processed regardless of VNI is configured or not.

NOTE: NO need to pop the VPN routes in two cases
 1) In free_vni_entry
   - Called by bgp_free()->bgp_evpn_cleanup().
   - Since bgp_delete is called before bgp_free and we pop all the dest
     pertaining to bgp under delete.
 2) evpn_delete_vni() when user configures "no vni" since the withdraw
    of all routes happen in normal cycle.

Fixes: a07df6f
("bgpd : backpressure - Handle BGP-Zebra(EPVN) Install evt Creation")

Ticket :#4163611

Signed-off-by: Rajasekar Raja <rajasekarr@nvidia.com>
(cherry picked from commit 898852f)
  • Loading branch information
raja-rajasekar authored and mergify[bot] committed Nov 16, 2024
1 parent 22746b8 commit a7aae78
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
44 changes: 31 additions & 13 deletions bgpd/bgp_evpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -5111,6 +5111,33 @@ static void evpn_mpattr_encode_type5(struct stream *s, const struct prefix *p,
stream_put3(s, 0);
}

/*
* In cases such as 'no advertise-all-vni' and L2 VNI DELETE, we need to
* pop all the VPN routes present in the bgp_zebra_announce FIFO yet to
* be processed regardless of VNI is configured or not.
*
* NOTE: NO need to pop the VPN routes in two cases
* 1) In free_vni_entry
* - Called by bgp_free()->bgp_evpn_cleanup().
* - Since bgp_delete is called before bgp_free and we pop all the dest
* pertaining to bgp under delete.
* 2) evpn_delete_vni() when user configures "no vni" since the withdraw
* of all routes happen in normal cycle.
*/
void bgp_zebra_evpn_pop_items_from_announce_fifo(struct bgpevpn *vpn)
{
struct bgp_dest *dest = NULL;
struct bgp_dest *dest_next = NULL;

for (dest = zebra_announce_first(&bm->zebra_announce_head); dest; dest = dest_next) {
dest_next = zebra_announce_next(&bm->zebra_announce_head, dest);
if (dest->za_vpn == vpn) {
zebra_announce_del(&bm->zebra_announce_head, dest);
bgp_path_info_unlock(dest->za_bgp_pi);
bgp_dest_unlock_node(dest);
}
}
}
/*
* Cleanup specific VNI upon EVPN (advertise-all-vni) being disabled.
*/
Expand All @@ -5123,6 +5150,8 @@ static void cleanup_vni_on_disable(struct hash_bucket *bucket, struct bgp *bgp)

/* Clear "live" flag and see if hash needs to be freed. */
UNSET_FLAG(vpn->flags, VNI_FLAG_LIVE);
/* Pop items from bgp_zebra_announce FIFO for any VPN routes pending*/
bgp_zebra_evpn_pop_items_from_announce_fifo(vpn);
if (!is_vni_configured(vpn))
bgp_evpn_free(bgp, vpn);
}
Expand Down Expand Up @@ -6354,19 +6383,6 @@ struct bgpevpn *bgp_evpn_new(struct bgp *bgp, vni_t vni,
*/
void bgp_evpn_free(struct bgp *bgp, struct bgpevpn *vpn)
{
struct bgp_dest *dest = NULL;
struct bgp_dest *dest_next = NULL;

for (dest = zebra_announce_first(&bm->zebra_announce_head); dest;
dest = dest_next) {
dest_next = zebra_announce_next(&bm->zebra_announce_head, dest);
if (dest->za_vpn == vpn) {
zebra_announce_del(&bm->zebra_announce_head, dest);
bgp_path_info_unlock(dest->za_bgp_pi);
bgp_dest_unlock_node(dest);
}
}

bgp_evpn_remote_ip_hash_destroy(vpn);
bgp_evpn_vni_es_cleanup(vpn);
bgpevpn_unlink_from_l3vni(vpn);
Expand Down Expand Up @@ -7047,6 +7063,8 @@ int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni)

/* Clear "live" flag and see if hash needs to be freed. */
UNSET_FLAG(vpn->flags, VNI_FLAG_LIVE);
/* Pop items from bgp_zebra_announce FIFO for any VPN routes pending*/
bgp_zebra_evpn_pop_items_from_announce_fifo(vpn);
if (!is_vni_configured(vpn))
bgp_evpn_free(bgp, vpn);

Expand Down
1 change: 1 addition & 0 deletions bgpd/bgp_evpn.h
Original file line number Diff line number Diff line change
Expand Up @@ -199,4 +199,5 @@ bool bgp_evpn_skip_vrf_import_of_local_es(struct bgp *bgp_vrf, const struct pref
struct bgp_path_info *pi, int install);
int uninstall_evpn_route_entry_in_vrf(struct bgp *bgp_vrf, const struct prefix_evpn *evp,
struct bgp_path_info *parent_pi);
extern void bgp_zebra_evpn_pop_items_from_announce_fifo(struct bgpevpn *vpn);
#endif /* _QUAGGA_BGP_EVPN_H */

0 comments on commit a7aae78

Please sign in to comment.