|
Packit |
db064d |
/*
|
|
Packit |
db064d |
* Copyright (c) 2006,2007 The Regents of the University of California.
|
|
Packit |
db064d |
* Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2002-2013 Mellanox Technologies LTD. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 1996-2013 Intel Corporation. All rights reserved.
|
|
Packit |
db064d |
* Copyright (c) 2009 HNR Consulting. All rights reserved.
|
|
Packit |
db064d |
*
|
|
Packit |
db064d |
* Produced at Lawrence Livermore National Laboratory.
|
|
Packit |
db064d |
* Written by Ira Weiny <weiny2@llnl.gov>.
|
|
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 |
#include <unistd.h>
|
|
Packit |
db064d |
#include <stdio.h>
|
|
Packit |
db064d |
#include <arpa/inet.h>
|
|
Packit |
db064d |
#include <ctype.h>
|
|
Packit |
db064d |
#include <string.h>
|
|
Packit |
db064d |
#include <errno.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#define _GNU_SOURCE
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include <infiniband/umad.h>
|
|
Packit |
db064d |
#include <infiniband/mad.h>
|
|
Packit |
db064d |
#include <iba/ib_types.h>
|
|
Packit |
db064d |
#include <complib/cl_nodenamemap.h>
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#include "ibdiag_common.h"
|
|
Packit |
db064d |
#include "ibdiag_sa.h"
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#ifndef IB_PR_COMPMASK_SERVICEID
|
|
Packit |
db064d |
#define IB_PR_COMPMASK_SERVICEID (IB_PR_COMPMASK_SERVICEID_MSB | \
|
|
Packit |
db064d |
IB_PR_COMPMASK_SERVICEID_LSB)
|
|
Packit |
db064d |
#endif
|
|
Packit |
db064d |
|
|
Packit |
db064d |
#define UMAD_SA_CAP_MASK2_IS_MCAST_TOP_SUP (1 << 3)
|
|
Packit |
db064d |
|
|
Packit |
db064d |
struct query_params {
|
|
Packit |
db064d |
uint64_t service_id;
|
|
Packit |
db064d |
ibmad_gid_t sgid, dgid, gid, mgid;
|
|
Packit |
db064d |
uint16_t slid, dlid, mlid;
|
|
Packit |
db064d |
uint32_t flow_label;
|
|
Packit |
db064d |
int hop_limit;
|
|
Packit |
db064d |
uint8_t tclass;
|
|
Packit |
db064d |
int reversible, numb_path;
|
|
Packit |
db064d |
uint16_t pkey;
|
|
Packit |
db064d |
int qos_class, sl;
|
|
Packit |
db064d |
uint8_t mtu, rate, pkt_life;
|
|
Packit |
db064d |
uint32_t qkey;
|
|
Packit |
db064d |
uint8_t scope;
|
|
Packit |
db064d |
uint8_t join_state;
|
|
Packit |
db064d |
int proxy_join;
|
|
Packit |
db064d |
ib_class_port_info_t cpi;
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
struct query_cmd {
|
|
Packit |
db064d |
const char *name, *alias;
|
|
Packit |
db064d |
uint16_t query_type;
|
|
Packit |
db064d |
const char *usage;
|
|
Packit |
db064d |
int (*handler) (const struct query_cmd * q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params * p, int argc, char *argv[]);
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static char *node_name_map_file = NULL;
|
|
Packit |
db064d |
static nn_map_t *node_name_map = NULL;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/**
|
|
Packit |
db064d |
* Declare some globals because I don't want this to be too complex.
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
#define MAX_PORTS (8)
|
|
Packit |
db064d |
#define DEFAULT_SA_TIMEOUT_MS (1000)
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static enum {
|
|
Packit |
db064d |
ALL,
|
|
Packit |
db064d |
LID_ONLY,
|
|
Packit |
db064d |
UNIQUE_LID_ONLY,
|
|
Packit |
db064d |
GUID_ONLY,
|
|
Packit |
db064d |
ALL_DESC,
|
|
Packit |
db064d |
NAME_OF_LID,
|
|
Packit |
db064d |
NAME_OF_GUID,
|
|
Packit |
db064d |
} node_print_desc = ALL;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static char *requested_name;
|
|
Packit |
db064d |
static uint16_t requested_lid;
|
|
Packit |
db064d |
static int requested_lid_flag;
|
|
Packit |
db064d |
static uint64_t requested_guid;
|
|
Packit |
db064d |
static int requested_guid_flag;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static unsigned valid_gid(ibmad_gid_t * gid)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ibmad_gid_t zero_gid;
|
|
Packit |
db064d |
memset(&zero_gid, 0, sizeof zero_gid);
|
|
Packit |
db064d |
return memcmp(&zero_gid, gid, sizeof(*gid));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void print_node_desc(ib_node_record_t * node_record)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_node_info_t *p_ni = &(node_record->node_info);
|
|
Packit |
db064d |
ib_node_desc_t *p_nd = &(node_record->node_desc);
|
|
Packit |
db064d |
char *name;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (p_ni->node_type == IB_NODE_TYPE_CA) {
|
|
Packit |
db064d |
name = remap_node_name(node_name_map,
|
|
Packit |
db064d |
be64toh(node_record->node_info.node_guid),
|
|
Packit |
db064d |
(char *)p_nd->description);
|
|
Packit |
db064d |
printf("%6d \"%s\"\n", be16toh(node_record->lid), name);
|
|
Packit |
db064d |
free(name);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_node_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_node_record_t *nr = data;
|
|
Packit |
db064d |
ib_node_info_t *ni = &nr->node_info;
|
|
Packit |
db064d |
char *name = remap_node_name(node_name_map,
|
|
Packit |
db064d |
be64toh(ni->node_guid),
|
|
Packit |
db064d |
(char *)nr->node_desc.description);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("NodeRecord dump:\n"
|
|
Packit |
db064d |
"\t\tlid.....................%u\n"
|
|
Packit |
db064d |
"\t\treserved................0x%X\n"
|
|
Packit |
db064d |
"\t\tbase_version............0x%X\n"
|
|
Packit |
db064d |
"\t\tclass_version...........0x%X\n"
|
|
Packit |
db064d |
"\t\tnode_type...............%s\n"
|
|
Packit |
db064d |
"\t\tnum_ports...............%u\n"
|
|
Packit |
db064d |
"\t\tsys_guid................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tnode_guid...............0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tport_guid...............0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tpartition_cap...........0x%X\n"
|
|
Packit |
db064d |
"\t\tdevice_id...............0x%X\n"
|
|
Packit |
db064d |
"\t\trevision................0x%X\n"
|
|
Packit |
db064d |
"\t\tport_num................%u\n"
|
|
Packit |
db064d |
"\t\tvendor_id...............0x%X\n"
|
|
Packit |
db064d |
"\t\tNodeDescription.........%s\n",
|
|
Packit |
db064d |
be16toh(nr->lid), be16toh(nr->resv),
|
|
Packit |
db064d |
ni->base_version, ni->class_version,
|
|
Packit |
db064d |
ib_get_node_type_str(ni->node_type), ni->num_ports,
|
|
Packit |
db064d |
be64toh(ni->sys_guid), be64toh(ni->node_guid),
|
|
Packit |
db064d |
be64toh(ni->port_guid), be16toh(ni->partition_cap),
|
|
Packit |
db064d |
be16toh(ni->device_id), be32toh(ni->revision),
|
|
Packit |
db064d |
ib_node_info_get_local_port_num(ni),
|
|
Packit |
db064d |
be32toh(ib_node_info_get_vendor_id(ni)),
|
|
Packit |
db064d |
name);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
free(name);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void print_node_record(ib_node_record_t * node_record)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_node_info_t *p_ni = &node_record->node_info;
|
|
Packit |
db064d |
ib_node_desc_t *p_nd = &node_record->node_desc;
|
|
Packit |
db064d |
char *name;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
switch (node_print_desc) {
|
|
Packit |
db064d |
case LID_ONLY:
|
|
Packit |
db064d |
case UNIQUE_LID_ONLY:
|
|
Packit |
db064d |
printf("%u\n", be16toh(node_record->lid));
|
|
Packit |
db064d |
return;
|
|
Packit |
db064d |
case GUID_ONLY:
|
|
Packit |
db064d |
printf("0x%016" PRIx64 "\n", be64toh(p_ni->port_guid));
|
|
Packit |
db064d |
return;
|
|
Packit |
db064d |
case NAME_OF_LID:
|
|
Packit |
db064d |
case NAME_OF_GUID:
|
|
Packit |
db064d |
name = remap_node_name(node_name_map,
|
|
Packit |
db064d |
be64toh(p_ni->node_guid),
|
|
Packit |
db064d |
(char *)p_nd->description);
|
|
Packit |
db064d |
printf("%s\n", name);
|
|
Packit |
db064d |
free(name);
|
|
Packit |
db064d |
return;
|
|
Packit |
db064d |
case ALL:
|
|
Packit |
db064d |
default:
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
dump_node_record(node_record, NULL);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_path_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
char gid_str2[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
ib_path_rec_t *p_pr = data;
|
|
Packit |
db064d |
printf("PathRecord dump:\n"
|
|
Packit |
db064d |
"\t\tservice_id..............0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tdgid....................%s\n"
|
|
Packit |
db064d |
"\t\tsgid....................%s\n"
|
|
Packit |
db064d |
"\t\tdlid....................%u\n"
|
|
Packit |
db064d |
"\t\tslid....................%u\n"
|
|
Packit |
db064d |
"\t\thop_flow_raw............0x%X\n"
|
|
Packit |
db064d |
"\t\ttclass..................0x%X\n"
|
|
Packit |
db064d |
"\t\tnum_path_revers.........0x%X\n"
|
|
Packit |
db064d |
"\t\tpkey....................0x%X\n"
|
|
Packit |
db064d |
"\t\tqos_class...............0x%X\n"
|
|
Packit |
db064d |
"\t\tsl......................0x%X\n"
|
|
Packit |
db064d |
"\t\tmtu.....................0x%X\n"
|
|
Packit |
db064d |
"\t\trate....................0x%X\n"
|
|
Packit |
db064d |
"\t\tpkt_life................0x%X\n"
|
|
Packit |
db064d |
"\t\tpreference..............0x%X\n"
|
|
Packit |
db064d |
"\t\tresv2...................0x%02X%02X%02X%02X%02X%02X\n",
|
|
Packit |
db064d |
be64toh(p_pr->service_id),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_pr->dgid.raw, gid_str, sizeof gid_str),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_pr->sgid.raw, gid_str2, sizeof gid_str2),
|
|
Packit |
db064d |
be16toh(p_pr->dlid), be16toh(p_pr->slid),
|
|
Packit |
db064d |
be32toh(p_pr->hop_flow_raw), p_pr->tclass, p_pr->num_path,
|
|
Packit |
db064d |
be16toh(p_pr->pkey), ib_path_rec_qos_class(p_pr),
|
|
Packit |
db064d |
ib_path_rec_sl(p_pr), p_pr->mtu, p_pr->rate, p_pr->pkt_life,
|
|
Packit |
db064d |
p_pr->preference,
|
|
Packit |
db064d |
p_pr->resv2[0], p_pr->resv2[1], p_pr->resv2[2],
|
|
Packit |
db064d |
p_pr->resv2[3], p_pr->resv2[4], p_pr->resv2[5]);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_class_port_info(ib_class_port_info_t *cpi)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
char gid_str2[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("SA ClassPortInfo:\n"
|
|
Packit |
db064d |
"\t\tBase version.............%d\n"
|
|
Packit |
db064d |
"\t\tClass version............%d\n"
|
|
Packit |
db064d |
"\t\tCapability mask..........0x%04X\n"
|
|
Packit |
db064d |
"\t\tCapability mask 2........0x%08X\n"
|
|
Packit |
db064d |
"\t\tResponse time value......0x%02X\n"
|
|
Packit |
db064d |
"\t\tRedirect GID.............%s\n"
|
|
Packit |
db064d |
"\t\tRedirect TC/SL/FL........0x%08X\n"
|
|
Packit |
db064d |
"\t\tRedirect LID.............%u\n"
|
|
Packit |
db064d |
"\t\tRedirect PKey............0x%04X\n"
|
|
Packit |
db064d |
"\t\tRedirect QP..............0x%08X\n"
|
|
Packit |
db064d |
"\t\tRedirect QKey............0x%08X\n"
|
|
Packit |
db064d |
"\t\tTrap GID.................%s\n"
|
|
Packit |
db064d |
"\t\tTrap TC/SL/FL............0x%08X\n"
|
|
Packit |
db064d |
"\t\tTrap LID.................%u\n"
|
|
Packit |
db064d |
"\t\tTrap PKey................0x%04X\n"
|
|
Packit |
db064d |
"\t\tTrap HL/QP...............0x%08X\n"
|
|
Packit |
db064d |
"\t\tTrap QKey................0x%08X\n",
|
|
Packit |
db064d |
cpi->base_ver, cpi->class_ver, be16toh(cpi->cap_mask),
|
|
Packit |
db064d |
ib_class_cap_mask2(cpi), ib_class_resp_time_val(cpi),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, &(cpi->redir_gid), gid_str, sizeof gid_str),
|
|
Packit |
db064d |
be32toh(cpi->redir_tc_sl_fl), be16toh(cpi->redir_lid),
|
|
Packit |
db064d |
be16toh(cpi->redir_pkey), be32toh(cpi->redir_qp),
|
|
Packit |
db064d |
be32toh(cpi->redir_qkey),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, &(cpi->trap_gid), gid_str2, sizeof gid_str2),
|
|
Packit |
db064d |
be32toh(cpi->trap_tc_sl_fl), be16toh(cpi->trap_lid),
|
|
Packit |
db064d |
be16toh(cpi->trap_pkey), be32toh(cpi->trap_hop_qp),
|
|
Packit |
db064d |
be32toh(cpi->trap_qkey));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_portinfo_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_portinfo_record_t *p_pir = data;
|
|
Packit |
db064d |
const ib_port_info_t *const p_pi = &p_pir->port_info;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("PortInfoRecord dump:\n"
|
|
Packit |
db064d |
"\t\tEndPortLid..............%u\n"
|
|
Packit |
db064d |
"\t\tPortNum.................%u\n"
|
|
Packit |
db064d |
"\t\tbase_lid................%u\n"
|
|
Packit |
db064d |
"\t\tmaster_sm_base_lid......%u\n"
|
|
Packit |
db064d |
"\t\tcapability_mask.........0x%X\n",
|
|
Packit |
db064d |
be16toh(p_pir->lid), p_pir->port_num,
|
|
Packit |
db064d |
be16toh(p_pi->base_lid), be16toh(p_pi->master_sm_base_lid),
|
|
Packit |
db064d |
be32toh(p_pi->capability_mask));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_portinfo_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_portinfo_record_t *pir = data;
|
|
Packit |
db064d |
ib_port_info_t *pi = &pir->port_info;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("PortInfoRecord dump:\n"
|
|
Packit |
db064d |
"\tRID\n"
|
|
Packit |
db064d |
"\t\tEndPortLid..............%u\n"
|
|
Packit |
db064d |
"\t\tPortNum.................%u\n"
|
|
Packit |
db064d |
"\t\tOptions.................0x%x\n"
|
|
Packit |
db064d |
"\tPortInfo dump:\n",
|
|
Packit |
db064d |
be16toh(pir->lid), pir->port_num, pir->options);
|
|
Packit |
db064d |
dump_portinfo(pi, 2);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_mcmember_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char mgid[INET6_ADDRSTRLEN], gid[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
ib_member_rec_t *mr = data;
|
|
Packit |
db064d |
uint32_t flow;
|
|
Packit |
db064d |
uint8_t sl, hop, scope, join;
|
|
Packit |
db064d |
ib_member_get_sl_flow_hop(mr->sl_flow_hop, &sl, &flow, &hop);
|
|
Packit |
db064d |
ib_member_get_scope_state(mr->scope_state, &scope, &join);
|
|
Packit |
db064d |
printf("MCMember Record dump:\n"
|
|
Packit |
db064d |
"\t\tMGID....................%s\n"
|
|
Packit |
db064d |
"\t\tPortGid.................%s\n"
|
|
Packit |
db064d |
"\t\tqkey....................0x%x\n"
|
|
Packit |
db064d |
"\t\tmlid....................0x%x\n"
|
|
Packit |
db064d |
"\t\tmtu.....................0x%x\n"
|
|
Packit |
db064d |
"\t\tTClass..................0x%x\n"
|
|
Packit |
db064d |
"\t\tpkey....................0x%x\n"
|
|
Packit |
db064d |
"\t\trate....................0x%x\n"
|
|
Packit |
db064d |
"\t\tpkt_life................0x%x\n"
|
|
Packit |
db064d |
"\t\tSL......................0x%x\n"
|
|
Packit |
db064d |
"\t\tFlowLabel...............0x%x\n"
|
|
Packit |
db064d |
"\t\tHopLimit................0x%x\n"
|
|
Packit |
db064d |
"\t\tScope...................0x%x\n"
|
|
Packit |
db064d |
"\t\tJoinState...............0x%x\n"
|
|
Packit |
db064d |
"\t\tProxyJoin...............0x%x\n",
|
|
Packit |
db064d |
inet_ntop(AF_INET6, mr->mgid.raw, mgid, sizeof(mgid)),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, mr->port_gid.raw, gid, sizeof(gid)),
|
|
Packit |
db064d |
be32toh(mr->qkey), be16toh(mr->mlid), mr->mtu, mr->tclass,
|
|
Packit |
db064d |
be16toh(mr->pkey), mr->rate, mr->pkt_life, sl,
|
|
Packit |
db064d |
flow, hop, scope, join, mr->proxy_join);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_multicast_group_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
ib_member_rec_t *p_mcmr = data;
|
|
Packit |
db064d |
uint8_t sl;
|
|
Packit |
db064d |
ib_member_get_sl_flow_hop(p_mcmr->sl_flow_hop, &sl, NULL, NULL);
|
|
Packit |
db064d |
printf("MCMemberRecord group dump:\n"
|
|
Packit |
db064d |
"\t\tMGID....................%s\n"
|
|
Packit |
db064d |
"\t\tMlid....................0x%X\n"
|
|
Packit |
db064d |
"\t\tMtu.....................0x%X\n"
|
|
Packit |
db064d |
"\t\tpkey....................0x%X\n"
|
|
Packit |
db064d |
"\t\tRate....................0x%X\n"
|
|
Packit |
db064d |
"\t\tSL......................0x%X\n",
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_mcmr->mgid.raw, gid_str, sizeof gid_str),
|
|
Packit |
db064d |
be16toh(p_mcmr->mlid),
|
|
Packit |
db064d |
p_mcmr->mtu, be16toh(p_mcmr->pkey), p_mcmr->rate, sl);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_multicast_member_record(ib_member_rec_t *p_mcmr,
|
|
Packit |
db064d |
struct sa_query_result *nr_result,
|
|
Packit |
db064d |
struct query_params *params)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
char gid_str2[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
uint16_t mlid = be16toh(p_mcmr->mlid);
|
|
Packit |
db064d |
unsigned i = 0;
|
|
Packit |
db064d |
char *node_name = strdup("<unknown>");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* go through the node records searching for a port guid which matches
|
|
Packit |
db064d |
* this port gid interface id.
|
|
Packit |
db064d |
* This gives us a node name to print, if available.
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
for (i = 0; i < nr_result->result_cnt; i++) {
|
|
Packit |
db064d |
ib_node_record_t *nr = sa_get_query_rec(nr_result->p_result_madw, i);
|
|
Packit |
db064d |
if (nr->node_info.port_guid ==
|
|
Packit |
db064d |
p_mcmr->port_gid.unicast.interface_id) {
|
|
Packit |
db064d |
if(node_name != NULL)
|
|
Packit |
db064d |
free(node_name);
|
|
Packit |
db064d |
node_name = remap_node_name(node_name_map,
|
|
Packit |
db064d |
be64toh(nr->node_info.node_guid),
|
|
Packit |
db064d |
(char *)nr->node_desc.description);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (requested_name) {
|
|
Packit |
db064d |
if (strtol(requested_name, NULL, 0) == mlid)
|
|
Packit |
db064d |
printf("\t\tPortGid.................%s (%s)\n",
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_mcmr->port_gid.raw,
|
|
Packit |
db064d |
gid_str, sizeof gid_str), node_name);
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
printf("MCMemberRecord member dump:\n"
|
|
Packit |
db064d |
"\t\tMGID....................%s\n"
|
|
Packit |
db064d |
"\t\tMlid....................0x%X\n"
|
|
Packit |
db064d |
"\t\tPortGid.................%s\n"
|
|
Packit |
db064d |
"\t\tScopeState..............0x%X\n"
|
|
Packit |
db064d |
"\t\tProxyJoin...............0x%X\n"
|
|
Packit |
db064d |
"\t\tNodeDescription.........%s\n",
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_mcmr->mgid.raw, gid_str,
|
|
Packit |
db064d |
sizeof gid_str),
|
|
Packit |
db064d |
be16toh(p_mcmr->mlid),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_mcmr->port_gid.raw,
|
|
Packit |
db064d |
gid_str2, sizeof gid_str2),
|
|
Packit |
db064d |
p_mcmr->scope_state, p_mcmr->proxy_join, node_name);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
free(node_name);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_service_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char gid[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
char buf_service_key[35];
|
|
Packit |
db064d |
char buf_service_name[65];
|
|
Packit |
db064d |
ib_service_record_t *p_sr = data;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sprintf(buf_service_key,
|
|
Packit |
db064d |
"0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
|
Packit |
db064d |
p_sr->service_key[0], p_sr->service_key[1],
|
|
Packit |
db064d |
p_sr->service_key[2], p_sr->service_key[3],
|
|
Packit |
db064d |
p_sr->service_key[4], p_sr->service_key[5],
|
|
Packit |
db064d |
p_sr->service_key[6], p_sr->service_key[7],
|
|
Packit |
db064d |
p_sr->service_key[8], p_sr->service_key[9],
|
|
Packit |
db064d |
p_sr->service_key[10], p_sr->service_key[11],
|
|
Packit |
db064d |
p_sr->service_key[12], p_sr->service_key[13],
|
|
Packit |
db064d |
p_sr->service_key[14], p_sr->service_key[15]);
|
|
Packit |
db064d |
strncpy(buf_service_name, (char *)p_sr->service_name, 64);
|
|
Packit |
db064d |
buf_service_name[64] = '\0';
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("ServiceRecord dump:\n"
|
|
Packit |
db064d |
"\t\tServiceID...............0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tServiceGID..............%s\n"
|
|
Packit |
db064d |
"\t\tServiceP_Key............0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceLease............0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceKey..............%s\n"
|
|
Packit |
db064d |
"\t\tServiceName.............%s\n"
|
|
Packit |
db064d |
"\t\tServiceData8.1..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.2..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.3..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.4..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.5..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.6..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.7..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.8..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.9..........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.10.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.11.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.12.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.13.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.14.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.15.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData8.16.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.1.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.2.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.3.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.4.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.5.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.6.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.7.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData16.8.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData32.1.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData32.2.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData32.3.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData32.4.........0x%X\n"
|
|
Packit |
db064d |
"\t\tServiceData64.1.........0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tServiceData64.2.........0x%016" PRIx64 "\n",
|
|
Packit |
db064d |
be64toh(p_sr->service_id),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_sr->service_gid.raw, gid, sizeof gid),
|
|
Packit |
db064d |
be16toh(p_sr->service_pkey), be32toh(p_sr->service_lease),
|
|
Packit |
db064d |
(show_keys ? buf_service_key : NOT_DISPLAYED_STR),
|
|
Packit |
db064d |
buf_service_name,
|
|
Packit |
db064d |
p_sr->service_data8[0], p_sr->service_data8[1],
|
|
Packit |
db064d |
p_sr->service_data8[2], p_sr->service_data8[3],
|
|
Packit |
db064d |
p_sr->service_data8[4], p_sr->service_data8[5],
|
|
Packit |
db064d |
p_sr->service_data8[6], p_sr->service_data8[7],
|
|
Packit |
db064d |
p_sr->service_data8[8], p_sr->service_data8[9],
|
|
Packit |
db064d |
p_sr->service_data8[10], p_sr->service_data8[11],
|
|
Packit |
db064d |
p_sr->service_data8[12], p_sr->service_data8[13],
|
|
Packit |
db064d |
p_sr->service_data8[14], p_sr->service_data8[15],
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[0]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[1]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[2]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[3]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[4]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[5]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[6]),
|
|
Packit |
db064d |
be16toh(p_sr->service_data16[7]),
|
|
Packit |
db064d |
be32toh(p_sr->service_data32[0]),
|
|
Packit |
db064d |
be32toh(p_sr->service_data32[1]),
|
|
Packit |
db064d |
be32toh(p_sr->service_data32[2]),
|
|
Packit |
db064d |
be32toh(p_sr->service_data32[3]),
|
|
Packit |
db064d |
be64toh(p_sr->service_data64[0]),
|
|
Packit |
db064d |
be64toh(p_sr->service_data64[1]));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_sm_info_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_sminfo_record_t *p_smr = data;
|
|
Packit |
db064d |
const ib_sm_info_t *const p_smi = &p_smr->sm_info;
|
|
Packit |
db064d |
uint8_t priority, state;
|
|
Packit |
db064d |
priority = ib_sminfo_get_priority(p_smi);
|
|
Packit |
db064d |
state = ib_sminfo_get_state(p_smi);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("SMInfoRecord dump:\n"
|
|
Packit |
db064d |
"\t\tRID\n"
|
|
Packit |
db064d |
"\t\tLID...................%u\n"
|
|
Packit |
db064d |
"\t\tSMInfo dump:\n"
|
|
Packit |
db064d |
"\t\tGUID..................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tSM_Key................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tActCount..............%u\n"
|
|
Packit |
db064d |
"\t\tPriority..............%u\n"
|
|
Packit |
db064d |
"\t\tSMState...............%u\n",
|
|
Packit |
db064d |
be16toh(p_smr->lid),
|
|
Packit |
db064d |
be64toh(p_smr->sm_info.guid),
|
|
Packit |
db064d |
be64toh(p_smr->sm_info.sm_key),
|
|
Packit |
db064d |
be32toh(p_smr->sm_info.act_count),
|
|
Packit |
db064d |
priority, state);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_switch_info_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_switch_info_record_t *p_sir = data;
|
|
Packit |
db064d |
uint32_t sa_cap_mask2 = ib_class_cap_mask2(&p->cpi);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("SwitchInfoRecord dump:\n"
|
|
Packit |
db064d |
"\t\tRID\n"
|
|
Packit |
db064d |
"\t\tLID.....................................%u\n"
|
|
Packit |
db064d |
"\t\tSwitchInfo dump:\n"
|
|
Packit |
db064d |
"\t\tLinearFDBCap............................0x%X\n"
|
|
Packit |
db064d |
"\t\tRandomFDBCap............................0x%X\n"
|
|
Packit |
db064d |
"\t\tMulticastFDBCap.........................0x%X\n"
|
|
Packit |
db064d |
"\t\tLinearFDBTop............................0x%X\n"
|
|
Packit |
db064d |
"\t\tDefaultPort.............................%u\n"
|
|
Packit |
db064d |
"\t\tDefaultMulticastPrimaryPort.............%u\n"
|
|
Packit |
db064d |
"\t\tDefaultMulticastNotPrimaryPort..........%u\n"
|
|
Packit |
db064d |
"\t\tLifeTimeValue/PortStateChange/OpSL2VL...0x%X\n"
|
|
Packit |
db064d |
"\t\tLIDsPerPort.............................0x%X\n"
|
|
Packit |
db064d |
"\t\tPartitionEnforcementCap.................0x%X\n"
|
|
Packit |
db064d |
"\t\tflags...................................0x%X\n",
|
|
Packit |
db064d |
be16toh(p_sir->lid),
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.lin_cap),
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.rand_cap),
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.mcast_cap),
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.lin_top),
|
|
Packit |
db064d |
p_sir->switch_info.def_port,
|
|
Packit |
db064d |
p_sir->switch_info.def_mcast_pri_port,
|
|
Packit |
db064d |
p_sir->switch_info.def_mcast_not_port,
|
|
Packit |
db064d |
p_sir->switch_info.life_state,
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.lids_per_port),
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.enforce_cap),
|
|
Packit |
db064d |
p_sir->switch_info.flags);
|
|
Packit |
db064d |
if (sa_cap_mask2 & UMAD_SA_CAP_MASK2_IS_MCAST_TOP_SUP)
|
|
Packit |
db064d |
printf("\t\tMulticastFDBTop.........................0x%X\n",
|
|
Packit |
db064d |
be16toh(p_sir->switch_info.mcast_top));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_inform_info_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char gid_str[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
char gid_str2[INET6_ADDRSTRLEN];
|
|
Packit |
db064d |
ib_inform_info_record_t *p_iir = data;
|
|
Packit |
db064d |
__be32 qpn;
|
|
Packit |
db064d |
uint8_t resp_time_val;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ib_inform_info_get_qpn_resp_time(p_iir->inform_info.g_or_v.
|
|
Packit |
db064d |
generic.qpn_resp_time_val, &qpn,
|
|
Packit |
db064d |
&resp_time_val);
|
|
Packit |
db064d |
if (p_iir->inform_info.is_generic) {
|
|
Packit |
db064d |
printf("InformInfoRecord dump:\n"
|
|
Packit |
db064d |
"\t\tRID\n"
|
|
Packit |
db064d |
"\t\tSubscriberGID...........%s\n"
|
|
Packit |
db064d |
"\t\tSubscriberEnum..........0x%X\n"
|
|
Packit |
db064d |
"\t\tInformInfo dump:\n"
|
|
Packit |
db064d |
"\t\tgid.....................%s\n"
|
|
Packit |
db064d |
"\t\tlid_range_begin.........%u\n"
|
|
Packit |
db064d |
"\t\tlid_range_end...........%u\n"
|
|
Packit |
db064d |
"\t\tis_generic..............0x%X\n"
|
|
Packit |
db064d |
"\t\tsubscribe...............0x%X\n"
|
|
Packit |
db064d |
"\t\ttrap_type...............0x%X\n"
|
|
Packit |
db064d |
"\t\ttrap_num................%u\n",
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, gid_str,
|
|
Packit |
db064d |
sizeof gid_str),
|
|
Packit |
db064d |
be16toh(p_iir->subscriber_enum),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_iir->inform_info.gid.raw, gid_str2,
|
|
Packit |
db064d |
sizeof gid_str2),
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.lid_range_begin),
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.lid_range_end),
|
|
Packit |
db064d |
p_iir->inform_info.is_generic,
|
|
Packit |
db064d |
p_iir->inform_info.subscribe,
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.trap_type),
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.g_or_v.generic.trap_num));
|
|
Packit |
db064d |
if (show_keys) {
|
|
Packit |
db064d |
printf("\t\tqpn.....................0x%06X\n",
|
|
Packit |
db064d |
be32toh(qpn));
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
printf("\t\tqpn....................."
|
|
Packit |
db064d |
NOT_DISPLAYED_STR "\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
printf("\t\tresp_time_val...........0x%X\n"
|
|
Packit |
db064d |
"\t\tnode_type...............0x%06X\n",
|
|
Packit |
db064d |
resp_time_val,
|
|
Packit |
db064d |
be32toh(ib_inform_info_get_prod_type
|
|
Packit |
db064d |
(&p_iir->inform_info)));
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
printf("InformInfoRecord dump:\n"
|
|
Packit |
db064d |
"\t\tRID\n"
|
|
Packit |
db064d |
"\t\tSubscriberGID...........%s\n"
|
|
Packit |
db064d |
"\t\tSubscriberEnum..........0x%X\n"
|
|
Packit |
db064d |
"\t\tInformInfo dump:\n"
|
|
Packit |
db064d |
"\t\tgid.....................%s\n"
|
|
Packit |
db064d |
"\t\tlid_range_begin.........%u\n"
|
|
Packit |
db064d |
"\t\tlid_range_end...........%u\n"
|
|
Packit |
db064d |
"\t\tis_generic..............0x%X\n"
|
|
Packit |
db064d |
"\t\tsubscribe...............0x%X\n"
|
|
Packit |
db064d |
"\t\ttrap_type...............0x%X\n"
|
|
Packit |
db064d |
"\t\tdev_id..................0x%X\n",
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_iir->subscriber_gid.raw, gid_str,
|
|
Packit |
db064d |
sizeof gid_str),
|
|
Packit |
db064d |
be16toh(p_iir->subscriber_enum),
|
|
Packit |
db064d |
inet_ntop(AF_INET6, p_iir->inform_info.gid.raw,
|
|
Packit |
db064d |
gid_str2, sizeof gid_str2),
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.lid_range_begin),
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.lid_range_end),
|
|
Packit |
db064d |
p_iir->inform_info.is_generic,
|
|
Packit |
db064d |
p_iir->inform_info.subscribe,
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.trap_type),
|
|
Packit |
db064d |
be16toh(p_iir->inform_info.g_or_v.vend.dev_id));
|
|
Packit |
db064d |
if (show_keys) {
|
|
Packit |
db064d |
printf("\t\tqpn.....................0x%06X\n",
|
|
Packit |
db064d |
be32toh(qpn));
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
printf("\t\tqpn....................."
|
|
Packit |
db064d |
NOT_DISPLAYED_STR "\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
printf("\t\tresp_time_val...........0x%X\n"
|
|
Packit |
db064d |
"\t\tvendor_id...............0x%06X\n",
|
|
Packit |
db064d |
resp_time_val,
|
|
Packit |
db064d |
be32toh(ib_inform_info_get_prod_type
|
|
Packit |
db064d |
(&p_iir->inform_info)));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_link_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_link_record_t *lr = data;
|
|
Packit |
db064d |
printf("LinkRecord dump:\n"
|
|
Packit |
db064d |
"\t\tFromLID....................%u\n"
|
|
Packit |
db064d |
"\t\tFromPort...................%u\n"
|
|
Packit |
db064d |
"\t\tToPort.....................%u\n"
|
|
Packit |
db064d |
"\t\tToLID......................%u\n",
|
|
Packit |
db064d |
be16toh(lr->from_lid), lr->from_port_num,
|
|
Packit |
db064d |
lr->to_port_num, be16toh(lr->to_lid));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_slvl_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_slvl_table_record_t *slvl = data;
|
|
Packit |
db064d |
ib_slvl_table_t *t = &slvl->slvl_tbl;
|
|
Packit |
db064d |
printf("SL2VLTableRecord dump:\n"
|
|
Packit |
db064d |
"\t\tLID........................%u\n"
|
|
Packit |
db064d |
"\t\tInPort.....................%u\n"
|
|
Packit |
db064d |
"\t\tOutPort....................%u\n"
|
|
Packit |
db064d |
"\t\tSL: 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|\n"
|
|
Packit |
db064d |
"\t\tVL:%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u"
|
|
Packit |
db064d |
"|%2u|%2u|%2u|\n",
|
|
Packit |
db064d |
be16toh(slvl->lid), slvl->in_port_num, slvl->out_port_num,
|
|
Packit |
db064d |
ib_slvl_table_get(t, 0), ib_slvl_table_get(t, 1),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 2), ib_slvl_table_get(t, 3),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 4), ib_slvl_table_get(t, 5),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 6), ib_slvl_table_get(t, 7),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 8), ib_slvl_table_get(t, 9),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 10), ib_slvl_table_get(t, 11),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 12), ib_slvl_table_get(t, 13),
|
|
Packit |
db064d |
ib_slvl_table_get(t, 14), ib_slvl_table_get(t, 15));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_vlarb_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_vl_arb_table_record_t *vlarb = data;
|
|
Packit |
db064d |
ib_vl_arb_element_t *e = vlarb->vl_arb_tbl.vl_entry;
|
|
Packit |
db064d |
int i;
|
|
Packit |
db064d |
printf("VLArbTableRecord dump:\n"
|
|
Packit |
db064d |
"\t\tLID........................%u\n"
|
|
Packit |
db064d |
"\t\tPort.......................%u\n"
|
|
Packit |
db064d |
"\t\tBlock......................%u\n",
|
|
Packit |
db064d |
be16toh(vlarb->lid), vlarb->port_num, vlarb->block_num);
|
|
Packit |
db064d |
for (i = 0; i < 32; i += 16)
|
|
Packit |
db064d |
printf("\t\tVL :%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|"
|
|
Packit |
db064d |
"%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|\n"
|
|
Packit |
db064d |
"\t\tWeight:%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|"
|
|
Packit |
db064d |
"%2u|%2u|%2u|%2u|%2u|%2u|%2u|%2u|\n",
|
|
Packit |
db064d |
e[i + 0].vl, e[i + 1].vl, e[i + 2].vl, e[i + 3].vl,
|
|
Packit |
db064d |
e[i + 4].vl, e[i + 5].vl, e[i + 6].vl, e[i + 7].vl,
|
|
Packit |
db064d |
e[i + 8].vl, e[i + 9].vl, e[i + 10].vl, e[i + 11].vl,
|
|
Packit |
db064d |
e[i + 12].vl, e[i + 13].vl, e[i + 14].vl, e[i + 15].vl,
|
|
Packit |
db064d |
e[i + 0].weight, e[i + 1].weight, e[i + 2].weight,
|
|
Packit |
db064d |
e[i + 3].weight, e[i + 4].weight, e[i + 5].weight,
|
|
Packit |
db064d |
e[i + 6].weight, e[i + 7].weight, e[i + 8].weight,
|
|
Packit |
db064d |
e[i + 9].weight, e[i + 10].weight, e[i + 11].weight,
|
|
Packit |
db064d |
e[i + 12].weight, e[i + 13].weight, e[i + 14].weight,
|
|
Packit |
db064d |
e[i + 15].weight);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_pkey_tbl_record(void *data, struct query_params *params)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_pkey_table_record_t *pktr = data;
|
|
Packit |
db064d |
__be16 *p = pktr->pkey_tbl.pkey_entry;
|
|
Packit |
db064d |
int i;
|
|
Packit |
db064d |
printf("PKeyTableRecord dump:\n"
|
|
Packit |
db064d |
"\t\tLID........................%u\n"
|
|
Packit |
db064d |
"\t\tPort.......................%u\n"
|
|
Packit |
db064d |
"\t\tBlock......................%u\n"
|
|
Packit |
db064d |
"\t\tPKey Table:\n",
|
|
Packit |
db064d |
be16toh(pktr->lid), pktr->port_num, pktr->block_num);
|
|
Packit |
db064d |
for (i = 0; i < 32; i += 8)
|
|
Packit |
db064d |
printf("\t\t0x%04x 0x%04x 0x%04x 0x%04x"
|
|
Packit |
db064d |
" 0x%04x 0x%04x 0x%04x 0x%04x\n",
|
|
Packit |
db064d |
be16toh(p[i + 0]), be16toh(p[i + 1]),
|
|
Packit |
db064d |
be16toh(p[i + 2]), be16toh(p[i + 3]),
|
|
Packit |
db064d |
be16toh(p[i + 4]), be16toh(p[i + 5]),
|
|
Packit |
db064d |
be16toh(p[i + 6]), be16toh(p[i + 7]));
|
|
Packit |
db064d |
printf("\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_lft_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_lft_record_t *lftr = data;
|
|
Packit |
db064d |
unsigned block = be16toh(lftr->block_num);
|
|
Packit |
db064d |
int i;
|
|
Packit |
db064d |
printf("LFT Record dump:\n"
|
|
Packit |
db064d |
"\t\tLID........................%u\n"
|
|
Packit |
db064d |
"\t\tBlock......................%u\n"
|
|
Packit |
db064d |
"\t\tLFT:\n\t\tLID\tPort Number\n", be16toh(lftr->lid), block);
|
|
Packit |
db064d |
for (i = 0; i < 64; i++)
|
|
Packit |
db064d |
printf("\t\t%u\t%u\n", block * 64 + i, lftr->lft[i]);
|
|
Packit |
db064d |
printf("\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_guidinfo_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_guidinfo_record_t *gir = data;
|
|
Packit |
db064d |
printf("GUIDInfo Record dump:\n"
|
|
Packit |
db064d |
"\t\tLID........................%u\n"
|
|
Packit |
db064d |
"\t\tBlock......................%u\n"
|
|
Packit |
db064d |
"\t\tGUID 0.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 1.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 2.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 3.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 4.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 5.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 6.....................0x%016" PRIx64 "\n"
|
|
Packit |
db064d |
"\t\tGUID 7.....................0x%016" PRIx64 "\n",
|
|
Packit |
db064d |
be16toh(gir->lid), gir->block_num,
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[0]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[1]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[2]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[3]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[4]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[5]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[6]),
|
|
Packit |
db064d |
be64toh(gir->guid_info.guid[7]));
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_one_mft_record(void *data, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_mft_record_t *mftr = data;
|
|
Packit |
db064d |
unsigned position = be16toh(mftr->position_block_num) >> 12;
|
|
Packit |
db064d |
unsigned block = be16toh(mftr->position_block_num) &
|
|
Packit |
db064d |
IB_MCAST_BLOCK_ID_MASK_HO;
|
|
Packit |
db064d |
int i;
|
|
Packit |
db064d |
unsigned offset;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("MFT Record dump:\n"
|
|
Packit |
db064d |
"\t\tLID........................%u\n"
|
|
Packit |
db064d |
"\t\tPosition...................%u\n"
|
|
Packit |
db064d |
"\t\tBlock......................%u\n"
|
|
Packit |
db064d |
"\t\tMFT:\n\t\tMLID\tPort Mask\n",
|
|
Packit |
db064d |
be16toh(mftr->lid), position, block);
|
|
Packit |
db064d |
offset = IB_LID_MCAST_START_HO + block * 32;
|
|
Packit |
db064d |
for (i = 0; i < IB_MCAST_BLOCK_SIZE; i++)
|
|
Packit |
db064d |
printf("\t\t0x%04x\t0x%04x\n",
|
|
Packit |
db064d |
offset + i, be16toh(mftr->mft[i]));
|
|
Packit |
db064d |
printf("\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static void dump_results(struct sa_query_result *r,
|
|
Packit |
db064d |
void (*dump_func) (void *, struct query_params *),
|
|
Packit |
db064d |
struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
unsigned i;
|
|
Packit |
db064d |
for (i = 0; i < r->result_cnt; i++) {
|
|
Packit |
db064d |
void *data = sa_get_query_rec(r->p_result_madw, i);
|
|
Packit |
db064d |
dump_func(data, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/**
|
|
Packit |
db064d |
* Get any record(s)
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
static int get_any_records(struct sa_handle * h,
|
|
Packit |
db064d |
uint16_t attr_id, uint32_t attr_mod,
|
|
Packit |
db064d |
__be64 comp_mask, void *attr,
|
|
Packit |
db064d |
size_t attr_size,
|
|
Packit |
db064d |
struct sa_query_result *result)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int ret = sa_query(h, IB_MAD_METHOD_GET_TABLE, attr_id, attr_mod,
|
|
Packit |
db064d |
be64toh(comp_mask), ibd_sakey, attr, attr_size, result);
|
|
Packit |
db064d |
if (ret) {
|
|
Packit |
db064d |
fprintf(stderr, "Query SA failed: %s\n", strerror(ret));
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (result->status != IB_SA_MAD_STATUS_SUCCESS) {
|
|
Packit |
db064d |
sa_report_err(result->status);
|
|
Packit |
db064d |
return EIO;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int get_and_dump_any_records(struct sa_handle * h, uint16_t attr_id,
|
|
Packit |
db064d |
uint32_t attr_mod, __be64 comp_mask,
|
|
Packit |
db064d |
void *attr,
|
|
Packit |
db064d |
size_t attr_size,
|
|
Packit |
db064d |
void (*dump_func) (void *,
|
|
Packit |
db064d |
struct query_params *),
|
|
Packit |
db064d |
struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct sa_query_result result;
|
|
Packit |
db064d |
int ret = get_any_records(h, attr_id, attr_mod, comp_mask, attr,
|
|
Packit |
db064d |
attr_size, &result);
|
|
Packit |
db064d |
if (ret)
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
dump_results(&result, dump_func, p);
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/**
|
|
Packit |
db064d |
* Get all the records available for requested query type.
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
static int get_all_records(struct sa_handle * h, uint16_t attr_id,
|
|
Packit |
db064d |
struct sa_query_result *result)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
return get_any_records(h, attr_id, 0, 0, NULL, 0, result);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int get_and_dump_all_records(struct sa_handle * h, uint16_t attr_id,
|
|
Packit |
db064d |
void (*dump_func) (void *,
|
|
Packit |
db064d |
struct query_params *p),
|
|
Packit |
db064d |
struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct sa_query_result result;
|
|
Packit |
db064d |
int ret = get_all_records(h, attr_id, &result);
|
|
Packit |
db064d |
if (ret)
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
dump_results(&result, dump_func, p);
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/**
|
|
Packit |
db064d |
* return the lid from the node descriptor (name) supplied
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
static int get_lid_from_name(struct sa_handle * h, const char *name, uint16_t * lid)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_node_record_t *node_record = NULL;
|
|
Packit |
db064d |
unsigned i;
|
|
Packit |
db064d |
int ret;
|
|
Packit |
db064d |
struct sa_query_result result;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ret = get_all_records(h, IB_SA_ATTR_NODERECORD, &result);
|
|
Packit |
db064d |
if (ret)
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ret = ENONET;
|
|
Packit |
db064d |
for (i = 0; i < result.result_cnt; i++) {
|
|
Packit |
db064d |
node_record = sa_get_query_rec(result.p_result_madw, i);
|
|
Packit |
db064d |
if (name
|
|
Packit |
db064d |
&& strncmp(name, (char *)node_record->node_desc.description,
|
|
Packit |
db064d |
sizeof(node_record->node_desc.description)) ==
|
|
Packit |
db064d |
0) {
|
|
Packit |
db064d |
*lid = be16toh(node_record->lid);
|
|
Packit |
db064d |
ret = 0;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static uint16_t get_lid(struct sa_handle * h, const char *name)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int rc = 0;
|
|
Packit |
db064d |
uint16_t rc_lid = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!name)
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
if (isalpha(name[0])) {
|
|
Packit |
db064d |
if ((rc = get_lid_from_name(h, name, &rc_lid)) != 0) {
|
|
Packit |
db064d |
fprintf(stderr, "Failed to find lid for \"%s\": %s\n",
|
|
Packit |
db064d |
name, strerror(rc));
|
|
Packit |
db064d |
exit(rc);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
long val;
|
|
Packit |
db064d |
errno = 0;
|
|
Packit |
db064d |
val = strtol(name, NULL, 0);
|
|
Packit |
db064d |
if (errno != 0 || val <= 0 || val > UINT16_MAX) {
|
|
Packit |
db064d |
fprintf(stderr, "Invalid lid specified: \"%s\"\n", name);
|
|
Packit |
db064d |
exit(EINVAL);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
rc_lid = (uint16_t)val;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return rc_lid;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int parse_iir_subscriber_gid(char *str, ib_inform_info_record_t *ir)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int rc = inet_pton(AF_INET6,str,&(ir->subscriber_gid.raw));
|
|
Packit |
db064d |
if(rc < 1){
|
|
Packit |
db064d |
fprintf(stderr, "Invalid SubscriberGID specified: \"%s\"\n",str);
|
|
Packit |
db064d |
exit(EINVAL);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
return rc;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int parse_lid_and_ports(struct sa_handle * h,
|
|
Packit |
db064d |
char *str, int *lid, int *port1, int *port2)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char *p, *e;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (port1)
|
|
Packit |
db064d |
*port1 = -1;
|
|
Packit |
db064d |
if (port2)
|
|
Packit |
db064d |
*port2 = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
p = strchr(str, '/');
|
|
Packit |
db064d |
if (p)
|
|
Packit |
db064d |
*p = '\0';
|
|
Packit |
db064d |
if (lid)
|
|
Packit |
db064d |
*lid = get_lid(h, str);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!p)
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
str = p + 1;
|
|
Packit |
db064d |
p = strchr(str, '/');
|
|
Packit |
db064d |
if (p)
|
|
Packit |
db064d |
*p = '\0';
|
|
Packit |
db064d |
if (port1) {
|
|
Packit |
db064d |
*port1 = strtoul(str, &e, 0);
|
|
Packit |
db064d |
if (e == str)
|
|
Packit |
db064d |
*port1 = -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!p)
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
str = p + 1;
|
|
Packit |
db064d |
if (port2) {
|
|
Packit |
db064d |
*port2 = strtoul(str, &e, 0);
|
|
Packit |
db064d |
if (e == str)
|
|
Packit |
db064d |
*port2 = -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/*
|
|
Packit |
db064d |
* Get the portinfo records available with IsSM or IsSMdisabled CapabilityMask bit on.
|
|
Packit |
db064d |
*/
|
|
Packit |
db064d |
static int get_issm_records(struct sa_handle * h, __be32 capability_mask,
|
|
Packit |
db064d |
struct sa_query_result *result)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_portinfo_record_t attr;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&attr, 0, sizeof(attr));
|
|
Packit |
db064d |
attr.port_info.capability_mask = capability_mask;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_any_records(h, IB_SA_ATTR_PORTINFORECORD, 1 << 31,
|
|
Packit |
db064d |
IB_PIR_COMPMASK_CAPMASK, &attr, sizeof(attr), result);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int print_node_records(struct sa_handle * h, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
unsigned i;
|
|
Packit |
db064d |
int ret;
|
|
Packit |
db064d |
struct sa_query_result result;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ret = get_all_records(h, IB_SA_ATTR_NODERECORD, &result);
|
|
Packit |
db064d |
if (ret)
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (node_print_desc == ALL_DESC) {
|
|
Packit |
db064d |
printf(" LID \"name\"\n");
|
|
Packit |
db064d |
printf("================\n");
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
for (i = 0; i < result.result_cnt; i++) {
|
|
Packit |
db064d |
ib_node_record_t *node_record;
|
|
Packit |
db064d |
node_record = sa_get_query_rec(result.p_result_madw, i);
|
|
Packit |
db064d |
if (node_print_desc == ALL_DESC) {
|
|
Packit |
db064d |
print_node_desc(node_record);
|
|
Packit |
db064d |
} else if (node_print_desc == NAME_OF_LID) {
|
|
Packit |
db064d |
if (requested_lid == be16toh(node_record->lid))
|
|
Packit |
db064d |
print_node_record(node_record);
|
|
Packit |
db064d |
} else if (node_print_desc == NAME_OF_GUID) {
|
|
Packit |
db064d |
ib_node_info_t *p_ni = &(node_record->node_info);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (requested_guid == be64toh(p_ni->port_guid))
|
|
Packit |
db064d |
print_node_record(node_record);
|
|
Packit |
db064d |
} else {
|
|
Packit |
db064d |
ib_node_info_t *p_ni = &(node_record->node_info);
|
|
Packit |
db064d |
ib_node_desc_t *p_nd = &(node_record->node_desc);
|
|
Packit |
db064d |
char *name;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
name = remap_node_name (node_name_map,
|
|
Packit |
db064d |
be64toh(p_ni->node_guid),
|
|
Packit |
db064d |
(char *)p_nd->description);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!requested_name ||
|
|
Packit |
db064d |
(strncmp(requested_name,
|
|
Packit |
db064d |
(char *)node_record->node_desc.description,
|
|
Packit |
db064d |
sizeof(node_record->
|
|
Packit |
db064d |
node_desc.description)) == 0) ||
|
|
Packit |
db064d |
(strncmp(requested_name,
|
|
Packit |
db064d |
name,
|
|
Packit |
db064d |
sizeof(node_record->
|
|
Packit |
db064d |
node_desc.description)) == 0)) {
|
|
Packit |
db064d |
print_node_record(node_record);
|
|
Packit |
db064d |
if (node_print_desc == UNIQUE_LID_ONLY) {
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
exit(0);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
free(name);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_path_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_path_rec_t pr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
uint32_t flow = 0;
|
|
Packit |
db064d |
__be16 qos_class = 0;
|
|
Packit |
db064d |
uint8_t reversible = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&pr, 0, sizeof(pr));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->service_id, 64, 0, pr.service_id, PR, SERVICEID);
|
|
Packit |
db064d |
CHECK_AND_SET_GID(p->sgid, pr.sgid, PR, SGID);
|
|
Packit |
db064d |
CHECK_AND_SET_GID(p->dgid, pr.dgid, PR, DGID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->slid, 16, 0, pr.slid, PR, SLID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->dlid, 16, 0, pr.dlid, PR, DLID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->hop_limit, 32, -1, pr.hop_flow_raw, PR, HOPLIMIT);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->flow_label, 8, 0, flow, PR, FLOWLABEL);
|
|
Packit |
db064d |
pr.hop_flow_raw |= htobe32(flow << 8);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->tclass, 8, 0, pr.tclass, PR, TCLASS);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->reversible, 8, -1, reversible, PR, REVERSIBLE);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->numb_path, 8, -1, pr.num_path, PR, NUMBPATH);
|
|
Packit |
db064d |
pr.num_path |= reversible << 7;
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->pkey, 16, 0, pr.pkey, PR, PKEY);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->sl, 16, -1, pr.qos_class_sl, PR, SL);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL((p->qos_class << 4), 16, -1, qos_class, PR, QOS_CLASS);
|
|
Packit |
db064d |
pr.qos_class_sl = (pr.qos_class_sl & htobe16(IB_PATH_REC_SL_MASK)) |
|
|
Packit |
db064d |
qos_class;
|
|
Packit |
db064d |
CHECK_AND_SET_VAL_AND_SEL(p->mtu, pr.mtu, PR, MTU, SELEC);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL_AND_SEL(p->rate, pr.rate, PR, RATE, SELEC);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, pr.pkt_life, PR, PKTLIFETIME,
|
|
Packit |
db064d |
SELEC);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_PATHRECORD, 0, comp_mask,
|
|
Packit |
db064d |
&pr, sizeof(pr), dump_path_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int print_issm_records(struct sa_handle * h, struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct sa_query_result result;
|
|
Packit |
db064d |
int ret = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* First, get IsSM records */
|
|
Packit |
db064d |
ret = get_issm_records(h, IB_PORT_CAP_IS_SM, &result);
|
|
Packit |
db064d |
if (ret != 0)
|
|
Packit |
db064d |
return (ret);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("IsSM ports\n");
|
|
Packit |
db064d |
dump_results(&result, dump_portinfo_record, p);
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* Now, get IsSMdisabled records */
|
|
Packit |
db064d |
ret = get_issm_records(h, IB_PORT_CAP_SM_DISAB, &result);
|
|
Packit |
db064d |
if (ret != 0)
|
|
Packit |
db064d |
return (ret);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
printf("\nIsSMdisabled ports\n");
|
|
Packit |
db064d |
dump_results(&result, dump_portinfo_record, p);
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return (ret);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int print_multicast_member_records(struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *params)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct sa_query_result mc_group_result;
|
|
Packit |
db064d |
struct sa_query_result nr_result;
|
|
Packit |
db064d |
int ret;
|
|
Packit |
db064d |
unsigned i;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ret = get_all_records(h, IB_SA_ATTR_MCRECORD, &mc_group_result);
|
|
Packit |
db064d |
if (ret)
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ret = get_all_records(h, IB_SA_ATTR_NODERECORD, &nr_result);
|
|
Packit |
db064d |
if (ret)
|
|
Packit |
db064d |
goto return_mc;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
for (i = 0; i < mc_group_result.result_cnt; i++) {
|
|
Packit |
db064d |
ib_member_rec_t *rec = (ib_member_rec_t *)
|
|
Packit |
db064d |
sa_get_query_rec(mc_group_result.p_result_madw,
|
|
Packit |
db064d |
i);
|
|
Packit |
db064d |
dump_multicast_member_record(rec, &nr_result, params);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
sa_free_result_mad(&nr_result);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return_mc:
|
|
Packit |
db064d |
sa_free_result_mad(&mc_group_result);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int print_multicast_group_records(struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
return get_and_dump_all_records(h, IB_SA_ATTR_MCRECORD,
|
|
Packit |
db064d |
dump_multicast_group_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_class_port_info(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
dump_class_port_info(&p->cpi);
|
|
Packit |
db064d |
return (0);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_node_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_node_record_t nr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, NULL, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&nr, 0, sizeof(nr));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, nr.lid, NR, LID);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_NODERECORD, 0, comp_mask,
|
|
Packit |
db064d |
&nr, sizeof(nr), dump_node_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_portinfo_records(const struct query_cmd *q,
|
|
Packit |
db064d |
struct sa_handle * h, struct query_params *p,
|
|
Packit |
db064d |
int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_portinfo_record_t pir;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, port = -1, options = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &port, &options);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&pir, 0, sizeof(pir));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, pir.lid, PIR, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(port, 8, -1, pir.port_num, PIR, PORTNUM);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(options, 8, -1, pir.options, PIR, OPTIONS);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_PORTINFORECORD, 0,
|
|
Packit |
db064d |
comp_mask, &pir, sizeof(pir),
|
|
Packit |
db064d |
dump_one_portinfo_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_mcmember_records(const struct query_cmd *q,
|
|
Packit |
db064d |
struct sa_handle * h, struct query_params *p,
|
|
Packit |
db064d |
int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_member_rec_t mr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
uint32_t flow = 0;
|
|
Packit |
db064d |
uint8_t sl = 0, hop = 0, scope = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&mr, 0, sizeof(mr));
|
|
Packit |
db064d |
CHECK_AND_SET_GID(p->mgid, mr.mgid, MCR, MGID);
|
|
Packit |
db064d |
CHECK_AND_SET_GID(p->gid, mr.port_gid, MCR, PORT_GID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->mlid, 16, 0, mr.mlid, MCR, MLID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->qkey, 32, 0, mr.qkey, MCR, QKEY);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL_AND_SEL(p->mtu, mr.mtu, MCR, MTU, _SEL);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL_AND_SEL(p->rate, mr.rate, MCR, RATE, _SEL);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL_AND_SEL(p->pkt_life, mr.pkt_life, MCR, LIFE, _SEL);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->tclass, 8, 0, mr.tclass, MCR, TCLASS);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->pkey, 16, 0, mr.pkey, MCR, PKEY);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->sl, 8, -1, sl, MCR, SL);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->flow_label, 8, 0, flow, MCR, FLOW);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->hop_limit, 8, -1, hop, MCR, HOP);
|
|
Packit |
db064d |
mr.sl_flow_hop = ib_member_set_sl_flow_hop(sl, flow, hop);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->scope, 8, 0, scope, MCR, SCOPE);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->join_state, 8, 0, mr.scope_state, MCR, JOIN_STATE);
|
|
Packit |
db064d |
mr.scope_state |= scope << 4;
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(p->proxy_join, 8, -1, mr.proxy_join, MCR, PROXY);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_MCRECORD, 0, comp_mask,
|
|
Packit |
db064d |
&mr, sizeof(mr), dump_one_mcmember_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_service_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
return get_and_dump_all_records(h, IB_SA_ATTR_SERVICERECORD,
|
|
Packit |
db064d |
dump_service_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_sm_info_records(const struct query_cmd *q,
|
|
Packit |
db064d |
struct sa_handle * h, struct query_params *p,
|
|
Packit |
db064d |
int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_sminfo_record_t smir;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, NULL, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&smir, 0, sizeof(smir));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, smir.lid, SMIR, LID);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_SMINFORECORD, 0,
|
|
Packit |
db064d |
comp_mask, &smir, sizeof(smir),
|
|
Packit |
db064d |
dump_sm_info_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_switchinfo_records(const struct query_cmd *q,
|
|
Packit |
db064d |
struct sa_handle * h, struct query_params *p,
|
|
Packit |
db064d |
int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_switch_info_record_t swir;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, NULL, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&swir, 0, sizeof(swir));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, swir.lid, SWIR, LID);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_SWITCHINFORECORD, 0,
|
|
Packit |
db064d |
comp_mask, &swir, sizeof(swir),
|
|
Packit |
db064d |
dump_switch_info_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_inform_info_records(const struct query_cmd *q,
|
|
Packit |
db064d |
struct sa_handle * h, struct query_params *p,
|
|
Packit |
db064d |
int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int rc = 0;
|
|
Packit |
db064d |
ib_inform_info_record_t ir;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
memset(&ir, 0, sizeof(ir));
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0) {
|
|
Packit |
db064d |
comp_mask = IB_IIR_COMPMASK_SUBSCRIBERGID;
|
|
Packit |
db064d |
if((rc = parse_iir_subscriber_gid(argv[0], &ir)) < 1)
|
|
Packit |
db064d |
return rc;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_INFORMINFORECORD, 0, comp_mask,
|
|
Packit |
db064d |
&ir, sizeof(ir), dump_inform_info_record, p);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_link_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_link_record_t lr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int from_lid = 0, to_lid = 0, from_port = -1, to_port = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &from_lid, &from_port, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 1)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[1], &to_lid, &to_port, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&lr, 0, sizeof(lr));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(from_lid, 16, 0, lr.from_lid, LR, FROM_LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(from_port, 8, -1, lr.from_port_num, LR, FROM_PORT);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(to_lid, 16, 0, lr.to_lid, LR, TO_LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(to_port, 8, -1, lr.to_port_num, LR, TO_PORT);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_LINKRECORD, 0, comp_mask,
|
|
Packit |
db064d |
&lr, sizeof(lr), dump_one_link_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_sl2vl_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_slvl_table_record_t slvl;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, in_port = -1, out_port = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &in_port, &out_port);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&slvl, 0, sizeof(slvl));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, slvl.lid, SLVL, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(in_port, 8, -1, slvl.in_port_num, SLVL, IN_PORT);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(out_port, 8, -1, slvl.out_port_num, SLVL, OUT_PORT);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_SL2VLTABLERECORD, 0,
|
|
Packit |
db064d |
comp_mask, &slvl, sizeof(slvl),
|
|
Packit |
db064d |
dump_one_slvl_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_vlarb_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_vl_arb_table_record_t vlarb;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, port = -1, block = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &port, &block);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&vlarb, 0, sizeof(vlarb));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, vlarb.lid, VLA, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(port, 8, -1, vlarb.port_num, VLA, OUT_PORT);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(block, 8, -1, vlarb.block_num, VLA, BLOCK);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_VLARBTABLERECORD, 0,
|
|
Packit |
db064d |
comp_mask, &vlarb, sizeof(vlarb),
|
|
Packit |
db064d |
dump_one_vlarb_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_pkey_tbl_records(const struct query_cmd *q,
|
|
Packit |
db064d |
struct sa_handle * h, struct query_params *p,
|
|
Packit |
db064d |
int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_pkey_table_record_t pktr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, port = -1, block = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &port, &block);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&pktr, 0, sizeof(pktr));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, pktr.lid, PKEY, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(port, 8, -1, pktr.port_num, PKEY, PORT);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(block, 16, -1, pktr.block_num, PKEY, BLOCK);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_PKEYTABLERECORD, 0,
|
|
Packit |
db064d |
comp_mask, &pktr, sizeof(pktr),
|
|
Packit |
db064d |
dump_one_pkey_tbl_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_lft_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_lft_record_t lftr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, block = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &block, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&lftr, 0, sizeof(lftr));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, lftr.lid, LFTR, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(block, 16, -1, lftr.block_num, LFTR, BLOCK);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_LFTRECORD, 0, comp_mask,
|
|
Packit |
db064d |
&lftr, sizeof(lftr), dump_one_lft_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_guidinfo_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_guidinfo_record_t gir;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, block = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &block, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&gir, 0, sizeof(gir));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, gir.lid, GIR, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(block, 8, -1, gir.block_num, GIR, BLOCKNUM);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_GUIDINFORECORD, 0,
|
|
Packit |
db064d |
comp_mask, &gir, sizeof(gir),
|
|
Packit |
db064d |
dump_one_guidinfo_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_mft_records(const struct query_cmd *q, struct sa_handle * h,
|
|
Packit |
db064d |
struct query_params *p, int argc, char *argv[])
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_mft_record_t mftr;
|
|
Packit |
db064d |
__be64 comp_mask = 0;
|
|
Packit |
db064d |
int lid = 0, block = -1, position = -1;
|
|
Packit |
db064d |
uint16_t pos = 0;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc > 0)
|
|
Packit |
db064d |
parse_lid_and_ports(h, argv[0], &lid, &position, &block);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(&mftr, 0, sizeof(mftr));
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(lid, 16, 0, mftr.lid, MFTR, LID);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(block, 16, -1, mftr.position_block_num, MFTR, BLOCK);
|
|
Packit |
db064d |
mftr.position_block_num &= htobe16(IB_MCAST_BLOCK_ID_MASK_HO);
|
|
Packit |
db064d |
CHECK_AND_SET_VAL(position, 8, -1, pos, MFTR, POSITION);
|
|
Packit |
db064d |
mftr.position_block_num |= htobe16(pos << 12);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return get_and_dump_any_records(h, IB_SA_ATTR_MFTRECORD, 0, comp_mask,
|
|
Packit |
db064d |
&mftr, sizeof(mftr), dump_one_mft_record, p);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int query_sa_cpi(struct sa_handle *h, struct query_params *query_params)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
ib_class_port_info_t *cpi;
|
|
Packit |
db064d |
struct sa_query_result result;
|
|
Packit |
db064d |
int ret = sa_query(h, IB_MAD_METHOD_GET, CLASS_PORT_INFO, 0, 0,
|
|
Packit |
db064d |
ibd_sakey, NULL, 0, &result);
|
|
Packit |
db064d |
if (ret) {
|
|
Packit |
db064d |
fprintf(stderr, "Query SA failed: %s\n", strerror(ret));
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (result.status != IB_SA_MAD_STATUS_SUCCESS) {
|
|
Packit |
db064d |
sa_report_err(result.status);
|
|
Packit |
db064d |
ret = EIO;
|
|
Packit |
db064d |
goto Exit;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
cpi = sa_get_query_rec(result.p_result_madw, 0);
|
|
Packit |
db064d |
memcpy(&query_params->cpi, cpi, sizeof(query_params->cpi));
|
|
Packit |
db064d |
Exit:
|
|
Packit |
db064d |
sa_free_result_mad(&result);
|
|
Packit |
db064d |
return ret;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static const struct query_cmd query_cmds[] = {
|
|
Packit |
db064d |
{"ClassPortInfo", "CPI", CLASS_PORT_INFO,
|
|
Packit |
db064d |
NULL, query_class_port_info},
|
|
Packit |
db064d |
{"NodeRecord", "NR", IB_SA_ATTR_NODERECORD,
|
|
Packit |
db064d |
"[lid]", query_node_records},
|
|
Packit |
db064d |
{"PortInfoRecord", "PIR", IB_SA_ATTR_PORTINFORECORD,
|
|
Packit |
db064d |
"[[lid]/[port]/[options]]", query_portinfo_records},
|
|
Packit |
db064d |
{"SL2VLTableRecord", "SL2VL", IB_SA_ATTR_SL2VLTABLERECORD,
|
|
Packit |
db064d |
"[[lid]/[in_port]/[out_port]]", query_sl2vl_records},
|
|
Packit |
db064d |
{"PKeyTableRecord", "PKTR", IB_SA_ATTR_PKEYTABLERECORD,
|
|
Packit |
db064d |
"[[lid]/[port]/[block]]", query_pkey_tbl_records},
|
|
Packit |
db064d |
{"VLArbitrationTableRecord", "VLAR", IB_SA_ATTR_VLARBTABLERECORD,
|
|
Packit |
db064d |
"[[lid]/[port]/[block]]", query_vlarb_records},
|
|
Packit |
db064d |
{"InformInfoRecord", "IIR", IB_SA_ATTR_INFORMINFORECORD,
|
|
Packit |
db064d |
"[subscriber_gid]", query_inform_info_records},
|
|
Packit |
db064d |
{"LinkRecord", "LR", IB_SA_ATTR_LINKRECORD,
|
|
Packit |
db064d |
"[[from_lid]/[from_port]] [[to_lid]/[to_port]]", query_link_records},
|
|
Packit |
db064d |
{"ServiceRecord", "SR", IB_SA_ATTR_SERVICERECORD,
|
|
Packit |
db064d |
NULL, query_service_records},
|
|
Packit |
db064d |
{"PathRecord", "PR", IB_SA_ATTR_PATHRECORD,
|
|
Packit |
db064d |
NULL, query_path_records},
|
|
Packit |
db064d |
{"MCMemberRecord", "MCMR", IB_SA_ATTR_MCRECORD,
|
|
Packit |
db064d |
NULL, query_mcmember_records},
|
|
Packit |
db064d |
{"LFTRecord", "LFTR", IB_SA_ATTR_LFTRECORD,
|
|
Packit |
db064d |
"[[lid]/[block]]", query_lft_records},
|
|
Packit |
db064d |
{"MFTRecord", "MFTR", IB_SA_ATTR_MFTRECORD,
|
|
Packit |
db064d |
"[[mlid]/[position]/[block]]", query_mft_records},
|
|
Packit |
db064d |
{"GUIDInfoRecord", "GIR", IB_SA_ATTR_GUIDINFORECORD,
|
|
Packit |
db064d |
"[[lid]/[block]]", query_guidinfo_records},
|
|
Packit |
db064d |
{"SwitchInfoRecord", "SWIR", IB_SA_ATTR_SWITCHINFORECORD,
|
|
Packit |
db064d |
"[lid]", query_switchinfo_records},
|
|
Packit |
db064d |
{"SMInfoRecord", "SMIR", IB_SA_ATTR_SMINFORECORD,
|
|
Packit |
db064d |
"[lid]", query_sm_info_records},
|
|
Packit |
db064d |
{}
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static const struct query_cmd *find_query(const char *name)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
const struct query_cmd *q;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
for (q = query_cmds; q->name; q++)
|
|
Packit |
db064d |
if (!strcasecmp(name, q->name) ||
|
|
Packit |
db064d |
(q->alias && !strcasecmp(name, q->alias)))
|
|
Packit |
db064d |
return q;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return NULL;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static const struct query_cmd *find_query_by_type(uint16_t type)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
const struct query_cmd *q;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
for (q = query_cmds; q->name; q++)
|
|
Packit |
db064d |
if (q->query_type == type)
|
|
Packit |
db064d |
return q;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
return NULL;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
enum saquery_command {
|
|
Packit |
db064d |
SAQUERY_CMD_QUERY,
|
|
Packit |
db064d |
SAQUERY_CMD_NODE_RECORD,
|
|
Packit |
db064d |
SAQUERY_CMD_CLASS_PORT_INFO,
|
|
Packit |
db064d |
SAQUERY_CMD_ISSM,
|
|
Packit |
db064d |
SAQUERY_CMD_MCGROUPS,
|
|
Packit |
db064d |
SAQUERY_CMD_MCMEMBERS,
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static enum saquery_command command = SAQUERY_CMD_QUERY;
|
|
Packit |
db064d |
static uint16_t query_type;
|
|
Packit |
db064d |
static char *src_lid, *dst_lid;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
static int process_opt(void *context, int ch)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
struct query_params *p = context;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
switch (ch) {
|
|
Packit |
db064d |
case 1:
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
src_lid = strdup(optarg);
|
|
Packit |
db064d |
dst_lid = strchr(src_lid, ':');
|
|
Packit |
db064d |
if (!dst_lid)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
*dst_lid++ = '\0';
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
p->numb_path = 0x7f;
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_PATHRECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 2:
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
char *src_addr = strdup(optarg);
|
|
Packit |
db064d |
char *dst_addr = strchr(src_addr, '-');
|
|
Packit |
db064d |
if (!dst_addr)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
*dst_addr++ = '\0';
|
|
Packit |
db064d |
if (inet_pton(AF_INET6, src_addr, &p->sgid) <= 0)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
if (inet_pton(AF_INET6, dst_addr, &p->dgid) <= 0)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
free(src_addr);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
p->numb_path = 0x7f;
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_PATHRECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 3:
|
|
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 4:
|
|
Packit |
db064d |
if (!isxdigit(*optarg) && !(optarg = getpass("SM_Key: "))) {
|
|
Packit |
db064d |
fprintf(stderr, "cannot get SM_Key\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
ibd_sakey = strtoull(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'p':
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_PATHRECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'D':
|
|
Packit |
db064d |
node_print_desc = ALL_DESC;
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'c':
|
|
Packit |
db064d |
command = SAQUERY_CMD_CLASS_PORT_INFO;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'S':
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_SERVICERECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'I':
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_INFORMINFORECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'N':
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'L':
|
|
Packit |
db064d |
node_print_desc = LID_ONLY;
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'l':
|
|
Packit |
db064d |
node_print_desc = UNIQUE_LID_ONLY;
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'G':
|
|
Packit |
db064d |
node_print_desc = GUID_ONLY;
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'O':
|
|
Packit |
db064d |
node_print_desc = NAME_OF_LID;
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'U':
|
|
Packit |
db064d |
node_print_desc = NAME_OF_GUID;
|
|
Packit |
db064d |
command = SAQUERY_CMD_NODE_RECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 's':
|
|
Packit |
db064d |
command = SAQUERY_CMD_ISSM;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'g':
|
|
Packit |
db064d |
command = SAQUERY_CMD_MCGROUPS;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'm':
|
|
Packit |
db064d |
command = SAQUERY_CMD_MCMEMBERS;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'x':
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_LINKRECORD;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 5:
|
|
Packit |
db064d |
p->slid = (uint16_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 6:
|
|
Packit |
db064d |
p->dlid = (uint16_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 7:
|
|
Packit |
db064d |
p->mlid = (uint16_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 14:
|
|
Packit |
db064d |
if (inet_pton(AF_INET6, optarg, &p->sgid) <= 0)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 15:
|
|
Packit |
db064d |
if (inet_pton(AF_INET6, optarg, &p->dgid) <= 0)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 16:
|
|
Packit |
db064d |
if (inet_pton(AF_INET6, optarg, &p->gid) <= 0)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 17:
|
|
Packit |
db064d |
if (inet_pton(AF_INET6, optarg, &p->mgid) <= 0)
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'r':
|
|
Packit |
db064d |
p->reversible = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'n':
|
|
Packit |
db064d |
p->numb_path = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 18:
|
|
Packit |
db064d |
if (!isxdigit(*optarg) && !(optarg = getpass("P_Key: "))) {
|
|
Packit |
db064d |
fprintf(stderr, "cannot get P_Key\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
p->pkey = (uint16_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'Q':
|
|
Packit |
db064d |
p->qos_class = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 19:
|
|
Packit |
db064d |
p->sl = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'M':
|
|
Packit |
db064d |
p->mtu = (uint8_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'R':
|
|
Packit |
db064d |
p->rate = (uint8_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 20:
|
|
Packit |
db064d |
p->pkt_life = (uint8_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'q':
|
|
Packit |
db064d |
if (!isxdigit(*optarg) && !(optarg = getpass("Q_Key: "))) {
|
|
Packit |
db064d |
fprintf(stderr, "cannot get Q_Key\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
p->qkey = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'T':
|
|
Packit |
db064d |
p->tclass = (uint8_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'F':
|
|
Packit |
db064d |
p->flow_label = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'H':
|
|
Packit |
db064d |
p->hop_limit = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 21:
|
|
Packit |
db064d |
p->scope = (uint8_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'J':
|
|
Packit |
db064d |
p->join_state = (uint8_t) strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 'X':
|
|
Packit |
db064d |
p->proxy_join = strtoul(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case 22:
|
|
Packit |
db064d |
p->service_id = strtoull(optarg, NULL, 0);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
default:
|
|
Packit |
db064d |
return -1;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
return 0;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
int main(int argc, char **argv)
|
|
Packit |
db064d |
{
|
|
Packit |
db064d |
int sa_cpi_required = 0;
|
|
Packit |
db064d |
char usage_args[1024];
|
|
Packit |
db064d |
struct sa_handle * h;
|
|
Packit |
db064d |
struct query_params params;
|
|
Packit |
db064d |
const struct query_cmd *q;
|
|
Packit |
db064d |
int status;
|
|
Packit |
db064d |
int n;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
const struct ibdiag_opt opts[] = {
|
|
Packit |
db064d |
{"p", 'p', 0, NULL, "get PathRecord info"},
|
|
Packit |
db064d |
{"N", 'N', 0, NULL, "get NodeRecord info"},
|
|
Packit |
db064d |
{"L", 'L', 0, NULL, "return the Lids of the name specified"},
|
|
Packit |
db064d |
{"l", 'l', 0, NULL,
|
|
Packit |
db064d |
"return the unique Lid of the name specified"},
|
|
Packit |
db064d |
{"G", 'G', 0, NULL, "return the Guids of the name specified"},
|
|
Packit |
db064d |
{"O", 'O', 0, NULL, "return name for the Lid specified"},
|
|
Packit |
db064d |
{"U", 'U', 0, NULL, "return name for the Guid specified"},
|
|
Packit |
db064d |
{"s", 's', 0, NULL, "return the PortInfoRecords with isSM or"
|
|
Packit |
db064d |
" isSMdisabled capability mask bit on"},
|
|
Packit |
db064d |
{"g", 'g', 0, NULL, "get multicast group info"},
|
|
Packit |
db064d |
{"m", 'm', 0, NULL, "get multicast member info (if multicast"
|
|
Packit |
db064d |
" group specified, list member GIDs only for group specified,"
|
|
Packit |
db064d |
" for example 'saquery -m 0xC000')"},
|
|
Packit |
db064d |
{"x", 'x', 0, NULL, "get LinkRecord info"},
|
|
Packit |
db064d |
{"c", 'c', 0, NULL, "get the SA's class port info"},
|
|
Packit |
db064d |
{"S", 'S', 0, NULL, "get ServiceRecord info"},
|
|
Packit |
db064d |
{"I", 'I', 0, NULL, "get InformInfoRecord (subscription) info"},
|
|
Packit |
db064d |
{"list", 'D', 0, NULL, "the node desc of the CA's"},
|
|
Packit |
db064d |
{"src-to-dst", 1, 1, "<src:dst>", "get a PathRecord for"
|
|
Packit |
db064d |
" <src:dst> where src and dst are either node names or LIDs"},
|
|
Packit |
db064d |
{"sgid-to-dgid", 2, 1, "<sgid-dgid>", "get a PathRecord for"
|
|
Packit |
db064d |
" <sgid-dgid> where sgid and dgid are addresses in IPv6 format"},
|
|
Packit |
db064d |
{"node-name-map", 3, 1, "<file>",
|
|
Packit |
db064d |
"specify a node name map file"},
|
|
Packit |
db064d |
{"smkey", 4, 1, "<val>",
|
|
Packit |
db064d |
"SA SM_Key value for the query."
|
|
Packit |
db064d |
" If non-numeric value (like 'x') is specified then"
|
|
Packit |
db064d |
" saquery will prompt for a value. "
|
|
Packit |
db064d |
" Default (when not specified here or in ibdiag.conf) is to "
|
|
Packit |
db064d |
" use SM_Key == 0 (or \"untrusted\")"},
|
|
Packit |
db064d |
{"slid", 5, 1, "<lid>", "Source LID (PathRecord)"},
|
|
Packit |
db064d |
{"dlid", 6, 1, "<lid>", "Destination LID (PathRecord)"},
|
|
Packit |
db064d |
{"mlid", 7, 1, "<lid>", "Multicast LID (MCMemberRecord)"},
|
|
Packit |
db064d |
{"sgid", 14, 1, "<gid>",
|
|
Packit |
db064d |
"Source GID (IPv6 format) (PathRecord)"},
|
|
Packit |
db064d |
{"dgid", 15, 1, "<gid>",
|
|
Packit |
db064d |
"Destination GID (IPv6 format) (PathRecord)"},
|
|
Packit |
db064d |
{"gid", 16, 1, "<gid>", "Port GID (MCMemberRecord)"},
|
|
Packit |
db064d |
{"mgid", 17, 1, "<gid>", "Multicast GID (MCMemberRecord)"},
|
|
Packit |
db064d |
{"reversible", 'r', 1, NULL, "Reversible path (PathRecord)"},
|
|
Packit |
db064d |
{"numb_path", 'n', 1, NULL, "Number of paths (PathRecord)"},
|
|
Packit |
db064d |
{"pkey", 18, 1, NULL, "P_Key (PathRecord, MCMemberRecord)."
|
|
Packit |
db064d |
" If non-numeric value (like 'x') is specified then"
|
|
Packit |
db064d |
" saquery will prompt for a value"},
|
|
Packit |
db064d |
{"qos_class", 'Q', 1, NULL, "QoS Class (PathRecord)"},
|
|
Packit |
db064d |
{"sl", 19, 1, NULL,
|
|
Packit |
db064d |
"Service level (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"mtu", 'M', 1, NULL,
|
|
Packit |
db064d |
"MTU and selector (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"rate", 'R', 1, NULL,
|
|
Packit |
db064d |
"Rate and selector (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"pkt_lifetime", 20, 1, NULL,
|
|
Packit |
db064d |
"Packet lifetime and selector (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"qkey", 'q', 1, NULL, "Q_Key (MCMemberRecord)."
|
|
Packit |
db064d |
" If non-numeric value (like 'x') is specified then"
|
|
Packit |
db064d |
" saquery will prompt for a value"},
|
|
Packit |
db064d |
{"tclass", 'T', 1, NULL,
|
|
Packit |
db064d |
"Traffic Class (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"flow_label", 'F', 1, NULL,
|
|
Packit |
db064d |
"Flow Label (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"hop_limit", 'H', 1, NULL,
|
|
Packit |
db064d |
"Hop limit (PathRecord, MCMemberRecord)"},
|
|
Packit |
db064d |
{"scope", 21, 1, NULL, "Scope (MCMemberRecord)"},
|
|
Packit |
db064d |
{"join_state", 'J', 1, NULL, "Join state (MCMemberRecord)"},
|
|
Packit |
db064d |
{"proxy_join", 'X', 1, NULL, "Proxy join (MCMemberRecord)"},
|
|
Packit |
db064d |
{"service_id", 22, 1, NULL, "ServiceID (PathRecord)"},
|
|
Packit |
db064d |
{}
|
|
Packit |
db064d |
};
|
|
Packit |
db064d |
|
|
Packit |
db064d |
memset(¶ms, 0, sizeof params);
|
|
Packit |
db064d |
params.hop_limit = -1;
|
|
Packit |
db064d |
params.reversible = -1;
|
|
Packit |
db064d |
params.numb_path = -1;
|
|
Packit |
db064d |
params.qos_class = -1;
|
|
Packit |
db064d |
params.sl = -1;
|
|
Packit |
db064d |
params.proxy_join = -1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
n = sprintf(usage_args, "[query-name] [<name> | <lid> | <guid>]\n"
|
|
Packit |
db064d |
"\nSupported query names (and aliases):\n");
|
|
Packit |
db064d |
for (q = query_cmds; q->name; q++) {
|
|
Packit |
db064d |
n += snprintf(usage_args + n, sizeof(usage_args) - n,
|
|
Packit |
db064d |
" %s (%s) %s\n", q->name,
|
|
Packit |
db064d |
q->alias ? q->alias : "",
|
|
Packit |
db064d |
q->usage ? q->usage : "");
|
|
Packit |
db064d |
if (n >= sizeof(usage_args))
|
|
Packit |
db064d |
exit(-1);
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
snprintf(usage_args + n, sizeof(usage_args) - n,
|
|
Packit |
db064d |
"\n Queries node records by default.");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
q = NULL;
|
|
Packit |
db064d |
ibd_timeout = DEFAULT_SA_TIMEOUT_MS;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
ibdiag_process_opts(argc, argv, ¶ms, "DGLsy", opts, process_opt,
|
|
Packit |
db064d |
usage_args, NULL);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
argc -= optind;
|
|
Packit |
db064d |
argv += optind;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (!query_type && command == SAQUERY_CMD_QUERY) {
|
|
Packit |
db064d |
if (!argc || !(q = find_query(argv[0])))
|
|
Packit |
db064d |
query_type = IB_SA_ATTR_NODERECORD;
|
|
Packit |
db064d |
else {
|
|
Packit |
db064d |
query_type = q->query_type;
|
|
Packit |
db064d |
argc--;
|
|
Packit |
db064d |
argv++;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (argc) {
|
|
Packit |
db064d |
if (node_print_desc == NAME_OF_LID) {
|
|
Packit |
db064d |
requested_lid = (uint16_t) strtoul(argv[0], NULL, 0);
|
|
Packit |
db064d |
requested_lid_flag++;
|
|
Packit |
db064d |
} else if (node_print_desc == NAME_OF_GUID) {
|
|
Packit |
db064d |
requested_guid = strtoul(argv[0], NULL, 0);
|
|
Packit |
db064d |
requested_guid_flag++;
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
requested_name = argv[0];
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if ((node_print_desc == LID_ONLY ||
|
|
Packit |
db064d |
node_print_desc == UNIQUE_LID_ONLY ||
|
|
Packit |
db064d |
node_print_desc == GUID_ONLY) && !requested_name) {
|
|
Packit |
db064d |
fprintf(stderr, "ERROR: name not specified\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (node_print_desc == NAME_OF_LID && !requested_lid_flag) {
|
|
Packit |
db064d |
fprintf(stderr, "ERROR: lid not specified\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (node_print_desc == NAME_OF_GUID && !requested_guid_flag) {
|
|
Packit |
db064d |
fprintf(stderr, "ERROR: guid not specified\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
/* Note: lid cannot be 0; see infiniband spec 4.1.3 */
|
|
Packit |
db064d |
if (node_print_desc == NAME_OF_LID && !requested_lid) {
|
|
Packit |
db064d |
fprintf(stderr, "ERROR: lid invalid\n");
|
|
Packit |
db064d |
ibdiag_show_usage();
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (umad_init())
|
|
Packit |
db064d |
IBEXIT("Failed to initialized umad library");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
h = sa_get_handle();
|
|
Packit |
db064d |
if (!h)
|
|
Packit |
db064d |
IBPANIC("Failed to bind to the SA");
|
|
Packit |
db064d |
|
|
Packit |
db064d |
node_name_map = open_node_name_map(node_name_map_file);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (src_lid && *src_lid)
|
|
Packit |
db064d |
params.slid = get_lid(h, src_lid);
|
|
Packit |
db064d |
if (dst_lid && *dst_lid)
|
|
Packit |
db064d |
params.dlid = get_lid(h, dst_lid);
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (command == SAQUERY_CMD_CLASS_PORT_INFO ||
|
|
Packit |
db064d |
query_type == CLASS_PORT_INFO ||
|
|
Packit |
db064d |
query_type == IB_SA_ATTR_SWITCHINFORECORD)
|
|
Packit |
db064d |
sa_cpi_required = 1;
|
|
Packit |
db064d |
|
|
Packit |
db064d |
if (sa_cpi_required && (status = query_sa_cpi(h, ¶ms)) != 0) {
|
|
Packit |
db064d |
fprintf(stderr, "Failed to query SA:ClassPortInfo\n");
|
|
Packit |
db064d |
goto error;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
switch (command) {
|
|
Packit |
db064d |
case SAQUERY_CMD_NODE_RECORD:
|
|
Packit |
db064d |
status = print_node_records(h, ¶ms);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case SAQUERY_CMD_CLASS_PORT_INFO:
|
|
Packit |
db064d |
dump_class_port_info(¶ms.cpi);
|
|
Packit |
db064d |
status = 0;
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case SAQUERY_CMD_ISSM:
|
|
Packit |
db064d |
status = print_issm_records(h, ¶ms);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case SAQUERY_CMD_MCGROUPS:
|
|
Packit |
db064d |
status = print_multicast_group_records(h, ¶ms);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
case SAQUERY_CMD_MCMEMBERS:
|
|
Packit |
db064d |
status = print_multicast_member_records(h, ¶ms);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
default:
|
|
Packit |
db064d |
if ((!q && !(q = find_query_by_type(query_type)))
|
|
Packit |
db064d |
|| !q->handler) {
|
|
Packit |
db064d |
fprintf(stderr, "Unknown query type %d\n", query_type);
|
|
Packit |
db064d |
status = EINVAL;
|
|
Packit |
db064d |
} else
|
|
Packit |
db064d |
status = q->handler(q, h, ¶ms, argc, argv);
|
|
Packit |
db064d |
break;
|
|
Packit |
db064d |
}
|
|
Packit |
db064d |
|
|
Packit |
db064d |
error:
|
|
Packit |
db064d |
if (src_lid)
|
|
Packit |
db064d |
free(src_lid);
|
|
Packit |
db064d |
sa_free_handle(h);
|
|
Packit |
db064d |
umad_done();
|
|
Packit |
db064d |
close_node_name_map(node_name_map);
|
|
Packit |
db064d |
return (status);
|
|
Packit |
db064d |
}
|