zebra: Abstract zebra_delete_rnh

The deletion of a rnh is always proceeded by the same checks
to see if it is done.  Just let zebra_delete_rnh do this test.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
Donald Sharp 2019-01-04 11:02:35 -05:00
parent c05f659a58
commit 8d6848dde2

View File

@ -182,7 +182,11 @@ void zebra_delete_rnh(struct rnh *rnh, rnh_type_t type)
{
struct route_node *rn;
if (!rnh || (rnh->flags & ZEBRA_NHT_DELETED) || !(rn = rnh->node))
if (!list_isempty(rnh->client_list)
|| !list_isempty(rnh->zebra_pseudowire_list))
return;
if ((rnh->flags & ZEBRA_NHT_DELETED) || !(rn = rnh->node))
return;
if (IS_ZEBRA_DEBUG_NHT) {
@ -233,9 +237,7 @@ void zebra_remove_rnh_client(struct rnh *rnh, struct zserv *client,
rnh_str(rnh, buf, sizeof(buf)), type);
}
listnode_delete(rnh->client_list, client);
if (list_isempty(rnh->client_list)
&& list_isempty(rnh->zebra_pseudowire_list))
zebra_delete_rnh(rnh, type);
zebra_delete_rnh(rnh, type);
}
/* XXX move this utility function elsewhere? */
@ -291,9 +293,7 @@ void zebra_deregister_rnh_pseudowire(vrf_id_t vrf_id, struct zebra_pw *pw)
listnode_delete(rnh->zebra_pseudowire_list, pw);
pw->rnh = NULL;
if (list_isempty(rnh->client_list)
&& list_isempty(rnh->zebra_pseudowire_list))
zebra_delete_rnh(rnh, RNH_NEXTHOP_TYPE);
zebra_delete_rnh(rnh, RNH_NEXTHOP_TYPE);
}
/* Apply the NHT route-map for a client to the route (and nexthops)