d13def78cc
read_ibdiag_config NULL deref read_ibdiag_config mem leak ib_mad_inv_field_str Missing comma in a string array initialization print_node_header NULL deref diff_node_ports copy-paste error ibportstate.c main() missing break in switch set_thresholds NULL ptr deref dump_unicast_tables leaks mapnd umad_cm_attr_str dead code __ibv_close_device close(-1) check return value of listen() mlx5 bitmap.h - bad bit shift - UB get_dst_addr check return value of inet_pton osm_perfmgr_init check return value of cl_spinlock_init osm_port_new memory leak on error path sa_mad_ctrl_rcv_callback missing break in switch case I did not include CID numbers because these were found by an internal run at Isilon. Reviewed by: cem kib MFC after: 2 weeks Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D25676
353 lines
9.9 KiB
C
353 lines
9.9 KiB
C
/*
|
|
* Copyright (c) 2004, 2005, 2010 Intel Corporation. All rights reserved.
|
|
* Copyright (c) 2013 Lawrence Livermore National Security. All rights reserved.
|
|
* Copyright (c) 2014 Mellanox Technologies LTD. All rights reserved.
|
|
*
|
|
* This software is available to you under a choice of one of two
|
|
* licenses. You may choose to be licensed under the terms of the GNU
|
|
* General Public License (GPL) Version 2, available from the file
|
|
* COPYING in the main directory of this source tree, or the
|
|
* OpenIB.org BSD license below:
|
|
*
|
|
* Redistribution and use in source and binary forms, with or
|
|
* without modification, are permitted provided that the following
|
|
* conditions are met:
|
|
*
|
|
* - Redistributions of source code must retain the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above
|
|
* copyright notice, this list of conditions and the following
|
|
* disclaimer in the documentation and/or other materials
|
|
* provided with the distribution.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <infiniband/endian.h>
|
|
#include <infiniband/umad.h>
|
|
#include <infiniband/umad_types.h>
|
|
#include <infiniband/umad_sm.h>
|
|
#include <infiniband/umad_sa.h>
|
|
#include <infiniband/umad_cm.h>
|
|
#include "umad_str.h"
|
|
|
|
const char * umad_class_str(uint8_t mgmt_class)
|
|
{
|
|
switch (mgmt_class) {
|
|
case UMAD_CLASS_SUBN_LID_ROUTED:
|
|
case UMAD_CLASS_SUBN_DIRECTED_ROUTE:
|
|
return("Subn");
|
|
case UMAD_CLASS_SUBN_ADM:
|
|
return("SubnAdm");
|
|
case UMAD_CLASS_PERF_MGMT:
|
|
return("Perf");
|
|
case UMAD_CLASS_BM:
|
|
return("BM");
|
|
case UMAD_CLASS_DEVICE_MGMT:
|
|
return("DevMgt");
|
|
case UMAD_CLASS_CM:
|
|
return("ComMgt");
|
|
case UMAD_CLASS_SNMP:
|
|
return("SNMP");
|
|
case UMAD_CLASS_DEVICE_ADM:
|
|
return("DevAdm");
|
|
case UMAD_CLASS_BOOT_MGMT:
|
|
return("BootMgt");
|
|
case UMAD_CLASS_BIS:
|
|
return("BIS");
|
|
case UMAD_CLASS_CONG_MGMT:
|
|
return("CongestionManagment");
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if ((UMAD_CLASS_VENDOR_RANGE1_START <= mgmt_class
|
|
&& mgmt_class <= UMAD_CLASS_VENDOR_RANGE1_END)
|
|
|| (UMAD_CLASS_VENDOR_RANGE2_START <= mgmt_class
|
|
&& mgmt_class <= UMAD_CLASS_VENDOR_RANGE2_END))
|
|
return("Vendor");
|
|
|
|
if (UMAD_CLASS_APPLICATION_START <= mgmt_class
|
|
&& mgmt_class <= UMAD_CLASS_APPLICATION_END) {
|
|
return("Application");
|
|
}
|
|
return ("<unknown>");
|
|
}
|
|
|
|
static const char * umad_common_method_str(uint8_t method)
|
|
{
|
|
switch(method) {
|
|
case UMAD_METHOD_GET:
|
|
return ("Get");
|
|
case UMAD_METHOD_SET:
|
|
return ("Set");
|
|
case UMAD_METHOD_GET_RESP:
|
|
return ("GetResp");
|
|
case UMAD_METHOD_SEND:
|
|
return ("Send");
|
|
case UMAD_METHOD_TRAP:
|
|
return ("Trap");
|
|
case UMAD_METHOD_REPORT:
|
|
return ("Report");
|
|
case UMAD_METHOD_REPORT_RESP:
|
|
return ("ReportResp");
|
|
case UMAD_METHOD_TRAP_REPRESS:
|
|
return ("TrapRepress");
|
|
default:
|
|
return ("<unknown");
|
|
}
|
|
}
|
|
|
|
static const char * umad_sa_method_str(uint8_t method)
|
|
{
|
|
switch(method) {
|
|
case UMAD_SA_METHOD_GET_TABLE:
|
|
return ("GetTable");
|
|
case UMAD_SA_METHOD_GET_TABLE_RESP:
|
|
return ("GetTableResp");
|
|
case UMAD_SA_METHOD_DELETE:
|
|
return ("Delete");
|
|
case UMAD_SA_METHOD_DELETE_RESP:
|
|
return ("DeleteResp");
|
|
case UMAD_SA_METHOD_GET_MULTI:
|
|
return ("GetMulti");
|
|
case UMAD_SA_METHOD_GET_MULTI_RESP:
|
|
return ("GetMultiResp");
|
|
case UMAD_SA_METHOD_GET_TRACE_TABLE:
|
|
return ("GetTraceTable");
|
|
default:
|
|
return (umad_common_method_str(method));
|
|
}
|
|
}
|
|
|
|
const char * umad_method_str(uint8_t mgmt_class, uint8_t method)
|
|
{
|
|
if (mgmt_class == UMAD_CLASS_SUBN_ADM)
|
|
return(umad_sa_method_str(method));
|
|
|
|
return (umad_common_method_str(method));
|
|
}
|
|
|
|
const char * umad_common_mad_status_str(__be16 _status)
|
|
{
|
|
uint16_t status = be16toh(_status);
|
|
|
|
if (status & UMAD_STATUS_BUSY)
|
|
return ("Busy");
|
|
|
|
if (status & UMAD_STATUS_REDIRECT)
|
|
return ("Redirection required");
|
|
|
|
switch(status & UMAD_STATUS_INVALID_FIELD_MASK) {
|
|
case UMAD_STATUS_BAD_VERSION:
|
|
return ("Bad Version");
|
|
case UMAD_STATUS_METHOD_NOT_SUPPORTED:
|
|
return ("Method not supported");
|
|
case UMAD_STATUS_ATTR_NOT_SUPPORTED:
|
|
return ("Method/Attribute combo not supported");
|
|
case UMAD_STATUS_INVALID_ATTR_VALUE:
|
|
return ("Invalid attribute/modifier field");
|
|
}
|
|
return ("Success");
|
|
}
|
|
|
|
const char * umad_sa_mad_status_str(__be16 _status)
|
|
{
|
|
uint16_t status = be16toh(_status);
|
|
switch((status & UMAD_STATUS_CLASS_MASK) >> 8) {
|
|
case UMAD_SA_STATUS_SUCCESS:
|
|
return ("Success");
|
|
case UMAD_SA_STATUS_NO_RESOURCES:
|
|
return ("No Resources");
|
|
case UMAD_SA_STATUS_REQ_INVALID:
|
|
return ("Request Invalid");
|
|
case UMAD_SA_STATUS_NO_RECORDS:
|
|
return ("No Records");
|
|
case UMAD_SA_STATUS_TOO_MANY_RECORDS:
|
|
return ("Too Many Records");
|
|
case UMAD_SA_STATUS_INVALID_GID:
|
|
return ("Invalid GID");
|
|
case UMAD_SA_STATUS_INSUF_COMPS:
|
|
return ("Insufficient Components");
|
|
case UMAD_SA_STATUS_REQ_DENIED:
|
|
return ("Request Denied");
|
|
case UMAD_SA_STATUS_PRI_SUGGESTED:
|
|
return ("Priority Suggested");
|
|
}
|
|
return ("Undefined Error");
|
|
}
|
|
|
|
static const char *umad_common_attr_str(__be16 attr_id)
|
|
{
|
|
switch(be16toh(attr_id)) {
|
|
case UMAD_ATTR_CLASS_PORT_INFO:
|
|
return "Class Port Info";
|
|
case UMAD_ATTR_NOTICE:
|
|
return "Notice";
|
|
case UMAD_ATTR_INFORM_INFO:
|
|
return "Inform Info";
|
|
default:
|
|
return "<unknown>";
|
|
}
|
|
}
|
|
|
|
static const char * umad_sm_attr_str(__be16 attr_id)
|
|
{
|
|
switch(be16toh(attr_id)) {
|
|
case UMAD_SM_ATTR_NODE_DESC:
|
|
return ("NodeDescription");
|
|
case UMAD_SM_ATTR_NODE_INFO:
|
|
return ("NodeInfo");
|
|
case UMAD_SM_ATTR_SWITCH_INFO:
|
|
return ("SwitchInfo");
|
|
case UMAD_SM_ATTR_GUID_INFO:
|
|
return ("GUIDInfo");
|
|
case UMAD_SM_ATTR_PORT_INFO:
|
|
return ("PortInfo");
|
|
case UMAD_SM_ATTR_PKEY_TABLE:
|
|
return ("P_KeyTable");
|
|
case UMAD_SM_ATTR_SLVL_TABLE:
|
|
return ("SLtoVLMappingTable");
|
|
case UMAD_SM_ATTR_VL_ARB_TABLE:
|
|
return ("VLArbitrationTable");
|
|
case UMAD_SM_ATTR_LINEAR_FT:
|
|
return ("LinearForwardingTable");
|
|
case UMAD_SM_ATTR_RANDOM_FT:
|
|
return ("RandomForwardingTable");
|
|
case UMAD_SM_ATTR_MCAST_FT:
|
|
return ("MulticastForwardingTable");
|
|
case UMAD_SM_ATTR_SM_INFO:
|
|
return ("SMInfo");
|
|
case UMAD_SM_ATTR_VENDOR_DIAG:
|
|
return ("VendorDiag");
|
|
case UMAD_SM_ATTR_LED_INFO:
|
|
return ("LedInfo");
|
|
case UMAD_SM_ATTR_LINK_SPD_WIDTH_TABLE:
|
|
return ("LinkSpeedWidthPairsTable");
|
|
case UMAD_SM_ATTR_VENDOR_MADS_TABLE:
|
|
return ("VendorSpecificMadsTable");
|
|
case UMAD_SM_ATTR_HIERARCHY_INFO:
|
|
return ("HierarchyInfo");
|
|
case UMAD_SM_ATTR_CABLE_INFO:
|
|
return ("CableInfo");
|
|
case UMAD_SM_ATTR_PORT_INFO_EXT:
|
|
return ("PortInfoExtended");
|
|
default:
|
|
return (umad_common_attr_str(attr_id));
|
|
}
|
|
}
|
|
|
|
static const char * umad_sa_attr_str(__be16 attr_id)
|
|
{
|
|
switch(be16toh(attr_id)) {
|
|
case UMAD_SA_ATTR_NODE_REC:
|
|
return ("NodeRecord");
|
|
case UMAD_SA_ATTR_PORT_INFO_REC:
|
|
return ("PortInfoRecord");
|
|
case UMAD_SA_ATTR_SLVL_REC:
|
|
return ("SLtoVLMappingTableRecord");
|
|
case UMAD_SA_ATTR_SWITCH_INFO_REC:
|
|
return ("SwitchInfoRecord");
|
|
case UMAD_SA_ATTR_LINEAR_FT_REC:
|
|
return ("LinearForwardingTableRecord");
|
|
case UMAD_SA_ATTR_RANDOM_FT_REC:
|
|
return ("RandomForwardingTableRecord");
|
|
case UMAD_SA_ATTR_MCAST_FT_REC:
|
|
return ("MulticastForwardingTableRecord");
|
|
case UMAD_SA_ATTR_SM_INFO_REC:
|
|
return ("SMInfoRecord");
|
|
case UMAD_SA_ATTR_INFORM_INFO_REC:
|
|
return ("InformInfoRecord");
|
|
case UMAD_SA_ATTR_LINK_REC:
|
|
return ("LinkRecord");
|
|
case UMAD_SA_ATTR_GUID_INFO_REC:
|
|
return ("GuidInfoRecord");
|
|
case UMAD_SA_ATTR_SERVICE_REC:
|
|
return ("ServiceRecord");
|
|
case UMAD_SA_ATTR_PKEY_TABLE_REC:
|
|
return ("P_KeyTableRecord");
|
|
case UMAD_SA_ATTR_PATH_REC:
|
|
return ("PathRecord");
|
|
case UMAD_SA_ATTR_VL_ARB_REC:
|
|
return ("VLArbitrationTableRecord");
|
|
case UMAD_SA_ATTR_MCMEMBER_REC:
|
|
return ("MCMemberRecord");
|
|
case UMAD_SA_ATTR_TRACE_REC:
|
|
return ("TraceRecord");
|
|
case UMAD_SA_ATTR_MULTI_PATH_REC:
|
|
return ("MultiPathRecord");
|
|
case UMAD_SA_ATTR_SERVICE_ASSOC_REC:
|
|
return ("ServiceAssociationRecord");
|
|
case UMAD_SA_ATTR_LINK_SPD_WIDTH_TABLE_REC:
|
|
return ("LinkSpeedWidthPairsTableRecord");
|
|
case UMAD_SA_ATTR_HIERARCHY_INFO_REC:
|
|
return ("HierarchyInfoRecord");
|
|
case UMAD_SA_ATTR_CABLE_INFO_REC:
|
|
return ("CableInfoRecord");
|
|
case UMAD_SA_ATTR_PORT_INFO_EXT_REC:
|
|
return ("PortInfoExtendedRecord");
|
|
default:
|
|
return (umad_common_attr_str(attr_id));
|
|
}
|
|
}
|
|
|
|
static const char * umad_cm_attr_str(__be16 attr_id)
|
|
{
|
|
switch(be16toh(attr_id)) {
|
|
case UMAD_CM_ATTR_REQ:
|
|
return "ConnectRequest";
|
|
case UMAD_CM_ATTR_MRA:
|
|
return "MsgRcptAck";
|
|
case UMAD_CM_ATTR_REJ:
|
|
return "ConnectReject";
|
|
case UMAD_CM_ATTR_REP:
|
|
return "ConnectReply";
|
|
case UMAD_CM_ATTR_RTU:
|
|
return "ReadyToUse";
|
|
case UMAD_CM_ATTR_DREQ:
|
|
return "DisconnectRequest";
|
|
case UMAD_CM_ATTR_DREP:
|
|
return "DisconnectReply";
|
|
case UMAD_CM_ATTR_SIDR_REQ:
|
|
return "ServiceIDResReq";
|
|
case UMAD_CM_ATTR_SIDR_REP:
|
|
return "ServiceIDResReqResp";
|
|
case UMAD_CM_ATTR_LAP:
|
|
return "LoadAlternatePath";
|
|
case UMAD_CM_ATTR_APR:
|
|
return "AlternatePathResponse";
|
|
case UMAD_CM_ATTR_SAP:
|
|
return "SuggestAlternatePath";
|
|
case UMAD_CM_ATTR_SPR:
|
|
return "SuggestPathResponse";
|
|
default:
|
|
return (umad_common_attr_str(attr_id));
|
|
}
|
|
}
|
|
|
|
const char * umad_attribute_str(uint8_t mgmt_class, __be16 attr_id)
|
|
{
|
|
switch (mgmt_class) {
|
|
case UMAD_CLASS_SUBN_LID_ROUTED:
|
|
case UMAD_CLASS_SUBN_DIRECTED_ROUTE:
|
|
return(umad_sm_attr_str(attr_id));
|
|
case UMAD_CLASS_SUBN_ADM:
|
|
return(umad_sa_attr_str(attr_id));
|
|
case UMAD_CLASS_CM:
|
|
return(umad_cm_attr_str(attr_id));
|
|
}
|
|
|
|
return (umad_common_attr_str(attr_id));
|
|
}
|