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; }
static int ucast_dor_build_lfts(void *context) { osm_ucast_mgr_t *mgr = context; int ret; mgr->is_dor = 1; ret = ucast_mgr_build_lfts(mgr); mgr->is_dor = 0; return ret; }
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_lfts(void *context) { return ucast_mgr_build_lfts(context); }