|
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 */
|