Blame IbPrint/sma.c

Packit Service ac7b0b
/* BEGIN_ICS_COPYRIGHT7 ****************************************
Packit Service ac7b0b
Packit Service ac7b0b
Copyright (c) 2015-2017, Intel Corporation
Packit Service ac7b0b
Packit Service ac7b0b
Redistribution and use in source and binary forms, with or without
Packit Service ac7b0b
modification, are permitted provided that the following conditions are met:
Packit Service ac7b0b
Packit Service ac7b0b
    * Redistributions of source code must retain the above copyright notice,
Packit Service ac7b0b
      this list of conditions and the following disclaimer.
Packit Service ac7b0b
    * Redistributions in binary form must reproduce the above copyright
Packit Service ac7b0b
      notice, this list of conditions and the following disclaimer in the
Packit Service ac7b0b
      documentation and/or other materials provided with the distribution.
Packit Service ac7b0b
    * Neither the name of Intel Corporation nor the names of its contributors
Packit Service ac7b0b
      may be used to endorse or promote products derived from this software
Packit Service ac7b0b
      without specific prior written permission.
Packit Service ac7b0b
Packit Service ac7b0b
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit Service ac7b0b
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service ac7b0b
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Packit Service ac7b0b
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
Packit Service ac7b0b
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service ac7b0b
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Packit Service ac7b0b
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Packit Service ac7b0b
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Packit Service ac7b0b
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service ac7b0b
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service ac7b0b
Packit Service ac7b0b
** END_ICS_COPYRIGHT7   ****************************************/
Packit Service ac7b0b
Packit Service ac7b0b
/* [ICS VERSION STRING: unknown] */
Packit Service ac7b0b
Packit Service ac7b0b
#include <stdio.h>
Packit Service ac7b0b
#include <stdlib.h>
Packit Service ac7b0b
#include <unistd.h>
Packit Service ac7b0b
#include <errno.h>
Packit Service ac7b0b
#include <iba/ibt.h>
Packit Service ac7b0b
#include <stdarg.h>
Packit Service ac7b0b
#include "ibprint.h"
Packit Service ac7b0b
Packit Service ac7b0b
void PrintNodeDesc(PrintDest_t *dest, int indent, const NODE_DESCRIPTION *pNodeDesc)
Packit Service ac7b0b
{
Packit Service ac7b0b
	PrintFunc(dest, "%*s%.*s\n",
Packit Service ac7b0b
			indent, "",
Packit Service ac7b0b
			NODE_DESCRIPTION_ARRAY_SIZE, pNodeDesc->NodeString);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintNodeInfo(PrintDest_t *dest, int indent, const NODE_INFO *pNodeInfo)
Packit Service ac7b0b
{
Packit Service ac7b0b
	PrintFunc(dest, "%*sType: %s Ports: %d PortNum: %d PartitionCap: %d\n",
Packit Service ac7b0b
				indent, "",
Packit Service ac7b0b
				StlNodeTypeToText(pNodeInfo->NodeType), pNodeInfo->NumPorts,
Packit Service ac7b0b
				pNodeInfo->u1.s.LocalPortNum, pNodeInfo->PartitionCap);
Packit Service ac7b0b
	PrintFunc(dest, "%*sNodeGuid: 0x%016"PRIx64" PortGuid: 0x%016"PRIx64"\n",
Packit Service ac7b0b
				indent, "", pNodeInfo->NodeGUID, pNodeInfo->PortGUID);
Packit Service ac7b0b
	PrintFunc(dest, "%*sSystemImageGuid: 0x%016"PRIx64"\n",
Packit Service ac7b0b
				indent, "", pNodeInfo->SystemImageGUID);
Packit Service ac7b0b
	PrintFunc(dest, "%*sBaseVersion: %d SmaVersion: %d VendorID: 0x%x DeviceId: 0x%x Revision: 0x%x\n",
Packit Service ac7b0b
				indent, "", pNodeInfo->BaseVersion,
Packit Service ac7b0b
				pNodeInfo->ClassVersion, pNodeInfo->u1.s.VendorID,
Packit Service ac7b0b
				pNodeInfo->DeviceID, pNodeInfo->Revision);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
// style=0 or 1
Packit Service ac7b0b
// TBD - key off portGuid!=0 to decide style instead?
Packit Service ac7b0b
void PrintPortInfo(PrintDest_t *dest, int indent, const PORT_INFO *pPortInfo, EUI64 portGuid, int style)
Packit Service ac7b0b
{
Packit Service ac7b0b
	char tempBuf[9];
Packit Service ac7b0b
	char tempBuf2[9];
Packit Service ac7b0b
	char cbuf[80];
Packit Service ac7b0b
Packit Service ac7b0b
	PrintFunc(dest, "%*sPortState: %-6s           PhysState: %-8s  DownDefault: %-5s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		IbPortStateToText(pPortInfo->Link.PortState),
Packit Service ac7b0b
		IbPortPhysStateToText(pPortInfo->Link.PortPhysicalState),
Packit Service ac7b0b
		IbPortDownDefaultToText(pPortInfo->Link.DownDefaultState));
Packit Service ac7b0b
	if (style == 0) {
Packit Service ac7b0b
		PrintFunc(dest, "%*sLID:    0x%04x              LMC: %u               Subnet: 0x%016"PRIx64"\n",
Packit Service ac7b0b
			indent, "",
Packit Service ac7b0b
			pPortInfo->LID, pPortInfo->s1.LMC, pPortInfo->SubnetPrefix);
Packit Service ac7b0b
	} else {
Packit Service ac7b0b
		PrintFunc(dest, "%*sLID:    0x%04x              LMC: %u\n",
Packit Service ac7b0b
			indent, "", pPortInfo->LID, pPortInfo->s1.LMC);
Packit Service ac7b0b
		if (portGuid) {
Packit Service ac7b0b
			PrintFunc(dest, "%*sSubnet: 0x%016"PRIx64"  GUID: 0x%016"PRIx64"  GUID Cap:  %4u\n",
Packit Service ac7b0b
				indent, "", pPortInfo->SubnetPrefix, portGuid, pPortInfo->GUIDCap);
Packit Service ac7b0b
		} else {
Packit Service ac7b0b
			PrintFunc(dest, "%*sSubnet: 0x%016"PRIx64"                            GUID Cap:  %4u\n",
Packit Service ac7b0b
				indent, "", pPortInfo->SubnetPrefix, pPortInfo->GUIDCap);
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
	FormatTimeoutMult(tempBuf, pPortInfo->Resp.TimeValue);
Packit Service ac7b0b
	FormatTimeoutMult(tempBuf2, pPortInfo->Subnet.Timeout);
Packit Service ac7b0b
	PrintFunc(dest, "%*sSMLID:  0x%04x   SMSL: %2u   RespTimeout: %s  SubnetTimeout: %s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		pPortInfo->MasterSMLID, pPortInfo->s2.MasterSMSL, tempBuf, tempBuf2);
Packit Service ac7b0b
	PrintFunc(dest, "%*sM_KEY:  0x%016"PRIx64"  Lease: %5u s          Protect: %s\n",
Packit Service ac7b0b
		indent, "", pPortInfo->M_Key, pPortInfo->M_KeyLeasePeriod,
Packit Service ac7b0b
		IbMKeyProtectToText(pPortInfo->s1.M_KeyProtectBits));
Packit Service ac7b0b
	PrintFunc(dest, "%*sMTU:       Active:   %5s  Supported:      %5s  VL Stall: %u\n",
Packit Service ac7b0b
		indent, "", IbMTUToText(pPortInfo->s2.NeighborMTU),
Packit Service ac7b0b
		IbMTUToText(pPortInfo->MTU.Cap), pPortInfo->XmitQ.VLStallCount);
Packit Service ac7b0b
	PrintFunc(dest, "%*sLinkWidth: Active:    %4s  Supported:    %7s  Enabled:    %7s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		IbLinkWidthToText(pPortInfo->LinkWidth.Active),
Packit Service ac7b0b
		IbLinkWidthToText(pPortInfo->LinkWidth.Supported),
Packit Service ac7b0b
		IbLinkWidthToText(pPortInfo->LinkWidth.Enabled));
Packit Service ac7b0b
	PrintFunc( dest, "%*sLinkSpeed: Active: %7s  Supported: %10s  Enabled: %10s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		IbLinkSpeedToText(PortDataGetLinkSpeedActiveCombined((PORT_INFO *)pPortInfo)),
Packit Service ac7b0b
		IbLinkSpeedToText(PortDataGetLinkSpeedSupportedCombined((PORT_INFO *)pPortInfo)), 
Packit Service ac7b0b
		IbLinkSpeedToText(PortDataGetLinkSpeedEnabledCombined((PORT_INFO *)pPortInfo)) );
Packit Service ac7b0b
	if (pPortInfo->XmitQ.HOQLife > IB_LIFETIME_MAX)
Packit Service ac7b0b
	{
Packit Service ac7b0b
		memcpy(tempBuf, "Infinite", 9);
Packit Service ac7b0b
	} else {
Packit Service ac7b0b
		FormatTimeoutMult(tempBuf, pPortInfo->XmitQ.HOQLife);
Packit Service ac7b0b
	}
Packit Service ac7b0b
	PrintFunc(dest, "%*sVLs:       Active:    %-2d  Supported:       %-2d  HOQLife: %s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		pPortInfo->s3.OperationalVL,
Packit Service ac7b0b
		pPortInfo->VL.s.Cap, tempBuf);
Packit Service ac7b0b
	PrintFunc(dest, "%*sVL Arb Cap:  High:    %4u        Low:       %4u  HiLimit: %4u\n",
Packit Service ac7b0b
		indent, "", pPortInfo->VL.ArbitrationHighCap,
Packit Service ac7b0b
		pPortInfo->VL.ArbitrationLowCap, pPortInfo->VL.HighLimit);
Packit Service ac7b0b
#if ! GUID_CAP_ALWAYS_ALONE
Packit Service ac7b0b
	if (style == 0)
Packit Service ac7b0b
#endif
Packit Service ac7b0b
		PrintFunc(dest, "%*sGUID Cap:  %4u\n", indent, "", pPortInfo->GUIDCap);
Packit Service ac7b0b
Packit Service ac7b0b
	FormatCapabilityMask(cbuf, pPortInfo->CapabilityMask);
Packit Service ac7b0b
	PrintFunc(dest, "%*sCapability 0x%08x: %s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		pPortInfo->CapabilityMask.AsReg32, cbuf);
Packit Service ac7b0b
	PrintFunc(dest, "%*sViolations: M_Key: %5u P_Key: %5u Q_Key: %5u\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		pPortInfo->Violations.M_Key, pPortInfo->Violations.P_Key,
Packit Service ac7b0b
		pPortInfo->Violations.Q_Key);
Packit Service ac7b0b
	PrintFunc(dest, "%*sErrorLimits: Overrun: %2u LocalPhys: %2u  DiagCode: 0x%04x\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		pPortInfo->Errors.Overrun, pPortInfo->Errors.LocalPhys,
Packit Service ac7b0b
		pPortInfo->DiagCode);
Packit Service ac7b0b
	PrintFunc(dest, "%*sP_Key Enforcement: In: %3s Out: %3s  FilterRaw: In: %3s Out: %3s\n",
Packit Service ac7b0b
		indent, "",
Packit Service ac7b0b
		pPortInfo->s3.PartitionEnforcementInbound?"On":"Off",
Packit Service ac7b0b
		pPortInfo->s3.PartitionEnforcementOutbound?"On":"Off",
Packit Service ac7b0b
		pPortInfo->s3.FilterRawInbound?"On":"Off",
Packit Service ac7b0b
		pPortInfo->s3.FilterRawOutbound?"On":"Off");
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintPortInfoSmp(PrintDest_t *dest, int indent, const SMP *smp, EUI64 portGuid)
Packit Service ac7b0b
{
Packit Service ac7b0b
	const PORT_INFO* pPortInfo = (PORT_INFO *)&(smp->SmpExt.DirectedRoute.SMPData);
Packit Service ac7b0b
Packit Service ac7b0b
	PrintFunc(dest, "%*sPort %u Info\n", indent, "",
Packit Service ac7b0b
				smp->common.AttributeModifier & 0xff);
Packit Service ac7b0b
	PrintPortInfo(dest, indent+4, pPortInfo, portGuid, 1);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintSMInfo(PrintDest_t *dest, int indent, const SM_INFO *pSMInfo, IB_LID lid)
Packit Service ac7b0b
{
Packit Service ac7b0b
	if (lid)
Packit Service ac7b0b
		PrintFunc(dest, "%*sLID: 0x%04x PortGuid: 0x%016"PRIx64" State: %11s\n",
Packit Service ac7b0b
				indent, "", lid, pSMInfo->GUID,
Packit Service ac7b0b
				IbSMStateToText(pSMInfo->s.SMState));
Packit Service ac7b0b
	else
Packit Service ac7b0b
		PrintFunc(dest, "%*sPortGuid: 0x%016"PRIx64" State: %11s\n",
Packit Service ac7b0b
				indent, "", pSMInfo->GUID,
Packit Service ac7b0b
				IbSMStateToText(pSMInfo->s.SMState));
Packit Service ac7b0b
	PrintFunc(dest, "%*sSM_Key: 0x%016"PRIx64" Priority: %3d ActCount: 0x%08x\n",
Packit Service ac7b0b
				indent, "", pSMInfo->SM_Key,
Packit Service ac7b0b
				pSMInfo->s.Priority, pSMInfo->ActCount);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintSwitchInfo(PrintDest_t *dest, int indent, const SWITCH_INFO *pSwitchInfo, IB_LID lid)
Packit Service ac7b0b
{
Packit Service ac7b0b
	char buf[8];
Packit Service ac7b0b
Packit Service ac7b0b
	if (lid)
Packit Service ac7b0b
		PrintFunc(dest, "%*sLID: 0x%04x\n", indent, "", lid);
Packit Service ac7b0b
Packit Service ac7b0b
	PrintFunc(dest, "%*sLinearFDBCap: %5u LinearFDBTop: 0x%04x MCFDBCap: %5u MCFDBTop: 0x%04x\n",
Packit Service ac7b0b
			indent, "",
Packit Service ac7b0b
			pSwitchInfo->LinearFDBCap, pSwitchInfo->LinearFDBTop,
Packit Service ac7b0b
			pSwitchInfo->MulticastFDBCap, pSwitchInfo->MulticastFDBTop);
Packit Service ac7b0b
	FormatTimeoutMult(buf, pSwitchInfo->u1.s.LifeTimeValue);
Packit Service ac7b0b
	PrintFunc(dest, "%*sRandomFDBCap: %5u LIDsPerPort: %5u LifeTime: %s\n",
Packit Service ac7b0b
				indent, "",
Packit Service ac7b0b
				pSwitchInfo->RandomFDBCap, pSwitchInfo->LIDsPerPort, buf);
Packit Service ac7b0b
	PrintFunc(dest, "%*sDefaultPort: %3u DefaultMCPrimaryPort: %3u DefaultMCNotPrimaryPort: %3u\n",
Packit Service ac7b0b
				indent, "",
Packit Service ac7b0b
				pSwitchInfo->DefaultPort,
Packit Service ac7b0b
				pSwitchInfo->DefaultMulticastPrimaryPort,
Packit Service ac7b0b
				pSwitchInfo->DefaultMulticastNotPrimaryPort);
Packit Service ac7b0b
	PrintFunc(dest, "%*sCapability: 0x%02x: %s%s%s%s%s%s PartEnfCap: %5u PortStateChange: %d\n",
Packit Service ac7b0b
				indent, "",
Packit Service ac7b0b
				pSwitchInfo->u2.AsReg8,
Packit Service ac7b0b
				pSwitchInfo->u2.s.InboundEnforcementCapable?"IE ": "",
Packit Service ac7b0b
				pSwitchInfo->u2.s.OutboundEnforcementCapable?"OE ": "",
Packit Service ac7b0b
				pSwitchInfo->u2.s.FilterRawPacketInboundCapable?"FI ": "",
Packit Service ac7b0b
				pSwitchInfo->u2.s.FilterRawPacketOutboundCapable?"FO ": "",
Packit Service ac7b0b
				pSwitchInfo->u2.s.EnhancedPort0?"E0 ": "",
Packit Service ac7b0b
				pSwitchInfo->u1.s.OptimizedSLVL?"SLVL ": "",
Packit Service ac7b0b
				pSwitchInfo->PartitionEnforcementCap,
Packit Service ac7b0b
				pSwitchInfo->u1.s.PortStateChange);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintLinearFDB(PrintDest_t *dest, int indent, const FORWARDING_TABLE *pLinearFDB, uint16 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
	IB_LID baselid = blockNum*LFT_BLOCK_SIZE;
Packit Service ac7b0b
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// LID is index into overall FDB table
Packit Service ac7b0b
		// 255 is invalid port, indicates an unsed table entry
Packit Service ac7b0b
		if (pLinearFDB->u.Linear.LftBlock[i] != 255)
Packit Service ac7b0b
			PrintFunc(dest, "%*s  LID 0x%04x -> Port %5u\n",
Packit Service ac7b0b
				indent, "", baselid + i,
Packit Service ac7b0b
				pLinearFDB->u.Linear.LftBlock[i]);
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintRandomFDB(PrintDest_t *dest, int indent, const FORWARDING_TABLE *pRandomFDB, uint16 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// Valid = 0 indicates unused table entry
Packit Service ac7b0b
		if (pRandomFDB->u.Random.RftBlock[i].s.Valid)
Packit Service ac7b0b
		{
Packit Service ac7b0b
			IB_LID lid = pRandomFDB->u.Random.RftBlock[i].LID;
Packit Service ac7b0b
			uint8 lmc = pRandomFDB->u.Random.RftBlock[i].s.LMC;
Packit Service ac7b0b
			if (lmc) {
Packit Service ac7b0b
				PrintFunc(dest, "%*s  LID 0x%04x-0x%04x -> Port %5u\n",
Packit Service ac7b0b
					indent, "", lid, lid + (1<
Packit Service ac7b0b
					pRandomFDB->u.Random.RftBlock[i].Port);
Packit Service ac7b0b
			} else {
Packit Service ac7b0b
				PrintFunc(dest, "%*s  LID 0x%04x -> Port %5u\n",
Packit Service ac7b0b
					indent, "", lid,
Packit Service ac7b0b
					pRandomFDB->u.Random.RftBlock[i].Port);
Packit Service ac7b0b
			}
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
boolean isMCastFDBEmpty(const FORWARDING_TABLE *pMCastFDB)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// PortMask = 0 indicates unused table entry
Packit Service ac7b0b
		if (pMCastFDB->u.Multicast.MftBlock[i])
Packit Service ac7b0b
			return FALSE;
Packit Service ac7b0b
	}
Packit Service ac7b0b
	return TRUE;
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintMCastFDB(PrintDest_t *dest, int indent, const FORWARDING_TABLE *pMCastFDB, uint16 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
	IB_LID baselid = blockNum*MFT_BLOCK_SIZE+LID_MCAST_START;
Packit Service ac7b0b
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// PortMask = 0 indicates unused table entry
Packit Service ac7b0b
		if (pMCastFDB->u.Multicast.MftBlock[i])
Packit Service ac7b0b
		{
Packit Service ac7b0b
			PrintFunc(dest, "%*s  LID 0x%04x -> PortMask 0x%04x\n",
Packit Service ac7b0b
				indent, "", baselid+i,
Packit Service ac7b0b
				pMCastFDB->u.Multicast.MftBlock[i]);
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintMCastFDBSmp(PrintDest_t *dest, int indent, const SMP *smp)
Packit Service ac7b0b
{
Packit Service ac7b0b
	const FORWARDING_TABLE *pMCastFDB = (FORWARDING_TABLE *)&(smp->SmpExt.DirectedRoute.SMPData);
Packit Service ac7b0b
Packit Service ac7b0b
	PrintFunc(dest, "%*sPosition: %2u\n", indent, "",
Packit Service ac7b0b
				smp->common.AttributeModifier >> 28);
Packit Service ac7b0b
Packit Service ac7b0b
	PrintMCastFDB(dest, indent, pMCastFDB, smp->common.AttributeModifier & 0x1ff);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
boolean isMCastFDBEmptyRows(const FORWARDING_TABLE *pMCastFDB, uint8 numPositions)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
	unsigned p;
Packit Service ac7b0b
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		for (p=0; p
Packit Service ac7b0b
			// PortMask = 0 indicates unused table entry
Packit Service ac7b0b
			if (pMCastFDB[p].u.Multicast.MftBlock[i])
Packit Service ac7b0b
				return FALSE;
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
	return TRUE;
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
// prints full rows in table
Packit Service ac7b0b
// pMcastFDB expected to be FORWARDING_TABLE[1+endPosition-startPosition] entry
Packit Service ac7b0b
void PrintMCastFDBRows(PrintDest_t *dest, int indent, const FORWARDING_TABLE *pMCastFDB, uint16 blockNum, uint8 startPosition, uint8 endPosition, boolean showHeading)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
	unsigned p;
Packit Service ac7b0b
	IB_LID baselid = blockNum*MFT_BLOCK_SIZE+LID_MCAST_START;
Packit Service ac7b0b
Packit Service ac7b0b
	if (showHeading)
Packit Service ac7b0b
		PrintFunc(dest, "%*sPositions: %2u - %2u\n", indent, "",
Packit Service ac7b0b
				startPosition, endPosition);
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// see if given MLID has a non-zero mask
Packit Service ac7b0b
		boolean empty = TRUE;
Packit Service ac7b0b
		for (p=startPosition; p<=endPosition; ++p) {
Packit Service ac7b0b
			// PortMask = 0 indicates unused table entry
Packit Service ac7b0b
			if (pMCastFDB[p-startPosition].u.Multicast.MftBlock[i])
Packit Service ac7b0b
			{
Packit Service ac7b0b
				empty = FALSE;
Packit Service ac7b0b
			}
Packit Service ac7b0b
		}
Packit Service ac7b0b
		if (! empty) {
Packit Service ac7b0b
			char buf[80];
Packit Service ac7b0b
			int offset;
Packit Service ac7b0b
			offset = sprintf(buf, "  LID 0x%04x -> PortMask 0x", baselid+i);
Packit Service ac7b0b
			// show the combined mask, MSb to LSb
Packit Service ac7b0b
			p=endPosition;
Packit Service ac7b0b
			do {
Packit Service ac7b0b
				offset += sprintf(&buf[offset], "%04x", pMCastFDB[p-startPosition].u.Multicast.MftBlock[i]);
Packit Service ac7b0b
			} while (p-- != startPosition);
Packit Service ac7b0b
			PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
Packit Service ac7b0b
			// show the list of ports that Mask corresponds to
Packit Service ac7b0b
			offset = sprintf(buf, "                Ports:");
Packit Service ac7b0b
			for (p=startPosition; p<=endPosition; ++p) {
Packit Service ac7b0b
				PORTMASK mask = pMCastFDB[p-startPosition].u.Multicast.MftBlock[i];
Packit Service ac7b0b
				if (mask) {
Packit Service ac7b0b
					uint8 bit;
Packit Service ac7b0b
					for (bit=0; bit
Packit Service ac7b0b
						if (mask & (1<
Packit Service ac7b0b
							if (offset > 70) {
Packit Service ac7b0b
								PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
								offset = sprintf(buf, "                      ");
Packit Service ac7b0b
							}
Packit Service ac7b0b
							offset += sprintf(&buf[offset], " %3u", p*MFT_BLOCK_WIDTH+bit);
Packit Service ac7b0b
						}
Packit Service ac7b0b
					}
Packit Service ac7b0b
				}
Packit Service ac7b0b
			}
Packit Service ac7b0b
			PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintVLArbTable(PrintDest_t *dest, int indent, const VLARBTABLE *pVLArbTable, uint8 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	uint8 base_index = 0;
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
Packit Service ac7b0b
	if (blockNum == 2 || blockNum == 4)
Packit Service ac7b0b
		base_index = IB_VLARBTABLE_SIZE;
Packit Service ac7b0b
	PrintFunc(dest, "%*s  Indx VL Weight\n", indent, "");
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// zero weight is a disabled entry
Packit Service ac7b0b
		if (pVLArbTable->ArbTable[i].Weight)
Packit Service ac7b0b
		{
Packit Service ac7b0b
			PrintFunc(dest, "%*s   %2d  %2u  %3u\n",
Packit Service ac7b0b
				indent, "", base_index+i,
Packit Service ac7b0b
				pVLArbTable->ArbTable[i].s.VL,
Packit Service ac7b0b
				pVLArbTable->ArbTable[i].Weight);
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintVLArbTableSmp(PrintDest_t *dest, int indent, const SMP *smp, NODE_TYPE nodetype)
Packit Service ac7b0b
{
Packit Service ac7b0b
	VLARBTABLE *pVLArbTable = (VLARBTABLE *)&(smp->SmpExt.DirectedRoute.SMPData);
Packit Service ac7b0b
	char buf[40] = "";
Packit Service ac7b0b
	uint32 block = smp->common.AttributeModifier >> 16;
Packit Service ac7b0b
Packit Service ac7b0b
	if (nodetype == STL_NODE_SW) {
Packit Service ac7b0b
Packit Service ac7b0b
		sprintf(buf, "OutputPort: %3u ", smp->common.AttributeModifier  & 0xffff);
Packit Service ac7b0b
	}
Packit Service ac7b0b
	PrintFunc(dest, "%*s%sBlockNum: %2u (%s)\n", indent, "",
Packit Service ac7b0b
					buf, block,
Packit Service ac7b0b
					block == 1?"Low Pri lower":
Packit Service ac7b0b
					block == 2?"Low Pri upper":
Packit Service ac7b0b
					block == 3?"High Pri lower":
Packit Service ac7b0b
					block == 4?"High Pri upper":
Packit Service ac7b0b
					"Unknown"
Packit Service ac7b0b
					);
Packit Service ac7b0b
	PrintVLArbTable(dest, indent, pVLArbTable, block);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintPKeyTable(PrintDest_t *dest, int indent, const PARTITION_TABLE *pPKeyTable, uint16 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	uint16 i;
Packit Service ac7b0b
	char buf[81];
Packit Service ac7b0b
	int offset=0;
Packit Service ac7b0b
	uint16 index = blockNum*PARTITION_TABLE_BLOCK_SIZE;
Packit Service ac7b0b
Packit Service ac7b0b
	// 8 entries per line
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		if (i%8 == 0) {
Packit Service ac7b0b
			if (i)
Packit Service ac7b0b
				PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
			offset=sprintf(buf, "   %4u-%4u:", i+index, i+7+index);
Packit Service ac7b0b
		}
Packit Service ac7b0b
		offset+=sprintf(&buf[offset], "  0x%04x", pPKeyTable->PartitionTableBlock[i].AsInt16);
Packit Service ac7b0b
	}
Packit Service ac7b0b
	PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintPKeyTableSmp(PrintDest_t *dest, int indent, const SMP *smp, NODE_TYPE nodetype, boolean showHeading, boolean showBlock)
Packit Service ac7b0b
{
Packit Service ac7b0b
	PARTITION_TABLE *pPKeyTable = (PARTITION_TABLE *)&(smp->SmpExt.DirectedRoute.SMPData);
Packit Service ac7b0b
	char buf[40] = "";
Packit Service ac7b0b
	uint32 block = smp->common.AttributeModifier & 0xffff;
Packit Service ac7b0b
Packit Service ac7b0b
	if (showHeading) {
Packit Service ac7b0b
		if (nodetype == STL_NODE_SW)
Packit Service ac7b0b
			sprintf(buf, "OutputPort: %3u ", smp->common.AttributeModifier >> 16);
Packit Service ac7b0b
		if (showBlock)
Packit Service ac7b0b
			PrintFunc(dest, "%*s%sBlockNum: %2u\n", indent, "", buf, block);
Packit Service ac7b0b
		else if (buf[0])
Packit Service ac7b0b
			PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
	}
Packit Service ac7b0b
	PrintPKeyTable(dest, indent, pPKeyTable, block);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintGuidInfo(PrintDest_t *dest, int indent, const GUID_INFO *pGuidInfo, uint8 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
	char buf[81];
Packit Service ac7b0b
	int offset=0;
Packit Service ac7b0b
	uint16 index = blockNum*GUID_INFO_BLOCK_SIZE;
Packit Service ac7b0b
Packit Service ac7b0b
	// 2 entries per line
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		if (i%2 == 0) {
Packit Service ac7b0b
			if (i)
Packit Service ac7b0b
				PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
			offset=sprintf(buf, "   %4u-%4u:", i+index, i+1+index);
Packit Service ac7b0b
		}
Packit Service ac7b0b
		offset+=sprintf(&buf[offset], "  0x%016"PRIx64"", pGuidInfo->Gid[i]);
Packit Service ac7b0b
	}
Packit Service ac7b0b
	PrintFunc(dest, "%*s%s\n", indent, "", buf);
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintPortGroupTable(PrintDest_t *dest, int indent, const PORT_GROUP_TABLE *pPortGroup, uint16 tier, uint16 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	int i;
Packit Service ac7b0b
	uint baseport = (blockNum & 0xff)*PGTABLE_LIST_COUNT;
Packit Service ac7b0b
Packit Service ac7b0b
	PrintFunc(dest, "%*s Adaptive Routing Port Group (Tier= %d):\n", indent, "", tier);
Packit Service ac7b0b
	for (i=0; i
Packit Service ac7b0b
	{
Packit Service ac7b0b
		// zero is invalid port group id, indicates an unused table entry
Packit Service ac7b0b
		if (pPortGroup->PortGroup[i] != 0) {
Packit Service ac7b0b
			PrintFunc(dest, "%*s  Port %5u -> PortGroup %5u\n",
Packit Service ac7b0b
				indent, "", baseport + i,
Packit Service ac7b0b
				pPortGroup->PortGroup[i]);
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintAdaptiveRoutingLidmask(PrintDest_t *dest, int indent, const ADAPTIVE_ROUTING_LIDMASK *pLidmask, uint16 blockNum)
Packit Service ac7b0b
{
Packit Service ac7b0b
	char	string[256];
Packit Service ac7b0b
	char	str[32];
Packit Service ac7b0b
	int		i,j;
Packit Service ac7b0b
	uint8_t	lidmask;
Packit Service ac7b0b
 	IB_LID	curlid;
Packit Service ac7b0b
 	IB_LID  baselid = blockNum*(LIDMASK_LEN*8);
Packit Service ac7b0b
	int		firstdone = 0;
Packit Service ac7b0b
	int		first = 0;
Packit Service ac7b0b
	int		next = 0;
Packit Service ac7b0b
Packit Service ac7b0b
	string[0] = '\0';
Packit Service ac7b0b
	for (i=LIDMASK_LEN-1; i>=0; i--)
Packit Service ac7b0b
	{ 
Packit Service ac7b0b
		if (pLidmask->lidmask[i]) {
Packit Service ac7b0b
			lidmask = pLidmask->lidmask[i];
Packit Service ac7b0b
			for (j=0; j<8; j++) {
Packit Service ac7b0b
				if (lidmask & (1<
Packit Service ac7b0b
					if (strlen(string) > 80) {
Packit Service ac7b0b
						strcat(string, ",");
Packit Service ac7b0b
						PrintFunc(dest, "%*s %s\n", indent, "", string);
Packit Service ac7b0b
						string[0] = '\0';
Packit Service ac7b0b
						firstdone = 0;
Packit Service ac7b0b
					}
Packit Service ac7b0b
					curlid = baselid+j;
Packit Service ac7b0b
					if (!first) {
Packit Service ac7b0b
						first = curlid;
Packit Service ac7b0b
					} else if (!next) {
Packit Service ac7b0b
						if (curlid - first > 1) {
Packit Service ac7b0b
							if (!firstdone) {
Packit Service ac7b0b
								sprintf(str, "0x%x", first);
Packit Service ac7b0b
								firstdone = 1;
Packit Service ac7b0b
							} else {
Packit Service ac7b0b
                                sprintf(str, ",0x%x", first);
Packit Service ac7b0b
							}
Packit Service ac7b0b
							strcat(string, str);
Packit Service ac7b0b
							first = curlid;
Packit Service ac7b0b
						} else {
Packit Service ac7b0b
							next = curlid;
Packit Service ac7b0b
						}
Packit Service ac7b0b
					} else {
Packit Service ac7b0b
						if (curlid - next > 1) {
Packit Service ac7b0b
							if (!firstdone) {
Packit Service ac7b0b
								sprintf(str, "0x%x-0x%x", first, next);
Packit Service ac7b0b
								firstdone = 1;
Packit Service ac7b0b
							} else {
Packit Service ac7b0b
								sprintf(str, ",0x%x-0x%x", first, next);
Packit Service ac7b0b
							}
Packit Service ac7b0b
							strcat(string, str);
Packit Service ac7b0b
							first = curlid;
Packit Service ac7b0b
							next = 0;
Packit Service ac7b0b
						} else {
Packit Service ac7b0b
							next = curlid;
Packit Service ac7b0b
						}
Packit Service ac7b0b
					}
Packit Service ac7b0b
				}
Packit Service ac7b0b
			}
Packit Service ac7b0b
		}
Packit Service ac7b0b
		baselid+=8;
Packit Service ac7b0b
	}
Packit Service ac7b0b
Packit Service ac7b0b
	if (first) {
Packit Service ac7b0b
		if (!firstdone) {
Packit Service ac7b0b
			sprintf(str, "0x%x", first);
Packit Service ac7b0b
			strcat(string, str);
Packit Service ac7b0b
		} else {
Packit Service ac7b0b
			sprintf(str, ",0x%x", first);
Packit Service ac7b0b
			strcat(string, str);
Packit Service ac7b0b
		}
Packit Service ac7b0b
		if (next) {
Packit Service ac7b0b
			sprintf(str, "-0x%x", next);
Packit Service ac7b0b
			strcat(string, str);
Packit Service ac7b0b
		}
Packit Service ac7b0b
	}
Packit Service ac7b0b
	if (strlen(string) > 0) {
Packit Service ac7b0b
		PrintFunc(dest, "%*s %s\n", indent, "", string);
Packit Service ac7b0b
	}
Packit Service ac7b0b
}
Packit Service ac7b0b
Packit Service ac7b0b
void PrintSmp(PrintDest_t *dest, int indent, const SMP *smp)
Packit Service ac7b0b
{
Packit Service ac7b0b
	PrintSmpHeader(dest, indent, smp);
Packit Service ac7b0b
	switch (smp->common.AttributeID) {
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_NODE_DESCRIPTION:
Packit Service ac7b0b
		PrintNodeDesc(dest, indent, (const NODE_DESCRIPTION *)&smp->SmpExt.DirectedRoute.SMPData);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_NODE_INFO:
Packit Service ac7b0b
		PrintNodeInfo(dest, indent, (const NODE_INFO *)&smp->SmpExt.DirectedRoute.SMPData);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_SWITCH_INFO:
Packit Service ac7b0b
		PrintSwitchInfo(dest, indent, (const SWITCH_INFO *)&smp->SmpExt.DirectedRoute.SMPData, 0);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_GUID_INFO:
Packit Service ac7b0b
		PrintGuidInfo(dest, indent, (const GUID_INFO *)&smp->SmpExt.DirectedRoute.SMPData, smp->common.AttributeModifier);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_PORT_INFO:
Packit Service ac7b0b
		PrintPortInfoSmp(dest, indent, smp, 0);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_PART_TABLE:
Packit Service ac7b0b
		PrintPKeyTableSmp(dest, indent, smp,
Packit Service ac7b0b
			(smp->common.AttributeModifier >> 16)?STL_NODE_SW:0, TRUE, TRUE);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_VL_ARBITRATION:
Packit Service ac7b0b
		PrintVLArbTableSmp(dest, indent, smp, 
Packit Service ac7b0b
			(smp->common.AttributeModifier &0xffff)?STL_NODE_SW:0);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_LINEAR_FWD_TABLE:
Packit Service ac7b0b
		PrintLinearFDB(dest, indent,
Packit Service ac7b0b
				(const FORWARDING_TABLE *)&smp->SmpExt.DirectedRoute.SMPData,
Packit Service ac7b0b
				smp->common.AttributeModifier & 0xffff);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_RANDOM_FWD_TABLE:
Packit Service ac7b0b
		PrintRandomFDB(dest, indent,
Packit Service ac7b0b
				(const FORWARDING_TABLE *)&smp->SmpExt.DirectedRoute.SMPData,
Packit Service ac7b0b
				smp->common.AttributeModifier);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_MCAST_FWD_TABLE:
Packit Service ac7b0b
		PrintMCastFDBSmp(dest, indent, smp);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_SM_INFO:
Packit Service ac7b0b
		PrintSMInfo(dest, indent, (const SM_INFO *)&smp->SmpExt.DirectedRoute.SMPData, 0);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_VENDOR_DIAG:
Packit Service ac7b0b
		// TBD Hex Dump
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_LED_INFO:
Packit Service ac7b0b
		// TBD Hex Dump
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_PORT_LFT:
Packit Service ac7b0b
		PrintLinearFDB(dest, indent,
Packit Service ac7b0b
				(const FORWARDING_TABLE *)&smp->SmpExt.DirectedRoute.SMPData,
Packit Service ac7b0b
				smp->common.AttributeModifier & 0xffff);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_PORT_GROUP:
Packit Service ac7b0b
		PrintPortGroupTable(dest, indent, 
Packit Service ac7b0b
			(const PORT_GROUP_TABLE *)&smp->SmpExt.DirectedRoute.SMPData,
Packit Service ac7b0b
			smp->common.AttributeModifier >>16,
Packit Service ac7b0b
			smp->common.AttributeModifier & 0xffff);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	case MCLASS_ATTRIB_ID_AR_LIDMASK:
Packit Service ac7b0b
		PrintAdaptiveRoutingLidmask(dest, indent, 
Packit Service ac7b0b
			(const ADAPTIVE_ROUTING_LIDMASK *)&smp->SmpExt.DirectedRoute.SMPData,
Packit Service ac7b0b
			//smp->common.AttributeModifier >>17,
Packit Service ac7b0b
			smp->common.AttributeModifier & 0xffff);
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	default:
Packit Service ac7b0b
		// TBD Hex Dump
Packit Service ac7b0b
		break;
Packit Service ac7b0b
	}
Packit Service ac7b0b
}