Blame Esm/ib/src/cs/cs_utility.c

Packit 857059
/* BEGIN_ICS_COPYRIGHT5 ****************************************
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_COPYRIGHT5   ****************************************/
Packit 857059
Packit 857059
//==============================================================================//
Packit 857059
//										//
Packit 857059
// FILE NAME									//
Packit 857059
//    cs_utility.c								//
Packit 857059
//										//
Packit 857059
// DESCRIPTION									//
Packit 857059
//    This file contains miscellaneous utility routiness.			//
Packit 857059
//										//
Packit 857059
// DATA STRUCTURES								//
Packit 857059
//    None									//
Packit 857059
//										//
Packit 857059
// FUNCTIONS									//
Packit 857059
//    bm_log			write out logging information			//
Packit 857059
//										//
Packit 857059
// DEPENDENCIES									//
Packit 857059
//										//
Packit 857059
// HISTORY									//
Packit 857059
//										//
Packit 857059
//    NAME	DATE  REMARKS							//
Packit 857059
//     sjb  04/09/04  Initial creation of file.					//
Packit 857059
//										//
Packit 857059
//==============================================================================//
Packit 857059
Packit 857059
Packit 857059
#include <stdarg.h>
Packit 857059
#include <stdio.h>
Packit 857059
#include <string.h>
Packit 857059
#include "cs_log.h"
Packit 857059
#include "cs_queue.h"
Packit 857059
#include "stl_mad_priv.h"
Packit 857059
#include "ib_mad.h"
Packit 857059
#include "ib_sa.h"
Packit 857059
#include "stl_pa_priv.h"
Packit 857059
#include "sm_l.h"
Packit 857059
#include "stl_sa_priv.h"
Packit 857059
Packit 857059
Packit 857059
#include "mai_g.h"
Packit 857059
#include "sm_dbsync.h"
Packit 857059
#include "if3.h"
Packit 857059
Packit 857059
Packit 857059
uint32_t cs_log_masks[VIEO_LAST_MOD_ID+1] = {
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_NONE_MOD_ID for vs_syslog_output_message
Packit 857059
		0,					// VIEO_CS_MOD_ID   /* Library Modules */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_MAI_MOD_ID  
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_CAL_MOD_ID 
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_DRIVER_MOD_ID
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_IF3_MOD_ID  
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_SM_MOD_ID  /* Subnet Mgr */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_SA_MOD_ID  /* Subnet Administrator */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_PM_MOD_ID  /* Performance Mgr */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_PA_MOD_ID  /* Performance Administrator */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_BM_MOD_ID  /* Baseboard Mgr */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_FE_MOD_ID  /* Fabric Executive */
Packit 857059
		DEFAULT_LOG_MASK,	// VIEO_APP_MOD_ID /* Generic VIEO mod id */
Packit 857059
};
Packit 857059
Packit 857059
// module name in form of "name: ", useful for messages where name is optional
Packit 857059
// for VIEO_NONE_MOD_ID, returns ""
Packit 857059
const char *
Packit 857059
cs_log_get_module_prefix(uint32_t modid)
Packit 857059
{
Packit 857059
	switch (modid) {
Packit 857059
	case VIEO_NONE_MOD_ID:	return "";
Packit 857059
	case VIEO_CS_MOD_ID:	return "CS: ";
Packit 857059
	case VIEO_MAI_MOD_ID:	return "MAI: ";
Packit 857059
	case VIEO_CAL_MOD_ID:	return "CAL: ";
Packit 857059
	case VIEO_DRIVER_MOD_ID:return "DVR: ";
Packit 857059
	case VIEO_IF3_MOD_ID:	return "IF3: ";
Packit 857059
	case VIEO_SM_MOD_ID:	return "SM: ";
Packit 857059
	case VIEO_SA_MOD_ID:	return "SA: ";
Packit 857059
	case VIEO_PM_MOD_ID:	return "PM: ";
Packit 857059
	case VIEO_PA_MOD_ID:	return "PA: ";
Packit 857059
	case VIEO_BM_MOD_ID:	return "BM: ";
Packit 857059
	case VIEO_FE_MOD_ID:	return "FE: ";
Packit 857059
	case VIEO_APP_MOD_ID:	return "APP: ";
Packit 857059
	default:				return "Unkwn: ";
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
// module name in simple form, useful to put in middle of other messages
Packit 857059
// names provided also match prefixes used in LogMask config file names
Packit 857059
// for VIEO_NONE_MOD_ID, returns "NONE"
Packit 857059
const char *
Packit 857059
cs_log_get_module_name(uint32_t modid)
Packit 857059
{
Packit 857059
	switch (modid) {
Packit 857059
	case VIEO_NONE_MOD_ID:	return "NONE";
Packit 857059
	case VIEO_CS_MOD_ID:	return "CS";
Packit 857059
	case VIEO_MAI_MOD_ID:	return "MAI";
Packit 857059
	case VIEO_CAL_MOD_ID:	return "CAL";
Packit 857059
	case VIEO_DRIVER_MOD_ID:return "DVR";
Packit 857059
	case VIEO_IF3_MOD_ID:	return "IF3";
Packit 857059
	case VIEO_SM_MOD_ID:	return "SM";
Packit 857059
	case VIEO_SA_MOD_ID:	return "SA";
Packit 857059
	case VIEO_PM_MOD_ID:	return "PM";
Packit 857059
	case VIEO_PA_MOD_ID:	return "PA";
Packit 857059
	case VIEO_BM_MOD_ID:	return "BM";
Packit 857059
	case VIEO_FE_MOD_ID:	return "FE";
Packit 857059
	case VIEO_APP_MOD_ID:	return "APP";
Packit 857059
	default:				return "Unkwn";
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
// convert module name to modid
Packit 857059
// names provided also match prefixes used in LogMask config file names
Packit 857059
uint32_t
Packit 857059
cs_log_get_module_id(const char * mod)
Packit 857059
{
Packit 857059
	uint32_t modid;
Packit 857059
Packit 857059
	for (modid = 0 ; modid <= VIEO_LAST_MOD_ID; modid++) {
Packit 857059
		if (modid == VIEO_NONE_MOD_ID)
Packit 857059
			continue;
Packit 857059
		if (0 == strcmp(cs_log_get_module_name(modid), mod))
Packit 857059
			return modid;
Packit 857059
	}
Packit 857059
	return 0;	// VIEO_NONE_MOD_ID
Packit 857059
}
Packit 857059
Packit 857059
const char* 
Packit 857059
cs_log_get_sev_name(uint32_t sev)
Packit 857059
{
Packit 857059
    switch (sev) {
Packit 857059
	case VS_LOG_NONE:		return "";
Packit 857059
	case VS_LOG_FATAL:		return "FATAL";
Packit 857059
	case VS_LOG_CSM_ERROR:	return "ERROR";
Packit 857059
	case VS_LOG_CSM_WARN:	return "WARN ";
Packit 857059
	case VS_LOG_CSM_NOTICE:	return "NOTIC";
Packit 857059
	case VS_LOG_CSM_INFO:	return "INFO ";
Packit 857059
	case VS_LOG_ERROR:		return "ERROR";
Packit 857059
	case VS_LOG_WARN:		return "WARN ";
Packit 857059
	case VS_LOG_NOTICE:		return "NOTIC";
Packit 857059
	case VS_LOG_INFINI_INFO:return "PROGR";
Packit 857059
	case VS_LOG_INFO:		return "INFO ";
Packit 857059
	case VS_LOG_VERBOSE:	return "VBOSE";
Packit 857059
	case VS_LOG_DATA:		return "DATA ";
Packit 857059
	case VS_LOG_DEBUG1:		return "DBG1 ";
Packit 857059
	case VS_LOG_DEBUG2:		return "DBG2 ";
Packit 857059
	case VS_LOG_DEBUG3:		return "DBG3 ";
Packit 857059
	case VS_LOG_DEBUG4:		return "DBG4 ";
Packit 857059
	case VS_LOG_ENTER:		return "ENTER";
Packit 857059
	case VS_LOG_ARGS:		return "ARGS ";
Packit 857059
	case VS_LOG_EXIT:		return "EXIT ";
Packit 857059
	default:				return "UNKWN";
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
// translate level and mode to a sev_mask and a mod_mask of modules
Packit 857059
// which sev_mask should be set for.  modules not in mod_mask
Packit 857059
// should get a sev_mask of 0
Packit 857059
static void
Packit 857059
cs_log_translate_level(uint32_t level, int mode,
Packit 857059
			   	uint32_t *mod_mask, uint32_t *sev_mask)
Packit 857059
{
Packit 857059
	switch(level)
Packit 857059
	{
Packit 857059
	case 5:	
Packit 857059
		/* All of the modules on. */
Packit 857059
		*mod_mask = VS_MOD_ALL;
Packit 857059
		break;
Packit 857059
	default:
Packit 857059
		*mod_mask = (VS_MOD_ALL & ~(1<
Packit 857059
		break;
Packit 857059
	}
Packit 857059
Packit 857059
	*sev_mask = 0;
Packit 857059
	if (mode & 1) {
Packit 857059
		switch(level)
Packit 857059
		{
Packit 857059
		case 7:
Packit 857059
			*sev_mask |= (VS_LOG_ARGS | VS_LOG_ENTER | VS_LOG_EXIT);
Packit 857059
		case 6:
Packit 857059
			*sev_mask |= (VS_LOG_DEBUG3 | VS_LOG_DEBUG4);
Packit 857059
		case 5:
Packit 857059
			*sev_mask |= (VS_LOG_DEBUG1 | VS_LOG_DEBUG2);
Packit 857059
    	case 4:
Packit 857059
			*sev_mask |= (VS_LOG_DATA | VS_LOG_VERBOSE );
Packit 857059
		case 3:
Packit 857059
			*sev_mask |= (VS_LOG_INFO | VS_LOG_ERROR | VS_LOG_WARN
Packit 857059
					| VS_LOG_INFINI_INFO | VS_LOG_NOTICE);
Packit 857059
    	case 2:
Packit 857059
		case 1:
Packit 857059
			*sev_mask |= (VS_LOG_CSM_ERROR | VS_LOG_CSM_WARN
Packit 857059
				   	| VS_LOG_CSM_NOTICE | VS_LOG_CSM_INFO);
Packit 857059
		default:
Packit 857059
			*sev_mask |= VS_LOG_FATAL;
Packit 857059
		}	
Packit 857059
	} else {
Packit 857059
		switch(level)
Packit 857059
		{
Packit 857059
		case 7:
Packit 857059
			*sev_mask |= (VS_LOG_ARGS | VS_LOG_ENTER | VS_LOG_EXIT);
Packit 857059
		case 6:
Packit 857059
			*sev_mask |= (VS_LOG_DEBUG3 | VS_LOG_DEBUG4);
Packit 857059
		case 5:
Packit 857059
			*sev_mask |= (VS_LOG_DEBUG1 | VS_LOG_DEBUG2);
Packit 857059
    	case 4:
Packit 857059
			*sev_mask |= (VS_LOG_DATA | VS_LOG_VERBOSE );
Packit 857059
		case 3:
Packit 857059
			*sev_mask |= (VS_LOG_INFO );
Packit 857059
    	case 2:
Packit 857059
			*sev_mask |= (VS_LOG_INFINI_INFO | VS_LOG_NOTICE);
Packit 857059
		case 1:
Packit 857059
			*sev_mask |= (VS_LOG_CSM_ERROR | VS_LOG_CSM_WARN
Packit 857059
				   	| VS_LOG_CSM_NOTICE | VS_LOG_CSM_INFO
Packit 857059
				   	| VS_LOG_ERROR | VS_LOG_WARN );
Packit 857059
		default:
Packit 857059
			*sev_mask |= VS_LOG_FATAL;
Packit 857059
		}	
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
// fill in log_masks based on mod_mask and sev_mask, presently only used
Packit 857059
// internally.  Use of this implies a limit of
Packit 857059
// 32 module ids.  Probably enough for now
Packit 857059
void
Packit 857059
cs_log_set_mods_mask(uint32_t mod_mask, uint32_t sev_mask, uint32_t log_masks[VIEO_LAST_MOD_ID+1])
Packit 857059
{
Packit 857059
	uint32_t modid;
Packit 857059
Packit 857059
	for (modid = 0; modid<= VIEO_LAST_MOD_ID; modid++) {
Packit 857059
		if (mod_mask & (1 << modid))
Packit 857059
			log_masks[modid] = sev_mask;
Packit 857059
		else
Packit 857059
			log_masks[modid] = 0;
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
// build log_masks based on level and mode
Packit 857059
void
Packit 857059
cs_log_set_log_masks(uint32_t level, int mode, uint32_t log_masks[VIEO_LAST_MOD_ID+1])
Packit 857059
{
Packit 857059
	uint32_t mod_mask;
Packit 857059
	uint32_t sev_mask;
Packit 857059
Packit 857059
	cs_log_translate_level(level, mode, &mod_mask, &sev_mask);
Packit 857059
	cs_log_set_mods_mask(mod_mask, sev_mask, log_masks);
Packit 857059
}
Packit 857059
Packit 857059
// set a single mask based on module name
Packit 857059
void
Packit 857059
cs_log_set_log_mask(const char* mod, uint32_t mask, uint32_t log_masks[VIEO_LAST_MOD_ID+1])
Packit 857059
{
Packit 857059
	uint32_t modid = cs_log_get_module_id(mod);
Packit 857059
	if (modid)
Packit 857059
		log_masks[modid] = mask | VS_LOG_FATAL;
Packit 857059
}
Packit 857059
Packit 857059
// get a single mask based on module name
Packit 857059
uint32_t
Packit 857059
cs_log_get_log_mask(const char* mod, uint32_t log_masks[VIEO_LAST_MOD_ID+1])
Packit 857059
{
Packit 857059
	uint32_t modid = cs_log_get_module_id(mod);
Packit 857059
	if (modid)
Packit 857059
		return log_masks[modid];
Packit 857059
	else
Packit 857059
		return 0;
Packit 857059
}
Packit 857059
Packit 857059
//
Packit 857059
//	Convert a status code to a string
Packit 857059
//
Packit 857059
char *
Packit 857059
cs_convert_status (Status_t status) {
Packit 857059
	switch (status) {
Packit 857059
	case VSTATUS_OK: return "0: OK";
Packit 857059
	case VSTATUS_BAD: return "1: Bad status";
Packit 857059
	case VSTATUS_MISMATCH: return "2: Key mismatch";
Packit 857059
	case VSTATUS_DROP: return "3: Drop this packet";
Packit 857059
	case VSTATUS_FORWARD: return "4: Forward this packet";
Packit 857059
	case VSTATUS_ILLPARM: return "5: Invalid parameter";
Packit 857059
	case VSTATUS_NOMEM: return "6: Out of memory";
Packit 857059
	case VSTATUS_TIMEOUT: return "7: Timeout";
Packit 857059
	case VSTATUS_NOPRIV: return "8: Not enough privs";
Packit 857059
	case VSTATUS_BUSY: return "9: Busy";
Packit 857059
	case VSTATUS_NODEV: return "10: No object available";
Packit 857059
	case VSTATUS_NXIO: return "11: Invalid object";
Packit 857059
	case VSTATUS_PARTIAL_PRIVS: return "12: Some privs are avail";
Packit 857059
	case VSTATUS_CONDITIONAL: return "13: Conditionally good";
Packit 857059
	case VSTATUS_NOPORT: return "14: Port does not exist";
Packit 857059
	case VSTATUS_INVALID_HANDL: return "15: invalid handle";
Packit 857059
	case VSTATUS_INVALID_TYPE: return "16: invalid type (ib_attr)";
Packit 857059
	case VSTATUS_INVALID_ATTR: return "17: invalid attribute (ib_attr)";
Packit 857059
	case VSTATUS_INVALID_PROTO: return "18: invalid protocol (RC,RD,UC,UD,RAW)";
Packit 857059
	case VSTATUS_INVALID_STATE: return "19: invalid CEP or QP state";
Packit 857059
	case VSTATUS_NOT_FOUND: return "20: Not found";
Packit 857059
	case VSTATUS_TOO_LARGE: return "21: Too large";
Packit 857059
	case VSTATUS_CONNECT_FAILED: return "22: Connect failed";
Packit 857059
	case VSTATUS_CONNECT_GONE: return "23: connection gone";
Packit 857059
	case VSTATUS_NOHANDLE: return "24: Out of handles";
Packit 857059
	case VSTATUS_NOCONNECT: return "25: Out of connections";
Packit 857059
	case VSTATUS_EIO: return "26: IO error";
Packit 857059
	case VSTATUS_KNOWN: return "27: Already known";
Packit 857059
	case VSTATUS_NOT_MASTER: return "28: Not the Master SM";
Packit 857059
	case VSTATUS_INVALID_MAD: return "29: invalid MAD";
Packit 857059
	case VSTATUS_QFULL: return "30: Queue full";
Packit 857059
	case VSTATUS_QEMPTY: return "31: Queue empty";
Packit 857059
	case VSTATUS_AGAIN: return "32: Data not available";
Packit 857059
	case VSTATUS_BAD_VERSION: return "33: Version mismatch";
Packit 857059
	case VSTATUS_UNINIT: return "34: Not initialized";
Packit 857059
	case VSTATUS_NOT_OWNER: return "35: Not resource owner";
Packit 857059
	case VSTATUS_INVALID_MADT: return "36: Malformed Mai_t";
Packit 857059
	case VSTATUS_INVALID_METHOD: return "37: MAD method invalid";
Packit 857059
	case VSTATUS_INVALID_HOPCNT: return "38: HopCount not in [0..63]";
Packit 857059
	case VSTATUS_MISSING_ADDRINFO: return "39: Mai_t has no addrInfo";
Packit 857059
	case VSTATUS_INVALID_LID: return "40: Invalid LID";
Packit 857059
	case VSTATUS_INVALID_ADDRINFO: return "41: addrInfo invalid in Mai_t";
Packit 857059
	case VSTATUS_MISSING_QP: return "42: QP not in Mai_t";
Packit 857059
	case VSTATUS_INVALID_QP: return "43: MAI QP not SMI(0) or GSI(1)";
Packit 857059
	case VSTATUS_INVALID_MCLASS: return "48: Reserved mclass used";
Packit 857059
	case VSTATUS_INVALID_QKEY: return "51: BTH qkey field for GSI invalid";
Packit 857059
	case VSTATUS_INVALID_MADLEN: return "53: MAD datasize invalid/not determinable";
Packit 857059
	case VSTATUS_NOSUPPORT: return "55: Function not supported";
Packit 857059
	case VSTATUS_IGNORE: return "56: Ignorable condition";
Packit 857059
	case VSTATUS_INUSE: return "57: Resource already in use";
Packit 857059
	case VSTATUS_INVALID_PORT: return "58: Port invalid";
Packit 857059
	case VSTATUS_ATOMICS_NOTSUP: return "59: Atomic operations not supported";
Packit 857059
	case VSTATUS_INVALID_ACCESSCTL: return "60: Access definition invalid";
Packit 857059
	case VSTATUS_INVALID_ADDR_HANDLE: return "61: Address handle invalid";
Packit 857059
	case VSTATUS_INVALID_ADDR: return "62: Address invalid";
Packit 857059
	case VSTATUS_INVALID_ARG: return "63: Arguments invalid";
Packit 857059
	case VSTATUS_INVALID_HCA_HANDLE: return "64: CA handle invalid";
Packit 857059
	case VSTATUS_INVALID_KEY_VALUE: return "65: Partition key invalid";
Packit 857059
	case VSTATUS_INVALID_MEMADDR: return "66: Memory not accessible";
Packit 857059
	case VSTATUS_INVALID_MEMSIZE: return "67: Memory region size not supported";
Packit 857059
	case VSTATUS_INVALID_MIGSTATE: return "68: Migration state requested invalid";
Packit 857059
	case VSTATUS_INVALID_NOTICE: return "69: Completion notice requested invalid";
Packit 857059
	case VSTATUS_INVALID_OFFSET: return "70: Offset specified invalid";
Packit 857059
	case VSTATUS_INVALID_PD: return "71: Protection domain invalid";
Packit 857059
	case VSTATUS_INVALID_PKEY_IDX: return "72: Partition key index invalid";
Packit 857059
	case VSTATUS_INVALID_RC_TIMER: return "73: Reliable connection timeout invalid";
Packit 857059
	case VSTATUS_INVALID_RDD: return "74: Reliable datagram domain invalid";
Packit 857059
	case VSTATUS_INVALID_REQUEST: return "75: Request is invalid for this hardware";
Packit 857059
	case VSTATUS_INVALID_RNR_CNT: return "76: Receiver not ready count invalid";
Packit 857059
	case VSTATUS_INVALID_RNR_TIMER: return "77: Receiver not ready timer invalid";
Packit 857059
	case VSTATUS_INVALID_TRANSPORT: return "78: Transport type invalid or not supported";
Packit 857059
	case VSTATUS_INVALID_WORKREQ: return "79: Work request invalid";
Packit 857059
	case VSTATUS_MCAST_NOTSUP: return "80: Multicast not supported";
Packit 857059
	case VSTATUS_MCGRP_QPEXCEEDED: return "81: Too many QPs in multicast group";
Packit 857059
	case VSTATUS_MEMRGN_NOTSUP: return "82: Memory regions not supported";
Packit 857059
	case VSTATUS_MEMWIN_NOTSUP: return "83: Memory windows not supported";
Packit 857059
	case VSTATUS_NORESOURCE: return "84: Out of hardware resources";
Packit 857059
	case VSTATUS_OPERATION_DENIED: return "85: Operation cannot be performed";
Packit 857059
	case VSTATUS_QP_BUSY: return "86: Queue Pair is already opened";
Packit 857059
	case VSTATUS_RDMA_NOTSUP: return "87: Remote DMA operations not supported";
Packit 857059
	case VSTATUS_RD_NOTSUP: return "88: Reliable Datagram transport not supported";
Packit 857059
	case VSTATUS_SG_TOOMANY: return "89: To many scatter/gather entries";
Packit 857059
	case VSTATUS_WQ_RESIZE_NOTSUP: return "90: Work queue resizing not supported";
Packit 857059
	case VSTATUS_WR_TOOMANY: return "91: Work queue size not supported";
Packit 857059
	case VSTATUS_INVALID_NODE: return "92: Node index invalid";
Packit 857059
	case VSTATUS_MAI_INTERNAL: return "93: MAI Internal message";
Packit 857059
	case VSTATUS_MAD_OVERFLOW: return "94: MAD buffer overflow";
Packit 857059
	case VSTATUS_SIGNAL: return "95: Signal received";
Packit 857059
	case VSTATUS_FILTER: return "96: Filter take over notification received";
Packit 857059
	case VSTATUS_EXPIRED: return "98: Time period has expired";
Packit 857059
	case VSTATUS_EVENT_CONSUMED: return "99: Handler consumed event";
Packit 857059
	case VSTATUS_INVALID_PATH: return "100: Path handle invalid";
Packit 857059
	case VSTATUS_INVALID_GID_INDEX: return "101: GID index invalid";
Packit 857059
	case VSTATUS_INVALID_DEVICE: return "102: Device ordinal out of range";
Packit 857059
	case VSTATUS_INVALID_RESOP: return "103: resolver operation invalid";
Packit 857059
	case VSTATUS_INVALID_RESCMD: return "104: resolver command invalid";
Packit 857059
	case VSTATUS_INVALID_ITERATOR: return "105: resolver iterator invalid";
Packit 857059
	case VSTATUS_INVALID_MAGIC: return "106:Incorrect magic number";
Packit 857059
	case VSTATUS_BADPAGESIZE: return "107: invalid memory page size specified";
Packit 857059
	case VSTATUS_UNRECOVERABLE: return "108: unrecoverable error";
Packit 857059
	case VSTATUS_TIMEOUT_LIMIT: return "109: cumulative timeout limit reached";
Packit 857059
	case VSTATUS_ITERATOR_OUT_OF_DATE: return "119: data referred by case updated or deleted.";
Packit 857059
	case VSTATUS_INSUFFICIENT_PERMISSION: return "120: client has insufficient privillages";
Packit 857059
	case VSTATUS_INVALID_CQ_HANDLE: return "126: CQ handle is invalid";
Packit 857059
	case VSTATUS_INVALID_FORMAT: return "127: Data format is invalid";
Packit 857059
	case VSTATUS_REJECT: return "128: Request rejected";
Packit 857059
	case VSTATUS_DONE: return "129: Request done";
Packit 857059
	// a few extra just in case
Packit 857059
	case 130: return "130: Unknown status code";
Packit 857059
	case 131: return "131: Unknown status code";
Packit 857059
	case 132: return "132: Unknown status code";
Packit 857059
	default: return "Unknown status code";
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
//
Packit 857059
//  return attribute ID text given the ID
Packit 857059
//
Packit 857059
char *cs_getAidName(uint16_t aidClass, uint16_t aid) {
Packit 857059
Packit 857059
#define CASE_AID(aid) case aid: return #aid
Packit 857059
#define CASE_MCLASS_AID(aid) case MCLASS_ATTRIB_ID_##aid: return #aid
Packit 857059
#define CASE_STL_MCLASS_AID(aid) case STL_MCLASS_ATTRIB_ID_##aid: return #aid
Packit 857059
#define CASE_STL_SA_AID(aid) case STL_SA_ATTR_##aid: return #aid
Packit 857059
#define CASE_STL_PM_AID(aid) case STL_PM_ATTRIB_ID_##aid: return #aid
Packit 857059
#define CASE_MAD_CV(aid) case MAD_CV_##aid: return "Class " #aid
Packit 857059
#define CASE_STL_PA_AID(aid) case STL_PA_ATTRID_##aid: return #aid
Packit 857059
Packit 857059
	// Check common attribute ids first
Packit 857059
	switch (aid) {
Packit 857059
	CASE_MCLASS_AID(RESERVED_0);
Packit 857059
	CASE_MCLASS_AID(CLASS_PORT_INFO);
Packit 857059
	CASE_MCLASS_AID(NOTICE);
Packit 857059
	CASE_MCLASS_AID(INFORM_INFO);
Packit 857059
	default:
Packit 857059
		break;
Packit 857059
	}
Packit 857059
Packit 857059
	switch (aidClass) {
Packit 857059
    case MAD_CV_SUBN_LR:
Packit 857059
	case MAD_CV_SUBN_DR: 
Packit 857059
        switch (aid) {
Packit 857059
		CASE_STL_MCLASS_AID(NODE_DESCRIPTION);
Packit 857059
		CASE_STL_MCLASS_AID(NODE_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(SWITCH_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(PORT_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(PART_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SL_SC_MAPPING_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(VL_ARBITRATION);
Packit 857059
		CASE_STL_MCLASS_AID(LINEAR_FWD_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(MCAST_FWD_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SM_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(LED_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(CABLE_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(AGGREGATE);
Packit 857059
		CASE_STL_MCLASS_AID(SC_SC_MAPPING_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SC_SL_MAPPING_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SC_VLR_MAPPING_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SC_VLT_MAPPING_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SC_VLNT_MAPPING_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(PORT_STATE_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(PORT_GROUP_FWD_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(PORT_GROUP_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(BUFFER_CONTROL_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(CONGESTION_INFO);
Packit 857059
		CASE_STL_MCLASS_AID(SWITCH_CONGESTION_LOG);
Packit 857059
		CASE_STL_MCLASS_AID(SWITCH_CONGESTION_SETTING);
Packit 857059
		CASE_STL_MCLASS_AID(SWITCH_PORT_CONGESTION_SETTING);
Packit 857059
		CASE_STL_MCLASS_AID(HFI_CONGESTION_LOG);
Packit 857059
		CASE_STL_MCLASS_AID(HFI_CONGESTION_SETTING);
Packit 857059
		CASE_STL_MCLASS_AID(HFI_CONGESTION_CONTROL_TABLE);
Packit 857059
		CASE_STL_MCLASS_AID(SC_SC_MULTI_SET);
Packit 857059
Packit 857059
		// IB AIDs that do not conflict with STL AIDs
Packit 857059
		CASE_MCLASS_AID(GUID_INFO);
Packit 857059
		CASE_MCLASS_AID(VENDOR_DIAG);
Packit 857059
		CASE_MCLASS_AID(PORT_LFT);
Packit 857059
		CASE_MCLASS_AID(PORT_GROUP);
Packit 857059
		CASE_MCLASS_AID(AR_LIDMASK);
Packit 857059
		CASE_MCLASS_AID(COLLECTIVE_NOTICE);
Packit 857059
		CASE_MCLASS_AID(CMLIST);
Packit 857059
		CASE_MCLASS_AID(CFT);
Packit 857059
Packit 857059
		default:
Packit 857059
			break;
Packit 857059
		}
Packit 857059
    case MAD_CV_VENDOR_DBSYNC:
Packit 857059
        switch (aid) {
Packit 857059
    	CASE_AID(DBSYNC_AID_SYNC);
Packit 857059
    	CASE_AID(DBSYNC_AID_GROUP);
Packit 857059
    	CASE_AID(DBSYNC_AID_SERVICE);
Packit 857059
    	CASE_AID(DBSYNC_AID_INFORM);
Packit 857059
    	CASE_AID(DBSYNC_AID_MCROOT);
Packit 857059
        default:
Packit 857059
			break;
Packit 857059
		}
Packit 857059
    case MAD_CV_SUBN_ADM:
Packit 857059
        switch (aid) {
Packit 857059
        CASE_STL_SA_AID(CLASS_PORT_INFO);
Packit 857059
        CASE_STL_SA_AID(NOTICE);
Packit 857059
        CASE_STL_SA_AID(INFORM_INFO);
Packit 857059
        CASE_STL_SA_AID(NODE_RECORD);
Packit 857059
        CASE_STL_SA_AID(PORTINFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(SC_MAPTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(SWITCHINFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(LINEAR_FWDTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(MCAST_FWDTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(SMINFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(LINK_SPD_WDTH_PAIRS_RECORD);
Packit 857059
        CASE_STL_SA_AID(LINK_RECORD);
Packit 857059
        CASE_STL_SA_AID(SERVICE_RECORD);
Packit 857059
        CASE_STL_SA_AID(P_KEY_TABLE_RECORD);
Packit 857059
        CASE_STL_SA_AID(PATH_RECORD);
Packit 857059
        CASE_STL_SA_AID(VLARBTABLE_RECORD);
Packit 857059
        CASE_STL_SA_AID(MCMEMBER_RECORD);
Packit 857059
        CASE_STL_SA_AID(TRACE_RECORD);
Packit 857059
        CASE_STL_SA_AID(MULTIPATH_GID_RECORD);
Packit 857059
        CASE_STL_SA_AID(SERVICEASSOCIATION_RECORD);
Packit 857059
        CASE_STL_SA_AID(INFORM_INFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(SC2SL_MAPTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(SC2VL_NT_MAPTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(SC2VL_T_MAPTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(SC2VL_R_MAPTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(PGROUP_FWDTBL_RECORD);
Packit 857059
        CASE_STL_SA_AID(MULTIPATH_GUID_RECORD);
Packit 857059
        CASE_STL_SA_AID(MULTIPATH_LID_RECORD);
Packit 857059
        CASE_STL_SA_AID(CABLE_INFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(VF_INFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(PORT_STATE_INFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(PORTGROUP_TABLE_RECORD);
Packit 857059
        CASE_STL_SA_AID(BUFF_CTRL_TAB_RECORD);
Packit 857059
        CASE_STL_SA_AID(FABRICINFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(QUARANTINED_NODE_RECORD);
Packit 857059
        CASE_STL_SA_AID(CONGESTION_INFO_RECORD);
Packit 857059
        CASE_STL_SA_AID(SWITCH_CONG_RECORD);
Packit 857059
        CASE_STL_SA_AID(SWITCH_PORT_CONG_RECORD);
Packit 857059
        CASE_STL_SA_AID(HFI_CONG_RECORD);
Packit 857059
        CASE_STL_SA_AID(HFI_CONG_CTRL_RECORD);
Packit 857059
        CASE_STL_SA_AID(DG_MEMBER_RECORD);
Packit 857059
        CASE_STL_SA_AID(DG_NAME_RECORD);
Packit 857059
        CASE_STL_SA_AID(DT_MEMBER_RECORD);
Packit 857059
		default:
Packit 857059
			break;
Packit 857059
        }
Packit 857059
	case MAD_CV_PERF:
Packit 857059
		switch (aid) {
Packit 857059
		CASE_STL_PM_AID(PORT_STATUS);
Packit 857059
		CASE_STL_PM_AID(CLEAR_PORT_STATUS);
Packit 857059
		CASE_STL_PM_AID(DATA_PORT_COUNTERS);
Packit 857059
		CASE_STL_PM_AID(ERROR_PORT_COUNTERS);
Packit 857059
		CASE_STL_PM_AID(ERROR_INFO);
Packit 857059
		default:
Packit 857059
			break;
Packit 857059
		}
Packit 857059
    case MAD_CV_VFI_PM:
Packit 857059
        switch (aid) {
Packit 857059
        CASE_STL_PA_AID(GET_GRP_LIST);
Packit 857059
        CASE_STL_PA_AID(GET_GRP_INFO);
Packit 857059
        CASE_STL_PA_AID(GET_GRP_CFG);
Packit 857059
        CASE_STL_PA_AID(GET_PORT_CTRS);
Packit 857059
        CASE_STL_PA_AID(CLR_PORT_CTRS);
Packit 857059
        CASE_STL_PA_AID(CLR_ALL_PORT_CTRS);
Packit 857059
        CASE_STL_PA_AID(GET_PM_CONFIG);
Packit 857059
        CASE_STL_PA_AID(FREEZE_IMAGE);
Packit 857059
        CASE_STL_PA_AID(RELEASE_IMAGE);
Packit 857059
        CASE_STL_PA_AID(RENEW_IMAGE);
Packit 857059
        CASE_STL_PA_AID(GET_FOCUS_PORTS);
Packit 857059
        CASE_STL_PA_AID(GET_IMAGE_INFO);
Packit 857059
        CASE_STL_PA_AID(MOVE_FREEZE_FRAME);
Packit 857059
        CASE_STL_PA_AID(GET_VF_LIST);
Packit 857059
        CASE_STL_PA_AID(GET_VF_INFO);
Packit 857059
        CASE_STL_PA_AID(GET_VF_CONFIG);
Packit 857059
        CASE_STL_PA_AID(GET_VF_PORT_CTRS);
Packit 857059
        CASE_STL_PA_AID(CLR_VF_PORT_CTRS);
Packit 857059
        CASE_STL_PA_AID(GET_VF_FOCUS_PORTS);
Packit 857059
        default:
Packit 857059
            break;
Packit 857059
        }
Packit 857059
Packit 857059
Packit 857059
	// Unhandled Classes
Packit 857059
	CASE_MAD_CV(BM);
Packit 857059
	CASE_MAD_CV(DEV_MGT);
Packit 857059
	CASE_MAD_CV(COMM_MGT);
Packit 857059
	CASE_MAD_CV(SNMP);
Packit 857059
	CASE_MAD_CV(VENDOR_CM);
Packit 857059
	CASE_MAD_CV(VENDOR_LOG);
Packit 857059
	CASE_MAD_CV(VENDOR_1);
Packit 857059
	CASE_MAD_CV(APP_0);
Packit 857059
	CASE_MAD_CV(APP_1);
Packit 857059
	CASE_MAD_CV(CC);
Packit 857059
	CASE_MAD_CV(VENDOR_FE);
Packit 857059
	CASE_MAD_CV(VFI_BM);
Packit 857059
    default:
Packit 857059
        break;
Packit 857059
    }
Packit 857059
#undef CASE_AID
Packit 857059
#undef CASE_MCLASS_AID
Packit 857059
#undef CASE_STL_MCLASS_AID
Packit 857059
#undef CASE_STL_SA_AID
Packit 857059
#undef CASE_STL_PM_AID
Packit 857059
#undef CASE_MAD_CV
Packit 857059
#undef CASE_STL_PA_AID
Packit 857059
    return "UNKNOWN";
Packit 857059
}
Packit 857059
Packit 857059
//
Packit 857059
// return method text representation given the ID
Packit 857059
//
Packit 857059
char *cs_getMethodText(uint8_t method) {
Packit 857059
Packit 857059
#define CASE_MAD_CM(aid) case MAD_CM_##aid: return #aid
Packit 857059
#define CASE_SA_CM(aid) case SA_CM_##aid: return #aid
Packit 857059
#define CASE_FE_MNGR(aid) case FE_MNGR_##aid: return #aid
Packit 857059
#define CASE_FE_CMD(aid) case FE_CMD_##aid: return #aid
Packit 857059
#define CASE_FM_CMD(aid) case FM_CMD_##aid: return #aid
Packit 857059
	switch (method) {
Packit 857059
	CASE_MAD_CM(GET);
Packit 857059
	CASE_MAD_CM(SET);
Packit 857059
	CASE_MAD_CM(GET_RESP);
Packit 857059
	CASE_MAD_CM(SEND);
Packit 857059
	CASE_MAD_CM(TRAP);
Packit 857059
	CASE_MAD_CM(REPORT);
Packit 857059
	CASE_MAD_CM(REPORT_RESP);
Packit 857059
	CASE_MAD_CM(TRAP_REPRESS);
Packit 857059
	CASE_MAD_CM(VIEO_REQ);
Packit 857059
	CASE_MAD_CM(VIEO_REP);
Packit 857059
Packit 857059
	CASE_SA_CM(GETTABLE);
Packit 857059
	CASE_SA_CM(GETTABLE_RESP);
Packit 857059
	CASE_SA_CM(GETTRACETABLE);
Packit 857059
	CASE_SA_CM(GETMULTI);
Packit 857059
	CASE_SA_CM(GETMULTI_RESP);
Packit 857059
	CASE_SA_CM(DELETE);
Packit 857059
	CASE_SA_CM(DELETE_RESP);
Packit 857059
Packit 857059
	CASE_FE_MNGR(PROBE_CMD);
Packit 857059
	CASE_FE_MNGR(CLOSE_CMD);
Packit 857059
	CASE_FE_CMD(RESP);
Packit 857059
Packit 857059
	CASE_FM_CMD(SHUTDOWN);
Packit 857059
	default:
Packit 857059
		break;
Packit 857059
	}
Packit 857059
#undef CASE_MAD_CM
Packit 857059
#undef CASE_SA_CM
Packit 857059
#undef CASE_FE_MNGR
Packit 857059
#undef CASE_FE_CMD
Packit 857059
#undef CASE_FM_CMD
Packit 857059
	return "UNKNOWN";
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
/* Computational Utilty Functions */
Packit 857059
Packit 857059
// This is the smallest switch we will see in clusters moving forward.
Packit 857059
// These computations will be slightly high for 36 port switches, but
Packit 857059
// should be safe and not too far off.
Packit 857059
// Fat Tree is the most hardware intensive topology, so these will be high
Packit 857059
// for others.  However they could be a hair low for Scalable Unit fat trees
Packit 857059
#define MIN_SWITCH_PORTS 24
Packit 857059
Packit 857059
// assuming a fat tree topology with switches of size MIN_SWITCH_PORTS
Packit 857059
// compute number of switching tiers in a typical FBB fabric
Packit 857059
static uint32_t cs_numTiers(uint32_t subnet_size)
Packit 857059
{
Packit 857059
	uint32_t tiers = 1;	// minimum we care about
Packit 857059
	while (subnet_size > MIN_SWITCH_PORTS) {
Packit 857059
		tiers++;
Packit 857059
		subnet_size /= (MIN_SWITCH_PORTS/2);
Packit 857059
	}
Packit 857059
	return tiers;
Packit 857059
}
Packit 857059
Packit 857059
// assuming a fat tree topology with switches of size MIN_SWITCH_PORTS
Packit 857059
// compute number of switches in a typical FBB fabric
Packit 857059
uint32_t cs_numSwitches(uint32_t subnet_size)
Packit 857059
{
Packit 857059
	// edge switches (and intermediate tiers)
Packit 857059
	uint32_t edge_sw = (subnet_size + (MIN_SWITCH_PORTS/2)-1)/(MIN_SWITCH_PORTS/2);
Packit 857059
	uint32_t tiers = cs_numTiers(subnet_size);
Packit 857059
Packit 857059
	// core/spine is half as many switches as edge
Packit 857059
	return (edge_sw * (tiers-1)) + (edge_sw/2);
Packit 857059
}
Packit 857059
Packit 857059
// assuming a fat tree topology with switches of size MIN_SWITCH_PORTS
Packit 857059
// compute number of node records (1 per CA port, 1 per switch)
Packit 857059
// in a typical FBB fabric
Packit 857059
uint32_t cs_numNodeRecords(uint32_t subnet_size)
Packit 857059
{
Packit 857059
		return subnet_size + cs_numSwitches(subnet_size);
Packit 857059
}
Packit 857059
Packit 857059
// assuming a fat tree topology with switches of size MIN_SWITCH_PORTS
Packit 857059
// compute number of port records (1 per CA port, 1 per switch port)
Packit 857059
// in a typical FBB fabric
Packit 857059
// (this will be slightly high for larger switches since there will
Packit 857059
// be fewer switches (less switch port 0), less tiers and potentially
Packit 857059
// fewer ISLs (hence fewer switch ports).
Packit 857059
uint32_t cs_numPortRecords(uint32_t subnet_size)
Packit 857059
{
Packit 857059
	// +1 is for port 0 of switch chips
Packit 857059
	return subnet_size + cs_numSwitches(subnet_size) * (MIN_SWITCH_PORTS+1);
Packit 857059
}
Packit 857059
Packit 857059
// assuming a fat tree topology with switches of size MIN_SWITCH_PORTS
Packit 857059
// compute number of links records (ISL and CA to Switch)
Packit 857059
// in a typical FBB fabric
Packit 857059
uint32_t cs_numLinkRecords(uint32_t subnet_size)
Packit 857059
{
Packit 857059
    // standard switching tiers calculation is a hair too low, so increase
Packit 857059
    // the number of switching tiers to accommodate the number of links records.
Packit 857059
	return (cs_numTiers(subnet_size) + 2)*subnet_size;
Packit 857059
}