static void __osm_ucast_mgr_process_tbl(IN cl_map_item_t * const p_map_item, IN void *context) { osm_ucast_mgr_t *p_mgr = context; osm_switch_t *const p_sw = (osm_switch_t *) p_map_item; unsigned i, lids_per_port; OSM_LOG_ENTER(p_mgr->p_log); CL_ASSERT(p_sw && p_sw->p_node); OSM_LOG(p_mgr->p_log, OSM_LOG_DEBUG, "Processing switch 0x%" PRIx64 "\n", cl_ntoh64(osm_node_get_node_guid(p_sw->p_node))); /* Initialize LIDs in buffer to invalid port number. */ memset(p_sw->new_lft, OSM_NO_PATH, IB_LID_UCAST_END_HO + 1); if (p_mgr->p_subn->opt.lmc) alloc_ports_priv(p_mgr); /* Iterate through every port setting LID routes for each port based on base LID and LMC value. */ lids_per_port = 1 << p_mgr->p_subn->opt.lmc; for (i = 0; i < lids_per_port; i++) { cl_qlist_t *list = &p_mgr->port_order_list; cl_list_item_t *item; for (item = cl_qlist_head(list); item != cl_qlist_end(list); item = cl_qlist_next(item)) { osm_port_t *port = cl_item_obj(item, port, list_item); __osm_ucast_mgr_process_port(p_mgr, p_sw, port, i); } } osm_ucast_mgr_set_fwd_table(p_mgr, p_sw); if (p_mgr->p_subn->opt.lmc) free_ports_priv(p_mgr); OSM_LOG_EXIT(p_mgr->p_log); }
static int do_ucast_file_load(void *context) { char line[1024]; char *file_name; FILE *file; ib_net64_t sw_guid, port_guid; osm_opensm_t *p_osm = context; osm_switch_t *p_sw; uint16_t lid; uint8_t port_num; unsigned lineno; file_name = p_osm->subn.opt.lfts_file; if (!file_name) { OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, "LFTs file name is not given; " "using default routing algorithm\n"); return 1; } file = fopen(file_name, "r"); if (!file) { OSM_LOG(&p_osm->log, OSM_LOG_ERROR | OSM_LOG_SYS, "ERR 6302: " "cannot open ucast dump file \'%s\': %m\n", file_name); return -1; } lineno = 0; p_sw = NULL; while (fgets(line, sizeof(line) - 1, file) != NULL) { char *p, *q; lineno++; p = line; while (isspace(*p)) p++; if (*p == '#') continue; if (!strncmp(p, "Multicast mlids", 15)) { OSM_LOG(&p_osm->log, OSM_LOG_ERROR | OSM_LOG_SYS, "ERR 6303: " "Multicast dump file detected; " "skipping parsing. Using default " "routing algorithm\n"); } else if (!strncmp(p, "Unicast lids", 12)) { if (p_sw) osm_ucast_mgr_set_fwd_table(&p_osm->sm. ucast_mgr, p_sw); q = strstr(p, " guid 0x"); if (!q) { OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "PARSE ERROR: %s:%u: " "cannot parse switch definition\n", file_name, lineno); return -1; } p = q + 8; sw_guid = strtoull(p, &q, 16); if (q == p || !isspace(*q)) { OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "PARSE ERROR: %s:%u: " "cannot parse switch guid: \'%s\'\n", file_name, lineno, p); return -1; } sw_guid = cl_hton64(sw_guid); p_sw = osm_get_switch_by_guid(&p_osm->subn, sw_guid); if (!p_sw) { OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, "cannot find switch %016" PRIx64 "\n", cl_ntoh64(sw_guid)); continue; } memset(p_sw->new_lft, OSM_NO_PATH, IB_LID_UCAST_END_HO + 1); } else if (p_sw && !strncmp(p, "0x", 2)) { p += 2; lid = (uint16_t) strtoul(p, &q, 16); if (q == p || !isspace(*q)) { OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "PARSE ERROR: %s:%u: " "cannot parse lid: \'%s\'\n", file_name, lineno, p); return -1; } p = q; while (isspace(*p)) p++; port_num = (uint8_t) strtoul(p, &q, 10); if (q == p || !isspace(*q)) { OSM_LOG(&p_osm->log, OSM_LOG_ERROR, "PARSE ERROR: %s:%u: " "cannot parse port: \'%s\'\n", file_name, lineno, p); return -1; } p = q; /* additionally try to exract guid */ q = strstr(p, " portguid 0x"); if (!q) { OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, "PARSE WARNING: %s:%u: " "cannot find port guid " "(maybe broken dump): \'%s\'\n", file_name, lineno, p); port_guid = 0; } else { p = q + 12; port_guid = strtoull(p, &q, 16); if (q == p || (!isspace(*q) && *q != ':')) { OSM_LOG(&p_osm->log, OSM_LOG_VERBOSE, "PARSE WARNING: %s:%u: " "cannot parse port guid " "(maybe broken dump): \'%s\'\n", file_name, lineno, p); port_guid = 0; } } port_guid = cl_hton64(port_guid); add_path(p_osm, p_sw, lid, port_num, port_guid); } } if (p_sw) osm_ucast_mgr_set_fwd_table(&p_osm->sm.ucast_mgr, p_sw); fclose(file); return 0; }