#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"
{
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);
#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
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;
NULL,
(void **)&ri)) {
+ if (ri->timer) {
+ struct rfapi_rib_tcb
+ *tcb;
+
+ tcb = THREAD_ARG(
+ ri->timer);
+ THREAD_OFF(ri->timer);
+ XFREE(MTYPE_RFAPI_RECENT_DELETE,
+ tcb);
+ }
rfapi_info_free(ri);
skiplist_delete_first(
(struct skiplist *)
{
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