Blame Xml/ixml_ib.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
/* [ICS VERSION STRING: unknown] */
Packit 857059
Packit 857059
#include <iba/ipublic.h>
Packit 857059
#if !defined(VXWORKS) || defined(BUILD_DMC)
Packit 857059
#include <iba/ib_dm.h>
Packit 857059
#endif
Packit 857059
#include <iba/ib_sm_priv.h>
Packit 857059
#include <iba/ib_sa_records_priv.h>
Packit 857059
#include "iba/stl_sa_priv.h"
Packit 857059
#include "iba/stl_pm.h"
Packit 857059
#if defined(USE_NETF1_IP_STACK)
Packit 857059
/* add this to avoid implicit declaration warning in mips/netf1 build */
Packit 857059
extern int snprintf (char *str, size_t count, const char *fmt, ...);
Packit 857059
#endif
Packit 857059
#include "iba/stl_helper.h"
Packit 857059
#include <stdio.h>
Packit 857059
#include <stdlib.h>
Packit 857059
#include <stdarg.h>
Packit 857059
#include <unistd.h>
Packit 857059
#include <ctype.h>
Packit 857059
#include <errno.h>
Packit 857059
#define _GNU_SOURCE
Packit 857059
Packit 857059
#include "ixml_ib.h"
Packit 857059
Packit 857059
#ifdef VXWORKS
Packit 857059
#include "bspcommon/h/icsBspUtil.h"
Packit 857059
#endif
Packit 857059
Packit 857059
/* should be defined in ib_dm.h */
Packit 857059
#ifndef IOC_IDSTRING_SIZE
Packit 857059
#define IOC_IDSTRING_SIZE 64
Packit 857059
#endif
Packit 857059
#ifndef IOC_SERVICE_NAME_SIZE
Packit 857059
#define IOC_SERVICE_NAME_SIZE 40
Packit 857059
#endif
Packit 857059
Packit 857059
#ifndef SCNx8
Packit 857059
#define SCNx8 "x"
Packit 857059
#endif
Packit 857059
Packit 857059
/* sometimes a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputLIDValue(IXmlOutputState_t *state, const char *tag, STL_LID value)
Packit 857059
{
Packit 857059
	IXmlOutputHexPad32(state, tag, value);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalLIDValue(IXmlOutputState_t *state, const char *tag, STL_LID value)
Packit 857059
{
Packit 857059
	if (value)
Packit 857059
		IXmlOutputLIDValue(state, tag, value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputLID(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputHexPad32(state, tag, *(STL_LID*)data);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalLID(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalHexPad32(state, tag, *(STL_LID*)data);
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
void IXmlOutputPKey(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputHexPad16(state, tag, (*(STL_PKEY_ELEMENT*)data).AsReg16);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPKey(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalHexPad16(state, tag, (*(STL_PKEY_ELEMENT*)data).AsReg16);
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
void IXmlOutputGID(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputPrintIndent(state, "<%s>0x%016"PRIx64":0x%016"PRIx64"</%s>\n", tag,
Packit 857059
				((IB_GID*)data)->AsReg64s.H,
Packit 857059
				((IB_GID*)data)->AsReg64s.L, tag);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalGID(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	if (0ULL != ((IB_GID*)data)->AsReg64s.H || 0ULL != ((IB_GID*)data)->AsReg64s.L)
Packit 857059
		IXmlOutputGID(state, tag, data);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputNodeType(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, StlNodeTypeToText(*(uint8*)data), *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputOptionalNodeType(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, StlNodeTypeToText(*(uint8*)data), *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
// parse NodeType string into a uint8 field and validate value
Packit 857059
void IXmlParserEndNodeType(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (0 == strcasecmp(content, "FI")) {
Packit 857059
		value = STL_NODE_FI;
Packit 857059
	} else if (0 == strcasecmp(content, "SW")) {
Packit 857059
		value = STL_NODE_SW;
Packit 857059
	} else {
Packit 857059
		IXmlParserPrintError(state, "Invalid Node type: '%s'  Must be FI or SW", content);
Packit 857059
		goto fail;
Packit 857059
	}
Packit 857059
	ASSERT(field->size == 1);
Packit 857059
	*(uint8 *)IXmlParserGetField(field, object) = value;
Packit 857059
fail:
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
// parse NodeType_Int into a uint8 field and validate value
Packit 857059
void IXmlParserEndNodeType_Int(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (IXmlParseUint8(state, content, len, &value)) {
Packit 857059
		if (value != STL_NODE_FI
Packit 857059
			&& value != STL_NODE_SW) {
Packit 857059
			IXmlParserPrintError(state, "Invalid Node type: %u  Must be (FI or SW): %u or %u", value, STL_NODE_FI, STL_NODE_SW);
Packit 857059
		} else {
Packit 857059
			ASSERT(field->size == 1);
Packit 857059
			*(uint8 *)IXmlParserGetField(field, object) = value;
Packit 857059
		}
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
void IXmlOutputNodeDesc(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStrLen(state, tag, (const char*)data, NODE_DESCRIPTION_ARRAY_SIZE);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != ""
Packit 857059
void IXmlOutputOptionalNodeDesc(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrLen(state, tag, (const char*)data, NODE_DESCRIPTION_ARRAY_SIZE);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputIocIDString(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStrLen(state, tag, (const char*)data, IOC_IDSTRING_SIZE);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != ""
Packit 857059
void IXmlOutputOptionalIocIDString(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrLen(state, tag, (const char*)data, IOC_IDSTRING_SIZE);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputServiceName(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStrLen(state, tag, (const char*)data, IOC_SERVICE_NAME_SIZE);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != ""
Packit 857059
void IXmlOutputOptionalServiceName(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrLen(state, tag, (const char*)data, IOC_SERVICE_NAME_SIZE);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputPortStateValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, StlPortStateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPortStateValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, IbPortStateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputPortState(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputPortStateValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPortState(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalPortStateValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
/* link init reason */
Packit 857059
void IXmlOutputInitReasonValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, StlLinkInitReasonToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputOptionalInitReasonValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, StlLinkInitReasonToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputInitReason(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputInitReasonValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputOptionalInitReason(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalInitReasonValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
/* link down reason */
Packit 857059
void IXmlOutputDownReasonValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, StlLinkDownReasonToText(value), value);
Packit 857059
}
Packit 857059
void IXmlOutputOptionalDownReasonValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, StlLinkDownReasonToText(value), value);
Packit 857059
}
Packit 857059
void IXmlOutputDownReason(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputDownReasonValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
void IXmlOutputOptionalDownReason(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalDownReasonValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputPortPhysStateValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, StlPortPhysStateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPortPhysStateValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, StlPortPhysStateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputPortPhysState(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputPortPhysStateValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPortPhysState(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalPortPhysStateValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputPortDownDefaultValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, IbPortDownDefaultToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPortDownDefaultValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, IbPortDownDefaultToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputPortDownDefault(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputPortDownDefaultValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalPortDownDefault(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalPortDownDefaultValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputMKeyProtectValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, IbMKeyProtectToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputMKeyProtect(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputMKeyProtectValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputRateValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, StlStaticRateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalRateValue(IXmlOutputState_t *state, const char *tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStrUint(state, tag, StlStaticRateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputRate(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputRateValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalRate(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalRateValue(state, tag, *(uint8 *)data);
Packit 857059
}
Packit 857059
Packit 857059
// parse rates to uint8 multiplier string - validate rate inputs
Packit 857059
boolean IXmlParseRateMult_Str(IXmlParserState_t *state, XML_Char *content, uint8 *value)
Packit 857059
{
Packit 857059
	if (!content || strlen(content) == 0) {
Packit 857059
		IXmlParserPrintError(state, "Empty contents");
Packit 857059
		return FALSE;
Packit 857059
	}
Packit 857059
Packit 857059
	// skip whitespace
Packit 857059
	while (isspace(*content)) {
Packit 857059
		content++;
Packit 857059
	}
Packit 857059
Packit 857059
	if (0 == strcasecmp(content, "25g") || 0 == strcasecmp(content, "25")) {
Packit 857059
		*value = IB_STATIC_RATE_25G;
Packit 857059
	} else if (0 == strcasecmp(content, "50g") || 0 == strcasecmp(content, "50")) {
Packit 857059
		*value = IB_STATIC_RATE_56G; // STL_STATIC_RATE_50G
Packit 857059
	} else if (0 == strcasecmp(content, "12.5g") || 0 == strcasecmp(content, "12.5")) {
Packit 857059
		*value = IB_STATIC_RATE_14G; // STL_STATIC_RATE_12_5G
Packit 857059
	} else if (0 == strcasecmp(content, "37.5g") || 0 == strcasecmp(content, "37.5")) {
Packit 857059
		*value = IB_STATIC_RATE_40G; // STL_STATIC_RATE_37_5G
Packit 857059
	} else if (0 == strcasecmp(content, "75g") || 0 == strcasecmp(content, "75")) {
Packit 857059
		*value = IB_STATIC_RATE_80G; // STL_STATIC_RATE_75G
Packit 857059
	} else if (0 == strcasecmp(content, "100g") || 0 == strcasecmp(content, "100")) {
Packit 857059
		*value = IB_STATIC_RATE_100G;
Packit 857059
#if 0
Packit 857059
	// future
Packit 857059
	} else if (0 == strcasecmp(content, "225g") || 0 == strcasecmp(content, "250")) {
Packit 857059
		*value = STL_STATIC_RATE_225G;
Packit 857059
	} else if (0 == strcasecmp(content, "300g") || 0 == strcasecmp(content, "300")) {
Packit 857059
		*value = IB_STATIC_RATE_300G;
Packit 857059
	} else if (0 == strcasecmp(content, "400g") || 0 == strcasecmp(content, "400")) {
Packit 857059
		*value = STL_STATIC_RATE_400G;
Packit 857059
#endif
Packit 857059
	} else {
Packit 857059
		IXmlParserPrintError(state, "Invalid Rate: '%s'  Must be 25g, 50g, 75g, 100g", content);
Packit 857059
		return FALSE;
Packit 857059
	}
Packit 857059
	return TRUE;
Packit 857059
}
Packit 857059
Packit 857059
// parse Rate string into a uint8 field and validate value
Packit 857059
void IXmlParserEndRate(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (0 == strcasecmp(content, "12.5g") || 0 == strcasecmp(content, "12.5")) {
Packit 857059
		value = IB_STATIC_RATE_14G; // STL_STATIC_RATE_12_5G
Packit 857059
	} else if (0 == strcasecmp(content, "25g") || 0 == strcasecmp(content, "25")) {
Packit 857059
		value = IB_STATIC_RATE_25G;
Packit 857059
	} else if (0 == strcasecmp(content, "37.5g") || 0 == strcasecmp(content, "37.5")) {
Packit 857059
		value = IB_STATIC_RATE_40G; // STL_STATIC_RATE_37_5G
Packit 857059
	} else if (0 == strcasecmp(content, "50g") || 0 == strcasecmp(content, "50")) {
Packit 857059
		value = IB_STATIC_RATE_56G; // STL_STATIC_RATE_50G
Packit 857059
	} else if (0 == strcasecmp(content, "75g") || 0 == strcasecmp(content, "75")) {
Packit 857059
		value = IB_STATIC_RATE_80G; // STL_STATIC_RATE_75G
Packit 857059
	} else if (0 == strcasecmp(content, "100g") || 0 == strcasecmp(content, "100")) {
Packit 857059
		value = IB_STATIC_RATE_100G;
Packit 857059
#if 0
Packit 857059
	// future
Packit 857059
	} else if (0 == strcasecmp(content, "200g") || 0 == strcasecmp(content, "200")) {
Packit 857059
		value = IB_STATIC_RATE_200G;
Packit 857059
	} else if (0 == strcasecmp(content, "225g") || 0 == strcasecmp(content, "225")) {
Packit 857059
		value = STL_STATIC_RATE_225G;
Packit 857059
	} else if (0 == strcasecmp(content, "300g") || 0 == strcasecmp(content, "300")) {
Packit 857059
		value = IB_STATIC_RATE_300G;
Packit 857059
	} else if (0 == strcasecmp(content, "400g") || 0 == strcasecmp(content, "400")) {
Packit 857059
		value = STL_STATIC_RATE_400G;
Packit 857059
#endif
Packit 857059
	} else {
Packit 857059
		IXmlParserPrintError(state, "Invalid Rate: '%s'  Must be 12.5g, 25g, 37.5g, 50g, 75g, 100g", content);
Packit 857059
		goto fail;
Packit 857059
	}
Packit 857059
	ASSERT(field->size == 1);
Packit 857059
	*(uint8 *)IXmlParserGetField(field, object) = value;
Packit 857059
fail:
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
// parse Rate_Int into a uint8 field and validate value
Packit 857059
void IXmlParserEndRate_Int(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (IXmlParseUint8(state, content, len, &value)) {
Packit 857059
		if (value != IB_STATIC_RATE_14G && value != IB_STATIC_RATE_25G
Packit 857059
			&& value != IB_STATIC_RATE_40G && value != IB_STATIC_RATE_80G
Packit 857059
			&& value != IB_STATIC_RATE_56G && value != IB_STATIC_RATE_100G ) {
Packit 857059
			IXmlParserPrintError(state, "Invalid Rate: %u  Must be (12.5g, 25g, 37.5g, 50g, 75g, 100g): %u, %u, %u, %u, %u, %u", value,
Packit 857059
					IB_STATIC_RATE_14G, IB_STATIC_RATE_25G, 
Packit 857059
					IB_STATIC_RATE_40G, IB_STATIC_RATE_56G,
Packit 857059
					IB_STATIC_RATE_80G, IB_STATIC_RATE_100G ); 
Packit 857059
		} else {
Packit 857059
			ASSERT(field->size == 1);
Packit 857059
			*(uint8 *)IXmlParserGetField(field, object) = value;
Packit 857059
		}
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputLinkWidthValue(IXmlOutputState_t *state, const char* tag, uint16 value)
Packit 857059
{
Packit 857059
	char tempBuf[64];
Packit 857059
	IXmlOutputStrUint(state, tag, StlLinkWidthToText(value, tempBuf, sizeof(tempBuf)), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputLinkWidth(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	char tempBuf[64];
Packit 857059
	IXmlOutputStrUint(state, tag, StlLinkWidthToText(*(uint16*)data, tempBuf, sizeof(tempBuf)), *(uint16*)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputLinkSpeedValue(IXmlOutputState_t *state, const char* tag, uint16 value)
Packit 857059
{
Packit 857059
	char tempBuf[64];
Packit 857059
	IXmlOutputStrUint(state, tag, StlLinkSpeedToText(value, tempBuf, sizeof(tempBuf)), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputLinkSpeed(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	char tempBuf[64];
Packit 857059
	IXmlOutputStrUint(state, tag, StlLinkSpeedToText(*(uint16*)data, tempBuf, sizeof(tempBuf)), *(uint16*)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputMtuValue(IXmlOutputState_t *state, const char* tag, uint16 value)
Packit 857059
{
Packit 857059
	IXmlOutputUint(state, tag, GetBytesFromMtu(value));
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalMtuValue(IXmlOutputState_t *state, const char* tag, uint16 value)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalUint(state, tag, GetBytesFromMtu(value));
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputMtu(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputUint(state, tag, GetBytesFromMtu(*(uint8*)data));
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalMtu(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalUint(state, tag, GetBytesFromMtu(*(uint8*)data));
Packit 857059
}
Packit 857059
Packit 857059
// parse Mtu field, validate value and store as an IB_MTU
Packit 857059
void IXmlParserEndMtu(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint16 value;
Packit 857059
	
Packit 857059
	if (IXmlParseUint16(state, content, len, &value)) {
Packit 857059
		if (value != 256 && value != 512 && value != 1024
Packit 857059
			&& value != 2048 && value != 4096 && value != 8192 && value != 10240) {
Packit 857059
			IXmlParserPrintError(state, "Invalid Mtu: %u  Must be (256, 512, 1024, 2048, 4096, 8192, or 10240)", value);
Packit 857059
		} else {
Packit 857059
			ASSERT(field->size == 1);
Packit 857059
			*(uint8 *)IXmlParserGetField(field, object) = GetMtuFromBytes(value);
Packit 857059
		}
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
void IXmlOutputVLsValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	char buf[8];
Packit 857059
Packit 857059
	snprintf(buf, sizeof(buf), "%u+1", value);
Packit 857059
	IXmlOutputStrUint(state, tag, buf, value);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalVLsValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	if (value)
Packit 857059
		IXmlOutputVLsValue(state, tag, value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputVLs(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputVLsValue(state, tag, *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != 0
Packit 857059
void IXmlOutputOptionalVLs(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalVLsValue(state, tag, *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputInitTypeValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	char buf[80];
Packit 857059
 
Packit 857059
	snprintf(buf, 80, "%s%s%s%s",
Packit 857059
		value & PORT_INIT_TYPE_NOLOAD?"NL ": "",
Packit 857059
		value & PORT_INIT_TYPE_PRESERVE_CONTENT?"PC ": "",
Packit 857059
		value & PORT_INIT_TYPE_PRESERVE_PRESENCE?"PP ": "",
Packit 857059
		value & PORT_INIT_TYPE_DO_NOT_RESUSCITATE?"NR ": "");
Packit 857059
Packit 857059
	IXmlOutputStrUint(state, tag, buf, value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputInitType(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputInitTypeValue(state, tag, *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputTimeoutMultValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	char buf[8];
Packit 857059
	FormatTimeoutMult(buf, value);
Packit 857059
	IXmlOutputStrUint(state, tag, buf, value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputTimeoutMult(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputTimeoutMultValue(state, tag, *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputHOQLifeValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	char buf[9];
Packit 857059
	if (value > IB_LIFETIME_MAX) {
Packit 857059
		memcpy(buf, "Infinite", 9);
Packit 857059
	} else {
Packit 857059
		FormatTimeoutMult(buf, value);
Packit 857059
	}
Packit 857059
	IXmlOutputStrUint(state, tag, buf, value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputHOQLife(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputHOQLifeValue(state, tag, *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputIPAddrIPV6(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	int i;
Packit 857059
	IXmlOutputStartTag(state, tag);
Packit 857059
	for (i = 0; i < 16; ++i){
Packit 857059
		IXmlOutputPrint(state, "%02x", ((STL_IPV6_IP_ADDR *)data)->addr[i]);
Packit 857059
	}
Packit 857059
	IXmlOutputEndTag(state, tag);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputIPAddrIPV4(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	int i;
Packit 857059
	IXmlOutputStartTag(state, tag);
Packit 857059
	for (i = 0; i < 4; ++i){
Packit 857059
		IXmlOutputPrint(state, "%02x", ((STL_IPV4_IP_ADDR *)data)->addr[i]);
Packit 857059
	}
Packit 857059
	IXmlOutputEndTag(state, tag);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlParserEndIPAddrIPV6(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	int i, ret;
Packit 857059
	for (i = 0; i < 16; ++i){//read in hexadecimal address 2 digits at a time
Packit 857059
		ret = sscanf((char *)(content + 2*i), "%2"SCNx8, &(((STL_IPV6_IP_ADDR *)IXmlParserGetField(field, object))->addr[i]));
Packit 857059
		if (ret != 1){
Packit 857059
			IXmlParserPrintError(state, "Error parsing IPV6 address:%s", strerror(errno));
Packit 857059
			break;
Packit 857059
		}
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
void IXmlParserEndIPAddrIPV4(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	int i, ret;
Packit 857059
	for (i = 0; i < 4; ++i){ //read in hexadecimal address 2 digits at a time
Packit 857059
		ret = sscanf((char *)(content + 2*i), "%2"SCNx8, &(((STL_IPV4_IP_ADDR *)IXmlParserGetField(field, object))->addr[i]));
Packit 857059
		if (ret != 1){
Packit 857059
			IXmlParserPrintError(state, "Error parsing IPV4 address:%s", strerror(errno));
Packit 857059
			break;
Packit 857059
		}
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
// parse TimeoutMult string into a uint8 field and validate value
Packit 857059
// does not handle "infinite".  Returns value between 0 and 31 inclusive
Packit 857059
boolean IXmlParseTimeoutMult_Str(IXmlParserState_t *state, XML_Char *content, unsigned len, uint8 *value)
Packit 857059
{
Packit 857059
	char *endptr = NULL;
Packit 857059
	uint64 temp;
Packit 857059
	FSTATUS status;
Packit 857059
Packit 857059
	if (! len) {
Packit 857059
		IXmlParserPrintError(state, "Empty contents");
Packit 857059
		return FALSE;
Packit 857059
	}
Packit 857059
	status = StringToUint64(&temp, content, &endptr, 0, TRUE /*skip_trail_whitespace */);
Packit 857059
	if (status == FINVALID_SETTING) {
Packit 857059
		IXmlParserPrintError(state, "Numeric Value too large for field: %s", content);
Packit 857059
		return FALSE;
Packit 857059
	} else if (status != FSUCCESS) {
Packit 857059
		IXmlParserPrintError(state, "Invalid contents: %s", content);
Packit 857059
		return FALSE;
Packit 857059
	} else if (*endptr == '\0') {
Packit 857059
		IXmlParserPrintError(state, "Invalid contents, no units: %s", content);
Packit 857059
		return FALSE;
Packit 857059
	}
Packit 857059
Packit 857059
	// now parse units
Packit 857059
	content = endptr;
Packit 857059
	// we round up to next valid multiplier
Packit 857059
	// values over 2.4 hours get the max multiplier
Packit 857059
	if (strncasecmp(content,"ns",2) == 0) {
Packit 857059
		content += 2;
Packit 857059
		temp = TimeoutTimeToMult(temp/1000);
Packit 857059
	} else if (strncasecmp(content,"us",2) == 0) {
Packit 857059
		content += 2;
Packit 857059
		temp = TimeoutTimeToMult(temp);
Packit 857059
	} else if (strncasecmp(content,"ms",2) == 0) {
Packit 857059
		content += 2;
Packit 857059
		if (temp >= IB_MAX_TIMEOUT_MULT_MS)
Packit 857059
			temp = 31;
Packit 857059
		else
Packit 857059
			temp = TimeoutTimeMsToMult((uint32)temp);
Packit 857059
	} else if (strncasecmp(content,"s",1) == 0) {
Packit 857059
		content++;
Packit 857059
		if (temp >= IB_MAX_TIMEOUT_MULT_MS/1000)
Packit 857059
			temp = 31;
Packit 857059
		else
Packit 857059
			temp = TimeoutTimeMsToMult(temp*1000);
Packit 857059
	} else if (strncasecmp(content,"m",1) == 0) {
Packit 857059
		content++;
Packit 857059
		if (temp >= IB_MAX_TIMEOUT_MULT_MS/(60*1000))
Packit 857059
			temp = 31;
Packit 857059
		else
Packit 857059
			temp = TimeoutTimeMsToMult(temp*60*1000);
Packit 857059
	} else if (strncasecmp(content,"h",1) == 0) {
Packit 857059
		content++;
Packit 857059
		if (temp >= IB_MAX_TIMEOUT_MULT_MS/(60*60*1000))
Packit 857059
			temp = 31;
Packit 857059
		else
Packit 857059
			temp = TimeoutTimeMsToMult(temp*60*60*1000);
Packit 857059
	} else {
Packit 857059
		IXmlParserPrintError(state, "Invalid contents, invalid units: %s", content);
Packit 857059
		return FALSE;
Packit 857059
	}
Packit 857059
	
Packit 857059
	// make sure rest is trailing whitespace
Packit 857059
	while (isspace(*content))
Packit 857059
		content++;
Packit 857059
	if (*content != '\0')
Packit 857059
		goto fail;
Packit 857059
	*value = (uint8)temp;
Packit 857059
	return TRUE;
Packit 857059
fail:
Packit 857059
	IXmlParserPrintError(state, "Invalid contents, invalid text after units: %s", content);
Packit 857059
	return FALSE;
Packit 857059
}
Packit 857059
Packit 857059
// parse TimeoutMult string into a uint8 field and validate value
Packit 857059
// does not handle "infinite".  Returns value between 0 and 31 inclusive
Packit 857059
void IXmlParserEndTimeoutMult_Str(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (! IXmlParseTimeoutMult_Str(state, content, len, &value))
Packit 857059
		goto fail;
Packit 857059
	ASSERT(field->size == 1);
Packit 857059
	*(uint8 *)IXmlParserGetField(field, object) = value;
Packit 857059
fail:
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
// parse TimeoutMult string into a uint32 field and validate value
Packit 857059
// does not handle "infinite".  Returns value between 0 and 31 inclusive
Packit 857059
void IXmlParserEndTimeoutMult32_Str(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (! IXmlParseTimeoutMult_Str(state, content, len, &value))
Packit 857059
		goto fail;
Packit 857059
	ASSERT(field->size == 4);
Packit 857059
	*(uint32 *)IXmlParserGetField(field, object) = value;
Packit 857059
fail:
Packit 857059
	return;
Packit 857059
}
Packit 857059
Packit 857059
// parse TimeoutMult string into a uint8 field and validate value
Packit 857059
// treat "infinite" or multipliers > IB_LIFETIME_MAX as IB_LIFETIME_MAX+1
Packit 857059
boolean IXmlParseTimeoutMultInf_Str(IXmlParserState_t *state, XML_Char *content, unsigned len, uint8 *value)
Packit 857059
{
Packit 857059
	XML_Char *p = content;
Packit 857059
Packit 857059
	if (! len) {
Packit 857059
		IXmlParserPrintError(state, "Empty contents");
Packit 857059
		return FALSE;
Packit 857059
	}
Packit 857059
	// ignore leading whitespace
Packit 857059
	while (isspace(*content)) {
Packit 857059
		content++;
Packit 857059
	}
Packit 857059
	if (strncasecmp(content,"infinite",8) == 0) {
Packit 857059
		content += 8;
Packit 857059
		// make sure rest is trailing whitespace
Packit 857059
		while (isspace(*content))
Packit 857059
			content++;
Packit 857059
		if (*content != '\0')
Packit 857059
			goto fail;
Packit 857059
		*value = IB_LIFETIME_MAX+1;
Packit 857059
		return TRUE;
Packit 857059
	} else {
Packit 857059
		uint8 temp;
Packit 857059
		if (! IXmlParseTimeoutMult_Str(state, content, len, &temp))
Packit 857059
			return FALSE;
Packit 857059
		if (temp > IB_LIFETIME_MAX)
Packit 857059
			temp = IB_LIFETIME_MAX+1;
Packit 857059
		*value = temp;
Packit 857059
		return TRUE;
Packit 857059
	}
Packit 857059
fail:
Packit 857059
	IXmlParserPrintError(state, "Invalid contents: %s", p);
Packit 857059
	return FALSE;
Packit 857059
}
Packit 857059
Packit 857059
void IXmlParserEndHoqTimeout_Str(IXmlParserState_t *state,
Packit 857059
	const IXML_FIELD *field, void *object, void *parent, XML_Char *content,
Packit 857059
	unsigned int len, boolean valid)
Packit 857059
{
Packit 857059
	uint8_t value;
Packit 857059
	if (!IXmlParseTimeoutMultInf_Str(state, content, len, &value)) {
Packit 857059
		return;
Packit 857059
	}
Packit 857059
Packit 857059
	if (value > IB_LIFETIME_MAX) {
Packit 857059
		char minBuf[8];
Packit 857059
		char maxBuf[8];
Packit 857059
		FormatTimeoutMult(minBuf, 0);
Packit 857059
		FormatTimeoutMult(maxBuf, IB_LIFETIME_MAX);
Packit 857059
		IXmlParserPrintWarning(state, "%s is outside allowed range %s-%s. Setting to %s.",
Packit 857059
			content, minBuf, maxBuf, maxBuf);
Packit 857059
		value = IB_LIFETIME_MAX;
Packit 857059
	}
Packit 857059
Packit 857059
	*(uint32_t *)IXmlParserGetField(field, object) = value;
Packit 857059
}
Packit 857059
Packit 857059
void IXmlParserEndHoqTimeout_Int(IXmlParserState_t *state,
Packit 857059
	const IXML_FIELD *field, void *object, void *parent, XML_Char *content,
Packit 857059
	unsigned int len, boolean valid)
Packit 857059
{
Packit 857059
	uint32_t value;
Packit 857059
	if (!IXmlParseUint32(state, content, len, &value)) {
Packit 857059
		return;
Packit 857059
	}
Packit 857059
Packit 857059
	if (value > IB_LIFETIME_MAX) {
Packit 857059
		IXmlParserPrintWarning(state, "%u is outside allowed range 0-%u. Setting to %u.",
Packit 857059
			value, IB_LIFETIME_MAX, IB_LIFETIME_MAX);
Packit 857059
		value = IB_LIFETIME_MAX;
Packit 857059
	}
Packit 857059
Packit 857059
	*(uint32_t *)IXmlParserGetField(field, object) = value;
Packit 857059
}
Packit 857059
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputSMStateValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, IbSMStateToText(value), value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputSMState(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputSMStateValue(state, tag, *(uint8*) data);
Packit 857059
}
Packit 857059
Packit 857059
/* typically a bitfield, so need to call with value instead of ptr */
Packit 857059
/* 0 has meaning, so no 'Optional' variations of this function */
Packit 857059
void IXmlOutputOnOffValue(IXmlOutputState_t *state, const char* tag, uint8 value)
Packit 857059
{
Packit 857059
	IXmlOutputStrUint(state, tag, value?"On":"Off", value);
Packit 857059
}
Packit 857059
Packit 857059
void IXmlOutputOnOff(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOnOffValue(state, tag, *(uint8*)data);
Packit 857059
}
Packit 857059
Packit 857059
/****************************************************************************/
Packit 857059
void IXmlOutputPathRecord(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IB_PATH_RECORD *pPathRecord = (IB_PATH_RECORD*)data;
Packit 857059
Packit 857059
	IXmlOutputStartTag(state, tag);
Packit 857059
	IXmlOutputGID(state, "SGID", &pPathRecord->SGID);
Packit 857059
	IXmlOutputGID(state, "DGID", &pPathRecord->DGID);
Packit 857059
	IXmlOutputLID(state, "SLID", &pPathRecord->SLID);
Packit 857059
	IXmlOutputLID(state, "DLID", &pPathRecord->DLID);
Packit 857059
	IXmlOutputStrUint(state, "Reversible", pPathRecord->Reversible?"Y":"N", pPathRecord->Reversible);
Packit 857059
	IXmlOutputPKey(state, "PKey", &pPathRecord->P_Key);
Packit 857059
	IXmlOutputStrUint(state, "Raw", pPathRecord->u1.s.RawTraffic?"Y":"N", pPathRecord->u1.s.RawTraffic);
Packit 857059
	IXmlOutputHex(state, "FlowLabel", pPathRecord->u1.s.FlowLabel);
Packit 857059
	IXmlOutputHex(state, "HopLimit", pPathRecord->u1.s.HopLimit);
Packit 857059
	IXmlOutputHex(state, "TClass", pPathRecord->TClass);
Packit 857059
	IXmlOutputUint(state, "SL", pPathRecord->u2.s.SL);
Packit 857059
	IXmlOutputUint(state, "Mtu", GetBytesFromMtu(pPathRecord->Mtu));
Packit 857059
	IXmlOutputRateValue(state, "Rate", pPathRecord->Rate);
Packit 857059
	IXmlOutputTimeoutMultValue(state, "PktLifeTime", pPathRecord->PktLifeTime);
Packit 857059
	IXmlOutputUint(state, "Preference", pPathRecord->Preference);
Packit 857059
	IXmlOutputEndTag(state, tag);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != NULL
Packit 857059
void IXmlOutputOptionalPathRecord(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	if (data)
Packit 857059
		IXmlOutputPathRecord(state, tag, data);
Packit 857059
}
Packit 857059
Packit 857059
/****************************************************************************/
Packit 857059
IXML_FIELD XmlTraceRecordFields[] = {
Packit 857059
	{ tag:"IDGeneration", format:'H', IXML_FIELD_INFO(STL_TRACE_RECORD, IDGeneration) },
Packit 857059
	{ tag:"NodeType", format:'k', IXML_FIELD_INFO(STL_TRACE_RECORD, NodeType), format_func:IXmlOutputNodeType, end_func:IXmlParserEndNoop },	// outputs both
Packit 857059
	{ tag:"NodeType_Int", format:'K', IXML_FIELD_INFO(STL_TRACE_RECORD, NodeType), format_func:IXmlOutputNoop, end_func:IXmlParserEndNodeType_Int },	// inputs Int, ignore string on input
Packit 857059
	{ tag:"NodeID", format:'H', IXML_FIELD_INFO(STL_TRACE_RECORD, NodeID) },
Packit 857059
	{ tag:"ChassisID", format:'H', IXML_FIELD_INFO(STL_TRACE_RECORD, ChassisID) },
Packit 857059
	{ tag:"EntryPortID", format:'H', IXML_FIELD_INFO(STL_TRACE_RECORD, EntryPortID) },
Packit 857059
	{ tag:"ExitPortID", format:'H', IXML_FIELD_INFO(STL_TRACE_RECORD, ExitPortID) },
Packit 857059
	{ tag:"EntryPort", format:'D', IXML_FIELD_INFO(STL_TRACE_RECORD, EntryPort) },
Packit 857059
	{ tag:"ExitPort", format:'D', IXML_FIELD_INFO(STL_TRACE_RECORD, ExitPort) },
Packit 857059
	{ NULL }
Packit 857059
};
Packit 857059
Packit 857059
void IXmlOutputTraceRecord(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStruct(state, tag, data, NULL, XmlTraceRecordFields);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != NULL
Packit 857059
void IXmlOutputOptionalTraceRecord(IXmlOutputState_t *state, const char* tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStruct(state, tag, data, NULL, XmlTraceRecordFields);
Packit 857059
}
Packit 857059
Packit 857059
#if !defined(VXWORKS) || defined(BUILD_DMC)
Packit 857059
/****************************************************************************/
Packit 857059
/* IocService Input/Output functions */
Packit 857059
Packit 857059
static void IocServiceXmlFormatAttr(IXmlOutputState_t *state, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputPrint(state, " id=\"");
Packit 857059
	IXmlOutputPrintStrLen(state, (char*)((IOC_SERVICE*)data)->Name, IOC_SERVICE_NAME_SIZE);
Packit 857059
	IXmlOutputPrint(state, "\"");
Packit 857059
}
Packit 857059
Packit 857059
IXML_FIELD IocServiceFields[] = {
Packit 857059
	{ tag:"Name", format:'C', IXML_FIELD_INFO(IOC_SERVICE, Name) },
Packit 857059
	{ tag:"Id", format:'H', IXML_FIELD_INFO(IOC_SERVICE, Id) },
Packit 857059
	{ NULL }
Packit 857059
};
Packit 857059
Packit 857059
void IocServiceXmlOutput(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStruct(state, tag, (IOC_SERVICE*)data, IocServiceXmlFormatAttr, IocServiceFields);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != NULL
Packit 857059
void IocServiceXmlOutputOptional(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStruct(state, tag, (IOC_SERVICE*)data, IocServiceXmlFormatAttr, IocServiceFields);
Packit 857059
}
Packit 857059
#endif
Packit 857059
Packit 857059
/* caller must supply IocServiceXmlParserStart and IocServiceXmlParserEnd */
Packit 857059
Packit 857059
/****************************************************************************/
Packit 857059
/* SwitchInfo Input/Output functions */
Packit 857059
Packit 857059
/* bitfields needs special handling: LID */
Packit 857059
static void SwitchInfoXmlOutputLID(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputLIDValue(state, tag, ((STL_SWITCHINFO_RECORD *)data)->RID.LID);
Packit 857059
}
Packit 857059
Packit 857059
static void SwitchInfoXmlParserEndLID(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint32 value;
Packit 857059
	
Packit 857059
	if (IXmlParseUint32(state, content, len, &value))
Packit 857059
		((STL_SWITCHINFO_RECORD *)object)->RID.LID = value;
Packit 857059
}
Packit 857059
Packit 857059
static void IXmlParserEndMulticastFDBTop(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
        uint32 value;
Packit 857059
Packit 857059
	if (IXmlParseUint32(state, content, len, &value)) {
Packit 857059
		if (IS_MCAST16(value))
Packit 857059
			value = MCAST16_TO_MCAST32(value);
Packit 857059
		if (value && ((value < STL_LID_MULTICAST_BEGIN) || (value > STL_LID_MULTICAST_END)))
Packit 857059
			IXmlParserPrintError(state, "MulticastFDBTop value 0x%08x out of range.  Must be 0 or in the range 0x%08x through 0x%08x\n", value, STL_LID_MULTICAST_BEGIN, STL_LID_MULTICAST_END);
Packit 857059
		else
Packit 857059
			((STL_SWITCHINFO_RECORD *)object)->SwitchInfoData.MulticastFDBTop = value;
Packit 857059
	}
Packit 857059
}
Packit 857059
Packit 857059
/* bitfields needs special handling: LifeTimeValue */
Packit 857059
static void SwitchInfoXmlOutputLifeTimeValue(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputTimeoutMultValue(state, tag,
Packit 857059
		((STL_SWITCHINFO_RECORD*)data)->SwitchInfoData.u1.s.LifeTimeValue);
Packit 857059
}
Packit 857059
Packit 857059
static void SwitchInfoXmlParserEndLifeTimeValue(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (IXmlParseUint8(state, content, len, &value))
Packit 857059
		((STL_SWITCHINFO_RECORD*)object)->SwitchInfoData.u1.s.LifeTimeValue = value;
Packit 857059
}
Packit 857059
Packit 857059
/* bitfields needs special handling: PortStateChange */
Packit 857059
static void SwitchInfoXmlOutputPortStateChange(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputUint(state, tag, ((STL_SWITCHINFO_RECORD *)data)->SwitchInfoData.u1.s.PortStateChange);
Packit 857059
}
Packit 857059
Packit 857059
static void SwitchInfoXmlParserEndPortStateChange(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
	
Packit 857059
	if (IXmlParseUint8(state, content, len, &value))
Packit 857059
		((STL_SWITCHINFO_RECORD *)object)->SwitchInfoData.u1.s.PortStateChange = value;
Packit 857059
}
Packit 857059
Packit 857059
/* bitfields needs special handling: MulticastMask */
Packit 857059
static void SwitchInfoXmlOutputMulticastMask(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputHex(state, tag, ((STL_SWITCHINFO_RECORD *)data)->SwitchInfoData.MultiCollectMask.MulticastMask);
Packit 857059
}
Packit 857059
Packit 857059
static void SwitchInfoXmlParserEndMulticastMask(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
Packit 857059
	if (IXmlParseUint8(state, content, len, &value))
Packit 857059
		((STL_SWITCHINFO_RECORD *)object)->SwitchInfoData.MultiCollectMask.MulticastMask = value;
Packit 857059
}
Packit 857059
Packit 857059
/* bitfields needs special handling: CollectiveMask */
Packit 857059
static void SwitchInfoXmlOutputCollectiveMask(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputHex(state, tag, ((STL_SWITCHINFO_RECORD *)data)->SwitchInfoData.MultiCollectMask.CollectiveMask);
Packit 857059
}
Packit 857059
Packit 857059
static void SwitchInfoXmlParserEndCollectiveMask(IXmlParserState_t *state, const IXML_FIELD *field, void *object, void *parent, XML_Char *content, unsigned len, boolean valid)
Packit 857059
{
Packit 857059
	uint8 value;
Packit 857059
Packit 857059
	if (IXmlParseUint8(state, content, len, &value))
Packit 857059
		((STL_SWITCHINFO_RECORD *)object)->SwitchInfoData.MultiCollectMask.CollectiveMask = value;
Packit 857059
}
Packit 857059
Packit 857059
IXML_FIELD SwitchInfoFields[] = {
Packit 857059
	{ tag:"LID", format:'K', format_func:SwitchInfoXmlOutputLID, end_func:SwitchInfoXmlParserEndLID }, // bitfield
Packit 857059
	{ tag:"LinearFDBCap", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.LinearFDBCap) },
Packit 857059
	{ tag:"MulticastFDBCap", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.MulticastFDBCap) },
Packit 857059
	{ tag:"LinearFDBTop", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.LinearFDBTop) },
Packit 857059
	{ tag:"MulticastFDBTop", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.MulticastFDBTop), end_func:IXmlParserEndMulticastFDBTop},
Packit 857059
	{ tag:"IPAddrIPV6", format:'k', format_func:IXmlOutputIPAddrIPV6, IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.IPAddrIPV6.addr), end_func:IXmlParserEndIPAddrIPV6},
Packit 857059
	{ tag:"IPAddrIPV4", format:'k', format_func:IXmlOutputIPAddrIPV4, IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.IPAddrIPV4.addr), end_func:IXmlParserEndIPAddrIPV4},
Packit 857059
	{ tag:"LifeTimeValue", format:'k', format_func:SwitchInfoXmlOutputLifeTimeValue, end_func:IXmlParserEndNoop }, // output only bitfield
Packit 857059
	{ tag:"LifeTimeValue_Int", format:'K', format_func:IXmlOutputNoop, end_func:SwitchInfoXmlParserEndLifeTimeValue }, // input only bitfield
Packit 857059
	{ tag:"PortStateChange", format:'K', format_func:SwitchInfoXmlOutputPortStateChange, end_func:SwitchInfoXmlParserEndPortStateChange }, // bitfield
Packit 857059
	{ tag:"PartitionEnforcementCap", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.PartitionEnforcementCap) },
Packit 857059
	{ tag:"U2", format:'X', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.u2.AsReg8) },
Packit 857059
	{ tag:"CapabilityMask", format:'X', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.CapabilityMask) },
Packit 857059
	{ tag:"MulticastMask", format:'k', format_func:SwitchInfoXmlOutputMulticastMask, end_func:SwitchInfoXmlParserEndMulticastMask }, // bitfield
Packit 857059
	{ tag:"CollectiveMask", format:'k', format_func:SwitchInfoXmlOutputCollectiveMask, end_func:SwitchInfoXmlParserEndCollectiveMask }, // bitfield
Packit 857059
	{ tag:"RoutingModeSupported", format:'X', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.RoutingMode.Supported) },
Packit 857059
	{ tag:"RoutingModeEnabled", format:'X', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.RoutingMode.Enabled) },
Packit 857059
	{ tag:"PortGroupFDBCap", format:'u', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.PortGroupFDBCap) }, // optional to retain compatibility with snapshots made by older versions of OPA.
Packit 857059
	{ tag:"PortGroupCap", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.PortGroupCap) },
Packit 857059
	{ tag:"PortGroupTop", format:'U', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.PortGroupTop) },
Packit 857059
	{ tag:"AdaptiveRouting", format:'x', IXML_FIELD_INFO(STL_SWITCHINFO_RECORD, SwitchInfoData.AdaptiveRouting.AsReg16) },
Packit 857059
	{ NULL }
Packit 857059
};
Packit 857059
Packit 857059
void SwitchInfoXmlOutput(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputStruct(state, tag, (STL_SWITCHINFO_RECORD*)data, NULL, SwitchInfoFields);
Packit 857059
}
Packit 857059
Packit 857059
// only output if value != NULL
Packit 857059
void SwitchInfoXmlOutputOptional(IXmlOutputState_t *state, const char *tag, void *data)
Packit 857059
{
Packit 857059
	IXmlOutputOptionalStruct(state, tag, (STL_SWITCHINFO_RECORD*)data, NULL, SwitchInfoFields);
Packit 857059
}
Packit 857059
Packit 857059
/* caller must supply SwitchInfoXmlParserStart and SwitchInfoXmlParserEnd */