summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/rfapi/rfapi.c27
-rw-r--r--bgpd/rfapi/rfapi_rib.c19
-rw-r--r--bgpd/rfapi/rfapi_vty.c1
-rw-r--r--lib/link_state.c14
-rw-r--r--ospfd/ospf_lsa.c22
-rw-r--r--zebra/zebra_dplane.c5
6 files changed, 79 insertions, 9 deletions
diff --git a/bgpd/rfapi/rfapi.c b/bgpd/rfapi/rfapi.c
index 8d6db9d775..67c70431bd 100644
--- a/bgpd/rfapi/rfapi.c
+++ b/bgpd/rfapi/rfapi.c
@@ -51,6 +51,8 @@
#include <execinfo.h>
#endif /* HAVE_GLIBC_BACKTRACE */
+#define DEBUG_CLEANUP 0
+
struct ethaddr rfapi_ethaddr0 = {{0}};
#define DEBUG_RFAPI_STR "RF API debugging/testing command\n"
@@ -3677,11 +3679,36 @@ void rfapi_delete(struct bgp *bgp)
{
extern void rfp_clear_vnc_nve_all(void); /* can't fix correctly yet */
+#if DEBUG_CLEANUP
+ zlog_debug("%s: bgp %p", __func__, bgp);
+#endif
+
/*
* This clears queries and registered routes, and closes nves
*/
if (bgp->rfapi)
rfp_clear_vnc_nve_all();
+
+ /*
+ * close any remaining descriptors
+ */
+ struct rfapi *h = bgp->rfapi;
+
+ if (h && h->descriptors.count) {
+ struct listnode *node, *nnode;
+ struct rfapi_descriptor *rfd;
+#if DEBUG_CLEANUP
+ zlog_debug("%s: descriptor count %u", __func__,
+ h->descriptors.count);
+#endif
+ for (ALL_LIST_ELEMENTS(&h->descriptors, node, nnode, rfd)) {
+#if DEBUG_CLEANUP
+ zlog_debug("%s: closing rfd %p", __func__, rfd);
+#endif
+ (void)rfapi_close(rfd);
+ }
+ }
+
bgp_rfapi_cfg_destroy(bgp, bgp->rfapi_cfg);
bgp->rfapi_cfg = NULL;
bgp_rfapi_destroy(bgp, bgp->rfapi);
diff --git a/bgpd/rfapi/rfapi_rib.c b/bgpd/rfapi/rfapi_rib.c
index be9d30768c..5784f95b27 100644
--- a/bgpd/rfapi/rfapi_rib.c
+++ b/bgpd/rfapi/rfapi_rib.c
@@ -40,6 +40,7 @@
#define DEBUG_PENDING_DELETE_ROUTE 0
#define DEBUG_NHL 0
#define DEBUG_RIB_SL_RD 0
+#define DEBUG_CLEANUP 0
/* forward decl */
#if DEBUG_NHL
@@ -327,6 +328,11 @@ static void rfapiRibStartTimer(struct rfapi_descriptor *rfd,
tcb = XCALLOC(MTYPE_RFAPI_RECENT_DELETE,
sizeof(struct rfapi_rib_tcb));
}
+#if DEBUG_CLEANUP
+ zlog_debug("%s: rfd %p, rn %p, ri %p, tcb %p", __func__, rfd, rn, ri,
+ tcb);
+#endif
+
tcb->rfd = rfd;
tcb->ri = ri;
tcb->rn = rn;
@@ -506,6 +512,16 @@ void rfapiRibClear(struct rfapi_descriptor *rfd)
NULL,
(void **)&ri)) {
+ if (ri->timer) {
+ struct rfapi_rib_tcb
+ *tcb;
+
+ tcb = EVENT_ARG(
+ ri->timer);
+ EVENT_OFF(ri->timer);
+ XFREE(MTYPE_RFAPI_RECENT_DELETE,
+ tcb);
+ }
rfapi_info_free(ri);
skiplist_delete_first(
(struct skiplist *)
@@ -555,6 +571,9 @@ void rfapiRibFree(struct rfapi_descriptor *rfd)
{
afi_t afi;
+#if DEBUG_CLEANUP
+ zlog_debug("%s: rfd %p", __func__, rfd);
+#endif
/*
* NB rfd is typically detached from master list, so is not included
diff --git a/bgpd/rfapi/rfapi_vty.c b/bgpd/rfapi/rfapi_vty.c
index 2877c29c20..29698846c3 100644
--- a/bgpd/rfapi/rfapi_vty.c
+++ b/bgpd/rfapi/rfapi_vty.c
@@ -4888,6 +4888,7 @@ static int vnc_clear_vrf(struct vty *vty, struct bgp *bgp, const char *arg_vrf,
clear_vnc_prefix(&cda);
vty_out(vty, "Cleared %u out of %d prefixes.\n", cda.pfx_count,
start_count);
+ print_cleared_stats(&cda); /* frees lists in cda */
return CMD_SUCCESS;
}
diff --git a/lib/link_state.c b/lib/link_state.c
index 076030a839..7f20cdcf5e 100644
--- a/lib/link_state.c
+++ b/lib/link_state.c
@@ -1907,6 +1907,20 @@ void ls_delete_msg(struct ls_message *msg)
if (msg == NULL)
return;
+ if (msg->event == LS_MSG_EVENT_DELETE) {
+ switch (msg->type) {
+ case LS_MSG_TYPE_NODE:
+ ls_node_del(msg->data.node);
+ break;
+ case LS_MSG_TYPE_ATTRIBUTES:
+ ls_attributes_del(msg->data.attr);
+ break;
+ case LS_MSG_TYPE_PREFIX:
+ ls_prefix_del(msg->data.prefix);
+ break;
+ }
+ }
+
XFREE(MTYPE_LS_DB, msg);
}
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c
index 87b683b15d..9e2dd7a457 100644
--- a/ospfd/ospf_lsa.c
+++ b/ospfd/ospf_lsa.c
@@ -2013,7 +2013,7 @@ struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *ospf,
struct ospf_lsa *type7,
struct ospf_lsa *type5)
{
- struct ospf_lsa *new;
+ struct ospf_lsa *new, *translated_lsa;
struct as_external_lsa *extnew;
if (ospf->gr_info.restart_in_progress) {
@@ -2027,7 +2027,8 @@ struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *ospf,
* the OSPF_LSA_LOCAL_XLT flag, must originate by hand
*/
- if ((new = ospf_lsa_translated_nssa_new(ospf, type7)) == NULL) {
+ if ((translated_lsa = ospf_lsa_translated_nssa_new(ospf, type7)) ==
+ NULL) {
if (IS_DEBUG_OSPF_NSSA)
zlog_debug(
"%s: Could not translate Type-7, Id %pI4, to Type-5",
@@ -2035,16 +2036,17 @@ struct ospf_lsa *ospf_translated_nssa_originate(struct ospf *ospf,
return NULL;
}
- extnew = (struct as_external_lsa *)new->data;
+ extnew = (struct as_external_lsa *)translated_lsa->data;
/* Update LSA sequence number from translated Type-5 LSA */
if (type5)
- new->data->ls_seqnum = lsa_seqnum_increment(type5);
+ translated_lsa->data->ls_seqnum = lsa_seqnum_increment(type5);
- if ((new = ospf_lsa_install(ospf, NULL, new)) == NULL) {
+ if ((new = ospf_lsa_install(ospf, NULL, translated_lsa)) == NULL) {
flog_warn(EC_OSPF_LSA_INSTALL_FAILURE,
"%s: Could not install LSA id %pI4", __func__,
&type7->data->id);
+ ospf_lsa_free(translated_lsa);
return NULL;
}
@@ -2067,7 +2069,7 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf,
struct ospf_lsa *type7,
struct ospf_lsa *type5)
{
- struct ospf_lsa *new = NULL;
+ struct ospf_lsa *new = NULL, *translated_lsa = NULL;
struct as_external_lsa *extold = NULL;
uint32_t ls_seqnum = 0;
@@ -2143,7 +2145,8 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf,
ospf_ls_retransmit_delete_nbr_as(ospf, type5);
/* create new translated LSA */
- if ((new = ospf_lsa_translated_nssa_new(ospf, type7)) == NULL) {
+ if ((translated_lsa = ospf_lsa_translated_nssa_new(ospf, type7)) ==
+ NULL) {
if (IS_DEBUG_OSPF_NSSA)
zlog_debug(
"%s: Could not translate Type-7 for %pI4 to Type-5",
@@ -2153,13 +2156,14 @@ struct ospf_lsa *ospf_translated_nssa_refresh(struct ospf *ospf,
if (type7->area->suppress_fa == 1) {
if (extold->e[0].fwd_addr.s_addr == 0)
- new->data->ls_seqnum = htonl(ls_seqnum + 1);
+ translated_lsa->data->ls_seqnum = htonl(ls_seqnum + 1);
}
- if (!(new = ospf_lsa_install(ospf, NULL, new))) {
+ if (!(new = ospf_lsa_install(ospf, NULL, translated_lsa))) {
flog_warn(EC_OSPF_LSA_INSTALL_FAILURE,
"%s: Could not install translated LSA, Id %pI4",
__func__, &type7->data->id);
+ ospf_lsa_free(translated_lsa);
return NULL;
}
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index f9253ebf76..e821572c5d 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -3745,6 +3745,11 @@ dplane_route_update_internal(struct route_node *rn,
NEXTHOP_FLAG_FIB);
}
+ if ((op == DPLANE_OP_ROUTE_UPDATE) && old_re && re &&
+ (old_re != re) &&
+ !CHECK_FLAG(re->status, ROUTE_ENTRY_INSTALLED))
+ SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED);
+
dplane_ctx_free(&ctx);
return ZEBRA_DPLANE_REQUEST_SUCCESS;
}