|
Packit |
857059 |
/* BEGIN_ICS_COPYRIGHT7 ****************************************
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Copyright (c) 2015-2017, Intel Corporation
|
|
Packit |
857059 |
|
|
Packit |
857059 |
Redistribution and use in source and binary forms, with or without
|
|
Packit |
857059 |
modification, are permitted provided that the following conditions are met:
|
|
Packit |
857059 |
|
|
Packit |
857059 |
* Redistributions of source code must retain the above copyright notice,
|
|
Packit |
857059 |
this list of conditions and the following disclaimer.
|
|
Packit |
857059 |
* Redistributions in binary form must reproduce the above copyright
|
|
Packit |
857059 |
notice, this list of conditions and the following disclaimer in the
|
|
Packit |
857059 |
documentation and/or other materials provided with the distribution.
|
|
Packit |
857059 |
* Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
857059 |
may be used to endorse or promote products derived from this software
|
|
Packit |
857059 |
without specific prior written permission.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
857059 |
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
857059 |
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit |
857059 |
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
Packit |
857059 |
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit |
857059 |
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit |
857059 |
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
Packit |
857059 |
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit |
857059 |
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit |
857059 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
857059 |
|
|
Packit |
857059 |
** END_ICS_COPYRIGHT7 ****************************************/
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#include <stdio.h>
|
|
Packit |
857059 |
#include <string.h>
|
|
Packit |
857059 |
#include <getopt.h>
|
|
Packit |
857059 |
#include <limits.h>
|
|
Packit |
857059 |
#include <errno.h>
|
|
Packit |
857059 |
|
|
Packit |
857059 |
/* work around conflicting names */
|
|
Packit |
857059 |
#include "infiniband/umad.h"
|
|
Packit |
857059 |
#include "infiniband/verbs.h"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#include "iba/ib_types.h"
|
|
Packit |
857059 |
#include "iba/ib_sm_priv.h"
|
|
Packit |
857059 |
#include "iba/ib_helper.h"
|
|
Packit |
857059 |
#include "opamgt_priv.h"
|
|
Packit |
857059 |
#include "ibprint.h"
|
|
Packit |
857059 |
#include "stl_print.h"
|
|
Packit |
857059 |
#include "iba/stl_pm.h"
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#define RESP_WAIT_TIME 1000 /* in ms */
|
|
Packit |
857059 |
#define MAD_ATTEMPTS 1 /* 1 attempt, no retries */
|
|
Packit |
857059 |
|
|
Packit |
857059 |
// bit mask
|
|
Packit |
857059 |
#define OTYPE_INFO 1
|
|
Packit |
857059 |
#define OTYPE_STATS 2
|
|
Packit |
857059 |
|
|
Packit |
857059 |
PrintDest_t g_dest;
|
|
Packit |
857059 |
int g_printLineByLine = 0;
|
|
Packit |
857059 |
uint8_t g_detail = 0;
|
|
Packit |
857059 |
unsigned g_verbose = 0;
|
|
Packit |
857059 |
uint64_t g_transactID = 0xffffffff1234000; // Upper half overwritten by umad
|
|
Packit |
857059 |
uint16_t g_pkey; // mgmt pkey to use
|
|
Packit |
857059 |
uint8_t g_cableInfo[STL_CIB_STD_LEN];
|
|
Packit |
857059 |
uint8_t g_pm_sl = 0xFF;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
#if defined(DBGPRINT)
|
|
Packit |
857059 |
#undef DBGPRINT
|
|
Packit |
857059 |
#endif
|
|
Packit |
857059 |
#define VRBSE_PRINT(format, args...) do { if (g_verbose) { fflush(stdout); fprintf(stdout, format, ##args); } } while (0)
|
|
Packit |
857059 |
#define DBGPRINT(format, args...) do { if (g_verbose>1) { fflush(stdout); fprintf(stderr, format, ##args); } } while (0)
|
|
Packit |
857059 |
|
|
Packit |
857059 |
const char *get_port_name(struct omgt_port *portHandle)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
static char buf[IBV_SYSFS_NAME_MAX + 6];
|
|
Packit |
857059 |
char hfi_name[IBV_SYSFS_NAME_MAX] = {0};
|
|
Packit |
857059 |
uint8_t port_num;
|
|
Packit |
857059 |
(void)omgt_port_get_hfi_port_num(portHandle, &port_num);
|
|
Packit |
857059 |
(void)omgt_port_get_hfi_name(portHandle, hfi_name);
|
|
Packit |
857059 |
snprintf(buf, sizeof(buf), "%.*s:%u", IBV_SYSFS_NAME_MAX, hfi_name, port_num);
|
|
Packit |
857059 |
return buf;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
void stl_set_local_route(OUT STL_SMP* smp)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
// local directed route
|
|
Packit |
857059 |
smp->common.MgmtClass = MCLASS_SM_DIRECTED_ROUTE;
|
|
Packit |
857059 |
smp->common.u.DR.s.D = 0;
|
|
Packit |
857059 |
smp->common.u.DR.s.Status = 0;
|
|
Packit |
857059 |
smp->common.u.DR.HopPointer = 0;
|
|
Packit |
857059 |
smp->common.u.DR.HopCount = 0;
|
|
Packit |
857059 |
smp->SmpExt.DirectedRoute.DrSLID = STL_LID_PERMISSIVE;
|
|
Packit |
857059 |
smp->SmpExt.DirectedRoute.DrDLID = STL_LID_PERMISSIVE;
|
|
Packit |
857059 |
return;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
FSTATUS perform_local_stl_sma_query( IN struct omgt_port *portHandle,
|
|
Packit |
857059 |
IN uint16 attrid,
|
|
Packit |
857059 |
IN uint32 attrmod,
|
|
Packit |
857059 |
OUT STL_SMP* smp )
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
FSTATUS status;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
smp->common.BaseVersion = STL_BASE_VERSION;
|
|
Packit |
857059 |
smp->common.ClassVersion = STL_SM_CLASS_VERSION;
|
|
Packit |
857059 |
stl_set_local_route(smp);
|
|
Packit |
857059 |
smp->common.mr.AsReg8 = 0;
|
|
Packit |
857059 |
smp->common.mr.s.Method = MMTHD_GET;
|
|
Packit |
857059 |
smp->common.AttributeID = attrid;
|
|
Packit |
857059 |
smp->common.AttributeModifier = attrmod;
|
|
Packit |
857059 |
smp->common.TransactionID = (++g_transactID);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
STL_BSWAP_SMP_HEADER(smp);
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
struct omgt_mad_addr addr = {
|
|
Packit |
857059 |
.lid = 0,
|
|
Packit |
857059 |
.qpn = 0,
|
|
Packit |
857059 |
.qkey = 0,
|
|
Packit |
857059 |
.pkey = g_pkey
|
|
Packit |
857059 |
};
|
|
Packit |
857059 |
size_t recv_size = sizeof(*smp);
|
|
Packit |
857059 |
size_t send_size = STL_MIN_SMP_DR_MAD; // no payload.
|
|
Packit |
857059 |
status = omgt_send_recv_mad_no_alloc(portHandle, (uint8_t *)smp, send_size, &addr,
|
|
Packit |
857059 |
(uint8_t *)smp, &recv_size, RESP_WAIT_TIME, MAD_ATTEMPTS-1);
|
|
Packit |
857059 |
if (FSUCCESS != status)
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: MAD failed on hfi:port %s with Status: %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle), iba_fstatus_msg(status));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
STL_BSWAP_SMP_HEADER(smp);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (FSUCCESS == status && smp->common.u.DR.s.Status != MAD_STATUS_SUCCESS) {
|
|
Packit |
857059 |
fprintf(stderr, "MAD returned with Bad Status: %s\n",
|
|
Packit |
857059 |
iba_mad_status_msg2(smp->common.u.DR.s.Status));
|
|
Packit |
857059 |
return FERROR;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
return status;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
FSTATUS get_local_stl_port_info( IN struct omgt_port *portHandle,
|
|
Packit |
857059 |
OUT STL_SMP* smp )
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
FSTATUS status;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (g_verbose) {
|
|
Packit |
857059 |
VRBSE_PRINT("Sending Get(PortInfo) to hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
MemoryClear(smp, sizeof(*smp));
|
|
Packit |
857059 |
|
|
Packit |
857059 |
status = perform_local_stl_sma_query(portHandle,
|
|
Packit |
857059 |
STL_MCLASS_ATTRIB_ID_PORT_INFO, 1<<24, smp);
|
|
Packit |
857059 |
BSWAP_STL_PORT_INFO((STL_PORT_INFO*)stl_get_smp_data(smp));
|
|
Packit |
857059 |
return status;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
FSTATUS get_local_stl_cable_info ( IN struct omgt_port *portHandle,
|
|
Packit |
857059 |
IN unsigned cabaddr,
|
|
Packit |
857059 |
OUT STL_SMP* smp )
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
FSTATUS status;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (g_verbose) {
|
|
Packit |
857059 |
VRBSE_PRINT("Sending Get(CableInfo) to hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
MemoryClear(smp, sizeof(*smp));
|
|
Packit |
857059 |
|
|
Packit |
857059 |
status = perform_local_stl_sma_query(portHandle,
|
|
Packit |
857059 |
STL_MCLASS_ATTRIB_ID_CABLE_INFO,
|
|
Packit |
857059 |
(cabaddr & 0x7ff)<<19 | (STL_CABLE_INFO_MAXLEN)<<13,
|
|
Packit |
857059 |
smp);
|
|
Packit |
857059 |
BSWAP_STL_CABLE_INFO((STL_CABLE_INFO*)stl_get_smp_data(smp));
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return status;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
FSTATUS perform_local_stl_pma_query( IN struct omgt_port *portHandle,
|
|
Packit |
857059 |
IN uint16 attrid,
|
|
Packit |
857059 |
IN uint32 attrmod,
|
|
Packit |
857059 |
OUT STL_PERF_MAD* mad )
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
FSTATUS status;
|
|
Packit |
857059 |
STL_LID dlid;
|
|
Packit |
857059 |
uint8_t port_state;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
mad->common.BaseVersion = STL_BASE_VERSION;
|
|
Packit |
857059 |
mad->common.MgmtClass = MCLASS_PERF;
|
|
Packit |
857059 |
mad->common.ClassVersion = STL_PM_CLASS_VERSION;
|
|
Packit |
857059 |
mad->common.u.NS.Status.AsReg16 = 0;
|
|
Packit |
857059 |
mad->common.mr.AsReg8 = 0;
|
|
Packit |
857059 |
mad->common.mr.s.Method = MMTHD_GET;
|
|
Packit |
857059 |
mad->common.AttributeID = attrid;
|
|
Packit |
857059 |
mad->common.AttributeModifier = attrmod;
|
|
Packit |
857059 |
mad->common.TransactionID = (++g_transactID);
|
|
Packit |
857059 |
// rest of fields should be ignored for a Get, zero'ed above
|
|
Packit |
857059 |
|
|
Packit |
857059 |
(void)omgt_port_get_port_state(portHandle, &port_state);
|
|
Packit |
857059 |
if (port_state != IB_PORT_ACTIVE) {
|
|
Packit |
857059 |
dlid = STL_LID_PERMISSIVE; // special case for local query
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
(void)omgt_port_get_port_lid(portHandle, &dlid);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
BSWAP_MAD_HEADER((MAD*)mad);
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
struct omgt_mad_addr addr = {
|
|
Packit |
857059 |
.lid = dlid,
|
|
Packit |
857059 |
.qpn = 1,
|
|
Packit |
857059 |
.qkey = QP1_WELL_KNOWN_Q_KEY,
|
|
Packit |
857059 |
.pkey = g_pkey,
|
|
Packit |
857059 |
.sl = g_pm_sl,
|
|
Packit |
857059 |
};
|
|
Packit |
857059 |
size_t recv_size = sizeof(*mad);
|
|
Packit |
857059 |
size_t send_size = STL_GS_HDRSIZE + sizeof(STL_PORT_STATUS_REQ);
|
|
Packit |
857059 |
status = omgt_send_recv_mad_no_alloc(portHandle, (uint8_t *)mad, send_size, &addr,
|
|
Packit |
857059 |
(uint8_t *)mad, &recv_size, RESP_WAIT_TIME, MAD_ATTEMPTS-1);
|
|
Packit |
857059 |
if (FSUCCESS != status)
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: MAD failed on hfi:port %s with Status: %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle), iba_fstatus_msg(status));
|
|
Packit |
857059 |
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
BSWAP_MAD_HEADER((MAD*)mad);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (FSUCCESS == status && mad->common.u.NS.Status.AsReg16 != MAD_STATUS_SUCCESS) {
|
|
Packit |
857059 |
fprintf(stderr, "MAD returned with Bad Status: %s\n",
|
|
Packit |
857059 |
iba_mad_status_msg2(mad->common.u.NS.Status.AsReg16));
|
|
Packit |
857059 |
return FERROR;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
return status;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
FSTATUS get_local_stl_port_status( IN struct omgt_port *portHandle,
|
|
Packit |
857059 |
OUT STL_PERF_MAD* mad )
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
FSTATUS status;
|
|
Packit |
857059 |
STL_PORT_STATUS_REQ *pPortCounterReq = (STL_PORT_STATUS_REQ *)&(mad->PerfData);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
MemoryClear(mad, sizeof(*mad));
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (g_verbose) {
|
|
Packit |
857059 |
VRBSE_PRINT("Sending Get(PortStatus) to hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
(void)omgt_port_get_hfi_port_num(portHandle, &pPortCounterReq->PortNumber);
|
|
Packit |
857059 |
//pPortCounterReq->VLSelectMask = 0x8001; // Mask for VL15 & VL0 by default (same as pmaquery).
|
|
Packit |
857059 |
|
|
Packit |
857059 |
BSWAP_STL_PORT_STATUS_REQ(pPortCounterReq);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
status = perform_local_stl_pma_query(portHandle,
|
|
Packit |
857059 |
STL_PM_ATTRIB_ID_PORT_STATUS, 1<<24, mad);
|
|
Packit |
857059 |
BSWAP_STL_PORT_STATUS_RSP((STL_PORT_STATUS_RSP*)&(mad->PerfData));
|
|
Packit |
857059 |
return status;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
void show_info( struct omgt_port *portHandle,
|
|
Packit |
857059 |
IN int outputType,
|
|
Packit |
857059 |
IN STL_PORT_INFO* pPortInfo,
|
|
Packit |
857059 |
IN uint8_t* cableInfo,
|
|
Packit |
857059 |
IN STL_PORT_STATUS_RSP *pPortStatusRsp)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
uint64_t portGUID = 0;
|
|
Packit |
857059 |
(void)omgt_port_get_port_guid(portHandle, &portGUID);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (! outputType) {
|
|
Packit |
857059 |
uint8_t detail = g_detail;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (detail > CABLEINFO_DETAIL_ALL)
|
|
Packit |
857059 |
detail = CABLEINFO_DETAIL_ALL;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
PrintStlPortSummary(&g_dest, 0, get_port_name(portHandle),
|
|
Packit |
857059 |
pPortInfo, portGUID, g_pkey,
|
|
Packit |
857059 |
cableInfo, STL_CIB_STD_HIGH_PAGE_ADDR, STL_CIB_STD_LEN,
|
|
Packit |
857059 |
pPortStatusRsp, detail, g_printLineByLine);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (outputType & (OTYPE_INFO|OTYPE_STATS))
|
|
Packit |
857059 |
PrintFunc(&g_dest, "%s\n", get_port_name(portHandle));
|
|
Packit |
857059 |
if ((outputType & OTYPE_INFO) && pPortInfo)
|
|
Packit |
857059 |
PrintStlPortInfo(&g_dest, 3, pPortInfo, portGUID, g_printLineByLine);
|
|
Packit |
857059 |
if ((outputType & OTYPE_STATS) && pPortStatusRsp)
|
|
Packit |
857059 |
PrintStlPortStatusRsp(&g_dest, 3, pPortStatusRsp);
|
|
Packit |
857059 |
fflush(stdout);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
void Usage(void)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
|
|
Packit |
857059 |
fprintf(stderr, "Usage: opainfo [-h hfi] [-p port] [-o type] [-g] [-d detail] [-s pm_sl] [-v [-v]...]\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h hfi hfi, numbered 1..n, 0=system wide port num\n");
|
|
Packit |
857059 |
fprintf(stderr, " (default is 0)\n");
|
|
Packit |
857059 |
fprintf(stderr, " -p port port, numbered 1..n, 0=1st active\n");
|
|
Packit |
857059 |
fprintf(stderr, " (default is all ports on selected hfi)\n");
|
|
Packit |
857059 |
fprintf(stderr, " -o type output type specified (can appear more than once)\n");
|
|
Packit |
857059 |
fprintf(stderr, " info - output detailed portinfo\n");
|
|
Packit |
857059 |
fprintf(stderr, " stats - output detailed port counters\n");
|
|
Packit |
857059 |
fprintf(stderr, " (behavior without -o gives a brief summary of portinfo,\n");
|
|
Packit |
857059 |
fprintf(stderr, " counters and cableinfo)\n");
|
|
Packit |
857059 |
fprintf(stderr, " -g Display in line-by-line format (default is summary format)\n");
|
|
Packit |
857059 |
fprintf(stderr, " -d detail output detail level 0-2 for CableInfo only (default 0):\n");
|
|
Packit |
857059 |
fprintf(stderr, " (-d option ignored when used with -o type)\n");
|
|
Packit |
857059 |
fprintf(stderr, " 0 - minimal crucial info (e.g. cable length, vendor)\n");
|
|
Packit |
857059 |
fprintf(stderr, " 1 - brief summary\n");
|
|
Packit |
857059 |
fprintf(stderr, " 2 - extended brief summary\n");
|
|
Packit |
857059 |
fprintf(stderr, " -s pm_sl Specify different Service Level for PMA traffic\n");
|
|
Packit |
857059 |
fprintf(stderr, " -v verbose output. Additional invocations will turn on debugging,\n");
|
|
Packit |
857059 |
fprintf(stderr, " openib debugging and libibumad debugging.\n");
|
|
Packit |
857059 |
fprintf(stderr, "\n");
|
|
Packit |
857059 |
fprintf(stderr, "The -h and -p options permit a variety of selections:\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h 0 all ports on all HFIs (this is the default)\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h 0 -p 0 1st active port in system\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h x all ports on HFI x\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h x -p 0 1st active port on HFI x\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h 0 -p y port y within system (irrespective of which ports are active)\n");
|
|
Packit |
857059 |
fprintf(stderr, " -h x -p y HFI x, port y\n");
|
|
Packit |
857059 |
exit(0);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
|
|
Packit |
857059 |
/**
|
|
Packit |
857059 |
* find the output type requested
|
|
Packit |
857059 |
*
|
|
Packit |
857059 |
* @param name
|
|
Packit |
857059 |
*
|
|
Packit |
857059 |
* @return int
|
|
Packit |
857059 |
*/
|
|
Packit |
857059 |
int checkOutputType(const char *name)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
if ( 0 == strcmp(name, "info") )
|
|
Packit |
857059 |
return OTYPE_INFO;
|
|
Packit |
857059 |
else if ( 0 == strcmp(name, "stats") )
|
|
Packit |
857059 |
return OTYPE_STATS;
|
|
Packit |
857059 |
else
|
|
Packit |
857059 |
return -1;
|
|
Packit |
857059 |
} // int checkOutputType(const char *name)
|
|
Packit |
857059 |
|
|
Packit |
857059 |
// command line options
|
|
Packit |
857059 |
struct option options[] = {
|
|
Packit |
857059 |
{ "help", no_argument, NULL, '$' }, // use an invalid option character
|
|
Packit |
857059 |
{ 0 }
|
|
Packit |
857059 |
};
|
|
Packit |
857059 |
|
|
Packit |
857059 |
int main(int argc, char *argv[])
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
uint8 hfi = 0; // all HFIs
|
|
Packit |
857059 |
uint8 port = 0;
|
|
Packit |
857059 |
int allPorts = 1;
|
|
Packit |
857059 |
int outputType = 0;
|
|
Packit |
857059 |
uint8 pm_sl = 0xFF;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
int c;
|
|
Packit |
857059 |
int index;
|
|
Packit |
857059 |
int ret;
|
|
Packit |
857059 |
FSTATUS fstatus;
|
|
Packit |
857059 |
uint32_t portCount;
|
|
Packit |
857059 |
STL_SMP smpPortInfo;
|
|
Packit |
857059 |
STL_SMP smpCableInfo;
|
|
Packit |
857059 |
STL_PERF_MAD madPortStatusRsp;
|
|
Packit |
857059 |
STL_PORT_INFO* pPortInfo;
|
|
Packit |
857059 |
int have_cableinfo;
|
|
Packit |
857059 |
STL_PORT_STATUS_RSP *pPortStatusRsp = 0;
|
|
Packit |
857059 |
struct omgt_port *portHandle = NULL;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
while (-1 != (c = getopt_long(argc,argv, "h:p:o:d:gvs:", options, &index)))
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
switch (c) {
|
|
Packit |
857059 |
case '$':
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 'h':
|
|
Packit |
857059 |
if (FSUCCESS != StringToUint8(&hfi, optarg, NULL, 0, TRUE)) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Invalid HFI Number: %s\n", optarg);
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 'p':
|
|
Packit |
857059 |
if (FSUCCESS != StringToUint8(&port, optarg, NULL, 0, TRUE)) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Invalid Port Number: %s\n", optarg);
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
allPorts = 0;
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 'o':
|
|
Packit |
857059 |
outputType |= checkOutputType(optarg);
|
|
Packit |
857059 |
if (outputType < 0)
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 'g':
|
|
Packit |
857059 |
g_printLineByLine = 1;
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 'd':
|
|
Packit |
857059 |
if (FSUCCESS != StringToUint8(&g_detail, optarg, NULL, 0, TRUE)) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Invalid Detail: %s\n", optarg);
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 'v':
|
|
Packit |
857059 |
g_verbose++;
|
|
Packit |
857059 |
if (g_verbose > 3) umad_debug(g_verbose - 3);
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
case 's':
|
|
Packit |
857059 |
if (FSUCCESS != StringToUint8(&pm_sl, optarg, NULL, 0, TRUE)) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Invalid PM SL: %s\n", optarg);
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
default:
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Invalid option -%c\n", c);
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
break;
|
|
Packit |
857059 |
} // switch
|
|
Packit |
857059 |
} // while
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (optind < argc)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
Usage();
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
PrintDestInitFile(&g_dest, stdout);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (allPorts) {
|
|
Packit |
857059 |
// determine port count for selected hfi
|
|
Packit |
857059 |
// if hfi==0, its system wide port count
|
|
Packit |
857059 |
// if port!=0, we get a specific port (fstatus parsing easier below)
|
|
Packit |
857059 |
fstatus = omgt_get_portguid( hfi, 1, NULL, NULL, NULL, NULL,
|
|
Packit |
857059 |
NULL, NULL, NULL, &portCount,
|
|
Packit |
857059 |
NULL, NULL, NULL );
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (hfi && FSUCCESS != fstatus) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Failed to find hfi %d\n", hfi);
|
|
Packit |
857059 |
exit(1);
|
|
Packit |
857059 |
} else if (FSUCCESS != fstatus && FNOT_FOUND != fstatus) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Failed to determine number of HFIs\n");
|
|
Packit |
857059 |
exit(1);
|
|
Packit |
857059 |
} else if (portCount == 0) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: No HFIs found\n");
|
|
Packit |
857059 |
exit(1);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
port = 1; // start at 1st port
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
portCount = 1;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
for (; portCount > 0; port++, portCount--)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
have_cableinfo = FALSE;
|
|
Packit |
857059 |
struct omgt_params params = {.debug_file = g_verbose > 2 ? stderr : NULL};
|
|
Packit |
857059 |
ret = omgt_open_port_by_num(&portHandle, hfi, port, ¶ms);
|
|
Packit |
857059 |
if (port == 0 && ret == OMGT_STATUS_NOT_DONE) {
|
|
Packit |
857059 |
// asked for 1st active, but none active, use 1st port
|
|
Packit |
857059 |
port = 1;
|
|
Packit |
857059 |
ret = omgt_open_port_by_num(&portHandle, hfi, port, ¶ms);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
if (ret != 0) {
|
|
Packit |
857059 |
printf("opainfo: Unable to open hfi:port %u:%u\n", hfi, port);
|
|
Packit |
857059 |
continue;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
// Determine which pkey to use (full or limited)
|
|
Packit |
857059 |
// Attempt to use full at all times, otherwise, can
|
|
Packit |
857059 |
// use the limited for queries of the local port.
|
|
Packit |
857059 |
g_pkey = omgt_get_mgmt_pkey(portHandle, 0, 0);
|
|
Packit |
857059 |
if (g_pkey==0) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Unable to find mgmt pkey on hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
goto next;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
fstatus = get_local_stl_port_info( portHandle, &smpPortInfo);
|
|
Packit |
857059 |
if (FSUCCESS != fstatus)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Failed to get Portinfo for hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
goto next; // skip to next port, if any
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
pPortInfo = (STL_PORT_INFO *)stl_get_smp_data(&smpPortInfo);
|
|
Packit |
857059 |
|
|
Packit |
857059 |
if (IsCableInfoAvailable(pPortInfo)) {
|
|
Packit |
857059 |
uint16_t addr;
|
|
Packit |
857059 |
uint8_t *data;
|
|
Packit |
857059 |
have_cableinfo = TRUE; // assume success
|
|
Packit |
857059 |
for (addr = STL_CIB_STD_HIGH_PAGE_ADDR, data=g_cableInfo;
|
|
Packit |
857059 |
addr + STL_CABLE_INFO_MAXLEN <= STL_CIB_STD_END_ADDR; addr += STL_CABLE_INFO_DATA_SIZE, data += STL_CABLE_INFO_DATA_SIZE)
|
|
Packit |
857059 |
{
|
|
Packit |
857059 |
fstatus = get_local_stl_cable_info(portHandle, addr, &smpCableInfo);
|
|
Packit |
857059 |
if (FSUCCESS != fstatus) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Failed to get Cableinfo for hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
have_cableinfo = FALSE;
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
memcpy(data, ((STL_CABLE_INFO *)stl_get_smp_data(&smpCableInfo))->Data, STL_CABLE_INFO_DATA_SIZE);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
have_cableinfo = FALSE;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
// If PM SL not set, use SM's SL
|
|
Packit |
857059 |
if (pm_sl == 0xFF) {
|
|
Packit |
857059 |
(void)omgt_port_get_port_sm_sl(portHandle, &pm_sl);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
g_pm_sl = pm_sl;
|
|
Packit |
857059 |
fstatus = get_local_stl_port_status(portHandle, &madPortStatusRsp);
|
|
Packit |
857059 |
if (FSUCCESS != fstatus) {
|
|
Packit |
857059 |
fprintf(stderr, "opainfo: Failed to get PMA Port Status for hfi:port %s\n",
|
|
Packit |
857059 |
get_port_name(portHandle));
|
|
Packit |
857059 |
pPortStatusRsp = NULL;
|
|
Packit |
857059 |
} else {
|
|
Packit |
857059 |
pPortStatusRsp = (STL_PORT_STATUS_RSP *)&(madPortStatusRsp.PerfData);
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
show_info(portHandle, outputType, pPortInfo, have_cableinfo?g_cableInfo:NULL, pPortStatusRsp);
|
|
Packit |
857059 |
next:
|
|
Packit |
857059 |
omgt_close_port(portHandle);
|
|
Packit |
857059 |
portHandle = NULL;
|
|
Packit |
857059 |
}
|
|
Packit |
857059 |
|
|
Packit |
857059 |
return 0 ;
|
|
Packit |
857059 |
|
|
Packit |
857059 |
} // main
|