static inline lagopus_result_t bridgeq_mgr_map_to_array(void) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; if (bridgeq_table != NULL) { bridgeq_mgr_lock(); n_bridgeqs = 0; if (lagopus_hashmap_size(&bridgeq_table) != 0) { /* NOTE: * hashmap_iterate() is very slow. */ ret = lagopus_hashmap_iterate(&bridgeq_table, iter_to_array, NULL); } else { ret = LAGOPUS_RESULT_OK; } bridgeq_mgr_unlock(); } else { ret = LAGOPUS_RESULT_INVALID_OBJECT; lagopus_msg_warning("bridgeq_table is NULL.\n"); } return ret; }
static inline lagopus_result_t s_config_list(testobj_config_t ***list) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; if (list != NULL) { size_t n = (size_t)lagopus_hashmap_size(&s_tbl); *list = NULL; if (n > 0) { testobj_config_t **configs = (testobj_config_t **) malloc(sizeof(testobj_config_t *) * n); if (configs != NULL) { testobj_config_iter_ctx_t ctx; ctx.m_configs = configs; ctx.m_n_configs = 0; ctx.m_max = n; ret = lagopus_hashmap_iterate(&s_tbl, s_config_iterate, (void *)&ctx); if (ret == LAGOPUS_RESULT_OK) { *list = configs; ret = (ssize_t)n; } else { free((void *)configs); } } else { ret = LAGOPUS_RESULT_NO_MEMORY; } } else { ret = LAGOPUS_RESULT_OK; } } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
lagopus_result_t get_port_desc(lagopus_hashmap_t *hm, struct port_desc_list *list, struct ofp_error *error) { (void) error; lagopus_hashmap_iterate(hm, port_do_desc_iterate, list); return LAGOPUS_RESULT_OK; }
static inline void s_final_numa_thingies(void) { if (s_numa_nodes != NULL) { free((void *)s_numa_nodes); if (s_tbl != NULL) { (void)lagopus_hashmap_iterate(&s_tbl, s_free_all, NULL); (void)lagopus_hashmap_destroy(&s_tbl, true); } lagopus_msg_debug(5, "The NUMA aware memory allocator is finalized.\n"); } }
lagopus_result_t lagopus_get_port_statistics(lagopus_hashmap_t *hm, struct ofp_port_stats_request *request, struct port_stats_list *list, struct ofp_error *error) { struct port *port; if (request->port_no == OFPP_ANY) { lagopus_hashmap_iterate(hm, port_do_stats_iterate, list); } else { if (lagopus_hashmap_find(hm, (void *)request->port_no, &port) != LAGOPUS_RESULT_OK) { error->type = OFPET_BAD_REQUEST; error->code = OFPBRC_BAD_PORT; lagopus_msg_info("port stats: %d: no such port (%d:%d)\n", request->port_no, error->type, error->code); return LAGOPUS_RESULT_OFP_ERROR; } port_add_stats(port, list); } return LAGOPUS_RESULT_OK; }