static int ucast_mgr_route(struct osm_routing_engine *r, osm_opensm_t *osm) { int ret; OSM_LOG(&osm->log, OSM_LOG_VERBOSE, "building routing with \'%s\' routing algorithm...\n", r->name); if (!r->build_lid_matrices || (ret = r->build_lid_matrices(r->context)) > 0) ret = osm_ucast_mgr_build_lid_matrices(&osm->sm.ucast_mgr); if (ret < 0) { OSM_LOG(&osm->log, OSM_LOG_ERROR, "%s: cannot build lid matrices.\n", r->name); return ret; } if (!r->ucast_build_fwd_tables || (ret = r->ucast_build_fwd_tables(r->context)) > 0) ret = ucast_mgr_build_lfts(&osm->sm.ucast_mgr); if (ret < 0) { OSM_LOG(&osm->log, OSM_LOG_ERROR, "%s: cannot build fwd tables.\n", r->name); return ret; } osm->routing_engine_used = osm_routing_engine_type(r->name); return 0; }
int osm_ucast_mgr_process(IN osm_ucast_mgr_t * const p_mgr) { osm_opensm_t *p_osm; struct osm_routing_engine *p_routing_eng; cl_qmap_t *p_sw_guid_tbl; OSM_LOG_ENTER(p_mgr->p_log); p_sw_guid_tbl = &p_mgr->p_subn->sw_guid_tbl; p_osm = p_mgr->p_subn->p_osm; p_routing_eng = p_osm->routing_engine_list; CL_PLOCK_EXCL_ACQUIRE(p_mgr->p_lock); /* If there are no switches in the subnet, we are done. */ if (cl_qmap_count(p_sw_guid_tbl) == 0 || ucast_mgr_setup_all_switches(p_mgr->p_subn) < 0) goto Exit; p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_NONE; while (p_routing_eng) { if (!ucast_mgr_route(p_routing_eng, p_osm)) break; p_routing_eng = p_routing_eng->next; } if (p_osm->routing_engine_used == OSM_ROUTING_ENGINE_TYPE_NONE) { /* If configured routing algorithm failed, use default MinHop */ osm_ucast_mgr_build_lid_matrices(p_mgr); ucast_mgr_build_lfts(p_mgr); p_osm->routing_engine_used = OSM_ROUTING_ENGINE_TYPE_MINHOP; } OSM_LOG(p_mgr->p_log, OSM_LOG_INFO, "%s tables configured on all switches\n", osm_routing_engine_type_str(p_osm->routing_engine_used)); if (p_mgr->p_subn->opt.use_ucast_cache) p_mgr->cache_valid = TRUE; Exit: CL_PLOCK_RELEASE(p_mgr->p_lock); OSM_LOG_EXIT(p_mgr->p_log); return 0; }
static int ucast_mgr_route(struct osm_routing_engine *r, osm_opensm_t * osm) { int ret; OSM_LOG(&osm->log, OSM_LOG_VERBOSE, "building routing with \'%s\' routing algorithm...\n", r->name); /* Set the before each lft build to keep the routes in place between sweeps */ if (osm->subn.opt.scatter_ports) srandom(osm->subn.opt.scatter_ports); if (!r->build_lid_matrices || (ret = r->build_lid_matrices(r->context)) > 0) ret = osm_ucast_mgr_build_lid_matrices(&osm->sm.ucast_mgr); if (ret < 0) { OSM_LOG(&osm->log, OSM_LOG_ERROR, "%s: cannot build lid matrices\n", r->name); return ret; } if (!r->ucast_build_fwd_tables || (ret = r->ucast_build_fwd_tables(r->context)) > 0) ret = ucast_mgr_build_lfts(&osm->sm.ucast_mgr); if (ret < 0) { OSM_LOG(&osm->log, OSM_LOG_ERROR, "%s: cannot build fwd tables\n", r->name); return ret; } osm->routing_engine_used = r; osm_ucast_mgr_set_fwd_tables(&osm->sm.ucast_mgr); return 0; }
static int ucast_build_lid_matrices(void *context) { return osm_ucast_mgr_build_lid_matrices(context); }
/* UPDN callback function */ static int updn_lid_matrices(void *ctx) { updn_t *p_updn = ctx; cl_map_item_t *item; osm_switch_t *p_sw; int ret = 0; OSM_LOG_ENTER(&p_updn->p_osm->log); for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); item = cl_qmap_next(item)) { p_sw = (osm_switch_t *)item; p_sw->priv = create_updn_node(p_sw); if (!p_sw->priv) { OSM_LOG(&(p_updn->p_osm->log), OSM_LOG_ERROR, "ERR AA0C: " "cannot create updn node\n"); OSM_LOG_EXIT(&p_updn->p_osm->log); return -1; } } /* First setup root nodes */ p_updn->num_roots = 0; if (p_updn->p_osm->subn.opt.root_guid_file) { OSM_LOG(&p_updn->p_osm->log, OSM_LOG_DEBUG, "UPDN - Fetching root nodes from file \'%s\'\n", p_updn->p_osm->subn.opt.root_guid_file); ret = parse_node_map(p_updn->p_osm->subn.opt.root_guid_file, rank_root_node, p_updn); if (ret) { OSM_LOG(&p_updn->p_osm->log, OSM_LOG_ERROR, "ERR AA02: " "cannot parse root guids file \'%s\'\n", p_updn->p_osm->subn.opt.root_guid_file); osm_ucast_mgr_build_lid_matrices(&p_updn->p_osm->sm.ucast_mgr); updn_find_root_nodes_by_min_hop(p_updn); } else if (p_updn->p_osm->subn.opt.connect_roots && p_updn->num_roots > 1) osm_ucast_mgr_build_lid_matrices(&p_updn->p_osm->sm.ucast_mgr); } else { osm_ucast_mgr_build_lid_matrices(&p_updn->p_osm->sm.ucast_mgr); updn_find_root_nodes_by_min_hop(p_updn); } if (p_updn->p_osm->subn.opt.ids_guid_file) { OSM_LOG(&p_updn->p_osm->log, OSM_LOG_DEBUG, "UPDN - update node ids from file \'%s\'\n", p_updn->p_osm->subn.opt.ids_guid_file); ret = parse_node_map(p_updn->p_osm->subn.opt.ids_guid_file, update_id, p_updn->p_osm); if (ret) OSM_LOG(&p_updn->p_osm->log, OSM_LOG_ERROR, "ERR AA03: " "cannot parse node ids file \'%s\'\n", p_updn->p_osm->subn.opt.ids_guid_file); } /* Only if there are assigned root nodes do the algorithm, otherwise perform do nothing */ if (p_updn->num_roots) { OSM_LOG(&p_updn->p_osm->log, OSM_LOG_DEBUG, "activating UPDN algorithm\n"); ret = updn_build_lid_matrices(p_updn); } else { OSM_LOG(&p_updn->p_osm->log, OSM_LOG_INFO, "disabling UPDN algorithm, no root nodes were found\n"); ret = -1; } if (OSM_LOG_IS_ACTIVE_V2(&p_updn->p_osm->log, OSM_LOG_ROUTING)) osm_dump_qmap_to_file(p_updn->p_osm, "opensm-updn-roots.dump", &p_updn->p_osm->subn.sw_guid_tbl, dump_roots, NULL); for (item = cl_qmap_head(&p_updn->p_osm->subn.sw_guid_tbl); item != cl_qmap_end(&p_updn->p_osm->subn.sw_guid_tbl); item = cl_qmap_next(item)) { p_sw = (osm_switch_t *) item; delete_updn_node(p_sw->priv); } OSM_LOG_EXIT(&p_updn->p_osm->log); return ret; }