int ofp_timer_term_global(void) { int i; struct ofp_timer_internal *bufdata, *next; int rc = 0; if (ofp_timer_lookup_shared_memory()) return -1; CHECK_ERROR(ofp_timer_stop_global(), rc); /* Cleanup long timers*/ for (i = 0; i < TIMER_NUM_LONG_SLOTS; i++) { bufdata = shm->long_table[i]; if (!bufdata) continue; while (bufdata) { next = bufdata->next; odp_buffer_free(bufdata->buf); bufdata = next; } } /* Cleanup timer related ODP objects*/ if (shm->queue != ODP_QUEUE_INVALID) { CHECK_ERROR(odp_queue_destroy(shm->queue), rc); shm->queue = ODP_QUEUE_INVALID; } if (shm->socket_timer_pool != ODP_TIMER_POOL_INVALID) { odp_timer_pool_destroy(shm->socket_timer_pool); shm->socket_timer_pool = ODP_TIMER_POOL_INVALID; } if (shm->buf_pool != ODP_POOL_INVALID) { CHECK_ERROR(odp_pool_destroy(shm->buf_pool), rc); shm->buf_pool = ODP_POOL_INVALID; } if (shm->pool != ODP_POOL_INVALID) { CHECK_ERROR(odp_pool_destroy(shm->pool), rc); shm->pool = ODP_POOL_INVALID; } CHECK_ERROR(ofp_timer_free_shared_memory(), rc); return rc; }
int ofp_term_post_global(const char *pool_name) { odp_pool_t pool; int rc = 0; if (ofp_inet_term()) { OFP_ERR("Failed to cleanup inet/inet6 domains.\n"); rc = -1; } /* Cleanup sockets */ CHECK_ERROR(ofp_socket_term_global(), rc); /* Cleanup vxlan */ CHECK_ERROR(ofp_vxlan_term_global(), rc); /* Cleanup interface related objects */ CHECK_ERROR(ofp_portconf_term_global(), rc); /* Cleanup routes */ CHECK_ERROR(ofp_route_term_global(), rc); /* Cleanup ARP*/ CHECK_ERROR(ofp_arp_term_global(), rc); /* Cleanup hooks */ CHECK_ERROR(ofp_hook_term_global(), rc); /* Cleanup stats */ CHECK_ERROR(ofp_stat_term_global(), rc); /* Cleanup packet capture */ CHECK_ERROR(ofp_pcap_term_global(), rc); /* Cleanup reassembly queues*/ CHECK_ERROR(ofp_reassembly_term_global(), rc); /* Cleanup avl trees*/ CHECK_ERROR(ofp_avl_term_global(), rc); /* Cleanup timers - phase 1*/ CHECK_ERROR(ofp_timer_stop_global(), rc); /* Cleanup pending events */ schedule_shutdown(); /* Cleanup timers - phase 2*/ CHECK_ERROR(ofp_timer_term_global(), rc); /* Cleanup packet pool */ pool = odp_pool_lookup(pool_name); if (pool == ODP_POOL_INVALID) { OFP_ERR("Failed to locate pool %s\n", pool_name); rc = -1; } else if (odp_pool_destroy(pool) < 0) { OFP_ERR("Failed to destroy pool %s.\n", pool_name); rc = -1; pool = ODP_POOL_INVALID; } CHECK_ERROR(ofp_global_config_free_shared_memory(), rc); CHECK_ERROR(ofp_unregister_sysctls(), rc); return rc; }