|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 2002-2015 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
13e616 |
* Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* This software is available to you under a choice of one of two
|
|
Packit |
13e616 |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
13e616 |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
13e616 |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
13e616 |
* OpenIB.org BSD license below:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
13e616 |
* without modification, are permitted provided that the following
|
|
Packit |
13e616 |
* conditions are met:
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions of source code must retain the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
13e616 |
* copyright notice, this list of conditions and the following
|
|
Packit |
13e616 |
* disclaimer in the documentation and/or other materials
|
|
Packit |
13e616 |
* provided with the distribution.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
13e616 |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
13e616 |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
13e616 |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
13e616 |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
13e616 |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
13e616 |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
13e616 |
* SOFTWARE.
|
|
Packit |
13e616 |
*
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Abstract:
|
|
Packit |
13e616 |
* Various OpenSM dumpers
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#if HAVE_CONFIG_H
|
|
Packit |
13e616 |
# include <config.h>
|
|
Packit |
13e616 |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
#include <unistd.h>
|
|
Packit |
13e616 |
#include <stdlib.h>
|
|
Packit |
13e616 |
#include <string.h>
|
|
Packit |
13e616 |
#include <errno.h>
|
|
Packit |
13e616 |
#include <iba/ib_types.h>
|
|
Packit |
13e616 |
#include <complib/cl_qmap.h>
|
|
Packit |
13e616 |
#include <complib/cl_debug.h>
|
|
Packit |
13e616 |
#include <opensm/osm_file_ids.h>
|
|
Packit |
13e616 |
#define FILE_ID OSM_FILE_DUMP_C
|
|
Packit |
13e616 |
#include <opensm/osm_opensm.h>
|
|
Packit |
13e616 |
#include <opensm/osm_log.h>
|
|
Packit |
13e616 |
#include <opensm/osm_node.h>
|
|
Packit |
13e616 |
#include <opensm/osm_switch.h>
|
|
Packit |
13e616 |
#include <opensm/osm_helper.h>
|
|
Packit |
13e616 |
#include <opensm/osm_msgdef.h>
|
|
Packit |
13e616 |
#include <opensm/osm_opensm.h>
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_ucast_path_distribution(cl_map_item_t * item, FILE * file,
|
|
Packit |
13e616 |
void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_node_t *p_node;
|
|
Packit |
13e616 |
osm_node_t *p_remote_node;
|
|
Packit |
13e616 |
uint8_t i;
|
|
Packit |
13e616 |
uint8_t num_ports;
|
|
Packit |
13e616 |
uint32_t num_paths;
|
|
Packit |
13e616 |
ib_net64_t remote_guid_ho;
|
|
Packit |
13e616 |
osm_switch_t *p_sw = (osm_switch_t *) item;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_node = p_sw->p_node;
|
|
Packit |
13e616 |
num_ports = p_sw->num_ports;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "dump_ucast_path_distribution: Switch 0x%" PRIx64 "\n"
|
|
Packit |
13e616 |
"Port : Path Count Through Port",
|
|
Packit |
13e616 |
cl_ntoh64(osm_node_get_node_guid(p_node)));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (i = 0; i < num_ports; i++) {
|
|
Packit |
13e616 |
num_paths = osm_switch_path_count_get(p_sw, i);
|
|
Packit |
13e616 |
fprintf(file, "\n %03u : %u", i, num_paths);
|
|
Packit |
13e616 |
if (i == 0) {
|
|
Packit |
13e616 |
fprintf(file, " (switch management port)");
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_remote_node = osm_node_get_remote_node(p_node, i, NULL);
|
|
Packit |
13e616 |
if (p_remote_node == NULL)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
remote_guid_ho =
|
|
Packit |
13e616 |
cl_ntoh64(osm_node_get_node_guid(p_remote_node));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
switch (osm_node_get_type(p_remote_node)) {
|
|
Packit |
13e616 |
case IB_NODE_TYPE_SWITCH:
|
|
Packit |
13e616 |
fprintf(file, " (link to switch");
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
case IB_NODE_TYPE_ROUTER:
|
|
Packit |
13e616 |
fprintf(file, " (link to router");
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
case IB_NODE_TYPE_CA:
|
|
Packit |
13e616 |
fprintf(file, " (link to CA");
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
default:
|
|
Packit |
13e616 |
fprintf(file, " (link to unknown node type");
|
|
Packit |
13e616 |
break;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, " 0x%" PRIx64 ")", remote_guid_ho);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_ucast_routes(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
const osm_node_t *p_node;
|
|
Packit |
13e616 |
osm_port_t *p_port;
|
|
Packit |
13e616 |
uint8_t port_num;
|
|
Packit |
13e616 |
uint8_t num_hops;
|
|
Packit |
13e616 |
uint8_t best_hops;
|
|
Packit |
13e616 |
uint8_t best_port;
|
|
Packit |
13e616 |
uint16_t max_lid_ho;
|
|
Packit |
13e616 |
uint16_t lid_ho, base_lid;
|
|
Packit |
13e616 |
boolean_t direct_route_exists = FALSE;
|
|
Packit |
13e616 |
boolean_t dor;
|
|
Packit |
13e616 |
osm_switch_t *p_sw = (osm_switch_t *) item;
|
|
Packit |
13e616 |
osm_opensm_t *p_osm = cxt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_node = p_sw->p_node;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
max_lid_ho = p_sw->max_lid_ho;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "dump_ucast_routes: "
|
|
Packit |
13e616 |
"Switch 0x%016" PRIx64 "\nLID : Port : Hops : Optimal\n",
|
|
Packit |
13e616 |
cl_ntoh64(osm_node_get_node_guid(p_node)));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
dor = (p_osm->routing_engine_used &&
|
|
Packit |
13e616 |
p_osm->routing_engine_used->type == OSM_ROUTING_ENGINE_TYPE_DOR);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (lid_ho = 1; lid_ho <= max_lid_ho; lid_ho++) {
|
|
Packit |
13e616 |
fprintf(file, "0x%04X : ", lid_ho);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid_ho);
|
|
Packit |
13e616 |
if (!p_port) {
|
|
Packit |
13e616 |
fprintf(file, "UNREACHABLE\n");
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
port_num = osm_switch_get_port_by_lid(p_sw, lid_ho,
|
|
Packit |
13e616 |
OSM_NEW_LFT);
|
|
Packit |
13e616 |
if (port_num == OSM_NO_PATH) {
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
This may occur if there are 'holes' in the existing
|
|
Packit |
13e616 |
LID assignments. Running SM with --reassign_lids
|
|
Packit |
13e616 |
will reassign and compress the LID range. The
|
|
Packit |
13e616 |
subnet should work fine either way.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
fprintf(file, "UNREACHABLE\n");
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
Switches can lie about which port routes a given
|
|
Packit |
13e616 |
lid due to a recent reconfiguration of the subnet.
|
|
Packit |
13e616 |
Therefore, ensure that the hop count is better than
|
|
Packit |
13e616 |
OSM_NO_PATH.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (p_port->p_node->sw) {
|
|
Packit |
13e616 |
/* Target LID is switch.
|
|
Packit |
13e616 |
Get its base lid and check hop count for this base LID only. */
|
|
Packit |
13e616 |
base_lid = osm_node_get_base_lid(p_port->p_node, 0);
|
|
Packit |
13e616 |
base_lid = cl_ntoh16(base_lid);
|
|
Packit |
13e616 |
num_hops =
|
|
Packit |
13e616 |
osm_switch_get_hop_count(p_sw, base_lid, port_num);
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
/* Target LID is not switch (CA or router).
|
|
Packit |
13e616 |
Check if we have route to this target from current switch. */
|
|
Packit |
13e616 |
num_hops =
|
|
Packit |
13e616 |
osm_switch_get_hop_count(p_sw, lid_ho, port_num);
|
|
Packit |
13e616 |
if (num_hops != OSM_NO_PATH) {
|
|
Packit |
13e616 |
direct_route_exists = TRUE;
|
|
Packit |
13e616 |
base_lid = lid_ho;
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
osm_physp_t *p_physp = p_port->p_physp;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!p_physp || !p_physp->p_remote_physp ||
|
|
Packit |
13e616 |
!p_physp->p_remote_physp->p_node->sw)
|
|
Packit |
13e616 |
num_hops = OSM_NO_PATH;
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
base_lid =
|
|
Packit |
13e616 |
osm_node_get_base_lid(p_physp->
|
|
Packit |
13e616 |
p_remote_physp->
|
|
Packit |
13e616 |
p_node, 0);
|
|
Packit |
13e616 |
base_lid = cl_ntoh16(base_lid);
|
|
Packit |
13e616 |
num_hops =
|
|
Packit |
13e616 |
p_physp->p_remote_physp->p_node->
|
|
Packit |
13e616 |
sw ==
|
|
Packit |
13e616 |
p_sw ? 0 :
|
|
Packit |
13e616 |
osm_switch_get_hop_count(p_sw,
|
|
Packit |
13e616 |
base_lid,
|
|
Packit |
13e616 |
port_num);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (num_hops == OSM_NO_PATH) {
|
|
Packit |
13e616 |
fprintf(file, "%03u : HOPS UNKNOWN\n", port_num);
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
best_hops = osm_switch_get_least_hops(p_sw, base_lid);
|
|
Packit |
13e616 |
if (!p_port->p_node->sw && !direct_route_exists) {
|
|
Packit |
13e616 |
best_hops++;
|
|
Packit |
13e616 |
num_hops++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "%03u : %02u : ", port_num, num_hops);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (best_hops == num_hops)
|
|
Packit |
13e616 |
fprintf(file, "yes");
|
|
Packit |
13e616 |
else {
|
|
Packit |
13e616 |
/* No LMC Optimization */
|
|
Packit |
13e616 |
best_port = osm_switch_recommend_path(p_sw, p_port,
|
|
Packit |
13e616 |
lid_ho, 1, TRUE,
|
|
Packit |
13e616 |
FALSE, dor,
|
|
Packit |
13e616 |
p_osm->subn.opt.port_shifting,
|
|
Packit |
13e616 |
p_osm->subn.opt.scatter_ports,
|
|
Packit |
13e616 |
OSM_NEW_LFT);
|
|
Packit |
13e616 |
fprintf(file, "No %u hop path possible via port %u!",
|
|
Packit |
13e616 |
best_hops, best_port);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_mcast_routes(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_switch_t *p_sw = (osm_switch_t *) item;
|
|
Packit |
13e616 |
osm_mcast_tbl_t *p_tbl;
|
|
Packit |
13e616 |
int16_t mlid_ho = 0;
|
|
Packit |
13e616 |
int16_t mlid_start_ho;
|
|
Packit |
13e616 |
uint8_t position = 0;
|
|
Packit |
13e616 |
int16_t block_num = 0;
|
|
Packit |
13e616 |
boolean_t first_mlid;
|
|
Packit |
13e616 |
boolean_t first_port;
|
|
Packit |
13e616 |
const osm_node_t *p_node;
|
|
Packit |
13e616 |
uint16_t i, j;
|
|
Packit |
13e616 |
uint16_t mask_entry;
|
|
Packit |
13e616 |
char sw_hdr[256];
|
|
Packit |
13e616 |
char mlid_hdr[32];
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_node = p_sw->p_node;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_tbl = osm_switch_get_mcast_tbl_ptr(p_sw);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
sprintf(sw_hdr, "\nSwitch 0x%016" PRIx64 "\nLID : Out Port(s)\n",
|
|
Packit |
13e616 |
cl_ntoh64(osm_node_get_node_guid(p_node)));
|
|
Packit |
13e616 |
first_mlid = TRUE;
|
|
Packit |
13e616 |
while (block_num <= p_tbl->max_block_in_use) {
|
|
Packit |
13e616 |
mlid_start_ho = (uint16_t) (block_num * IB_MCAST_BLOCK_SIZE);
|
|
Packit |
13e616 |
for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++) {
|
|
Packit |
13e616 |
mlid_ho = mlid_start_ho + i;
|
|
Packit |
13e616 |
position = 0;
|
|
Packit |
13e616 |
first_port = TRUE;
|
|
Packit |
13e616 |
sprintf(mlid_hdr, "0x%04X :",
|
|
Packit |
13e616 |
mlid_ho + IB_LID_MCAST_START_HO);
|
|
Packit |
13e616 |
while (position <= p_tbl->max_position) {
|
|
Packit |
13e616 |
mask_entry =
|
|
Packit |
13e616 |
cl_ntoh16((*p_tbl->
|
|
Packit |
13e616 |
p_mask_tbl)[mlid_ho][position]);
|
|
Packit |
13e616 |
if (mask_entry == 0) {
|
|
Packit |
13e616 |
position++;
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
for (j = 0; j < 16; j++) {
|
|
Packit |
13e616 |
if ((1 << j) & mask_entry) {
|
|
Packit |
13e616 |
if (first_mlid) {
|
|
Packit |
13e616 |
fprintf(file, "%s",
|
|
Packit |
13e616 |
sw_hdr);
|
|
Packit |
13e616 |
first_mlid = FALSE;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (first_port) {
|
|
Packit |
13e616 |
fprintf(file, "%s",
|
|
Packit |
13e616 |
mlid_hdr);
|
|
Packit |
13e616 |
first_port = FALSE;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
fprintf(file, " 0x%03X ",
|
|
Packit |
13e616 |
j + (position * 16));
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
position++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
if (first_port == FALSE)
|
|
Packit |
13e616 |
fprintf(file, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
block_num++;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_lid_matrix(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_switch_t *p_sw = (osm_switch_t *) item;
|
|
Packit |
13e616 |
osm_opensm_t *p_osm = cxt;
|
|
Packit |
13e616 |
osm_node_t *p_node = p_sw->p_node;
|
|
Packit |
13e616 |
unsigned max_lid = p_sw->max_lid_ho;
|
|
Packit |
13e616 |
unsigned max_port = p_sw->num_ports;
|
|
Packit |
13e616 |
uint16_t lid;
|
|
Packit |
13e616 |
uint8_t port;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "Switch: guid 0x%016" PRIx64 "\n",
|
|
Packit |
13e616 |
cl_ntoh64(osm_node_get_node_guid(p_node)));
|
|
Packit |
13e616 |
for (lid = 1; lid <= max_lid; lid++) {
|
|
Packit |
13e616 |
osm_port_t *p_port;
|
|
Packit |
13e616 |
if (osm_switch_get_least_hops(p_sw, lid) == OSM_NO_PATH)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
fprintf(file, "0x%04x:", lid);
|
|
Packit |
13e616 |
for (port = 0; port < max_port; port++)
|
|
Packit |
13e616 |
fprintf(file, " %02x",
|
|
Packit |
13e616 |
osm_switch_get_hop_count(p_sw, lid, port));
|
|
Packit |
13e616 |
p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid);
|
|
Packit |
13e616 |
if (p_port)
|
|
Packit |
13e616 |
fprintf(file, " # portguid 0x%016" PRIx64,
|
|
Packit |
13e616 |
cl_ntoh64(osm_port_get_guid(p_port)));
|
|
Packit |
13e616 |
fprintf(file, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_ucast_lfts(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_switch_t *p_sw = (osm_switch_t *) item;
|
|
Packit |
13e616 |
osm_opensm_t *p_osm = cxt;
|
|
Packit |
13e616 |
osm_node_t *p_node = p_sw->p_node;
|
|
Packit |
13e616 |
unsigned max_lid = p_sw->max_lid_ho;
|
|
Packit |
13e616 |
unsigned max_port = p_sw->num_ports;
|
|
Packit |
13e616 |
uint16_t lid;
|
|
Packit |
13e616 |
uint8_t port;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "Unicast lids [0-%u] of switch Lid %u guid 0x%016"
|
|
Packit |
13e616 |
PRIx64 " (\'%s\'):\n",
|
|
Packit |
13e616 |
max_lid, cl_ntoh16(osm_node_get_base_lid(p_node, 0)),
|
|
Packit |
13e616 |
cl_ntoh64(osm_node_get_node_guid(p_node)), p_node->print_desc);
|
|
Packit |
13e616 |
for (lid = 0; lid <= max_lid; lid++) {
|
|
Packit |
13e616 |
osm_port_t *p_port;
|
|
Packit |
13e616 |
port = osm_switch_get_port_by_lid(p_sw, lid, OSM_NEW_LFT);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (port >= max_port)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "0x%04x %03u # ", lid, port);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_port = osm_get_port_by_lid_ho(&p_osm->subn, lid);
|
|
Packit |
13e616 |
if (p_port) {
|
|
Packit |
13e616 |
p_node = p_port->p_node;
|
|
Packit |
13e616 |
fprintf(file, "%s portguid 0x%016" PRIx64 ": \'%s\'",
|
|
Packit |
13e616 |
ib_get_node_type_str(osm_node_get_type(p_node)),
|
|
Packit |
13e616 |
cl_ntoh64(osm_port_get_guid(p_port)),
|
|
Packit |
13e616 |
p_node->print_desc);
|
|
Packit |
13e616 |
} else
|
|
Packit |
13e616 |
fprintf(file, "unknown node and type");
|
|
Packit |
13e616 |
fprintf(file, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
fprintf(file, "%u lids dumped\n", max_lid);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_topology_node(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_node_t *p_node = (osm_node_t *) item;
|
|
Packit |
13e616 |
uint32_t cPort;
|
|
Packit |
13e616 |
osm_node_t *p_nbnode;
|
|
Packit |
13e616 |
osm_physp_t *p_physp, *p_default_physp, *p_rphysp;
|
|
Packit |
13e616 |
uint8_t link_speed_act;
|
|
Packit |
13e616 |
const char *link_speed_act_str, *link_width_act_str;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!p_node->node_info.num_ports)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (cPort = 1; cPort < osm_node_get_num_physp(p_node); cPort++) {
|
|
Packit |
13e616 |
uint8_t port_state;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_physp = osm_node_get_physp_ptr(p_node, cPort);
|
|
Packit |
13e616 |
if (!p_physp)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_rphysp = p_physp->p_remote_physp;
|
|
Packit |
13e616 |
if (!p_rphysp)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
CL_ASSERT(cPort == p_physp->port_num);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_node->node_info.node_type == IB_NODE_TYPE_SWITCH)
|
|
Packit |
13e616 |
p_default_physp = osm_node_get_physp_ptr(p_node, 0);
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
p_default_physp = p_physp;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "{ %s%s Ports:%02X SystemGUID:%016" PRIx64
|
|
Packit |
13e616 |
" NodeGUID:%016" PRIx64 " PortGUID:%016" PRIx64
|
|
Packit |
13e616 |
" VenID:%06X DevID:%04X Rev:%08X {%s} LID:%04X PN:%02X } ",
|
|
Packit |
13e616 |
p_node->node_info.node_type == IB_NODE_TYPE_SWITCH ?
|
|
Packit |
13e616 |
"SW" : p_node->node_info.node_type ==
|
|
Packit |
13e616 |
IB_NODE_TYPE_CA ? "CA" : p_node->node_info.node_type ==
|
|
Packit |
13e616 |
IB_NODE_TYPE_ROUTER ? "Rt" : "**",
|
|
Packit |
13e616 |
p_default_physp->port_info.base_lid ==
|
|
Packit |
13e616 |
p_default_physp->port_info.
|
|
Packit |
13e616 |
master_sm_base_lid ? "-SM" : "",
|
|
Packit |
13e616 |
p_node->node_info.num_ports,
|
|
Packit |
13e616 |
cl_ntoh64(p_node->node_info.sys_guid),
|
|
Packit |
13e616 |
cl_ntoh64(p_node->node_info.node_guid),
|
|
Packit |
13e616 |
cl_ntoh64(p_physp->port_guid),
|
|
Packit |
13e616 |
cl_ntoh32(ib_node_info_get_vendor_id
|
|
Packit |
13e616 |
(&p_node->node_info)),
|
|
Packit |
13e616 |
cl_ntoh16(p_node->node_info.device_id),
|
|
Packit |
13e616 |
cl_ntoh32(p_node->node_info.revision),
|
|
Packit |
13e616 |
p_node->print_desc,
|
|
Packit |
13e616 |
cl_ntoh16(p_default_physp->port_info.base_lid), cPort);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_nbnode = p_rphysp->p_node;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_nbnode->node_info.node_type == IB_NODE_TYPE_SWITCH)
|
|
Packit |
13e616 |
p_default_physp = osm_node_get_physp_ptr(p_nbnode, 0);
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
p_default_physp = p_rphysp;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "{ %s%s Ports:%02X SystemGUID:%016" PRIx64
|
|
Packit |
13e616 |
" NodeGUID:%016" PRIx64 " PortGUID:%016" PRIx64
|
|
Packit |
13e616 |
" VenID:%08X DevID:%04X Rev:%08X {%s} LID:%04X PN:%02X } ",
|
|
Packit |
13e616 |
p_nbnode->node_info.node_type == IB_NODE_TYPE_SWITCH ?
|
|
Packit |
13e616 |
"SW" : p_nbnode->node_info.node_type ==
|
|
Packit |
13e616 |
IB_NODE_TYPE_CA ? "CA" :
|
|
Packit |
13e616 |
p_nbnode->node_info.node_type == IB_NODE_TYPE_ROUTER ?
|
|
Packit |
13e616 |
"Rt" : "**",
|
|
Packit |
13e616 |
p_default_physp->port_info.base_lid ==
|
|
Packit |
13e616 |
p_default_physp->port_info.
|
|
Packit |
13e616 |
master_sm_base_lid ? "-SM" : "",
|
|
Packit |
13e616 |
p_nbnode->node_info.num_ports,
|
|
Packit |
13e616 |
cl_ntoh64(p_nbnode->node_info.sys_guid),
|
|
Packit |
13e616 |
cl_ntoh64(p_nbnode->node_info.node_guid),
|
|
Packit |
13e616 |
cl_ntoh64(p_rphysp->port_guid),
|
|
Packit |
13e616 |
cl_ntoh32(ib_node_info_get_vendor_id
|
|
Packit |
13e616 |
(&p_nbnode->node_info)),
|
|
Packit |
13e616 |
cl_ntoh32(p_nbnode->node_info.device_id),
|
|
Packit |
13e616 |
cl_ntoh32(p_nbnode->node_info.revision),
|
|
Packit |
13e616 |
p_nbnode->print_desc,
|
|
Packit |
13e616 |
cl_ntoh16(p_default_physp->port_info.base_lid),
|
|
Packit |
13e616 |
p_rphysp->port_num);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
port_state = ib_port_info_get_port_state(&p_physp->port_info);
|
|
Packit |
13e616 |
link_speed_act =
|
|
Packit |
13e616 |
ib_port_info_get_link_speed_active(&p_physp->port_info);
|
|
Packit |
13e616 |
if (link_speed_act == IB_LINK_SPEED_ACTIVE_2_5)
|
|
Packit |
13e616 |
link_speed_act_str = "2.5";
|
|
Packit |
13e616 |
else if (link_speed_act == IB_LINK_SPEED_ACTIVE_5)
|
|
Packit |
13e616 |
link_speed_act_str = "5";
|
|
Packit |
13e616 |
else if (link_speed_act == IB_LINK_SPEED_ACTIVE_10)
|
|
Packit |
13e616 |
link_speed_act_str = "10";
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
link_speed_act_str = "??";
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_physp->ext_port_info.link_speed_active & FDR10)
|
|
Packit |
13e616 |
link_speed_act_str = "FDR10";
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_default_physp->port_info.capability_mask & IB_PORT_CAP_HAS_EXT_SPEEDS) {
|
|
Packit |
13e616 |
link_speed_act =
|
|
Packit |
13e616 |
ib_port_info_get_link_speed_ext_active(&p_physp->port_info);
|
|
Packit |
13e616 |
if (link_speed_act == IB_LINK_SPEED_EXT_ACTIVE_14)
|
|
Packit |
13e616 |
link_speed_act_str = "14";
|
|
Packit |
13e616 |
else if (link_speed_act == IB_LINK_SPEED_EXT_ACTIVE_25)
|
|
Packit |
13e616 |
link_speed_act_str = "25";
|
|
Packit |
13e616 |
else if (link_speed_act == IB_LINK_SPEED_EXT_ACTIVE_50)
|
|
Packit |
13e616 |
link_speed_act_str = "50";
|
|
Packit |
13e616 |
else if (link_speed_act != IB_LINK_SPEED_EXT_ACTIVE_NONE)
|
|
Packit |
13e616 |
link_speed_act_str = "??";
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_physp->port_info.link_width_active == 1)
|
|
Packit |
13e616 |
link_width_act_str = "1x";
|
|
Packit |
13e616 |
else if (p_physp->port_info.link_width_active == 2)
|
|
Packit |
13e616 |
link_width_act_str = "4x";
|
|
Packit |
13e616 |
else if (p_physp->port_info.link_width_active == 4)
|
|
Packit |
13e616 |
link_width_act_str = "8x";
|
|
Packit |
13e616 |
else if (p_physp->port_info.link_width_active == 8)
|
|
Packit |
13e616 |
link_width_act_str = "12x";
|
|
Packit |
13e616 |
else link_width_act_str = "??";
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_default_physp->port_info.capability_mask2 &
|
|
Packit |
13e616 |
IB_PORT_CAP2_IS_LINK_WIDTH_2X_SUPPORTED) {
|
|
Packit |
13e616 |
if (p_physp->port_info.link_width_active == 16)
|
|
Packit |
13e616 |
link_width_act_str = "2x";
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "PHY=%s LOG=%s SPD=%s\n",
|
|
Packit |
13e616 |
link_width_act_str,
|
|
Packit |
13e616 |
port_state == IB_LINK_ACTIVE ? "ACT" :
|
|
Packit |
13e616 |
port_state == IB_LINK_ARMED ? "ARM" :
|
|
Packit |
13e616 |
port_state == IB_LINK_INIT ? "INI" : "DWN",
|
|
Packit |
13e616 |
link_speed_act_str);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_sl2vl_tbl(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_port_t *p_port = (osm_port_t *) item;
|
|
Packit |
13e616 |
osm_node_t *p_node = p_port->p_node;
|
|
Packit |
13e616 |
uint32_t in_port, out_port,
|
|
Packit |
13e616 |
num_ports = p_node->node_info.num_ports;
|
|
Packit |
13e616 |
ib_net16_t base_lid = osm_port_get_base_lid(p_port);
|
|
Packit |
13e616 |
osm_physp_t *p_physp;
|
|
Packit |
13e616 |
ib_slvl_table_t *p_tbl;
|
|
Packit |
13e616 |
int i, n;
|
|
Packit |
13e616 |
char buf[1024];
|
|
Packit |
13e616 |
const char * header_line = "#in out : 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
|
|
Packit |
13e616 |
const char * separator_line = "#--------------------------------------------------------";
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (!num_ports)
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "%s 0x%016" PRIx64 ", base LID %d, "
|
|
Packit |
13e616 |
"\"%s\"\n%s\n%s\n",
|
|
Packit |
13e616 |
ib_get_node_type_str(p_node->node_info.node_type),
|
|
Packit |
13e616 |
cl_ntoh64(p_port->guid), cl_ntoh16(base_lid),
|
|
Packit |
13e616 |
p_node->print_desc, header_line, separator_line);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (p_node->node_info.node_type == IB_NODE_TYPE_SWITCH) {
|
|
Packit |
13e616 |
for (out_port = 0; out_port <= num_ports; out_port++){
|
|
Packit |
13e616 |
p_physp = osm_node_get_physp_ptr(p_node, out_port);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* no need to print SL2VL table for port that is down */
|
|
Packit |
13e616 |
if (!p_physp || !p_physp->p_remote_physp)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
for (in_port = 0; in_port <= num_ports; in_port++) {
|
|
Packit |
13e616 |
p_tbl = osm_physp_get_slvl_tbl(p_physp, in_port);
|
|
Packit |
13e616 |
for (i = 0, n = 0; i < 16; i++)
|
|
Packit |
13e616 |
n += sprintf(buf + n, " %-2d",
|
|
Packit |
13e616 |
ib_slvl_table_get(p_tbl, i));
|
|
Packit |
13e616 |
fprintf(file, "%-3d %-3d :%s\n",
|
|
Packit |
13e616 |
in_port, out_port, buf);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
} else {
|
|
Packit |
13e616 |
p_physp = p_port->p_physp;
|
|
Packit |
13e616 |
p_tbl = osm_physp_get_slvl_tbl(p_physp, 0);
|
|
Packit |
13e616 |
for (i = 0, n = 0; i < 16; i++)
|
|
Packit |
13e616 |
n += sprintf(buf + n, " %-2d",
|
|
Packit |
13e616 |
ib_slvl_table_get(p_tbl, i));
|
|
Packit |
13e616 |
fprintf(file, "%-3d %-3d :%s\n", 0, 0, buf);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "%s\n\n", separator_line);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void print_node_report(cl_map_item_t * item, FILE * file, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
osm_node_t *p_node = (osm_node_t *) item;
|
|
Packit |
13e616 |
osm_opensm_t *osm = cxt;
|
|
Packit |
13e616 |
const osm_physp_t *p_physp, *p_remote_physp;
|
|
Packit |
13e616 |
const ib_port_info_t *p_pi;
|
|
Packit |
13e616 |
uint8_t port_num;
|
|
Packit |
13e616 |
uint32_t num_ports;
|
|
Packit |
13e616 |
uint8_t node_type;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
node_type = osm_node_get_type(p_node);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
num_ports = osm_node_get_num_physp(p_node);
|
|
Packit |
13e616 |
port_num = node_type == IB_NODE_TYPE_SWITCH ? 0 : 1;
|
|
Packit |
13e616 |
for (; port_num < num_ports; port_num++) {
|
|
Packit |
13e616 |
p_physp = osm_node_get_physp_ptr(p_node, port_num);
|
|
Packit |
13e616 |
if (!p_physp)
|
|
Packit |
13e616 |
continue;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "%-11s : %s : %02X :",
|
|
Packit |
13e616 |
osm_get_manufacturer_str(cl_ntoh64
|
|
Packit |
13e616 |
(osm_node_get_node_guid
|
|
Packit |
13e616 |
(p_node))),
|
|
Packit |
13e616 |
osm_get_node_type_str_fixed_width(node_type), port_num);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
p_pi = &p_physp->port_info;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* Port state is not defined for base switch port 0
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (port_num == 0 &&
|
|
Packit |
13e616 |
ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) == FALSE)
|
|
Packit |
13e616 |
fprintf(file, " :");
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
fprintf(file, " %s :",
|
|
Packit |
13e616 |
osm_get_port_state_str_fixed_width
|
|
Packit |
13e616 |
(ib_port_info_get_port_state(p_pi)));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/*
|
|
Packit |
13e616 |
* LID values are only meaningful in select cases.
|
|
Packit |
13e616 |
*/
|
|
Packit |
13e616 |
if (ib_port_info_get_port_state(p_pi) != IB_LINK_DOWN
|
|
Packit |
13e616 |
&& ((node_type == IB_NODE_TYPE_SWITCH && port_num == 0)
|
|
Packit |
13e616 |
|| node_type != IB_NODE_TYPE_SWITCH))
|
|
Packit |
13e616 |
fprintf(file, " %04X : %01X :",
|
|
Packit |
13e616 |
cl_ntoh16(p_pi->base_lid),
|
|
Packit |
13e616 |
ib_port_info_get_lmc(p_pi));
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
fprintf(file, " : :");
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (port_num == 0 &&
|
|
Packit |
13e616 |
ib_switch_info_is_enhanced_port0(&p_node->sw->switch_info) == FALSE)
|
|
Packit |
13e616 |
fprintf(file, " : : ");
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
fprintf(file, " %s : %s : %s ",
|
|
Packit |
13e616 |
osm_get_mtu_str
|
|
Packit |
13e616 |
(ib_port_info_get_neighbor_mtu(p_pi)),
|
|
Packit |
13e616 |
osm_get_lwa_str(p_pi->link_width_active),
|
|
Packit |
13e616 |
osm_get_lsa_str
|
|
Packit |
13e616 |
(ib_port_info_get_link_speed_active(p_pi),
|
|
Packit |
13e616 |
ib_port_info_get_link_speed_ext_active(p_pi),
|
|
Packit |
13e616 |
ib_port_info_get_port_state(p_pi),
|
|
Packit |
13e616 |
p_physp->ext_port_info.link_speed_active & FDR10));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (osm_physp_get_port_guid(p_physp) == osm->subn.sm_port_guid)
|
|
Packit |
13e616 |
fprintf(file, "* %016" PRIx64 " *",
|
|
Packit |
13e616 |
cl_ntoh64(osm_physp_get_port_guid(p_physp)));
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
fprintf(file, ": %016" PRIx64 " :",
|
|
Packit |
13e616 |
cl_ntoh64(osm_physp_get_port_guid(p_physp)));
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
if (port_num
|
|
Packit |
13e616 |
&& (ib_port_info_get_port_state(p_pi) != IB_LINK_DOWN)) {
|
|
Packit |
13e616 |
p_remote_physp = osm_physp_get_remote(p_physp);
|
|
Packit |
13e616 |
if (p_remote_physp)
|
|
Packit |
13e616 |
fprintf(file, " %016" PRIx64 " (%02X)",
|
|
Packit |
13e616 |
cl_ntoh64(osm_physp_get_port_guid
|
|
Packit |
13e616 |
(p_remote_physp)),
|
|
Packit |
13e616 |
osm_physp_get_port_num(p_remote_physp));
|
|
Packit |
13e616 |
else
|
|
Packit |
13e616 |
fprintf(file, " UNKNOWN");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fprintf(file, "------------------------------------------------------"
|
|
Packit |
13e616 |
"------------------------------------------------\n");
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
struct dump_context {
|
|
Packit |
13e616 |
osm_opensm_t *p_osm;
|
|
Packit |
13e616 |
FILE *file;
|
|
Packit |
13e616 |
void (*func) (cl_map_item_t *, FILE *, void *);
|
|
Packit |
13e616 |
void *cxt;
|
|
Packit |
13e616 |
};
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_item(cl_map_item_t * item, void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
((struct dump_context *)cxt)->func(item,
|
|
Packit |
13e616 |
((struct dump_context *)cxt)->file,
|
|
Packit |
13e616 |
((struct dump_context *)cxt)->cxt);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void dump_qmap(FILE * file, cl_qmap_t * map,
|
|
Packit |
13e616 |
void (*func) (cl_map_item_t *, FILE *, void *), void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
struct dump_context dump_context;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
dump_context.file = file;
|
|
Packit |
13e616 |
dump_context.func = func;
|
|
Packit |
13e616 |
dump_context.cxt = cxt;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
cl_qmap_apply_func(map, dump_item, &dump_context);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_dump_qmap_to_file(osm_opensm_t * p_osm, const char *file_name,
|
|
Packit |
13e616 |
cl_qmap_t * map,
|
|
Packit |
13e616 |
void (*func) (cl_map_item_t *, FILE *, void *),
|
|
Packit |
13e616 |
void *cxt)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
char path[1024];
|
|
Packit |
13e616 |
FILE *file;
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
snprintf(path, sizeof(path), "%s/%s",
|
|
Packit |
13e616 |
p_osm->subn.opt.dump_files_dir, file_name);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
file = fopen(path, "w");
|
|
Packit |
13e616 |
if (!file) {
|
|
Packit |
13e616 |
OSM_LOG(&p_osm->log, OSM_LOG_ERROR,
|
|
Packit |
13e616 |
"cannot create file \'%s\': %s\n",
|
|
Packit |
13e616 |
path, strerror(errno));
|
|
Packit |
13e616 |
return;
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
dump_qmap(file, map, func, cxt);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
fclose(file);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
static void print_report(osm_opensm_t * osm, FILE * file)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
fprintf(file, "\n==================================================="
|
|
Packit |
13e616 |
"====================================================\n"
|
|
Packit |
13e616 |
"Vendor : Ty : # : Sta : LID : LMC : MTU : LWA :"
|
|
Packit |
13e616 |
" LSA : Port GUID : Neighbor Port (Port #)\n");
|
|
Packit |
13e616 |
dump_qmap(stdout, &osm->subn.node_guid_tbl, print_node_report, osm);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_dump_mcast_routes(osm_opensm_t * osm)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if (OSM_LOG_IS_ACTIVE_V2(&osm->log, OSM_LOG_ROUTING))
|
|
Packit |
13e616 |
/* multicast routes */
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm.mcfdbs",
|
|
Packit |
13e616 |
&osm->subn.sw_guid_tbl,
|
|
Packit |
13e616 |
dump_mcast_routes, osm);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
void osm_dump_all(osm_opensm_t * osm)
|
|
Packit |
13e616 |
{
|
|
Packit |
13e616 |
if (OSM_LOG_IS_ACTIVE_V2(&osm->log, OSM_LOG_ROUTING)) {
|
|
Packit |
13e616 |
/* unicast routes */
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm-lid-matrix.dump",
|
|
Packit |
13e616 |
&osm->subn.sw_guid_tbl, dump_lid_matrix,
|
|
Packit |
13e616 |
osm);
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm-lfts.dump",
|
|
Packit |
13e616 |
&osm->subn.sw_guid_tbl, dump_ucast_lfts,
|
|
Packit |
13e616 |
osm);
|
|
Packit |
13e616 |
if (OSM_LOG_IS_ACTIVE_V2(&osm->log, OSM_LOG_DEBUG))
|
|
Packit |
13e616 |
dump_qmap(stdout, &osm->subn.sw_guid_tbl,
|
|
Packit |
13e616 |
dump_ucast_path_distribution, osm);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
/* An attempt to get osm_switch_recommend_path to report the
|
|
Packit |
13e616 |
same routes that a sweep would assign. */
|
|
Packit |
13e616 |
if (osm->subn.opt.scatter_ports)
|
|
Packit |
13e616 |
srandom(osm->subn.opt.scatter_ports);
|
|
Packit |
13e616 |
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm.fdbs",
|
|
Packit |
13e616 |
&osm->subn.sw_guid_tbl,
|
|
Packit |
13e616 |
dump_ucast_routes, osm);
|
|
Packit |
13e616 |
/* multicast routes */
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm.mcfdbs",
|
|
Packit |
13e616 |
&osm->subn.sw_guid_tbl,
|
|
Packit |
13e616 |
dump_mcast_routes, osm);
|
|
Packit |
13e616 |
/* SL2VL tables */
|
|
Packit |
13e616 |
if (osm->subn.opt.qos ||
|
|
Packit |
13e616 |
(osm->routing_engine_used &&
|
|
Packit |
13e616 |
osm->routing_engine_used->update_sl2vl))
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm-sl2vl.dump",
|
|
Packit |
13e616 |
&osm->subn.port_guid_tbl,
|
|
Packit |
13e616 |
dump_sl2vl_tbl, osm);
|
|
Packit |
13e616 |
}
|
|
Packit |
13e616 |
osm_dump_qmap_to_file(osm, "opensm-subnet.lst",
|
|
Packit |
13e616 |
&osm->subn.node_guid_tbl, dump_topology_node,
|
|
Packit |
13e616 |
osm);
|
|
Packit |
13e616 |
if (OSM_LOG_IS_ACTIVE_V2(&osm->log, OSM_LOG_VERBOSE))
|
|
Packit |
13e616 |
print_report(osm, stdout);
|
|
Packit |
13e616 |
}
|