|
Packit |
db064d |
/*
|
|
Packit |
db064d |
* Copyright (c) 2004-2009 Voltaire Inc. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2007 Xsigo Systems Inc. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2008 Lawrence Livermore National Lab. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2010,2011 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* This software is available to you under a choice of one of two
|
|
Packit |
db064d |
* licenses. You may choose to be licensed under the terms of the GNU
|
|
Packit |
db064d |
* General Public License (GPL) Version 2, available from the file
|
|
Packit |
db064d |
* COPYING in the main directory of this source tree, or the
|
|
Packit |
db064d |
* OpenIB.org BSD license below:
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* Redistribution and use in source and binary forms, with or
|
|
Packit |
db064d |
* without modification, are permitted provided that the following
|
|
Packit |
db064d |
* conditions are met:
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* - Redistributions of source code must retain the above
|
|
Packit |
db064d |
* copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
* disclaimer.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* - Redistributions in binary form must reproduce the above
|
|
Packit |
db064d |
* copyright notice, this list of conditions and the following
|
|
Packit |
db064d |
* disclaimer in the documentation and/or other materials
|
|
Packit |
db064d |
* provided with the distribution.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
Packit |
db064d |
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
Packit |
db064d |
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
Packit |
db064d |
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
Packit |
db064d |
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
Packit |
db064d |
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
db064d |
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
Packit |
db064d |
* SOFTWARE.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#if HAVE_CONFIG_H
|
|
Packit |
db064d |
# include <config.h>
|
|
Packit |
db064d |
#endif /* HAVE_CONFIG_H */
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#define _GNU_SOURCE
|
|
Packit |
db064d |
#include <stdio.h>
|
|
Packit |
db064d |
#include <stdlib.h>
|
|
Packit |
db064d |
#include <unistd.h>
|
|
Packit |
db064d |
#include <stdarg.h>
|
|
Packit |
db064d |
#include <time.h>
|
|
Packit |
db064d |
#include <string.h>
|
|
Packit |
db064d |
#include <errno.h>
|
|
Packit |
db064d |
#include <inttypes.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include <complib/cl_nodenamemap.h>
|
|
Packit |
db064d |
#include <infiniband/ibnetdisc.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include "ibdiag_common.h"
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#define DIFF_FLAG_PORT_CONNECTION 0x01
|
|
Packit |
db064d |
#define DIFF_FLAG_PORT_STATE 0x02
|
|
Packit |
db064d |
#define DIFF_FLAG_LID 0x04
|
|
Packit |
db064d |
#define DIFF_FLAG_NODE_DESCRIPTION 0x08
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#define DIFF_FLAG_DEFAULT (DIFF_FLAG_PORT_CONNECTION | DIFF_FLAG_PORT_STATE)
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static char *node_name_map_file = NULL;
|
|
Packit |
db064d |
static nn_map_t *node_name_map = NULL;
|
|
Packit |
db064d |
static char *load_cache_file = NULL;
|
|
Packit |
db064d |
static char *diff_cache_file = NULL;
|
|
Packit |
db064d |
static unsigned diffcheck_flags = DIFF_FLAG_DEFAULT;
|
|
Packit |
db064d |
static char *filterdownports_cache_file = NULL;
|
|
Packit |
db064d |
static ibnd_fabric_t *filterdownports_fabric = NULL;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static struct {
|
|
Packit |
db064d |
uint64_t guid;
|
|
Packit |
db064d |
char *guid_str;
|
|
Packit |
db064d |
} node_label;
|
|
Packit |
db064d |
static char *dr_path = NULL;
|
|
Packit |
db064d |
static int all = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int down_links_only = 0;
|
|
Packit |
db064d |
static int line_mode = 0;
|
|
Packit |
db064d |
static int add_sw_settings = 0;
|
|
Packit |
db064d |
static int only_flag = 0;
|
|
Packit |
db064d |
static int only_type = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int filterdownport_check(ibnd_node_t *node, ibnd_port_t *port)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ibnd_node_t *fsw;
|
|
Packit |
db064d |
ibnd_port_t *fport;
|
|
Packit |
db064d |
int fistate;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
fsw = ibnd_find_node_guid(filterdownports_fabric, node->guid);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!fsw)
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port->portnum > fsw->numports)
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
fport = fsw->ports[port->portnum];
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!fport)
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
fistate = mad_get_field(fport->info, 0, IB_PORT_STATE_F);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return (fistate == IB_LINK_DOWN) ? 1 : 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void print_port(ibnd_node_t *node, ibnd_port_t *port,
|
|
Packit |
db064d |
const char *out_prefix)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char width[64], speed[64], state[64], physstate[64];
|
|
Packit |
db064d |
char remote_guid_str[256];
|
|
Packit |
db064d |
char remote_str[256];
|
|
Packit |
db064d |
char link_str[256];
|
|
Packit |
db064d |
char width_msg[256];
|
|
Packit |
db064d |
char speed_msg[256];
|
|
Packit |
db064d |
char ext_port_str[256];
|
|
Packit |
db064d |
int iwidth, ispeed, fdr10, espeed, istate, iphystate, cap_mask;
|
|
Packit |
db064d |
int n = 0;
|
|
Packit |
db064d |
uint8_t *info = NULL;
|
|
Packit |
db064d |
int rc;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!port)
|
|
Packit |
db064d |
return;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
iwidth = mad_get_field(port->info, 0, IB_PORT_LINK_WIDTH_ACTIVE_F);
|
|
Packit |
db064d |
ispeed = mad_get_field(port->info, 0, IB_PORT_LINK_SPEED_ACTIVE_F);
|
|
Packit |
db064d |
fdr10 = mad_get_field(port->ext_info, 0,
|
|
Packit |
db064d |
IB_MLNX_EXT_PORT_LINK_SPEED_ACTIVE_F) & FDR10;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port->node->type == IB_NODE_SWITCH) {
|
|
Packit |
db064d |
if (port->node->ports[0])
|
|
Packit |
db064d |
info = (uint8_t *)&port->node->ports[0]->info;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
info = (uint8_t *)&port->info;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (info) {
|
|
Packit |
db064d |
cap_mask = mad_get_field(info, 0, IB_PORT_CAPMASK_F);
|
|
Packit |
db064d |
if (cap_mask & be32toh(IB_PORT_CAP_HAS_EXT_SPEEDS))
|
|
Packit |
db064d |
espeed = mad_get_field(port->info, 0,
|
|
Packit |
db064d |
IB_PORT_LINK_SPEED_EXT_ACTIVE_F);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
espeed = 0;
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
ispeed = 0;
|
|
Packit |
db064d |
iwidth = 0;
|
|
Packit |
db064d |
espeed = 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
istate = mad_get_field(port->info, 0, IB_PORT_STATE_F);
|
|
Packit |
db064d |
iphystate = mad_get_field(port->info, 0, IB_PORT_PHYS_STATE_F);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
remote_guid_str[0] = '\0';
|
|
Packit |
db064d |
remote_str[0] = '\0';
|
|
Packit |
db064d |
link_str[0] = '\0';
|
|
Packit |
db064d |
width_msg[0] = '\0';
|
|
Packit |
db064d |
speed_msg[0] = '\0';
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (istate == IB_LINK_DOWN
|
|
Packit |
db064d |
&& filterdownports_fabric
|
|
Packit |
db064d |
&& filterdownport_check(node, port))
|
|
Packit |
db064d |
return;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* C14-24.2.1 states that a down port allows for invalid data to be
|
|
Packit |
db064d |
* returned for all PortInfo components except PortState and
|
|
Packit |
db064d |
* PortPhysicalState */
|
|
Packit |
db064d |
if (istate != IB_LINK_DOWN) {
|
|
Packit |
db064d |
if (!espeed) {
|
|
Packit |
db064d |
if (fdr10)
|
|
Packit |
db064d |
sprintf(speed, "10.0 Gbps (FDR10)");
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_LINK_SPEED_ACTIVE_F, speed,
|
|
Packit |
db064d |
64, &ispeed);
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_LINK_SPEED_EXT_ACTIVE_F, speed,
|
|
Packit |
db064d |
64, &espeed);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
n = snprintf(link_str, 256, "(%3s %18s %6s/%8s)",
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_LINK_WIDTH_ACTIVE_F, width, 64,
|
|
Packit |
db064d |
&iwidth),
|
|
Packit |
db064d |
speed,
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64,
|
|
Packit |
db064d |
&iphystate));
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
n = snprintf(link_str, 256, "( %6s/%8s)",
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_STATE_F, state, 64, &istate),
|
|
Packit |
db064d |
mad_dump_val(IB_PORT_PHYS_STATE_F, physstate, 64,
|
|
Packit |
db064d |
&iphystate));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* again default values due to C14-24.2.1 */
|
|
Packit |
db064d |
if (add_sw_settings && istate != IB_LINK_DOWN) {
|
|
Packit |
db064d |
snprintf(link_str + n, 256 - n,
|
|
Packit |
db064d |
" (HOQ:%d VL_Stall:%d)",
|
|
Packit |
db064d |
mad_get_field(port->info, 0,
|
|
Packit |
db064d |
IB_PORT_HOQ_LIFE_F),
|
|
Packit |
db064d |
mad_get_field(port->info, 0,
|
|
Packit |
db064d |
IB_PORT_VL_STALL_COUNT_F));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port->remoteport) {
|
|
Packit |
db064d |
char *remap =
|
|
Packit |
db064d |
remap_node_name(node_name_map, port->remoteport->node->guid,
|
|
Packit |
db064d |
port->remoteport->node->nodedesc);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port->remoteport->ext_portnum)
|
|
Packit |
db064d |
snprintf(ext_port_str, 256, "%d",
|
|
Packit |
db064d |
port->remoteport->ext_portnum);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
ext_port_str[0] = '\0';
|
|
Packit |
db064d |
|
|
Packit |
db064d |
get_max_msg(width_msg, speed_msg, 256, port);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (line_mode) {
|
|
Packit |
db064d |
snprintf(remote_guid_str, 256,
|
|
Packit |
db064d |
"0x%016" PRIx64 " ",
|
|
Packit |
db064d |
port->remoteport->guid);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
rc = snprintf(remote_str, sizeof(remote_str),
|
|
Packit |
db064d |
"%s%6d %4d[%2s] \"%s\" (%s %s)\n",
|
|
Packit |
db064d |
remote_guid_str, port->remoteport->base_lid ?
|
|
Packit |
db064d |
port->remoteport->base_lid :
|
|
Packit |
db064d |
port->remoteport->node->smalid,
|
|
Packit |
db064d |
port->remoteport->portnum, ext_port_str, remap,
|
|
Packit |
db064d |
width_msg, speed_msg);
|
|
Packit |
db064d |
if (rc > sizeof(remote_str))
|
|
Packit |
db064d |
fprintf(stderr, "WARN: string buffer overflow\n");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
free(remap);
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
if (istate == IB_LINK_DOWN)
|
|
Packit |
db064d |
snprintf(remote_str, 256, " [ ] \"\" ( )\n");
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
snprintf(remote_str, 256, " \"Port not available\"\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port->ext_portnum)
|
|
Packit |
db064d |
snprintf(ext_port_str, 256, "%d", port->ext_portnum);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
ext_port_str[0] = '\0';
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (line_mode) {
|
|
Packit |
db064d |
char *remap = remap_node_name(node_name_map, node->guid,
|
|
Packit |
db064d |
node->nodedesc);
|
|
Packit |
db064d |
printf("%s0x%016" PRIx64 " \"%30s\" ",
|
|
Packit |
db064d |
out_prefix ? out_prefix : "",
|
|
Packit |
db064d |
port->guid, remap);
|
|
Packit |
db064d |
free(remap);
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
printf("%s ", out_prefix ? out_prefix : "");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port->node->type != IB_NODE_SWITCH) {
|
|
Packit |
db064d |
if (!line_mode)
|
|
Packit |
db064d |
printf("0x%016" PRIx64 " ", port->guid);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("%6d %4d[%2s] ==%s==> %s",
|
|
Packit |
db064d |
port->base_lid,
|
|
Packit |
db064d |
port->portnum, ext_port_str, link_str, remote_str);
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
printf("%6d %4d[%2s] ==%s==> %s",
|
|
Packit |
db064d |
node->smalid, port->portnum, ext_port_str,
|
|
Packit |
db064d |
link_str, remote_str);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static inline const char *nodetype_str(ibnd_node_t * node)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
switch (node->type) {
|
|
Packit |
db064d |
case IB_NODE_SWITCH:
|
|
Packit |
db064d |
return "Switch";
|
|
Packit |
db064d |
case IB_NODE_CA:
|
|
Packit |
db064d |
return "CA";
|
|
Packit |
db064d |
case IB_NODE_ROUTER:
|
|
Packit |
db064d |
return "Router";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
return "??";
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void print_node_header(ibnd_node_t *node, int *out_header_flag,
|
|
Packit |
db064d |
const char *out_prefix)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
uint64_t guid = 0;
|
|
Packit |
db064d |
if ((!out_header_flag || !(*out_header_flag)) && !line_mode) {
|
|
Packit |
db064d |
char *remap =
|
|
Packit |
db064d |
remap_node_name(node_name_map, node->guid, node->nodedesc);
|
|
Packit |
db064d |
if (node->type == IB_NODE_SWITCH) {
|
|
Packit |
db064d |
if (node->ports[0])
|
|
Packit |
db064d |
guid = node->ports[0]->guid;
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
guid = mad_get_field64(node->info, 0, IB_NODE_PORT_GUID_F);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("%s%s: 0x%016" PRIx64 " %s:\n",
|
|
Packit |
db064d |
out_prefix ? out_prefix : "",
|
|
Packit |
db064d |
nodetype_str(node),
|
|
Packit |
db064d |
guid,
|
|
Packit |
db064d |
remap);
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
printf("%s%s: %s:\n",
|
|
Packit |
db064d |
out_prefix ? out_prefix : "",
|
|
Packit |
db064d |
nodetype_str(node), remap);
|
|
Packit |
db064d |
(*out_header_flag)++;
|
|
Packit |
db064d |
free(remap);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void print_node(ibnd_node_t *node, void *user_data)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int i = 0;
|
|
Packit |
db064d |
int head_print = 0;
|
|
Packit |
db064d |
char *out_prefix = (char *)user_data;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
for (i = 1; i <= node->numports; i++) {
|
|
Packit |
db064d |
ibnd_port_t *port = node->ports[i];
|
|
Packit |
db064d |
if (!port)
|
|
Packit |
db064d |
continue;
|
|
Packit |
db064d |
if (!down_links_only ||
|
|
Packit |
db064d |
mad_get_field(port->info, 0,
|
|
Packit |
db064d |
IB_PORT_STATE_F) == IB_LINK_DOWN) {
|
|
Packit |
db064d |
print_node_header(node, &head_print, out_prefix);
|
|
Packit |
db064d |
print_port(node, port, out_prefix);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
struct iter_diff_data {
|
|
Packit |
db064d |
uint32_t diff_flags;
|
|
Packit |
db064d |
ibnd_fabric_t *fabric1;
|
|
Packit |
db064d |
ibnd_fabric_t *fabric2;
|
|
Packit |
db064d |
const char *fabric1_prefix;
|
|
Packit |
db064d |
const char *fabric2_prefix;
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void diff_node_ports(ibnd_node_t *fabric1_node,
|
|
Packit |
db064d |
ibnd_node_t *fabric2_node, int *head_print,
|
|
Packit |
db064d |
struct iter_diff_data *data)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int i = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
for (i = 1; i <= fabric1_node->numports; i++) {
|
|
Packit |
db064d |
ibnd_port_t *fabric1_port, *fabric2_port;
|
|
Packit |
db064d |
int output_diff = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
fabric1_port = fabric1_node->ports[i];
|
|
Packit |
db064d |
fabric2_port = fabric2_node->ports[i];
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!fabric1_port && !fabric2_port)
|
|
Packit |
db064d |
continue;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (data->diff_flags & DIFF_FLAG_PORT_CONNECTION) {
|
|
Packit |
db064d |
if ((fabric1_port && !fabric2_port)
|
|
Packit |
db064d |
|| (!fabric1_port && fabric2_port)
|
|
Packit |
db064d |
|| (fabric1_port->remoteport
|
|
Packit |
db064d |
&& !fabric2_port->remoteport)
|
|
Packit |
db064d |
|| (!fabric1_port->remoteport
|
|
Packit |
db064d |
&& fabric2_port->remoteport)
|
|
Packit |
db064d |
|| (fabric1_port->remoteport
|
|
Packit |
db064d |
&& fabric2_port->remoteport
|
|
Packit |
db064d |
&& fabric1_port->remoteport->guid !=
|
|
Packit |
db064d |
fabric2_port->remoteport->guid))
|
|
Packit |
db064d |
output_diff++;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* if either fabric1_port or fabric2_port NULL, should be
|
|
Packit |
db064d |
* handled by port connection diff code
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
if (data->diff_flags & DIFF_FLAG_PORT_STATE
|
|
Packit |
db064d |
&& fabric1_port
|
|
Packit |
db064d |
&& fabric2_port) {
|
|
Packit |
db064d |
int state1, state2;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
state1 = mad_get_field(fabric1_port->info, 0,
|
|
Packit |
db064d |
IB_PORT_STATE_F);
|
|
Packit |
db064d |
state2 = mad_get_field(fabric2_port->info, 0,
|
|
Packit |
db064d |
IB_PORT_STATE_F);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (state1 != state2)
|
|
Packit |
db064d |
output_diff++;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (data->diff_flags & DIFF_FLAG_PORT_CONNECTION
|
|
Packit |
db064d |
&& data->diff_flags & DIFF_FLAG_LID
|
|
Packit |
db064d |
&& fabric1_port && fabric2_port
|
|
Packit |
db064d |
&& fabric1_port->remoteport && fabric2_port->remoteport
|
|
Packit |
db064d |
&& fabric1_port->remoteport->base_lid != fabric2_port->remoteport->base_lid)
|
|
Packit |
db064d |
output_diff++;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (data->diff_flags & DIFF_FLAG_PORT_CONNECTION
|
|
Packit |
db064d |
&& data->diff_flags & DIFF_FLAG_NODE_DESCRIPTION
|
|
Packit |
db064d |
&& fabric1_port && fabric2_port
|
|
Packit |
db064d |
&& fabric1_port->remoteport && fabric2_port->remoteport
|
|
Packit |
db064d |
&& memcmp(fabric1_port->remoteport->node->nodedesc,
|
|
Packit |
db064d |
fabric2_port->remoteport->node->nodedesc,
|
|
Packit |
db064d |
IB_SMP_DATA_SIZE))
|
|
Packit |
db064d |
output_diff++;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (output_diff && fabric1_port) {
|
|
Packit |
db064d |
print_node_header(fabric1_node,
|
|
Packit |
db064d |
head_print,
|
|
Packit |
db064d |
NULL);
|
|
Packit |
db064d |
print_port(fabric1_node,
|
|
Packit |
db064d |
fabric1_port,
|
|
Packit |
db064d |
data->fabric1_prefix);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (output_diff && fabric2_port) {
|
|
Packit |
db064d |
print_node_header(fabric1_node,
|
|
Packit |
db064d |
head_print,
|
|
Packit |
db064d |
NULL);
|
|
Packit |
db064d |
print_port(fabric2_node,
|
|
Packit |
db064d |
fabric2_port,
|
|
Packit |
db064d |
data->fabric2_prefix);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void diff_node_iter(ibnd_node_t *fabric1_node, void *iter_user_data)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct iter_diff_data *data = iter_user_data;
|
|
Packit |
db064d |
ibnd_node_t *fabric2_node;
|
|
Packit |
db064d |
int head_print = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
DEBUG("DEBUG: fabric1_node %p\n", fabric1_node);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
fabric2_node = ibnd_find_node_guid(data->fabric2, fabric1_node->guid);
|
|
Packit |
db064d |
if (!fabric2_node)
|
|
Packit |
db064d |
print_node(fabric1_node, (void *)data->fabric1_prefix);
|
|
Packit |
db064d |
else if (data->diff_flags &
|
|
Packit |
db064d |
(DIFF_FLAG_PORT_CONNECTION | DIFF_FLAG_PORT_STATE
|
|
Packit |
db064d |
| DIFF_FLAG_LID | DIFF_FLAG_NODE_DESCRIPTION)) {
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ((fabric1_node->type == IB_NODE_SWITCH
|
|
Packit |
db064d |
&& data->diff_flags & DIFF_FLAG_LID
|
|
Packit |
db064d |
&& fabric1_node->smalid != fabric2_node->smalid) ||
|
|
Packit |
db064d |
(data->diff_flags & DIFF_FLAG_NODE_DESCRIPTION
|
|
Packit |
db064d |
&& memcmp(fabric1_node->nodedesc, fabric2_node->nodedesc,
|
|
Packit |
db064d |
IB_SMP_DATA_SIZE))) {
|
|
Packit |
db064d |
print_node_header(fabric1_node,
|
|
Packit |
db064d |
NULL,
|
|
Packit |
db064d |
data->fabric1_prefix);
|
|
Packit |
db064d |
print_node_header(fabric2_node,
|
|
Packit |
db064d |
NULL,
|
|
Packit |
db064d |
data->fabric2_prefix);
|
|
Packit |
db064d |
head_print++;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (fabric1_node->numports != fabric2_node->numports) {
|
|
Packit |
db064d |
print_node_header(fabric1_node,
|
|
Packit |
db064d |
&head_print,
|
|
Packit |
db064d |
NULL);
|
|
Packit |
db064d |
printf("%snumports = %d\n", data->fabric1_prefix,
|
|
Packit |
db064d |
fabric1_node->numports);
|
|
Packit |
db064d |
printf("%snumports = %d\n", data->fabric2_prefix,
|
|
Packit |
db064d |
fabric2_node->numports);
|
|
Packit |
db064d |
return;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
diff_node_ports(fabric1_node, fabric2_node,
|
|
Packit |
db064d |
&head_print, data);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int diff_node(ibnd_node_t *node, ibnd_fabric_t *orig_fabric,
|
|
Packit |
db064d |
ibnd_fabric_t *new_fabric)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct iter_diff_data iter_diff_data;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
iter_diff_data.diff_flags = diffcheck_flags;
|
|
Packit |
db064d |
iter_diff_data.fabric1 = orig_fabric;
|
|
Packit |
db064d |
iter_diff_data.fabric2 = new_fabric;
|
|
Packit |
db064d |
iter_diff_data.fabric1_prefix = "< ";
|
|
Packit |
db064d |
iter_diff_data.fabric2_prefix = "> ";
|
|
Packit |
db064d |
if (node)
|
|
Packit |
db064d |
diff_node_iter(node, &iter_diff_data);
|
|
Packit |
db064d |
else {
|
|
Packit |
db064d |
if (only_flag)
|
|
Packit |
db064d |
ibnd_iter_nodes_type(orig_fabric, diff_node_iter,
|
|
Packit |
db064d |
only_type, &iter_diff_data);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
ibnd_iter_nodes(orig_fabric, diff_node_iter,
|
|
Packit |
db064d |
&iter_diff_data);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* Do opposite diff to find existence of node types
|
|
Packit |
db064d |
* in new_fabric but not in orig_fabric.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* In this diff, we don't need to check port connections,
|
|
Packit |
db064d |
* port state, lids, or node descriptions since it has already
|
|
Packit |
db064d |
* been done (i.e. checks are only done when guid exists on both
|
|
Packit |
db064d |
* orig and new).
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
iter_diff_data.diff_flags = diffcheck_flags & ~DIFF_FLAG_PORT_CONNECTION;
|
|
Packit |
db064d |
iter_diff_data.diff_flags &= ~DIFF_FLAG_PORT_STATE;
|
|
Packit |
db064d |
iter_diff_data.diff_flags &= ~DIFF_FLAG_LID;
|
|
Packit |
db064d |
iter_diff_data.diff_flags &= ~DIFF_FLAG_NODE_DESCRIPTION;
|
|
Packit |
db064d |
iter_diff_data.fabric1 = new_fabric;
|
|
Packit |
db064d |
iter_diff_data.fabric2 = orig_fabric;
|
|
Packit |
db064d |
iter_diff_data.fabric1_prefix = "> ";
|
|
Packit |
db064d |
iter_diff_data.fabric2_prefix = "< ";
|
|
Packit |
db064d |
if (node)
|
|
Packit |
db064d |
diff_node_iter(node, &iter_diff_data);
|
|
Packit |
db064d |
else {
|
|
Packit |
db064d |
if (only_flag)
|
|
Packit |
db064d |
ibnd_iter_nodes_type(new_fabric, diff_node_iter,
|
|
Packit |
db064d |
only_type, &iter_diff_data);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
ibnd_iter_nodes(new_fabric, diff_node_iter,
|
|
Packit |
db064d |
&iter_diff_data);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int process_opt(void *context, int ch)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct ibnd_config *cfg = context;
|
|
Packit |
db064d |
char *p;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
switch (ch) {
|
|
Packit |
db064d |
case 1:
|
|
Packit |
db064d |
node_name_map_file = strdup(optarg);
|
|
Packit |
db064d |
if (node_name_map_file == NULL)
|
|
Packit |
db064d |
IBEXIT("out of memory, strdup for node_name_map_file name failed");
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 2:
|
|
Packit |
db064d |
load_cache_file = strdup(optarg);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 3:
|
|
Packit |
db064d |
diff_cache_file = strdup(optarg);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 4:
|
|
Packit |
db064d |
diffcheck_flags = 0;
|
|
Packit |
db064d |
p = strtok(optarg, ",");
|
|
Packit |
db064d |
while (p) {
|
|
Packit |
db064d |
if (!strcasecmp(p, "port"))
|
|
Packit |
db064d |
diffcheck_flags |= DIFF_FLAG_PORT_CONNECTION;
|
|
Packit |
db064d |
else if (!strcasecmp(p, "state"))
|
|
Packit |
db064d |
diffcheck_flags |= DIFF_FLAG_PORT_STATE;
|
|
Packit |
db064d |
else if (!strcasecmp(p, "lid"))
|
|
Packit |
db064d |
diffcheck_flags |= DIFF_FLAG_LID;
|
|
Packit |
db064d |
else if (!strcasecmp(p, "nodedesc"))
|
|
Packit |
db064d |
diffcheck_flags |= DIFF_FLAG_NODE_DESCRIPTION;
|
|
Packit |
db064d |
else {
|
|
Packit |
db064d |
fprintf(stderr, "invalid diff check key: %s\n",
|
|
Packit |
db064d |
p);
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
p = strtok(NULL, ",");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 5:
|
|
Packit |
db064d |
filterdownports_cache_file = strdup(optarg);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 6:
|
|
Packit |
db064d |
only_flag = 1;
|
|
Packit |
db064d |
only_type = IB_NODE_SWITCH;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 7:
|
|
Packit |
db064d |
only_flag = 1;
|
|
Packit |
db064d |
only_type = IB_NODE_CA;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'S':
|
|
Packit |
db064d |
case 'G':
|
|
Packit |
db064d |
node_label.guid_str = optarg;
|
|
Packit |
db064d |
node_label.guid = (uint64_t)strtoull(node_label.guid_str, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'D':
|
|
Packit |
db064d |
dr_path = strdup(optarg);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'a':
|
|
Packit |
db064d |
all = 1;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'n':
|
|
Packit |
db064d |
cfg->max_hops = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'd':
|
|
Packit |
db064d |
down_links_only = 1;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'l':
|
|
Packit |
db064d |
line_mode = 1;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'p':
|
|
Packit |
db064d |
add_sw_settings = 1;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'R': /* nop */
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'o':
|
|
Packit |
db064d |
cfg->max_smps = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
default:
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int main(int argc, char **argv)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct ibnd_config config = { 0 };
|
|
Packit |
db064d |
int rc = 0;
|
|
Packit |
db064d |
int resolved = -1;
|
|
Packit |
db064d |
ibnd_fabric_t *fabric = NULL;
|
|
Packit |
db064d |
ibnd_fabric_t *diff_fabric = NULL;
|
|
Packit |
db064d |
struct ibmad_port *ibmad_port;
|
|
Packit |
db064d |
ib_portid_t port_id = { 0 };
|
|
Packit |
db064d |
uint8_t ni[IB_SMP_DATA_SIZE] = { 0 };
|
|
Packit |
db064d |
int mgmt_classes[3] =
|
|
Packit |
db064d |
{ IB_SMI_CLASS, IB_SMI_DIRECT_CLASS, IB_SA_CLASS };
|
|
Packit |
db064d |
|
|
Packit |
db064d |
const struct ibdiag_opt opts[] = {
|
|
Packit |
db064d |
{"node-name-map", 1, 1, "<file>", "node name map file"},
|
|
Packit |
db064d |
{"switch", 'S', 1, "<port_guid>",
|
|
Packit |
db064d |
"start partial scan at the port specified by <port_guid> (hex format)"},
|
|
Packit |
db064d |
{"port-guid", 'G', 1, "<port_guid>",
|
|
Packit |
db064d |
"(same as -S)"},
|
|
Packit |
db064d |
{"Direct", 'D', 1, "<dr_path>",
|
|
Packit |
db064d |
"start partial scan at the port specified by <dr_path>"},
|
|
Packit |
db064d |
{"all", 'a', 0, NULL,
|
|
Packit |
db064d |
"print all nodes found in a partial fabric scan"},
|
|
Packit |
db064d |
{"hops", 'n', 1, "<hops>",
|
|
Packit |
db064d |
"Number of hops to include away from specified node"},
|
|
Packit |
db064d |
{"down", 'd', 0, NULL, "print only down links"},
|
|
Packit |
db064d |
{"line", 'l', 0, NULL,
|
|
Packit |
db064d |
"(line mode) print all information for each link on a single line"},
|
|
Packit |
db064d |
{"additional", 'p', 0, NULL,
|
|
Packit |
db064d |
"print additional port settings (PktLifeTime, HoqLife, VLStallCount)"},
|
|
Packit |
db064d |
{"load-cache", 2, 1, "<file>",
|
|
Packit |
db064d |
"filename of ibnetdiscover cache to load"},
|
|
Packit |
db064d |
{"diff", 3, 1, "<file>",
|
|
Packit |
db064d |
"filename of ibnetdiscover cache to diff"},
|
|
Packit |
db064d |
{"diffcheck", 4, 1, "<key(s)>",
|
|
Packit |
db064d |
"specify checks to execute for --diff"},
|
|
Packit |
db064d |
{"filterdownports", 5, 1, "<file>",
|
|
Packit |
db064d |
"filename of ibnetdiscover cache to filter downports"},
|
|
Packit |
db064d |
{"outstanding_smps", 'o', 1, NULL,
|
|
Packit |
db064d |
"specify the number of outstanding SMP's which should be "
|
|
Packit |
db064d |
"issued during the scan"},
|
|
Packit |
db064d |
{"switches-only", 6, 0, NULL,
|
|
Packit |
db064d |
"Output only switches"},
|
|
Packit |
db064d |
{"cas-only", 7, 0, NULL,
|
|
Packit |
db064d |
"Output only CAs"},
|
|
Packit |
db064d |
{}
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
char usage_args[] = "";
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ibdiag_process_opts(argc, argv, &config, "aDdGgKLlnpRS", opts,
|
|
Packit |
db064d |
process_opt, usage_args, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
argc -= optind;
|
|
Packit |
db064d |
argv += optind;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ibmad_port = mad_rpc_open_port(ibd_ca, ibd_ca_port, mgmt_classes, 3);
|
|
Packit |
db064d |
if (!ibmad_port) {
|
|
Packit |
db064d |
fprintf(stderr, "Failed to open %s port %d\n", ibd_ca,
|
|
Packit |
db064d |
ibd_ca_port);
|
|
Packit |
db064d |
exit(1);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
smp_mkey_set(ibmad_port, ibd_mkey);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (ibd_timeout) {
|
|
Packit |
db064d |
mad_rpc_set_timeout(ibmad_port, ibd_timeout);
|
|
Packit |
db064d |
config.timeout_ms = ibd_timeout;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
config.flags = ibd_ibnetdisc_flags;
|
|
Packit |
db064d |
config.mkey = ibd_mkey;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
node_name_map = open_node_name_map(node_name_map_file);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (dr_path && load_cache_file) {
|
|
Packit |
db064d |
mad_rpc_close_port(ibmad_port);
|
|
Packit |
db064d |
fprintf(stderr, "Cannot specify cache and direct route path\n");
|
|
Packit |
db064d |
exit(1);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (dr_path) {
|
|
Packit |
db064d |
/* only scan part of the fabric */
|
|
Packit |
db064d |
if ((resolved =
|
|
Packit |
db064d |
resolve_portid_str(ibd_ca, ibd_ca_port, &port_id, dr_path,
|
|
Packit |
db064d |
IB_DEST_DRPATH, NULL, ibmad_port)) < 0)
|
|
Packit |
db064d |
IBWARN("Failed to resolve %s; attempting full scan",
|
|
Packit |
db064d |
dr_path);
|
|
Packit |
db064d |
} else if (node_label.guid_str) {
|
|
Packit |
db064d |
if ((resolved = resolve_portid_str(
|
|
Packit |
db064d |
ibd_ca, ibd_ca_port, &port_id, node_label.guid_str,
|
|
Packit |
db064d |
IB_DEST_GUID, NULL, ibmad_port)) < 0)
|
|
Packit |
db064d |
IBWARN("Failed to resolve %s; attempting full scan\n",
|
|
Packit |
db064d |
node_label.guid_str);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!all && dr_path) {
|
|
Packit |
db064d |
if (!smp_query_via(ni, &port_id, IB_ATTR_NODE_INFO, 0,
|
|
Packit |
db064d |
ibd_timeout, ibmad_port)){
|
|
Packit |
db064d |
mad_rpc_close_port(ibmad_port);
|
|
Packit |
db064d |
fprintf(stderr, "Failed to get local Node Info\n");
|
|
Packit |
db064d |
exit(1);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
mad_rpc_close_port(ibmad_port);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (diff_cache_file &&
|
|
Packit |
db064d |
!(diff_fabric = ibnd_load_fabric(diff_cache_file, 0)))
|
|
Packit |
db064d |
IBEXIT("loading cached fabric for diff failed\n");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (filterdownports_cache_file &&
|
|
Packit |
db064d |
!(filterdownports_fabric = ibnd_load_fabric(filterdownports_cache_file, 0)))
|
|
Packit |
db064d |
IBEXIT("loading cached fabric for filterdownports failed\n");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (load_cache_file) {
|
|
Packit |
db064d |
if ((fabric = ibnd_load_fabric(load_cache_file, 0)) == NULL) {
|
|
Packit |
db064d |
fprintf(stderr, "loading cached fabric failed\n");
|
|
Packit |
db064d |
exit(1);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
if (resolved >= 0) {
|
|
Packit |
db064d |
if (!config.max_hops)
|
|
Packit |
db064d |
config.max_hops = 1;
|
|
Packit |
db064d |
if (!(fabric =
|
|
Packit |
db064d |
ibnd_discover_fabric(ibd_ca, ibd_ca_port, &port_id, &config)))
|
|
Packit |
db064d |
IBWARN("Partial fabric scan failed;"
|
|
Packit |
db064d |
" attempting full scan\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!fabric &&
|
|
Packit |
db064d |
!(fabric = ibnd_discover_fabric(ibd_ca, ibd_ca_port, NULL, &config))) {
|
|
Packit |
db064d |
fprintf(stderr, "discover failed\n");
|
|
Packit |
db064d |
rc = 1;
|
|
Packit |
db064d |
goto close_port;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!all && node_label.guid_str) {
|
|
Packit |
db064d |
ibnd_port_t *p = ibnd_find_port_guid(fabric, node_label.guid);
|
|
Packit |
db064d |
if (p && (!only_flag || p->node->type == only_type)) {
|
|
Packit |
db064d |
ibnd_node_t *n = p->node;
|
|
Packit |
db064d |
if (diff_fabric)
|
|
Packit |
db064d |
diff_node(n, diff_fabric, fabric);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
print_node(n, NULL);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
fprintf(stderr, "Failed to find port: %s\n", node_label.guid_str);
|
|
Packit |
db064d |
} else if (!all && dr_path) {
|
|
Packit |
db064d |
ibnd_port_t *p = NULL;
|
|
Packit |
db064d |
mad_decode_field(ni, IB_NODE_PORT_GUID_F, &node_label.guid);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
p = ibnd_find_port_guid(fabric, node_label.guid);
|
|
Packit |
db064d |
if (p && (!only_flag || p->node->type == only_type)) {
|
|
Packit |
db064d |
ibnd_node_t *n = p->node;
|
|
Packit |
db064d |
if (diff_fabric)
|
|
Packit |
db064d |
diff_node(n, diff_fabric, fabric);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
print_node(n, NULL);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
fprintf(stderr, "Failed to find port: %s\n", dr_path);
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
if (diff_fabric)
|
|
Packit |
db064d |
diff_node(NULL, diff_fabric, fabric);
|
|
Packit |
db064d |
else {
|
|
Packit |
db064d |
if (only_flag)
|
|
Packit |
db064d |
ibnd_iter_nodes_type(fabric, print_node,
|
|
Packit |
db064d |
only_type, NULL);
|
|
Packit |
db064d |
else
|
|
Packit |
db064d |
ibnd_iter_nodes(fabric, print_node, NULL);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ibnd_destroy_fabric(fabric);
|
|
Packit |
db064d |
if (diff_fabric)
|
|
Packit |
db064d |
ibnd_destroy_fabric(diff_fabric);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
close_port:
|
|
Packit |
db064d |
close_node_name_map(node_name_map);
|
|
Packit |
db064d |
exit(rc);
|
|
Packit |
db064d |
}
|