Skip to content

Commit

Permalink
Merge pull request #10479 from mjstapp/fix_meta_q_cleanup_8_1
Browse files Browse the repository at this point in the history
[8.1] zebra: fix cleanup of meta queues on vrf disable
  • Loading branch information
ton31337 committed Feb 3, 2022
2 parents fc41d9a + 4f1f01a commit e518f42
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 32 deletions.
2 changes: 2 additions & 0 deletions zebra/rib.h
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,8 @@ int zebra_rib_queue_evpn_rem_vtep_del(vrf_id_t vrf_id, vni_t vni,
struct in_addr vtep_ip);

extern void meta_queue_free(struct meta_queue *mq);
extern void rib_meta_queue_free_vrf(struct meta_queue *mq,
struct zebra_vrf *zvrf);
extern int zebra_rib_labeled_unicast(struct route_entry *re);
extern struct route_table *rib_table_ipv6;

Expand Down
53 changes: 53 additions & 0 deletions zebra/zebra_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -2938,6 +2938,59 @@ void meta_queue_free(struct meta_queue *mq)
XFREE(MTYPE_WORK_QUEUE, mq);
}

void rib_meta_queue_free_vrf(struct meta_queue *mq, struct zebra_vrf *zvrf)
{
vrf_id_t vrf_id = zvrf->vrf->vrf_id;
unsigned int i;

for (i = 0; i < MQ_SIZE; i++) {
struct listnode *lnode, *nnode;
void *data;
bool del;

for (ALL_LIST_ELEMENTS(mq->subq[i], lnode, nnode, data)) {
del = false;

if (i == META_QUEUE_EVPN) {
struct wq_evpn_wrapper *w = data;

if (w->vrf_id == vrf_id) {
XFREE(MTYPE_WQ_WRAPPER, w);
del = true;
}
} else if (i ==
route_info[ZEBRA_ROUTE_NHG].meta_q_map) {
struct wq_nhg_wrapper *w = data;

if (w->type == WQ_NHG_WRAPPER_TYPE_CTX &&
w->u.ctx->vrf_id == vrf_id) {
nhg_ctx_free(&w->u.ctx);
XFREE(MTYPE_WQ_WRAPPER, w);
del = true;
} else if (w->type == WQ_NHG_WRAPPER_TYPE_NHG &&
w->u.nhe->vrf_id == vrf_id) {
zebra_nhg_free(w->u.nhe);
XFREE(MTYPE_WQ_WRAPPER, w);
del = true;
}
} else {
struct route_node *rnode = data;
rib_dest_t *dest = rib_dest_from_rnode(rnode);

if (dest && rib_dest_vrf(dest) == zvrf) {
route_unlock_node(rnode);
del = true;
}
}

if (del) {
list_delete_node(mq->subq[i], lnode);
mq->size--;
}
}
}
}

/* initialise zebra rib work queue */
static void rib_queue_init(void)
{
Expand Down
34 changes: 2 additions & 32 deletions zebra/zebra_vrf.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ static int zebra_vrf_disable(struct vrf *vrf)
struct interface *ifp;
afi_t afi;
safi_t safi;
unsigned i;

assert(zvrf);
if (IS_ZEBRA_DEBUG_EVENT)
Expand Down Expand Up @@ -214,21 +213,7 @@ static int zebra_vrf_disable(struct vrf *vrf)
if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp);

/* clean-up work queues */
for (i = 0; i < MQ_SIZE; i++) {
struct listnode *lnode, *nnode;
struct route_node *rnode;
rib_dest_t *dest;

for (ALL_LIST_ELEMENTS(zrouter.mq->subq[i], lnode, nnode,
rnode)) {
dest = rib_dest_from_rnode(rnode);
if (dest && rib_dest_vrf(dest) == zvrf) {
route_unlock_node(rnode);
list_delete_node(zrouter.mq->subq[i], lnode);
zrouter.mq->size--;
}
}
}
rib_meta_queue_free_vrf(zrouter.mq, zvrf);

/* Cleanup (free) routing tables and NHT tables. */
for (afi = AFI_IP; afi <= AFI_IP6; afi++) {
Expand Down Expand Up @@ -257,29 +242,14 @@ static int zebra_vrf_delete(struct vrf *vrf)
struct route_table *table;
afi_t afi;
safi_t safi;
unsigned i;

assert(zvrf);
if (IS_ZEBRA_DEBUG_EVENT)
zlog_debug("VRF %s id %u deleted", zvrf_name(zvrf),
zvrf_id(zvrf));

/* clean-up work queues */
for (i = 0; i < MQ_SIZE; i++) {
struct listnode *lnode, *nnode;
struct route_node *rnode;
rib_dest_t *dest;

for (ALL_LIST_ELEMENTS(zrouter.mq->subq[i], lnode, nnode,
rnode)) {
dest = rib_dest_from_rnode(rnode);
if (dest && rib_dest_vrf(dest) == zvrf) {
route_unlock_node(rnode);
list_delete_node(zrouter.mq->subq[i], lnode);
zrouter.mq->size--;
}
}
}
rib_meta_queue_free_vrf(zrouter.mq, zvrf);

/* Free Vxlan and MPLS. */
zebra_vxlan_close_tables(zvrf);
Expand Down

0 comments on commit e518f42

Please sign in to comment.