diff options
author | Adam Goldman <adam.goldman@intel.com> | 2016-02-04 10:10:28 -0500 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2016-05-17 18:05:54 +0000 |
commit | ba3f4f991cf4341dcd6191c0949bfa19f20c7304 (patch) | |
tree | 16dc732d14c7801e641676bf6f36a6cc53b956ec /epan/dissectors/packet-opa-mad.c | |
parent | 5c08509b000d3bda81abc90e02ed5526dba3f6de (diff) |
opa: Add dissectors for Intel’s Omni-Path Architecture (OPA)
Added dissectors for OPA Fabric Executive (FE) Header, OPA Snoop and
Capture (SnC) MetaData Header, OPA 9B Packets, and OPA MAD Packets.
Bug: 12114
Change-Id: I6acd3c9e266e4b638167abbdd275ec7c1d472b4f
Reviewed-on: https://code.wireshark.org/review/13473
Reviewed-by: Adam Goldman <adam.goldman@intel.com>
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-opa-mad.c')
-rw-r--r-- | epan/dissectors/packet-opa-mad.c | 13592 |
1 files changed, 13592 insertions, 0 deletions
diff --git a/epan/dissectors/packet-opa-mad.c b/epan/dissectors/packet-opa-mad.c new file mode 100644 index 0000000000..51818a253a --- /dev/null +++ b/epan/dissectors/packet-opa-mad.c @@ -0,0 +1,13592 @@ +/* packet-opa-mad.c + * Routines for Omni-Path MAD header and payload dissection + * Copyright (c) 2016, Intel Corporation. + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include <epan/packet.h> +#include <epan/prefs.h> +#include <epan/etypes.h> +#include <epan/expert.h> + +void proto_reg_handoff_opa_mad(void); +void proto_register_opa_mad(void); + +/* MAD Management Classes */ +#define SUBN_LID_ROUTED 0x01 +#define SUBN_DIRECTED_ROUTE 0x81 +#define SUBNADMN 0x03 +#define PERF 0x04 +#define PERFADMN 0x32 + +/* Depreciated Management Classes */ +#define BM 0x05 +#define DEV_MGT 0x06 +#define COM_MGT 0x07 +#define SNMP 0x08 + +/* Default Range Strings */ +#define OPA_MGMTCLASS_RANGE_STR "0x01,0x03-0x04,0x32,0x81" +#define OPA_VENDOR_RANGE_STR "0x09-0x0F" +#define OPA_VENDOR_RMPP_RANGE_STR "0x30-0x31,0x33-0x4F" +#define OPA_APPLICATION_RANGE_STR "0x10-0x2F" +#define OPA_RESERVED_RANGE_STR "0x00,0x02,0x50-0x80,0x82-0xFF" + +static const value_string MAD_mgmt_names[] = { + { SUBN_LID_ROUTED, "Subnet Management (LID Routed)" }, + { SUBNADMN, "Subnet Administration" }, + { PERF, "Performance Management" }, + { BM, "Baseboard Management" }, + { DEV_MGT, "Device Management" }, + { COM_MGT, "Communication Management" }, + { SNMP, "SNMP" }, + { 0x09, "VENDOR 0x09" }, + { 0x0A, "VENDOR 0x0A" }, + { 0x0B, "VENDOR 0x0B" }, + { 0x0C, "VENDOR 0x0C" }, + { 0x0D, "VENDOR 0x0D" }, + { 0x0E, "VENDOR 0x0E" }, + { 0x0F, "VENDOR 0x0F" }, + { 0x10, "APPLICATION 0x10" }, + { 0x11, "APPLICATION 0x11" }, + { 0x12, "APPLICATION 0x12" }, + { 0x13, "APPLICATION 0x13" }, + { 0x14, "APPLICATION 0x14" }, + { 0x15, "APPLICATION 0x15" }, + { 0x16, "APPLICATION 0x16" }, + { 0x17, "APPLICATION 0x17" }, + { 0x18, "APPLICATION 0x18" }, + { 0x19, "APPLICATION 0x19" }, + { 0x1A, "APPLICATION 0x1A" }, + { 0x1B, "APPLICATION 0x1B" }, + { 0x1C, "APPLICATION 0x1C" }, + { 0x1D, "APPLICATION 0x1D" }, + { 0x1E, "APPLICATION 0x1E" }, + { 0x1F, "APPLICATION 0x1F" }, + { 0X20, "APPLICATION 0X20" }, + { 0x21, "APPLICATION 0x21" }, + { 0x22, "APPLICATION 0x22" }, + { 0x23, "APPLICATION 0x23" }, + { 0x24, "APPLICATION 0x24" }, + { 0x25, "APPLICATION 0x25" }, + { 0x26, "APPLICATION 0x26" }, + { 0x27, "APPLICATION 0x27" }, + { 0x28, "APPLICATION 0x28" }, + { 0x29, "APPLICATION 0x29" }, + { 0x2A, "APPLICATION 0x2A" }, + { 0x2B, "APPLICATION 0x2B" }, + { 0x2C, "APPLICATION 0x2C" }, + { 0x2D, "APPLICATION 0x2D" }, + { 0x2E, "APPLICATION 0x2E" }, + { 0x2F, "APPLICATION 0x2F" }, + { 0x30, "VENDOR 0x30" }, + { 0x31, "VENDOR 0x31" }, + { PERFADMN, "Performance Administration" }, + { 0x33, "VENDOR 0x33" }, + { 0x34, "VENDOR 0x34" }, + { 0x35, "VENDOR 0x35" }, + { 0x36, "VENDOR 0x36" }, + { 0x37, "VENDOR 0x37" }, + { 0x38, "VENDOR 0x38" }, + { 0x39, "VENDOR 0x39" }, + { 0x3A, "VENDOR 0x3A" }, + { 0x3B, "VENDOR 0x3B" }, + { 0x3C, "VENDOR 0x3C" }, + { 0x3D, "VENDOR 0x3D" }, + { 0x3E, "VENDOR 0x3E" }, + { 0x3F, "VENDOR 0x3F" }, + { 0x40, "VENDOR 0x40" }, + { 0x41, "VENDOR 0x41" }, + { 0x42, "VENDOR 0x42" }, + { 0x43, "VENDOR 0x43" }, + { 0x44, "VENDOR 0x44" }, + { 0x45, "VENDOR 0x45" }, + { 0x46, "VENDOR 0x46" }, + { 0x47, "VENDOR 0x47" }, + { 0x48, "VENDOR 0x48" }, + { 0x49, "VENDOR 0x49" }, + { 0x4A, "VENDOR 0x4A" }, + { 0x4B, "VENDOR 0x4B" }, + { 0x4C, "VENDOR 0x4C" }, + { 0x4D, "VENDOR 0x4D" }, + { 0x4E, "VENDOR 0x4E" }, + { 0x4F, "VENDOR 0x4F" }, + { SUBN_DIRECTED_ROUTE, "Subnet Management (Direct Routed)" }, + { 0, NULL } +}; +static value_string_ext MAD_mgmt_names_ext = VALUE_STRING_EXT_INIT(MAD_mgmt_names); + +/* SM Attributes */ +#define SM_ATTR_ID_CLASS_PORT_INFO 0x0001 +#define SM_ATTR_ID_NOTICE 0x0002 +#define SM_ATTR_ID_INFORM_INFO 0x0003 +#define SM_ATTR_ID_NODE_DESCRIPTION 0x0010 +#define SM_ATTR_ID_NODE_INFO 0x0011 +#define SM_ATTR_ID_SWITCH_INFO 0x0012 +#define SM_ATTR_ID_PORT_INFO 0x0015 +#define SM_ATTR_ID_PART_TABLE 0x0016 +#define SM_ATTR_ID_SL_SC_MAPPING_TABLE 0x0017 +#define SM_ATTR_ID_VL_ARBITRATION 0x0018 +#define SM_ATTR_ID_LINEAR_FWD_TABLE 0x0019 +#define SM_ATTR_ID_MCAST_FWD_TABLE 0x001B +#define SM_ATTR_ID_SM_INFO 0x0020 +#define SM_ATTR_ID_LED_INFO 0x0031 +#define SM_ATTR_ID_CABLE_INFO 0x0032 +#define SM_ATTR_ID_AGGREGATE 0x0080 +#define SM_ATTR_ID_SC_SC_MAPPING_TABLE 0x0081 +#define SM_ATTR_ID_SC_SL_MAPPING_TABLE 0x0082 +#define SM_ATTR_ID_SC_VLR_MAPPING_TABLE 0x0083 +#define SM_ATTR_ID_SC_VLT_MAPPING_TABLE 0x0084 +#define SM_ATTR_ID_SC_VLNT_MAPPING_TABLE 0x0085 +#define SM_ATTR_ID_PORT_STATE_INFO 0x0087 +#define SM_ATTR_ID_PORT_GROUP_FWD_TABLE 0x0088 +#define SM_ATTR_ID_PORT_GROUP_TABLE 0x0089 +#define SM_ATTR_ID_BUFFER_CONTROL_TABLE 0x008A +#define SM_ATTR_ID_CONGESTION_INFO 0x008B +#define SM_ATTR_ID_SWITCH_CONGESTION_LOG 0x008C +#define SM_ATTR_ID_SWITCH_CONGESTION_SETTING 0x008D +#define SM_ATTR_ID_SWITCH_PORT_CONGESTION_SETTING 0x008E +#define SM_ATTR_ID_HFI_CONGESTION_LOG 0x008F +#define SM_ATTR_ID_HFI_CONGESTION_SETTING 0x0090 +#define SM_ATTR_ID_HFI_CONGESTION_CONTROL_TABLE 0x0091 + +/* SA Attributes */ +#define SA_ATTR_ID_CLASS_PORT_INFO 0x0001 +#define SA_ATTR_ID_NOTICE 0x0002 +#define SA_ATTR_ID_INFORM_INFO 0x0003 +#define SA_ATTR_ID_NODE_RECORD 0x0011 +#define SA_ATTR_ID_PORTINFO_RECORD 0x0012 +#define SA_ATTR_ID_SC_MAPTBL_RECORD 0x0013 +#define SA_ATTR_ID_SWITCHINFO_RECORD 0x0014 +#define SA_ATTR_ID_LINEAR_FWDTBL_RECORD 0x0015 +#define SA_ATTR_ID_MCAST_FWDTBL_RECORD 0x0017 +#define SA_ATTR_ID_SMINFO_RECORD 0x0018 +#define SA_ATTR_ID_LINK_SPD_WDTH_PAIRS_RECORD 0x0019 +#define SA_ATTR_ID_LINK_RECORD 0x0020 +#define SA_ATTR_ID_SERVICE_RECORD 0x0031 +#define SA_ATTR_ID_P_KEY_TABLE_RECORD 0x0033 +#define SA_ATTR_ID_PATH_RECORD 0x0035 +#define SA_ATTR_ID_VLARBTABLE_RECORD 0x0036 +#define SA_ATTR_ID_MCMEMBER_RECORD 0x0038 +#define SA_ATTR_ID_TRACE_RECORD 0x0039 +#define SA_ATTR_ID_MULTIPATH_GID_RECORD 0x003A +#define SA_ATTR_ID_SERVICEASSOCIATION_RECORD 0x003B +#define SA_ATTR_ID_SL2SC_MAPTBL_RECORD 0x0080 +#define SA_ATTR_ID_SC2SL_MAPTBL_RECORD 0x0081 +#define SA_ATTR_ID_SC_VLNT_MAPTBL_RECORD 0x0082 +#define SA_ATTR_ID_SC_VLT_MAPTBL_RECORD 0x0083 +#define SA_ATTR_ID_SC_VLR_MAPTBL_RECORD 0x0084 +#define SA_ATTR_ID_PGROUP_FWDTBL_RECORD 0x0085 +#define SA_ATTR_ID_MULTIPATH_GUID_RECORD 0x0086 +#define SA_ATTR_ID_MULTIPATH_LID_RECORD 0x0087 +#define SA_ATTR_ID_CABLE_INFO_RECORD 0x0088 +#define SA_ATTR_ID_VF_INFO_RECORD 0x0089 +#define SA_ATTR_ID_BUFF_CTRL_TAB_RECORD 0x008C +#define SA_ATTR_ID_FABRICINFO_RECORD 0x008D +#define SA_ATTR_ID_QUARANTINED_NODE_RECORD 0x0090 +#define SA_ATTR_ID_CONGESTION_INFO_RECORD 0x0091 +#define SA_ATTR_ID_SWITCH_CONG_RECORD 0x0092 +#define SA_ATTR_ID_SWITCH_PORT_CONG_RECORD 0x0093 +#define SA_ATTR_ID_HFI_CONG_RECORD 0x0094 +#define SA_ATTR_ID_HFI_CONG_CTRL_RECORD 0x0095 +#define SA_ATTR_ID_INFORM_INFO_RECORD 0x00F3 + +/* Performance Management class Attributes */ +#define PM_ATTR_ID_CLASS_PORTINFO 0x0001 +#define PM_ATTR_ID_PORT_STATUS 0x0040 +#define PM_ATTR_ID_CLEAR_PORT_STATUS 0x0041 +#define PM_ATTR_ID_DATA_PORT_COUNTERS 0x0042 +#define PM_ATTR_ID_ERROR_PORT_COUNTERS 0x0043 +#define PM_ATTR_ID_ERROR_INFO 0x0044 +/* Performance Administration class Attributes */ +#define PA_ATTR_ID_CLASS_PORTINFO 0x0001 +#define PA_ATTR_ID_GET_GRP_LIST 0x00A0 +#define PA_ATTR_ID_GET_GRP_INFO 0x00A1 +#define PA_ATTR_ID_GET_GRP_CFG 0x00A2 +#define PA_ATTR_ID_GET_PORT_CTRS 0x00A3 +#define PA_ATTR_ID_CLR_PORT_CTRS 0x00A4 +#define PA_ATTR_ID_CLR_ALL_PORT_CTRS 0x00A5 +#define PA_ATTR_ID_GET_PM_CFG 0x00A6 +#define PA_ATTR_ID_FREEZE_IMAGE 0x00A7 +#define PA_ATTR_ID_RELEASE_IMAGE 0x00A8 +#define PA_ATTR_ID_RENEW_IMAGE 0x00A9 +#define PA_ATTR_ID_GET_FOCUS_PORTS 0x00AA +#define PA_ATTR_ID_GET_IMAGE_INFO 0x00AB +#define PA_ATTR_ID_MOVE_FREEZE_FRAME 0x00AC +#define PA_ATTR_ID_GET_VF_LIST 0x00AD +#define PA_ATTR_ID_GET_VF_INFO 0x00AE +#define PA_ATTR_ID_GET_VF_CONFIG 0x00AF +#define PA_ATTR_ID_GET_VF_PORT_CTRS 0x00B0 +#define PA_ATTR_ID_CLR_VF_PORT_CTRS 0x00B1 +#define PA_ATTR_ID_GET_VF_FOCUS_PORTS 0x00B2 + +/* Attributes */ +static const value_string SUBM_Attributes[] = { + { SM_ATTR_ID_CLASS_PORT_INFO, "Attribute (ClassPortInfo)" }, + { SM_ATTR_ID_NOTICE, "Attribute (Notice)" }, + { SM_ATTR_ID_INFORM_INFO, "Attribute (InformInfo)" }, + { SM_ATTR_ID_NODE_DESCRIPTION, "Attribute (NodeDescription)" }, + { SM_ATTR_ID_NODE_INFO, "Attribute (NodeInfo)" }, + { SM_ATTR_ID_SWITCH_INFO, "Attribute (SwitchInfo)" }, + { SM_ATTR_ID_PORT_INFO, "Attribute (PortInfo)" }, + { SM_ATTR_ID_PART_TABLE, "Attribute (PKeyTable)" }, + { SM_ATTR_ID_SL_SC_MAPPING_TABLE, "Attribute (SLSCMappingTable)" }, + { SM_ATTR_ID_VL_ARBITRATION, "Attribute (VLArbitrationTable)" }, + { SM_ATTR_ID_LINEAR_FWD_TABLE, "Attribute (LinearForwardingTable)" }, + { SM_ATTR_ID_MCAST_FWD_TABLE, "Attribute (MulticastForwardingTable)" }, + { SM_ATTR_ID_SM_INFO, "Attribute (SMInfo)" }, + { SM_ATTR_ID_LED_INFO, "Attribute (LedInfo)" }, + { SM_ATTR_ID_CABLE_INFO, "Attribute (CableInfo)" }, + { SM_ATTR_ID_AGGREGATE, "Attribute (Aggregate)" }, + { SM_ATTR_ID_SC_SC_MAPPING_TABLE, "Attribute (SCSCMappingTable)" }, + { SM_ATTR_ID_SC_SL_MAPPING_TABLE, "Attribute (SCSLMappingTable)" }, + { SM_ATTR_ID_SC_VLR_MAPPING_TABLE, "Attribute (SCVLRMappingTable)" }, + { SM_ATTR_ID_SC_VLT_MAPPING_TABLE, "Attribute (SCVLTMappingTable)" }, + { SM_ATTR_ID_SC_VLNT_MAPPING_TABLE, "Attribute (SCVLNTMappingTable)" }, + { SM_ATTR_ID_PORT_STATE_INFO, "Attribute (PortStateInfo)" }, + { SM_ATTR_ID_PORT_GROUP_FWD_TABLE, "Attribute (PortGroupForwardingTable)" }, + { SM_ATTR_ID_PORT_GROUP_TABLE, "Attribute (PortGroupTable)" }, + { SM_ATTR_ID_BUFFER_CONTROL_TABLE, "Attribute (BufferControlTable)" }, + { SM_ATTR_ID_CONGESTION_INFO, "Attribute (CongestionInfo)" }, + { SM_ATTR_ID_SWITCH_CONGESTION_LOG, "Attribute (SwitchCongestionLog)" }, + { SM_ATTR_ID_SWITCH_CONGESTION_SETTING, "Attribute (SwitchCongestionSetting)" }, + { SM_ATTR_ID_SWITCH_PORT_CONGESTION_SETTING, "Attribute (SwitchPortCongestionSetting)" }, + { SM_ATTR_ID_HFI_CONGESTION_LOG, "Attribute (HFICongestionLog)" }, + { SM_ATTR_ID_HFI_CONGESTION_SETTING, "Attribute (HFICongestionSetting)" }, + { SM_ATTR_ID_HFI_CONGESTION_CONTROL_TABLE, "Attribute (HFICongestionControlTable)" }, + { 0, NULL } +}; +static const value_string SUBA_Attributes[] = { + { SA_ATTR_ID_CLASS_PORT_INFO, "Attribute (ClassPortInfo)" }, + { SA_ATTR_ID_NOTICE, "Attribute (Notice)" }, + { SA_ATTR_ID_INFORM_INFO, "Attribute (InformInfo)" }, + { SA_ATTR_ID_NODE_RECORD, "Attribute (NodeRecord)" }, + { SA_ATTR_ID_PORTINFO_RECORD, "Attribute (PortInfoRecord)" }, + { SA_ATTR_ID_SC_MAPTBL_RECORD, "Attribute (SCMappingTableRecord)" }, + { SA_ATTR_ID_SWITCHINFO_RECORD, "Attribute (SwitchInfoRecord)" }, + { SA_ATTR_ID_LINEAR_FWDTBL_RECORD, "Attribute (LinearForwardingTableRecord)" }, + { SA_ATTR_ID_MCAST_FWDTBL_RECORD, "Attribute (MulticastForwardingTableRecord)" }, + { SA_ATTR_ID_SMINFO_RECORD, "Attribute (SMInfoRecord)" }, + { SA_ATTR_ID_LINK_SPD_WDTH_PAIRS_RECORD, "Attribute (LinkSpeedWidthPairsTableRecord)" }, + { SA_ATTR_ID_LINK_RECORD, "Attribute (LinkRecord)" }, + { SA_ATTR_ID_SERVICE_RECORD, "Attribute (ServiceRecord)" }, + { SA_ATTR_ID_P_KEY_TABLE_RECORD, "Attribute (P_KeyTableRecord)" }, + { SA_ATTR_ID_PATH_RECORD, "Attribute (PathRecord)" }, + { SA_ATTR_ID_VLARBTABLE_RECORD, "Attribute (VLArbitrationTableRecord)" }, + { SA_ATTR_ID_MCMEMBER_RECORD, "Attribute (MulticastMemberRecord)" }, + { SA_ATTR_ID_TRACE_RECORD, "Attribute (TraceRecord)" }, + { SA_ATTR_ID_MULTIPATH_GID_RECORD, "Attribute (MultiPathRecord)" }, + { SA_ATTR_ID_SERVICEASSOCIATION_RECORD, "Attribute (ServiceAssociationRecord)" }, + { SA_ATTR_ID_SL2SC_MAPTBL_RECORD, "Attribute (SLtoSCMappingTableRecord)" }, + { SA_ATTR_ID_SC2SL_MAPTBL_RECORD, "Attribute (SCtoSLMappingTableRecord)" }, + { SA_ATTR_ID_SC_VLNT_MAPTBL_RECORD, "Attribute (SCtoVLNTMappingTableRecord)" }, + { SA_ATTR_ID_SC_VLT_MAPTBL_RECORD, "Attribute (SCtoVLTMappingTableRecord)" }, + { SA_ATTR_ID_SC_VLR_MAPTBL_RECORD, "Attribute (SCtoVLRMappingTableRecord)" }, + { SA_ATTR_ID_PGROUP_FWDTBL_RECORD, "Attribute (PGroupForwardTableRecord)" }, + { SA_ATTR_ID_MULTIPATH_GUID_RECORD, "Attribute (MultipathGUIDRecord)" }, + { SA_ATTR_ID_MULTIPATH_LID_RECORD, "Attribute (MultipathLIDRecord)" }, + { SA_ATTR_ID_CABLE_INFO_RECORD, "Attribute (CableInfoRecord)" }, + { SA_ATTR_ID_VF_INFO_RECORD, "Attribute (VFInfoRecord)" }, + { SA_ATTR_ID_BUFF_CTRL_TAB_RECORD, "Attribute (BufferControlTableRecord)" }, + { SA_ATTR_ID_FABRICINFO_RECORD, "Attribute (FabricInfoRecord)" }, + { SA_ATTR_ID_QUARANTINED_NODE_RECORD, "Attribute (QuarantinedNodeRecord)" }, + { SA_ATTR_ID_CONGESTION_INFO_RECORD, "Attribute (CongestionInfoRecord)" }, + { SA_ATTR_ID_SWITCH_CONG_RECORD, "Attribute (SwitchCongestionRecord)" }, + { SA_ATTR_ID_SWITCH_PORT_CONG_RECORD, "Attribute (SwitchPortCongestionRecord)" }, + { SA_ATTR_ID_HFI_CONG_RECORD, "Attribute (HFICongestionRecord)" }, + { SA_ATTR_ID_HFI_CONG_CTRL_RECORD, "Attribute (HFICongestionControlRecord)" }, + { SA_ATTR_ID_INFORM_INFO_RECORD, "Attribute (InformInfoRecord)" }, + { 0, NULL } +}; +static const value_string PM_Attributes[] = { + { PM_ATTR_ID_CLASS_PORTINFO, "Attribute (ClassPortInfo)" }, + { PM_ATTR_ID_PORT_STATUS, "Attribute (PortStatus)" }, + { PM_ATTR_ID_CLEAR_PORT_STATUS, "Attribute (ClearPortStatus)" }, + { PM_ATTR_ID_DATA_PORT_COUNTERS, "Attribute (DataPortCounters)" }, + { PM_ATTR_ID_ERROR_PORT_COUNTERS, "Attribute (ErrorPortCounters)" }, + { PM_ATTR_ID_ERROR_INFO, "Attribute (ErrorInfo)" }, + { 0, NULL } +}; +static const value_string PA_Attributes[] = { + { PA_ATTR_ID_CLASS_PORTINFO, "Attribute (ClassPortInfo)" }, + { PA_ATTR_ID_GET_GRP_LIST, "Attribute (GetGroupList)" }, + { PA_ATTR_ID_GET_GRP_INFO, "Attribute (GetGroupInfo)" }, + { PA_ATTR_ID_GET_GRP_CFG, "Attribute (GetGroupConfig)" }, + { PA_ATTR_ID_GET_PORT_CTRS, "Attribute (GetPortCounters)" }, + { PA_ATTR_ID_CLR_PORT_CTRS, "Attribute (ClearPortCounters)" }, + { PA_ATTR_ID_CLR_ALL_PORT_CTRS, "Attribute (ClearAllPortCounters)" }, + { PA_ATTR_ID_GET_PM_CFG, "Attribute (GetPerfMgmtConfig)" }, + { PA_ATTR_ID_FREEZE_IMAGE, "Attribute (FreezeImage)" }, + { PA_ATTR_ID_RELEASE_IMAGE, "Attribute (ReleaseImage)" }, + { PA_ATTR_ID_RENEW_IMAGE, "Attribute (RenewImage)" }, + { PA_ATTR_ID_GET_FOCUS_PORTS, "Attribute (GetFocusPorts)" }, + { PA_ATTR_ID_GET_IMAGE_INFO, "Attribute (GetImageInfo)" }, + { PA_ATTR_ID_MOVE_FREEZE_FRAME, "Attribute (MoveFreezeFrame)" }, + { PA_ATTR_ID_GET_VF_LIST, "Attribute (GetVFList)" }, + { PA_ATTR_ID_GET_VF_INFO, "Attribute (GetVFInfo)" }, + { PA_ATTR_ID_GET_VF_CONFIG, "Attribute (GetVFConfig)" }, + { PA_ATTR_ID_GET_VF_PORT_CTRS, "Attribute (GetVFPortCounters)" }, + { PA_ATTR_ID_CLR_VF_PORT_CTRS, "Attribute (ClearVFPortCounters)" }, + { PA_ATTR_ID_GET_VF_FOCUS_PORTS, "Attribute (GetVFFocusPorts)" }, + { 0, NULL } +}; + +/* Methods */ +#define METHOD_GET 0x01 +#define METHOD_SET 0x02 +#define METHOD_SEND 0x03 +#define METHOD_TRAP 0x05 +#define METHOD_REPORT 0x06 +#define METHOD_TRAPREPRESS 0x07 +#define METHOD_GETTABLE 0x12 +#define METHOD_GETTRACETABLE 0x13 +#define METHOD_GETMULTI 0x14 +#define METHOD_DELETE 0x15 + +#define METHOD_GET_RESP 0x81 +#define METHOD_REPORT_RESP 0x86 +#define METHOD_GETTABLE_RESP 0x92 +#define METHOD_GETTRACETABLE_RESP 0x93 +#define METHOD_GETMULTI_RESP 0x94 +#define METHOD_DELETE_RESP 0x95 +static const value_string Methods[] = { + { METHOD_GET, "Get()" }, + { METHOD_GET_RESP, "GetResp()" }, + { METHOD_SET, "Set()" }, + { METHOD_SEND, "Send()" }, + { METHOD_TRAP, "Trap()" }, + { METHOD_REPORT, "Report()" }, + { METHOD_REPORT_RESP, "ReportResp()" }, + { METHOD_TRAPREPRESS, "TrapRepress()" }, + { METHOD_GETTABLE, "GetTable()" }, + { METHOD_GETTABLE_RESP, "GetTableResp()" }, + { METHOD_GETTRACETABLE, "GetTraceTable()" }, + { METHOD_GETTRACETABLE_RESP, "GetTraceTableResp()" }, + { METHOD_GETMULTI, "GetMulti()" }, + { METHOD_GETMULTI_RESP, "GetMultiResp()" }, + { METHOD_DELETE, "Delete()" }, + { METHOD_DELETE_RESP, "DeleteResp()" }, + { 0, NULL } +}; +static const value_string SUBM_Methods[] = { + { METHOD_GET, "SubnGet(" }, + { METHOD_SET, "SubnSet(" }, + { METHOD_GET_RESP, "SubnGetResp(" }, + { METHOD_TRAP, "SubnTrap(" }, + { METHOD_TRAPREPRESS, "SubnTrapRepress(" }, + { 0, NULL } +}; +static const value_string SUBA_Methods[] = { + { METHOD_GET, "SubnAdmGet(" }, + { METHOD_GET_RESP, "SubnAdmGetResp(" }, + { METHOD_SET, "SubnAdmSet(" }, + { METHOD_REPORT, "SubnAdmReport(" }, + { METHOD_REPORT_RESP, "SubnAdmReportResp(" }, + { METHOD_GETTABLE, "SubnAdmGetTable(" }, + { METHOD_GETTABLE_RESP, "SubnAdmGetTableResp(" }, + { METHOD_GETTRACETABLE, "SubnAdmGetTraceTable(" }, + { METHOD_GETMULTI, "SubnAdmGetMulti(" }, + { METHOD_GETMULTI_RESP, "SubnAdmGetMultiResp(" }, + { METHOD_DELETE, "SubnAdmDelete(" }, + { METHOD_DELETE_RESP, "SubnAdmDeleteResp(" }, + { 0, NULL } +}; +static const value_string PM_Methods[] = { + { METHOD_GET, "PerfGet(" }, + { METHOD_SET, "PerfSet(" }, + { METHOD_GET_RESP, "PerfGetResp(" }, + { 0, NULL } +}; +static const value_string PA_Methods[] = { + { METHOD_GET, "PerfAdmGet(" }, + { METHOD_SET, "PerfAdmSet(" }, + { METHOD_GET_RESP, "PerfAdmGetResp(" }, + { METHOD_GETTABLE, "PerfAdmGetTable(" }, + { METHOD_GETTABLE_RESP, "PerfAdmGetTableResp(" }, + { 0, NULL } +}; + +/* RMPP Types */ +#define RMPP_ILLEGAL 0 +#define RMPP_DATA 1 +#define RMPP_ACK 2 +#define RMPP_STOP 3 +#define RMPP_ABORT 4 +static const value_string RMPP_Packet_Types[] = { + { RMPP_ILLEGAL, "Illegal RMPP Type (0)! " }, + { RMPP_DATA, "RMPP (DATA)" }, + { RMPP_ACK, "RMPP (ACK)" }, + { RMPP_STOP, "RMPP (STOP)" }, + { RMPP_ABORT, "RMPP (ABORT)" }, + { 0, NULL } +}; +static const value_string RMPP_Status[] = { + { 0, " (Normal)" }, + { 1, " (Resources Exhausted)" }, + { 118, " (Total Time Too Long)" }, + { 119, " (Inconsistent Last and PayloadLength)" }, + { 120, " (Inconsistent First and Segment Number)" }, + { 121, " (Bad RMPPType)" }, + { 122, " (NewWindowLast Too Small)" }, + { 123, " (SegmentNumber Too Big)" }, + { 124, " (Illegal Status)" }, + { 125, " (Unsupported Version)" }, + { 126, " (Too Many Retries)" }, + { 127, " (Unspecified - Unknown Error Code on ABORT)" }, + { 0, NULL } +}; + +/* MAD_t +* Structure to hold information from the common MAD header. +* This is necessary because the MAD header contains information which significantly changes the dissection algorithm. */ +#define STL_MAX_MAD_PAYLOAD 2048 +typedef struct _MAD { + guint8 BaseVersion; + guint8 MgmtClass; + guint8 ClassVersion; + guint8 Method; + guint16 Status; /* D = bit 15 when DR */ + guint8 HopPointer; /* Reserved in DR MADs */ + guint8 HopCount; /* Reserved in DR MADs */ + guint64 TransactionID; + guint16 AttributeID; + guint16 Reserved2; + guint32 AttributeModifier; +} MAD_t; +#define STL_MAX_RMPP_PAYLOAD 2036 +#define RMPP_FLAG_LAST_MASK 0x04 +#define RMPP_FLAG_LAST_SHIFT 2 +#define RMPP_FLAG_FIRST_MASK 0x02 +#define RMPP_FLAG_FIRST_SHIFT 1 +#define RMPP_FLAG_ACTIVE_MASK 0x01 +#define RMPP_FLAG_ACTIVE_SHIFT 0 +typedef struct _RMPP { + guint8 Version; + guint8 Type; + guint8 resptime_flags; + guint8 Status; + guint32 SegmentNumber; + guint32 PayloadLength; +} RMPP_t; + +#define STL_MAX_SA_PA_PAYLOAD 1992 +typedef struct _SA_HEADER { + guint64 SM_Key; + guint16 AttributeOffset; + guint16 Reserved; + guint64 ComponentMask; +} SA_HEADER_t, PA_HEADER_t; + +/* Trap Type/Descriptions for dissection */ +static const value_string NoticeType[] = { + { 0, "Fatal" }, + { 1, "Urgent" }, + { 2, "Security" }, + { 3, "SM" }, + { 4, "Info" }, + { 0, NULL } +}; +static const value_string Trap_Description[] = { + { 64, " (Informational) <GIDADDR> is now in service" }, + { 65, " (Informational) <GIDADDR> is out of service" }, + { 66, " (Informational) New Multicast Group with multicast address <GIDADDR> is now created" }, + { 67, " (Informational) Multicast Group with multicast address <GIDADDR> is now deleted" }, + { 68, " (Informational) Paths indicated by <PATH_REC> and <COMP_MASK> are no longer valid" }, + { 69, " (Informational) Paths indicated by <PATH_REC> and <COMP_MASK> have been recomputed" }, + { 128, " (Urgent) Link State of at least one port of switch at <LIDADDR> has changed" }, + { 129, " (Urgent) Local Link Integrity threshold reached at <LIDADDR><PORTNO>" }, + { 130, " (Urgent) Excessive Buffer OVerrun threshold reached at <LIDADDR><PORTNO>" }, + { 131, " (Urgent) Flow Control Update watchdog timer expired at <LIDADDR><PORTNO>" }, + { 144, " (Informational) CapMask, NodeDesc, LinkWidthEnabled or LinkSpeedEnabled at <LIDADDR> has been modified" }, + { 145, " (Informational) SystemImageGUID at <LIDADDR> has been modified. New value is <SYSTEMIMAGEGUID>" }, + { 256, " (Security) Bad M_Key, <M_KEY> from <LIDADDR> attempted <METHOD> with <ATTRIBUTEID> and <ATTRIBUTEMODIFIER>" }, + { 257, " (Security) Bad P_Key, <KEY> from <LIDADDR1><GIDADDR1><QP1> to <LIDADDR2><GIDADDR2><QP2> on <SL>" }, + { 258, " (Security) Bad Q_Key, <KEY> from <LIDADDR1><GIDADDR1><QP1> to <LIDADDR2><GIDADDR2><QP2> on <SL>" }, + { 259, " (Security) Bad P_Key, <KEY> from <LIDADDR1><GIDADDR1><QP1> to <LIDADDR2><GIDADDR2><QP2> on <SL> at switch <LIDADDR><PORTNO>" }, + { 2048, " (Informational) LinkWidth.Active, LinkWidthDowngrade.TxActive or LinkWidthDowngrade.RxActive of at least one port of switch at <REPORTINGLID> has changed" }, + { 0, NULL } +}; +static const value_string RoutingMode[] = { + { 0x00, "No change" }, + { 0x01, "Linear routing algorithm" }, + { 0x02, "Hierarchical routing algorithm" }, + { 0x04, "Dragonfly routing algorithm" }, + { 0, NULL } +}; +static const value_string AdaptiveRoutingAlgorithm[] = { + { 0x0, "Random" }, + { 0x1, "Greedy" }, + { 0x2, "Random Greedy" }, + { 0, NULL } +}; +static const value_string PortType[] = { + { 0, "Unknown" }, + { 1, "Disconnected" }, + { 2, "Fixed" }, + { 3, "Variable" }, + { 4, "QSFP" }, + { 5, "SiPh_x16" }, + { 6, "Reserved" }, + { 7, "Reserved" }, + { 8, "Reserved" }, + { 9, "Reserved" }, + { 10, "Reserved" }, + { 11, "Reserved" }, + { 12, "Reserved" }, + { 13, "Reserved" }, + { 14, "Reserved" }, + { 15, "Reserved" }, + { 0, NULL } +}; +static const value_string NodeType[] = { + { 1, "FI" }, + { 2, "Switch" }, + { 0, NULL } +}; +static const value_string LinkDownReason[] = { + { 0, "No specified reason" }, + { 1, "Receive Error 0" }, + { 2, "Bad packet length" }, + { 3, "Packet too long" }, + { 4, "Packet too short" }, + { 5, "Bad SLID" }, + { 6, "Bad DLID" }, + { 7, "Bad L2" }, + { 8, "Bad SC" }, + { 9, "Receive Error 8" }, + { 10, "Bad mid tail" }, + { 11, "Receive Error 10" }, + { 12, "Preempt error" }, + { 13, "Preempt VL15" }, + { 14, "Bad VL marker" }, + { 15, "Receive Error 14" }, + { 16, "Receive Error 15" }, + { 17, "Bad head dist" }, + { 18, "Bad tail dist" }, + { 19, "Bad ctrl dist" }, + { 20, "Bad credit ack" }, + { 21, "Unsupported VL marker" }, + { 22, "Bad preempt" }, + { 23, "Bad control flit" }, + { 24, "Exceed multicast limit" }, + { 25, "Receive Error 24" }, + { 26, "Receive Error 25" }, + { 27, "Receive Error 26" }, + { 28, "Receive Error 27" }, + { 29, "Receive Error 28" }, + { 30, "Receive Error 29" }, + { 31, "Receive Error 30" }, + { 32, "Excessive buffer overrun" }, + { 33, "Unknown (locally initiated)" }, + { 35, "Reboot" }, + { 36, "Neighbor Unknown (not locally initiated)" }, + { 39, "FM initiated bounce" }, + { 40, "Link outside speed policy" }, + { 41, "link downgrade outside" }, + { 49, "Disconnected" }, + { 50, "Local media not installed" }, + { 51, "Not installed" }, + { 52, "Chassis config" }, + { 54, "End to end not installed" }, + { 56, "Power policy" }, + { 57, "Linkspeed policy" }, + { 58, "Linkwidth policy" }, + { 60, "Switch management" }, + { 61, "Sma disabled" }, + { 63, "Transient" }, + { 0, NULL } +}; +static const value_string LinkInitReason[] = { + { 0, "No Error" }, + { 1, "Link just came up" }, + { 2, "FM ignoring flapping port" }, + { 8, "FM ignoring, width or speed, outside FM configured policy" }, + { 9, "FM ignoring, quarantined for security" }, + { 10, "FM ignoring, link has insufficient capabilities for FM configuration" }, + { 0, NULL }, +}; +static const value_string DiagCode[] = { + { 0x0000, "Function Ready" }, + { 0x0001, "Performing Self Test" }, + { 0x0002, "Initializing" }, + { 0x0003, "Soft Error - Function has non-fatal error" }, + { 0x0004, "Hard Error - Function has fatal error" }, + { 0, NULL } +}; +static const value_string PortFlitDistanceMode[] = { + { 0x0000, "No State Change" }, + { 0x0001, "STL1 Mode" }, + { 0x0002, "STL2 Mode" }, + { 0, NULL } +}; +static const value_string PortState[] = { + { 0x0000, "No State Change" }, + { 0x0001, "Down (includes failed links)" }, + { 0x0002, "Initialized" }, + { 0x0003, "Armed" }, + { 0x0004, "Active" }, + { 0, NULL } +}; +static const value_string PortPhysicalState[] = { + { 0x0000, "No State Change" }, + { 0x0002, "Polling" }, + { 0x0003, "Disabled" }, + { 0x0004, "PortConfigurationTraining" }, + { 0x0005, "LinkUp" }, + { 0x0006, "LinkErrorRecovery" }, + { 0x0009, "Offline" }, + { 0x000B, "Test" }, + { 0, NULL } +}; +static const value_string OfflineDisabledReason[] = { + { 0x0000, "No reason available" }, + { 0x0001, "Disconnected" }, + { 0x0002, "Local Media not Installed" }, + { 0x0003, "Not Installed" }, + { 0x0004, "Chassis Config" }, + { 0x0005, "Reserved" }, + { 0x0006, "End-to-end not Installed" }, + { 0x0007, "Reserved" }, + { 0x0008, "Power Policy" }, + { 0x0009, "Link Speed Policy" }, + { 0x000A, "Link Width Policy" }, + { 0x000B, "Reserved" }, + { 0x000C, "Switch Mgmt" }, + { 0x000D, "SMA Disabled" }, + { 0x000E, "Reserved" }, + { 0x000F, "Transient" }, + { 0, NULL } +}; +static const value_string MTU[] = { + { 0x0001, "256" }, /* IB_MTU_256 */ + { 0x0002, "512" }, /* IB_MTU_512 */ + { 0x0003, "1024" }, /* IB_MTU_1024 */ + { 0x0004, "2048" }, /* IB_MTU_2048 */ + { 0x0005, "4096" }, /* IB_MTU_4096 */ + { 0x0006, "8192" }, /* STL_MTU_8192 */ + { 0x0007, "10240" }, /* STL_MTU_10240 */ + { 0, NULL } +}; +static const value_string Rate[] = { + { 11, "12.5 Gbps" }, /* IB_STATIC_RATE_14G */ + { 15, "25 Gbps" }, /* IB_STATIC_RATE_25G */ + { 7, "37.5 Gbps" }, /* IB_STATIC_RATE_40G */ + { 12, "50 Gbps" }, /* IB_STATIC_RATE_56G */ + { 9, "75 Gbps" }, /* IB_STATIC_RATE_80G */ + { 16, "100 Gbps" }, /* IB_STATIC_RATE_100G */ + { 17, "200 Gbps" }, /* IB_STATIC_RATE_200G */ + { 0, NULL } +}; +static const true_false_string tfs_PKeyMembershipType = { + "Full", + "Limited" +}; +static const value_string MADAttrModSectionVLarb[] = { + { 0, "Arbitration Low Weight Elements" }, + { 1, "Arbitration High Weight Elements" }, + { 2, "Preemption Weight Elements" }, + { 3, "Preemption Matrix" }, + { 0, NULL } +}; +static const value_string MADAttrModSectionVLarb_short[] = { + { 0, "Low Weight" }, + { 1, "High Weight" }, + { 2, "Preemption Weight" }, + { 3, "Preemption Matrix" }, + { 0, NULL } +}; +static const value_string SA_SC_VLx[] = { + { SA_ATTR_ID_SC_VLNT_MAPTBL_RECORD, "nt" }, + { SA_ATTR_ID_SC_VLT_MAPTBL_RECORD, "t" }, + { SA_ATTR_ID_SC_VLR_MAPTBL_RECORD, "r" }, + { 0, NULL } +}; +static const value_string SM_SC_VLx[] = { + { SM_ATTR_ID_SC_VLNT_MAPPING_TABLE, "nt" }, + { SM_ATTR_ID_SC_VLT_MAPPING_TABLE, "t" }, + { SM_ATTR_ID_SC_VLR_MAPPING_TABLE, "r" }, + { 0, NULL } +}; +static const value_string AdaptiveRoutingThreshold[] = { + { 0, "Default tuning" }, + { 1, "Consumed nearly all of the buffering(or Tags) for a VL (~100%)" }, + { 2, "90%" }, + { 3, "80%" }, + { 4, "70%" }, + { 5, "65%" }, + { 6, "60%" }, + { 7, "55%" }, + { 0, NULL } +}; +static const value_string LinkQualityIndicator[] = { + { 0, "Down" }, + { 1, "Bad" }, + { 2, "Poor" }, + { 3, "Good" }, + { 4, "Very Good" }, + { 5, "Excellent" }, + { 6, "Reserved" }, + { 7, "Reserved" }, + { 0, NULL }, +}; +/*static const value_string LinkQualityIndicatorLong[] = { + { 0, "link down" }, + { 1, "working far below acceptable link quality, recommend immediate corrective action" }, + { 2, "working below acceptable link quality, recommend consider timely corrective action" }, + { 3, "working on low end of acceptable link quality, recommended to consider corrective action on next maintenance window" }, + { 4, "working slightly below preferred link quality, but no action required" }, + { 5, "working at or above preferred link quality, no action needed" }, + { 6, "Reserved" }, + { 7, "Reserved" }, + { 0, NULL }, +};*/ +static const true_false_string tfs_NeighborFWAuthenBypass = { + "Not Authenticated", + "Authenticated" +}; +static const true_false_string tfs_SwPortCongSetting_CtrlType = { + "Credit Starvation", + "Packet Marketing" +}; +static const value_string pathrecord_lidlen[] = { + { 0, "16 bits" }, + { 1, "20 bits" }, + { 2, "24 bits" }, + { 3, "32 bits" }, + { 0, NULL } +}; +static const true_false_string tfs_clear_dont_clear = { + "Clear", + "Don't Clear" +}; +static const value_string MAD_Status_InvalidField[] = { + { 0, "No Invalid Fields" }, + { 1, "Bad Version" }, + { 2, "Method not supported" }, + { 3, "The method/attribute combination is not supported" }, + { 4, "Reserved" }, + { 5, "Reserved" }, + { 6, "Reserved" }, + { 7, "One or more fields in the attribute or attribute modifier contain an invalid value" }, + { 0, NULL } +}; +static const true_false_string tfs_busy_not_busy = { + "Busy", + "Not Busy" +}; +static const true_false_string tfs_redirect_no_redirect = { + "Redirect", + "No Redirect" +}; +static const value_string FocusPortFlags[] = { + { 0, "OK" }, + { 1, "PMA Ignore" }, + { 2, "PMA Failure" }, + { 3, "Topo Failure" }, + { 0, NULL }, +}; + +#define PM_UTIL_BUCKETS 10 +#define PM_ERR_BUCKETS 5 + +/* Wireshark ID */ +static gint proto_opa_mad = -1; + +/* Variables to hold expansion values between packets */ +static gint ett_payload = -1; +static gint ett_sm_lid = -1; +static gint ett_sm_dr = -1; +static gint ett_sa = -1; +static gint ett_pm = -1; +static gint ett_pa = -1; +static gint ett_mad = -1; +static gint ett_mad_status = -1; +static gint ett_mad_attributemod = -1; +static gint ett_rmpp = -1; +static gint ett_sm_attribute = -1; +static gint ett_sa_attribute = -1; +static gint ett_pm_attribute = -1; +static gint ett_pa_attribute = -1; + +static gint ett_noticestraps = -1; +static gint ett_datadetails = -1; +static gint ett_datadetails_trap259datavalid = -1; +static gint ett_informinfo = -1; +static gint ett_classportinfo = -1; +static gint ett_classportinfo_redirect = -1; +static gint ett_classportinfo_trap = -1; + +static gint ett_nodedescription = -1; +static gint ett_nodeinfo = -1; +static gint ett_switchinfo = -1; +static gint ett_switchinfo_switchcapabilitymask = -1; +static gint ett_portinfo = -1; +static gint ett_portinfo_vl = -1; +static gint ett_portinfo_link = -1; +static gint ett_portinfo_portmode = -1; +static gint ett_portinfo_flitcontrol = -1; +static gint ett_portinfo_porterroraction = -1; +static gint ett_portinfo_neighbormtu = -1; +static gint ett_portinfo_xmitq = -1; +static gint ett_portinfo_capmask = -1; +static gint ett_portinfo_capmask3 = -1; +static gint ett_portstates = -1; +static gint ett_pkeytable = -1; +static gint ett_pkeytable_block = -1; +static gint ett_sltoscmapping = -1; +static gint ett_sltoscmapping_block = -1; +static gint ett_sctoscmapping = -1; +static gint ett_sctoscmapping_block = -1; +static gint ett_sctoslmapping = -1; +static gint ett_sctoslmapping_block = -1; +static gint ett_sctovlxmappingtable = -1; +static gint ett_sctovlxmappingtable_block = -1; +static gint ett_vlarbitrationtable = -1; +static gint ett_vlarbitrationtable_port = -1; +static gint ett_linearforwardingtable = -1; +static gint ett_linearforwardingtable_block = -1; +static gint ett_multicastforwardingtable = -1; +static gint ett_multicastforwardingtable_block = -1; +static gint ett_portgroupforwardingtable = -1; +static gint ett_portgroupforwardingtable_block = -1; +static gint ett_portgrouptable = -1; +static gint ett_portgrouptable_block = -1; +static gint ett_sminfo = -1; +static gint ett_ledinfo = -1; +static gint ett_cableinfo = -1; +static gint ett_aggregate = -1; +static gint ett_buffercontroltable = -1; +static gint ett_buffercontroltable_port = -1; +static gint ett_fabricinforecord = -1; +static gint ett_congestioninfo = -1; +static gint ett_switchcongestionlog = -1; +static gint ett_switchcongestionlog_entry = -1; +static gint ett_switchcongestionsetting = -1; +static gint ett_switchportcongestionsetting = -1; +static gint ett_switchportcongestionsetting_port = -1; +static gint ett_hficongestionlog = -1; +static gint ett_hficongestionlog_entry = -1; +static gint ett_hficongestionsetting = -1; +static gint ett_hficongestioncontroltable = -1; +static gint ett_hficongestioncontroltable_block = -1; +static gint ett_portinforecord_linkdownreason = -1; +static gint ett_portinforecord_linkdownreason_entry = -1; +static gint ett_scmappingrecord = -1; +static gint ett_lftrecord = -1; +static gint ett_linkrecord = -1; +static gint ett_servicerecord = -1; +static gint ett_pathrecord = -1; +static gint ett_pathrecord_dgid = -1; +static gint ett_pathrecord_sgid = -1; +static gint ett_mcmemberrecord = -1; +static gint ett_tracerecord = -1; +static gint ett_multipathrecord_gid = -1; +static gint ett_multipathrecord_guid = -1; +static gint ett_multipathrecord_lid = -1; +static gint ett_cableinforecord = -1; +static gint ett_serviceassocrecord = -1; +static gint ett_sctoslmappingtablerecord = -1; +static gint ett_portgroupforwardingtablerecord = -1; +static gint ett_vfinforecord = -1; +static gint ett_quarantinednoderecord = -1; +static gint ett_portstatus = -1; +static gint ett_portstatus_vl = -1; +static gint ett_clearportstatus = -1; +static gint ett_clearportstatus_counterselectmask = -1; +static gint ett_dataportcounters = -1; +static gint ett_dataportcounters_port = -1; +static gint ett_dataportcounters_vl = -1; +static gint ett_errorportcounters = -1; +static gint ett_errorportcounters_port = -1; +static gint ett_errorportinfo = -1; +static gint ett_errorportinfoport = -1; +static gint ett_errorportinfo_portrcverrorinfo = -1; +static gint ett_errorportinfo_excessivebufferoverruninfo = -1; +static gint ett_errorportinfo_portxmitconstrainterrorinfo = -1; +static gint ett_errorportinfo_portrcvconstrainterrorinfo = -1; +static gint ett_errorportinfo_portrcvswitchrelayerrorinfo = -1; +static gint ett_errorportinfo_uncorrectableerrorinfo = -1; +static gint ett_errorportinfo_fmconfigerrorinfo = -1; +static gint ett_getgrouplist = -1; +static gint ett_getgroupinfo = -1; +static gint ett_getgroupinfoutilstats = -1; +static gint ett_getgroupinfoutilbuckets = -1; +static gint ett_getgroupinfoerrorsummary = -1; +static gint ett_getgroupinfoerrintegritybucket = -1; +static gint ett_getgroupinfoerrcongestionbucket = -1; +static gint ett_getgroupinfoerrsmacongestionbucket = -1; +static gint ett_getgroupinfoerrbubblebucket = -1; +static gint ett_getgroupinfoerrsecuritybucket = -1; +static gint ett_getgroupinfoerrroutingbucket = -1; +static gint ett_getportcounters = -1; +static gint ett_clearportcounters = -1; +static gint ett_clearportcounters_counterselectmask = -1; +static gint ett_clearallportcounters = -1; +static gint ett_clearallportcounters_counterselectmask = -1; +static gint ett_pmconfig = -1; +static gint ett_getgroupconfig = -1; +static gint ett_getgroupconfigport = -1; +static gint ett_movefreezeframeold = -1; +static gint ett_movefreezeframenew = -1; +static gint ett_getfocusports = -1; +static gint ett_getfocusportsport = -1; +static gint ett_getimageinfo = -1; +static gint ett_getimageinfosm = -1; +static gint ett_getvflist = -1; +static gint ett_getvfinfo = -1; +static gint ett_getvfinfoutilstats = -1; +static gint ett_getvfinfoutilbuckets = -1; +static gint ett_getvfinfoerrorsummary = -1; +static gint ett_getvfinfoerrintegritybucket = -1; +static gint ett_getvfinfoerrcongestionbucket = -1; +static gint ett_getvfinfoerrsmacongestionbucket = -1; +static gint ett_getvfinfoerrbubblebucket = -1; +static gint ett_getvfinfoerrsecuritybucket = -1; +static gint ett_getvfinfoerrroutingbucket = -1; +static gint ett_getvfconfig = -1; +static gint ett_getvfconfigport = -1; +static gint ett_getvffocusports = -1; +static gint ett_getvffocusportsport = -1; +static gint ett_getvfportcounters = -1; +static gint ett_clearvfportcounters = -1; +static gint ett_clearvfportcounters_counterselectmask = -1; + +/* Reserved Fields */ +static gint hf_opa_reserved8 = -1; +static gint hf_opa_reserved16 = -1; +static gint hf_opa_reserved24 = -1; +static gint hf_opa_reserved32 = -1; +static gint hf_opa_reserved64 = -1; +/* opa_MAD Dissector */ +static gint hf_opa_etype = -1; +static gint hf_opa_etype_reserved16 = -1; +/* SM Header - Lid Routed*/ +static gint hf_opa_sm_lid = -1; +static gint hf_opa_sm_m_key = -1; +/* SM Header - Directed Route */ +static gint hf_opa_sm_dr = -1; +static gint hf_opa_sm_dr_slid = -1; +static gint hf_opa_sm_dr_dlid = -1; +static gint hf_opa_sm_dr_initial_path = -1; +static gint hf_opa_sm_dr_return_path = -1; +static gint hf_opa_sm_dr_reserved64 = -1; +/* SA Header */ +static gint hf_opa_sa = -1; +static gint hf_opa_sa_sm_key = -1; +static gint hf_opa_sa_attribute_offset = -1; +static gint hf_opa_sa_component_mask = -1; +/* PM Header / PA Header */ +static gint hf_opa_pm = -1; +static gint hf_opa_pa = -1; +static gint hf_opa_pa_sm_key = -1; +static gint hf_opa_pa_attribute_offset = -1; +static gint hf_opa_pa_component_mask = -1; +/* Other Vendor Header */ +static gint hf_opa_vendor = -1; +static gint hf_opa_application = -1; +static gint hf_opa_reservedmclass = -1; +static gint hf_opa_unknown = -1; + +/* MAD Header */ +static gint hf_opa_mad = -1; +static gint hf_opa_mad_base_version = -1; +static gint hf_opa_mad_mgmt_class = -1; +static gint hf_opa_mad_class_version = -1; +static gint hf_opa_mad_method = -1; +static gint hf_opa_mad_status = -1; +static gint hf_opa_mad_status_DR_D = -1; +static gint hf_opa_mad_status_DR_status = -1; +static gint hf_opa_mad_status_DR_Hop_Pointer = -1; +static gint hf_opa_mad_status_DR_Hop_Count = -1; +static gint hf_opa_mad_status_NM_ClassSpecific = -1; +static gint hf_opa_mad_status_NM_reserved1 = -1; +static gint hf_opa_mad_status_NM_InvalidField = -1; +static gint hf_opa_mad_status_NM_RedirectRqrd = -1; +static gint hf_opa_mad_status_NM_Busy = -1; +static const gint *_mad_status[] = { + &hf_opa_mad_status_NM_ClassSpecific, + &hf_opa_mad_status_NM_reserved1, + &hf_opa_mad_status_NM_InvalidField, + &hf_opa_mad_status_NM_RedirectRqrd, + &hf_opa_mad_status_NM_Busy, + NULL +}; +static gint hf_opa_mad_transaction_id = -1; +static gint hf_opa_mad_attribute_id = -1; +static gint hf_opa_attribute_modifier = -1; +static gint hf_opa_attribute_modifier_A = -1; +static gint hf_opa_attribute_modifier_A2 = -1; +static gint hf_opa_attribute_modifier_A3 = -1; +static gint hf_opa_attribute_modifier_A4 = -1; +static gint hf_opa_attribute_modifier_A5 = -1; +static gint hf_opa_attribute_modifier_A6 = -1; +static gint hf_opa_attribute_modifier_B = -1; +static gint hf_opa_attribute_modifier_B2 = -1; +static gint hf_opa_attribute_modifier_B3 = -1; +static gint hf_opa_attribute_modifier_B4 = -1; +static gint hf_opa_attribute_modifier_B5 = -1; +static gint hf_opa_attribute_modifier_E = -1; +static gint hf_opa_attribute_modifier_I = -1; +static gint hf_opa_attribute_modifier_L = -1; +static gint hf_opa_attribute_modifier_NP = -1; +static gint hf_opa_attribute_modifier_NB = -1; +static gint hf_opa_attribute_modifier_N2 = -1; +static gint hf_opa_attribute_modifier_P = -1; +static gint hf_opa_attribute_modifier_P2 = -1; +static gint hf_opa_attribute_modifier_P3 = -1; +static gint hf_opa_attribute_modifier_S = -1; +static gint hf_opa_attribute_modifier_S2 = -1; +static gint hf_opa_attribute_modifier_Y = -1; +static const gint *_attribute_modifier_Nps2AP[] = { + &hf_opa_attribute_modifier_NP, + &hf_opa_attribute_modifier_S2, + &hf_opa_attribute_modifier_A, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NpS2P[] = { + &hf_opa_attribute_modifier_NP, + &hf_opa_attribute_modifier_S2, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NpAP[] = { + &hf_opa_attribute_modifier_NP, + &hf_opa_attribute_modifier_A, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NbP2B[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_P2, + &hf_opa_attribute_modifier_B, + NULL +}; +static const gint *_attribute_modifier_NbA2B2IE[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_A2, + &hf_opa_attribute_modifier_B2, + &hf_opa_attribute_modifier_I, + &hf_opa_attribute_modifier_E, + NULL +}; +static const gint *_attribute_modifier_NpSAP[] = { + &hf_opa_attribute_modifier_NP, + &hf_opa_attribute_modifier_S, + &hf_opa_attribute_modifier_A, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NbA3B3[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_A3, + &hf_opa_attribute_modifier_B3, + NULL +}; +static const gint *_attribute_modifier_NbP3A4B4[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_P3, + &hf_opa_attribute_modifier_A4, + &hf_opa_attribute_modifier_B4, + NULL +}; +static const gint *_attribute_modifier_A5LP[] = { + &hf_opa_attribute_modifier_A5, + &hf_opa_attribute_modifier_L, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NbYAP[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_Y, + &hf_opa_attribute_modifier_A, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NpP[] = { + &hf_opa_attribute_modifier_NP, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NbP[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_P, + NULL +}; +static const gint *_attribute_modifier_NbP3A6B5[] = { + &hf_opa_attribute_modifier_NB, + &hf_opa_attribute_modifier_P3, + &hf_opa_attribute_modifier_A6, + &hf_opa_attribute_modifier_B5, + NULL +}; +/* RMPP Header */ +static gint hf_opa_rmpp = -1; +static gint hf_opa_rmpp_version = -1; +static gint hf_opa_rmpp_type = -1; +static gint hf_opa_rmpp_r_resp_time = -1; +static gint hf_opa_rmpp_flags_last = -1; +static gint hf_opa_rmpp_flags_first = -1; +static gint hf_opa_rmpp_flags_active = -1; +static gint hf_opa_rmpp_status = -1; +static gint hf_opa_rmpp_data1 = -1; +static gint hf_opa_rmpp_data2 = -1; +static gint hf_opa_rmpp_segment_number = -1; +static gint hf_opa_rmpp_payload_length32 = -1; +static gint hf_opa_rmpp_new_window_last = -1; +/* SA Packets */ +/* SA RID */ +static gint hf_opa_sa_Lid = -1; +static gint hf_opa_sa_EndportLID = -1; +static gint hf_opa_sa_PortNum = -1; +static gint hf_opa_sa_InputPortNum = -1; +static gint hf_opa_sa_OutputPortNum = -1; +static gint hf_opa_sa_Port = -1; +static gint hf_opa_sa_reserved14 = -1; +static gint hf_opa_sa_BlockNum_18b = -1; +static gint hf_opa_sa_Position = -1; +static gint hf_opa_sa_reserved9 = -1; +static gint hf_opa_sa_BlockNum_21b = -1; +static gint hf_opa_sa_BlockNum_8b = -1; +static gint hf_opa_sa_BlockNum_16b = -1; +static gint hf_opa_sa_SubscriberLID = -1; +static gint hf_opa_sa_Enum = -1; +static gint hf_opa_sa_FromLID = -1; +static gint hf_opa_sa_FromPort = -1; +static gint hf_opa_sa_ServiceID = -1; +static gint hf_opa_sa_ServiceLID = -1; +static gint hf_opa_sa_ServiceP_Key = -1; +static gint hf_opa_sa_ServiceGID = -1; +static gint hf_opa_sa_MGID = -1; +static gint hf_opa_sa_PortGID = -1; + +/* Attribute Specfic Fields */ +static gint hf_opa_Notice = -1; +static gint hf_opa_Notice_IsGeneric = -1; +static gint hf_opa_Notice_Type = -1; +static gint hf_opa_Notice_ProducerType = -1; +static gint hf_opa_Notice_TrapNumber = -1; +static gint hf_opa_Notice_VendorID = -1; +static gint hf_opa_Notice_DeviceID = -1; +static gint hf_opa_Notice_IssuerLID = -1; +static gint hf_opa_Notice_IssuerGID = -1; +static gint hf_opa_Notice_Toggle = -1; +static gint hf_opa_Notice_Count = -1; +static gint hf_opa_Notice_ClassDataDetails = -1; +static gint hf_opa_Trap = -1; +static gint hf_opa_Trap_GID = -1; +static gint hf_opa_Trap_LID = -1; +static gint hf_opa_Trap_PORTNO = -1; +static gint hf_opa_Trap_CAPABILITYMASK = -1; +static gint hf_opa_Trap_CAPABILITYMASK3 = -1; +static gint hf_opa_Trap_144_reserved = -1; +static gint hf_opa_Trap_LinkWidthDowngradeEnabledChange = -1; +static gint hf_opa_Trap_LinkSpeecEnabledChange = -1; +static gint hf_opa_Trap_LinkWidthEnabledChange = -1; +static gint hf_opa_Trap_NodeDescriptionChange = -1; +static gint hf_opa_Trap_SystemImageGUID = -1; +static gint hf_opa_Trap_DRSLID = -1; +static gint hf_opa_Trap_Method = -1; +static gint hf_opa_Trap_AttributeID = -1; +static gint hf_opa_Trap_AttributeModifier = -1; +static gint hf_opa_Trap_MKey = -1; +static gint hf_opa_Trap_DRNotice = -1; +static gint hf_opa_Trap_DRPathTruncated = -1; +static gint hf_opa_Trap_DRHopCount = -1; +static gint hf_opa_Trap_DRNoticeReturnPath = -1; +static gint hf_opa_Trap_Key = -1; +static gint hf_opa_Trap_SL = -1; +static gint hf_opa_Trap_SL_reserved = -1; +static gint hf_opa_Trap_QP = -1; +static gint hf_opa_Trap_DataValid = -1; +static gint hf_opa_Trap_DataValid_Lid1 = -1; +static gint hf_opa_Trap_DataValid_Lid2 = -1; +static gint hf_opa_Trap_DataValid_PKey = -1; +static gint hf_opa_Trap_DataValid_SL = -1; +static gint hf_opa_Trap_DataValid_QP1 = -1; +static gint hf_opa_Trap_DataValid_QP2 = -1; +static gint hf_opa_Trap_DataValid_Gid1 = -1; +static gint hf_opa_Trap_DataValid_Gid2 = -1; +static gint hf_opa_Trap_DataValid_Reserved = -1; +static const gint *_Trap_DataValid[] = { + &hf_opa_Trap_DataValid_Lid1, + &hf_opa_Trap_DataValid_Lid2, + &hf_opa_Trap_DataValid_PKey, + &hf_opa_Trap_DataValid_SL, + &hf_opa_Trap_DataValid_QP1, + &hf_opa_Trap_DataValid_QP2, + &hf_opa_Trap_DataValid_Gid1, + &hf_opa_Trap_DataValid_Gid2, + &hf_opa_Trap_DataValid_Reserved, + NULL +}; +static gint hf_opa_Trap_PKey = -1; +static gint hf_opa_ClassPortInfo = -1; +static gint hf_opa_ClassPortInfo_BaseVersion = -1; +static gint hf_opa_ClassPortInfo_ClassVersion = -1; +static gint hf_opa_ClassPortInfo_CapMask = -1; +static gint hf_opa_ClassPortInfo_CapMask2 = -1; +static gint hf_opa_ClassPortInfo_RespTimeValue = -1; +static gint hf_opa_ClassPortInfo_Redirect_GID = -1; +static gint hf_opa_ClassPortInfo_Redirect_TClass = -1; +static gint hf_opa_ClassPortInfo_Redirect_SL = -1; +static gint hf_opa_ClassPortInfo_Redirect_reserved = -1; +static gint hf_opa_ClassPortInfo_Redirect_FlowLabel = -1; +static gint hf_opa_ClassPortInfo_Redirect_LID = -1; +static gint hf_opa_ClassPortInfo_Redirect_reserved2 = -1; +static gint hf_opa_ClassPortInfo_Redirect_QP = -1; +static gint hf_opa_ClassPortInfo_Redirect_Q_Key = -1; +static gint hf_opa_ClassPortInfo_Trap_GID = -1; +static gint hf_opa_ClassPortInfo_Trap_TClass = -1; +static gint hf_opa_ClassPortInfo_Trap_reserved = -1; +static gint hf_opa_ClassPortInfo_Trap_FlowLabel = -1; +static gint hf_opa_ClassPortInfo_Trap_LID = -1; +static gint hf_opa_ClassPortInfo_Trap_HopLimit = -1; +static gint hf_opa_ClassPortInfo_Trap_QP = -1; +static gint hf_opa_ClassPortInfo_Trap_Q_Key = -1; +static gint hf_opa_ClassPortInfo_Trap_P_Key = -1; +static gint hf_opa_ClassPortInfo_Redirect_P_Key = -1; +static gint hf_opa_ClassPortInfo_Trap_SL = -1; +static gint hf_opa_ClassPortInfo_Trap_reserved2 = -1; +static gint hf_opa_InformInfo = -1; +static gint hf_opa_InformInfo_GID = -1; +static gint hf_opa_InformInfo_LIDRangeBegin = -1; +static gint hf_opa_InformInfo_LIDRangeEnd = -1; +static gint hf_opa_InformInfo_IsGeneric = -1; +static gint hf_opa_InformInfo_Subscribe = -1; +static gint hf_opa_InformInfo_Type = -1; +static gint hf_opa_InformInfo_TrapNumber = -1; +static gint hf_opa_InformInfo_DeviceID = -1; +static gint hf_opa_InformInfo_QPN = -1; +static gint hf_opa_InformInfo_reserved = -1; +static gint hf_opa_InformInfo_RespTimeValue = -1; +static gint hf_opa_InformInfo_ProducerType = -1; +static gint hf_opa_InformInfo_VendorID = -1; +/* SM */ +static gint hf_opa_NodeDescription = -1; +static gint hf_opa_NodeDescription_NodeString = -1; +static gint hf_opa_NodeInfo = -1; +static gint hf_opa_NodeInfo_BaseVersion = -1; +static gint hf_opa_NodeInfo_ClassVersion = -1; +static gint hf_opa_NodeInfo_NodeType = -1; +static gint hf_opa_NodeInfo_NumPorts = -1; +static gint hf_opa_NodeInfo_SystemImageGUID = -1; +static gint hf_opa_NodeInfo_NodeGUID = -1; +static gint hf_opa_NodeInfo_PortGUID = -1; +static gint hf_opa_NodeInfo_PartitionCap = -1; +static gint hf_opa_NodeInfo_DeviceID = -1; +static gint hf_opa_NodeInfo_Revision = -1; +static gint hf_opa_NodeInfo_LocalPortNum = -1; +static gint hf_opa_NodeInfo_VendorID = -1; +static gint hf_opa_SwitchInfo = -1; +static gint hf_opa_SwitchInfo_LinearFDBCap = -1; +static gint hf_opa_SwitchInfo_MulticastFDBCap = -1; +static gint hf_opa_SwitchInfo_LinearFDBTop = -1; +static gint hf_opa_SwitchInfo_MulticastFDBTop = -1; +static gint hf_opa_SwitchInfo_CollectiveCap = -1; +static gint hf_opa_SwitchInfo_CollectiveTop = -1; +static gint hf_opa_SwitchInfo_IPAddrIPv6 = -1; +static gint hf_opa_SwitchInfo_IPAddrIPv4 = -1; +static gint hf_opa_SwitchInfo_LifeTimeValue = -1; +static gint hf_opa_SwitchInfo_PortStateChange = -1; +static gint hf_opa_SwitchInfo_reserved2 = -1; +static gint hf_opa_SwitchInfo_PartitionEnforcementCap = -1; +static gint hf_opa_SwitchInfo_PortGroupCap = -1; +static gint hf_opa_SwitchInfo_PortGroupTop = -1; +static gint hf_opa_SwitchInfo_SupportedRoutingMode = -1; +static gint hf_opa_SwitchInfo_EnabledRoutingMode = -1; +static gint hf_opa_SwitchInfo_reserved3 = -1; +static gint hf_opa_SwitchInfo_EnhancedPortZero = -1; +static gint hf_opa_SwitchInfo_reserved4 = -1; +static gint hf_opa_SwitchInfo_reserved5 = -1; +static gint hf_opa_SwitchInfo_CollectiveMask = -1; +static gint hf_opa_SwitchInfo_MulticastMask = -1; +static gint hf_opa_SwitchInfo_AdaptiveRoutingEnable = -1; +static gint hf_opa_SwitchInfo_AdaptiveRoutingPause = -1; +static gint hf_opa_SwitchInfo_AdaptiveRoutingAlgorithm = -1; +static gint hf_opa_SwitchInfo_AdaptiveRoutingFrequency = -1; +static gint hf_opa_SwitchInfo_AdaptiveRoutingLostRoutesOnly = -1; +static gint hf_opa_SwitchInfo_AdaptiveRoutingThreshold = -1; +static gint hf_opa_SwitchInfo_reserved6 = -1; +static const gint *_SwitchInfo_AdaptiveRouting[] = { + &hf_opa_SwitchInfo_AdaptiveRoutingEnable, + &hf_opa_SwitchInfo_AdaptiveRoutingPause, + &hf_opa_SwitchInfo_AdaptiveRoutingAlgorithm, + &hf_opa_SwitchInfo_AdaptiveRoutingFrequency, + &hf_opa_SwitchInfo_AdaptiveRoutingLostRoutesOnly, + &hf_opa_SwitchInfo_AdaptiveRoutingThreshold, + &hf_opa_SwitchInfo_reserved6, + NULL +}; +static gint hf_opa_SwitchInfo_SwitchCapabilityMask = -1; +static gint hf_opa_SwitchInfo_SwitchCapabilityMask_reserved = -1; +static gint hf_opa_SwitchInfo_SwitchCapabilityMask_IsAddrRangeConfigSupported = -1; +static gint hf_opa_SwitchInfo_SwitchCapabilityMask_reserved2 = -1; +static gint hf_opa_SwitchInfo_SwitchCapabilityMask_IsAdaptiveRoutingSupported = -1; +static const gint *_SwitchInfo_SwitchCapabilityMask[] = { + &hf_opa_SwitchInfo_SwitchCapabilityMask_reserved, + &hf_opa_SwitchInfo_SwitchCapabilityMask_IsAddrRangeConfigSupported, + &hf_opa_SwitchInfo_SwitchCapabilityMask_reserved2, + &hf_opa_SwitchInfo_SwitchCapabilityMask_IsAdaptiveRoutingSupported, + NULL +}; +static gint hf_opa_SwitchInfo_CapabilityMaskCollectives = -1; +static gint hf_opa_PortInfo = -1; +static gint hf_opa_PortInfo_LID = -1; +static gint hf_opa_PortInfo_FlowControlMask = -1; +static gint hf_opa_PortInfo_VL_PreemptCap = -1; +static gint hf_opa_PortInfo_VL_reserved = -1; +static gint hf_opa_PortInfo_VL_Cap = -1; +static gint hf_opa_PortInfo_VL_HighLimit = -1; +static gint hf_opa_PortInfo_VL_PreemptingLimit = -1; +static gint hf_opa_PortInfo_VL_ArbitrationHighCap = -1; +static gint hf_opa_PortInfo_VL_ArbitrationLowCap = -1; +static gint hf_opa_PortInfo_PortPhysConfig_reserved = -1; +static gint hf_opa_PortInfo_PortPhysConfig_PortType = -1; +static gint hf_opa_PortInfo_MultiCollectMask_reserved = -1; +static gint hf_opa_PortInfo_MultiCollectMask_CollectiveMask = -1; +static gint hf_opa_PortInfo_MultiCollectMask_MulticastMask = -1; +static gint hf_opa_PortInfo_M_KeyProtectBits = -1; +static gint hf_opa_PortInfo_S1_reserved = -1; +static gint hf_opa_PortInfo_LMC = -1; +static gint hf_opa_PortInfo_S2_reserved = -1; +static gint hf_opa_PortInfo_MasterSMSL = -1; +static gint hf_opa_PortInfo_LinkInitReason = -1; +static gint hf_opa_PortInfo_PartitionEnforcementInbound = -1; +static gint hf_opa_PortInfo_PartitionEnforcementOutbound = -1; +static gint hf_opa_PortInfo_S3_reserved2 = -1; +static gint hf_opa_PortInfo_S4_reserved = -1; +static gint hf_opa_PortInfo_OperationalVL = -1; +static gint hf_opa_PortInfo_P_Keys_P_Key_8B = -1; +static gint hf_opa_PortInfo_P_Keys_P_Key_10B = -1; +static gint hf_opa_PortInfo_M_KeyViolations = -1; +static gint hf_opa_PortInfo_P_KeyViolations = -1; +static gint hf_opa_PortInfo_Q_KeyViolations = -1; +static gint hf_opa_PortInfo_TrapQueuePair_reserved = -1; +static gint hf_opa_PortInfo_TrapQueuePair = -1; +static gint hf_opa_PortInfo_SAQueuePair_reserved = -1; +static gint hf_opa_PortInfo_SAQueuePair = -1; +static gint hf_opa_PortInfo_NeighborPortNum = -1; +static gint hf_opa_PortInfo_LinkDownReason = -1; +static gint hf_opa_PortInfo_NeighborLinkDownReason = -1; +static gint hf_opa_PortInfo_ClientRegister = -1; +static gint hf_opa_PortInfo_MulticastPKeyTrapSuppressEnabled = -1; +static gint hf_opa_PortInfo_Timeout = -1; +static gint hf_opa_PortInfo_LinkSpeedSupported = -1; +static gint hf_opa_PortInfo_LinkSpeedEnabled = -1; +static gint hf_opa_PortInfo_LinkSpeedActive = -1; +static gint hf_opa_PortInfo_LinkWidthSupported = -1; +static gint hf_opa_PortInfo_LinkWidthEnabled = -1; +static gint hf_opa_PortInfo_LinkWidthActive = -1; +static gint hf_opa_PortInfo_LinkWidthDowngrade_Supported = -1; +static gint hf_opa_PortInfo_LinkWidthDowngrade_Enabled = -1; +static gint hf_opa_PortInfo_LinkWidthDowngrade_TxActive = -1; +static gint hf_opa_PortInfo_LinkWidthDowngrade_RxActive = -1; +static gint hf_opa_PortInfo_PortLinkMode_reserved = -1; +static gint hf_opa_PortInfo_PortLinkMode_Supported = -1; +static gint hf_opa_PortInfo_PortLinkMode_Enabled = -1; +static gint hf_opa_PortInfo_PortLinkMode_Active = -1; +static gint hf_opa_PortInfo_PortLTPCRCMode_reserved = -1; +static gint hf_opa_PortInfo_PortLTPCRCMode_Supported = -1; +static gint hf_opa_PortInfo_PortLTPCRCMode_Enabled = -1; +static gint hf_opa_PortInfo_PortLTPCRCMode_Active = -1; +static gint hf_opa_PortInfo_PortMode = -1; +static gint hf_opa_PortInfo_PortMode_reserved = -1; +static gint hf_opa_PortInfo_PortMode_IsActiveOptimizeEnabled = -1; +static gint hf_opa_PortInfo_PortMode_IsPassThroughEnabled = -1; +static gint hf_opa_PortInfo_PortMode_IsVLMarkerEnabled = -1; +static gint hf_opa_PortInfo_PortMode_reserved2 = -1; +static gint hf_opa_PortInfo_PortMode_Is16BTrapQueryEnabled = -1; +static gint hf_opa_PortInfo_PortMode_reserved3 = -1; +static const gint *_PortInfo_PortMode[] = { + &hf_opa_PortInfo_PortMode_reserved, + &hf_opa_PortInfo_PortMode_IsActiveOptimizeEnabled, + &hf_opa_PortInfo_PortMode_IsPassThroughEnabled, + &hf_opa_PortInfo_PortMode_IsVLMarkerEnabled, + &hf_opa_PortInfo_PortMode_reserved2, + &hf_opa_PortInfo_PortMode_Is16BTrapQueryEnabled, + &hf_opa_PortInfo_PortMode_reserved3, + NULL +}; +static gint hf_opa_PortInfo_PortPacketFormats_Supported = -1; +static gint hf_opa_PortInfo_PortPacketFormats_Enabled = -1; +static gint hf_opa_PortInfo_FlitControl_Interleave_reserved = -1; +static gint hf_opa_PortInfo_FlitControl_Interleave_DistanceSupported = -1; +static gint hf_opa_PortInfo_FlitControl_Interleave_DistanceEnabled = -1; +static gint hf_opa_PortInfo_FlitControl_Interleave_MaxNestLevelTxEnabled = -1; +static gint hf_opa_PortInfo_FlitControl_Interleave_MaxNestLevelRxSupported = -1; +static gint hf_opa_PortInfo_FlitControl_Preemption_MinInitial = -1; +static gint hf_opa_PortInfo_FlitControl_Preemption_MinTail = -1; +static gint hf_opa_PortInfo_FlitControl_Preemption_LargePacketLimit = -1; +static gint hf_opa_PortInfo_FlitControl_Preemption_SmallPacketLimit = -1; +static gint hf_opa_PortInfo_FlitControl_Preemption_MaxSmallPacketLimit = -1; +static gint hf_opa_PortInfo_FlitControl_Preemption_PreemptionLimit = -1; +static gint hf_opa_PortInfo_PortErrorAction = -1; +static gint hf_opa_PortInfo_PortErrorAction_ExcessiveBufferOverrun = -1; +static gint hf_opa_PortInfo_PortErrorAction_reserved = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorExceedMulticastLimit = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadControlFlit = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadPreempt = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadVLMarker = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadCrdtAck = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadCtrlDist = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadTailDist = -1; +static gint hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadHeadDist = -1; +static gint hf_opa_PortInfo_PortErrorAction_reserved2 = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadVLMarker = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorPreemptVL15 = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorPreemptError = -1; +static gint hf_opa_PortInfo_PortErrorAction_reserved3 = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadMidTail = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorReserved = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadSC = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadL2 = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadDLID = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadSLID = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorPktLenTooShort = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorPktLenTooLong = -1; +static gint hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadPktLen = -1; +static gint hf_opa_PortInfo_PortErrorAction_reserved4 = -1; +static const gint *_PortInfo_PortErrorAction[] = { + &hf_opa_PortInfo_PortErrorAction_ExcessiveBufferOverrun, + &hf_opa_PortInfo_PortErrorAction_reserved, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorExceedMulticastLimit, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadControlFlit, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadPreempt, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadVLMarker, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadCrdtAck, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadCtrlDist, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadTailDist, + &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadHeadDist, + &hf_opa_PortInfo_PortErrorAction_reserved2, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadVLMarker, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPreemptVL15, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPreemptError, + &hf_opa_PortInfo_PortErrorAction_reserved3, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadMidTail, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorReserved, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadSC, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadL2, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadDLID, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadSLID, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPktLenTooShort, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPktLenTooLong, + &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadPktLen, + &hf_opa_PortInfo_PortErrorAction_reserved4, + NULL +}; +static gint hf_opa_PortInfo_PassThroughControl_EgressPort = -1; +static gint hf_opa_PortInfo_PassThroughControl_reserved = -1; +static gint hf_opa_PortInfo_PassThroughControl_DRControl = -1; +static gint hf_opa_PortInfo_M_KeyLeasePeriod = -1; +static gint hf_opa_PortInfo_BufferUnits_reserved = -1; +static gint hf_opa_PortInfo_BufferUnits_VL15Init = -1; +static gint hf_opa_PortInfo_BufferUnits_VL15CreditRate = -1; +static gint hf_opa_PortInfo_BufferUnits_CreditAck = -1; +static gint hf_opa_PortInfo_BufferUnits_BufferAlloc = -1; +static gint hf_opa_PortInfo_MasterSMLID = -1; +static gint hf_opa_PortInfo_M_Key = -1; +static gint hf_opa_PortInfo_SubnetPrefix = -1; +static gint hf_opa_PortInfo_VL1 = -1; +static gint hf_opa_PortInfo_VL2 = -1; +static gint hf_opa_PortInfo_XmitQ_VLStallCount = -1; +static gint hf_opa_PortInfo_XmitQ_HOQLife = -1; +static gint hf_opa_PortInfo_IPAddrIPv6 = -1; +static gint hf_opa_PortInfo_IPAddrIPv4 = -1; +static gint hf_opa_PortInfo_NeighborNodeGUID = -1; +static gint hf_opa_PortInfo_CapabilityMask = -1; +static gint hf_opa_PortInfo_CapabilityMask_reserved = -1; +static gint hf_opa_PortInfo_CapabilityMask_IsCapabilityMaskNoticeSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask_reserved2 = -1; +static gint hf_opa_PortInfo_CapabilityMask_IsVendorClassSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask_IsDeviceManagementSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask_reserved3 = -1; +static gint hf_opa_PortInfo_CapabilityMask_IsConnectionManagementSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask_reserved4 = -1; +static gint hf_opa_PortInfo_CapabilityMask_IsAutomaticMigrationSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask_reserved5 = -1; +static gint hf_opa_PortInfo_CapabilityMask_IsSM = -1; +static gint hf_opa_PortInfo_CapabilityMask_reserved6 = -1; +static const gint *_PortInfo_CapabilityMask[] = { + &hf_opa_PortInfo_CapabilityMask_reserved, + &hf_opa_PortInfo_CapabilityMask_IsCapabilityMaskNoticeSupported, + &hf_opa_PortInfo_CapabilityMask_reserved2, + &hf_opa_PortInfo_CapabilityMask_IsVendorClassSupported, + &hf_opa_PortInfo_CapabilityMask_IsDeviceManagementSupported, + &hf_opa_PortInfo_CapabilityMask_reserved3, + &hf_opa_PortInfo_CapabilityMask_IsConnectionManagementSupported, + &hf_opa_PortInfo_CapabilityMask_reserved4, + &hf_opa_PortInfo_CapabilityMask_IsAutomaticMigrationSupported, + &hf_opa_PortInfo_CapabilityMask_reserved5, + &hf_opa_PortInfo_CapabilityMask_IsSM, + &hf_opa_PortInfo_CapabilityMask_reserved6, + NULL +}; +static gint hf_opa_PortInfo_CapabilityMask3 = -1; +static gint hf_opa_PortInfo_CapabilityMask3_reserved = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsSnoopSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsAsyncSCtoVLSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsAddrRangeConfigSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsPassThroughSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsSharedSpaceSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask3_reserved2 = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsVLMarkerSupported = -1; +static gint hf_opa_PortInfo_CapabilityMask3_IsVLrSupported = -1; +static const gint *_PortInfo_CapabilityMask3[] = { + &hf_opa_PortInfo_CapabilityMask3_reserved, + &hf_opa_PortInfo_CapabilityMask3_IsSnoopSupported, + &hf_opa_PortInfo_CapabilityMask3_IsAsyncSCtoVLSupported, + &hf_opa_PortInfo_CapabilityMask3_IsAddrRangeConfigSupported, + &hf_opa_PortInfo_CapabilityMask3_IsPassThroughSupported, + &hf_opa_PortInfo_CapabilityMask3_IsSharedSpaceSupported, + &hf_opa_PortInfo_CapabilityMask3_reserved2, + &hf_opa_PortInfo_CapabilityMask3_IsVLMarkerSupported, + &hf_opa_PortInfo_CapabilityMask3_IsVLrSupported, + NULL +}; +static gint hf_opa_PortInfo_OverallBufferSpace = -1; +static gint hf_opa_PortInfo_DiagCode = -1; +static gint hf_opa_PortInfo_ReplayDepth_BufferDepth = -1; +static gint hf_opa_PortInfo_ReplayDepth_WireDepth = -1; +static gint hf_opa_PortInfo_PortNeighborMode_reserved = -1; +static gint hf_opa_PortInfo_PortNeighborMode_MgmtAllowed = -1; +static gint hf_opa_PortInfo_PortNeighborMode_NeighborFWAuthenBypass = -1; +static gint hf_opa_PortInfo_PortNeighborMode_NeighborNodeType = -1; +static gint hf_opa_PortInfo_MTU_reserved = -1; +static gint hf_opa_PortInfo_MTU_Cap = -1; +static gint hf_opa_PortInfo_Resp_reserved = -1; +static gint hf_opa_PortInfo_Resp_TimeValue = -1; +static gint hf_opa_PortInfo_LocalPortNum = -1; +static gint hf_opa_PortStates = -1; +static gint hf_opa_PortStates_reserved = -1; +static gint hf_opa_PortStates_LEDEnabled = -1; +static gint hf_opa_PortStates_IsSMConfigurationStarted = -1; +static gint hf_opa_PortStates_NeighborNormal = -1; +static gint hf_opa_PortStates_OfflineDisabledReason = -1; +static gint hf_opa_PortStates_PortUnsleepState = -1; +static gint hf_opa_PortStates_DownDefaultState = -1; +static gint hf_opa_PortStates_PortPhysicalState = -1; +static gint hf_opa_PortStates_PortState = -1; +static const gint *_PortStates[] = { + &hf_opa_PortStates_reserved, + &hf_opa_PortStates_LEDEnabled, + &hf_opa_PortStates_IsSMConfigurationStarted, + &hf_opa_PortStates_NeighborNormal, + &hf_opa_PortStates_OfflineDisabledReason, + &hf_opa_PortStates_PortUnsleepState, + &hf_opa_PortStates_DownDefaultState, + &hf_opa_PortStates_PortPhysicalState, + &hf_opa_PortStates_PortState, + NULL +}; +static gint hf_opa_PortStates_LinkWidthDowngradeTxActive = -1; +static gint hf_opa_PortStates_LinkWidthDowngradeRxActive = -1; +static gint hf_opa_P_KeyTable = -1; +static gint hf_opa_P_KeyTable_MembershipType = -1; +static gint hf_opa_P_KeyTable_P_KeyBase = -1; +static gint hf_opa_SLtoSCMappingTable = -1; +static gint hf_opa_SLtoSCMappingTable_SLtoSC_HighBits = -1; +static gint hf_opa_SLtoSCMappingTable_SLtoSC_LowBits = -1; +static gint hf_opa_SCtoSCMappingTable = -1; +static gint hf_opa_SCtoSCMappingTable_SCtoSC_HighBits = -1; +static gint hf_opa_SCtoSCMappingTable_SCtoSC_LowBits = -1; +static gint hf_opa_SCtoSLMappingTable = -1; +static gint hf_opa_SCtoSLMappingTable_SCtoSL_HighBits = -1; +static gint hf_opa_SCtoSLMappingTable_SCtoSL_LowBits = -1; +static gint hf_opa_SCtoVLxMappingTable = -1; +static gint hf_opa_SCtoVLxMappingTable_SCtoVLx_HighBits = -1; +static gint hf_opa_SCtoVLxMappingTable_SCtoVLx_LowBits = -1; +static gint hf_opa_VLArbitrationTable = -1; +static gint hf_opa_VLArbitrationTable_reserved = -1; +static gint hf_opa_VLArbitrationTable_VL = -1; +static gint hf_opa_VLArbitrationTable_Weight = -1; +static gint hf_opa_VLArbitrationTable_Matrix = -1; +static gint hf_opa_LinearForwardingTable = -1; +static gint hf_opa_LinearForwardingTable_Port = -1; +static gint hf_opa_MulticastForwardingTable = -1; +static gint hf_opa_MulticastForwardingTable_PortMask = -1; +static gint hf_opa_PortGroupForwardingTable = -1; +static gint hf_opa_PortGroupForwardingTable_Port = -1; +static gint hf_opa_PortGroupTable = -1; +static gint hf_opa_PortGroupTable_PortMask = -1; +static gint hf_opa_SMInfo = -1; +static gint hf_opa_SMInfo_GUID = -1; +static gint hf_opa_SMInfo_SM_Key = -1; +static gint hf_opa_SMInfo_ActCount = -1; +static gint hf_opa_SMInfo_ElapsedTime = -1; +static gint hf_opa_SMInfo_Priority = -1; +static gint hf_opa_SMInfo_ElevatedPriority = -1; +static gint hf_opa_SMInfo_InitialPriority = -1; +static gint hf_opa_SMInfo_SMState = -1; +static gint hf_opa_LedInfo = -1; +static gint hf_opa_LedInfo_LedMask = -1; +static gint hf_opa_LedInfo_reserved = -1; +static gint hf_opa_CableInfo = -1; +static gint hf_opa_CableInfo_Data = -1; +static gint hf_opa_CableInfo_DataStream = -1; +static gint hf_opa_Aggregate = -1; +static gint hf_opa_Aggregate_AttributeID = -1; +static gint hf_opa_Aggregate_Error = -1; +static gint hf_opa_Aggregate_RequestLength = -1; +static gint hf_opa_BufferControlTable = -1; +static gint hf_opa_BufferControlTable_TxOverallSharedLimit = -1; +static gint hf_opa_BufferControlTable_TxDedicatedLimit = -1; +static gint hf_opa_BufferControlTable_TxSharedLimit = -1; +static gint hf_opa_FabricInfoRecord = -1; +static gint hf_opa_FabricInfoRecord_NumHFIs = -1; +static gint hf_opa_FabricInfoRecord_NumSwitches = -1; +static gint hf_opa_FabricInfoRecord_NumInternalHFILinks = -1; +static gint hf_opa_FabricInfoRecord_NumExternalHFILinks = -1; +static gint hf_opa_FabricInfoRecord_NumInternalISLs = -1; +static gint hf_opa_FabricInfoRecord_NumExternalISLs = -1; +static gint hf_opa_FabricInfoRecord_NumDegradedHFILinks = -1; +static gint hf_opa_FabricInfoRecord_NumDegradedISLs = -1; +static gint hf_opa_FabricInfoRecord_NumOmittedHFILinks = -1; +static gint hf_opa_FabricInfoRecord_NumOmittedISLs = -1; +static gint hf_opa_FabricInfoRecord_Reserved = -1; +static gint hf_opa_CongestionInfo = -1; +static gint hf_opa_CongestionInfo_CongestionInfo = -1; +static gint hf_opa_CongestionInfo_ControlTableCap = -1; +static gint hf_opa_CongestionInfo_CongestionLogLength = -1; +static gint hf_opa_SwitchCongestionLog = -1; +static gint hf_opa_SwitchCongestionLog_LogType = -1; +static gint hf_opa_SwitchCongestionLog_CongestionFlags = -1; +static gint hf_opa_SwitchCongestionLog_LogEventsCounter = -1; +static gint hf_opa_SwitchCongestionLog_CurrentTimeStamp = -1; +static gint hf_opa_SwitchCongestionLog_PortMap = -1; +static gint hf_opa_SwitchCongestionLog_SLID = -1; +static gint hf_opa_SwitchCongestionLog_DLID = -1; +static gint hf_opa_SwitchCongestionLog_SC = -1; +static gint hf_opa_SwitchCongestionLog_reserved = -1; +static gint hf_opa_SwitchCongestionLog_TimeStamp = -1; +static gint hf_opa_SwitchCongestionSetting = -1; +static gint hf_opa_SwitchCongestionSetting_Control_Map = -1; +static gint hf_opa_SwitchCongestionSetting_Victim_Mask = -1; +static gint hf_opa_SwitchCongestionSetting_Credit_Mask = -1; +static gint hf_opa_SwitchCongestionSetting_Threshold = -1; +static gint hf_opa_SwitchCongestionSetting_reserved1 = -1; +static gint hf_opa_SwitchCongestionSetting_Packet_Size = -1; +static gint hf_opa_SwitchCongestionSetting_CS_Threshold = -1; +static gint hf_opa_SwitchCongestionSetting_reserved2 = -1; +static gint hf_opa_SwitchCongestionSetting_CS_ReturnDelay = -1; +static gint hf_opa_SwitchCongestionSetting_Marking_Rate = -1; +static gint hf_opa_SwitchPortCongestionSetting = -1; +static gint hf_opa_SwitchPortCongestionSetting_Valid = -1; +static gint hf_opa_SwitchPortCongestionSetting_Control_Type = -1; +static gint hf_opa_SwitchPortCongestionSetting_reserved = -1; +static gint hf_opa_SwitchPortCongestionSetting_Threshold = -1; +static gint hf_opa_SwitchPortCongestionSetting_Packet_Size = -1; +static gint hf_opa_SwitchPortCongestionSetting_Marking_Rate = -1; +static gint hf_opa_HFICongestionLog = -1; +static gint hf_opa_HFICongestionLog_LogType = -1; +static gint hf_opa_HFICongestionLog_CongestionFlags = -1; +static gint hf_opa_HFICongestionLog_ThresholdEventCounter = -1; +static gint hf_opa_HFICongestionLog_CurrentTimeStamp = -1; +static gint hf_opa_HFICongestionLog_ThresholdCongestionEventMap = -1; +static gint hf_opa_HFICongestionLog_Local_QP_CN_Entry = -1; +static gint hf_opa_HFICongestionLog_Remote_QP_Number_CN_Entry = -1; +static gint hf_opa_HFICongestionLog_SL_CN_Entry = -1; +static gint hf_opa_HFICongestionLog_Service_Type_CN_Entry = -1; +static gint hf_opa_HFICongestionLog_Remote_LID_CN_Entry = -1; +static gint hf_opa_HFICongestionLog_TimeStamp_CN_Entry = -1; +static gint hf_opa_HFICongestionSetting = -1; +static gint hf_opa_HFICongestionSetting_Control_Map = -1; +static gint hf_opa_HFICongestionSetting_Port_Control = -1; +static gint hf_opa_HFICongestionSetting_CCTI_Increase = -1; +static gint hf_opa_HFICongestionSetting_CCTI_Timer = -1; +static gint hf_opa_HFICongestionSetting_TriggerThreshold = -1; +static gint hf_opa_HFICongestionSetting_CCTI_Min = -1; +static gint hf_opa_HFICongestionControlTable = -1; +static gint hf_opa_HFICongestionControlTable_CCTI_Limit = -1; +static gint hf_opa_HFICongestionControlTable_CCT_Shift = -1; +static gint hf_opa_HFICongestionControlTable_CCT_Multiplier = -1; +/* SA */ +static gint hf_opa_PortInfoRecord_LinkDownReason_NeighborLinkDownReason = -1; +static gint hf_opa_PortInfoRecord_LinkDownReason_LinkDownReason = -1; +static gint hf_opa_PortInfoRecord_LinkDownReason_Timestamp = -1; +static gint hf_opa_LinkRecord = -1; +static gint hf_opa_LinkRecord_ToPort = -1; +static gint hf_opa_LinkRecord_ToLID = -1; +static gint hf_opa_ServiceRecord = -1; +static gint hf_opa_ServiceRecord_ServiceLease = -1; +static gint hf_opa_ServiceRecord_ServiceKey = -1; +static gint hf_opa_ServiceRecord_ServiceName = -1; +static gint hf_opa_ServiceRecord_ServiceData = -1; +static gint hf_opa_ServiceAssociationRecord_ServiceKey = -1; +static gint hf_opa_ServiceAssociationRecord_ServiceName = -1; +static gint hf_opa_PathRecord = -1; +static gint hf_opa_PathRecord_ServiceID = -1; +static gint hf_opa_PathRecord_DGID = -1; +static gint hf_opa_PathRecord_DGID_L2_8B = -1; +static gint hf_opa_PathRecord_DGID_L2_10B = -1; +static gint hf_opa_PathRecord_DGID_L2_9B = -1; +static gint hf_opa_PathRecord_DGID_L2_16B = -1; +static gint hf_opa_PathRecord_DGID_L2_reserved = -1; +static gint hf_opa_PathRecord_DGID_LIDLen = -1; +static gint hf_opa_PathRecord_DGID_reserved = -1; +static gint hf_opa_PathRecord_DGID_SL = -1; +static gint hf_opa_PathRecord_DGID_DLIDHigh = -1; +static gint hf_opa_PathRecord_DGID_SLIDHigh = -1; +static gint hf_opa_PathRecord_DGID_DestGUID = -1; +static gint hf_opa_PathRecord_SGID = -1; +static gint hf_opa_PathRecord_SGID_SubnetPrefix = -1; +static gint hf_opa_PathRecord_SGID_SourceGUID = -1; +static gint hf_opa_PathRecord_DLID = -1; +static gint hf_opa_PathRecord_SLID = -1; +static gint hf_opa_PathRecord_RawTraffic = -1; +static gint hf_opa_PathRecord_reserved = -1; +static gint hf_opa_PathRecord_FlowLabel = -1; +static gint hf_opa_PathRecord_HopLimit = -1; +static gint hf_opa_PathRecord_TClass = -1; +static gint hf_opa_PathRecord_Reversible = -1; +static gint hf_opa_PathRecord_NumbPath = -1; +static gint hf_opa_PathRecord_P_Key = -1; +static gint hf_opa_PathRecord_QosType = -1; +static gint hf_opa_PathRecord_reserved2 = -1; +static gint hf_opa_PathRecord_QosPriority = -1; +static gint hf_opa_PathRecord_SL = -1; +static gint hf_opa_PathRecord_MTUSelector = -1; +static gint hf_opa_PathRecord_MTU = -1; +static gint hf_opa_PathRecord_RateSelector = -1; +static gint hf_opa_PathRecord_Rate = -1; +static gint hf_opa_PathRecord_PacketLifeTimeSelector = -1; +static gint hf_opa_PathRecord_PacketLifeTime = -1; +static gint hf_opa_PathRecord_Preference = -1; +static gint hf_opa_MCMemberRecord = -1; +static gint hf_opa_MCMemberRecord_Q_Key = -1; +static gint hf_opa_MCMemberRecord_MLID = -1; +static gint hf_opa_MCMemberRecord_MTUSelector = -1; +static gint hf_opa_MCMemberRecord_MTU = -1; +static gint hf_opa_MCMemberRecord_TClass = -1; +static gint hf_opa_MCMemberRecord_P_Key = -1; +static gint hf_opa_MCMemberRecord_RateSelector = -1; +static gint hf_opa_MCMemberRecord_Rate = -1; +static gint hf_opa_MCMemberRecord_PacketLifeTimeSelector = -1; +static gint hf_opa_MCMemberRecord_PacketLifeTime = -1; +static gint hf_opa_MCMemberRecord_SL = -1; +static gint hf_opa_MCMemberRecord_reserved = -1; +static gint hf_opa_MCMemberRecord_HopLimit = -1; +static gint hf_opa_MCMemberRecord_Scope = -1; +static gint hf_opa_MCMemberRecord_reserved2 = -1; +static gint hf_opa_MCMemberRecord_JoinSendOnlyMember = -1; +static gint hf_opa_MCMemberRecord_JoinNonMember = -1; +static gint hf_opa_MCMemberRecord_JoinFullMember = -1; +static gint hf_opa_MCMemberRecord_ProxyJoin = -1; +static gint hf_opa_MCMemberRecord_reserved3 = -1; +static gint hf_opa_TraceRecord = -1; +static gint hf_opa_TraceRecord_IDGeneration = -1; +static gint hf_opa_TraceRecord_NodeType = -1; +static gint hf_opa_TraceRecord_NodeID = -1; +static gint hf_opa_TraceRecord_ChassisID = -1; +static gint hf_opa_TraceRecord_EntryPortID = -1; +static gint hf_opa_TraceRecord_ExitPortID = -1; +static gint hf_opa_TraceRecord_EntryPort = -1; +static gint hf_opa_TraceRecord_ExitPort = -1; +static gint hf_opa_MultiPathRecord = -1; +static gint hf_opa_MultiPathRecord_reserved = -1; +static gint hf_opa_MultiPathRecord_FlowLabel = -1; +static gint hf_opa_MultiPathRecord_HopLimit = -1; +static gint hf_opa_MultiPathRecord_TClass = -1; +static gint hf_opa_MultiPathRecord_Reversible = -1; +static gint hf_opa_MultiPathRecord_NumbPath = -1; +static gint hf_opa_MultiPathRecord_P_Key = -1; +static gint hf_opa_MultiPathRecord_QoSType = -1; +static gint hf_opa_MultiPathRecord_QoSPriority = -1; +static gint hf_opa_MultiPathRecord_reserved2 = -1; +static gint hf_opa_MultiPathRecord_SL = -1; +static gint hf_opa_MultiPathRecord_MTUSelector = -1; +static gint hf_opa_MultiPathRecord_MTU = -1; +static gint hf_opa_MultiPathRecord_RateSelector = -1; +static gint hf_opa_MultiPathRecord_Rate = -1; +static gint hf_opa_MultiPathRecord_PacketLifeTimeSelector = -1; +static gint hf_opa_MultiPathRecord_PacketLifeTime = -1; +static gint hf_opa_MultiPathRecord_IndependenceSelector = -1; +static gint hf_opa_MultiPathRecord_SGIDScope = -1; +static gint hf_opa_MultiPathRecord_DGIDScope = -1; +static gint hf_opa_MultiPathRecord_SGIDCount = -1; +static gint hf_opa_MultiPathRecord_DGIDCount = -1; +static gint hf_opa_MultiPathRecord_SGID = -1; +static gint hf_opa_MultiPathRecord_DGID = -1; +static gint hf_opa_MultiPathRecord_L2_8B = -1; +static gint hf_opa_MultiPathRecord_L2_10B = -1; +static gint hf_opa_MultiPathRecord_L2_9B = -1; +static gint hf_opa_MultiPathRecord_L2_16B = -1; +static gint hf_opa_MultiPathRecord_reserved3 = -1; +static gint hf_opa_MultiPathRecord_SGUIDScope = -1; +static gint hf_opa_MultiPathRecord_DGUIDScope = -1; +static gint hf_opa_MultiPathRecord_SGUIDCount = -1; +static gint hf_opa_MultiPathRecord_DGUIDCount = -1; +static gint hf_opa_MultiPathRecord_SGUID = -1; +static gint hf_opa_MultiPathRecord_DGUID = -1; +static gint hf_opa_MultiPathRecord_ServiceID = -1; +static gint hf_opa_MultiPathRecord_SubnetPrefix = -1; +static gint hf_opa_MultiPathRecord_SLIDCount = -1; +static gint hf_opa_MultiPathRecord_DLIDCount = -1; +static gint hf_opa_MultiPathRecord_SLID = -1; +static gint hf_opa_MultiPathRecord_DLID = -1; +static gint hf_opa_CableInfoRecord = -1; +static gint hf_opa_CableInfoRecord_Lid = -1; +static gint hf_opa_CableInfoRecord_Port = -1; +static gint hf_opa_CableInfoRecord_Length = -1; +static gint hf_opa_CableInfoRecord_reserved = -1; +static gint hf_opa_CableInfoRecord_Address = -1; +static gint hf_opa_CableInfoRecord_PortType = -1; +static gint hf_opa_CableInfoRecord_Data = -1; +static gint hf_opa_VFInfoRecord = -1; +static gint hf_opa_VFInfoRecord_vfIndex = -1; +static gint hf_opa_VFInfoRecord_pKey = -1; +static gint hf_opa_VFInfoRecord_vfName = -1; +static gint hf_opa_VFInfoRecord_MGID = -1; +static gint hf_opa_VFInfoRecord_SelectFlags = -1; +static gint hf_opa_VFInfoRecord_reserved = -1; +static gint hf_opa_VFInfoRecord_SL = -1; +static gint hf_opa_VFInfoRecord_MTUSpecified = -1; +static gint hf_opa_VFInfoRecord_reserved2 = -1; +static gint hf_opa_VFInfoRecord_MTU = -1; +static gint hf_opa_VFInfoRecord_RateSpecified = -1; +static gint hf_opa_VFInfoRecord_reserved4 = -1; +static gint hf_opa_VFInfoRecord_Rate = -1; +static gint hf_opa_VFInfoRecord_PktLifeSpecified = -1; +static gint hf_opa_VFInfoRecord_reserved5 = -1; +static gint hf_opa_VFInfoRecord_PktLifeTimeInc = -1; +static gint hf_opa_VFInfoRecord_OptionFlags = -1; +static gint hf_opa_VFInfoRecord_BandwidthPercent = -1; +static gint hf_opa_VFInfoRecord_reserved6 = -1; +static gint hf_opa_VFInfoRecord_Priority = -1; +static gint hf_opa_VFInfoRecord_RoutingSLs = -1; +static gint hf_opa_VFInfoRecord_reserved7 = -1; +static gint hf_opa_QuarantinedNodeRecord = -1; +static gint hf_opa_QuarantinedNodeRecord_TrustedLid = -1; +static gint hf_opa_QuarantinedNodeRecord_TrustedNodeGUID = -1; +static gint hf_opa_QuarantinedNodeRecord_TrustedPortNum = -1; +static gint hf_opa_QuarantinedNodeRecord_TrustedNeighborNodeGUID = -1; +static gint hf_opa_QuarantinedNodeRecord_QuarantineReasons = -1; +static gint hf_opa_QuarantinedNodeRecord_ExpectedNodeDesc = -1; +static gint hf_opa_QuarantinedNodeRecord_ExpectedNodeGUID = -1; +static gint hf_opa_QuarantinedNodeRecord_ExpectedPortGUID = -1; +/* PM */ +static gint hf_opa_PortStatus = -1; +static gint hf_opa_PortStatus_PortNumber = -1; +static gint hf_opa_PortStatus_VLSelectMask = -1; +static gint hf_opa_PortStatus_PortXmitData = -1; +static gint hf_opa_PortStatus_PortRcvData = -1; +static gint hf_opa_PortStatus_PortXmitPkts = -1; +static gint hf_opa_PortStatus_PortRcvPkts = -1; +static gint hf_opa_PortStatus_PortMulticastXmitPkts = -1; +static gint hf_opa_PortStatus_PortMulticastRcvPkts = -1; +static gint hf_opa_PortStatus_PortXmitWait = -1; +static gint hf_opa_PortStatus_SwPortCongestion = -1; +static gint hf_opa_PortStatus_PortRcvFECN = -1; +static gint hf_opa_PortStatus_PortRcvBECN = -1; +static gint hf_opa_PortStatus_PortXmitTimeCong = -1; +static gint hf_opa_PortStatus_PortXmitWastedBW = -1; +static gint hf_opa_PortStatus_PortXmitWaitData = -1; +static gint hf_opa_PortStatus_PortRcvBubble = -1; +static gint hf_opa_PortStatus_PortMarkFECN = -1; +static gint hf_opa_PortStatus_PortRcvConstraintErrors = -1; +static gint hf_opa_PortStatus_PortRcvSwitchRelayErrors = -1; +static gint hf_opa_PortStatus_PortXmitDiscards = -1; +static gint hf_opa_PortStatus_PortXmitConstraintErrors = -1; +static gint hf_opa_PortStatus_PortRcvRemotePhysicalErrors = -1; +static gint hf_opa_PortStatus_LocalLinkIntegrityErrors = -1; +static gint hf_opa_PortStatus_PortRcvErrors = -1; +static gint hf_opa_PortStatus_ExcessiveBufferOverruns = -1; +static gint hf_opa_PortStatus_FMConfigErrors = -1; +static gint hf_opa_PortStatus_LinkErrorRecovery = -1; +static gint hf_opa_PortStatus_LinkDowned = -1; +static gint hf_opa_PortStatus_UncorrectableErrors = -1; +static gint hf_opa_PortStatus_reserved = -1; +static gint hf_opa_PortStatus_LinkQualityIndicator = -1; +static gint hf_opa_PortStatus_PortVLXmitData = -1; +static gint hf_opa_PortStatus_PortVLRcvData = -1; +static gint hf_opa_PortStatus_PortVLXmitPkts = -1; +static gint hf_opa_PortStatus_PortVLRcvPkts = -1; +static gint hf_opa_PortStatus_PortVLXmitWait = -1; +static gint hf_opa_PortStatus_SwPortVLCongestion = -1; +static gint hf_opa_PortStatus_PortVLRcvFECN = -1; +static gint hf_opa_PortStatus_PortVLRcvBECN = -1; +static gint hf_opa_PortStatus_PortVLXmitTimeCong = -1; +static gint hf_opa_PortStatus_PortVLXmitWastedBW = -1; +static gint hf_opa_PortStatus_PortVLXmitWaitData = -1; +static gint hf_opa_PortStatus_PortVLRcvBubble = -1; +static gint hf_opa_PortStatus_PortVLMarkFECN = -1; +static gint hf_opa_PortStatus_PortVLXmitDiscards = -1; +static gint hf_opa_ClearPortStatus = -1; +static gint hf_opa_ClearPortStatus_PortSelectMask = -1; +static gint hf_opa_ClearPortStatus_PortXmitData = -1; +static gint hf_opa_ClearPortStatus_PortRcvData = -1; +static gint hf_opa_ClearPortStatus_PortXmitPkts = -1; +static gint hf_opa_ClearPortStatus_PortRcvPkts = -1; +static gint hf_opa_ClearPortStatus_PortMulticastXmitPkts = -1; +static gint hf_opa_ClearPortStatus_PortMulticastRcvPkts = -1; +static gint hf_opa_ClearPortStatus_PortXmitWait = -1; +static gint hf_opa_ClearPortStatus_SwPortCongestion = -1; +static gint hf_opa_ClearPortStatus_PortRcvFECN = -1; +static gint hf_opa_ClearPortStatus_PortRcvBECN = -1; +static gint hf_opa_ClearPortStatus_PortXmitTimeCong = -1; +static gint hf_opa_ClearPortStatus_PortXmitWastedBW = -1; +static gint hf_opa_ClearPortStatus_PortXmitWaitData = -1; +static gint hf_opa_ClearPortStatus_PortRcvBubble = -1; +static gint hf_opa_ClearPortStatus_PortMarkFECN = -1; +static gint hf_opa_ClearPortStatus_PortRcvConstraintErrors = -1; +static gint hf_opa_ClearPortStatus_PortRcvSwitchRelayErrors = -1; +static gint hf_opa_ClearPortStatus_PortXmitDiscards = -1; +static gint hf_opa_ClearPortStatus_PortXmitConstraintErrors = -1; +static gint hf_opa_ClearPortStatus_PortRcvRemotePhysicalErrors = -1; +static gint hf_opa_ClearPortStatus_LocalLinkIntegrityErrors = -1; +static gint hf_opa_ClearPortStatus_PortRcvErrors = -1; +static gint hf_opa_ClearPortStatus_ExcessiveBufferOverruns = -1; +static gint hf_opa_ClearPortStatus_FMConfigErrors = -1; +static gint hf_opa_ClearPortStatus_LinkErrorRecovery = -1; +static gint hf_opa_ClearPortStatus_LinkDowned = -1; +static gint hf_opa_ClearPortStatus_UncorrectableErrors = -1; +static gint hf_opa_ClearPortStatus_reserved = -1; +static gint hf_opa_ClearPortStatus_CounterSelectMask = -1; +static const gint *_ClearPortStatus_CounterSelectMask[] = { + &hf_opa_ClearPortStatus_PortXmitData, + &hf_opa_ClearPortStatus_PortRcvData, + &hf_opa_ClearPortStatus_PortXmitPkts, + &hf_opa_ClearPortStatus_PortRcvPkts, + &hf_opa_ClearPortStatus_PortMulticastXmitPkts, + &hf_opa_ClearPortStatus_PortMulticastRcvPkts, + &hf_opa_ClearPortStatus_PortXmitWait, + &hf_opa_ClearPortStatus_SwPortCongestion, + &hf_opa_ClearPortStatus_PortRcvFECN, + &hf_opa_ClearPortStatus_PortRcvBECN, + &hf_opa_ClearPortStatus_PortXmitTimeCong, + &hf_opa_ClearPortStatus_PortXmitWastedBW, + &hf_opa_ClearPortStatus_PortXmitWaitData, + &hf_opa_ClearPortStatus_PortRcvBubble, + &hf_opa_ClearPortStatus_PortMarkFECN, + &hf_opa_ClearPortStatus_PortRcvConstraintErrors, + &hf_opa_ClearPortStatus_PortRcvSwitchRelayErrors, + &hf_opa_ClearPortStatus_PortXmitDiscards, + &hf_opa_ClearPortStatus_PortXmitConstraintErrors, + &hf_opa_ClearPortStatus_PortRcvRemotePhysicalErrors, + &hf_opa_ClearPortStatus_LocalLinkIntegrityErrors, + &hf_opa_ClearPortStatus_PortRcvErrors, + &hf_opa_ClearPortStatus_ExcessiveBufferOverruns, + &hf_opa_ClearPortStatus_FMConfigErrors, + &hf_opa_ClearPortStatus_LinkErrorRecovery, + &hf_opa_ClearPortStatus_LinkDowned, + &hf_opa_ClearPortStatus_UncorrectableErrors, + &hf_opa_ClearPortStatus_reserved, + NULL +}; +static gint hf_opa_DataPortCounters = -1; +static gint hf_opa_DataPortCounters_PortSelectMask = -1; +static gint hf_opa_DataPortCounters_VLSelectMask = -1; +static gint hf_opa_DataPortCounters_resolution_reserved = -1; +static gint hf_opa_DataPortCounters_LocalLinkIntegrityResolution = -1; +static gint hf_opa_DataPortCounters_LinkErrorRecoveryResolution = -1; +static gint hf_opa_DataPortCounters_PortNumber = -1; +static gint hf_opa_DataPortCounters_lqi_reserved = -1; +static gint hf_opa_DataPortCounters_LinkQualityIndicator = -1; +static gint hf_opa_DataPortCounters_PortXmitData = -1; +static gint hf_opa_DataPortCounters_PortRcvData = -1; +static gint hf_opa_DataPortCounters_PortXmitPkts = -1; +static gint hf_opa_DataPortCounters_PortRcvPkts = -1; +static gint hf_opa_DataPortCounters_PortMulticastXmitPkts = -1; +static gint hf_opa_DataPortCounters_PortMulticastRcvPkts = -1; +static gint hf_opa_DataPortCounters_PortXmitWait = -1; +static gint hf_opa_DataPortCounters_SwPortCongestion = -1; +static gint hf_opa_DataPortCounters_PortRcvFECN = -1; +static gint hf_opa_DataPortCounters_PortRcvBECN = -1; +static gint hf_opa_DataPortCounters_PortXmitTimeCong = -1; +static gint hf_opa_DataPortCounters_PortXmitWastedBW = -1; +static gint hf_opa_DataPortCounters_PortXmitWaitData = -1; +static gint hf_opa_DataPortCounters_PortRcvBubble = -1; +static gint hf_opa_DataPortCounters_PortMarkFECN = -1; +static gint hf_opa_DataPortCounters_PortErrorCounterSummary = -1; +static gint hf_opa_DataPortCounters_PortVLXmitData = -1; +static gint hf_opa_DataPortCounters_PortVLRcvData = -1; +static gint hf_opa_DataPortCounters_PortVLXmitPkts = -1; +static gint hf_opa_DataPortCounters_PortVLRcvPkts = -1; +static gint hf_opa_DataPortCounters_PortVLXmitWait = -1; +static gint hf_opa_DataPortCounters_SwPortVLCongestion = -1; +static gint hf_opa_DataPortCounters_PortVLRcvFECN = -1; +static gint hf_opa_DataPortCounters_PortVLRcvBECN = -1; +static gint hf_opa_DataPortCounters_PortVLXmitTimeCong = -1; +static gint hf_opa_DataPortCounters_PortVLXmitWastedBW = -1; +static gint hf_opa_DataPortCounters_PortVLXmitWaitData = -1; +static gint hf_opa_DataPortCounters_PortVLRcvBubble = -1; +static gint hf_opa_DataPortCounters_PortVLMarkFECN = -1; +static gint hf_opa_ErrorPortCounters = -1; +static gint hf_opa_ErrorPortCounters_PortSelectMask = -1; +static gint hf_opa_ErrorPortCounters_VLSelectMask = -1; +static gint hf_opa_ErrorPortCounters_PortNumber = -1; +static gint hf_opa_ErrorPortCounters_PortRcvConstraintErrors = -1; +static gint hf_opa_ErrorPortCounters_PortRcvSwitchRelayErrors = -1; +static gint hf_opa_ErrorPortCounters_PortXmitDiscards = -1; +static gint hf_opa_ErrorPortCounters_PortXmitConstraintErrors = -1; +static gint hf_opa_ErrorPortCounters_PortRcvRemotePhysicalErrors = -1; +static gint hf_opa_ErrorPortCounters_LocalLinkIntegrityErrors = -1; +static gint hf_opa_ErrorPortCounters_PortRcvErrors = -1; +static gint hf_opa_ErrorPortCounters_ExcessiveBufferOverruns = -1; +static gint hf_opa_ErrorPortCounters_FMConfigErrors = -1; +static gint hf_opa_ErrorPortCounters_LinkErrorRecovery = -1; +static gint hf_opa_ErrorPortCounters_LinkDowned = -1; +static gint hf_opa_ErrorPortCounters_UncorrectableErrors = -1; +static gint hf_opa_ErrorPortCounters_PortVLXmitDiscards = -1; +static gint hf_opa_ErrorPortInfo = -1; +static gint hf_opa_ErrorPortInfo_PortSelectMask = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvErrorInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_ExcessiveBufferOverrunInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortXmitConstraintErrorInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvConstraintErrorInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvSwitchRelayErrorInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_UncorrectableErrorInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_FMConfigErrorInfo = -1; +static gint hf_opa_ErrorPortInfo_ErrorInfoSelectMask_reserved = -1; +static const gint *_ErrorPortInfo_ErrorInfoSelectMask[] = { + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvErrorInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_ExcessiveBufferOverrunInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortXmitConstraintErrorInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvConstraintErrorInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvSwitchRelayErrorInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_UncorrectableErrorInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_FMConfigErrorInfo, + &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_reserved, + NULL +}; +static gint hf_opa_ErrorPortInfo_PortNumber = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_ErrorCode = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketFlit1 = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketFlit2 = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_Flit1Bits = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_Flit2Bits = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved2 = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketBytes = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_FlitBits = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved3 = -1; +static gint hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved4 = -1; +static gint hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_SC = -1; +static gint hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_P_Key = -1; +static gint hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_SLID = -1; +static gint hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_P_Key = -1; +static gint hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_SLID = -1; +static gint hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_ErrorCode = -1; +static gint hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_DLID = -1; +static gint hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_EgressPortNum = -1; +static gint hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_SC = -1; +static gint hf_opa_ErrorPortInfo_UncorrectableErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_UncorrectableErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_UncorrectableErrorInfo_ErrorCode = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_Status = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_reserved = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_ErrorCode = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_VL = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_Distance = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_BadFlitBits = -1; +static gint hf_opa_ErrorPortInfo_FMConfigErrorInfo_SC = -1; +/* PA */ +static gint hf_opa_ImageID_imageNumber = -1; +static gint hf_opa_ImageID_imageOffset = -1; +static gint hf_opa_GetGroupList = -1; +static gint hf_opa_GetGroupList_groupName = -1; +static gint hf_opa_GetGroupInfo = -1; +static gint hf_opa_GetGroupInfo_groupName = -1; +static gint hf_opa_GetGroupInfo_numInternalPorts = -1; +static gint hf_opa_GetGroupInfo_numExternalPorts = -1; +static gint hf_opa_GetGroupInfo_totalMBps = -1; +static gint hf_opa_GetGroupInfo_totalKPps = -1; +static gint hf_opa_GetGroupInfo_avgMBps = -1; +static gint hf_opa_GetGroupInfo_minMBps = -1; +static gint hf_opa_GetGroupInfo_maxMBps = -1; +static gint hf_opa_GetGroupInfo_numBWBuckets = -1; +static gint hf_opa_GetGroupInfo_BWBuckets = -1; +static gint hf_opa_GetGroupInfo_avgKPps = -1; +static gint hf_opa_GetGroupInfo_minKPps = -1; +static gint hf_opa_GetGroupInfo_maxKPps = -1; +static gint hf_opa_GetGroupInfo_pmaFailedPorts = -1; +static gint hf_opa_GetGroupInfo_topoFailedPorts = -1; +static gint hf_opa_GetGroupInfo_integrityErrors = -1; +static gint hf_opa_GetGroupInfo_congestionErrors = -1; +static gint hf_opa_GetGroupInfo_smaCongestionErrors = -1; +static gint hf_opa_GetGroupInfo_bubbleErrors = -1; +static gint hf_opa_GetGroupInfo_securityErrors = -1; +static gint hf_opa_GetGroupInfo_routingErrors = -1; +static gint hf_opa_GetGroupInfo_utlizationPct10 = -1; +static gint hf_opa_GetGroupInfo_discardsPct10 = -1; +static gint hf_opa_GetGroupInfo_maxInternalRate = -1; +static gint hf_opa_GetGroupInfo_minInternalRate = -1; +static gint hf_opa_GetGroupInfo_maxExternalRate = -1; +static gint hf_opa_GetGroupInfo_minExternalRate = -1; +static gint hf_opa_GetGroupInfo_maxInternalMBps = -1; +static gint hf_opa_GetGroupInfo_maxExternalMBps = -1; +static gint hf_opa_GetGroupConfig = -1; +static gint hf_opa_GetGroupConfig_groupName = -1; +static gint hf_opa_GetGroupConfig_Port_NodeGUID = -1; +static gint hf_opa_GetGroupConfig_Port_nodeDesc = -1; +static gint hf_opa_GetGroupConfig_Port_NodeLID = -1; +static gint hf_opa_GetGroupConfig_Port_PortNumber = -1; +static gint hf_opa_GetPortCounters = -1; +static gint hf_opa_GetPortCounters_nodeLID = -1; +static gint hf_opa_GetPortCounters_PortNumber = -1; +static gint hf_opa_GetPortCounters_flags = -1; +static gint hf_opa_GetPortCounters_PortXmitData = -1; +static gint hf_opa_GetPortCounters_PortRcvData = -1; +static gint hf_opa_GetPortCounters_PortXmitPkts = -1; +static gint hf_opa_GetPortCounters_PortRcvPkts = -1; +static gint hf_opa_GetPortCounters_PortMulticastXmitPkts = -1; +static gint hf_opa_GetPortCounters_PortMulticastRcvPkts = -1; +static gint hf_opa_GetPortCounters_LocalLinkIntegrityErrors = -1; +static gint hf_opa_GetPortCounters_FMConfigErrors = -1; +static gint hf_opa_GetPortCounters_PortRcvErrors = -1; +static gint hf_opa_GetPortCounters_ExcessiveBufferOverruns = -1; +static gint hf_opa_GetPortCounters_PortRcvConstraintErrors = -1; +static gint hf_opa_GetPortCounters_PortRcvSwitchRelayErrors = -1; +static gint hf_opa_GetPortCounters_PortXmitDiscards = -1; +static gint hf_opa_GetPortCounters_PortXmitConstraintErrors = -1; +static gint hf_opa_GetPortCounters_PortRcvRemotePhysicalErrors = -1; +static gint hf_opa_GetPortCounters_SwPortCongestion = -1; +static gint hf_opa_GetPortCounters_PortXmitWait = -1; +static gint hf_opa_GetPortCounters_PortRcvFECN = -1; +static gint hf_opa_GetPortCounters_PortRcvBECN = -1; +static gint hf_opa_GetPortCounters_PortXmitTimeCong = -1; +static gint hf_opa_GetPortCounters_PortXmitWastedBW = -1; +static gint hf_opa_GetPortCounters_PortXmitWaitData = -1; +static gint hf_opa_GetPortCounters_PortRcvBubble = -1; +static gint hf_opa_GetPortCounters_PortMarkFECN = -1; +static gint hf_opa_GetPortCounters_LinkErrorRecovery = -1; +static gint hf_opa_GetPortCounters_LinkDowned = -1; +static gint hf_opa_GetPortCounters_UncorrectableErrors = -1; +static gint hf_opa_GetPortCounters_NumLanesDown = -1; +static gint hf_opa_GetPortCounters_reserved = -1; +static gint hf_opa_GetPortCounters_LinkQualityIndicator = -1; +static gint hf_opa_ClearPortCounters = -1; +static gint hf_opa_ClearPortCounters_nodeLID = -1; +static gint hf_opa_ClearPortCounters_PortNumber = -1; +static gint hf_opa_ClearPortCounters_PortXmitData = -1; +static gint hf_opa_ClearPortCounters_PortRcvData = -1; +static gint hf_opa_ClearPortCounters_PortXmitPkts = -1; +static gint hf_opa_ClearPortCounters_PortRcvPkts = -1; +static gint hf_opa_ClearPortCounters_PortMulticastXmitPkts = -1; +static gint hf_opa_ClearPortCounters_PortMulticastRcvPkts = -1; +static gint hf_opa_ClearPortCounters_LocalLinkIntegrityErrors = -1; +static gint hf_opa_ClearPortCounters_FMConfigErrors = -1; +static gint hf_opa_ClearPortCounters_PortRcvErrors = -1; +static gint hf_opa_ClearPortCounters_ExcessiveBufferOverruns = -1; +static gint hf_opa_ClearPortCounters_PortRcvConstraintErrors = -1; +static gint hf_opa_ClearPortCounters_PortRcvSwitchRelayErrors = -1; +static gint hf_opa_ClearPortCounters_PortXmitDiscards = -1; +static gint hf_opa_ClearPortCounters_PortXmitConstraintErrors = -1; +static gint hf_opa_ClearPortCounters_PortRcvRemotePhysicalErrors = -1; +static gint hf_opa_ClearPortCounters_SwPortCongestion = -1; +static gint hf_opa_ClearPortCounters_PortXmitWait = -1; +static gint hf_opa_ClearPortCounters_PortRcvFECN = -1; +static gint hf_opa_ClearPortCounters_PortRcvBECN = -1; +static gint hf_opa_ClearPortCounters_PortXmitTimeCong = -1; +static gint hf_opa_ClearPortCounters_PortXmitWastedBW = -1; +static gint hf_opa_ClearPortCounters_PortXmitWaitData = -1; +static gint hf_opa_ClearPortCounters_PortRcvBubble = -1; +static gint hf_opa_ClearPortCounters_PortMarkFECN = -1; +static gint hf_opa_ClearPortCounters_LinkErrorRecovery = -1; +static gint hf_opa_ClearPortCounters_LinkDowned = -1; +static gint hf_opa_ClearPortCounters_UncorrectableErrors = -1; +static gint hf_opa_ClearPortCounters_reserved = -1; +static gint hf_opa_ClearPortCounters_CounterSelectMask = -1; +static const gint *_ClearPortCounters_CounterSelectMask[] = { + &hf_opa_ClearPortCounters_PortXmitData, + &hf_opa_ClearPortCounters_PortRcvData, + &hf_opa_ClearPortCounters_PortXmitPkts, + &hf_opa_ClearPortCounters_PortRcvPkts, + &hf_opa_ClearPortCounters_PortMulticastXmitPkts, + &hf_opa_ClearPortCounters_PortMulticastRcvPkts, + &hf_opa_ClearPortCounters_LocalLinkIntegrityErrors, + &hf_opa_ClearPortCounters_FMConfigErrors, + &hf_opa_ClearPortCounters_PortRcvErrors, + &hf_opa_ClearPortCounters_ExcessiveBufferOverruns, + &hf_opa_ClearPortCounters_PortRcvConstraintErrors, + &hf_opa_ClearPortCounters_PortRcvSwitchRelayErrors, + &hf_opa_ClearPortCounters_PortXmitDiscards, + &hf_opa_ClearPortCounters_PortXmitConstraintErrors, + &hf_opa_ClearPortCounters_PortRcvRemotePhysicalErrors, + &hf_opa_ClearPortCounters_SwPortCongestion, + &hf_opa_ClearPortCounters_PortXmitWait, + &hf_opa_ClearPortCounters_PortRcvFECN, + &hf_opa_ClearPortCounters_PortRcvBECN, + &hf_opa_ClearPortCounters_PortXmitTimeCong, + &hf_opa_ClearPortCounters_PortXmitWastedBW, + &hf_opa_ClearPortCounters_PortXmitWaitData, + &hf_opa_ClearPortCounters_PortRcvBubble, + &hf_opa_ClearPortCounters_PortMarkFECN, + &hf_opa_ClearPortCounters_LinkErrorRecovery, + &hf_opa_ClearPortCounters_LinkDowned, + &hf_opa_ClearPortCounters_UncorrectableErrors, + &hf_opa_ClearPortCounters_reserved, + NULL +}; +static gint hf_opa_ClearAllPortCounters = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitData = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvData = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitPkts = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvPkts = -1; +static gint hf_opa_ClearAllPortCounters_PortMulticastXmitPkts = -1; +static gint hf_opa_ClearAllPortCounters_PortMulticastRcvPkts = -1; +static gint hf_opa_ClearAllPortCounters_LocalLinkIntegrityErrors = -1; +static gint hf_opa_ClearAllPortCounters_FMConfigErrors = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvErrors = -1; +static gint hf_opa_ClearAllPortCounters_ExcessiveBufferOverruns = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvConstraintErrors = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvSwitchRelayErrors = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitDiscards = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitConstraintErrors = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvRemotePhysicalErrors = -1; +static gint hf_opa_ClearAllPortCounters_SwPortCongestion = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitWait = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvFECN = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvBECN = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitTimeCong = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitWastedBW = -1; +static gint hf_opa_ClearAllPortCounters_PortXmitWaitData = -1; +static gint hf_opa_ClearAllPortCounters_PortRcvBubble = -1; +static gint hf_opa_ClearAllPortCounters_PortMarkFECN = -1; +static gint hf_opa_ClearAllPortCounters_LinkErrorRecovery = -1; +static gint hf_opa_ClearAllPortCounters_LinkDowned = -1; +static gint hf_opa_ClearAllPortCounters_UncorrectableErrors = -1; +static gint hf_opa_ClearAllPortCounters_reserved = -1; +static gint hf_opa_ClearAllPortCounters_CounterSelectMask = -1; +static const gint *_ClearAllPortCounters_CounterSelectMask[] = { + &hf_opa_ClearAllPortCounters_PortXmitData, + &hf_opa_ClearAllPortCounters_PortRcvData, + &hf_opa_ClearAllPortCounters_PortXmitPkts, + &hf_opa_ClearAllPortCounters_PortRcvPkts, + &hf_opa_ClearAllPortCounters_PortMulticastXmitPkts, + &hf_opa_ClearAllPortCounters_PortMulticastRcvPkts, + &hf_opa_ClearAllPortCounters_LocalLinkIntegrityErrors, + &hf_opa_ClearAllPortCounters_FMConfigErrors, + &hf_opa_ClearAllPortCounters_PortRcvErrors, + &hf_opa_ClearAllPortCounters_ExcessiveBufferOverruns, + &hf_opa_ClearAllPortCounters_PortRcvConstraintErrors, + &hf_opa_ClearAllPortCounters_PortRcvSwitchRelayErrors, + &hf_opa_ClearAllPortCounters_PortXmitDiscards, + &hf_opa_ClearAllPortCounters_PortXmitConstraintErrors, + &hf_opa_ClearAllPortCounters_PortRcvRemotePhysicalErrors, + &hf_opa_ClearAllPortCounters_SwPortCongestion, + &hf_opa_ClearAllPortCounters_PortXmitWait, + &hf_opa_ClearAllPortCounters_PortRcvFECN, + &hf_opa_ClearAllPortCounters_PortRcvBECN, + &hf_opa_ClearAllPortCounters_PortXmitTimeCong, + &hf_opa_ClearAllPortCounters_PortXmitWastedBW, + &hf_opa_ClearAllPortCounters_PortXmitWaitData, + &hf_opa_ClearAllPortCounters_PortRcvBubble, + &hf_opa_ClearAllPortCounters_PortMarkFECN, + &hf_opa_ClearAllPortCounters_LinkErrorRecovery, + &hf_opa_ClearAllPortCounters_LinkDowned, + &hf_opa_ClearAllPortCounters_UncorrectableErrors, + &hf_opa_ClearAllPortCounters_reserved, + NULL +}; +static gint hf_opa_PMConfig = -1; +static gint hf_opa_PMConfig_sweepInterval = -1; +static gint hf_opa_PMConfig_maxClients = -1; +static gint hf_opa_PMConfig_sizeHistory = -1; +static gint hf_opa_PMConfig_sizeFreeze = -1; +static gint hf_opa_PMConfig_lease = -1; +static gint hf_opa_PMConfig_pmFlags = -1; +static gint hf_opa_PMConfig_PortXmitWait = -1; +static gint hf_opa_PMConfig_SwPortCongestion = -1; +static gint hf_opa_PMConfig_PortRcvFECN = -1; +static gint hf_opa_PMConfig_PortRcvBECN = -1; +static gint hf_opa_PMConfig_PortXmitTimeCong = -1; +static gint hf_opa_PMConfig_PortMarkFECN = -1; +static gint hf_opa_PMConfig_integrityErrors = -1; +static gint hf_opa_PMConfig_congestionErrors = -1; +static gint hf_opa_PMConfig_smaCongestionErrors = -1; +static gint hf_opa_PMConfig_bubbleErrors = -1; +static gint hf_opa_PMConfig_securityErrors = -1; +static gint hf_opa_PMConfig_routingErrors = -1; +static gint hf_opa_PMConfig_LocalLinkIntegrityErrors = -1; +static gint hf_opa_PMConfig_PortRcvErrors = -1; +static gint hf_opa_PMConfig_ExcessiveBufferOverrunErrors = -1; +static gint hf_opa_PMConfig_LinkErrorRecovery = -1; +static gint hf_opa_PMConfig_LinkDowned = -1; +static gint hf_opa_PMConfig_UncorrectableErrors = -1; +static gint hf_opa_PMConfig_FMConfigErrors = -1; +static gint hf_opa_PMConfig_LinkQualityIndicator = -1; +static gint hf_opa_PMConfig_LinkWidthDowngrade = -1; +static gint hf_opa_PMConfig_memoryFootprint = -1; +static gint hf_opa_PMConfig_maxAttempts = -1; +static gint hf_opa_PMConfig_respTimeout = -1; +static gint hf_opa_PMConfig_minRespTimeout = -1; +static gint hf_opa_PMConfig_maxParallelNodes = -1; +static gint hf_opa_PMConfig_pmaBatchSize = -1; +static gint hf_opa_PMConfig_errorClear = -1; +static gint hf_opa_MoveFreezeFrame_old = -1; +static gint hf_opa_MoveFreezeFrame_new = -1; +static gint hf_opa_GetFocusPorts = -1; +static gint hf_opa_GetFocusPorts_groupName = -1; +static gint hf_opa_GetFocusPorts_select = -1; +static gint hf_opa_GetFocusPorts_start = -1; +static gint hf_opa_GetFocusPorts_range = -1; +static gint hf_opa_GetFocusPorts_nodeLID = -1; +static gint hf_opa_GetFocusPorts_portNumber = -1; +static gint hf_opa_GetFocusPorts_rate = -1; +static gint hf_opa_GetFocusPorts_mtu = -1; +static gint hf_opa_GetFocusPorts_localFlags = -1; +static gint hf_opa_GetFocusPorts_neighborFlags = -1; +static gint hf_opa_GetFocusPorts_value = -1; +static gint hf_opa_GetFocusPorts_nodeGUID = -1; +static gint hf_opa_GetFocusPorts_nodeDesc = -1; +static gint hf_opa_GetFocusPorts_neighborLid = -1; +static gint hf_opa_GetFocusPorts_neighborPortNumber = -1; +static gint hf_opa_GetFocusPorts_neighborValue = -1; +static gint hf_opa_GetFocusPorts_neighborGuid = -1; +static gint hf_opa_GetFocusPorts_neighborNodeDesc = -1; +static gint hf_opa_GetImageInfo = -1; +static gint hf_opa_GetImageInfo_sweepStart = -1; +static gint hf_opa_GetImageInfo_sweepDuration = -1; +static gint hf_opa_GetImageInfo_numHFIPorts = -1; +static gint hf_opa_GetImageInfo_numSwitchNodes = -1; +static gint hf_opa_GetImageInfo_numSwitchPorts = -1; +static gint hf_opa_GetImageInfo_numLinks = -1; +static gint hf_opa_GetImageInfo_numSMs = -1; +static gint hf_opa_GetImageInfo_numFailedNodes = -1; +static gint hf_opa_GetImageInfo_numFailedPorts = -1; +static gint hf_opa_GetImageInfo_numSkippedNodes = -1; +static gint hf_opa_GetImageInfo_numSkippedPorts = -1; +static gint hf_opa_GetImageInfo_numUnexpectedClearPorts = -1; +static gint hf_opa_GetImageInfo_imageInterval = -1; +static gint hf_opa_GetImageInfo_smPortGuid = -1; +static gint hf_opa_GetImageInfo_smNodeDesc = -1; +static gint hf_opa_GetImageInfo_lid = -1; +static gint hf_opa_GetImageInfo_state = -1; +static gint hf_opa_GetImageInfo_priority = -1; +static gint hf_opa_GetImageInfo_portNumber = -1; +static gint hf_opa_GetVFList = -1; +static gint hf_opa_GetVFList_vfName = -1; + +static gint hf_opa_GetVFInfo = -1; +static gint hf_opa_GetVFInfo_vfName = -1; +static gint hf_opa_GetVFInfo_numPorts = -1; +static gint hf_opa_GetVFInfo_totalMBps = -1; +static gint hf_opa_GetVFInfo_totalKPps = -1; +static gint hf_opa_GetVFInfo_avgMBps = -1; +static gint hf_opa_GetVFInfo_minMBps = -1; +static gint hf_opa_GetVFInfo_maxMBps = -1; +static gint hf_opa_GetVFInfo_numBWBuckets = -1; +static gint hf_opa_GetVFInfo_BWBuckets = -1; +static gint hf_opa_GetVFInfo_avgKPps = -1; +static gint hf_opa_GetVFInfo_minKPps = -1; +static gint hf_opa_GetVFInfo_maxKPps = -1; +static gint hf_opa_GetVFInfo_pmaFailedPorts = -1; +static gint hf_opa_GetVFInfo_topoFailedPorts = -1; +static gint hf_opa_GetVFInfo_integrityErrors = -1; +static gint hf_opa_GetVFInfo_congestionErrors = -1; +static gint hf_opa_GetVFInfo_smaCongestionErrors = -1; +static gint hf_opa_GetVFInfo_bubbleErrors = -1; +static gint hf_opa_GetVFInfo_securityErrors = -1; +static gint hf_opa_GetVFInfo_routingErrors = -1; +static gint hf_opa_GetVFInfo_utlizationPct10 = -1; +static gint hf_opa_GetVFInfo_discardsPct10 = -1; +static gint hf_opa_GetVFInfo_maxInternalRate = -1; +static gint hf_opa_GetVFInfo_minInternalRate = -1; +static gint hf_opa_GetVFInfo_maxInternalMBps = -1; + +static gint hf_opa_GetVFConfig = -1; +static gint hf_opa_GetVFConfig_vfName = -1; +static gint hf_opa_GetVFConfig_Port_NodeGUID = -1; +static gint hf_opa_GetVFConfig_Port_nodeDesc = -1; +static gint hf_opa_GetVFConfig_Port_NodeLID = -1; +static gint hf_opa_GetVFConfig_Port_PortNumber = -1; + +static gint hf_opa_GetVFPortCounters = -1; +static gint hf_opa_GetVFPortCounters_vfName = -1; +static gint hf_opa_GetVFPortCounters_nodeLID = -1; +static gint hf_opa_GetVFPortCounters_PortNumber = -1; +static gint hf_opa_GetVFPortCounters_flags = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitData = -1; +static gint hf_opa_GetVFPortCounters_PortVFRcvData = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitPkts = -1; +static gint hf_opa_GetVFPortCounters_PortVFRcvPkts = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitDiscards = -1; +static gint hf_opa_GetVFPortCounters_SwPortVFCongestion = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitWait = -1; +static gint hf_opa_GetVFPortCounters_PortVFRcvFECN = -1; +static gint hf_opa_GetVFPortCounters_PortVFRcvBECN = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitTimeCong = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitWastedBW = -1; +static gint hf_opa_GetVFPortCounters_PortVFXmitWaitData = -1; +static gint hf_opa_GetVFPortCounters_PortVFRcvBubble = -1; +static gint hf_opa_GetVFPortCounters_PortVFMarkFECN = -1; + +static gint hf_opa_ClearVFPortCounters = -1; +static gint hf_opa_ClearVFPortCounters_vfName = -1; +static gint hf_opa_ClearVFPortCounters_nodeLID = -1; +static gint hf_opa_ClearVFPortCounters_PortNumber = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitData = -1; +static gint hf_opa_ClearVFPortCounters_PortVFRcvData = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitPkts = -1; +static gint hf_opa_ClearVFPortCounters_PortVFRcvPkts = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitDiscards = -1; +static gint hf_opa_ClearVFPortCounters_SwPortVFCongestion = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitWait = -1; +static gint hf_opa_ClearVFPortCounters_PortVFRcvFECN = -1; +static gint hf_opa_ClearVFPortCounters_PortVFRcvBECN = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitTimeCong = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitWastedBW = -1; +static gint hf_opa_ClearVFPortCounters_PortVFXmitWaitData = -1; +static gint hf_opa_ClearVFPortCounters_PortVFRcvBubble = -1; +static gint hf_opa_ClearVFPortCounters_PortVFMarkFECN = -1; +static gint hf_opa_ClearVFPortCounters_reserved = -1; +static gint hf_opa_ClearVFPortCounters_CounterSelectMask = -1; +static const gint *_ClearVFPortCounters_CounterSelectMask[] = { + &hf_opa_ClearVFPortCounters_PortVFXmitData, + &hf_opa_ClearVFPortCounters_PortVFRcvData, + &hf_opa_ClearVFPortCounters_PortVFXmitPkts, + &hf_opa_ClearVFPortCounters_PortVFRcvPkts, + &hf_opa_ClearVFPortCounters_PortVFXmitDiscards, + &hf_opa_ClearVFPortCounters_SwPortVFCongestion, + &hf_opa_ClearVFPortCounters_PortVFXmitWait, + &hf_opa_ClearVFPortCounters_PortVFRcvFECN, + &hf_opa_ClearVFPortCounters_PortVFRcvBECN, + &hf_opa_ClearVFPortCounters_PortVFXmitTimeCong, + &hf_opa_ClearVFPortCounters_PortVFXmitWastedBW, + &hf_opa_ClearVFPortCounters_PortVFXmitWaitData, + &hf_opa_ClearVFPortCounters_PortVFRcvBubble, + &hf_opa_ClearVFPortCounters_PortVFMarkFECN, + &hf_opa_ClearVFPortCounters_reserved, + NULL +}; + +static gint hf_opa_GetVFFocusPorts = -1; +static gint hf_opa_GetVFFocusPorts_vfName = -1; +static gint hf_opa_GetVFFocusPorts_select = -1; +static gint hf_opa_GetVFFocusPorts_start = -1; +static gint hf_opa_GetVFFocusPorts_range = -1; +static gint hf_opa_GetVFFocusPorts_nodeLID = -1; +static gint hf_opa_GetVFFocusPorts_portNumber = -1; +static gint hf_opa_GetVFFocusPorts_rate = -1; +static gint hf_opa_GetVFFocusPorts_mtu = -1; +static gint hf_opa_GetVFFocusPorts_localFlags = -1; +static gint hf_opa_GetVFFocusPorts_neighborFlags = -1; +static gint hf_opa_GetVFFocusPorts_value = -1; +static gint hf_opa_GetVFFocusPorts_nodeGUID = -1; +static gint hf_opa_GetVFFocusPorts_nodeDesc = -1; +static gint hf_opa_GetVFFocusPorts_neighborLid = -1; +static gint hf_opa_GetVFFocusPorts_neighborPortNumber = -1; +static gint hf_opa_GetVFFocusPorts_neighborValue = -1; +static gint hf_opa_GetVFFocusPorts_neighborGuid = -1; +static gint hf_opa_GetVFFocusPorts_neighborNodeDesc = -1; + +/* Expert Info */ +static expert_field ei_opa_mad_error = EI_INIT; +static expert_field ei_opa_mad_no_attribute_dissector = EI_INIT; +static expert_field ei_opa_mad_attribute_modifier_error_nonzero = EI_INIT; +static expert_field ei_opa_rmpp_undecoded = EI_INIT; +static expert_field ei_opa_aggregate_error = EI_INIT; + +/* Custom Functions */ +static void cf_opa_mad_swinfo_ar_frequency(gchar *buf, guint16 value) +{ + g_snprintf(buf, ITEM_LABEL_LENGTH, "%u ms", 2 ^ (value)*64); +} +static void cf_opa_mad_linkspeed(gchar *buf, guint16 value) +{ + int len = 0; + if (value & 0x1) /* 12.5 Gbps */ + len = g_snprintf(buf, ITEM_LABEL_LENGTH, "12.5"); + if (value & 0x2) /* 25.78125 Gbps */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s25.78125", (len ? ", " : "")); + if (len) + g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, " Gbps"); + else + g_snprintf(buf, ITEM_LABEL_LENGTH, "No State Change"); +} +static void cf_opa_mad_linkwidth(gchar *buf, guint16 value) +{ + int len = 0; + if (value & 0x1) /* 1x */ + len = g_snprintf(buf, ITEM_LABEL_LENGTH, "1X"); + if (value & 0x2) /* 2x */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s2X", (len ? ", " : "")); + if (value & 0x4) /* 3x */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s3X", (len ? ", " : "")); + if (value & 0x8) /* 4x */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s4X", (len ? ", " : "")); + if (!len) + g_snprintf(buf, ITEM_LABEL_LENGTH, "No State Change"); +} +static void cf_opa_mad_portlinkmode(gchar *buf, guint16 value) +{ + int len = 0; + if (value & 0x1) /* Reserved */ + len = g_snprintf(buf, ITEM_LABEL_LENGTH, "Reserved"); + if (value & 0x2) /* Ethernet */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%sEthernet", (len ? ", " : "")); + if (value & 0x4) /* STL */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%sSTL", (len ? ", " : "")); + if (!len) + g_snprintf(buf, ITEM_LABEL_LENGTH, "No State Change"); +} +static void cf_opa_mad_portltpcrcmode(gchar *buf, guint16 value) +{ + int len = 0; + if (value & 0x1) /* 14-bit */ + len = g_snprintf(buf, ITEM_LABEL_LENGTH, "14-bit"); + if (value & 0x2) /* 16-bit */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s16-bit", (len ? ", " : "")); + if (value & 0x4) /* 48-bit */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s48-bit overlapping", (len ? ", " : "")); + if (value & 0x8) /* 12 to 16 bit per lane */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s[12,16]-bit per lane", (len ? ", " : "")); + if (len) + g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, " LTP CRC Mode"); + else + g_snprintf(buf, ITEM_LABEL_LENGTH, "No State Change"); +} +static void cf_opa_mad_packetformat(gchar *buf, guint16 value) +{ + int len = 0; + if (value & 0x1) /* 8B */ + len = g_snprintf(buf, ITEM_LABEL_LENGTH, "8B"); + if (value & 0x2) /* 9B */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s9B", (len ? ", " : "")); + if (value & 0x4) /* 10B */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s10B", (len ? ", " : "")); + if (value & 0x8) /* 16B */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s16B", (len ? ", " : "")); + if (len) + g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, " Format%s", (len > 4 ? "s" : "")); + else + g_snprintf(buf, ITEM_LABEL_LENGTH, "No State Change"); +} +static void cf_opa_mad_swcongestionsetting_controlmap(gchar *buf, guint32 value) +{ + int len = 0; + if (value & 0x1) /* Victim */ + len = g_snprintf(buf, ITEM_LABEL_LENGTH, "Victim"); + if (value & 0x2) /* Credit */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%sCredit", (len ? ", " : "")); + if (value & 0x4) /* Thresold & PacketSize */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%sThresold & PacketSize", (len ? ", " : "")); + if (value & 0x8) /* CS_threshold & CS_ReturnDelay */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%sCS_threshold & CS_ReturnDelay", (len ? ", " : "")); + if (value & 0x10) /* Marking Rate */ + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%sMarking Rate", (len ? ", " : "")); + if (!len) + g_snprintf(buf, ITEM_LABEL_LENGTH, "No Valid Fields"); +} +static void cf_opa_mad_32b_mask(gchar *buf, guint32 value) +{ + int len = 0; + guint32 i, mask; + for (i = 0, mask = value; mask && i < 32 && len < ITEM_LABEL_LENGTH; i++, mask >>= 1) { + if (mask & 1) { + len += g_snprintf(&buf[len], ITEM_LABEL_LENGTH - len, "%s%u", (len ? ", " : ""), i); + } + } + if (!len) { + g_snprintf(buf, ITEM_LABEL_LENGTH, " "); + } +} +static void cf_opa_mad_computed_pct10(gchar *buf, guint16 value) +{ + g_snprintf(buf, ITEM_LABEL_LENGTH, "%u.%01u", value / 10, value % 10); +} + +/* Dissector Declarations */ +static dissector_handle_t opa_mad_handle; +static dissector_handle_t eth_handle; +static dissector_table_t ethertype_dissector_table; + +gboolean pref_parse_on_mad_status_error = FALSE; + +static range_t *global_mad_vendor_class = NULL; +static range_t *global_mad_vendor_rmpp_class = NULL; +static range_t *global_mad_application_class = NULL; +static range_t *global_mad_reserved_class = NULL; +static range_t *global_mad_opa_class = NULL; + +static gint parse_MAD_AttributeModifier(proto_tree *MAD_tree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_tree *AttributeModifier_tree; + proto_item *AttributeModifier_item; + gint local_offset = *offset; + + AttributeModifier_item = proto_tree_add_item(MAD_tree, hf_opa_attribute_modifier, tvb, local_offset, 4, ENC_BIG_ENDIAN); + AttributeModifier_tree = proto_item_add_subtree(AttributeModifier_item, ett_mad_attributemod); + + switch (MAD->MgmtClass) { + case SUBN_LID_ROUTED: + case SUBN_DIRECTED_ROUTE: + switch (MAD->AttributeID) { + case SM_ATTR_ID_CLASS_PORT_INFO: /* Shall be 0 */ + case SM_ATTR_ID_NOTICE: + case SM_ATTR_ID_NODE_DESCRIPTION: + case SM_ATTR_ID_NODE_INFO: + case SM_ATTR_ID_SWITCH_INFO: + case SM_ATTR_ID_SL_SC_MAPPING_TABLE: + case SM_ATTR_ID_SC_SL_MAPPING_TABLE: + case SM_ATTR_ID_SM_INFO: + case SM_ATTR_ID_CONGESTION_INFO: + case SM_ATTR_ID_SWITCH_CONGESTION_LOG: + case SM_ATTR_ID_SWITCH_CONGESTION_SETTING: + case SM_ATTR_ID_HFI_CONGESTION_LOG: + case SM_ATTR_ID_HFI_CONGESTION_SETTING: + if (MAD->AttributeModifier) + expert_add_info(NULL, AttributeModifier_item, &ei_opa_mad_attribute_modifier_error_nonzero); + break; + case SM_ATTR_ID_PORT_INFO: /* NNNN NNNN 0000 0000 0000 00SA PPPP PPPP */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_Nps2AP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_PORT_STATE_INFO: /* NNNN NNNN 0000 0000 0000 00S0 PPPP PPPP */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NpS2P, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_LED_INFO: /* NNNN NNNN 0000 0000 0000 000A PPPP PPPP */ + case SM_ATTR_ID_BUFFER_CONTROL_TABLE: + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NpAP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_PART_TABLE: /* NNNN NNNN PPPP PPPP 0000 0BBB BBBB BBBB */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbP2B, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_SC_SC_MAPPING_TABLE: /* NNNN NNNN 0000 00AB IIII IIII EEEE EEEE */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbA2B2IE, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_VL_ARBITRATION: /* NNNN NNNN SSSS SSSS 0000 000A PPPP PPPP */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NpSAP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_LINEAR_FWD_TABLE: /* NNNN NNNN 0000 0ABB BBBB BBBB BBBB BBBB */ + case SM_ATTR_ID_PORT_GROUP_FWD_TABLE: + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbA3B3, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_MCAST_FWD_TABLE: /* NNNN NNNN PP0A BBBB BBBB BBBB BBBB BBBB */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbP3A4B4, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_CABLE_INFO: /* 0AAA AAAA AAAA ALLL LLL0 0000 PPPP PPPP */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_A5LP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_AGGREGATE: /* 0000 0000 0000 0000 0000 0000 NNNN NNNN */ + proto_tree_add_item(AttributeModifier_tree, hf_opa_attribute_modifier_N2, tvb, local_offset, 4, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_SC_VLR_MAPPING_TABLE: /* NNNN NNNN 0000 0000 000Y 000A PPPP PPPP */ + case SM_ATTR_ID_SC_VLT_MAPPING_TABLE: + case SM_ATTR_ID_SC_VLNT_MAPPING_TABLE: + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbYAP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_SWITCH_PORT_CONGESTION_SETTING: /* NNNN NNNN 0000 0000 0000 0000 PPPP PPPP */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NpP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_HFI_CONGESTION_CONTROL_TABLE: /* NNNN NNNN 0000 0000 0000 0000 PPPP PPPP */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbP, ENC_BIG_ENDIAN); + break; + case SM_ATTR_ID_PORT_GROUP_TABLE: /* NNNN NNNN PP00 0000 0000 0000 00AB BBBB */ + proto_tree_add_bitmask_list(AttributeModifier_tree, tvb, local_offset, 4, _attribute_modifier_NbP3A6B5, ENC_BIG_ENDIAN); + break; + default: + if (MAD->AttributeModifier) + expert_add_info(NULL, AttributeModifier_item, &ei_opa_mad_attribute_modifier_error_nonzero); + break; + } + break; + case PERF: + switch (MAD->AttributeID) { + case PM_ATTR_ID_CLASS_PORTINFO: /* 0 */ + if (MAD->AttributeModifier) + expert_add_info(NULL, AttributeModifier_item, &ei_opa_mad_attribute_modifier_error_nonzero); + break; + case PM_ATTR_ID_PORT_STATUS: /* PPPP PPPP 0000 0000 0000 0000 0000 0000 */ + case PM_ATTR_ID_CLEAR_PORT_STATUS: + case PM_ATTR_ID_DATA_PORT_COUNTERS: + case PM_ATTR_ID_ERROR_PORT_COUNTERS: + proto_tree_add_item(AttributeModifier_tree, hf_opa_attribute_modifier_NP, tvb, local_offset, 4, ENC_BIG_ENDIAN); + break; + case PM_ATTR_ID_ERROR_INFO: + default: + if (MAD->AttributeModifier) + expert_add_info(NULL, AttributeModifier_item, &ei_opa_mad_attribute_modifier_error_nonzero); + break; + } + break; + case PERFADMN: + case SUBNADMN: + default: + if (MAD->AttributeModifier) + expert_add_info(NULL, AttributeModifier_item, &ei_opa_mad_attribute_modifier_error_nonzero); + break; + } + return local_offset += 4; +} +/* Parse the common MAD Header */ +static gboolean parse_MAD_Common(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *MAD_header_item; + proto_tree *MAD_header_tree; + proto_item *MAD_Status_item; + + if (MAD == NULL) { + return FALSE; + } + + /* Get the Management Class to decide between LID Routed and Direct Route */ + + /* Populate the Dissector Tree */ + MAD_header_item = proto_tree_add_item(parentTree, hf_opa_mad, tvb, local_offset, 24, ENC_NA); + MAD_header_tree = proto_item_add_subtree(MAD_header_item, ett_mad); + + proto_tree_add_item(MAD_header_tree, hf_opa_mad_base_version, tvb, local_offset, 1, ENC_BIG_ENDIAN); + MAD->BaseVersion = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + proto_tree_add_item(MAD_header_tree, hf_opa_mad_mgmt_class, tvb, local_offset, 1, ENC_BIG_ENDIAN); + MAD->MgmtClass = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + proto_tree_add_item(MAD_header_tree, hf_opa_mad_class_version, tvb, local_offset, 1, ENC_BIG_ENDIAN); + MAD->ClassVersion = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + proto_tree_add_item(MAD_header_tree, hf_opa_mad_method, tvb, local_offset, 1, ENC_BIG_ENDIAN); + MAD->Method = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + if (MAD->MgmtClass == SUBN_DIRECTED_ROUTE) { + proto_tree_add_item(MAD_header_tree, hf_opa_mad_status_DR_D, tvb, local_offset, 2, ENC_BIG_ENDIAN); + MAD_Status_item = proto_tree_add_item(MAD_header_tree, hf_opa_mad_status_DR_status, tvb, local_offset, 2, ENC_BIG_ENDIAN); + MAD->Status = tvb_get_ntohs(tvb, local_offset); + local_offset += 2; + if (MAD->Status & 0x7FFF) { + proto_item_append_text(MAD_header_item, " Error: 0x%04x", MAD->Status & 0x7FFF); + expert_add_info_format(pinfo, MAD_Status_item, &ei_opa_mad_error, + "Mad Status Error (0x%04x)", MAD->Status & 0x7FFF); + } + proto_tree_add_item(MAD_header_tree, hf_opa_mad_status_DR_Hop_Pointer, tvb, local_offset, 1, ENC_BIG_ENDIAN); + MAD->HopPointer = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + proto_tree_add_item(MAD_header_tree, hf_opa_mad_status_DR_Hop_Count, tvb, local_offset, 1, ENC_BIG_ENDIAN); + MAD->HopCount = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + } else { + MAD_Status_item = proto_tree_add_bitmask(MAD_header_tree, tvb, local_offset, + hf_opa_mad_status, ett_mad_status, _mad_status, ENC_BIG_ENDIAN); + MAD->Status = tvb_get_ntohs(tvb, local_offset); + local_offset += 2; + if (MAD->Status) { + proto_item_append_text(MAD_header_item, " Error: 0x%04x", MAD->Status); + expert_add_info_format(pinfo, MAD_Status_item, &ei_opa_mad_error, + "Mad Status Error (0x%04x)", MAD->Status); + } + proto_tree_add_item(MAD_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } + proto_tree_add_item(MAD_header_tree, hf_opa_mad_transaction_id, tvb, local_offset, 8, ENC_BIG_ENDIAN); + MAD->TransactionID = tvb_get_ntoh64(tvb, local_offset); + local_offset += 8; + proto_tree_add_item(MAD_header_tree, hf_opa_mad_attribute_id, tvb, local_offset, 2, ENC_BIG_ENDIAN); + MAD->AttributeID = tvb_get_ntohs(tvb, local_offset); + local_offset += 2; + proto_tree_add_item(MAD_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + MAD->AttributeModifier = tvb_get_ntohl(tvb, local_offset); + *offset = parse_MAD_AttributeModifier(MAD_header_tree, tvb, &local_offset, MAD); + + return TRUE; +} +/* Parse the RMPP (Reliable Multi-Packet Transaction Protocol) */ +static gboolean parse_RMPP(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset, RMPP_t *RMPP) +{ + gint local_offset = *offset; + proto_item *RMPP_header_item; + proto_item *RMPP_type_item; + proto_item *RMPP_segment_number_item; + proto_tree *RMPP_header_tree; + + RMPP_header_item = proto_tree_add_item(parentTree, hf_opa_rmpp, tvb, local_offset, 12, ENC_NA); + RMPP_header_tree = proto_item_add_subtree(RMPP_header_item, ett_rmpp); + + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_version, tvb, local_offset, 1, ENC_BIG_ENDIAN); + RMPP->Version = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + + RMPP_type_item = proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_type, tvb, local_offset, 1, ENC_BIG_ENDIAN); + RMPP->Type = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_r_resp_time, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_flags_last, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_flags_first, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_flags_active, tvb, local_offset, 1, ENC_BIG_ENDIAN); + RMPP->resptime_flags = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + RMPP->Status = tvb_get_guint8(tvb, local_offset); + local_offset += 1; + + if (!(RMPP->resptime_flags & RMPP_FLAG_ACTIVE_MASK) && RMPP->Type == RMPP_ILLEGAL) { + proto_item_set_text(RMPP_header_item, "%s%s", "RMPP (Empty)", " - Reliable Multi-Packet Transaction Protocol"); + proto_item_append_text(RMPP_type_item, " %s", "RMPP (Empty)"); + } else { + proto_item_set_text(RMPP_header_item, "%s%s", val_to_str(RMPP->Type, RMPP_Packet_Types, "RMPP (Reserved 0x%02x)"), " - Reliable Multi-Packet Transaction Protocol"); + proto_item_append_text(RMPP_type_item, " %s", val_to_str(RMPP->Type, RMPP_Packet_Types, "RMPP (Reserved 0x%02x)")); + } + switch (RMPP->Type) { + case RMPP_ILLEGAL: + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_data1, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_data2, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case RMPP_DATA: + RMPP_segment_number_item = proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_segment_number, tvb, local_offset, 4, ENC_BIG_ENDIAN); + RMPP->SegmentNumber = tvb_get_ntohl(tvb, local_offset); + if (RMPP->SegmentNumber > 1) { + expert_add_info_format(pinfo, RMPP_segment_number_item, &ei_opa_rmpp_undecoded, + "Parsing Disabled for RMPP Data Segments greater than 1 (%u)", RMPP->SegmentNumber); + } + local_offset += 4; + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_payload_length32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + RMPP->PayloadLength = tvb_get_ntohl(tvb, local_offset); + local_offset += 4; + break; + case RMPP_ACK: + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_segment_number, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(RMPP_header_tree, hf_opa_rmpp_new_window_last, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case RMPP_STOP: + case RMPP_ABORT: + proto_tree_add_item(RMPP_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_tree_add_item(RMPP_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + break; + default: + return FALSE; + } + *offset = local_offset; + return TRUE; +} +/* Parse NoticeDataDetails Attribute Field */ +static gint parse_NoticeDataDetails(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, guint16 trapNumber) +{ + gint local_offset = *offset; + proto_item *DataDetails_header_item; + proto_tree *DataDetails_header_tree; + + if (!parentTree) + return 0; + + DataDetails_header_item = proto_tree_add_item(parentTree, hf_opa_Trap, tvb, local_offset, 64, ENC_NA); + DataDetails_header_tree = proto_item_add_subtree(DataDetails_header_item, ett_datadetails); + proto_item_append_text(DataDetails_header_item, " %u DataDetails", trapNumber); + + switch (trapNumber) { + case 64: + case 65: + case 66: + case 67: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + break; + case 128: + case 2048: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case 129: + case 130: + case 131: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_PORTNO, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case 144: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_CAPABILITYMASK, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_CAPABILITYMASK3, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_144_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LinkWidthDowngradeEnabledChange, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LinkSpeecEnabledChange, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LinkWidthEnabledChange, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_NodeDescriptionChange, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case 145: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_SystemImageGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case 256: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_DRSLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_Method, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_DRNotice, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_DRPathTruncated, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_DRHopCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_AttributeID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_AttributeModifier, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_MKey, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_DRNoticeReturnPath, tvb, local_offset, 30, ENC_NA); + local_offset += 30; + break; + case 257: + case 258: + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_Key, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_SL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_SL_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_QP, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_QP, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + break; + case 259: + proto_tree_add_bitmask(DataDetails_header_tree, tvb, local_offset, hf_opa_Trap_DataValid, + ett_datadetails_trap259datavalid, _Trap_DataValid, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_PKey, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_SL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_SL_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_QP, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataDetails_header_tree, hf_opa_Trap_QP, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(DataDetails_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + default: + break; + } + + return local_offset; +} + +/* Parse NoticesAndTraps Attribute */ +static gint parse_NoticesAndTraps(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *NoticesAndTraps_header_item; + proto_tree *NoticesAndTraps_header_tree; + gboolean isGeneric = tvb_get_bits8(tvb, local_offset * 8, 1); + guint16 trapNumber = tvb_get_ntohs(tvb, local_offset + 4); + + if (!parentTree) + return *offset; + + NoticesAndTraps_header_item = proto_tree_add_item(parentTree, hf_opa_Notice, tvb, local_offset, 64, ENC_NA); + proto_item_set_text(NoticesAndTraps_header_item, "%s", val_to_str(trapNumber, Trap_Description, "Unknown or Vendor Specific Trap Number! (0x%02x)")); + NoticesAndTraps_header_tree = proto_item_add_subtree(NoticesAndTraps_header_item, ett_noticestraps); + + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_IsGeneric, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_Type, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + if (isGeneric) { + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_ProducerType, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_TrapNumber, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } else { + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_VendorID, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_DeviceID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_Toggle, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_Count, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_IssuerLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_IssuerGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + + parse_NoticeDataDetails(NoticesAndTraps_header_tree, tvb, &local_offset, trapNumber); + local_offset += 64; + proto_tree_add_item(NoticesAndTraps_header_tree, hf_opa_Notice_ClassDataDetails, tvb, local_offset, -1, ENC_NA); + return local_offset; +} + +/* Parse InformInfo Attribute*/ +static gint parse_InformInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *InformInfo_header_item; + proto_tree *InformInfo_header_tree; + gboolean isGeneric; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + InformInfo_header_item = proto_tree_add_item(parentTree, hf_opa_InformInfo, tvb, local_offset, 36, ENC_NA); + InformInfo_header_tree = proto_item_add_subtree(InformInfo_header_item, ett_informinfo); + + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_LIDRangeBegin, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_LIDRangeEnd, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + isGeneric = (gboolean)tvb_get_bits8(tvb, local_offset * 8 + 7, 1); + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_IsGeneric, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_Subscribe, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_Type, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(InformInfo_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + if (isGeneric) { + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_TrapNumber, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } else { + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_DeviceID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_QPN, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_RespTimeValue, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + local_offset += 1; + proto_tree_add_item(InformInfo_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + if (isGeneric) { + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_ProducerType, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + } else { + proto_tree_add_item(InformInfo_header_tree, hf_opa_InformInfo_VendorID, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + } + + return local_offset; +} + +/* Parse ClassPortInfo MAD from the ALL classes. */ +static gint parse_ClassPortInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_item *ClassPortInfo_item; + proto_tree *ClassPortInfo_tree; + proto_tree *ClassPortInfo_Redirect_tree; + proto_tree *ClassPortInfo_Trap_tree; + gint local_offset = *offset; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + ClassPortInfo_item = proto_tree_add_item(parentTree, hf_opa_ClassPortInfo, tvb, local_offset, 80, ENC_NA); + ClassPortInfo_tree = proto_item_add_subtree(ClassPortInfo_item, ett_classportinfo); + + proto_tree_add_item(ClassPortInfo_tree, hf_opa_ClassPortInfo_BaseVersion, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClassPortInfo_tree, hf_opa_ClassPortInfo_ClassVersion, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(ClassPortInfo_tree, hf_opa_ClassPortInfo_CapMask, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(ClassPortInfo_tree, hf_opa_ClassPortInfo_CapMask2, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(ClassPortInfo_tree, hf_opa_ClassPortInfo_RespTimeValue, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + ClassPortInfo_Redirect_tree = proto_tree_add_subtree(ClassPortInfo_tree, tvb, local_offset, 32, + ett_classportinfo_redirect, NULL, "Redirect"); + + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_reserved, tvb, local_offset, 3, ENC_BIG_ENDIAN); + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_FlowLabel, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_SL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_QP, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_Q_Key, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + ClassPortInfo_Trap_tree = proto_tree_add_subtree(ClassPortInfo_tree, tvb, local_offset, 32, + ett_classportinfo_trap, NULL, "Trap"); + + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_GID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_reserved, tvb, local_offset, 3, ENC_BIG_ENDIAN); + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_FlowLabel, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_HopLimit, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_QP, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_Q_Key, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(ClassPortInfo_Redirect_tree, hf_opa_ClassPortInfo_Redirect_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_SL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(ClassPortInfo_Trap_tree, hf_opa_ClassPortInfo_Trap_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(ClassPortInfo_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + + return local_offset; +} + +/* Parse NodeDescription Attribute */ +static gint parse_NodeDescription(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_tree *NodeDescription_header_tree = parentTree; + proto_item *NodeDescription_header_item; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + NodeDescription_header_item = proto_tree_add_item(NodeDescription_header_tree, hf_opa_NodeDescription, tvb, local_offset, 64, ENC_NA); + NodeDescription_header_tree = proto_item_add_subtree(NodeDescription_header_item, ett_nodedescription); + + proto_tree_add_item(NodeDescription_header_tree, hf_opa_NodeDescription_NodeString, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + return local_offset; +} + +/* Parse NodeInfo Attribute */ +static gint parse_NodeInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_tree *NodeInfo_header_tree = parentTree; + proto_item *NodeInfo_header_item; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + NodeInfo_header_item = proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo, tvb, local_offset, 44, ENC_NA); + NodeInfo_header_tree = proto_item_add_subtree(NodeInfo_header_item, ett_nodeinfo); + + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_BaseVersion, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_ClassVersion, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_NodeType, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_NumPorts, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_SystemImageGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_NodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_PortGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_PartitionCap, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_DeviceID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_Revision, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_LocalPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(NodeInfo_header_tree, hf_opa_NodeInfo_VendorID, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + + return local_offset; + +} + +/* Parse SwitchInfo Attribute */ +static gint parse_SwitchInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_tree *SwitchInfo_header_tree = parentTree; + proto_item *SwitchInfo_header_item; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + SwitchInfo_header_item = proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo, tvb, local_offset, 84, ENC_NA); + SwitchInfo_header_tree = proto_item_add_subtree(SwitchInfo_header_item, ett_switchinfo); + + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_LinearFDBCap, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_MulticastFDBCap, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_LinearFDBTop, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_MulticastFDBTop, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_CollectiveCap, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_CollectiveTop, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_IPAddrIPv6, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_IPAddrIPv4, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_LifeTimeValue, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_PortStateChange, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_PartitionEnforcementCap, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_PortGroupCap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_PortGroupTop, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_SupportedRoutingMode, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_EnabledRoutingMode, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_reserved3, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_EnhancedPortZero, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_reserved4, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_reserved5, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_CollectiveMask, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_MulticastMask, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_bitmask_list(SwitchInfo_header_tree, tvb, local_offset, 2, + _SwitchInfo_AdaptiveRouting, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_bitmask(SwitchInfo_header_tree, tvb, local_offset, hf_opa_SwitchInfo_SwitchCapabilityMask, + ett_switchinfo_switchcapabilitymask, _SwitchInfo_SwitchCapabilityMask, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(SwitchInfo_header_tree, hf_opa_SwitchInfo_CapabilityMaskCollectives, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + return local_offset; +} + +/* Parse PortInfo Attribute */ +static gint parse_PortInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_tree *PortInfo_header_tree = parentTree, + *PortInfo_VL_tree, + *PortInfo_Link_tree, + *PortInfo_FlitControl_tree, + *PortInfo_NeighborMTU_tree, + *PortInfo_XmitQ_tree; + proto_item * PortInfo_header_item, + *PortInfo_PortWdthSpeedActive_item; + proto_item *temp_item; + guint p, i, Num_ports, Port_num; + guint16 active; + + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + Port_num = (MAD->AttributeModifier & 0x000000FF); + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + for (p = Port_num; p < (Port_num + Num_ports); p++) { + PortInfo_header_item = proto_tree_add_item(parentTree, hf_opa_PortInfo, tvb, local_offset, 242, ENC_NA); + proto_item_set_text(PortInfo_header_item, "PortInfo on Port %d", p); + PortInfo_header_tree = proto_item_add_subtree(PortInfo_header_item, ett_portinfo); + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_LID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_FlowControlMask, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* VL */ + PortInfo_VL_tree = proto_tree_add_subtree(PortInfo_header_tree, tvb, local_offset, 8, + ett_portinfo_vl, NULL, "VL Info"); + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_PreemptCap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_Cap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_HighLimit, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_PreemptingLimit, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_ArbitrationHighCap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_VL_tree, hf_opa_PortInfo_VL_ArbitrationLowCap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* Port States */ + proto_tree_add_bitmask_list(PortInfo_header_tree, tvb, local_offset, 4, _PortStates, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortPhysConfig_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortPhysConfig_PortType, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* MultiCollectMask */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MultiCollectMask_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MultiCollectMask_CollectiveMask, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MultiCollectMask_MulticastMask, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_M_KeyProtectBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_S1_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_LMC, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_S2_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MasterSMSL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_LinkInitReason, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PartitionEnforcementInbound, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PartitionEnforcementOutbound, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_S3_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_S4_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_OperationalVL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* P_Keys */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_P_Keys_P_Key_8B, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_P_Keys_P_Key_10B, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* Violations */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_M_KeyViolations, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_P_KeyViolations, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_Q_KeyViolations, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_TrapQueuePair_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_TrapQueuePair, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_SAQueuePair_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_SAQueuePair, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_NeighborPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /*STL Linkdown reason */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_LinkDownReason, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /*STL NeighborLinkdown reason */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_NeighborLinkDownReason, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* Subnet */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_ClientRegister, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MulticastPKeyTrapSuppressEnabled, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_Timeout, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + PortInfo_Link_tree = proto_tree_add_subtree(PortInfo_header_tree, tvb, local_offset, 22, + ett_portinfo_link, NULL, "Link Info"); + /* LinkSpeed */ + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkSpeedSupported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkSpeedEnabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + active = tvb_get_ntohs(tvb, local_offset); + PortInfo_PortWdthSpeedActive_item = proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkSpeedActive, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + if (!active && (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP)) + proto_item_set_text(PortInfo_PortWdthSpeedActive_item, "None"); + /* LinkWidth */ + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthSupported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthEnabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + active = tvb_get_ntohs(tvb, local_offset); + PortInfo_PortWdthSpeedActive_item = proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthActive, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + if (!active && (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP)) + proto_item_set_text(PortInfo_PortWdthSpeedActive_item, "None"); + + /* LinkWidthDowngrade */ + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthDowngrade_Supported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthDowngrade_Enabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + active = tvb_get_ntohs(tvb, local_offset); + PortInfo_PortWdthSpeedActive_item = proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthDowngrade_TxActive, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + if (!active && (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP)) + proto_item_set_text(PortInfo_PortWdthSpeedActive_item, "None");; + active = tvb_get_ntohs(tvb, local_offset); + PortInfo_PortWdthSpeedActive_item = proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_LinkWidthDowngrade_RxActive, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + if (!active && (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP)) + proto_item_set_text(PortInfo_PortWdthSpeedActive_item, "None"); + + /*PortLinkMode */ + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_PortLinkMode_reserved, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_PortLinkMode_Supported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_PortLinkMode_Enabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_Link_tree, hf_opa_PortInfo_PortLinkMode_Active, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /*PortLTPCRCMode */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortLTPCRCMode_reserved, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortLTPCRCMode_Supported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortLTPCRCMode_Enabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortLTPCRCMode_Active, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + /*PortMode*/ + proto_tree_add_bitmask(PortInfo_header_tree, tvb, local_offset, hf_opa_PortInfo_PortMode, + ett_portinfo_portmode, _PortInfo_PortMode, ENC_BIG_ENDIAN); + local_offset += 2; + + /* PortPacketFormats */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortPacketFormats_Supported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortPacketFormats_Enabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* Flit Control */ + PortInfo_FlitControl_tree = proto_tree_add_subtree(PortInfo_header_tree, tvb, local_offset, 10, + ett_portinfo_flitcontrol, NULL, "Flit Control"); + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Interleave_reserved, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Interleave_DistanceSupported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Interleave_DistanceEnabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Interleave_MaxNestLevelTxEnabled, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Interleave_MaxNestLevelRxSupported, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Preemption_MinInitial, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Preemption_MinTail, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Preemption_LargePacketLimit, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Preemption_SmallPacketLimit, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Preemption_MaxSmallPacketLimit, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_FlitControl_tree, hf_opa_PortInfo_FlitControl_Preemption_PreemptionLimit, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /*PortErorrAction*/ + proto_tree_add_bitmask(PortInfo_header_tree, tvb, local_offset, hf_opa_PortInfo_PortErrorAction, + ett_portinfo_porterroraction, _PortInfo_PortErrorAction, ENC_BIG_ENDIAN); + local_offset += 4; + + /* PassThroughControl */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PassThroughControl_EgressPort, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PassThroughControl_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PassThroughControl_DRControl, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_M_KeyLeasePeriod, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* BufferUnits */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_BufferUnits_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_BufferUnits_VL15Init, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_BufferUnits_VL15CreditRate, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_BufferUnits_CreditAck, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_BufferUnits_BufferAlloc, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MasterSMLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_M_Key, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_SubnetPrefix, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + /*NeighborMTU */ + PortInfo_NeighborMTU_tree = proto_tree_add_subtree(PortInfo_header_tree, tvb, local_offset, 32 / 2, + ett_portinfo_neighbormtu, NULL, "NeighborMTU"); + for (i = 0; i < (32 / 2); i++) { + temp_item = proto_tree_add_item(PortInfo_NeighborMTU_tree, hf_opa_PortInfo_VL1, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(temp_item, "%3u: ", 2 * i); + temp_item = proto_tree_add_item(PortInfo_NeighborMTU_tree, hf_opa_PortInfo_VL2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_item_prepend_text(temp_item, "%3u: ", 2 * i + 1); + } + + /*XmitQ*/ + PortInfo_XmitQ_tree = proto_tree_add_subtree(PortInfo_header_tree, tvb, local_offset, 32, + ett_portinfo_xmitq, NULL, "XmitQ"); + for (i = 0; i < 32; i++) { + temp_item = proto_tree_add_item(PortInfo_XmitQ_tree, hf_opa_PortInfo_XmitQ_VLStallCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(temp_item, "%3u: ", i); + temp_item = proto_tree_add_item(PortInfo_XmitQ_tree, hf_opa_PortInfo_XmitQ_HOQLife, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_item_prepend_text(temp_item, " "); + } + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_IPAddrIPv6, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_IPAddrIPv4, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_NeighborNodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + /* Capability Mask Flags */ + proto_tree_add_bitmask(PortInfo_header_tree, tvb, local_offset, hf_opa_PortInfo_CapabilityMask, + ett_portinfo_capmask, _PortInfo_CapabilityMask, ENC_BIG_ENDIAN); + local_offset += 4; + /* End Capability Mask Flags */ + + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* CapabilityMask3 */ + proto_tree_add_bitmask(PortInfo_header_tree, tvb, local_offset, hf_opa_PortInfo_CapabilityMask3, + ett_portinfo_capmask3, _PortInfo_CapabilityMask3, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_OverallBufferSpace, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* Diag Code */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_DiagCode, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + /* End Diag Code */ + + /* Replay Depth */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_ReplayDepth_BufferDepth, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_ReplayDepth_WireDepth, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* PortNeighborMode */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortNeighborMode_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortNeighborMode_MgmtAllowed, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortNeighborMode_NeighborFWAuthenBypass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_PortNeighborMode_NeighborNodeType, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* MTU */ + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MTU_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_MTU_Cap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_Resp_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_Resp_TimeValue, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_PortInfo_LocalPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortInfo_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + /* 8 Byte Padding offset */ + local_offset += 8 - (242 % 8); + } + + return local_offset; +} + +/* Parse PortStateInfo Attribute */ +static gint parse_PortStateInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *PortStates_header_item; + proto_tree *PortStates_header_tree; + guint i, Num_ports, Port_num; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + Port_num = (MAD->AttributeModifier & 0x000000FF); + + for (i = Port_num; i < Port_num + Num_ports; i++) { + PortStates_header_item = proto_tree_add_item(parentTree, hf_opa_PortStates, tvb, local_offset, 4, ENC_NA); + proto_item_set_text(PortStates_header_item, "Port Sate Info on Port %d", i); + PortStates_header_tree = proto_item_add_subtree(PortStates_header_item, ett_portstates); + + proto_tree_add_bitmask_list(PortStates_header_tree, tvb, local_offset, 4, + _PortStates, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortStates_header_tree, hf_opa_PortStates_LinkWidthDowngradeTxActive, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortStates_header_tree, hf_opa_PortStates_LinkWidthDowngradeRxActive, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } + + return local_offset; +} + +/* Parse P_KeyTable Attribute */ +static gint parse_P_KeyTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *P_KeyTable_header_item; + proto_tree *P_KeyTable_header_tree; + proto_tree *tempBlock_tree; + proto_item *tempItemLow; + proto_item *tempItemHigh; + guint i, b, Num_blocks, Block_num/*, Port_num*/; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + Block_num = tvb_get_ntohs(tvb, local_offset - 4); + /*Port_num = tvb_get_guint8(tvb, local_offset - 2);*/ + } else { + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + Block_num = (MAD->AttributeModifier & 0x000007FF); + /*Port_num = (MAD->AttributeModifier & 0x00FF0000) >> 16;*/ + } + + P_KeyTable_header_item = proto_tree_add_item(parentTree, hf_opa_P_KeyTable, tvb, local_offset, 64 * Num_blocks, ENC_NA); + P_KeyTable_header_tree = proto_item_add_subtree(P_KeyTable_header_item, ett_pkeytable); + + for (b = Block_num; b < Block_num + Num_blocks; b++) { + tempBlock_tree = proto_tree_add_subtree_format(P_KeyTable_header_tree, tvb, local_offset, 64, + ett_pkeytable_block, NULL, "PKey Table Block %u", b); + + for (i = 0; i < 32; i++) { + tempItemHigh = proto_tree_add_item(tempBlock_tree, hf_opa_P_KeyTable_MembershipType, tvb, local_offset, 2, ENC_BIG_ENDIAN); + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_P_KeyTable_P_KeyBase, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_item_prepend_text(tempItemHigh, "%3u: ", i); + proto_item_prepend_text(tempItemLow, " "); + } + } + return local_offset; +} + +/* Parse SLtoSC Mapping Table Attribute */ +static gint parse_SLtoSCMappingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SLtoSCMappingTable_header_item; + proto_tree *SLtoSCMappingTable_header_tree; + proto_item *tempItemHigh; + proto_item *tempItemLow; + guint i; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + SLtoSCMappingTable_header_item = proto_tree_add_item(parentTree, hf_opa_SLtoSCMappingTable, tvb, local_offset, 32, ENC_NA); + SLtoSCMappingTable_header_tree = proto_item_add_subtree(SLtoSCMappingTable_header_item, ett_sltoscmapping); + + for (i = 0; i < 32; i++) { + tempItemHigh = proto_tree_add_item(SLtoSCMappingTable_header_tree, hf_opa_SLtoSCMappingTable_SLtoSC_HighBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemHigh, "%3u: ", i); + tempItemLow = proto_tree_add_item(SLtoSCMappingTable_header_tree, hf_opa_SLtoSCMappingTable_SLtoSC_LowBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, " "); + local_offset += 1; + } + + return local_offset; +} + +/* Parse SCtoSC Mapping Table Attribute */ +static gint parse_SCMappingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SCtoSCMappingTable_header_item; + proto_tree *SCtoSCMappingTable_header_tree; + proto_item *tempItemHigh; + proto_item *tempItemLow; + proto_tree *tempBlock_tree; + guint i, b, i_block, e_block, Num_blocks, Block_num; + gboolean A, B; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + A = FALSE; + B = FALSE; + i_block = tvb_get_guint8(tvb, local_offset - 4); + e_block = tvb_get_guint8(tvb, local_offset - 3); + Block_num = e_block; + } else { + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + A = (gboolean)((MAD->AttributeModifier & 0x00020000) >> 17); + B = (gboolean)((MAD->AttributeModifier & 0x00010000) >> 16); + i_block = (MAD->AttributeModifier & 0x0000FF00) >> 8; + e_block = (MAD->AttributeModifier & 0x000000FF); + Block_num = (B ? i_block : e_block); + } + + SCtoSCMappingTable_header_item = proto_tree_add_item(parentTree, hf_opa_SCtoSCMappingTable, tvb, local_offset, 32 * (A ? 1 : Num_blocks), ENC_NA); + SCtoSCMappingTable_header_tree = proto_item_add_subtree(SCtoSCMappingTable_header_item, ett_sctoscmapping); + + for (b = Block_num; b < (Block_num + Num_blocks); b++) { + tempBlock_tree = proto_tree_add_subtree_format(SCtoSCMappingTable_header_tree, tvb, local_offset, 32, + ett_sctoscmapping_block, NULL, "SC to SC Mapping Table for InPort %u, OutPort %u", (B ? b : i_block), (B ? e_block : b)); + + for (i = 0; i < 32; i++) { + tempItemHigh = proto_tree_add_item(tempBlock_tree, hf_opa_SCtoSCMappingTable_SCtoSC_HighBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemHigh, "%3u: ", i); + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_SCtoSCMappingTable_SCtoSC_LowBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, " "); + local_offset += 1; + } + if (A || B) + break; + } + + return local_offset; +} + +/* Parse SCtoSL Mapping Table Attribute */ +static gint parse_SCtoSLMappingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SCtoSLMappingTable_header_item; + proto_tree *SCtoSLMappingTable_header_tree; + proto_item *tempItemHigh; + proto_item *tempItemLow; + guint i; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + SCtoSLMappingTable_header_item = proto_tree_add_item(parentTree, hf_opa_SCtoSLMappingTable, tvb, local_offset, 32, ENC_NA); + SCtoSLMappingTable_header_tree = proto_item_add_subtree(SCtoSLMappingTable_header_item, ett_sctoslmapping); + + for (i = 0; i < 32; i++) { + tempItemHigh = proto_tree_add_item(SCtoSLMappingTable_header_tree, hf_opa_SCtoSLMappingTable_SCtoSL_HighBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemHigh, "%3u: ", i); + tempItemLow = proto_tree_add_item(SCtoSLMappingTable_header_tree, hf_opa_SCtoSLMappingTable_SCtoSL_LowBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, " "); + local_offset += 1; + } + return local_offset; +} + +/* Parse SCtoVLx Mapping Table Attribute */ +static gint parse_SCtoVLxMappingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SCtoVLxMappingTable_header_item; + proto_tree *SCtoVLxMappingTable_header_tree; + proto_item *tempItemLow; + proto_item *tempItemHigh; + proto_tree *tempBlock_tree; + guint p, v, Port_num, Num_ports; + gboolean All; + const gchar *VLx; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_ports = 1; + Port_num = tvb_get_guint8(tvb, local_offset - 4); + All = FALSE; + VLx = val_to_str_const(MAD->AttributeID, SA_SC_VLx, "x"); + } else { + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + All = (gboolean)((MAD->AttributeModifier & 0x00000100) >> 8); + Port_num = (MAD->AttributeModifier & 0x000000FF); + VLx = val_to_str_const(MAD->AttributeID, SM_SC_VLx, "x"); + } + + SCtoVLxMappingTable_header_item = proto_tree_add_item(parentTree, hf_opa_SCtoVLxMappingTable, tvb, local_offset, 32 * (All ? 1 : Num_ports), ENC_NA); + proto_item_set_text(SCtoVLxMappingTable_header_item, "SC to VL%s Mapping Table", VLx); + SCtoVLxMappingTable_header_tree = proto_item_add_subtree(SCtoVLxMappingTable_header_item, ett_sctovlxmappingtable); + + for (p = Port_num; p < (Port_num + (All ? 1 : Num_ports)); p++) { + tempBlock_tree = proto_tree_add_subtree_format(SCtoVLxMappingTable_header_tree, tvb, local_offset, 32, + ett_sctovlxmappingtable_block, NULL, "SC to VL%s Mapping Table for Port %u", VLx, p); + + for (v = 0; v < 32; v++) { + tempItemHigh = proto_tree_add_item(tempBlock_tree, hf_opa_SCtoVLxMappingTable_SCtoVLx_HighBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemHigh, "%3u: ", v); + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_SCtoVLxMappingTable_SCtoVLx_LowBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, " "); + local_offset += 1; + } + } + return local_offset; +} + +/* Parse VLArbitrationTable Attribute */ +static gint parse_VLArbitrationTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *VLArbitrationTable_header_item; + proto_tree * VLArbitrationTable_header_tree,*VLArbitrationTable_port_tree; + proto_item *tempItemHigh; + proto_item *tempItemLow; + proto_item *tempItem; + guint i, p, Section, Num_ports, Port_num; + gboolean All; + const gchar *TableType; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_ports = 1; + Section = tvb_get_guint8(tvb, local_offset - 3); + Port_num = tvb_get_guint8(tvb, local_offset - 4); + All = FALSE; + } else { + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + Section = (MAD->AttributeModifier & 0x00FF0000) >> 16; + All = (gboolean)((MAD->AttributeModifier & 0x00000100) >> 8); + Port_num = (MAD->AttributeModifier & 0x000000FF); + } + TableType = val_to_str_const(Section, MADAttrModSectionVLarb_short, "Reserved"); + + VLArbitrationTable_header_item = proto_tree_add_item(parentTree, hf_opa_VLArbitrationTable, tvb, local_offset, 256 * (All ? 1 : Num_ports), ENC_NA); + VLArbitrationTable_header_tree = proto_item_add_subtree(VLArbitrationTable_header_item, ett_vlarbitrationtable); + + for (p = Port_num; p < (Port_num + (All ? 1 : Num_ports)); p++) { + VLArbitrationTable_port_tree = proto_tree_add_subtree_format(VLArbitrationTable_header_tree, tvb, local_offset, 256, + ett_vlarbitrationtable_port, NULL, "%s VL Arbitration Table on Port %u", TableType, p); + + if (Section < 3) { + for (i = 0; i < 128; i++) { + tempItemHigh = proto_tree_add_item(VLArbitrationTable_port_tree, hf_opa_VLArbitrationTable_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemHigh, "%3u: ", i); + tempItemLow = proto_tree_add_item(VLArbitrationTable_port_tree, hf_opa_VLArbitrationTable_VL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, " "); + local_offset += 1; + + tempItem = proto_tree_add_item(VLArbitrationTable_port_tree, hf_opa_VLArbitrationTable_Weight, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_item_prepend_text(tempItem, " "); + } + } else if (Section == 3) { + for (i = 0; i < 32; i++) { + tempItemLow = proto_tree_add_item(VLArbitrationTable_port_tree, hf_opa_VLArbitrationTable_Matrix, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_item_prepend_text(tempItemLow, "%3u: ", i); + } + local_offset += 128; + } else { + local_offset += 256; + } + } + return local_offset; +} + +/* Parse LinearForwardingTable Attribute */ +static gint parse_LinearForwardingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *LinearForwardingTable_header_item; + proto_tree *LinearForwardingTable_header_tree; + proto_item *tempItemLow; + proto_tree *tempBlock_tree; + guint b, i, Block_num, Num_blocks; + gboolean All; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + Block_num = tvb_get_ntohl(tvb, local_offset - 4) & 0x0003FFFF; + All = FALSE; + } else { + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + All = (gboolean)((MAD->AttributeModifier & 0x00040000) >> 18); + Block_num = (MAD->AttributeModifier & 0x0003FFFF); + } + + LinearForwardingTable_header_item = proto_tree_add_item(parentTree, hf_opa_LinearForwardingTable, tvb, local_offset, 64 * (All ? 1 : Num_blocks), ENC_NA); + LinearForwardingTable_header_tree = proto_item_add_subtree(LinearForwardingTable_header_item, ett_linearforwardingtable); + for (b = Block_num; b < (Block_num + (All ? 1 : Num_blocks)); b++) { + tempBlock_tree = proto_tree_add_subtree_format(LinearForwardingTable_header_tree, tvb, local_offset, 64, + ett_linearforwardingtable_block, NULL, "Linear Forwarding Table Block %u", b); + + for (i = 0; i < 64; i++) { + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_LinearForwardingTable_Port, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_item_prepend_text(tempItemLow, "%3u: ", i); + } + } + return local_offset; +} + +/* Parse MulticastForwardingTable Attribute */ +static gint parse_MulticastForwardingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *MulticastForwardingTable_header_item; + proto_tree *MulticastForwardingTable_header_tree; + proto_item *tempItemLow; + proto_tree *tempBlock_tree; + guint b, i, Block_num, Num_blocks; + gboolean All; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + Block_num = tvb_get_ntohl(tvb, local_offset - 4) & 0x001FFFFF; + All = FALSE; + } else { + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + All = (gboolean)((MAD->AttributeModifier & 0x00100000) >> 20); + Block_num = (MAD->AttributeModifier & 0x000FFFFF); + } + + MulticastForwardingTable_header_item = proto_tree_add_item(parentTree, hf_opa_MulticastForwardingTable, tvb, local_offset, 64 * (All ? 1 : Num_blocks), ENC_NA); + MulticastForwardingTable_header_tree = proto_item_add_subtree(MulticastForwardingTable_header_item, ett_multicastforwardingtable); + for (b = Block_num; b < (Block_num + (All ? 1 : Num_blocks)); b++) { + tempBlock_tree = proto_tree_add_subtree_format(MulticastForwardingTable_header_tree, tvb, local_offset, 64, + ett_multicastforwardingtable_block, NULL, "Multicast Forwarding Table Block %u", b); + + for (i = 0; i < 8; i++) { + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_MulticastForwardingTable_PortMask, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_item_prepend_text(tempItemLow, "%3u: ", i); + } + } + return local_offset; +} + +/* Parse PortGroupForwardingTable Attribute */ +static gint parse_PortGroupForwardingTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *PortGroupForwardingTable_header_item; + proto_tree *PortGroupForwardingTable_header_tree; + proto_item *tempItemLow; + proto_tree *tempBlock_tree; + guint b, i, Block_num, Num_blocks; + gboolean All; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + All = FALSE; + Block_num = tvb_get_ntohl(tvb, local_offset - 4) & 0x0003FFFF; + } else { + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + All = (gboolean)((MAD->AttributeModifier & 0x00040000) >> 18); + Block_num = (MAD->AttributeModifier & 0x0003FFFF); + } + + PortGroupForwardingTable_header_item = proto_tree_add_item(parentTree, hf_opa_PortGroupForwardingTable, tvb, local_offset, 64 * (All ? 1 : Num_blocks), ENC_NA); + PortGroupForwardingTable_header_tree = proto_item_add_subtree(PortGroupForwardingTable_header_item, ett_portgroupforwardingtable); + + for (b = Block_num; b < (Block_num + (All ? 1 : Num_blocks)); b++) { + tempBlock_tree = proto_tree_add_subtree_format(PortGroupForwardingTable_header_tree, tvb, local_offset, 64, + ett_portgroupforwardingtable_block, NULL, "Port Group Forwarding Table Block %u", b); + + for (i = 0; i < 64; i++) { + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_PortGroupForwardingTable_Port, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_item_prepend_text(tempItemLow, "%3u: ", i); + } + } + return local_offset; +} + +/* Parse PortGroupTable Attribute */ +static gint parse_PortGroupTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *PortGroupTable_header_item; + proto_tree *PortGroupTable_header_tree; + proto_item *tempItemLow; + proto_tree *tempBlock_tree; + guint b, i, Block_num, Num_blocks; + gboolean All; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + All = FALSE; + Block_num = tvb_get_guint8(tvb, local_offset - 3) & 0x1F; + } else { + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + All = (gboolean)((MAD->AttributeModifier & 0x00000020) >> 5); + Block_num = (MAD->AttributeModifier & 0x0000001F); + } + + PortGroupTable_header_item = proto_tree_add_item(parentTree, hf_opa_PortGroupTable, tvb, local_offset, 64 * (All ? 1 : Num_blocks), ENC_NA); + PortGroupTable_header_tree = proto_item_add_subtree(PortGroupTable_header_item, ett_portgrouptable); + + for (b = Block_num; b < (Block_num + (All ? 1 : Num_blocks)); b++) { + tempBlock_tree = proto_tree_add_subtree_format(PortGroupTable_header_tree, tvb, local_offset, 8 * 8, + ett_portgrouptable_block, NULL, "Port Group Table Block %u", b); + + for (i = 0; i < 8; i++) { + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_PortGroupTable_PortMask, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_item_prepend_text(tempItemLow, "%3u: ", i); + } + } + return local_offset; +} + +/* Parse SMInfo Attribute */ +static gint parse_SMInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SMInfo_header_item; + proto_tree *SMInfo_header_tree; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + SMInfo_header_item = proto_tree_add_item(parentTree, hf_opa_SMInfo, tvb, local_offset, 26, ENC_NA); + SMInfo_header_tree = proto_item_add_subtree(SMInfo_header_item, ett_sminfo); + + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_GUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_SM_Key, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_ActCount, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_ElapsedTime, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_Priority, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_ElevatedPriority, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_InitialPriority, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SMInfo_header_tree, hf_opa_SMInfo_SMState, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + return local_offset; +} + +/* Parse LedInfo Attribute */ +static gint parse_LedInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *LedInfo_header_item; + proto_tree *LedInfo_header_tree; + proto_item *tempItemHigh; + proto_item *tempItemLow; + guint p, Port_num, Num_ports; + gboolean All; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + All = (gboolean)((MAD->AttributeModifier & 0x00000100) >> 8); + Port_num = (MAD->AttributeModifier & 0x000000FF); + + LedInfo_header_item = proto_tree_add_item(parentTree, hf_opa_LedInfo, tvb, local_offset, 8 * (All ? 1 : Num_ports), ENC_NA); + LedInfo_header_tree = proto_item_add_subtree(LedInfo_header_item, ett_ledinfo); + + for (p = Port_num; p < (Port_num + (All ? 1 : Num_ports)); p++) { + tempItemHigh = proto_tree_add_item(LedInfo_header_tree, hf_opa_LedInfo_LedMask, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemHigh, "Port %3u: ", p); + tempItemLow = proto_tree_add_item(LedInfo_header_tree, hf_opa_LedInfo_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, " "); + local_offset += 4; + proto_tree_add_item(LedInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } + return local_offset; +} + +/* Parse CableInfo Attribute */ +static gint parse_CableInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *CableInfo_header_item; + proto_tree *CableInfo_header_tree; + proto_item *tempItemLow; + guint i, Port_num, Data_Len, start_addr; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + start_addr = (MAD->AttributeModifier & 0x7FF80000) >> 19; + Port_num = (MAD->AttributeModifier & 0x000000FF); + Data_Len = ((MAD->AttributeModifier & 0x0007E000) >> 13) + 1; + + CableInfo_header_item = proto_tree_add_item(parentTree, hf_opa_CableInfo, tvb, local_offset, Data_Len, ENC_NA); + proto_item_set_text(CableInfo_header_item, "Cable Info on Port %u", Port_num); + CableInfo_header_tree = proto_item_add_subtree(CableInfo_header_item, ett_cableinfo); + + proto_tree_add_item(CableInfo_header_tree, hf_opa_CableInfo_DataStream, tvb, local_offset, Data_Len, ENC_ASCII | ENC_NA); + for (i = 0; i < Data_Len; i++) { + tempItemLow = proto_tree_add_item(CableInfo_header_tree, hf_opa_CableInfo_Data, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItemLow, "0x%04X: ", i + start_addr); + local_offset += 1; + } + return local_offset; +} +/* Parse BufferControlTable Attribute */ +static gint parse_BufferControlTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *BufferControlTable_header_item; + proto_tree *BufferControlTable_header_tree; + proto_item *tempItemLow; + proto_item *tempItemHigh; + proto_tree *tempBlock_tree; + guint p, i, Port_num, Num_ports; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + Port_num = (MAD->AttributeModifier & 0x000000FF); + + BufferControlTable_header_item = proto_tree_add_item(parentTree, hf_opa_BufferControlTable, tvb, local_offset, (4 + 32 * 4) * Num_ports, ENC_NA); + BufferControlTable_header_tree = proto_item_add_subtree(BufferControlTable_header_item, ett_buffercontroltable); + + for (p = Port_num; p < Port_num + Num_ports; p++) { + tempBlock_tree = proto_tree_add_subtree_format(BufferControlTable_header_tree, tvb, local_offset, (4 + 32 * 4), + ett_buffercontroltable_port, NULL, "Buffer Control Table Port %u", p); + + proto_tree_add_item(tempBlock_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(tempBlock_tree, hf_opa_BufferControlTable_TxOverallSharedLimit, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + for (i = 0; i < 32; i++) { + tempItemHigh = proto_tree_add_item(tempBlock_tree, hf_opa_BufferControlTable_TxSharedLimit, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + tempItemLow = proto_tree_add_item(tempBlock_tree, hf_opa_BufferControlTable_TxDedicatedLimit, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_item_prepend_text(tempItemHigh, "VL %2u: ", i); + proto_item_prepend_text(tempItemLow, " "); + } + } + return local_offset; +} +static gint parse_FabricInfoRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *FabricInfoRecord_header_item; + proto_tree *FabricInfoRecord_header_tree; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + FabricInfoRecord_header_item = proto_tree_add_item(parentTree, hf_opa_FabricInfoRecord, tvb, local_offset, 132, ENC_NA); + FabricInfoRecord_header_tree = proto_item_add_subtree(FabricInfoRecord_header_item, ett_fabricinforecord); + + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumHFIs, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumSwitches, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumInternalHFILinks, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumExternalHFILinks, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumInternalISLs, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumExternalISLs, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumDegradedHFILinks, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumDegradedISLs, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumOmittedHFILinks, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_NumOmittedISLs, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(FabricInfoRecord_header_tree, hf_opa_FabricInfoRecord_Reserved, tvb, local_offset, 92, ENC_BIG_ENDIAN); + local_offset += 92; + + return local_offset; +} + +/* Parse CongestionInfo Attribute */ +static gint parse_CongestionInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *CongestionInfo_header_item; + proto_tree *CongestionInfo_header_tree; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + CongestionInfo_header_item = proto_tree_add_item(parentTree, hf_opa_CongestionInfo, tvb, local_offset, 4, ENC_NA); + CongestionInfo_header_tree = proto_item_add_subtree(CongestionInfo_header_item, ett_congestioninfo); + + proto_tree_add_item(CongestionInfo_header_tree, hf_opa_CongestionInfo_CongestionInfo, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(CongestionInfo_header_tree, hf_opa_CongestionInfo_ControlTableCap, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(CongestionInfo_header_tree, hf_opa_CongestionInfo_CongestionLogLength, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + return local_offset; +} + +/* Parse SwitchCongestionLog Attribute */ +static gint parse_SwitchCongestionLog(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SwitchCongestionLog_header_item; + proto_tree *SwitchCongestionLog_header_tree; + proto_tree *SwitchCongestionLog_Entry_tree; + guint i; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + SwitchCongestionLog_header_item = proto_tree_add_item(parentTree, hf_opa_SwitchCongestionLog, tvb, local_offset, 40 + (96 * 16), ENC_NA); + SwitchCongestionLog_header_tree = proto_item_add_subtree(SwitchCongestionLog_header_item, ett_switchcongestionlog); + + proto_tree_add_item(SwitchCongestionLog_header_tree, hf_opa_SwitchCongestionLog_LogType, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionLog_header_tree, hf_opa_SwitchCongestionLog_CongestionFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionLog_header_tree, hf_opa_SwitchCongestionLog_LogEventsCounter, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SwitchCongestionLog_header_tree, hf_opa_SwitchCongestionLog_CurrentTimeStamp, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchCongestionLog_header_tree, hf_opa_SwitchCongestionLog_PortMap, tvb, local_offset, 32, ENC_NA); + local_offset += 32; + + for (i = 0; i < 96; i++) { + SwitchCongestionLog_Entry_tree = proto_tree_add_subtree_format(SwitchCongestionLog_header_tree, tvb, local_offset, 16, + ett_switchcongestionlog_entry, NULL, "Switch Congestion Log Entry %u", i); + + proto_tree_add_item(SwitchCongestionLog_Entry_tree, hf_opa_SwitchCongestionLog_SLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchCongestionLog_Entry_tree, hf_opa_SwitchCongestionLog_DLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchCongestionLog_Entry_tree, hf_opa_SwitchCongestionLog_SC, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchCongestionLog_Entry_tree, hf_opa_SwitchCongestionLog_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionLog_Entry_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(SwitchCongestionLog_Entry_tree, hf_opa_SwitchCongestionLog_TimeStamp, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } + return local_offset; +} + +/* Parse SwitchCongestionSetting Attribute */ +static gint parse_SwitchCongestionSetting(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SwitchCongestionSetting_header_item; + proto_tree *SwitchCongestionSetting_header_tree; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + SwitchCongestionSetting_header_item = proto_tree_add_item(parentTree, hf_opa_SwitchCongestionSetting, tvb, local_offset, 64, ENC_NA); + SwitchCongestionSetting_header_tree = proto_item_add_subtree(SwitchCongestionSetting_header_item, ett_switchcongestionsetting); + + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_Control_Map, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_Victim_Mask, tvb, local_offset, 32, ENC_NA); + local_offset += 32; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_Credit_Mask, tvb, local_offset, 32, ENC_NA); + local_offset += 32; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_Threshold, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_reserved1, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_Packet_Size, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_CS_Threshold, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_CS_ReturnDelay, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SwitchCongestionSetting_header_tree, hf_opa_SwitchCongestionSetting_Marking_Rate, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + return local_offset; +} + +/* Parse SwitchPortCongestionSetting Attribute */ +static gint parse_SwitchPortCongestionSetting(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *SwitchPortCongestionSetting_header_item; + proto_tree *SwitchPortCongestionSetting_header_tree; + proto_tree *SwitchPortCongestionSetting_Port_tree; + guint p, Num_ports, Port_num; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + Num_ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + Port_num = (MAD->AttributeModifier & 0x000000FF); + + SwitchPortCongestionSetting_header_item = proto_tree_add_item(parentTree, hf_opa_SwitchPortCongestionSetting, tvb, local_offset, 4 * Num_ports, ENC_NA); + SwitchPortCongestionSetting_header_tree = proto_item_add_subtree(SwitchPortCongestionSetting_header_item, ett_switchportcongestionsetting); + + for (p = Port_num; p < Port_num + Num_ports; p++) { + SwitchPortCongestionSetting_Port_tree = proto_tree_add_subtree_format(SwitchPortCongestionSetting_header_tree, tvb, local_offset, 4, + ett_switchportcongestionsetting_port, NULL, "Switch Port Congestion Setting on Port %u", p); + + proto_tree_add_item(SwitchPortCongestionSetting_Port_tree, hf_opa_SwitchPortCongestionSetting_Valid, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchPortCongestionSetting_Port_tree, hf_opa_SwitchPortCongestionSetting_Control_Type, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchPortCongestionSetting_Port_tree, hf_opa_SwitchPortCongestionSetting_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(SwitchPortCongestionSetting_Port_tree, hf_opa_SwitchPortCongestionSetting_Threshold, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchPortCongestionSetting_Port_tree, hf_opa_SwitchPortCongestionSetting_Packet_Size, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SwitchPortCongestionSetting_Port_tree, hf_opa_SwitchPortCongestionSetting_Marking_Rate, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + } + + return local_offset; +} + +/* Parse HFICongestionLog Attribute */ +static gint parse_HFICongestionLog(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *HFICongestionLog_header_item; + proto_tree *HFICongestionLog_header_tree; + proto_tree *HFICongestionLog_Entry_tree; + guint i; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + HFICongestionLog_header_item = proto_tree_add_item(parentTree, hf_opa_HFICongestionLog, tvb, local_offset, 12 + (96 * 16), ENC_NA); + HFICongestionLog_header_tree = proto_item_add_subtree(HFICongestionLog_header_item, ett_hficongestionlog); + + proto_tree_add_item(HFICongestionLog_header_tree, hf_opa_HFICongestionLog_LogType, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(HFICongestionLog_header_tree, hf_opa_HFICongestionLog_CongestionFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(HFICongestionLog_header_tree, hf_opa_HFICongestionLog_ThresholdEventCounter, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(HFICongestionLog_header_tree, hf_opa_HFICongestionLog_CurrentTimeStamp, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(HFICongestionLog_header_tree, hf_opa_HFICongestionLog_ThresholdCongestionEventMap, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + for (i = 0; i < 96; i++) { + HFICongestionLog_Entry_tree = proto_tree_add_subtree_format(HFICongestionLog_header_tree, tvb, local_offset, 16, + ett_hficongestionlog_entry, NULL, "HFI Congestion Log Entry %u", i); + + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_HFICongestionLog_Local_QP_CN_Entry, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_HFICongestionLog_Remote_QP_Number_CN_Entry, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_HFICongestionLog_SL_CN_Entry, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_HFICongestionLog_Service_Type_CN_Entry, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_HFICongestionLog_Remote_LID_CN_Entry, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(HFICongestionLog_Entry_tree, hf_opa_HFICongestionLog_TimeStamp_CN_Entry, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } + return local_offset; +} + +/* Parse HFICongestionSetting Attribute*/ +static gint parse_HFICongestionSetting(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint i; + gint local_offset = *offset; + proto_item *HFICongestionSetting_header_item; + proto_tree *HFICongestionSetting_header_tree; + proto_item *tempItem; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + HFICongestionSetting_header_item = proto_tree_add_item(parentTree, hf_opa_HFICongestionSetting, tvb, local_offset, 6 + 32 * 6, ENC_NA); + HFICongestionSetting_header_tree = proto_item_add_subtree(HFICongestionSetting_header_item, ett_hficongestionsetting); + + proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_HFICongestionSetting_Control_Map, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_HFICongestionSetting_Port_Control, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + for (i = 0; i < 32; i++) { + tempItem = proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_HFICongestionSetting_CCTI_Increase, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItem, "%3u: ", i); + local_offset += 1; + + tempItem = proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItem, " "); + local_offset += 1; + + tempItem = proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_HFICongestionSetting_CCTI_Timer, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItem, " "); + local_offset += 2; + + tempItem = proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_HFICongestionSetting_TriggerThreshold, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItem, " "); + local_offset += 1; + + tempItem = proto_tree_add_item(HFICongestionSetting_header_tree, hf_opa_HFICongestionSetting_CCTI_Min, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItem, " "); + local_offset += 1; + } + + return local_offset; +} + +/* Parse HFICongestionControlTable Attribute*/ +static gint parse_HFICongestionControlTable(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *HFICongestionControlTable_header_item; + proto_tree *HFICongestionControlTable_header_tree; + proto_item *tempItem; + proto_tree *tempBlock_tree; + guint b, i, Num_blocks, Block_Num; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + if (MAD->MgmtClass == SUBNADMN) { + Num_blocks = 1; + Block_Num = tvb_get_ntohs(tvb, local_offset - 4); + } else { /* SM LID and SM DR */ + Num_blocks = (MAD->AttributeModifier & 0xFF000000) >> 24; + Block_Num = (MAD->AttributeModifier & 0x000000FF); + } + + HFICongestionControlTable_header_item = proto_tree_add_item(parentTree, hf_opa_HFICongestionControlTable, tvb, local_offset, 2 + ((64 * 2) * Num_blocks), ENC_NA); + HFICongestionControlTable_header_tree = proto_item_add_subtree(HFICongestionControlTable_header_item, ett_hficongestioncontroltable); + + proto_tree_add_item(HFICongestionControlTable_header_tree, hf_opa_HFICongestionControlTable_CCTI_Limit, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + for (b = Block_Num; b < Block_Num + Num_blocks; b++) { + tempBlock_tree = proto_tree_add_subtree_format(HFICongestionControlTable_header_tree, tvb, local_offset, 128, + ett_hficongestioncontroltable_block, NULL, "HFI Congestion Control Table Block %u", b); + + for (i = 0; i < 64; i++) { + tempItem = proto_tree_add_item(tempBlock_tree, hf_opa_HFICongestionControlTable_CCT_Shift, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_item_prepend_text(tempItem, "%3u: ", i); + tempItem = proto_tree_add_item(tempBlock_tree, hf_opa_HFICongestionControlTable_CCT_Multiplier, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_item_prepend_text(tempItem, " "); + + } + } + return local_offset; +} +/* Call appropriate parsing function */ +static gboolean call_SUBM_Parser(proto_tree *parentTree, tvbuff_t *tvb, guint *offset, MAD_t *MAD, guint16 AttributeID) +{ + proto_tree *SUBM_Attribute_header_tree = parentTree; + guint local_offset = *offset; + + if (!tvb_bytes_exist(tvb, local_offset, 8)) + return TRUE; + + switch (AttributeID) { + case SM_ATTR_ID_CLASS_PORT_INFO: + local_offset = parse_ClassPortInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_NOTICE: + local_offset = parse_NoticesAndTraps(SUBM_Attribute_header_tree, tvb, offset); + break; + case SM_ATTR_ID_NODE_DESCRIPTION: + local_offset = parse_NodeDescription(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_NODE_INFO: + local_offset = parse_NodeInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SWITCH_INFO: + local_offset = parse_SwitchInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_PORT_INFO: + local_offset = parse_PortInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_PART_TABLE: + local_offset = parse_P_KeyTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SL_SC_MAPPING_TABLE: + local_offset = parse_SLtoSCMappingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_VL_ARBITRATION: + local_offset = parse_VLArbitrationTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_LINEAR_FWD_TABLE: + local_offset = parse_LinearForwardingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_MCAST_FWD_TABLE: + local_offset = parse_MulticastForwardingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SM_INFO: + local_offset = parse_SMInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_LED_INFO: + local_offset = parse_LedInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_CABLE_INFO: + local_offset = parse_CableInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SC_SC_MAPPING_TABLE: + local_offset = parse_SCMappingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SC_SL_MAPPING_TABLE: + local_offset = parse_SCtoSLMappingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SC_VLR_MAPPING_TABLE: + case SM_ATTR_ID_SC_VLT_MAPPING_TABLE: + case SM_ATTR_ID_SC_VLNT_MAPPING_TABLE: + local_offset = parse_SCtoVLxMappingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_PORT_STATE_INFO: + local_offset = parse_PortStateInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_PORT_GROUP_FWD_TABLE: + local_offset = parse_PortGroupForwardingTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_PORT_GROUP_TABLE: + local_offset = parse_PortGroupTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_BUFFER_CONTROL_TABLE: + local_offset = parse_BufferControlTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_CONGESTION_INFO: + local_offset = parse_CongestionInfo(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SWITCH_CONGESTION_LOG: + local_offset = parse_SwitchCongestionLog(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SWITCH_CONGESTION_SETTING: + local_offset = parse_SwitchCongestionSetting(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_SWITCH_PORT_CONGESTION_SETTING: + local_offset = parse_SwitchPortCongestionSetting(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_HFI_CONGESTION_LOG: + local_offset = parse_HFICongestionLog(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_HFI_CONGESTION_SETTING: + local_offset = parse_HFICongestionSetting(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + case SM_ATTR_ID_HFI_CONGESTION_CONTROL_TABLE: + local_offset = parse_HFICongestionControlTable(SUBM_Attribute_header_tree, tvb, offset, MAD); + break; + default: + return FALSE; + } + *offset = local_offset; + return TRUE; +} + +/* Parse Aggregate Attribute */ +static gint parse_Aggregate(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint i; + guint requestLength; + gint numAttributes; + gint local_offset = *offset; + gint saved_offset; + guint16 LocalAttributeID = 0; + gboolean AggregatError = FALSE; + proto_item *Aggregate_header_item; + proto_item *Aggregate_Length_item; + proto_item *Aggregate_Error_item; + proto_tree *Aggregate_header_tree; + + if (!parentTree) + return *offset; + + numAttributes = MAD->AttributeModifier & 0x000000FF; + + for (i = 0; i < numAttributes; i++) { + requestLength = (tvb_get_guint8(tvb, local_offset + 3) & 0x7F) * 8; + if (i == numAttributes - 1 && MAD->Method == METHOD_GET) { + Aggregate_header_item = proto_tree_add_item(parentTree, hf_opa_Aggregate, tvb, local_offset, 8, ENC_NA); + } else { + Aggregate_header_item = proto_tree_add_item(parentTree, hf_opa_Aggregate, tvb, local_offset, requestLength + 8, ENC_NA); + } + Aggregate_header_tree = proto_item_add_subtree(Aggregate_header_item, ett_aggregate); + + proto_tree_add_item(Aggregate_header_tree, hf_opa_Aggregate_AttributeID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + LocalAttributeID = tvb_get_ntohs(tvb, local_offset); + local_offset += 2; + proto_item_set_text(Aggregate_header_item, "Aggregate %u: %s", i + 1, val_to_str(LocalAttributeID, SUBM_Attributes, "Unknown Attribute Type! (0x%02x)")); + + AggregatError = (gboolean)tvb_get_bits(tvb, local_offset*8, 1, ENC_BIG_ENDIAN); + Aggregate_Error_item = proto_tree_add_item(Aggregate_header_tree, hf_opa_Aggregate_Error, tvb, local_offset, 2, ENC_BIG_ENDIAN); + if (AggregatError) + expert_add_info(NULL, Aggregate_Error_item, &ei_opa_aggregate_error); + + Aggregate_Length_item = proto_tree_add_item(Aggregate_header_tree, hf_opa_Aggregate_RequestLength, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_item_append_text(Aggregate_Length_item, " (%u Bytes)", requestLength); + local_offset += 2; + + MAD->AttributeModifier = tvb_get_ntohl(tvb, local_offset); + MAD->AttributeID = LocalAttributeID; + local_offset = parse_MAD_AttributeModifier(Aggregate_header_tree, tvb, &local_offset, MAD); + if (i == numAttributes - 1 && MAD->Method == METHOD_GET) { + /* Do Nothing */ + } else { + saved_offset = local_offset; + call_SUBM_Parser(Aggregate_header_tree, tvb, &local_offset, MAD, LocalAttributeID); + if (local_offset != (saved_offset + (gint)requestLength)) { + local_offset = saved_offset + (gint)requestLength; + } + } + } + return local_offset; +} +/* Parse the attribute from a Subnet Management Packet. */ +static gboolean parse_SUBM_Attribute(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + if (MAD->AttributeID == SM_ATTR_ID_AGGREGATE) { + *offset = parse_Aggregate(parentTree, tvb, &local_offset, MAD); + return TRUE; + } else + return call_SUBM_Parser(parentTree, tvb, offset, MAD, MAD->AttributeID); +} +/* Parse the Method from the MAD Common Header. */ +static void label_SUBM_Method(proto_item *SubMItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->Method, SUBM_Methods, "(Unknown SM Method!)"); + proto_item_append_text(SubMItem, " %s", label); + col_append_str(pinfo->cinfo, COL_INFO, label); +} +/* Parse the Attribute from the MAD Common Header */ +static void label_SUBM_Attribute(proto_item *SubMItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->AttributeID, SUBM_Attributes, "Attribute (Unknown SM Attribute!)"); + proto_item_append_text(SubMItem, "%s", &label[11]); + col_append_str(pinfo->cinfo, COL_INFO, &label[11]); +} +/* Parse Subnet Management (LID Routed) */ +static void parse_SUBN_LID_ROUTED(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + gint local_offset; + proto_item *SM_LID_header_item; + proto_tree *SM_LID_header_tree; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + local_offset = *offset; + + SM_LID_header_item = proto_tree_add_item(parentTree, hf_opa_sm_lid, tvb, local_offset, -1, ENC_NA); + SM_LID_header_tree = proto_item_add_subtree(SM_LID_header_item, ett_sm_lid); + + proto_tree_add_item(SM_LID_header_tree, hf_opa_sm_m_key, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + label_SUBM_Method(SM_LID_header_item, &MAD, pinfo); + label_SUBM_Attribute(SM_LID_header_item, &MAD, pinfo); + + *offset = local_offset; + if (!pref_parse_on_mad_status_error && MAD.Status) { + local_offset += tvb_captured_length_remaining(tvb, *offset); + } else if (!parse_SUBM_Attribute(SM_LID_header_tree, tvb, &local_offset, &MAD)) { + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + local_offset += tvb_captured_length_remaining(tvb, *offset); + } + *offset = local_offset; +} + +/* Parse Subnet Management (Directed Route) */ +static void parse_SUBN_DIRECTED_ROUTE(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + gint local_offset; + proto_item *SM_DR_header_item; + proto_tree *SM_DR_header_tree; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + local_offset = *offset; + + SM_DR_header_item = proto_tree_add_item(parentTree, hf_opa_sm_dr, tvb, local_offset, -1, ENC_NA); + SM_DR_header_tree = proto_item_add_subtree(SM_DR_header_item, ett_sm_dr); + + proto_tree_add_item(SM_DR_header_item, hf_opa_sm_m_key, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + label_SUBM_Method(SM_DR_header_item, &MAD, pinfo); + label_SUBM_Attribute(SM_DR_header_item, &MAD, pinfo); + + proto_tree_add_item(SM_DR_header_tree, hf_opa_sm_dr_slid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SM_DR_header_tree, hf_opa_sm_dr_dlid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SM_DR_header_tree, hf_opa_sm_dr_initial_path, tvb, local_offset, 64, ENC_NA); + local_offset += 64; + proto_tree_add_item(SM_DR_header_tree, hf_opa_sm_dr_return_path, tvb, local_offset, 64, ENC_NA); + local_offset += 64; + proto_tree_add_item(SM_DR_header_tree, hf_opa_sm_dr_reserved64, tvb, local_offset, 8, ENC_NA); + local_offset += 8; + *offset = local_offset; + if (!pref_parse_on_mad_status_error && (MAD.Status & 0x7FFF)) { + local_offset += tvb_captured_length_remaining(tvb, *offset); + } else if (!parse_SUBM_Attribute(SM_DR_header_tree, tvb, &local_offset, &MAD)) { + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + local_offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + *offset = local_offset; +} + +static gint parse_PortInfoRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_tree * PortInfoRecord_LinkDownReason_tree, + *PortInfoRecord_LinkDownReason_Entry_tree; + gint i; + local_offset = parse_PortInfo(parentTree, tvb, &local_offset, MAD); + + PortInfoRecord_LinkDownReason_tree = proto_tree_add_subtree(parentTree, tvb, local_offset, 8 * 16, + ett_portinforecord_linkdownreason, NULL, "Port Info Record LinkDown Reason"); + for (i = 0; i < 8; i++) { + PortInfoRecord_LinkDownReason_Entry_tree = proto_tree_add_subtree_format(PortInfoRecord_LinkDownReason_tree, tvb, local_offset, 16, + ett_portinforecord_linkdownreason_entry, NULL, "Link Down Reason Entry %u", i); + + proto_tree_add_item(PortInfoRecord_LinkDownReason_Entry_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_tree_add_item(PortInfoRecord_LinkDownReason_Entry_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_NA); + local_offset += 2; + proto_tree_add_item(PortInfoRecord_LinkDownReason_Entry_tree, hf_opa_PortInfoRecord_LinkDownReason_NeighborLinkDownReason, tvb, local_offset, 1, ENC_NA); + local_offset += 1; + proto_tree_add_item(PortInfoRecord_LinkDownReason_Entry_tree, hf_opa_PortInfoRecord_LinkDownReason_LinkDownReason, tvb, local_offset, 1, ENC_NA); + local_offset += 1; + proto_tree_add_item(PortInfoRecord_LinkDownReason_Entry_tree, hf_opa_PortInfoRecord_LinkDownReason_Timestamp, tvb, local_offset, 8, ENC_NA); + local_offset += 8; + + } + return local_offset; +} + +/* Parse LinkRecord Attribute*/ +static gint parse_LinkRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *LinkRecord_header_item; + proto_tree *LinkRecord_header_tree; + + if (!parentTree) { + return *offset; + } + + LinkRecord_header_item = proto_tree_add_item(parentTree, hf_opa_LinkRecord, tvb, local_offset, 7, ENC_NA); + LinkRecord_header_tree = proto_item_add_subtree(LinkRecord_header_item, ett_linkrecord); + + proto_tree_add_item(LinkRecord_header_tree, hf_opa_LinkRecord_ToPort, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(LinkRecord_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(LinkRecord_header_tree, hf_opa_LinkRecord_ToLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); local_offset += 4; + + return local_offset; + +} + +/* Parse ServiceRecord Attribute*/ +static gint parse_ServiceRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *ServiceRecord_header_item; + proto_tree *ServiceRecord_header_tree; + proto_item *tempData; + + if (!parentTree) { + return *offset; + } + + ServiceRecord_header_item = proto_tree_add_item(parentTree, hf_opa_ServiceRecord, tvb, local_offset, 152, ENC_NA); + ServiceRecord_header_tree = proto_item_add_subtree(ServiceRecord_header_item, ett_servicerecord); + + proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceLease, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ServiceRecord_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceKey, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + + tempData = proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceData, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_item_append_text(tempData, "(ServiceData 8.1, 8.16)"); + tempData = proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceData, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_item_append_text(tempData, "(ServiceData 16.1, 16.8)"); + tempData = proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceData, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_item_append_text(tempData, "(ServiceData 32.1, 32.4)"); + tempData = proto_tree_add_item(ServiceRecord_header_tree, hf_opa_ServiceRecord_ServiceData, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_item_append_text(tempData, "(ServiceData 64.1, 64.2)"); + + return local_offset; + +} + +/* Parse PathRecord Attribute*/ +static gint parse_PathRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item * PathRecord_header_item, + *PathRecord_DGID_item, + *PathRecord_SGID_item; + proto_tree * PathRecord_header_tree, + *PathRecord_DGID_tree, + *PathRecord_SGID_tree; + + if (!parentTree) { + return *offset; + } + + PathRecord_header_item = proto_tree_add_item(parentTree, hf_opa_PathRecord, tvb, local_offset, 64, ENC_NA); + PathRecord_header_tree = proto_item_add_subtree(PathRecord_header_item, ett_pathrecord); + + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_ServiceID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + PathRecord_DGID_item = proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_DGID, tvb, local_offset, 16, ENC_NA); + PathRecord_DGID_tree = proto_item_add_subtree(PathRecord_DGID_item, ett_pathrecord_dgid); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_L2_8B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_L2_10B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_L2_9B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_L2_16B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_L2_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_LIDLen, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_SL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_DLIDHigh, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_SLIDHigh, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_DGID_tree, hf_opa_PathRecord_DGID_DestGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + PathRecord_SGID_item = proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_SGID, tvb, local_offset, 16, ENC_NA); + PathRecord_SGID_tree = proto_item_add_subtree(PathRecord_SGID_item, ett_pathrecord_sgid); + proto_tree_add_item(PathRecord_SGID_tree, hf_opa_PathRecord_SGID_SubnetPrefix, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PathRecord_SGID_tree, hf_opa_PathRecord_SGID_SourceGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_DLID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_SLID, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_RawTraffic, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_FlowLabel, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_HopLimit, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_Reversible, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_NumbPath, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_QosType, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_reserved2, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_QosPriority, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_SL, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_MTUSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_MTU, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_RateSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_Rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_PacketLifeTimeSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_PacketLifeTime, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PathRecord_header_tree, hf_opa_PathRecord_Preference, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PathRecord_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PathRecord_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + return local_offset; +} + +/* Parse MCMemberRecord Attribute*/ +static gint parse_MCMemberRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *MCMemberRecord_header_item; + proto_tree *MCMemberRecord_header_tree; + + if (!parentTree) { + return *offset; + } + + MCMemberRecord_header_item = proto_tree_add_item(parentTree, hf_opa_MCMemberRecord, tvb, local_offset, 24, ENC_NA); + MCMemberRecord_header_tree = proto_item_add_subtree(MCMemberRecord_header_item, ett_mcmemberrecord); + + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_Q_Key, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_MTUSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_MTU, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_RateSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_Rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_PacketLifeTimeSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_PacketLifeTime, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_SL, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_HopLimit, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_Scope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_JoinSendOnlyMember, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_JoinNonMember, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_JoinFullMember, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_ProxyJoin, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_reserved3, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MCMemberRecord_header_tree, hf_opa_MCMemberRecord_MLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + return local_offset; + +} + +/* Parse TraceRecord Attribute*/ +static gint parse_TraceRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *TraceRecord_header_item; + proto_tree *TraceRecord_header_tree; + + if (!parentTree) { + return *offset; + } + + TraceRecord_header_item = proto_tree_add_item(parentTree, hf_opa_TraceRecord, tvb, local_offset, 40, ENC_NA); + TraceRecord_header_tree = proto_item_add_subtree(TraceRecord_header_item, ett_tracerecord); + + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_IDGeneration, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_NodeType, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_EntryPort, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_ExitPort, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_NodeID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_ChassisID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_EntryPortID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(TraceRecord_header_tree, hf_opa_TraceRecord_ExitPortID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + return local_offset; +} + +/* Parse MultiPathRecord Attribute*/ +static gint parse_MultiPathRecord_GID(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *MultiPathRecord_header_item; + proto_tree *MultiPathRecord_header_tree; + proto_item *SDGID; + guint8 SGIDCount; + guint8 DGIDCount; + guint32 i; + + if (!parentTree) + return *offset; + + SGIDCount = tvb_get_guint8(tvb, local_offset + 14); + DGIDCount = tvb_get_guint8(tvb, local_offset + 15); + MultiPathRecord_header_item = proto_tree_add_item(parentTree, hf_opa_MultiPathRecord, tvb, local_offset, 32 + (SGIDCount + DGIDCount) * 16, ENC_NA); + proto_item_append_text(MultiPathRecord_header_item, " (GID)"); + MultiPathRecord_header_tree = proto_item_add_subtree(MultiPathRecord_header_item, ett_multipathrecord_gid); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_FlowLabel, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_HopLimit, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_Reversible, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_NumbPath, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_QoSType, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_QoSPriority, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved2, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SL, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_MTUSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_MTU, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_RateSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_Rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_PacketLifeTimeSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_PacketLifeTime, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_IndependenceSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGIDScope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGIDScope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGIDCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGIDCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_sa_ServiceID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_8B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_10B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_9B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_16B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved3, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + for (i = 0; i < SGIDCount; i++) { + SDGID = proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_item_prepend_text(SDGID, "%u: ", i); + } + for (i = 0; i < DGIDCount; i++) { + SDGID = proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_item_prepend_text(SDGID, "%u: ", i); + } + + return local_offset; +} + +/* Parse MultiPathRecord Attribute*/ +static gint parse_MultiPathRecord_GUID(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *MultiPathRecord_header_item; + proto_tree *MultiPathRecord_header_tree; + proto_item *SDGUID; + guint16 SGUIDCount; + guint16 DGUIDCount; + guint32 i; + + if (!parentTree) + return *offset; + + SGUIDCount = tvb_get_ntohs(tvb, local_offset + 14); + DGUIDCount = tvb_get_ntohs(tvb, local_offset + 16); + MultiPathRecord_header_item = proto_tree_add_item(parentTree, hf_opa_MultiPathRecord, tvb, local_offset, 40 + (SGUIDCount + DGUIDCount) * 8, ENC_NA); + proto_item_append_text(MultiPathRecord_header_item, " (GUID)"); + MultiPathRecord_header_tree = proto_item_add_subtree(MultiPathRecord_header_item, ett_multipathrecord_guid); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_FlowLabel, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_HopLimit, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_Reversible, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_NumbPath, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_QoSType, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_QoSPriority, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved2, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SL, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_MTUSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_MTU, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_RateSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_Rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_PacketLifeTimeSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_PacketLifeTime, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_IndependenceSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGUIDScope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGUIDScope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGUIDCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGUIDCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_8B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_10B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_9B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_16B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved3, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_ServiceID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SubnetPrefix, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + for (i = 0; i < SGUIDCount; i++) { + SDGUID = proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGUID, tvb, local_offset, 8, ENC_NA); + local_offset += 8; + proto_item_prepend_text(SDGUID, "%u: ", i); + } + for (i = 0; i < DGUIDCount; i++) { + SDGUID = proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGUID, tvb, local_offset, 8, ENC_NA); + local_offset += 8; + proto_item_prepend_text(SDGUID, "%u: ", i); + } + return local_offset; +} + +/* Parse MultiPathRecord Attribute*/ +static gint parse_MultiPathRecord_lid(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *MultiPathRecord_header_item; + proto_tree *MultiPathRecord_header_tree; + proto_item *SDLID; + guint16 SLIDCount; + guint16 DLIDCount; + guint32 i; + + if (!parentTree) + return *offset; + + SLIDCount = tvb_get_ntohs(tvb, local_offset + 14); + DLIDCount = tvb_get_ntohs(tvb, local_offset + 16); + MultiPathRecord_header_item = proto_tree_add_item(parentTree, hf_opa_MultiPathRecord, tvb, local_offset, 40 + (SLIDCount + DLIDCount) * 4, ENC_NA); + MultiPathRecord_header_tree = proto_item_add_subtree(MultiPathRecord_header_item, ett_multipathrecord_lid); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_FlowLabel, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_HopLimit, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_TClass, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_Reversible, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_NumbPath, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_QoSType, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_QoSPriority, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved2, tvb, local_offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SL, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_MTUSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_MTU, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_RateSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_Rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_PacketLifeTimeSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_PacketLifeTime, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_IndependenceSelector, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SGUIDScope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DGUIDScope, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SLIDCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DLIDCount, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_8B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_10B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_9B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_L2_16B, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_reserved3, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_ServiceID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SubnetPrefix, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + for (i = 0; i < SLIDCount; i++) { + SDLID = proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_SLID, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_item_prepend_text(SDLID, "%u: ", i); + } + for (i = 0; i < DLIDCount; i++) { + SDLID = proto_tree_add_item(MultiPathRecord_header_tree, hf_opa_MultiPathRecord_DLID, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_item_prepend_text(SDLID, "%u: ", i); + } + return local_offset; +} + +/* Parse CableInfoRecord Attribute*/ +static gint parse_CableInfoRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *CableInfoRecord_header_item; + proto_tree *CableInfoRecord_header_tree; + + if (!parentTree) + return *offset; + + CableInfoRecord_header_item = proto_tree_add_item(parentTree, hf_opa_CableInfoRecord, tvb, local_offset, 72, ENC_NA); + CableInfoRecord_header_tree = proto_item_add_subtree(CableInfoRecord_header_item, ett_cableinforecord); + + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_Lid, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_Port, tvb, local_offset, 1, ENC_NA); + local_offset += 1; + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_Length, tvb, local_offset, 1, ENC_NA); + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_reserved, tvb, local_offset, 1, ENC_NA); + local_offset += 1; + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_Address, tvb, local_offset, 2, ENC_NA); + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_PortType, tvb, local_offset, 2, ENC_NA); + local_offset += 2; + proto_tree_add_item(CableInfoRecord_header_tree, hf_opa_CableInfoRecord_Data, tvb, local_offset, 64, ENC_NA); + local_offset += 64; + + return local_offset; +} + +/* Parse ServiceAssociationRecord Attribute*/ +static gint parse_ServiceAssociationRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + /* proto_item *ServiceAssociationRecord_header_item; */ + proto_tree *ServiceAssociationRecord_header_tree; + + if (!parentTree) { + return *offset; + } + + /* ServiceAssociationRecord_header_item = proto_tree_add_item(parentTree, hf_opa_sapa, tvb, local_offset, 80, ENC_NA); */ + /* proto_item_set_text(ServiceAssociationRecord_header_item, "%s", "ServiceAssociationRecord"); */ + ServiceAssociationRecord_header_tree = parentTree; /* proto_item_add_subtree(ServiceAssociationRecord_header_item, ett_serviceassocrecord); */ + + proto_tree_add_item(ServiceAssociationRecord_header_tree, hf_opa_ServiceAssociationRecord_ServiceKey, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(ServiceAssociationRecord_header_tree, hf_opa_ServiceAssociationRecord_ServiceName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + + return local_offset; +} + +static gint parse_VFInfoRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + gint local_offset = *offset; + proto_item *VFInfoRecord_header_item; + proto_tree *VFInfoRecord_header_tree; + + if (!parentTree) + return *offset; + + VFInfoRecord_header_item = proto_tree_add_item(parentTree, hf_opa_VFInfoRecord, tvb, local_offset, 128, ENC_NA); + VFInfoRecord_header_tree = proto_item_add_subtree(VFInfoRecord_header_item, ett_vfinforecord); + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_vfIndex, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_pKey, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_sa_ServiceID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_MGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_SelectFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_SL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_MTUSpecified, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_MTU, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_RateSpecified, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_reserved4, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_Rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_PktLifeSpecified, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_reserved5, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_PktLifeTimeInc, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_OptionFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_BandwidthPercent, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_reserved6, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_Priority, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_RoutingSLs, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(VFInfoRecord_header_tree, hf_opa_VFInfoRecord_reserved7, tvb, local_offset, 24, ENC_NA); + local_offset += 24; + + return local_offset; +} +static gint parse_QuarantinedNodeRecord(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + proto_item *QuarantinedNodeRecord_header_item; + proto_tree *QuarantinedNodeRecord_header_tree; + + if (!parentTree || MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) + return *offset; + + QuarantinedNodeRecord_header_item = proto_tree_add_item(parentTree, hf_opa_QuarantinedNodeRecord, tvb, local_offset, 213, ENC_NA); + QuarantinedNodeRecord_header_tree = proto_item_add_subtree(QuarantinedNodeRecord_header_item, ett_quarantinednoderecord); + + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_TrustedLid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_TrustedPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_TrustedNodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_TrustedNeighborNodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + local_offset = parse_NodeDescription(QuarantinedNodeRecord_header_tree, tvb, &local_offset, MAD); + local_offset = parse_NodeInfo(QuarantinedNodeRecord_header_tree, tvb, &local_offset, MAD); + + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_QuarantineReasons, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_ExpectedNodeDesc, tvb, local_offset, 64, ENC_BIG_ENDIAN); + local_offset += 64; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_ExpectedNodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(QuarantinedNodeRecord_header_tree, hf_opa_QuarantinedNodeRecord_ExpectedPortGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + return local_offset; +} +/* Parse RID Field from Subnet Administration Packets. */ +static void parse_RID(proto_tree *SA_header_tree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + + if (!SA_header_tree) + return; + + switch (MAD->AttributeID) { + case SA_ATTR_ID_CLASS_PORT_INFO: + break; + case SA_ATTR_ID_NOTICE: + break; + case SA_ATTR_ID_NODE_RECORD: /* NodeRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_PORTINFO_RECORD: /* PortInfoRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_EndportLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_PortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SA_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_SC_MAPTBL_RECORD: /* SCMappingTableRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_InputPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SA_header_tree, hf_opa_sa_OutputPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_SL2SC_MAPTBL_RECORD: + case SA_ATTR_ID_SC2SL_MAPTBL_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + break; + case SA_ATTR_ID_SC_VLNT_MAPTBL_RECORD: + case SA_ATTR_ID_SC_VLT_MAPTBL_RECORD: + case SA_ATTR_ID_SC_VLR_MAPTBL_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_Port, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_SWITCHINFO_RECORD: /* SwitchInfoRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_LINEAR_FWDTBL_RECORD: /* LinearForwardingTableRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_reserved14, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(SA_header_tree, hf_opa_sa_BlockNum_18b, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_MCAST_FWDTBL_RECORD: /* MulticastForwardingTableRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_Position, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(SA_header_tree, hf_opa_sa_reserved9, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(SA_header_tree, hf_opa_sa_BlockNum_21b, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_VLARBTABLE_RECORD: /*VLArbitrationTableRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_OutputPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(SA_header_tree, hf_opa_sa_BlockNum_8b, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_SMINFO_RECORD: /* SMInfoRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_P_KEY_TABLE_RECORD: /* P_KeyTableRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_BlockNum_16b, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SA_header_tree, hf_opa_sa_PortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_INFORM_INFO_RECORD: /* InformInfoRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_SubscriberLID, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_Enum, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + break; + case SA_ATTR_ID_LINK_RECORD: /* LinkRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_FromLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_FromPort, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_SERVICE_RECORD: /* ServiceRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_ServiceID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(SA_header_tree, hf_opa_sa_ServiceLID, tvb, local_offset, 4, ENC_NA); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_ServiceP_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SA_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(SA_header_tree, hf_opa_sa_ServiceGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + break; + case SA_ATTR_ID_PATH_RECORD: /* PathRecord */ + break; + case SA_ATTR_ID_MCMEMBER_RECORD: /* MCMemberRecord */ + proto_tree_add_item(SA_header_tree, hf_opa_sa_MGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + proto_tree_add_item(SA_header_tree, hf_opa_sa_PortGID, tvb, local_offset, 16, ENC_NA); + local_offset += 16; + break; + case SA_ATTR_ID_TRACE_RECORD: + break; + case SA_ATTR_ID_MULTIPATH_GID_RECORD: + break; + case SA_ATTR_ID_MULTIPATH_GUID_RECORD: + break; + case SA_ATTR_ID_MULTIPATH_LID_RECORD: + break; + case SA_ATTR_ID_CABLE_INFO_RECORD: + break; + case SA_ATTR_ID_VF_INFO_RECORD: + break; + case SA_ATTR_ID_QUARANTINED_NODE_RECORD: + break; + case SA_ATTR_ID_CONGESTION_INFO_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_SWITCH_CONG_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_SWITCH_PORT_CONG_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_Port, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_HFI_CONG_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case SA_ATTR_ID_HFI_CONG_CTRL_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_BlockNum_16b, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + break; + case SA_ATTR_ID_BUFF_CTRL_TAB_RECORD: + proto_tree_add_item(SA_header_tree, hf_opa_sa_Lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(SA_header_tree, hf_opa_sa_Port, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case SA_ATTR_ID_FABRICINFO_RECORD: + break; + default: + break; + } + *offset = local_offset; +} +/* Parse the attribute from a Subnet Administration Packet. */ +static gboolean parse_SUBA_Attribute(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, SA_HEADER_t *SA_HEADER) +{ + proto_tree *SUBA_Attribute_header_tree = parentTree; + guint local_offset = *offset; + + if (RMPP->Type == RMPP_ACK || SA_HEADER->AttributeOffset == 0) + return TRUE; + + /* Skim off the RID fields should they be present */ + parse_RID(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + + /* Parse the rest of the attributes */ + switch (MAD->AttributeID) { + case SA_ATTR_ID_CLASS_PORT_INFO: /* (ClassPortInfo) */ + local_offset = parse_ClassPortInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_NOTICE: /* (Notice) */ + local_offset = parse_NoticesAndTraps(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_INFORM_INFO: /* (InformInfo) */ + local_offset = parse_InformInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_NODE_RECORD: /* (NodeRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + local_offset = parse_NodeInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + local_offset = parse_NodeDescription(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_PORTINFO_RECORD: /* (PortInfoRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + local_offset = parse_PortInfoRecord(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SL2SC_MAPTBL_RECORD: + local_offset = parse_SLtoSCMappingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SC_MAPTBL_RECORD: + local_offset = parse_SCMappingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SC2SL_MAPTBL_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + local_offset = parse_SCtoSLMappingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SC_VLNT_MAPTBL_RECORD: + case SA_ATTR_ID_SC_VLT_MAPTBL_RECORD: + case SA_ATTR_ID_SC_VLR_MAPTBL_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + local_offset = parse_SCtoVLxMappingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SWITCHINFO_RECORD: /* (SwitchInfoRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + local_offset = parse_SwitchInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_LINEAR_FWDTBL_RECORD: /*(LinearForwardingTableRecord) */ + local_offset = parse_LinearForwardingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_MCAST_FWDTBL_RECORD: /* (MulticastForwardingTableRecord) */ + local_offset = parse_MulticastForwardingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_VLARBTABLE_RECORD: /* (VLArbitrationTableRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + local_offset = parse_VLArbitrationTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SMINFO_RECORD: /* (SMInfoRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + local_offset = parse_SMInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_P_KEY_TABLE_RECORD: /* (P_KeyTableRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + local_offset = parse_P_KeyTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_INFORM_INFO_RECORD: /*(InformInfoRecord) */ + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + local_offset = parse_InformInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_LINK_RECORD: /* (LinkRecord) */ + local_offset = parse_LinkRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_SERVICE_RECORD: /*(ServiceRecord) */ + local_offset = parse_ServiceRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_PATH_RECORD: /* (PathRecord) */ + local_offset = parse_PathRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_MCMEMBER_RECORD: /* (MCMemberRecord) */ + local_offset = parse_MCMemberRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_TRACE_RECORD: /* (TraceRecord) */ + local_offset = parse_TraceRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_MULTIPATH_GID_RECORD: /* (MultiPathRecord) */ + local_offset = parse_MultiPathRecord_GID(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_MULTIPATH_GUID_RECORD: + local_offset = parse_MultiPathRecord_GUID(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_MULTIPATH_LID_RECORD: + local_offset = parse_MultiPathRecord_lid(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_SERVICEASSOCIATION_RECORD: /* (ServiceAssociationRecord) */ + local_offset = parse_ServiceAssociationRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_PGROUP_FWDTBL_RECORD: + local_offset = parse_PortGroupForwardingTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_CABLE_INFO_RECORD: /* (CableInfoRecord) */ + local_offset = parse_CableInfoRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_VF_INFO_RECORD: + local_offset = parse_VFInfoRecord(SUBA_Attribute_header_tree, tvb, &local_offset); + break; + case SA_ATTR_ID_QUARANTINED_NODE_RECORD: + local_offset = parse_QuarantinedNodeRecord(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_CONGESTION_INFO_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + local_offset = parse_CongestionInfo(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SWITCH_CONG_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + local_offset = parse_SwitchCongestionSetting(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_SWITCH_PORT_CONG_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + local_offset = parse_SwitchPortCongestionSetting(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_HFI_CONG_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + local_offset = parse_HFICongestionSetting(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_HFI_CONG_CTRL_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + local_offset = parse_HFICongestionControlTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_BUFF_CTRL_TAB_RECORD: + proto_tree_add_item(SUBA_Attribute_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + local_offset = parse_BufferControlTable(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + case SA_ATTR_ID_FABRICINFO_RECORD: + local_offset = parse_FabricInfoRecord(SUBA_Attribute_header_tree, tvb, &local_offset, MAD); + break; + default: /* (Unknown SubAdministration Attribute!) */ + /* We've already labeled as unknown in item construction */ + break; + } + + *offset = local_offset; + return TRUE; +} +/* Parse the SA Method from the MAD Common Header. */ +static void label_SUBA_Method(proto_item *SubAItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->Method, SUBA_Methods, "(Unknown SA Method!)"); + proto_item_append_text(SubAItem, " %s", label); + col_append_str(pinfo->cinfo, COL_INFO, label); +} +/* Parse the SA Attribute from the MAD Common Header */ +static void label_SUBA_Attribute(proto_item *SubAItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->AttributeID, SUBA_Attributes, "Attribute (Unknown SA Attribute!)"); + proto_item_append_text(SubAItem, "%s", &label[11]); + col_append_str(pinfo->cinfo, COL_INFO, &label[11]); +} +/* Parse the SA_HEADER +* IN: parentTree to add the dissection to +* IN: tvb - the data buffer from wireshark +* IN/OUT: The current and updated offset */ +static gboolean parse_SA_HEADER(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset, MAD_t *MAD, SA_HEADER_t *SA_HEADER) +{ + gint local_offset = *offset; + proto_item *SA_HEADER_header_item; + proto_tree *SA_HEADER_header_tree; + + SA_HEADER_header_item = proto_tree_add_item(parentTree, hf_opa_sa, tvb, local_offset, 20, ENC_NA); + SA_HEADER_header_tree = proto_item_add_subtree(SA_HEADER_header_item, ett_sa); + + SA_HEADER->SM_Key = tvb_get_ntoh64(tvb, local_offset); + proto_tree_add_item(SA_HEADER_header_tree, hf_opa_sa_sm_key, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + SA_HEADER->AttributeOffset = tvb_get_ntohs(tvb, local_offset); + proto_tree_add_item(SA_HEADER_header_tree, hf_opa_sa_attribute_offset, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + SA_HEADER->Reserved = tvb_get_ntohs(tvb, local_offset); + proto_tree_add_item(SA_HEADER_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + SA_HEADER->ComponentMask = tvb_get_ntoh64(tvb, local_offset); + proto_tree_add_item(SA_HEADER_header_tree, hf_opa_sa_component_mask, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + label_SUBA_Method(SA_HEADER_header_item, MAD, pinfo); + label_SUBA_Attribute(SA_HEADER_header_item, MAD, pinfo); + + *offset = local_offset; + return TRUE; +} +/* Parse Subnet Administration */ +static void parse_SUBNADMN(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + RMPP_t RMPP; + SA_HEADER_t SA_HEADER; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + if (!parse_RMPP(parentTree, pinfo, tvb, offset, &RMPP)) { + return; + } + if (!parse_SA_HEADER(parentTree, pinfo, tvb, offset, &MAD, &SA_HEADER)) { + return; + } + if ((!pref_parse_on_mad_status_error && MAD.Status) || + RMPP.Type == RMPP_ACK || SA_HEADER.AttributeOffset == 0 || + (RMPP.Type == RMPP_DATA && RMPP.SegmentNumber != 1)) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + if (!parse_SUBA_Attribute(parentTree, tvb, offset, &MAD, &RMPP, &SA_HEADER)) { + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } +} + +/* Parse PortStatus MAD from the Performance management class. */ +static gint parse_PortStatus(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_item *PortStatus_header_item; + proto_tree *PortStatus_header_tree; + proto_tree *PortStatus_VL_tree; + gint local_offset = *offset; + guint32 VLSelectMask; + guint i, VLs; + guint32 vlSelMskTmp; + + if (!parentTree) + return *offset; + + VLSelectMask = tvb_get_ntohl(tvb, local_offset + 4); + for (i = 0, VLs = 0, vlSelMskTmp = VLSelectMask; vlSelMskTmp && i < 32 && vlSelMskTmp; i++, vlSelMskTmp >>= 1) { + VLs = VLs + (vlSelMskTmp & 0x1); + } + + if (MAD->Method == METHOD_GET) { /* Get() */ + PortStatus_header_item = proto_tree_add_item(parentTree, hf_opa_PortStatus, tvb, local_offset, 8, ENC_NA); + } else if (MAD->Method == METHOD_GET_RESP) { /* GetResp(): */ + PortStatus_header_item = proto_tree_add_item(parentTree, hf_opa_PortStatus, tvb, local_offset, 208 + VLs * 112, ENC_NA); + } else { + return *offset; + } + PortStatus_header_tree = proto_item_add_subtree(PortStatus_header_item, ett_portstatus); + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortStatus_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_VLSelectMask, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + if (MAD->Method == METHOD_GET) + return local_offset; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortMulticastXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortMulticastRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitWait, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_SwPortCongestion, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvBECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitTimeCong, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitWastedBW, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitWaitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvBubble, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortMarkFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvConstraintErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvSwitchRelayErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitDiscards, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortXmitConstraintErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvRemotePhysicalErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_LocalLinkIntegrityErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_PortRcvErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_ExcessiveBufferOverruns, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_FMConfigErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_LinkErrorRecovery, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_LinkDowned, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_UncorrectableErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortStatus_header_tree, hf_opa_PortStatus_LinkQualityIndicator, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(PortStatus_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortStatus_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + for (i = 0, vlSelMskTmp = VLSelectMask; vlSelMskTmp && i < 32; i++, vlSelMskTmp >>= 1) { + if (vlSelMskTmp & 0x1) { + PortStatus_VL_tree = proto_tree_add_subtree_format(PortStatus_header_tree, tvb, local_offset, 112, + ett_portstatus_vl, NULL, "VL %u", i); + + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLRcvData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitWait, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_SwPortVLCongestion, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLRcvFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLRcvBECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitTimeCong, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitWastedBW, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitWaitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLRcvBubble, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLMarkFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortStatus_VL_tree, hf_opa_PortStatus_PortVLXmitDiscards, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + } + } + return local_offset; +} + +/* Parse ClearPortStatus MAD from the Performance management class.*/ +static gint parse_ClearPortStatus(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_item *ClearPortStatus_header_item; + proto_tree *ClearPortStatus_header_tree; + proto_item *ClearPortStatus_PortSelectMask_item; + gint local_offset = *offset; + guint64 PortSelectMask[4]; + guint64 PortSelectMaskTemp; + guint i, j; + guint PortsOffset = 0; + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_SET || MAD->Method == METHOD_GET_RESP) { /* Only Set()/GetResp() is supported. */ + ClearPortStatus_header_item = proto_tree_add_item(parentTree, hf_opa_ClearPortStatus, tvb, local_offset, 36, ENC_NA); + } else + return *offset; + + ClearPortStatus_header_tree = proto_item_add_subtree(ClearPortStatus_header_item, ett_clearportstatus); + PortSelectMask[0] = tvb_get_ntoh64(tvb, local_offset); + PortSelectMask[1] = tvb_get_ntoh64(tvb, local_offset + 8); + PortSelectMask[2] = tvb_get_ntoh64(tvb, local_offset + 16); + PortSelectMask[3] = tvb_get_ntoh64(tvb, local_offset + 24); + + ClearPortStatus_PortSelectMask_item = proto_tree_add_item(ClearPortStatus_header_tree, hf_opa_ClearPortStatus_PortSelectMask, tvb, local_offset, 32, ENC_NA); + for (j = 0; j < 4; j++) { + for (i = 0, PortSelectMaskTemp = PortSelectMask[3 - j]; i < 64 && (PortSelectMaskTemp); i++, PortSelectMaskTemp >>= (guint64)1) { + if (PortSelectMaskTemp & (guint64)0x1) { + proto_item_append_text(ClearPortStatus_PortSelectMask_item, "%s%u", (PortsOffset ? ", " : " "), (i)+(j * 64)); + PortsOffset++; + } + } + } + local_offset += 32; + + proto_tree_add_bitmask(ClearPortStatus_header_tree, tvb, local_offset, + hf_opa_ClearPortStatus_CounterSelectMask, ett_clearportstatus_counterselectmask, + _ClearPortStatus_CounterSelectMask, ENC_BIG_ENDIAN); + local_offset += 4; + + return local_offset; +} + +/* Parse DataPortCounters MAD from the Performance management class.*/ +static gint parse_DataPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_item *DataPortCounters_header_item; + proto_item *DataPortCounters_PortSelectMask_item; + proto_tree *DataPortCounters_header_tree; + proto_tree *DataPortCounters_Port_tree; + proto_tree *DataPortCounters_VL_tree; + + gint local_offset = *offset; + guint32 VLSelectMask, vlSelMskTmp; + guint64 PortSelectMask[4]; + guint64 PortSelectMaskTemp; + guint VLs, i, j, p; + guint PortsOffset = 0; + guint Num_Ports = (MAD->AttributeModifier >> 24) & 0xFF; + + if (!parentTree) + return *offset; + + VLSelectMask = tvb_get_ntohl(tvb, local_offset + 32); + for (i = 0, VLs = 0, vlSelMskTmp = VLSelectMask; vlSelMskTmp && i < 32 && vlSelMskTmp; i++, vlSelMskTmp >>= 1) { + VLs += (vlSelMskTmp & 0x1); + } + + if (MAD->Method == METHOD_GET) { /* Get() */ + DataPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_DataPortCounters, tvb, local_offset, 40, ENC_NA); + } else if (MAD->Method == METHOD_GET_RESP) { /* GetResp(): */ + DataPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_DataPortCounters, tvb, local_offset, 40 + Num_Ports * (136 + VLs * 104), ENC_NA); + } else { /* Set() */ + return *offset; + } + DataPortCounters_header_tree = proto_item_add_subtree(DataPortCounters_header_item, ett_dataportcounters); + + PortSelectMask[0] = tvb_get_ntoh64(tvb, local_offset); + PortSelectMask[1] = tvb_get_ntoh64(tvb, local_offset + 8); + PortSelectMask[2] = tvb_get_ntoh64(tvb, local_offset + 16); + PortSelectMask[3] = tvb_get_ntoh64(tvb, local_offset + 24); + + DataPortCounters_PortSelectMask_item = proto_tree_add_item(DataPortCounters_header_tree, hf_opa_DataPortCounters_PortSelectMask, tvb, local_offset, 32, ENC_NA); + for (j = 0; j < 4; j++) { + for (i = 0, PortSelectMaskTemp = PortSelectMask[3 - j]; i < 64 && (PortSelectMaskTemp); i++, PortSelectMaskTemp >>= (guint64)1) { + if (PortSelectMaskTemp & (guint64)0x1) { + proto_item_append_text(DataPortCounters_PortSelectMask_item, "%s%u", (PortsOffset ? ", " : " "), (i)+(j * 64)); + PortsOffset++; + } + } + } + local_offset += 32; + + proto_tree_add_item(DataPortCounters_header_tree, hf_opa_DataPortCounters_VLSelectMask, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(DataPortCounters_header_tree, hf_opa_DataPortCounters_resolution_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(DataPortCounters_header_tree, hf_opa_DataPortCounters_LocalLinkIntegrityResolution, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(DataPortCounters_header_tree, hf_opa_DataPortCounters_LinkErrorRecoveryResolution, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + if (MAD->Method == METHOD_GET) + return local_offset; + + for (p = 0; p < Num_Ports; p++) { + DataPortCounters_Port_tree = proto_tree_add_subtree_format(DataPortCounters_header_tree, tvb, local_offset, (1 + 3 + 4 + (8 * 16) + VLs * (8 * 13)), + ett_dataportcounters_port, NULL, "Port %u", tvb_get_guint8(tvb, local_offset)); + + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_lqi_reserved, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_LinkQualityIndicator, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortXmitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortRcvData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortMulticastXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortMulticastRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortXmitWait, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_SwPortCongestion, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortRcvFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortRcvBECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortXmitTimeCong, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortXmitWastedBW, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortXmitWaitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortRcvBubble, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortMarkFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_Port_tree, hf_opa_DataPortCounters_PortErrorCounterSummary, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + for (i = 0, vlSelMskTmp = VLSelectMask; vlSelMskTmp && i < 32; i++, vlSelMskTmp >>= 1) { + if (vlSelMskTmp & 0x1) { + DataPortCounters_VL_tree = proto_tree_add_subtree_format(DataPortCounters_Port_tree, tvb, local_offset, 8 * 13, + ett_dataportcounters_vl, NULL, "VL %u", i); + + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLXmitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLRcvData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLXmitWait, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_SwPortVLCongestion, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLRcvFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLRcvBECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLXmitTimeCong, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLXmitWastedBW, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLXmitWaitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLRcvBubble, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(DataPortCounters_VL_tree, hf_opa_DataPortCounters_PortVLMarkFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + } + } + } + return local_offset; +} + +/* Parse ErrorPortCounters MAD from the Performance management class.*/ +static gint parse_ErrorPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_item *ErrorPortCounters_header_item; + proto_item *ErrorPortCounters_PortSelectMask_item; + proto_item *ErrorPortCounters_VL_item; + proto_tree *ErrorPortCounters_header_tree; + proto_tree *ErrorPortCounters_Port_tree; + + gint local_offset = *offset; + guint32 VLSelectMask, vlSelMskTmp; + guint64 PortSelectMask[4]; + guint64 PortSelectMaskTemp; + guint VLs, i, j, p; + guint PortsOffset = 0; + guint Num_Ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + + if (!parentTree) + return *offset; + + VLSelectMask = tvb_get_ntohl(tvb, local_offset + 32); + for (i = 0, VLs = 0, vlSelMskTmp = VLSelectMask; vlSelMskTmp && i < 32; i++, vlSelMskTmp >>= 1) { + VLs += (vlSelMskTmp & 0x1); + } + + if (MAD->Method == METHOD_GET) { /* Get() */ + ErrorPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_ErrorPortCounters, tvb, local_offset, 40, ENC_NA); + } else if (MAD->Method == METHOD_GET_RESP) { /* GetResp(): */ + ErrorPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_ErrorPortCounters, tvb, local_offset, 40 + Num_Ports * (96 + VLs * 8), ENC_NA); + } else { /* Set() */ + return *offset; + } + ErrorPortCounters_header_tree = proto_item_add_subtree(ErrorPortCounters_header_item, ett_errorportcounters); + + PortSelectMask[0] = tvb_get_ntoh64(tvb, local_offset); + PortSelectMask[1] = tvb_get_ntoh64(tvb, local_offset + 8); + PortSelectMask[2] = tvb_get_ntoh64(tvb, local_offset + 16); + PortSelectMask[3] = tvb_get_ntoh64(tvb, local_offset + 24); + ErrorPortCounters_PortSelectMask_item = proto_tree_add_item(ErrorPortCounters_header_tree, hf_opa_ErrorPortCounters_PortSelectMask, tvb, local_offset, 32, ENC_NA); + for (j = 0; j < 4; j++) { + for (i = 0, PortSelectMaskTemp = PortSelectMask[3 - j]; i < 64 && (PortSelectMaskTemp); i++, PortSelectMaskTemp >>= (guint64)1) { + if (PortSelectMaskTemp & (guint64)0x1) { + proto_item_append_text(ErrorPortCounters_PortSelectMask_item, "%s%u", (PortsOffset ? ", " : " "), (i)+(j * 64)); + PortsOffset++; + } + } + } + local_offset += 32; + + proto_tree_add_item(ErrorPortCounters_header_tree, hf_opa_ErrorPortCounters_VLSelectMask, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(ErrorPortCounters_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + if (MAD->Method == METHOD_GET) + return local_offset; + + for (p = 0; p < Num_Ports; p++) { + ErrorPortCounters_Port_tree = proto_tree_add_subtree_format(ErrorPortCounters_header_tree, tvb, local_offset, (96 + VLs * 8), + ett_errorportcounters_port, NULL, "Port %u", tvb_get_guint8(tvb, local_offset)); + + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortRcvConstraintErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortRcvSwitchRelayErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortXmitDiscards, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortXmitConstraintErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortRcvRemotePhysicalErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_LocalLinkIntegrityErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortRcvErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_ExcessiveBufferOverruns, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_FMConfigErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_LinkErrorRecovery, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_LinkDowned, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_UncorrectableErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + for (i = 0, vlSelMskTmp = VLSelectMask; vlSelMskTmp && i < 32; i++, vlSelMskTmp >>= 1) { + if (vlSelMskTmp & 0x1) { + ErrorPortCounters_VL_item = proto_tree_add_item(ErrorPortCounters_Port_tree, hf_opa_ErrorPortCounters_PortVLXmitDiscards, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_item_prepend_text(ErrorPortCounters_VL_item, "%3u: ", i); + } + } + } + return local_offset; +} + +/* Parse ErrorPortInfo MAD from the Performance management class.*/ +static gint parse_ErrorPortInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_item *ErrorPortInfo_header_item; + proto_item *ErrorPortInfo_PortSelectMask_item; + + proto_tree *ErrorPortInfo_header_tree; + proto_tree *ErrorPortInfo_Port_tree; + proto_tree * PortRcvErrorInfo_tree, + *ExcessiveBufferOverrunInfo_tree, + *PortXmitConstraintErrorInfo_tree, + *PortRcvConstraintErrorInfo_tree, + *PortRcvSwitchRelayErrorInfo_tree, + *UncorrectableErrorInfo_tree, + *FMConfigErrorInfo_tree; + + gint local_offset = *offset; + guint64 PortSelectMask[4]; + guint64 PortSelectMaskTemp; + guint i, j, p, ErrorCode; + guint PortsOffset = 0; + guint Num_Ports = (MAD->AttributeModifier & 0xFF000000) >> 24; + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_GET_RESP) { + ErrorPortInfo_header_item = proto_tree_add_item(parentTree, hf_opa_ErrorPortInfo, tvb, local_offset, -1, ENC_NA); + } else if (MAD->Method == METHOD_SET) { + ErrorPortInfo_header_item = proto_tree_add_item(parentTree, hf_opa_ErrorPortInfo, tvb, local_offset, 40, ENC_NA); + } else { /* GET */ + ErrorPortInfo_header_item = proto_tree_add_item(parentTree, hf_opa_ErrorPortInfo, tvb, local_offset, 32, ENC_NA); + } + ErrorPortInfo_header_tree = proto_item_add_subtree(ErrorPortInfo_header_item, ett_errorportinfo); + + PortSelectMask[0] = tvb_get_ntoh64(tvb, local_offset); + PortSelectMask[1] = tvb_get_ntoh64(tvb, local_offset + 8); + PortSelectMask[2] = tvb_get_ntoh64(tvb, local_offset + 16); + PortSelectMask[3] = tvb_get_ntoh64(tvb, local_offset + 24); + ErrorPortInfo_PortSelectMask_item = proto_tree_add_item(ErrorPortInfo_header_tree, hf_opa_ErrorPortInfo_PortSelectMask, tvb, local_offset, 32, ENC_NA); + for (j = 0; j < 4; j++) { + for (i = 0, PortSelectMaskTemp = PortSelectMask[3 - j]; i < 64 && (PortSelectMaskTemp); i++, PortSelectMaskTemp >>= (guint64)1) { + if (PortSelectMaskTemp & (guint64)0x1) { + proto_item_append_text(ErrorPortInfo_PortSelectMask_item, "%s%u", (PortsOffset ? ", " : " "), (i)+(j * 64)); + PortsOffset++; + } + } + } + local_offset += 32; + + if (MAD->Method == METHOD_GET) + return local_offset; + /* ErrorInfoSelectMask */ + proto_tree_add_bitmask_list(ErrorPortInfo_header_tree, tvb, local_offset, 4, _ErrorPortInfo_ErrorInfoSelectMask, ENC_BIG_ENDIAN); + local_offset += 4; + + if (MAD->Method == METHOD_SET + /* GetResp packet from a Set operation will contain 1 zeroed port struct */ + || (MAD->Method == METHOD_GET_RESP && Num_Ports > 1 + && tvb_reported_length_remaining(tvb, local_offset) < (72 * 2))) + return local_offset; + + proto_tree_add_item(ErrorPortInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + for (p = 0; p < Num_Ports; p++) { + ErrorPortInfo_Port_tree = proto_tree_add_subtree_format(ErrorPortInfo_header_tree, tvb, local_offset, 72, + ett_errorportinfoport, NULL, "Port %u", tvb_get_guint8(tvb, local_offset)); + + proto_tree_add_item(ErrorPortInfo_Port_tree, hf_opa_ErrorPortInfo_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ErrorPortInfo_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ErrorPortInfo_Port_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* PortRcvErrorInfo */ + PortRcvErrorInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 24, + ett_errorportinfo_portrcverrorinfo, NULL, "PortRcv Error Info"); + + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_ErrorCode, tvb, local_offset, 1, ENC_BIG_ENDIAN); + ErrorCode = tvb_get_guint8(tvb, local_offset) & 0x0F; + local_offset += 1; + if (ErrorCode >= 1 && ErrorCode <= 12) { + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketFlit1, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketFlit2, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_Flit1Bits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_Flit2Bits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved2, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + } else if (ErrorCode == 13) { + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketBytes, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_FlitBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved3, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + } else { + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved4, tvb, local_offset, 17, ENC_NA); + local_offset += 17; + } + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortRcvErrorInfo_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* ExcessiveBufferOverrunErrorInfo */ + ExcessiveBufferOverrunInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 8, + ett_errorportinfo_excessivebufferoverruninfo, NULL, "ExcessiveBufferOverrun Error Info"); + + proto_tree_add_item(ExcessiveBufferOverrunInfo_tree, hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(ExcessiveBufferOverrunInfo_tree, hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_SC, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(ExcessiveBufferOverrunInfo_tree, hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ExcessiveBufferOverrunInfo_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ExcessiveBufferOverrunInfo_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* PortXmitConstraintErrorInfo */ + PortXmitConstraintErrorInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 8, + ett_errorportinfo_portxmitconstrainterrorinfo, NULL, "PortXmitConstraint Error Info"); + + proto_tree_add_item(PortXmitConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortXmitConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortXmitConstraintErrorInfo_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortXmitConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortXmitConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_SLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* PortRcvConstraintErrorInfo */ + PortRcvConstraintErrorInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 8, + ett_errorportinfo_portrcvconstrainterrorinfo, NULL, "PortRcvConstraint Error Info"); + + proto_tree_add_item(PortRcvConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortRcvConstraintErrorInfo_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortRcvConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_P_Key, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PortRcvConstraintErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_SLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* PortRcvSwitchRelayErrorInfo */ + PortRcvSwitchRelayErrorInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 8, + ett_errorportinfo_portrcvswitchrelayerrorinfo, NULL, "PortRcvSwitchRelay Error Info"); + + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_ErrorCode, tvb, local_offset, 1, ENC_BIG_ENDIAN); + ErrorCode = tvb_get_guint8(tvb, local_offset) & 0x0F; + local_offset += 1; + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + switch (ErrorCode) { + case 0: + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_DLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + case 2: + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_EgressPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + break; + case 3: + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_EgressPortNum, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_SC, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + break; + default: + proto_tree_add_item(PortRcvSwitchRelayErrorInfo_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + break; + } + + /* UncorrectableErrorInfo */ + UncorrectableErrorInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 2, + ett_errorportinfo_uncorrectableerrorinfo, NULL, "Uncorrectable Error Info"); + + proto_tree_add_item(UncorrectableErrorInfo_tree, hf_opa_ErrorPortInfo_UncorrectableErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(UncorrectableErrorInfo_tree, hf_opa_ErrorPortInfo_UncorrectableErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(UncorrectableErrorInfo_tree, hf_opa_ErrorPortInfo_UncorrectableErrorInfo_ErrorCode, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(UncorrectableErrorInfo_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + /* FMConfigErrorInfo */ + FMConfigErrorInfo_tree = proto_tree_add_subtree(ErrorPortInfo_Port_tree, tvb, local_offset, 6, + ett_errorportinfo_fmconfigerrorinfo, NULL, "FMConfig Error Info"); + + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_Status, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_ErrorCode, tvb, local_offset, 1, ENC_BIG_ENDIAN); + ErrorCode = tvb_get_guint8(tvb, local_offset) & 0x0F; + local_offset += 1; + switch (ErrorCode) { + case 0: + case 1: + case 2: + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_Distance, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case 3: + case 4: + case 5: + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_VL, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case 6: + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_BadFlitBits, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + case 7: + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_ErrorPortInfo_FMConfigErrorInfo_SC, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + default: + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + break; + } + + proto_tree_add_item(FMConfigErrorInfo_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } + return local_offset; +} +static gboolean parse_PM_Attribute(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + gint local_offset = *offset; + + switch (MAD->AttributeID) { + /* Mgmt */ + case PA_ATTR_ID_CLASS_PORTINFO: + local_offset = parse_ClassPortInfo(parentTree, tvb, &local_offset, MAD); + break; + case PM_ATTR_ID_PORT_STATUS: + local_offset = parse_PortStatus(parentTree, tvb, &local_offset, MAD); + break; + case PM_ATTR_ID_CLEAR_PORT_STATUS: + local_offset = parse_ClearPortStatus(parentTree, tvb, &local_offset, MAD); + break; + case PM_ATTR_ID_DATA_PORT_COUNTERS: + local_offset = parse_DataPortCounters(parentTree, tvb, &local_offset, MAD); + break; + case PM_ATTR_ID_ERROR_PORT_COUNTERS: + local_offset = parse_ErrorPortCounters(parentTree, tvb, &local_offset, MAD); + break; + case PM_ATTR_ID_ERROR_INFO: + local_offset = parse_ErrorPortInfo(parentTree, tvb, &local_offset, MAD); + break; + default: + return FALSE; + } + + *offset = local_offset; + return TRUE; +} + +/* Parse the Method from the MAD Common Header. */ +static void label_PM_Method(proto_item *PMItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->Method, PM_Methods, "(Unknown Perf Method!)"); + proto_item_append_text(PMItem, " %s", label); + col_append_str(pinfo->cinfo, COL_INFO, label); +} + +/* Parse the Attribute from the MAD Common Header */ +static void label_PM_Attribute(proto_item *PMItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->AttributeID, PM_Attributes, "Attribute (Unknown Perf Attribute!)"); + proto_item_append_text(PMItem, "%s", &label[11]); + col_append_str(pinfo->cinfo, COL_INFO, &label[11]); +} +/* Parse Performance Management */ +static void parse_PERF(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + proto_item *PM_header_item; + proto_tree *PM_header_tree; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + + PM_header_item = proto_tree_add_item(parentTree, hf_opa_pm, tvb, *offset, -1, ENC_NA); + PM_header_tree = proto_item_add_subtree(PM_header_item, ett_pm); + + label_PM_Method(PM_header_item, &MAD, pinfo); + label_PM_Attribute(PM_header_item, &MAD, pinfo); + + if (!pref_parse_on_mad_status_error && MAD.Status) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + if (!parse_PM_Attribute(PM_header_tree, tvb, offset, &MAD)) { + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } +} + +/* Parse Image MAD from the Performance Admin class. */ +static gint parse_Image(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + proto_tree *Image_header_tree = parentTree; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + /* ImageID */ + proto_tree_add_item(Image_header_tree, hf_opa_ImageID_imageNumber, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(Image_header_tree, hf_opa_ImageID_imageOffset, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(Image_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + /* End ImageID */ + + return local_offset; +} +/* Parse GetGroupList MAD from the Performance Admin class.*/ +static gint parse_GetGroupList(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_item *GetGroupList_GroupName_item; + proto_tree *GetGroupList_header_tree; + proto_item *GetGroupList_header_item; + gint local_offset = *offset; + guint i; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + if (!parentTree || RMPP->Type != RMPP_DATA || + (MAD->Method != METHOD_GET_RESP && MAD->Method != METHOD_GETTABLE_RESP)) { + return *offset; + } + GetGroupList_header_item = proto_tree_add_item(parentTree, hf_opa_GetGroupList, tvb, local_offset, length, ENC_NA); + GetGroupList_header_tree = proto_item_add_subtree(GetGroupList_header_item, ett_getgrouplist); + proto_tree_add_none_format(GetGroupList_header_tree, hf_opa_GetGroupList, tvb, local_offset, length, "Number of Groups: %u", records); + + for (i = 0; i < records; i++) { + GetGroupList_GroupName_item = proto_tree_add_item(GetGroupList_header_tree, hf_opa_GetGroupList_groupName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_item_prepend_text(GetGroupList_GroupName_item, "%3u: ", i + 1); + } + return local_offset; +} + +/* Parse GetGroupInfo MAD from the Performance Admin class.*/ +static gint parse_GetGroupInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_tree *GetGroupInfo_header_tree; + proto_tree *GetGroupInfo_header_item; + + proto_tree *GetGroupInfo_Util_Stats_tree; + proto_item *GetGroupInfo_Util_Stats_Buckets_item; + proto_tree *GetGroupInfo_Util_Stats_Buckets_tree; + proto_item *GetGroupInfo_Util_Stats_Bucket_item; + + proto_tree *GetGroupInfo_Error_Summary_tree; + proto_tree *GetGroupInfo_Error_Integrity_Buckets_tree; + proto_tree *GetGroupInfo_Error_Congestion_Buckets_tree; + proto_tree *GetGroupInfo_Error_SmaCongestion_Buckets_tree; + proto_tree *GetGroupInfo_Error_Bubble_Buckets_tree; + proto_tree *GetGroupInfo_Error_Security_Buckets_tree; + proto_tree *GetGroupInfo_Error_Routing_Buckets_tree; + proto_item *GetGroupInfo_Error_Stats_Integrity_Buckets_item; + proto_item *GetGroupInfo_Error_Stats_Congestion_Buckets_item; + proto_item *GetGroupInfo_Error_Stats_SmaCongestion_Buckets_item; + proto_item *GetGroupInfo_Error_Stats_Bubble_Buckets_item; + proto_item *GetGroupInfo_Error_Stats_Security_Buckets_item; + proto_item *GetGroupInfo_Error_Stats_Routing_Buckets_item; + proto_item *GetGroupInfo_Error_Stats_Bucket_item; + + gint local_offset = *offset; + guint i, r; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + guint util = 100 / PM_UTIL_BUCKETS; /* 0%+ 10%+ 20%+ ... 80%+ 90%+ */ + guint err = 100 / (PM_ERR_BUCKETS - 1); /* 0%+ 25%+ 50%+ 75%+ 100%+ */ + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) { + GetGroupInfo_header_item = proto_tree_add_item(parentTree, hf_opa_GetGroupInfo, tvb, local_offset, 64 + 16, ENC_NA); + proto_item_set_text(GetGroupInfo_header_item, "GroupInfo for %s", tvb_get_string_enc(wmem_file_scope(), tvb, local_offset, 64, ENC_ASCII)); + GetGroupInfo_header_tree = proto_item_add_subtree(GetGroupInfo_header_item, ett_getgroupinfo); + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_groupName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + /* ImageID */ + local_offset = parse_Image(GetGroupInfo_header_tree, tvb, &local_offset); + return local_offset; + } + + for (r = 0; r < records; r++) { + GetGroupInfo_header_item = proto_tree_add_item(parentTree, hf_opa_GetGroupInfo, tvb, local_offset, 64 + 16, ENC_NA); + proto_item_set_text(GetGroupInfo_header_item, "GroupInfo for %s", tvb_get_string_enc(wmem_file_scope(), tvb, local_offset, 64, ENC_ASCII)); + GetGroupInfo_header_tree = proto_item_add_subtree(GetGroupInfo_header_item, ett_getgroupinfo); + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_groupName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + + /* ImageID */ + local_offset = parse_Image(GetGroupInfo_header_tree, tvb, &local_offset); + + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_numInternalPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_numExternalPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* internalUtilStats */ + GetGroupInfo_Util_Stats_tree = proto_tree_add_subtree(GetGroupInfo_header_tree, tvb, local_offset, 48 + PM_UTIL_BUCKETS * 4, + ett_getgroupinfoutilstats, NULL, "Internal Utilization Statistics"); + + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_totalMBps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_totalKPps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_avgMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_minMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_maxMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Util_Stats_Buckets_item = proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_numBWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Util_Stats_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Util_Stats_Buckets_item, ett_getgroupinfoutilbuckets); + for (i = 0; i < PM_UTIL_BUCKETS; i++) { + GetGroupInfo_Util_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Util_Stats_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Util_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * util, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + } + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_avgKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_minKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_maxKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_pmaFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_topoFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* sendUtilStats */ + GetGroupInfo_Util_Stats_tree = proto_tree_add_subtree(GetGroupInfo_header_tree, tvb, local_offset, 48 + PM_UTIL_BUCKETS * 4, + ett_getgroupinfoutilstats, NULL, "External Send Utilization Statistics"); + + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_totalMBps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_totalKPps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_avgMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_minMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_maxMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Util_Stats_Buckets_item = proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_numBWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Util_Stats_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Util_Stats_Buckets_item, ett_getgroupinfoutilbuckets); + for (i = 0; i < PM_UTIL_BUCKETS; i++) { + GetGroupInfo_Util_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Util_Stats_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Util_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * util, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + } + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_avgKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_minKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_maxKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_pmaFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_topoFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* recvUtilStats */ + GetGroupInfo_Util_Stats_tree = proto_tree_add_subtree(GetGroupInfo_header_tree, tvb, local_offset, 48 + PM_UTIL_BUCKETS * 4, + ett_getgroupinfoutilstats, NULL, "External Receive Utilization Statistics"); + + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_totalMBps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_totalKPps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_avgMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_minMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_maxMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Util_Stats_Buckets_item = proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_numBWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Util_Stats_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Util_Stats_Buckets_item, ett_getgroupinfoutilbuckets); + for (i = 0; i < PM_UTIL_BUCKETS; i++) { + GetGroupInfo_Util_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Util_Stats_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Util_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * util, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + } + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_avgKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_minKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_maxKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_pmaFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Util_Stats_tree, hf_opa_GetGroupInfo_topoFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* internalErrors */ + GetGroupInfo_Error_Summary_tree = proto_tree_add_subtree(GetGroupInfo_header_tree, tvb, local_offset, 40 + PM_ERR_BUCKETS * 24, + ett_getgroupinfoerrorsummary, NULL, "Internal Error Statistics"); + + GetGroupInfo_Error_Stats_Integrity_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_integrityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Congestion_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_congestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_SmaCongestion_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_smaCongestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Bubble_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_bubbleErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Security_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_securityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Routing_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_routingErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_utlizationPct10, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_discardsPct10, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + GetGroupInfo_Error_Integrity_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Integrity_Buckets_item, ett_getgroupinfoerrintegritybucket); + GetGroupInfo_Error_Congestion_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Congestion_Buckets_item, ett_getgroupinfoerrcongestionbucket); + GetGroupInfo_Error_SmaCongestion_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_SmaCongestion_Buckets_item, ett_getgroupinfoerrsmacongestionbucket); + GetGroupInfo_Error_Bubble_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Bubble_Buckets_item, ett_getgroupinfoerrbubblebucket); + GetGroupInfo_Error_Security_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Security_Buckets_item, ett_getgroupinfoerrsecuritybucket); + GetGroupInfo_Error_Routing_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Routing_Buckets_item, ett_getgroupinfoerrroutingbucket); + + for (i = 0; i < PM_ERR_BUCKETS; i++) { + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Integrity_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Congestion_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_SmaCongestion_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Bubble_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Security_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Routing_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + } + + /* externalErrors */ + GetGroupInfo_Error_Summary_tree = proto_tree_add_subtree(GetGroupInfo_header_tree, tvb, local_offset, 40 + PM_ERR_BUCKETS * 24, + ett_getgroupinfoerrorsummary, NULL, "External Error Statistics"); + + GetGroupInfo_Error_Stats_Integrity_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_integrityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Congestion_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_congestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_SmaCongestion_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_smaCongestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Bubble_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_bubbleErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Security_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_securityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetGroupInfo_Error_Stats_Routing_Buckets_item = proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_routingErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_utlizationPct10, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_GetGroupInfo_discardsPct10, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_Error_Summary_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + GetGroupInfo_Error_Integrity_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Integrity_Buckets_item, ett_getgroupinfoerrintegritybucket); + GetGroupInfo_Error_Congestion_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Congestion_Buckets_item, ett_getgroupinfoerrcongestionbucket); + GetGroupInfo_Error_SmaCongestion_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_SmaCongestion_Buckets_item, ett_getgroupinfoerrsmacongestionbucket); + GetGroupInfo_Error_Bubble_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Bubble_Buckets_item, ett_getgroupinfoerrbubblebucket); + GetGroupInfo_Error_Security_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Security_Buckets_item, ett_getgroupinfoerrsecuritybucket); + GetGroupInfo_Error_Routing_Buckets_tree = proto_item_add_subtree(GetGroupInfo_Error_Stats_Routing_Buckets_item, ett_getgroupinfoerrroutingbucket); + + for (i = 0; i < PM_ERR_BUCKETS; i++) { + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Integrity_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Congestion_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_SmaCongestion_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Bubble_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Security_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetGroupInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetGroupInfo_Error_Routing_Buckets_tree, hf_opa_GetGroupInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetGroupInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + } + + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_maxInternalRate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_minInternalRate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_maxExternalRate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_minExternalRate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_maxInternalMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupInfo_header_tree, hf_opa_GetGroupInfo_maxExternalMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } + return local_offset; +} + +/* Parse GetGroupConfig MAD from the Performance Admin class.*/ +static gint parse_GetGroupConfig(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_item *GetGroupConfig_header_item; + proto_tree *GetGroupConfig_header_tree = parentTree; + + proto_item *GetGroupConfig_Port_item; + proto_tree *GetGroupConfig_Port_tree; + + gint local_offset = *offset; + guint i; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) { + GetGroupConfig_header_item = proto_tree_add_item(parentTree, hf_opa_GetGroupConfig, tvb, local_offset, 64 + 16, ENC_NA); + proto_item_set_text(GetGroupConfig_header_item, "GroupConfig for %s", tvb_get_string_enc(wmem_file_scope(), tvb, local_offset, 64, ENC_ASCII)); + GetGroupConfig_header_tree = proto_item_add_subtree(GetGroupConfig_header_item, ett_getgroupconfig); + + proto_tree_add_item(GetGroupConfig_header_tree, hf_opa_GetGroupConfig_groupName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + local_offset = parse_Image(GetGroupConfig_header_tree, tvb, &local_offset); + } else if (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP) { + GetGroupConfig_header_item = proto_tree_add_item(parentTree, hf_opa_GetGroupConfig, tvb, local_offset, records * PA_HEADER->AttributeOffset * 8, ENC_NA); + GetGroupConfig_header_tree = proto_item_add_subtree(GetGroupConfig_header_item, ett_getgroupconfig); + for (i = 0; i < records; i++) { + GetGroupConfig_Port_tree = proto_tree_add_subtree_format(GetGroupConfig_header_tree, tvb, local_offset, + PA_HEADER->AttributeOffset * 8, ett_getgroupconfigport, &GetGroupConfig_Port_item, "%3u: ", i); + local_offset = parse_Image(GetGroupConfig_Port_tree, tvb, &local_offset); + proto_tree_add_item(GetGroupConfig_Port_tree, hf_opa_GetGroupConfig_Port_NodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetGroupConfig_Port_tree, hf_opa_GetGroupConfig_Port_nodeDesc, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_item_append_text(GetGroupConfig_Port_item, "LID: 0x%04x, Port: %u", tvb_get_ntohl(tvb, local_offset), tvb_get_guint8(tvb, local_offset + 4)); + proto_tree_add_item(GetGroupConfig_Port_tree, hf_opa_GetGroupConfig_Port_NodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetGroupConfig_Port_tree, hf_opa_GetGroupConfig_Port_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetGroupConfig_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + } + } + + return local_offset; +} + +/* Parse GetPortCounters MAD from the Performance Admin class.*/ +static gint parse_GetPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_tree *GetPortCounters_header_tree; + proto_item *GetPortCounters_header_item; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + GetPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_GetPortCounters, tvb, local_offset, 232 + 16, ENC_NA); + proto_item_set_text(GetPortCounters_header_item, "Port Counters for LID: 0x%x Port: %u", tvb_get_ntohl(tvb, local_offset), tvb_get_guint8(tvb, local_offset + 4)); + GetPortCounters_header_tree = proto_item_add_subtree(GetPortCounters_header_item, ett_getportcounters); + + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_nodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_flags, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + /* ImageID */ + local_offset = parse_Image(GetPortCounters_header_tree, tvb, &local_offset); + if (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP) { + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortMulticastXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortMulticastRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_LocalLinkIntegrityErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_FMConfigErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_ExcessiveBufferOverruns, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvConstraintErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvSwitchRelayErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitDiscards, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitConstraintErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvRemotePhysicalErrors, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_SwPortCongestion, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitWait, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvBECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitTimeCong, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitWastedBW, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortXmitWaitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortRcvBubble, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_PortMarkFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_LinkErrorRecovery, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_LinkDowned, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_UncorrectableErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_NumLanesDown, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_reserved, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_GetPortCounters_LinkQualityIndicator, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetPortCounters_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } else { + local_offset += 208; + } + + return local_offset; +} + +static gint parse_ClearPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + proto_tree *ClearPortCounters_header_tree; + proto_item *ClearPortCounters_header_item; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + ClearPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_ClearPortCounters, tvb, local_offset, 20, ENC_NA); + proto_item_set_text(ClearPortCounters_header_item, "Clear User Port Counters for LID: 0x%x Port: %u", tvb_get_ntohl(tvb, local_offset), tvb_get_guint8(tvb, local_offset + 4)); + ClearPortCounters_header_tree = proto_item_add_subtree(ClearPortCounters_header_item, ett_clearportcounters); + + proto_tree_add_item(ClearPortCounters_header_tree, hf_opa_ClearPortCounters_nodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ClearPortCounters_header_tree, hf_opa_ClearPortCounters_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClearPortCounters_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ClearPortCounters_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_bitmask(ClearPortCounters_header_tree, tvb, local_offset, + hf_opa_ClearPortCounters_CounterSelectMask, ett_clearportcounters_counterselectmask, + _ClearPortCounters_CounterSelectMask, ENC_BIG_ENDIAN); + local_offset += 4; + + return local_offset; +} + +static gint parse_ClearAllPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + + proto_tree *ClearAllPortCounters_header_tree; + proto_item *ClearAllPortCounters_header_item; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + ClearAllPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_ClearAllPortCounters, tvb, local_offset, 4, ENC_NA); + proto_item_set_text(ClearAllPortCounters_header_item, "Clear All User Port Counters"); + ClearAllPortCounters_header_tree = proto_item_add_subtree(ClearAllPortCounters_header_item, ett_clearallportcounters); + + proto_tree_add_bitmask(ClearAllPortCounters_header_tree, tvb, local_offset, + hf_opa_ClearAllPortCounters_CounterSelectMask, ett_clearallportcounters_counterselectmask, + _ClearAllPortCounters_CounterSelectMask, ENC_BIG_ENDIAN); + local_offset += 4; + + return local_offset; +} + +static gint parse_PMConfig(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + proto_tree *PMConfig_header_tree; + proto_item *PMConfig_header_item; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + PMConfig_header_item = proto_tree_add_item(parentTree, hf_opa_PMConfig, tvb, local_offset, 104, ENC_NA); + PMConfig_header_tree = proto_item_add_subtree(PMConfig_header_item, ett_pmconfig); + + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_sweepInterval, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_maxClients, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_sizeHistory, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_sizeFreeze, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_lease, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_pmFlags, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_PortXmitWait, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_SwPortCongestion, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_PortRcvFECN, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_PortRcvBECN, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_PortXmitTimeCong, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_PortMarkFECN, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_integrityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_congestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_smaCongestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_bubbleErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_securityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_routingErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_LocalLinkIntegrityErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_PortRcvErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_ExcessiveBufferOverrunErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_LinkErrorRecovery, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_LinkDowned, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_UncorrectableErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_FMConfigErrors, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_LinkQualityIndicator, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_LinkWidthDowngrade, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_reserved8, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(PMConfig_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_memoryFootprint, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_maxAttempts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_respTimeout, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_minRespTimeout, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_maxParallelNodes, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_pmaBatchSize, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(PMConfig_header_tree, hf_opa_PMConfig_errorClear, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(PMConfig_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + + return local_offset; +} + +/* Parse MoveFreezeFrame MAD from the Performance Admin class. */ +static gint parse_MoveFreezeFrame(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + proto_tree *MoveFreezeFrame_header_tree = parentTree; + proto_item *MoveFreezeFrame_old_item; + proto_tree *MoveFreezeFrame_old_tree; + proto_item *MoveFreezeFrame_new_item; + proto_tree *MoveFreezeFrame_new_tree; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + MoveFreezeFrame_old_item = proto_tree_add_item(MoveFreezeFrame_header_tree, hf_opa_MoveFreezeFrame_old, tvb, local_offset, 16, ENC_NA); + MoveFreezeFrame_old_tree = proto_item_add_subtree(MoveFreezeFrame_old_item, ett_movefreezeframeold); + local_offset = parse_Image(MoveFreezeFrame_old_tree, tvb, &local_offset); + + MoveFreezeFrame_new_item = proto_tree_add_item(MoveFreezeFrame_header_tree, hf_opa_MoveFreezeFrame_new, tvb, local_offset, 16, ENC_NA); + MoveFreezeFrame_new_tree = proto_item_add_subtree(MoveFreezeFrame_new_item, ett_movefreezeframenew); + local_offset = parse_Image(MoveFreezeFrame_new_tree, tvb, &local_offset); + + return local_offset; +} + +/* Parse GetFocusPorts MAD from the Performance Admin class. */ +static gint parse_GetFocusPorts(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_tree *GetFocusPorts_header_tree; + proto_item *GetFocusPorts_header_item; + + proto_tree *GetFocusPorts_Port_tree; + proto_item *GetFocusPorts_Port_item; + + gint local_offset = *offset; + guint i = 0; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) { + GetFocusPorts_header_item = proto_tree_add_item(parentTree, hf_opa_GetFocusPorts, tvb, local_offset, 64 + 28, ENC_NA); + proto_item_set_text(GetFocusPorts_header_item, "Focus Ports for %s", tvb_get_string_enc(wmem_file_scope(), tvb, local_offset, 64, ENC_ASCII)); + GetFocusPorts_header_tree = proto_item_add_subtree(GetFocusPorts_header_item, ett_getfocusports); + + proto_tree_add_item(GetFocusPorts_header_tree, hf_opa_GetFocusPorts_groupName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + local_offset = parse_Image(GetFocusPorts_header_tree, tvb, &local_offset); + proto_tree_add_item(GetFocusPorts_header_tree, hf_opa_GetFocusPorts_select, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetFocusPorts_header_tree, hf_opa_GetFocusPorts_start, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetFocusPorts_header_tree, hf_opa_GetFocusPorts_range, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + } else if (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP) { + GetFocusPorts_header_item = proto_tree_add_item(parentTree, hf_opa_GetFocusPorts, tvb, local_offset, records * PA_HEADER->AttributeOffset * 8, ENC_NA); + GetFocusPorts_header_tree = proto_item_add_subtree(GetFocusPorts_header_item, ett_getfocusports); + for (i = 0; i < records; i++) { + GetFocusPorts_Port_tree = proto_tree_add_subtree_format(GetFocusPorts_header_tree, tvb, local_offset, + PA_HEADER->AttributeOffset * 8, ett_getfocusportsport, &GetFocusPorts_Port_item, "%3u: ", i); + local_offset = parse_Image(GetFocusPorts_Port_tree, tvb, &local_offset); + + proto_item_append_text(GetFocusPorts_Port_item, "LID: %04x, Port %u", + tvb_get_ntohl(tvb, local_offset), tvb_get_guint8(tvb, local_offset + 4)); + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_nodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_portNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_mtu, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_localFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_neighborFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_value, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_nodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_nodeDesc, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_neighborLid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_neighborPortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_neighborValue, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_neighborGuid, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetFocusPorts_Port_tree, hf_opa_GetFocusPorts_neighborNodeDesc, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + } + } + + return local_offset; +} + +/* Parse GetImageInfo MAD from the Performance Admin class. */ +static gint parse_GetImageInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + proto_tree *GetImageInfo_header_tree = parentTree; + proto_item *GetImageInfo_header_item; + proto_tree *GetImageInfo_SM_tree; + guint32 numSMs; + nstime_t ts; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + GetImageInfo_header_item = proto_tree_add_item(parentTree, hf_opa_GetImageInfo, tvb, local_offset, 216, ENC_NA); + GetImageInfo_header_tree = proto_item_add_subtree(GetImageInfo_header_item, ett_getimageinfo); + + local_offset = parse_Image(GetImageInfo_header_tree, tvb, &local_offset); + + ts.secs = (time_t)tvb_get_guint64(tvb, local_offset, ENC_BIG_ENDIAN); + ts.nsecs = 0; + proto_tree_add_time(GetImageInfo_header_tree, hf_opa_GetImageInfo_sweepStart, tvb, local_offset, 8, &ts); + local_offset += 8; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_sweepDuration, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numHFIPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numSwitchNodes, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numSwitchPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numLinks, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + numSMs = tvb_get_ntohl(tvb, local_offset); + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numSMs, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numFailedNodes, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numFailedPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numSkippedNodes, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numSkippedPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_numUnexpectedClearPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_header_tree, hf_opa_GetImageInfo_imageInterval, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + GetImageInfo_SM_tree = proto_tree_add_subtree(GetImageInfo_header_tree, tvb, local_offset, 16 + 64, + ett_getimageinfosm, NULL, "Primary SM Info"); + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_state, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_priority, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_portNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_smPortGuid, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_smNodeDesc, tvb, local_offset, 64, ENC_NA | ENC_ASCII); + local_offset += 64; + + if (!numSMs || numSMs > 1) { + GetImageInfo_SM_tree = proto_tree_add_subtree(GetImageInfo_header_tree, tvb, local_offset, 16 + 64, + ett_getimageinfosm, NULL, "Secondary SM Info"); + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_lid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_state, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_priority, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_portNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_smPortGuid, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetImageInfo_SM_tree, hf_opa_GetImageInfo_smNodeDesc, tvb, local_offset, 64, ENC_NA | ENC_ASCII); + local_offset += 64; + } else { + proto_tree_add_subtree(GetImageInfo_header_tree, tvb, local_offset, 16 + 64, + ett_getimageinfosm, NULL, "No Secondary SM Info"); + local_offset += (16 + 64); + } + return local_offset; +} + +/* Parse GetVFList MAD from the Performance Admin class. */ +static gint parse_GetVFList(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_item *GetVFList_GroupName_item; + proto_tree *GetVFList_header_tree; + proto_item *GetVFList_header_item; + + gint local_offset = *offset; + guint i; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + if (!parentTree || RMPP->Type != RMPP_DATA || + (MAD->Method != METHOD_GET_RESP && MAD->Method != METHOD_GETTABLE_RESP)) { + return *offset; + } + + GetVFList_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFList, tvb, local_offset, length, ENC_NA); + GetVFList_header_tree = proto_item_add_subtree(GetVFList_header_item, ett_getvflist); + proto_tree_add_none_format(GetVFList_header_tree, hf_opa_GetVFList, tvb, local_offset, length, "Number of VFs: %u", records); + + for (i = 0; i < records; i++) { + GetVFList_GroupName_item = proto_tree_add_item(GetVFList_header_tree, hf_opa_GetVFList_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_item_prepend_text(GetVFList_GroupName_item, "%3u: ", i + 1); + } + + return local_offset; +} + +/* Parse GetVFInfo MAD from the Performance Admin class. */ +static gint parse_GetVFInfo(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_tree *GetVFInfo_header_tree = parentTree; + proto_tree *GetVFInfo_header_item = parentTree; + + proto_tree *GetVFInfo_Util_Stats_tree; + proto_item *GetVFInfo_Util_Stats_Buckets_item; + proto_tree *GetVFInfo_Util_Stats_Buckets_tree; + proto_item *GetVFInfo_Util_Stats_Bucket_item; + + proto_tree *GetVFInfo_Error_Summary_tree; + proto_tree *GetVFInfo_Error_Integrity_Buckets_tree; + proto_tree *GetVFInfo_Error_Congestion_Buckets_tree; + proto_tree *GetVFInfo_Error_SmaCongestion_Buckets_tree; + proto_tree *GetVFInfo_Error_Bubble_Buckets_tree; + proto_tree *GetVFInfo_Error_Security_Buckets_tree; + proto_tree *GetVFInfo_Error_Routing_Buckets_tree; + proto_item *GetVFInfo_Error_Stats_Integrity_Buckets_item; + proto_item *GetVFInfo_Error_Stats_Congestion_Buckets_item; + proto_item *GetVFInfo_Error_Stats_SmaCongestion_Buckets_item; + proto_item *GetVFInfo_Error_Stats_Bubble_Buckets_item; + proto_item *GetVFInfo_Error_Stats_Security_Buckets_item; + proto_item *GetVFInfo_Error_Stats_Routing_Buckets_item; + proto_item *GetVFInfo_Error_Stats_Bucket_item; + + gint local_offset = *offset; + guint i; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + guint util = 100 / PM_UTIL_BUCKETS; /* 0%+ 10%+ 20%+ ... 80%+ 90%+ */ + guint err = 100 / (PM_ERR_BUCKETS - 1); /* 0%+ 25%+ 50%+ 75%+ 100%+ */ + + if (!parentTree) { + return *offset; + } + + if (MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) { + GetVFInfo_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFInfo, tvb, local_offset, 64 + 24, ENC_NA); + proto_item_set_text(GetVFInfo_header_item, "VFInfo for %s", tvb_get_string_enc(wmem_file_scope(), tvb, local_offset, 64, ENC_ASCII)); + GetVFInfo_header_tree = proto_item_add_subtree(GetVFInfo_header_item, ett_getvfinfo); + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_GetVFInfo_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + /* ImageID */ + local_offset = parse_Image(GetVFInfo_header_tree, tvb, &local_offset); + return local_offset; + } + + for (i = 0; i < records; i++) { + GetVFInfo_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFInfo, tvb, local_offset, PA_HEADER->AttributeOffset * 8, ENC_NA); + proto_item_set_text(GetVFInfo_header_item, "VFInfo for %s", tvb_get_string_enc(wmem_file_scope(), tvb, local_offset, 64, ENC_ASCII)); + GetVFInfo_header_tree = proto_item_add_subtree(GetVFInfo_header_item, ett_getvfinfo); + + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_GetVFInfo_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + local_offset = parse_Image(GetVFInfo_header_tree, tvb, &local_offset); + + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_GetVFInfo_numPorts, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + /* UtilStats */ + GetVFInfo_Util_Stats_tree = proto_tree_add_subtree(GetVFInfo_header_tree, tvb, local_offset, 40 + PM_UTIL_BUCKETS * 4, + ett_getvfinfoutilstats, NULL, "Internal Utilization Statistics"); + + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_totalMBps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_totalKPps, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_avgMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_minMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_maxMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Util_Stats_Buckets_item = proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_numBWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Util_Stats_Buckets_tree = proto_item_add_subtree(GetVFInfo_Util_Stats_Buckets_item, ett_getvfinfoutilbuckets); + for (i = 0; i < PM_UTIL_BUCKETS; i++) { + GetVFInfo_Util_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Util_Stats_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Util_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * util, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + + } + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_avgKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_minKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_maxKPps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_pmaFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetVFInfo_Util_Stats_tree, hf_opa_GetVFInfo_topoFailedPorts, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + + /* ErrorStats */ + GetVFInfo_Error_Summary_tree = proto_tree_add_subtree(GetVFInfo_header_tree, tvb, local_offset, 40 + PM_ERR_BUCKETS * 24, + ett_getvfinfoerrorsummary, NULL, "Internal Error Statistics"); + + GetVFInfo_Error_Stats_Integrity_Buckets_item = proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_integrityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Error_Stats_Congestion_Buckets_item = proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_congestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Error_Stats_SmaCongestion_Buckets_item = proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_smaCongestionErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Error_Stats_Bubble_Buckets_item = proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_bubbleErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Error_Stats_Security_Buckets_item = proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_securityErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + GetVFInfo_Error_Stats_Routing_Buckets_item = proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_routingErrors, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + + proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_utlizationPct10, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_GetVFInfo_discardsPct10, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFInfo_Error_Summary_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + GetVFInfo_Error_Integrity_Buckets_tree = proto_item_add_subtree(GetVFInfo_Error_Stats_Integrity_Buckets_item, ett_getvfinfoerrintegritybucket); + GetVFInfo_Error_Congestion_Buckets_tree = proto_item_add_subtree(GetVFInfo_Error_Stats_Congestion_Buckets_item, ett_getvfinfoerrcongestionbucket); + GetVFInfo_Error_SmaCongestion_Buckets_tree = proto_item_add_subtree(GetVFInfo_Error_Stats_SmaCongestion_Buckets_item, ett_getvfinfoerrsmacongestionbucket); + GetVFInfo_Error_Bubble_Buckets_tree = proto_item_add_subtree(GetVFInfo_Error_Stats_Bubble_Buckets_item, ett_getvfinfoerrbubblebucket); + GetVFInfo_Error_Security_Buckets_tree = proto_item_add_subtree(GetVFInfo_Error_Stats_Security_Buckets_item, ett_getvfinfoerrsecuritybucket); + GetVFInfo_Error_Routing_Buckets_tree = proto_item_add_subtree(GetVFInfo_Error_Stats_Routing_Buckets_item, ett_getvfinfoerrroutingbucket); + + for (i = 0; i < PM_ERR_BUCKETS; i++) { + GetVFInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Error_Integrity_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetVFInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Error_Congestion_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetVFInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Error_SmaCongestion_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetVFInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Error_Bubble_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetVFInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Error_Security_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + GetVFInfo_Error_Stats_Bucket_item = proto_tree_add_item(GetVFInfo_Error_Routing_Buckets_tree, hf_opa_GetVFInfo_BWBuckets, tvb, local_offset, 4, ENC_BIG_ENDIAN); + proto_item_set_text(GetVFInfo_Error_Stats_Bucket_item, "Bucket %u: %3u%%+: %u", i, i * err, tvb_get_ntohl(tvb, local_offset)); + local_offset += 4; + } + /* End internalErrors */ + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_GetVFInfo_maxInternalRate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_GetVFInfo_minInternalRate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFInfo_header_tree, hf_opa_GetVFInfo_maxInternalMBps, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } + + return local_offset; +} + +/* Parse GetVFConfig MAD from the Performance Admin class. */ +static gint parse_GetVFConfig(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_tree *GetVFConfig_header_tree; + proto_item *GetVFConfig_header_item; + proto_item *GetVFConfig_Port_item; + proto_tree *GetVFConfig_Port_tree; + + gint local_offset = *offset; + guint i; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) { + GetVFConfig_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFConfig, tvb, local_offset, 64 + 24, ENC_NA); + proto_item_set_text(GetVFConfig_header_item, "VF Config"); + GetVFConfig_header_tree = proto_item_add_subtree(GetVFConfig_header_item, ett_getvfconfig); + proto_tree_add_item(GetVFConfig_header_tree, hf_opa_GetVFConfig_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetVFConfig_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + local_offset = parse_Image(GetVFConfig_header_tree, tvb, &local_offset); + } else if (MAD->Method == METHOD_GETTABLE_RESP || MAD->Method == METHOD_GET_RESP) { + GetVFConfig_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFConfig, tvb, local_offset, records * PA_HEADER->AttributeOffset * 8, ENC_NA); + proto_item_set_text(GetVFConfig_header_item, "VF Config"); + GetVFConfig_header_tree = proto_item_add_subtree(GetVFConfig_header_item, ett_getvfconfig); + for (i = 0; i < records; i++) { + GetVFConfig_Port_tree = proto_tree_add_subtree_format(GetVFConfig_header_tree, tvb, local_offset, + PA_HEADER->AttributeOffset * 8, ett_getvfconfigport, &GetVFConfig_Port_item, "%3u: ", i); + local_offset = parse_Image(GetVFConfig_Port_tree, tvb, &local_offset); + proto_tree_add_item(GetVFConfig_Port_tree, hf_opa_GetVFConfig_Port_NodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFConfig_Port_tree, hf_opa_GetVFConfig_Port_nodeDesc, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_item_append_text(GetVFConfig_Port_item, "LID: 0x%04x, Port: %u", tvb_get_ntohl(tvb, local_offset), tvb_get_guint8(tvb, local_offset + 4)); + proto_tree_add_item(GetVFConfig_Port_tree, hf_opa_GetVFConfig_Port_NodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFConfig_Port_tree, hf_opa_GetVFConfig_Port_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFConfig_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + } + } + + return local_offset; +} + +/* Parse GetVFPortCounters MAD from the Performance Admin class. */ +static gint parse_GetVFPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD) +{ + proto_tree *GetVFPortCounters_header_tree; + proto_item *GetVFPortCounters_header_item; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + GetVFPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFPortCounters, tvb, local_offset, 224, ENC_NA); + GetVFPortCounters_header_tree = proto_item_add_subtree(GetVFPortCounters_header_item, ett_getvfportcounters); + + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_nodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_flags, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_reserved32, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + local_offset = parse_Image(GetVFPortCounters_header_tree, tvb, &local_offset); + + if (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP) { + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFRcvData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFRcvPkts, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitDiscards, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_SwPortVFCongestion, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitWait, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFRcvFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFRcvBECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitTimeCong, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitWastedBW, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFXmitWaitData, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFRcvBubble, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFPortCounters_header_tree, hf_opa_GetVFPortCounters_PortVFMarkFECN, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + } else { + local_offset += 112; + } + + return local_offset; +} + +/* Parse ClearVFPortCounters MAD from the Performance Admin class. */ +static gint parse_ClearVFPortCounters(proto_tree *parentTree, tvbuff_t *tvb, gint *offset) +{ + proto_tree *ClearVFPortCounters_header_tree; + proto_item *ClearVFPortCounters_header_item; + + gint local_offset = *offset; + + if (!parentTree) + return *offset; + + ClearVFPortCounters_header_item = proto_tree_add_item(parentTree, hf_opa_ClearVFPortCounters, tvb, local_offset, 92, ENC_NA); + ClearVFPortCounters_header_tree = proto_item_add_subtree(ClearVFPortCounters_header_item, ett_clearvfportcounters); + + proto_tree_add_item(ClearVFPortCounters_header_tree, hf_opa_ClearVFPortCounters_nodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(ClearVFPortCounters_header_tree, hf_opa_ClearVFPortCounters_PortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(ClearVFPortCounters_header_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(ClearVFPortCounters_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_item(ClearVFPortCounters_header_tree, hf_opa_ClearVFPortCounters_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(ClearVFPortCounters_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + proto_tree_add_bitmask(ClearVFPortCounters_header_tree, tvb, local_offset, + hf_opa_ClearVFPortCounters_CounterSelectMask, ett_clearvfportcounters_counterselectmask, + _ClearVFPortCounters_CounterSelectMask, ENC_BIG_ENDIAN); + local_offset += 4; + + return local_offset; +} + +/* Parse GetVFFocusPorts MAD from the Performance Admin class. */ +static gint parse_GetVFFocusPorts(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + proto_tree *GetVFFocusPorts_header_tree; + proto_item *GetVFFocusPorts_header_item; + + proto_tree *GetVFFocusPorts_Port_tree; + + gint local_offset = *offset; + guint i; + + guint length = ((RMPP->resptime_flags & RMPP_FLAG_LAST_MASK) ? (RMPP->PayloadLength - 20) % STL_MAX_SA_PA_PAYLOAD : STL_MAX_SA_PA_PAYLOAD); + guint records = (PA_HEADER->AttributeOffset ? length / (PA_HEADER->AttributeOffset * 8) : 0); + + if (!parentTree) + return *offset; + + if (MAD->Method == METHOD_GET || MAD->Method == METHOD_GETTABLE) { + GetVFFocusPorts_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFFocusPorts, tvb, local_offset, 130, ENC_NA); + GetVFFocusPorts_header_tree = proto_item_add_subtree(GetVFFocusPorts_header_item, ett_getvffocusports); + + proto_tree_add_item(GetVFFocusPorts_header_tree, hf_opa_GetVFFocusPorts_vfName, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetVFFocusPorts_header_tree, hf_opa_reserved64, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + local_offset = parse_Image(GetVFFocusPorts_header_tree, tvb, &local_offset); + proto_tree_add_item(GetVFFocusPorts_header_tree, hf_opa_GetVFFocusPorts_select, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFFocusPorts_header_tree, hf_opa_GetVFFocusPorts_start, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFFocusPorts_header_tree, hf_opa_GetVFFocusPorts_range, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + } else if (MAD->Method == METHOD_GET_RESP || MAD->Method == METHOD_GETTABLE_RESP) { + GetVFFocusPorts_header_item = proto_tree_add_item(parentTree, hf_opa_GetVFFocusPorts, tvb, local_offset, records * PA_HEADER->AttributeOffset * 8, ENC_NA); + GetVFFocusPorts_header_tree = proto_item_add_subtree(GetVFFocusPorts_header_item, ett_getvffocusports); + for (i = 0; i < records; i++) { + GetVFFocusPorts_Port_tree = proto_tree_add_subtree_format(GetVFFocusPorts_header_tree, + tvb, local_offset, PA_HEADER->AttributeOffset * 8, ett_getvffocusportsport, NULL, + "%3u: LID: 0x%04x, Port: %u", + i, tvb_get_ntohl(tvb, local_offset), tvb_get_guint8(tvb, local_offset + 4)); + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_nodeLID, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_portNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_rate, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_mtu, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_localFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_neighborFlags, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_value, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_nodeGUID, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_nodeDesc, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_neighborLid, tvb, local_offset, 4, ENC_BIG_ENDIAN); + local_offset += 4; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_neighborPortNumber, tvb, local_offset, 1, ENC_BIG_ENDIAN); + local_offset += 1; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_reserved24, tvb, local_offset, 3, ENC_BIG_ENDIAN); + local_offset += 3; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_neighborValue, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_neighborGuid, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + proto_tree_add_item(GetVFFocusPorts_Port_tree, hf_opa_GetVFFocusPorts_neighborNodeDesc, tvb, local_offset, 64, ENC_ASCII | ENC_NA); + local_offset += 64; + } + } + + return local_offset; +} +static gboolean parse_PA_Attribute(proto_tree *parentTree, tvbuff_t *tvb, gint *offset, MAD_t *MAD, RMPP_t *RMPP, PA_HEADER_t *PA_HEADER) +{ + gint local_offset = *offset; + + switch (MAD->AttributeID) { + case PA_ATTR_ID_CLASS_PORTINFO: + local_offset = parse_ClassPortInfo(parentTree, tvb, &local_offset, MAD); + break; + case PA_ATTR_ID_GET_GRP_LIST: + local_offset = parse_GetGroupList(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_GRP_INFO: + local_offset = parse_GetGroupInfo(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_GRP_CFG: + local_offset = parse_GetGroupConfig(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_PORT_CTRS: + local_offset = parse_GetPortCounters(parentTree, tvb, &local_offset, MAD); + break; + case PA_ATTR_ID_CLR_PORT_CTRS: + local_offset = parse_ClearPortCounters(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_CLR_ALL_PORT_CTRS: + local_offset = parse_ClearAllPortCounters(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_GET_PM_CFG: + local_offset = parse_PMConfig(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_FREEZE_IMAGE: + local_offset = parse_Image(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_RELEASE_IMAGE: + local_offset = parse_Image(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_RENEW_IMAGE: + local_offset = parse_Image(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_GET_FOCUS_PORTS: + local_offset = parse_GetFocusPorts(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_IMAGE_INFO: + local_offset = parse_GetImageInfo(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_MOVE_FREEZE_FRAME: + local_offset = parse_MoveFreezeFrame(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_GET_VF_LIST: + local_offset = parse_GetVFList(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_VF_INFO: + local_offset = parse_GetVFInfo(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_VF_CONFIG: + local_offset = parse_GetVFConfig(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + case PA_ATTR_ID_GET_VF_PORT_CTRS: + local_offset = parse_GetVFPortCounters(parentTree, tvb, &local_offset, MAD); + break; + case PA_ATTR_ID_CLR_VF_PORT_CTRS: + local_offset = parse_ClearVFPortCounters(parentTree, tvb, &local_offset); + break; + case PA_ATTR_ID_GET_VF_FOCUS_PORTS: + local_offset = parse_GetVFFocusPorts(parentTree, tvb, &local_offset, MAD, RMPP, PA_HEADER); + break; + default: + return FALSE; + } + + *offset = local_offset; + return TRUE; +} + +/* Parse the Method from the MAD Common Header. */ +static void label_PA_Method(proto_item *PAItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->Method, PA_Methods, "(Unknown Perf Method!)"); + proto_item_append_text(PAItem, " %s", label); + col_append_str(pinfo->cinfo, COL_INFO, label); +} + +/* Parse the Attribute from the MAD Common Header */ +static void label_PA_Attribute(proto_item *PAItem, MAD_t *MAD, packet_info *pinfo) +{ + const guchar *label = val_to_str_const(MAD->AttributeID, PA_Attributes, "Attribute (Unknown Perf Attribute!)"); + proto_item_append_text(PAItem, "%s", &label[11]); + col_append_str(pinfo->cinfo, COL_INFO, &label[11]); +} +/* Parse the PA_HEADER +* IN: parentTree to add the dissection to +* IN: tvb - the data buffer from wireshark +* IN/OUT: The current and updated offset */ +static gboolean parse_PA_HEADER(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset, MAD_t *MAD, PA_HEADER_t *PA_HEADER) +{ + gint local_offset = *offset; + proto_item *PA_HEADER_header_item; + proto_tree *PA_HEADER_header_tree; + + PA_HEADER_header_item = proto_tree_add_item(parentTree, hf_opa_pa, tvb, local_offset, 20, ENC_NA); + PA_HEADER_header_tree = proto_item_add_subtree(PA_HEADER_header_item, ett_pa); + + PA_HEADER->SM_Key = tvb_get_ntoh64(tvb, local_offset); + proto_tree_add_item(PA_HEADER_header_tree, hf_opa_pa_sm_key, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + PA_HEADER->AttributeOffset = tvb_get_ntohs(tvb, local_offset); + proto_tree_add_item(PA_HEADER_header_tree, hf_opa_pa_attribute_offset, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + PA_HEADER->Reserved = tvb_get_ntohs(tvb, local_offset); + proto_tree_add_item(PA_HEADER_header_tree, hf_opa_reserved16, tvb, local_offset, 2, ENC_BIG_ENDIAN); + local_offset += 2; + PA_HEADER->ComponentMask = tvb_get_ntoh64(tvb, local_offset); + proto_tree_add_item(PA_HEADER_header_tree, hf_opa_pa_component_mask, tvb, local_offset, 8, ENC_BIG_ENDIAN); + local_offset += 8; + + label_PA_Method(PA_HEADER_header_item, MAD, pinfo); + label_PA_Attribute(PA_HEADER_header_item, MAD, pinfo); + + *offset = local_offset; + return TRUE; +} +/* Parse Performance Administration */ +static void parse_PERFADMN(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + RMPP_t RMPP; + PA_HEADER_t PA_HEADER; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + if (!parse_RMPP(parentTree, pinfo, tvb, offset, &RMPP)) { + return; + } + if (!parse_PA_HEADER(parentTree, pinfo, tvb, offset, &MAD, &PA_HEADER)) { + return; + } + if ((!pref_parse_on_mad_status_error && MAD.Status) || + RMPP.Type == RMPP_ACK || + (RMPP.Type == RMPP_DATA && RMPP.SegmentNumber != 1)) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + + if (!parse_PA_Attribute(parentTree, tvb, offset, &MAD, &RMPP, &PA_HEADER)) { + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } +} +/* Parse Vendor Specific Management Packets */ +/* TBD: Replace with dissector table to call other possible dissectors */ +static void parse_VENDOR_MANAGEMENT(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + RMPP_t RMPP; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + if (value_is_in_range(global_mad_vendor_class, MAD.MgmtClass)) { + /* Vendor MAD 0x09 to 0x0F does NOT have an RMPP header */ + + } else if (value_is_in_range(global_mad_vendor_rmpp_class, MAD.MgmtClass)) { + /* Vendor MAD 0x30 to 0x4F has an RMPP header */ + if (!parse_RMPP(parentTree, pinfo, tvb, offset, &RMPP)) { + return; + } + } + if (!pref_parse_on_mad_status_error && MAD.Status) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + proto_tree_add_item(parentTree, hf_opa_vendor, tvb, *offset, -1, ENC_NA); + + col_append_str(pinfo->cinfo, COL_INFO, "Vendor: (Dissector Not Implemented)"); + + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + + *offset += tvb_captured_length_remaining(tvb, *offset); + return; +} + +/* Parse Application Specific Management Packets */ +/* TBD: Replace with dissector table to call other possible dissectors */ +static void parse_APPLICATION_MANAGEMENT(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + if (!pref_parse_on_mad_status_error && MAD.Status) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + proto_tree_add_item(parentTree, hf_opa_application, tvb, *offset, -1, ENC_NA); + + col_append_str(pinfo->cinfo, COL_INFO, "Application: (Dissector Not Implemented)"); + + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + + *offset += tvb_captured_length_remaining(tvb, *offset); + return; +} + +/* Parse Reserved Management Packets --- ERROR */ +static void parse_RESERVED_MANAGEMENT(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + if (!pref_parse_on_mad_status_error && MAD.Status) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + proto_tree_add_item(parentTree, hf_opa_reservedmclass, tvb, *offset, -1, ENC_NA); + + col_append_str(pinfo->cinfo, COL_INFO, "Reserved: (Dissector Not Implemented)"); + + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + + *offset += tvb_captured_length_remaining(tvb, *offset); + return; +} + +/* Parse Unknown Management Packets --- WARNING */ +/* TBD: Replace with dissector table to call other possible dissectors */ +static void parse_UNKNOWN_MANAGEMENT(proto_tree *parentTree, packet_info *pinfo, tvbuff_t *tvb, gint *offset) +{ + MAD_t MAD; + + if (!parse_MAD_Common(parentTree, pinfo, tvb, offset, &MAD)) { + return; + } + if (!pref_parse_on_mad_status_error && MAD.Status) { + *offset += tvb_captured_length_remaining(tvb, *offset); + return; + } + proto_tree_add_item(parentTree, hf_opa_unknown, tvb, *offset, -1, ENC_NA); + + col_append_str(pinfo->cinfo, COL_INFO, "Unknown: (Dissector Not Implemented)"); + + expert_add_info_format(pinfo, NULL, &ei_opa_mad_no_attribute_dissector, + "Attribute Dissector Not Implemented (0x%x)", MAD.AttributeID); + + *offset += tvb_captured_length_remaining(tvb, *offset); + return; +} + +/* Main OPA MAD dissector */ +static int dissect_opa_mad(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) +{ + gint offset = 0; /* Current Offset */ + guint8 management_class; + guint16 etype, reserved; + dissector_handle_t dissector_found = NULL; + gboolean parent_was_opa_fe = proto_is_frame_protocol(pinfo->layers, "opa.fe"); + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "Omni-Path"); + col_clear_fence(pinfo->cinfo, COL_INFO); + + /* management datagrams are determined by the source/destination QPs */ + if (pinfo->srcport == 0 || pinfo->srcport == 1 || pinfo->destport == 0 + || pinfo->destport == 1 || parent_was_opa_fe) { + management_class = tvb_get_guint8(tvb, offset + 1); + if (value_is_in_range(global_mad_vendor_class, management_class) || + value_is_in_range(global_mad_vendor_rmpp_class, management_class)) { + /* parse vendor specific */ + parse_VENDOR_MANAGEMENT(tree, pinfo, tvb, &offset); + } else if (value_is_in_range(global_mad_application_class, management_class)) { + /* parse application specific */ + parse_APPLICATION_MANAGEMENT(tree, pinfo, tvb, &offset); + } else if (value_is_in_range(global_mad_reserved_class, management_class)) { + /* parse reserved classes */ + parse_RESERVED_MANAGEMENT(tree, pinfo, tvb, &offset); + } else if (value_is_in_range(global_mad_opa_class, management_class)) { + switch (management_class) { + case SUBN_LID_ROUTED: /* parse subn man lid routed */ + parse_SUBN_LID_ROUTED(tree, pinfo, tvb, &offset); + break; + case SUBN_DIRECTED_ROUTE: /* parse subn directed route */ + parse_SUBN_DIRECTED_ROUTE(tree, pinfo, tvb, &offset); + break; + case SUBNADMN: /* parse sub admin */ + parse_SUBNADMN(tree, pinfo, tvb, &offset); + break; + case PERFADMN: + parse_PERFADMN(tree, pinfo, tvb, &offset); + break; + case PERF: /* parse performance */ + parse_PERF(tree, pinfo, tvb, &offset); + break; + default: + parse_UNKNOWN_MANAGEMENT(tree, pinfo, tvb, &offset); + break; + } + } else { + /* parse Unknown classes */ + parse_UNKNOWN_MANAGEMENT(tree, pinfo, tvb, &offset); + } + } else { /* Normal Data Packet - Parse as such */ + etype = tvb_get_ntohs(tvb, offset); + reserved = tvb_get_ntohs(tvb, offset + 2); + dissector_found = dissector_get_uint_handle(ethertype_dissector_table, etype); + if (dissector_found != NULL && (reserved == 0)) { + proto_tree_add_item(tree, hf_opa_etype, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + proto_tree_add_item(tree, hf_opa_etype_reserved16, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + call_dissector(dissector_found, tvb_new_subset_remaining(tvb, offset), pinfo, tree); + } + } + return tvb_captured_length(tvb); +} + +void proto_register_opa_mad(void) +{ + module_t *opa_mad_module; + expert_module_t *expert_opa_mad; + + static hf_register_info hf[] = { + { &hf_opa_reserved64, { + "Reserved (64 bits)", "opa.reserved", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_reserved32, { + "Reserved (32 bits)", "opa.reserved", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_reserved24, { + "Reserved (24 bits)", "opa.reserved", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_reserved16, { + "Reserved (16 bits)", "opa.reserved", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_reserved8, { + "Reserved (8 bits)", "opa.reserved", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + /* Omni-Path*/ + { &hf_opa_etype, { + "Ethertype", "opa.etype", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_etype_reserved16, { + "Reserved (16 bits)", "opa.etype.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + + /* SM - Lid Routed*/ + { &hf_opa_sm_lid, { + "Subnet Management (LID Routed)", "opa.sm.lid", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sm_m_key, { + "M_Key", "opa.sm.lid.mkey", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* SM - Directed Route */ + { &hf_opa_sm_dr, { + "Subnet Management (Directed Route)", "opa.sm.dr", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sm_dr_slid, { + "DrSLID", "opa.sm.dr.slid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sm_dr_dlid, { + "DrDLID", "opa.sm.dr.dlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sm_dr_initial_path, { + "Initial Path", "opa.sm.dr.initialpath", + FT_BYTES, SEP_SPACE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sm_dr_return_path, { + "Return Path", "opa.sm.dr.returnpath", + FT_BYTES, SEP_SPACE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sm_dr_reserved64, { + "Reserved (64 bits)", "opa.sm.dr.reserved", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* SA MAD Header */ + { &hf_opa_sa, { + "Subnet Administration Header", "opa.sa", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_sm_key, { + "SM_Key (Verification Key)", "opa.sa.smkey", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_attribute_offset, { + "Attribute Offset", "opa.sa.attributeoffset", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_component_mask, { + "Component Mask", "opa.sa.componentmask", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* PM MAD Header */ + { &hf_opa_pm, { + "Performance Management", "opa.pm", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* PA MAD Header */ + { &hf_opa_pa, { + "Performance Administration Header", "opa.pa", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_pa_sm_key, { + "SM_Key (Verification Key)", "opa.pa.smkey", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_pa_attribute_offset, { + "Attribute Offset", "opa.pa.attributeoffset", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_pa_component_mask, { + "Component Mask", "opa.pa.componentmask", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Other MAD Headers */ + { &hf_opa_vendor, { + "Vendor MAD Header", "opa.vendor", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_application, { + "Application MAD Header", "opa.application", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_reservedmclass, { + "Reserved MAD Header", "opa.reservedmclass", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_unknown, { + "Unknown MAD Header", "opa.unknown", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* MAD Header */ + { &hf_opa_mad, { + "MAD Header - Common Management Datagram", "opa.mad", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_base_version, { + "Base Version", "opa.mad.baseversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_mgmt_class, { + "Management Class", "opa.mad.mgmtclass", + FT_UINT8, BASE_HEX | BASE_EXT_STRING, &MAD_mgmt_names_ext, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_class_version, { + "Class Version", "opa.mad.classversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_method, { + "Method", "opa.mad.method", + FT_UINT8, BASE_HEX, VALS(Methods), 0x0, NULL, HFILL } + }, + { &hf_opa_mad_status, { + "Status", "opa.mad.status", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_status_DR_D, { + "Direction", "opa.mad.dr.direction", + FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL } + }, + { &hf_opa_mad_status_DR_status, { + "Status", "opa.mad.status", + FT_UINT16, BASE_HEX, NULL, 0x7FFF, NULL, HFILL } + }, + { &hf_opa_mad_status_DR_Hop_Pointer, { + "Hop Pointer", "opa.mad.dr.hoppointer", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_status_DR_Hop_Count, { + "Hop Counter", "opa.mad.dr.hopcounter", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_status_NM_ClassSpecific, { + "Class Specific", "opa.mad.status.classspecific", + FT_UINT16, BASE_HEX, NULL, 0xFF00, NULL, HFILL } + }, + { &hf_opa_mad_status_NM_reserved1, { + "Reserved (3 Bits)", "opa.mad.status.reserved", + FT_UINT16, BASE_HEX, NULL, 0x00E0, NULL, HFILL } + }, + { &hf_opa_mad_status_NM_InvalidField, { + "Invalid Field", "opa.mad.status.invalidfield", + FT_UINT16, BASE_HEX, VALS(MAD_Status_InvalidField), 0x001C, NULL, HFILL } + }, + { &hf_opa_mad_status_NM_RedirectRqrd, { + "Redirect Required", "opa.mad.status.redirectrqrd", + FT_BOOLEAN, 16, TFS(&tfs_redirect_no_redirect), 0x0002, NULL, HFILL } + }, + { &hf_opa_mad_status_NM_Busy, { + "Busy", "opa.mad.status.busy", + FT_BOOLEAN, 16, TFS(&tfs_busy_not_busy), 0x0001, NULL, HFILL } + }, + { &hf_opa_mad_transaction_id, { + "Transaction ID", "opa.mad.transactionid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_mad_attribute_id, { + "Attribute ID", "opa.mad.attributeid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + /* MAD Header - Attribute Modifier */ + { &hf_opa_attribute_modifier, { + "Attribute Modifier", "opa.mad.attributemodifier", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_A, { + "All", "opa.mad.attributemodifier.a", + FT_BOOLEAN, 32, NULL, 0x00000100, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_A2, { + "All Ingress Ports", "opa.mad.attributemodifier.a", + FT_BOOLEAN, 32, NULL, 0x00020000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_A3, { + "All", "opa.mad.attributemodifier.a", + FT_BOOLEAN, 32, NULL, 0x00040000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_A4, { + "All", "opa.mad.attributemodifier.a", + FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_A5, { + "Starting Address", "opa.mad.attributemodifier.a", + FT_UINT32, BASE_HEX, NULL, 0x7FF80000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_A6, { + "All", "opa.mad.attributemodifier.a", + FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_B, { + "Block Number", "opa.mad.attributemodifier.b", + FT_UINT32, BASE_DEC, NULL, 0x000007FF, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_B2, { + "All Egress Ports", "opa.mad.attributemodifier.b", + FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_B3, { + "Block Number", "opa.mad.attributemodifier.b", + FT_UINT32, BASE_DEC, NULL, 0x0003FFFF, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_B4, { + "Block Number", "opa.mad.attributemodifier.b", + FT_UINT32, BASE_DEC, NULL, 0x000FFFFF, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_B5, { + "Block Number", "opa.mad.attributemodifier.b", + FT_UINT32, BASE_DEC, NULL, 0x0000001F, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_E, { + "Egress Ports", "opa.mad.attributemodifier.e", + FT_UINT32, BASE_DEC, NULL, 0x000000FF, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_I, { + "Ingress Ports", "opa.mad.attributemodifier.i", + FT_UINT32, BASE_DEC, NULL, 0x0000FF00, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_L, { + "Length", "opa.mad.attributemodifier.l", + FT_UINT32, BASE_DEC, NULL, 0x0007E000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_NP, { + "Number of Ports", "opa.mad.attributemodifier.n", + FT_UINT32, BASE_DEC, NULL, 0xFF000000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_NB, { + "Number of Blocks", "opa.mad.attributemodifier.n", + FT_UINT32, BASE_DEC, NULL, 0xFF000000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_N2, { + "Number of aggregated Attributes", "opa.mad.attributemodifier.n", + FT_UINT32, BASE_DEC, NULL, 0x000000FF, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_P, { + "Port Number", "opa.mad.attributemodifier.p", + FT_UINT32, BASE_DEC, NULL, 0x000000FF, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_P2, { + "Port Number", "opa.mad.attributemodifier.p", + FT_UINT32, BASE_DEC, NULL, 0x00FF0000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_P3, { + "Position", "opa.mad.attributemodifier.p", + FT_UINT32, BASE_DEC, NULL, 0x00C00000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_S, { + "Section of Table", "opa.mad.attributemodifier.s", + FT_UINT32, BASE_DEC, VALS(MADAttrModSectionVLarb), 0x00FF0000, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_S2, { + "Start of SM Configuration", "opa.mad.attributemodifier.s2", + FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL } + }, + { &hf_opa_attribute_modifier_Y, { + "Asynchronous update", "opa.mad.attributemodifier.y", + FT_BOOLEAN, 32, NULL, 0x00001000, NULL, HFILL } + }, + + /* RMPP Header */ + { &hf_opa_rmpp, { + "RMPP - Reliable Multi-Packet Transaction Protocol", "opa.rmpp", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_rmpp_version, { + "RMPP Version", "opa.rmpp.rmppversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_rmpp_type, { + "RMPP Type", "opa.rmpp.rmpptype", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_rmpp_r_resp_time, { + "R Resp Time", "opa.rmpp.rresptime", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_rmpp_flags_last, { + "Last", "opa.rmpp.flags.last", + FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_rmpp_flags_first, { + "First", "opa.rmpp.flags.first", + FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } + }, + { &hf_opa_rmpp_flags_active, { + "Active", "opa.rmpp.flags.active", + FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } + }, + { &hf_opa_rmpp_status, { + "RMPP Status", "opa.rmpp.rmppstatus", + FT_UINT8, BASE_HEX, VALS(RMPP_Status), 0xFF, NULL, HFILL } + }, + { &hf_opa_rmpp_data1, { + "RMPP Data 1", "opa.rmpp.data1", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_rmpp_data2, { + "RMPP Data 2", "opa.rmpp.data2", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + /* RMPP Data */ + { &hf_opa_rmpp_segment_number, { + "Segment Number", "opa.rmpp.segmentnumber", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_rmpp_payload_length32, { + "Payload Length", "opa.rmpp.payloadlength", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + /* RMPP ACK */ + { &hf_opa_rmpp_new_window_last, { + "New Window Last", "opa.rmpp.newwindowlast", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* SA Packet */ + /* SA RID */ + { &hf_opa_sa_Lid, { + "LID", "opa.sa.lid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_Port, { + "Port", "opa.sa.port", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_EndportLID, { + "EndportLID", "opa.sa.endportlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_PortNum, { + "PortNum", "opa.sa.portnum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_InputPortNum, { + "InputPortNum", "opa.sa.inputportnum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_OutputPortNum, { + "OutputPortNum", "opa.sa.outputportnum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_reserved14, { + "Reserved (14 bits)", "opa.sa.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFFFC0000, NULL, HFILL } + }, + { &hf_opa_sa_BlockNum_18b, { + "BlockNum", "opa.sa.blocknum", + FT_UINT32, BASE_HEX, NULL, 0x0003FFFF, NULL, HFILL } + }, + { &hf_opa_sa_Position, { + "Position", "opa.sa.position", + FT_UINT32, BASE_HEX, NULL, 0xC0000000, NULL, HFILL } + }, + { &hf_opa_sa_reserved9, { + "Reserved (9 bits)", "opa.sa.reserved", + FT_UINT32, BASE_HEX, NULL, 0x3FE00000, NULL, HFILL } + }, + { &hf_opa_sa_BlockNum_21b, { + "BlockNum", "opa.sa.blocknum", + FT_UINT32, BASE_HEX, NULL, 0x001FFFFF, NULL, HFILL } + }, + { &hf_opa_sa_BlockNum_8b, { + "BlockNum", "opa.sa.blocknum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_BlockNum_16b, { + "BlockNum", "opa.sa.blocknum", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_SubscriberLID, { + "SubscriberGID", "opa.sa.subscribergid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_Enum, { + "Enum", "opa.sa.enum", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_FromLID, { + "FromLID", "opa.sa.fromlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_FromPort, { + "FromPort", "opa.sa.fromport", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_ServiceID, { + "ServiceID", "opa.sa.serviceid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_ServiceLID, { + "ServiceLID", "opa.sa.servicelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_ServiceP_Key, { + "ServiceP_Key", "opa.sa.servicep_key", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_ServiceGID, { + "ServiceGID", "opa.sa.servicegid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_MGID, { + "MGID", "opa.sa.mgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_sa_PortGID, { + "PortGID", "opa.sa.portgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* Notice */ + { &hf_opa_Notice, { + "Notice", "opa.notice", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_IsGeneric, { + "IsGeneric", "opa.notice.isgeneric", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_Notice_Type, { + "Type", "opa.notice.type", + FT_UINT8, BASE_HEX, VALS(NoticeType), 0x7F, NULL, HFILL } + }, + { &hf_opa_Notice_ProducerType, { + "ProducerType", "opa.notice.producertype", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_TrapNumber, { + "TrapNumber", "opa.notice.trapnumber", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_VendorID, { + "VendorID", "opa.notice.vendorid", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_DeviceID, { + "DeviceID", "opa.notice.deviceid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_Toggle, { + "Toggle", "opa.notice.toggle", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_Notice_Count, { + "Count", "opa.notice.count", + FT_UINT16, BASE_HEX, NULL, 0x7FFF, NULL, HFILL } + }, + { &hf_opa_Notice_IssuerLID, { + "IssuerLID", "opa.notice.issuerlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_IssuerGID, { + "IssuerGID", "opa.notice.issuergid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Notice_ClassDataDetails, { + "ClassDataDetails", "opa.notice.classdatadetails", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* Trap */ + { &hf_opa_Trap, { + "Trap", "opa.trap", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* Traps 64,65,66,67 */ + { &hf_opa_Trap_GID, { + "GID", "opa.trap.gid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + /* Traps 68,69 */ + + /* Trap 128 */ + { &hf_opa_Trap_LID, { + "LIDADDR", "opa.trap.lidaddr", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Trap 129, 130, 131 */ + { &hf_opa_Trap_PORTNO, { + "PORTNO", "opa.trap.portno", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Trap 144 */ + { &hf_opa_Trap_CAPABILITYMASK, { + "CapabilityMask", "opa.trap.capabilitymask", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_CAPABILITYMASK3, { + "CapabilityMask3", "opa.trap.capabilitymask3", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_144_reserved, { + "Reserved (4 bits)", "opa.trap.144.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_Trap_LinkWidthDowngradeEnabledChange, { + "LinkWidthDowngradeEnabledChange", "opa.trap.linkwidthdowngradeenabledchange", + FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL } + }, + { &hf_opa_Trap_LinkSpeecEnabledChange, { + "LinkSpeecEnabledChange", "opa.trap.linkspeecenabledchange", + FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_Trap_LinkWidthEnabledChange, { + "LinkWidthEnabledChange", "opa.trap.linkwidthenabledchange", + FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } + }, + { &hf_opa_Trap_NodeDescriptionChange, { + "NodeDescriptionChange", "opa.trap.nodedescriptionchange", + FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } + }, + + /* Trap 145 */ + { &hf_opa_Trap_SystemImageGUID, { + "SystemImageGUID", "opa.trap.systemimageguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Trap 256 */ + { &hf_opa_Trap_DRSLID, { + "DR SLID", "opa.trap.drslid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_Method, { + "Method", "opa.trap.method", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_AttributeID, { + "AttributeID", "opa.trap.attributeid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_AttributeModifier, { + "AttributeModifier", "opa.trap.attributemodifier", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_MKey, { + "MKey", "opa.trap.mkey", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_DRNotice, { + "DRNotice", "opa.trap.drnotice", + FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_Trap_DRPathTruncated, { + "DRPathTruncated", "opa.trap.drpathtruncated", + FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL } + }, + { &hf_opa_Trap_DRHopCount, { + "DRHopCount", "opa.trap.drhopcount", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_Trap_DRNoticeReturnPath, { + "DRNoticeReturnPath", "opa.trap.drnoticereturnpath", + FT_BYTES, SEP_SPACE, NULL, 0x0, NULL, HFILL } + }, + + /* Trap 257, 258 */ + { &hf_opa_Trap_Key, { + "Key", "opa.trap.key", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_SL, { + "SL", "opa.trap.sl", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_Trap_SL_reserved, { + "Reserved (3 bits)", "opa.trap.sl.reserved", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_Trap_QP, { + "QP", "opa.trap.qp", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Trap 259 */ + { &hf_opa_Trap_DataValid, { + "DataValid", "opa.trap.datavalid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_Lid1, { + "Lid1", "opa.trap.datavalid.lid1", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x8000, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_Lid2, { + "Lid2", "opa.trap.datavalid.lid2", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x4000, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_PKey, { + "PKey", "opa.trap.datavalid.pkey", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x2000, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_SL, { + "SL", "opa.trap.datavalid.sl", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x1000, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_QP1, { + "QP1", "opa.trap.datavalid.qp1", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x0800, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_QP2, { + "QP2", "opa.trap.datavalid.qp2", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x0400, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_Gid1, { + "Gid1", "opa.trap.datavalid.gid1", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x0200, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_Gid2, { + "Gid2", "opa.trap.datavalid", + FT_BOOLEAN, 16, TFS(&tfs_valid_invalid), 0x01000, NULL, HFILL } + }, + { &hf_opa_Trap_DataValid_Reserved, { + "DataValid", "opa.trap.datavalid", + FT_UINT16, BASE_HEX, NULL, 0x00FF, NULL, HFILL } + }, + + { &hf_opa_Trap_PKey, { + "PKey", "opa.trap.pkey", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* ClassPortInfo in Performance class */ + { &hf_opa_ClassPortInfo, { + "ClassPortInfo", "opa.classportinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_BaseVersion, { + "BaseVersion", "opa.clasportinfo.baseversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_ClassVersion, { + "ClassVersion", "opa.clasportinfo.classversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_CapMask, { + "CapMask", "opa.clasportinfo.capmask", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_CapMask2, { + "CapMask2", "opa.clasportinfo.capmask2", + FT_UINT32, BASE_HEX, NULL, 0xFFFFFFE0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_RespTimeValue, { + "RespTimeValue", "opa.clasportinfo.resptimevalue", + FT_UINT32, BASE_HEX, NULL, 0x0000001F, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_GID, { + "GID", "opa.clasportinfo.redirect.gid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_TClass, { + "TClass", "opa.clasportinfo.redirect.tclass", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_reserved, { + "Reserved (4 bits)", "opa.clasportinfo.redirect.reserved", + FT_UINT24, BASE_HEX, NULL, 0xF00000, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_FlowLabel, { + "FlowLabel", "opa.clasportinfo.redirect.flowlabel", + FT_UINT24, BASE_HEX, NULL, 0x0FFFFF, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_LID, { + "LID", "opa.clasportinfo.redirect.lid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_SL, { + "SL", "opa.clasportinfo.redirect.sl", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_reserved2, { + "Reserved (3 bits)", "opa.clasportinfo.redirect.reserved", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_QP, { + "QP", "opa.clasportinfo.redirect.qp", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_Q_Key, { + "Q_Key", "opa.clasportinfo.redirect.q_key", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_GID, { + "GID", "opa.clasportinfo.trap.gid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_TClass, { + "TClass", "opa.clasportinfo.trap.tclass", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_reserved, { + "Reserved (4 bits)", "opa.clasportinfo.trap.reserved", + FT_UINT24, BASE_HEX, NULL, 0xF00000, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_FlowLabel, { + "FlowLabel", "opa.clasportinfo.trap.flowlabel", + FT_UINT24, BASE_HEX, NULL, 0x0FFFFF, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_LID, { + "LID", "opa.clasportinfo.trap.lid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_HopLimit, { + "HopLimit", "opa.clasportinfo.trap.hoplimit", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_QP, { + "QP", "opa.clasportinfo.trap.qp", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_Q_Key, { + "Q_Key", "opa.clasportinfo.trap.q_key", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_P_Key, { + "P_Key", "opa.clasportinfo.trap.p_key", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Redirect_P_Key, { + "P_Key", "opa.clasportinfo.redirect.p_key", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_SL, { + "SL", "opa.clasportinfo.trap.sl", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_ClassPortInfo_Trap_reserved2, { + "Reserved (3 bits)", "opa.clasportinfo.trap.reserved", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, +/******************* +* NodeDescription * +*******************/ + + { &hf_opa_NodeDescription, { + "NodeDescription", "opa.nodedescription", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeDescription_NodeString, { + "NodeString", "opa.nodedescription.nodestring", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + +/************ +* NodeInfo * +************/ + { &hf_opa_NodeInfo, { + "Node Info", "opa.nodeinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_BaseVersion, { + "Base Version", "opa.nodeinfo.baseversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_ClassVersion, { + "Class Version", "opa.nodeinfo.classversion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_NodeType, { + "Node Type", "opa.nodeinfo.nodetype", + FT_UINT8, BASE_HEX, VALS(NodeType), 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_NumPorts, { + "Num Ports", "opa.nodeinfo.numports", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_SystemImageGUID, { + "System Image GUID", "opa.nodeinfo.systemimageguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_NodeGUID, { + "Node GUID", "opa.nodeinfo.nodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_PortGUID, { + "Port GUID", "opa.nodeinfo.portguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_PartitionCap, { + "Partition Cap", "opa.nodeinfo.partitioncap", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_DeviceID, { + "Device ID", "opa.nodeinfo.deviceid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_Revision, { + "Revision", "opa.nodeinfo.revision", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_LocalPortNum, { + "Local Port Num", "opa.nodeinfo.localportnum", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_NodeInfo_VendorID, { + "Vendor ID", "opa.nodeinfo.vendorid", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/************** +* SwitchInfo * +**************/ + + { &hf_opa_SwitchInfo, { + "Switch Info", "opa.switchinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_LinearFDBCap, { + "Linear FDB Cap", "opa.switchinfo.linearfdbcap", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_MulticastFDBCap, { + "Multicast FDB Cap", "opa.switchinfo.multicastfdbcap", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_LinearFDBTop, { + "Linear FDB Top", "opa.switchinfo.linearfdbtop", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_MulticastFDBTop, { + "Multicast FDB Top", "opa.switchinfo.multicastfdbtop", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_CollectiveCap, { + "Collective Cap", "opa.switchinfo.collectivecap", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_CollectiveTop, { + "Collective Top", "opa.switchinfo.collectivetop", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_IPAddrIPv6, { + "IP Addr IPv6", "opa.switchinfo.ipaddripv6", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_IPAddrIPv4, { + "IP Addr IPv4", "opa.switchinfo.ipaddripv4", + FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_LifeTimeValue, { + "Life Time Value", "opa.switchinfo.lifetimevalue", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_PortStateChange, { + "Port State Change", "opa.switchinfo.portstatechange", + FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_reserved2, { + "Reserved (2 bits)", "opa.switchinfo.reserved2", + FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_PartitionEnforcementCap, { + "Partition Enforcement Cap", "opa.switchinfo.partitionenforcementcap", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_PortGroupCap, { + "Port Group Cap", "opa.switchinfo.portgroupcap", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_PortGroupTop, { + "Port Group Top", "opa.switchinfo.portgrouptop", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_SupportedRoutingMode, { + "Supported Routing Mode", "opa.switchinfo.supportedroutingmode", + FT_UINT8, BASE_HEX, VALS(RoutingMode), 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_EnabledRoutingMode, { + "Enabled Routing Mode", "opa.switchinfo.enabledroutingmode", + FT_UINT8, BASE_HEX, VALS(RoutingMode), 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_reserved3, { + "Reserved (4 bits)", "opa.switchinfo.reserved3", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_EnhancedPortZero, { + "Enhanced Port Zero", "opa.switchinfo.enhancedportzero", + FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_reserved4, { + "Reserved (3 bits)", "opa.switchinfo.reserved4", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_reserved5, { + "Reserved (2 bits)", "opa.switchinfo.reserved5", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_CollectiveMask, { + "Collective Mask", "opa.switchinfo.collectivemask", + FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_MulticastMask, { + "Multicast Mask", "opa.switchinfo.multicastmask", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_AdaptiveRoutingEnable, { + "Adaptive Routing Enable", "opa.switchinfo.adaptiveroutingenable", + FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_AdaptiveRoutingPause, { + "Adaptive Routing Pause", "opa.switchinfo.adaptiveroutingpause", + FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_AdaptiveRoutingAlgorithm, { + "Adaptive Routing Algorithm", "opa.switchinfo.adaptiveroutingalgorithm", + FT_UINT16, BASE_HEX, VALS(AdaptiveRoutingAlgorithm), 0x3800, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_AdaptiveRoutingFrequency, { + "Adaptive Routing Frequency", "opa.switchinfo.adaptiveroutingfrequency", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_swinfo_ar_frequency), 0x0700, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_AdaptiveRoutingLostRoutesOnly, { + "Adaptive Routing Lost Routes Only", "opa.switchinfo.adaptiveroutinglostroutesonly", + FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_AdaptiveRoutingThreshold, { + "Adaptive Routing Threshold", "opa.switchinfo.adaptiveroutingthreshold", + FT_UINT16, BASE_HEX, VALS(AdaptiveRoutingThreshold), 0x0070, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_reserved6, { + "Reserved (4 bits)", "opa.switchinfo.reserved6", + FT_UINT16, BASE_HEX, NULL, 0x000F, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_SwitchCapabilityMask, { + "Switch Capability Mask", "opa.switchinfo.switchcapabilitymask", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_SwitchCapabilityMask_reserved, { + "Reserved (13 bits)", "opa.switchinfo.switchcapabilitymask.reserved", + FT_UINT16, BASE_HEX, NULL, 0xFFF8, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_SwitchCapabilityMask_IsAddrRangeConfigSupported, { + "IsAddrRangeConfigSupported", "opa.switchinfo.switchcapabilitymask.isaddrrangeconfigsupported", + FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_SwitchCapabilityMask_reserved2, { + "Reserved (1 bit)", "opa.switchinfo.switchcapabilitymask.reserved", + FT_UINT16, BASE_HEX, NULL, 0x0002, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_SwitchCapabilityMask_IsAdaptiveRoutingSupported, { + "IsAdaptiveRoutingSupported", "opa.switchinfo.switchcapabilitymask.isadaptiveroutingsupported", + FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL } + }, + { &hf_opa_SwitchInfo_CapabilityMaskCollectives, { + "Capability Mask Collectives", "opa.switchinfo.capabilitymaskcollectives", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/************ +* PortInfo * +************/ + { &hf_opa_PortInfo, { + "Port Info", "opa.portinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LID, { + "LID", "opa.portinfo.lid", + FT_UINT32, BASE_HEX, NULL, 0x0, "Base LID of this node", HFILL } + }, + { &hf_opa_PortInfo_FlowControlMask, { + "Flow Control Mask", "opa.portinfo.flowcontrolmask", + FT_UINT32, BASE_CUSTOM, CF_FUNC(cf_opa_mad_32b_mask), 0x0, "Flow control enabled on all VLs except VL15", HFILL } + }, + { &hf_opa_PortInfo_VL_PreemptCap, { + "PreemptCap", "opa.portinfo.vl.preemptcap", + FT_UINT8, BASE_DEC, NULL, 0x0, "Size of Preempting VL Arbitration table", HFILL } + }, + { &hf_opa_PortInfo_VL_reserved, { + "Reserved (3 bits)", "opa.portinfo.vl.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_PortInfo_VL_Cap, { + "VL Cap", "opa.portinfo.vl.cap", + FT_UINT8, BASE_DEC, NULL, 0x1F, "Virtual Lanes supported on this port", HFILL } + }, + { &hf_opa_PortInfo_VL_HighLimit, { + "HighLimit", "opa.portinfo.vl.highlimit", + FT_UINT16, BASE_DEC, NULL, 0x0, "Limit of high priority component of VL Arbitration table", HFILL } + }, + { &hf_opa_PortInfo_VL_PreemptingLimit, { + "PreemptingLimit", "opa.portinfo.vl.preemptinglimit", + FT_UINT16, BASE_DEC, NULL, 0x0, "Limit of preempt component of VL Arbitration table", HFILL } + }, + { &hf_opa_PortInfo_VL_ArbitrationHighCap, { + "ArbitrationHighCap", "opa.portinfo.vl.arbitrationhighcap", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_VL_ArbitrationLowCap, { + "ArbitrationLowCap", "opa.portinfo.vl.arbitrationlowcap", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_PortPhysConfig_reserved, { + "Reserved (4 bits)", "opa.portinfo.portphysconfig.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortPhysConfig_PortType, { + "PortPhysConfig PortType", "opa.portinfo.portphysconfig.porttype", + FT_UINT8, BASE_HEX, VALS(PortType), 0x0F, NULL, HFILL } + }, + { &hf_opa_PortInfo_MultiCollectMask_reserved, { + "Reserved (2 bits)", "opa.portinfo.multicollectmask.reserved", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_PortInfo_MultiCollectMask_CollectiveMask, { + "MultiCollectMask CollectiveMask", "opa.portinfo.multicollectmask.collectivemask", + FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL } + }, + { &hf_opa_PortInfo_MultiCollectMask_MulticastMask, { + "MultiCollectMask MulticastMask", "opa.portinfo.multicollectmask.multicastmask", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_PortInfo_M_KeyProtectBits, { + "M_KeyProtectBits", "opa.portinfo.mkeyprotectbits", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_PortInfo_S1_reserved, { + "Reserved (2 bits)", "opa.portinfo.s1.reserved", + FT_UINT8, BASE_HEX, NULL, 0x30, NULL, HFILL } + }, + { &hf_opa_PortInfo_LMC, { + "LMC", "opa.portinfo.lmc", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_PortInfo_S2_reserved, { + "Reserved (3 bits)", "opa.portinfo.s2.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_PortInfo_MasterSMSL, { + "MasterSMSL", "opa.portinfo.mastersml", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkInitReason, { + "LinkInitReason", "opa.portinfo.linkinitreason", + FT_UINT8, BASE_HEX, VALS(LinkInitReason), 0xF0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PartitionEnforcementInbound, { + "PartitionEnforcementInbound", "opa.portinfo.partitionenforcementinbound", + FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL } + }, + { &hf_opa_PortInfo_PartitionEnforcementOutbound, { + "PartitionEnforcementOutbound", "opa.portinfo.partitionenforcementoutbound", + FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_PortInfo_S3_reserved2, { + "Reserved (2 bits)", "opa.portinfo.s3.reserved2", + FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL } + }, + { &hf_opa_PortInfo_S4_reserved, { + "Reserved (3 bits)", "opa.portinfo.s4.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_PortInfo_OperationalVL, { + "OperationalVL", "opa.portinfo.operationalvl", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + /* P_Keys */ + { &hf_opa_PortInfo_P_Keys_P_Key_8B, { + "P_Keys P_Key_8B", "opa.portinfo.pkey8", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_P_Keys_P_Key_10B, { + "P_Keys P_Key_10B", "opa.portinfo.pkey10", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_M_KeyViolations, { + "M_KeyViolations", "opa.portinfo.m_keyviolations", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_P_KeyViolations, { + "P_KeyViolations", "opa.portinfo.p_keyviolations", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_Q_KeyViolations, { + "Q_KeyViolations", "opa.portinfo.q_keyviolations", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_TrapQueuePair_reserved, { + "TrapQueuePair Reserved (8 bits)", "opa.portinfo.trapqpair.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFF000000, NULL, HFILL } + }, + { &hf_opa_PortInfo_TrapQueuePair, { + "TrapQueuePair", "opa.portinfo.trapqpair", + FT_UINT32, BASE_HEX, NULL, 0x00FFFFFF, NULL, HFILL } + }, + { &hf_opa_PortInfo_SAQueuePair_reserved, { + "SAQueuePair Reserved (8 bits)", "opa.portinfo.saqpair.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFF000000, NULL, HFILL } + }, + { &hf_opa_PortInfo_SAQueuePair, { + "SAQueuePair", "opa.portinfo.saqpair", + FT_UINT32, BASE_HEX, NULL, 0x00FFFFFF, NULL, HFILL } + }, + { &hf_opa_PortInfo_NeighborPortNum, { + "NeighborPortNum", "opa.portinfo.neighborportnum", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkDownReason, { + "LinkDownReason", "opa.portinfo.linkdownreason", + FT_UINT8, BASE_HEX, VALS(LinkDownReason), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_NeighborLinkDownReason, { + "NeighborLinkDownReason", "opa.portinfo.neighborlinkdownreason", + FT_UINT8, BASE_HEX, VALS(LinkDownReason), 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_ClientRegister, { + "Subnet ClientRegister", "opa.portinfo.clientregister", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_PortInfo_MulticastPKeyTrapSuppressEnabled, { + "Subnet Multicast PKey Trap Enabled", "opa.portinfo.multicastpkeytrapenabled", + FT_UINT8, BASE_HEX, NULL, 0x60, NULL, HFILL } + }, + { &hf_opa_PortInfo_Timeout, { + "Subnet Timeout", "opa.portinfo.timeout", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkSpeedSupported, { + "LinkSpeedSupported", "opa.portinfo.linkspeedsupported", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkspeed), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkSpeedEnabled, { + "LinkSpeedEnabled", "opa.portinfo.linkspeedenabled", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkspeed), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkSpeedActive, { + "LinkSpeedActive", "opa.portinfo.linkspeedactive", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkspeed), 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_LinkWidthSupported, { + "LinkWidthSupported", "opa.portinfo.linkwidthsupported", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkWidthEnabled, { + "LinkWidthEnabled", "opa.portinfo.linkwidthenabled", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkWidthActive, { + "LinkWidthActive", "opa.portinfo.linkwidthactive", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_LinkWidthDowngrade_Supported, { + "LinkWidthDowngrade Supported", "opa.portinfo.linkwidthdowngradesupported", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkWidthDowngrade_Enabled, { + "LinkWidthDowngrade Enabled", "opa.portinfo.linkwidthdowngradeenabled", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkWidthDowngrade_TxActive, { + "LinkWidthDowngrade TxActive", "opa.portinfo.linkwidthdowngradetxactive", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_LinkWidthDowngrade_RxActive, { + "LinkWidthDowngrade RxActive", "opa.portinfo.linkwidthdowngraderxactive", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + /* PortLinkMode */ + { &hf_opa_PortInfo_PortLinkMode_reserved, { + "PortLinkMode Reserved (1 bit)", "opa.portinfo.portlinkmode.reserved", + FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortLinkMode_Supported, { + "PortLinkMode Supported", "opa.portinfo.portlinkmode.supported", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_portlinkmode), 0x7C00, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortLinkMode_Enabled, { + "PortLinkMode Enabled", "opa.portinfo.portlinkmode.enabled", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_portlinkmode), 0x03E0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortLinkMode_Active, { + "PortLinkMode Active", "opa.portinfo.portlinkmode.active", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_portlinkmode), 0x001F, NULL, HFILL } + }, + + /* PortLTPCRCMode */ + { &hf_opa_PortInfo_PortLTPCRCMode_reserved, { + "PortLTPCRCMode Reserved (4 bits)", "opa.portinfo.portltpcrc.reserved", + FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortLTPCRCMode_Supported, { + "PortLTPCRCMode Supported", "opa.portinfo.portltpcrc.supported", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_portltpcrcmode), 0x0F00, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortLTPCRCMode_Enabled, { + "PortLTPCRCMode Enabled", "opa.portinfo.portltpcrc.enabled", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_portltpcrcmode), 0x00F0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortLTPCRCMode_Active, { + "PortLTPCRCMode Active", "opa.portinfo.portltpcrc.active", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_portltpcrcmode), 0x000F, NULL, HFILL } + }, + + /* PortMode */ + { &hf_opa_PortInfo_PortMode, { + "PortMode", "opa.portinfo.portmode", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_reserved, { + "Reserved (9 bits)", "opa.portinfo.portmode.reserved", + FT_UINT16, BASE_HEX, NULL, 0xFF80, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_IsActiveOptimizeEnabled, { + "IsActiveOptimizeEnabled", "opa.portinfo.portmode.isactiveoptimizeenabled", + FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_IsPassThroughEnabled, { + "IsPassThroughEnabled", "opa.portinfo.portmode.ispassthroughenabled", + FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_IsVLMarkerEnabled, { + "IsVLMarkerEnabled", "opa.portinfo.portmode.isvlmarkerenabled", + FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_reserved2, { + "Reserved (2 bits)", "opa.portinfo.portmode.reserved2", + FT_UINT16, BASE_HEX, NULL, 0x000C, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_Is16BTrapQueryEnabled, { + "Is16BTrapQueryEnabled", "opa.portinfo.portmode.is16btrapqueryenabled", + FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortMode_reserved3, { + "Reserved (1 bit)", "opa.portinfo.portmode.reserved3", + FT_UINT16, BASE_HEX, NULL, 0x0001, NULL, HFILL } + }, + + /*PortPacketFormats*/ + { &hf_opa_PortInfo_PortPacketFormats_Supported, { + "PortPacketFormats Supported", "opa.portinfo.portpacketformats.supported", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_packetformat), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortPacketFormats_Enabled, { + "PortPacketFormats Enabled", "opa.portinfo.portpacketformats.enabled", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_packetformat), 0x0, NULL, HFILL } + }, + /* Flit Control*/ + { &hf_opa_PortInfo_FlitControl_Interleave_reserved, { + "Interleave Reserved (2 bits)", "opa.portinfo.flitcontrol.interleave.reserved", + FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Interleave_DistanceSupported, { + "Interleave DistanceSupported", "opa.portinfo.flitcontrol.interleave.distancesupported", + FT_UINT16, BASE_HEX, VALS(PortFlitDistanceMode), 0x3000, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Interleave_DistanceEnabled, { + "Interleave DistanceEnabled", "opa.portinfo.flitcontrol.interleave.distanceenabled", + FT_UINT16, BASE_HEX, VALS(PortFlitDistanceMode), 0x0C00, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Interleave_MaxNestLevelTxEnabled, { + "Interleave MaxNestLevelTxEnabled", "opa.portinfo.flitcontrol.interleave.maxnestleveltxenabled", + FT_UINT16, BASE_HEX, NULL, 0x03E0, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Interleave_MaxNestLevelRxSupported, { + "Interleave MaxNestLevelRxEnabled", "opa.portinfo.flitcontrol.interleave.maxnestlevelrxenabled", + FT_UINT16, BASE_HEX, NULL, 0x001F, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Preemption_MinInitial, { + "Preemption MinIntial", "opa.portinfo.flitcontrol.preemption.mininitial", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Preemption_MinTail, { + "Preemption Mintail", "opa.portinfo.flitcontrol.preemption.mintail", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Preemption_LargePacketLimit, { + "Preemption LargePacketLimit", "opa.portinfo.flitcontrol.preemption.largepacketlimit", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Preemption_SmallPacketLimit, { + "Preemption SmallPacketLimit", "opa.portinfo.flitcontrol.preemption.smallpacketlimit", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Preemption_MaxSmallPacketLimit, { + "Preemption MaxSmallPacketLimit", "opa.portinfo.flitcontrol.preemption.maxsmallpacketlimit", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_FlitControl_Preemption_PreemptionLimit, { + "Preemption PreemptionLimit", "opa.portinfo.flitcontrol.preemption.preemptionlimit", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* PortErrorAction */ + { &hf_opa_PortInfo_PortErrorAction, { + "PortErrorAction", "opa.portinfo.porterroraction", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_ExcessiveBufferOverrun, { + "ExcessiveBufferOverrun", "opa.portinfo.porterroraction.excessivebufferoverrun", + FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_reserved, { + "Reserved (7 bits)", "opa.portinfo.porterroraction.reserved", + FT_UINT32, BASE_HEX, NULL, 0x7F000000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorExceedMulticastLimit, { + "FMConfigErrorExceedMulticastLimit", "opa.portinfo.porterroraction.fmconfigerrorexceedmulticastlimit", + FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadControlFlit, { + "FmConfigErrorBadControlFlit", "opa.portinfo.porterroraction.fmconfigerrorbadcontrolflit", + FT_BOOLEAN, 32, NULL, 0x00400000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadPreempt, { + "FmConfigErrorBadPreempt", "opa.portinfo.porterroraction.fmconfigerrorbadpreempt", + FT_BOOLEAN, 32, NULL, 0x00200000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadVLMarker, { + "FmConfigErrorBadVLMarker", "opa.portinfo.porterroraction.fmconfigerrorbadvlmarker", + FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadCrdtAck, { + "FmConfigErrorBadCrdtAck", "opa.portinfo.porterroraction.fmconfigerrorbadcrdtack", + FT_BOOLEAN, 32, NULL, 0x00080000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadCtrlDist, { + "FmConfigErrorBadCtrlDist", "opa.portinfo.porterroraction.fmconfigerrorbadctrldist", + FT_BOOLEAN, 32, NULL, 0x00040000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadTailDist, { + "FmConfigErrorBadTailDist", "opa.portinfo.porterroraction.fmconfigerrorbadtaildist", + FT_BOOLEAN, 32, NULL, 0x00020000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_FmConfigErrorBadHeadDist, { + "FmConfigErrorBadHeadDist", "opa.portinfo.porterroraction.fmconfigerrorbadheaddist", + FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_reserved2, { + "Reserved (2 bits)", "opa.portinfo.porterroraction.reserved2", + FT_UINT32, BASE_HEX, NULL, 0x0000C000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadVLMarker, { + "PortRcvErrorBadVLMarker", "opa.portinfo.porterroraction.portrcverrorbadvlmarker", + FT_BOOLEAN, 32, NULL, 0x00002000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPreemptVL15, { + "PortRcvErrorPreemptVL15", "opa.portinfo.porterroraction.portrcverrorpreemptvl15", + FT_BOOLEAN, 32, NULL, 0x00001000, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPreemptError, { + "PortRcvErrorPreemptError", "opa.portinfo.porterroraction.portrcverrorpreempterror", + FT_BOOLEAN, 32, NULL, 0x00000800, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_reserved3, { + "Reserved (1 bit)", "opa.portinfo.porterroraction.reserved3", + FT_UINT32, BASE_HEX, NULL, 0x00000400, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadMidTail, { + "PortRcvErrorBadMidTail", "opa.portinfo.porterroraction.portrcverrorbadmidtail", + FT_BOOLEAN, 32, NULL, 0x00000200, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorReserved, { + "PortRcvErrorReserved", "opa.portinfo.porterroraction.portrcverrorreserved", + FT_UINT32, BASE_HEX, NULL, 0x00000100, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadSC, { + "PortRcvErrorBadSC", "opa.portinfo.porterroraction.portrcverrorbadsc", + FT_BOOLEAN, 32, NULL, 0x00000080, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadL2, { + "PortRcvErrorBadL2", "opa.portinfo.porterroraction.portrcverrorbadl2", + FT_BOOLEAN, 32, NULL, 0x00000040, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadDLID, { + "PortRcvErrorBadDLID", "opa.portinfo.porterroraction.portrcverrorbaddlid", + FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadSLID, { + "PortRcvErrorBadSLID", "opa.portinfo.porterroraction.portrcverrorbadslid", + FT_BOOLEAN, 32, NULL, 0x00000010, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPktLenTooShort, { + "PortRcvErrorPktLenTooShort", "opa.portinfo.porterroraction.portrcverrorpktlentooshort", + FT_BOOLEAN, 32, NULL, 0x00000008, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorPktLenTooLong, { + "PortRcvErrorPktLenTooLong", "opa.portinfo.porterroraction.portrcverrorpktlentoolong", + FT_BOOLEAN, 32, NULL, 0x00000004, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_PortRcvErrorBadPktLen, { + "PortRcvErrorBadPktLen", "opa.portinfo.porterroraction.portrcverrorbadpktlen", + FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortErrorAction_reserved4, { + "Reserved (1 bit)", "opa.portinfo.porterroraction.reserved4", + FT_UINT32, BASE_HEX, NULL, 0x00000001, NULL, HFILL } + }, + /* PassThroughControl */ + { &hf_opa_PortInfo_PassThroughControl_EgressPort, { + "PassThroughControl EgressPort", "opa.portinfo.passthroughcontrol.egressport", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + { &hf_opa_PortInfo_PassThroughControl_reserved, { + "Reserved (7 Bits)", "opa.portinfo.passthroughcontrol.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL } + }, + { &hf_opa_PortInfo_PassThroughControl_DRControl, { + "PassThroughControl DRControl", "opa.portinfo.passthroughcontrol.drcontrol", + FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL } + }, + { &hf_opa_PortInfo_M_KeyLeasePeriod, { + "M_KeyLeasePeriod", "opa.portinfo.m_keyleaseperiod", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_BufferUnits_reserved, { + "BufferUnits Reserved (9 bits)", "opa.portinfo.bufferunits.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFF800000, NULL, HFILL } + }, + { &hf_opa_PortInfo_BufferUnits_VL15Init, { + "BufferUnits VL15Init", "opa.portinfo.bufferunits.vl15init", + FT_UINT32, BASE_HEX, NULL, 0x007FF800, NULL, HFILL } + }, + { &hf_opa_PortInfo_BufferUnits_VL15CreditRate, { + "BufferUnits VL15Credit", "opa.portinfo.bufferunits.vl15credit", + FT_UINT32, BASE_HEX, NULL, 0x0000007C0, NULL, HFILL } + }, + { &hf_opa_PortInfo_BufferUnits_CreditAck, { + "BufferUnits CreditAck", "opa.portinfo.bufferunits.creditack", + FT_UINT32, BASE_HEX, NULL, 0x00000038, NULL, HFILL } + }, + { &hf_opa_PortInfo_BufferUnits_BufferAlloc, { + "BufferUnits BufferAlloc", "opa.portinfo.bufferunits.bufferalloc", + FT_UINT32, BASE_HEX, NULL, 0x00000007, NULL, HFILL } + }, + + { &hf_opa_PortInfo_MasterSMLID, { + "MasterSMLID", "opa.portinfo.mastersmlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_M_Key, { + "MKey", "opa.portinfo.mkey", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_SubnetPrefix, { + "SubnetPrefix", "opa.portinfo.subnetprefix", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_VL1, { + "VL", "opa.portinfo.vl1", + FT_UINT8, BASE_HEX, VALS(MTU), 0xF0, NULL, HFILL } + }, + { &hf_opa_PortInfo_VL2, { + "VL", "opa.portinfo.vl2", + FT_UINT8, BASE_HEX, VALS(MTU), 0x0F, NULL, HFILL } + }, + /* XmitQ */ + { &hf_opa_PortInfo_XmitQ_VLStallCount, { + "VLStallCount", "opa.portinfo.xmitq.vlstallcount", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_PortInfo_XmitQ_HOQLife, { + "HOQLife", "opa.portinfo.xmitq.hoqlife", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + + { &hf_opa_PortInfo_IPAddrIPv6, { + "IPAddr IPv6", "opa.portinfo.ipaddripv6", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_IPAddrIPv4, { + "IPAddr IPv4", "opa.portinfo.ipaddripv4", + FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_NeighborNodeGUID, { + "NeighborNodeGUID", "opa.portinfo.neighbornodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Capability Mask Flags */ + { &hf_opa_PortInfo_CapabilityMask, { + "CapabilityMask", "opa.portinfo.capabilitymask", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_reserved, { + "Reserved (9 bits)", "opa.portinfo.capabilitymask.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFF800000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_IsCapabilityMaskNoticeSupported, { + "IsCapabilityMaskNoticeSupported", "opa.portinfo.capabilitymask.iscapabilitymasknoticesupported", + FT_BOOLEAN, 32, NULL, 0x00400000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_reserved2, { + "Reserved (1 bit)", "opa.portinfo.capabilitymask.reserved2", + FT_UINT32, BASE_HEX, NULL, 0x00200000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_IsVendorClassSupported, { + "IsVendorClassSupported", "opa.portinfo.capabilitymask.isvendorclasssupported", + FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_IsDeviceManagementSupported, { + "IsDeviceManagementSupported", "opa.portinfo.capabilitymask.isdevicemanagementsupported", + FT_BOOLEAN, 32, NULL, 0x00080000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_reserved3, { + "Reserved (2 bits)", "opa.portinfo.capabilitymask.reserved3", + FT_UINT32, BASE_HEX, NULL, 0x00060000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_IsConnectionManagementSupported, { + "IsConnectionManagementSupported", "opa.portinfo.capabilitymask.isconnectionmanagementsupported", + FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_reserved4, { + "Reserved (10 bits)", "opa.portinfo.capabilitymask.reserved4", + FT_UINT32, BASE_HEX, NULL, 0x0000FFC0, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_IsAutomaticMigrationSupported, { + "IsAutomaticMigrationSupported", "opa.portinfo.capabilitymask.isautomaticmigrationsupported", + FT_BOOLEAN, 32, NULL, 0x00000020, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_reserved5, { + "Reserved (3 bits)", "opa.portinfo.capabilitymask.reserved5", + FT_UINT32, BASE_HEX, NULL, 0x0000001C, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_IsSM, { + "IsSM", "opa.portinfo.capabilitymask.issm", + FT_BOOLEAN, 32, NULL, 0x00000002, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask_reserved6, { + "Reserved (1 bit)", "opa.portinfo.capabilitymask.reserved6", + FT_UINT32, BASE_HEX, NULL, 0x00000001, NULL, HFILL } + }, + /* End Capability Mask Flags */ + + /* Capability Mask 3 */ + { &hf_opa_PortInfo_CapabilityMask3, { + "CapabilityMask3", "opa.portinfo.capabilitymask3", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_reserved, { + "Reserved (8 bits)", "opa.portinfo.capabilitymask3.reserved", + FT_UINT16, BASE_HEX, NULL, 0xFF00, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsSnoopSupported, { + "IsSnoopSupported", "opa.portinfo.capabilitymask3.issnoopsupported", + FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsAsyncSCtoVLSupported, { + "IsAsyncSCtoVLSupported", "opa.portinfo.capabilitymask3.isasyncsc2vlsupported", + FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsAddrRangeConfigSupported, { + "IsAddrRangeConfigSupported", "opa.portinfo.capabilitymask3.isaddrrangeconfigsupported", + FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsPassThroughSupported, { + "IsPassThroughSupported", "opa.portinfo.capabilitymask3.ispassthroughsupported", + FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsSharedSpaceSupported, { + "IsSharedSpaceSupported", "opa.portinfo.capabilitymask3.issharedspacesupported", + FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_reserved2, { + "IsVLMarkerSupported", "opa.portinfo.capabilitymask3.reserved2", + FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsVLMarkerSupported, { + "IsVLMarkerSupported", "opa.portinfo.capabilitymask3.isvlmarkersupported", + FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } + }, + { &hf_opa_PortInfo_CapabilityMask3_IsVLrSupported, { + "IsVLrSupported", "opa.portinfo.capabilitymask3.isvlrsupported", + FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL } + }, + /* End Capability Mask3 Flags */ + + { &hf_opa_PortInfo_OverallBufferSpace, { + "OverallBufferSpace", "opa.portinfo.overallbufferspace", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_DiagCode, { + "DiagCode", "opa.portinfo.diagcode", + FT_UINT16, BASE_HEX, VALS(DiagCode), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_ReplayDepth_BufferDepth, { + "Replay BufferDepth", "opa.portinfo.replaydepth.bufferdepth", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfo_ReplayDepth_WireDepth, { + "Replay WireDepth", "opa.portinfo.replaydepth.wiredepth", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* PortNeighrborNode*/ + { &hf_opa_PortInfo_PortNeighborMode_reserved, { + "PortNeighborMode Reserved (4 bits)", "opa.portinfo.portneighbormode.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortNeighborMode_MgmtAllowed, { + "PortNeighborMode MgmtAllowed", "opa.portinfo.portneighbormode.mgmtallowed", + FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortNeighborMode_NeighborFWAuthenBypass, { + "PortNeighborMode NeighborFWAuthenBypass", "opa.portinfo.portneighbormode.neighborfwauthenbypass", + FT_BOOLEAN, 8, TFS(&tfs_NeighborFWAuthenBypass), 0x04, NULL, HFILL } + }, + { &hf_opa_PortInfo_PortNeighborMode_NeighborNodeType, { + "PortNeighborMode NeighborNodeType", "opa.portinfo.portneighbormode.neighbornodetype", + FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL } + }, + + /* MTU*/ + { &hf_opa_PortInfo_MTU_reserved, { + "MTU Reserved (4 bits)", "opa.portinfo.mtu.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_PortInfo_MTU_Cap, { + "MTU Cap", "opa.portinfo.mtu.cap", + FT_UINT8, BASE_HEX, VALS(MTU), 0x0F, NULL, HFILL } + }, + { &hf_opa_PortInfo_Resp_reserved, { + "Resp Reserved (3 bits)", "opa.portinfo.resp.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_PortInfo_Resp_TimeValue, { + "Resp TimeValue", "opa.portinfo.resp.timevalue", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_PortInfo_LocalPortNum, { + "LocalPortNum", "opa.portinfo.localportnum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/******************* +* Port State Info * +*******************/ + + { &hf_opa_PortStates, { + "PortStates", "opa.portstates", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStates_reserved, { + "Reserved (10 bits)", "opa.portstates.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFF800000, NULL, HFILL } + }, + { &hf_opa_PortStates_LEDEnabled, { + "LEDEnabled", "opa.portstates.ledenabled", + FT_BOOLEAN, 32, NULL, 0x00400000, NULL, HFILL } + }, + { &hf_opa_PortStates_IsSMConfigurationStarted, { + "IsSMConfigurationStarted", "opa.portstates.issmconfigurationstarted", + FT_BOOLEAN, 32, NULL, 0x00200000, NULL, HFILL } + }, + { &hf_opa_PortStates_NeighborNormal, { + "NeighborNormal", "opa.portstates.neighbornormal", + FT_BOOLEAN, 32, NULL, 0x00100000, NULL, HFILL } + }, + { &hf_opa_PortStates_OfflineDisabledReason, { + "OfflineDisabledReason", "opa.portstates.offlinedisabledreason", + FT_UINT32, BASE_HEX, VALS(OfflineDisabledReason), 0x000F0000, NULL, HFILL } + }, + { &hf_opa_PortStates_PortUnsleepState, { + "PortUnsleepState", "opa.portstates.portunsleepstates", + FT_UINT32, BASE_HEX, VALS(PortPhysicalState), 0x0000F000, NULL, HFILL } + }, + { &hf_opa_PortStates_DownDefaultState, { + "DownDefaultState", "opa.portstates.downdefaultstate", + FT_UINT32, BASE_HEX, VALS(PortPhysicalState), 0x00000F00, NULL, HFILL } + }, + { &hf_opa_PortStates_PortPhysicalState, { + "PortPhysicalState", "opa.portstates.portphysicalstate", + FT_UINT32, BASE_HEX, VALS(PortPhysicalState), 0x000000F0, NULL, HFILL } + }, + { &hf_opa_PortStates_PortState, { + "PortState", "opa.portstates.portstate", + FT_UINT32, BASE_HEX, VALS(PortState), 0x0000000F, NULL, HFILL } + }, + { &hf_opa_PortStates_LinkWidthDowngradeTxActive, { + "LinkWidthDowngrade TxActive", "opa.portstates.linkwidthdowngradetxactive", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + { &hf_opa_PortStates_LinkWidthDowngradeRxActive, { + "LinkWidthDowngrade RxActive", "opa.portstates.linkwidthdowngradetxactive", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_linkwidth), 0x0, NULL, HFILL } + }, + +/***************** +* P_KeyTable * +*****************/ + + { &hf_opa_P_KeyTable, { + "P_Key Table", "opa.p_keytable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_P_KeyTable_MembershipType, { + "Membership Type", "opa.p_keytable.membershiptype", + FT_BOOLEAN, 16, TFS(&tfs_PKeyMembershipType), 0x8000, NULL, HFILL } + }, + { &hf_opa_P_KeyTable_P_KeyBase, { + "P_Key Base", "opa.p_keytable.p_keybase", + FT_UINT16, BASE_HEX, NULL, 0x7FFF, NULL, HFILL } + }, + +/************************** +* SLtoSC Mapping Table * +**************************/ + + { &hf_opa_SLtoSCMappingTable, { + "SL to SC Mapping Table", "opa.sltoscmappingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SLtoSCMappingTable_SLtoSC_HighBits, { + "Reserved (3 bits)", "opa.sltoscmappingtable.sltoschighbits", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_SLtoSCMappingTable_SLtoSC_LowBits, { + "SC", "opa.sltoscmappingtable.sltosclowbits", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + +/************************** +* SCtoSC Mapping Table * +**************************/ + + { &hf_opa_SCtoSCMappingTable, { + "SC to SC Mapping Table", "opa.sctoscmappingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SCtoSCMappingTable_SCtoSC_HighBits, { + "Reserved (3 bits)", "opa.sctoscmappingtable.sctoschighbits", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_SCtoSCMappingTable_SCtoSC_LowBits, { + "SC", "opa.sctoscmappingtable.sctosclowbits", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + +/************************** +* SCtoSL Mapping Table * +**************************/ + + { &hf_opa_SCtoSLMappingTable, { + "SC to SL Mapping Table", "opa.sctoslmappingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SCtoSLMappingTable_SCtoSL_HighBits, { + "Reserved (3 bits)", "opa.sctoslmappingtable.sctoslhighbits", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_SCtoSLMappingTable_SCtoSL_LowBits, { + "SL", "opa.sctoslmappingtable.sctosllowbits", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + +/************************** +* SCtoVLx Mapping Table * +**************************/ + + { &hf_opa_SCtoVLxMappingTable, { + "SC to VLx Mapping Table", "opa.sctovlxmappingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SCtoVLxMappingTable_SCtoVLx_HighBits, { + "Reserved (3 bits)", "opa.sctovlxmappingtable.sctovlxhighbits", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_SCtoVLxMappingTable_SCtoVLx_LowBits, { + "VL", "opa.sctovlxmappingtable.sctovlxlowbits", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + +/************************** +* VLArbitrationTable * +**************************/ + { &hf_opa_VLArbitrationTable, { + "VL Arbitration Table", "opa.vlarbitrationtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VLArbitrationTable_reserved, { + "Reserved (3 bits)", "opa.vlarbitrationtable.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_VLArbitrationTable_VL, { + "VL", "opa.vlarbitrationtable.vl", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_VLArbitrationTable_Weight, { + "Weight", "opa.vlarbitrationtable.weight", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VLArbitrationTable_Matrix, { + "Element", "opa.vlarbitrationtable.matrix", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/************************* +* LinearForwardingTable * +*************************/ + + { &hf_opa_LinearForwardingTable, { + "Linear Forwarding Table", "opa.linearforwardingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_LinearForwardingTable_Port, { + "Port", "opa.linearforwardingtable.port", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/**************************** +* MulticastForwardingTable * +****************************/ + + { &hf_opa_MulticastForwardingTable, { + "Multicast Forwarding Table", "opa.multicastforwardingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MulticastForwardingTable_PortMask, { + "Port Mask", "opa.multicastforwardingtable.portmask", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/**************************** +* PortGroupForwardingTable * +****************************/ + + { &hf_opa_PortGroupForwardingTable, { + "Port Group Forwarding Table", "opa.portgroupforwardingtable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortGroupForwardingTable_Port, { + "Port", "opa.portgroupforwardingtable.port", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/****************** +* PortGroupTable * +******************/ + + { &hf_opa_PortGroupTable, { + "Port Group Table", "opa.portgrouptable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortGroupTable_PortMask, { + "Port Mask", "opa.portgrouptable.portmask", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/********** +* SMInfo * +**********/ + + { &hf_opa_SMInfo, { + "SM Info", "opa.sminfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SMInfo_GUID, { + "GUID", "opa.sminfo.guid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SMInfo_SM_Key, { + "SM_Key", "opa.sminfo.sm_key", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SMInfo_ActCount, { + "ActCount", "opa.sminfo.actcount", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SMInfo_ElapsedTime, { + "ElapsedTime", "opa.sminfo.elapsedtime", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SMInfo_Priority, { + "Priority", "opa.sminfo.priority", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_SMInfo_ElevatedPriority, { + "ElevatedPriority", "opa.sminfo.elevatedpriority", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_SMInfo_InitialPriority, { + "InitialPriority", "opa.sminfo.initialpriority", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_SMInfo_SMState, { + "SMState", "opa.sminfo.smstate", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + +/*********** +* LedInfo * +***********/ + + { &hf_opa_LedInfo, { + "Led Info", "opa.ledinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_LedInfo_LedMask, { + "LedMask", "opa.ledinfo.ledmask", + FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL } + }, + { &hf_opa_LedInfo_reserved, { + "Reserved (31 bits)", "opa.ledinfo.reserved", + FT_UINT32, BASE_HEX, NULL, 0x7FFFFFFF, NULL, HFILL } + }, + +/************ +* CableInfo * +*************/ + + { &hf_opa_CableInfo, { + "Cable Info", "opa.cableinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_CableInfo_Data, { + "Data", "opa.cableinfo.data", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_CableInfo_DataStream, { + "Data", "opa.cableinfo.datastream", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + +/************ +* Aggregate * +*************/ + + { &hf_opa_Aggregate, { + "Aggregate", "opa.aggregate", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_Aggregate_AttributeID, { + "Attribute ID", "opa.aggregate.attrid", + FT_UINT16, BASE_HEX, VALS(SUBM_Attributes), 0x0, NULL, HFILL } + }, + { &hf_opa_Aggregate_Error, { + "Error", "opa.aggregate.error", + FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL } + }, + { &hf_opa_Aggregate_RequestLength, { + "Request Length", "opa.aggregate.requestlength", + FT_UINT16, BASE_DEC, NULL, 0x007F, NULL, HFILL } + }, + +/********************* +* BufferControlTable * +**********************/ + + { &hf_opa_BufferControlTable, { + "Buffer Control Table", "opa.buffercontroltable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_BufferControlTable_TxOverallSharedLimit, { + "Tx Overall Shared Limit", "opa.buffercontroltable.txoverallsharedlimit", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_BufferControlTable_TxDedicatedLimit, { + "Tx Dedictated Limit", "opa.buffercontroltable.txdedicatedlimit", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_BufferControlTable_TxSharedLimit, { + "Tx Shared Limit", "opa.buffercontroltable.txsharedlimit", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, +/******************* +* FabricInfoRecord * +********************/ + + { &hf_opa_FabricInfoRecord, { + "Fabric Info Record", "opa.fabricinforecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumHFIs, { + "Num HFIs", "opa.fabricinforecord.numhfis", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumSwitches, { + "Num Switches", "opa.fabricinforecord.numswitches", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumInternalHFILinks, { + "Num Internal HFI Links", "opa.fabricinforecord.numinternalhfilinks", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumExternalHFILinks, { + "Num External HFI Links", "opa.fabricinforecord.numexternalhfilinks", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumInternalISLs, { + "Num Internal ISLs", "opa.fabricinforecord.numinternalisls", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumExternalISLs, { + "Num External ISLs", "opa.fabricinforecord.numexternalisls", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumDegradedHFILinks, { + "Num Degraded HFI Links", "opa.fabricinforecord.numdegradedhfilinks", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumDegradedISLs, { + "Num Degraded ISLs", "opa.fabricinforecord.numdegradedisls", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumOmittedHFILinks, { + "Num Omitted HFI Links", "opa.fabricinforecord.numomittedhfilinks", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_NumOmittedISLs, { + "Num Omitted ISLs", "opa.fabricinforecord.numomittedisls", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_FabricInfoRecord_Reserved, { + "Reserved (92 Bytes)", "opa.fabricinforecord.reserved", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/***************** +* CongestionInfo * +******************/ + + { &hf_opa_CongestionInfo, { + "Congestion Info", "opa.congestioninfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_CongestionInfo_CongestionInfo, { + "Congestion Info", "opa.congestioninfo.congestioninfo", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_CongestionInfo_ControlTableCap, { + "Control Table Cap", "opa.congestioninfo.controltablecap", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_CongestionInfo_CongestionLogLength, { + "Congestion Log Length", "opa.congestioninfo.congestionloglength", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/*********************** +* SwitchCongestionLog * +***********************/ + + { &hf_opa_SwitchCongestionLog, { + "Switch Congestion Log", "opa.switchcongestionlog", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_LogType, { + "Log Type", "opa.switchcongestionlog.logtype", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_CongestionFlags, { + "Congestion Flags", "opa.switchcongestionlog.congestionflags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_LogEventsCounter, { + "Log Events Counter", "opa.switchcongestionlog.logeventscounter", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_CurrentTimeStamp, { + "Current Time Stamp", "opa.switchcongestionlog.currenttimestamp", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_PortMap, { + "Port Map", "opa.switchcongestionlog.portmap", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_SLID, { + "SLID", "opa.switchcongestionlog.slid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_DLID, { + "DLID", "opa.switchcongestionlog.dlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_SC, { + "SC", "opa.switchcongestionlog.sc", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_reserved, { + "Reserved (3 bits)", "opa.switchcongestionlog.reserved", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionLog_TimeStamp, { + "Time Stamp", "opa.switchcongestionlog.timestamp", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/*************************** +* SwitchCongestionSetting * +***************************/ + + { &hf_opa_SwitchCongestionSetting, { + "Switch Congestion Setting", "opa.switchcongestionsetting.controlmap", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_Control_Map, { + "Control Map", "opa.switchcongestionsetting.controlmap", + FT_UINT32, BASE_CUSTOM, CF_FUNC(cf_opa_mad_swcongestionsetting_controlmap), 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_Victim_Mask, { + "Victim Mask", "opa.switchcongestionsetting.victimmask", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_Credit_Mask, { + "Credit Mask", "opa.switchcongestionsetting.creditmask", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_Threshold, { + "Threshold", "opa.switchcongestionsetting.threshold", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_reserved1, { + "Reserved (4 bits)", "opa.switchcongestionsetting.reserved1", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_Packet_Size, { + "Packet Size", "opa.switchcongestionsetting.packetsize", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_CS_Threshold, { + "CS Threshold", "opa.switchcongestionsetting.csthreshold", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_reserved2, { + "Reserved (4 bits)", "opa.switchcongestionsetting.reserved2", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_CS_ReturnDelay, { + "CS ReturnDelay", "opa.switchcongestionsetting.csreturndelay", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchCongestionSetting_Marking_Rate, { + "Marking Rate", "opa.switchcongestionsetting.markingrate", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/******************************* +* SwitchPortCongestionSetting * +*******************************/ + + { &hf_opa_SwitchPortCongestionSetting, { + "Switch Port Congestion Setting", "opa.switchportcongestionsetting", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchPortCongestionSetting_Valid, { + "Valid", "opa.switchportcongestionsetting.valid", + FT_BOOLEAN, 8, TFS(&tfs_valid_invalid), 0x80, NULL, HFILL } + }, + { &hf_opa_SwitchPortCongestionSetting_Control_Type, { + "Control Type", "opa.switchportcongestionsetting.controltype", + FT_BOOLEAN, 8, TFS(&tfs_SwPortCongSetting_CtrlType), 0x40, NULL, HFILL } + }, + { &hf_opa_SwitchPortCongestionSetting_reserved, { + "Reserved (2 bits)", "opa.switchportcongestionsetting.reserved", + FT_UINT8, BASE_HEX, NULL, 0x30, NULL, HFILL } + }, + { &hf_opa_SwitchPortCongestionSetting_Threshold, { + "Threshold", "opa.switchportcongestionsetting.threshold", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_SwitchPortCongestionSetting_Packet_Size, { + "Packet Size", "opa.switchportcongestionsetting.packetsize", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_SwitchPortCongestionSetting_Marking_Rate, { + "Marking Rate", "opa.switchportcongestionsetting.markingrate", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/******************** +* HFICongestionLog * +********************/ + + { &hf_opa_HFICongestionLog, { + "HFI Congestion Log", "opa.hficongestionlog", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_LogType, { + "Log Type", "opa.hficongestionsetting.logtype", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_CongestionFlags, { + "Congestion Flags", "opa.hficongestionsetting.congestionflags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_ThresholdEventCounter, { + "Threshold Event Counter", "opa.hficongestionsetting.thresholdeventcounter", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_CurrentTimeStamp, { + "Current Time Stamp", "opa.hficongestionsetting.currenttimestamp", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_ThresholdCongestionEventMap, { + "Threshold Congestion Event Map", "opa.hficongestionsetting.thresholdcongestioneventmap", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_Local_QP_CN_Entry, { + "Local QP CN Entry", "opa.hficongestionsetting.localqpcnentry", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_Remote_QP_Number_CN_Entry, { + "Remote QP Number CN Entry", "opa.hficongestionsetting.remoteqpnumbercnentry", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_SL_CN_Entry, { + "Threshold Congestion Event Map", "opa.hficongestionsetting.thresholdcongestioneventmap", + FT_UINT8, BASE_HEX, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_Service_Type_CN_Entry, { + "Service Type CN Entry", "opa.hficongestionsetting.servicetypecnentry", + FT_UINT8, BASE_HEX, NULL, 0x0E, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_Remote_LID_CN_Entry, { + "LID CN Entry", "opa.hficongestionsetting.lidcnentry", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionLog_TimeStamp_CN_Entry, { + "TimeStamp CN Entry", "opa.hficongestionsetting.timestampcnentry", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/************************ +* HFICongestionSetting * +************************/ + + { &hf_opa_HFICongestionSetting, { + "HFI Congestion Setting", "opa.hficongestionsetting", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionSetting_Control_Map, { + "Control Map", "opa.hficongestionsetting.controlmap", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionSetting_Port_Control, { + "Port Control", "opa.hficongestionsetting.portcontrol", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionSetting_CCTI_Increase, { + "CCTI Increase", "opa.hficongestionsetting.cctiincrease", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionSetting_CCTI_Timer, { + "CCTI Timer", "opa.hficongestionsetting.cctitimer", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionSetting_TriggerThreshold, { + "Trigger Threshold", "opa.hficongestionsetting.triggerthreshold", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionSetting_CCTI_Min, { + "CCTI Min", "opa.hficongestionsetting.cctimin", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/***************************** +* HFICongestionControlTable * +*****************************/ + + { &hf_opa_HFICongestionControlTable, { + "HFI Congestion Control Table", "opa.hficongestioncontroltable", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionControlTable_CCTI_Limit, { + "CCTI Limit", "opa.hficongestioncontroltable.cctilimit", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_HFICongestionControlTable_CCT_Shift, { + "CCT Shift", "opa.hficongestioncontroltable.cctshift", + FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL } + }, + { &hf_opa_HFICongestionControlTable_CCT_Multiplier, { + "CCT Multiplier", "opa.hficongestioncontroltable.cctmultiplier", + FT_UINT16, BASE_HEX, NULL, 0x3FFF, NULL, HFILL } + }, + +/* SA */ + { &hf_opa_PortInfoRecord_LinkDownReason_NeighborLinkDownReason, { + "Neighbor Link Down Reason", "opa.portinforecord.linkdownreason.neighborlinkdownreason", + FT_UINT8, BASE_HEX, VALS(LinkDownReason), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfoRecord_LinkDownReason_LinkDownReason, { + "Link Down Reason", "opa.portinforecord.linkdownreason.linkdownreason", + FT_UINT8, BASE_HEX, VALS(LinkDownReason), 0x0, NULL, HFILL } + }, + { &hf_opa_PortInfoRecord_LinkDownReason_Timestamp, { + "Time Stamp", "opa.portinforecord.linkdownreason.timestamp", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* InformInfoRecord */ + /* InformInfo */ + { &hf_opa_InformInfo, { + "Inform Info", "opa.informinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_GID, { + "GID", "opa.informinfo.gid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_LIDRangeBegin, { + "LID Range Begin", "opa.informinfo.lidrangebegin", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_LIDRangeEnd, { + "LID Range End", "opa.informinfo.lidrangeend", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_IsGeneric, { + "Is Generic", "opa.informinfo.isgeneric", + FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } + }, + { &hf_opa_InformInfo_Subscribe, { + "Subscribe", "opa.informinfo.subscribe", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_Type, { + "Type", "opa.informinfo.type", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_TrapNumber, { + "Trap Number", "opa.informinfo.trapnumber", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_DeviceID, { + "Device ID", "opa.informinfo.deviceid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_QPN, { + "QPN", "opa.informinfo.qpn", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_reserved, { + "Reserved (3 bits)", "opa.informinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } + }, + { &hf_opa_InformInfo_RespTimeValue, { + "Resp Time Value", "opa.informinfo.resptimevalue", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_InformInfo_ProducerType, { + "Producer Type", "opa.informinfo.producertype", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_InformInfo_VendorID, { + "Vendor ID", "opa.informinfo.vendorid", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* LinkRecord */ + { &hf_opa_LinkRecord, { + "Link Record", "opa.linkrecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_LinkRecord_ToPort, { + "To Port", "opa.linkrecord.toport", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_LinkRecord_ToLID, { + "To LID", "opa.linkrecord.tolid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* ServiceRecord */ + { &hf_opa_ServiceRecord, { + "Service Record", "opa.servicerecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ServiceRecord_ServiceLease, { + "ServiceLease", "opa.servicerecord.servicelease", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ServiceRecord_ServiceKey, { + "ServiceKey", "opa.servicerecord.servicekey", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ServiceRecord_ServiceName, { + "ServiceName", "opa.servicerecord.servicename", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ServiceRecord_ServiceData, { + "ServiceData", "opa.servicerecord.servicedata", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* ServiceAssociationRecord */ + { &hf_opa_ServiceAssociationRecord_ServiceKey, { + "ServiceKey", "opa.serviceassociationrecord.servicekey", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ServiceAssociationRecord_ServiceName, { + "ServiceName", "opa.serviceassociationrecord.servicename", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + +/************** +* PathRecord * +**************/ + { &hf_opa_PathRecord, { + "Path Record", "opa.pathrecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_ServiceID, { + "Service ID", "opa.pathrecord.serviceid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID, { + "DGID", "opa.pathrecord.dgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + { &hf_opa_PathRecord_DGID_L2_8B, { + "8B Support", "opa.pathrecord.dgid.8b", + FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_L2_10B, { + "10B Support", "opa.pathrecord.dgid.10b", + FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_L2_9B, { + "9B Support", "opa.pathrecord.dgid.9b", + FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_L2_16B, { + "16B Support", "opa.pathrecord.dgid.16b", + FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_L2_reserved, { + "Reserved (4 bits)", "opa.pathrecord.dgid.reserved", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_LIDLen, { + "LID Length", "opa.pathrecord.dgid.lidlen", + FT_UINT8, BASE_DEC, VALS(pathrecord_lidlen), 0xC0, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_reserved, { + "Reserved (1 bit)", "opa.pathrecord.dgid.reserved", + FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_SL, { + "SL", "opa.pathrecord.dgid.sl", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_DLIDHigh, { + "DLID High", "opa.pathrecord.dgid.dlidhigh", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_SLIDHigh, { + "SLID High", "opa.pathrecord.dgid.slidhigh", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_DGID_DestGUID, { + "Dest GUID", "opa.pathrecord.dgid.destguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_SGID, { + "SGID", "opa.pathrecord.sgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_SGID_SubnetPrefix, { + "Subnet Prefix", "opa.pathrecord.sgid.subnetprefix", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_SGID_SourceGUID, { + "Source GUID", "opa.pathrecord.sgid.sourceguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_DLID, { + "DLID", "opa.pathrecord.dlid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_SLID, { + "SLID", "opa.pathrecord.slid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_RawTraffic, { + "Raw Traffic", "opa.pathrecord.rawtraffic", + FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL } + }, + { &hf_opa_PathRecord_reserved, { + "Reserved (3 bits)", "opa.pathrecord.reserved", + FT_UINT32, BASE_HEX, NULL, 0x70000000, NULL, HFILL } + }, + { &hf_opa_PathRecord_FlowLabel, { + "Flow Label", "opa.pathrecord.flowlabel", + FT_UINT32, BASE_HEX, NULL, 0x0FFFFF00, NULL, HFILL } + }, + { &hf_opa_PathRecord_HopLimit, { + "Hop Limit", "opa.pathrecord.hoplimit", + FT_UINT32, BASE_HEX, NULL, 0x000000FF, NULL, HFILL } + }, + { &hf_opa_PathRecord_TClass, { + "T Class", "opa.pathrecord.tclass", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_Reversible, { + "Reversible", "opa.pathrecord.reversible", + FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_PathRecord_NumbPath, { + "Numb Path", "opa.pathrecord.numbpath", + FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL } + }, + { &hf_opa_PathRecord_P_Key, { + "P_Key", "opa.pathrecord.p_key", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PathRecord_QosType, { + "Qos Type", "opa.pathrecord.qostype", + FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL } + }, + { &hf_opa_PathRecord_reserved2, { + "Reserved (2 bits)", "opa.pathrecord.reserved2", + FT_UINT16, BASE_HEX, NULL, 0x3000, NULL, HFILL } + }, + { &hf_opa_PathRecord_QosPriority, { + "Qos Priority", "opa.pathrecord.qospriority", + FT_UINT16, BASE_HEX, NULL, 0x0FF0, NULL, HFILL } + }, + { &hf_opa_PathRecord_SL, { + "SL", "opa.pathrecord.sl", + FT_UINT16, BASE_HEX, NULL, 0x000F, NULL, HFILL } + }, + { &hf_opa_PathRecord_MTUSelector, { + "MTU Selector", "opa.pathrecord.mtuselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_PathRecord_MTU, { + "MTU", "opa.pathrecord.mtu", + FT_UINT8, BASE_HEX, VALS(MTU), 0x3F, NULL, HFILL } + }, + { &hf_opa_PathRecord_RateSelector, { + "Rate Selector", "opa.pathrecord.rateselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_PathRecord_Rate, { + "Rate", "opa.pathrecord.rate", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_PathRecord_PacketLifeTimeSelector, { + "Packet Life Time Selector", "opa.pathrecord.packetlifetimeselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_PathRecord_PacketLifeTime, { + "Packet Life Time", "opa.pathrecord.packetlifetime", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_PathRecord_Preference, { + "Preference", "opa.pathrecord.preference", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/****************** +* MCMemberRecord * +******************/ + + { &hf_opa_MCMemberRecord, { + "MC Member Record", "opa.mcmemberrecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_Q_Key, { + "Q_Key", "opa.mcmemberrecord.q_key", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_MLID, { + "MLID", "opa.mcmemberrecord.mlid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_MTUSelector, { + "MTU Selector", "opa.mcmemberrecord.mtuselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_MTU, { + "MTU", "opa.mcmemberrecord.mtu", + FT_UINT8, BASE_HEX, VALS(MTU), 0x3F, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_TClass, { + "T Class", "opa.mcmemberrecord.tclass", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_P_Key, { + "P_Key", "opa.mcmemberrecord.p_key", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_RateSelector, { + "Rate Selector", "opa.mcmemberrecord.rateselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_Rate, { + "Rate", "opa.mcmemberrecord.rate", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_PacketLifeTimeSelector, { + "Packet Life Time Selector", "opa.mcmemberrecord.packetlifetimeselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_PacketLifeTime, { + "Packet Life Time", "opa.mcmemberrecord.packetlifetime", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_SL, { + "SL", "opa.mcmemberrecord.sl", + FT_UINT32, BASE_HEX, NULL, 0xF8000000, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_reserved, { + "Reserved (19 bits)", "opa.mcmemberrecord.reserved", + FT_UINT32, BASE_HEX, NULL, 0x07FFFF00, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_HopLimit, { + "Hop Limit", "opa.mcmemberrecord.hoplimit", + FT_UINT32, BASE_HEX, NULL, 0x000000FF, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_Scope, { + "Scope", "opa.mcmemberrecord.scope", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_reserved2, { + "Reserved (1 bit)", "opa.mcmemberrecord.reserved2", + FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_JoinSendOnlyMember, { + "Join Send Only Member", "opa.mcmemberrecord.joinsendonlymember", + FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_JoinNonMember, { + "Join Non Member", "opa.mcmemberrecord.joinnonmember", + FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_JoinFullMember, { + "Join Full Member", "opa.mcmemberrecord.joinfullmember", + FT_UINT8, BASE_HEX, NULL, 0x04, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_ProxyJoin, { + "Proxy Join", "opa.mcmemberrecord.proxyjoin", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_MCMemberRecord_reserved3, { + "Reserved (7 bits)", "opa.mcmemberrecord.reserved3", + FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL } + }, + + /* TraceRecord */ + { &hf_opa_TraceRecord, { + "Trace Record", "opa.tracerecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_IDGeneration, { + "ID Generation", "opa.tracerecord.idgeneration", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_NodeType, { + "Node Type", "opa.tracerecord.nodetype", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_NodeID, { + "Node ID", "opa.tracerecord.nodeid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_ChassisID, { + "Chassis ID", "opa.tracerecord.chassisid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_EntryPortID, { + "Entry Port ID", "opa.tracerecord.entryportid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_ExitPortID, { + "Exit Port ID", "opa.tracerecord.exitportid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_EntryPort, { + "Entry Port", "opa.tracerecord.entryport", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_TraceRecord_ExitPort, { + "Exit Port", "opa.tracerecord.exitport", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/******************* +* MultiPathRecord * +*******************/ + + { &hf_opa_MultiPathRecord, { + "Multi Path Record", "opa.multipathrecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_reserved, { + "Reserved (4 bits)", "opa.multipathrecord.reserved", + FT_UINT32, BASE_HEX, NULL, 0xF0000000, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_FlowLabel, { + "Flow Label", "opa.multipathrecord.flowlabel", + FT_UINT32, BASE_HEX, NULL, 0x0FFFFF00, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_HopLimit, { + "Hop Limit", "opa.multipathrecord.hoplimit", + FT_UINT32, BASE_HEX, NULL, 0x000000FF, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_TClass, { + "T Class", "opa.multipathrecord.tclass", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_Reversible, { + "Reversible", "opa.multipathrecord.reversible", + FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_NumbPath, { + "Numb Path", "opa.multipathrecord.numbpath", + FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_P_Key, { + "P_Key", "opa.multipathrecord.p_key", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_QoSType, { + "QoS Type", "opa.multipathrecord.qostype", + FT_UINT16, BASE_HEX, NULL, 0xC000, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_QoSPriority, { + "QoS Priority", "opa.multipathrecord.qospriority", + FT_UINT16, BASE_HEX, NULL, 0x3FC0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_reserved2, { + "Reserved (1 bit)", "opa.multipathrecord.reserved2", + FT_UINT16, BASE_HEX, NULL, 0x0020, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SL, { + "SL", "opa.multipathrecord.sl", + FT_UINT16, BASE_HEX, NULL, 0x001F, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_MTUSelector, { + "MTU Selector", "opa.multipathrecord.mtuselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_MTU, { + "MTU", "opa.multipathrecord.mtu", + FT_UINT8, BASE_HEX, VALS(MTU), 0x3F, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_RateSelector, { + "Rate Selector", "opa.multipathrecord.rateselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_Rate, { + "Rate", "opa.multipathrecord.rate", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_PacketLifeTimeSelector, { + "Packet Life Time Selector", "opa.multipathrecord.packetlifetimeselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_PacketLifeTime, { + "Packet Life Time", "opa.multipathrecord.packetlifetime", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_IndependenceSelector, { + "Independence Selector", "opa.multipathrecord.independenceselector", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SGIDScope, { + "SGID Scope", "opa.multipathrecord.sgidscope", + FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DGIDScope, { + "DGID Scope", "opa.multipathrecord.dgidscope", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SGIDCount, { + "SGID Count", "opa.multipathrecord.sgidcount", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DGIDCount, { + "DGID Count", "opa.multipathrecord.dgidcount", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SGID, { + "Source GID", "opa.multipathrecord.sgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DGID, { + "Dest GID", "opa.multipathrecord.dgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_L2_8B, { + "8B Support", "opa.multipathrecord.l2_8b", + FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_L2_10B, { + "10B Support", "opa.multipathrecord.l2_10b", + FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_L2_9B, { + "9B Support", "opa.multipathrecord.l2_9b", + FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_L2_16B, { + "16B Support", "opa.multipathrecord.l2_16b", + FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_reserved3, { + "Reserved (4 bits)", "opa.multipathrecord.reserved3", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + + /* GUID */ + { &hf_opa_MultiPathRecord_ServiceID, { + "Service ID", "opa.multipathrecord.serviceid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SubnetPrefix, { + "SubnetPrefix", "opa.multipathrecord.subnetprefix", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SGUIDScope, { + "SGUIDScope", "opa.multipathrecord.sguidscope", + FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DGUIDScope, { + "DGUIDScope", "opa.multipathrecord.dguidscope", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SGUIDCount, { + "SGUIDCount", "opa.multipathrecord.sguidcount", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DGUIDCount, { + "DGUIDCount", "opa.multipathrecord.dguidcount", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SGUID, { + "Source GUID", "opa.multipathrecord.sguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DGUID, { + "Dest GUID", "opa.multipathrecord.dguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + /* LID */ + { &hf_opa_MultiPathRecord_SLIDCount, { + "SLIDCount", "opa.multipathrecord.slidcount", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DLIDCount, { + "DLIDCount", "opa.multipathrecord.dlidcount", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_SLID, { + "Source LID", "opa.multipathrecord.slid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MultiPathRecord_DLID, { + "Dest LID", "opa.multipathrecord.dlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + +/******************* +* CableInfoRecord * +*******************/ + + { &hf_opa_CableInfoRecord, { + "Cable Info Record", "opa.cableinforecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_Lid, { + "LID", "opa.cableinforecord.lid", + FT_UINT32, BASE_HEX, NULL, 0xFE, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_Port, { + "Port", "opa.cableinforecord.port", + FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_Length, { + "Length", "opa.cableinforecord.length", + FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_reserved, { + "Reserved (1 bit)", "opa.cableinforecord.reserved", + FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_Address, { + "Address", "opa.cableinforecord.address", + FT_UINT16, BASE_HEX, NULL, 0xFFF0, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_PortType, { + "LID", "opa.cableinforecord.porttype", + FT_UINT16, BASE_HEX, NULL, 0x000F, NULL, HFILL } + }, + { &hf_opa_CableInfoRecord_Data, { + "LID", "opa.cableinforecord.data", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + +/************** +* PortStatus * +**************/ + + { &hf_opa_PortStatus, { + "Port Status", "opa.pm.portstatus", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortNumber, { + "Port Number", "opa.pm.portstatus.portnumber", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_VLSelectMask, { + "VL Select Mask", "opa.pm.portstatus.vlselectmask", + FT_UINT32, BASE_CUSTOM, CF_FUNC(cf_opa_mad_32b_mask), 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitData, { + "PortXmitData", "opa.pm.portstatus.portxmitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvData, { + "PortRcvData", "opa.pm.portstatus.portrcvdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitPkts, { + "PortXmitPkts", "opa.pm.portstatus.portxmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvPkts, { + "PortRcvPkts", "opa.pm.portstatus.portrcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortMulticastXmitPkts, { + "PortMulticastXmitPkts", "opa.pm.portstatus.portmulticastxmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortMulticastRcvPkts, { + "PortMulticastRcvPkts", "opa.pm.portstatus.portmulticastrcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitWait, { + "PortXmitWait", "opa.pm.portstatus.portxmitwait", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_SwPortCongestion, { + "SwPortCongestion", "opa.pm.portstatus.swportcongestion", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvFECN, { + "PortRcvFECN", "opa.pm.portstatus.portrecvfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvBECN, { + "PortRcvBECN", "opa.pm.portstatus.portrecvbecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pm.portstatus.portxmittimecong", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitWastedBW, { + "PortXmitWastedBW", "opa.pm.portstatus.portxmitwastedbw", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitWaitData, { + "PortXmitWaitData", "opa.pm.portstatus.portxmitwaitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvBubble, { + "PortRcvBubble", "opa.pm.portstatus.portrcvbubble", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortMarkFECN, { + "PortMarkFECN", "opa.pm.portstatus.portmarkfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvConstraintErrors, { + "PortRcvConstraintErrors", "opa.pm.portstatus.portrcvconstrainterrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvSwitchRelayErrors, { + "PortRcvSwitchRelayErrors", "opa.pm.portstatus.portrcvswitchrelayerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitDiscards, { + "PortXmitDiscards", "opa.pm.portstatus.portxmitdiscards", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortXmitConstraintErrors, { + "PortXmitConstraintErrors", "opa.pm.portstatus.portxmitconstrainterrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvRemotePhysicalErrors, { + "PortRcvRemotePhysicalErrors", "opa.pm.portstatus.portrcvremotephysicalerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pm.portstatus.locallinkintegrityerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortRcvErrors, { + "PortRcvErrors", "opa.pm.portstatus.portrcverrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_ExcessiveBufferOverruns, { + "ExcessiveBufferOverruns", "opa.pm.portstatus.excessivebufferoverruns", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_FMConfigErrors, { + "FMConfigErrors", "opa.pm.portstatus.fmconfigerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pm.portstatus.linkerrorrecovery", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_LinkDowned, { + "LinkDowned", "opa.pm.portstatus.linkdowned", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_UncorrectableErrors, { + "UncorrectableErrors", "opa.pm.portstatus.uncorrectableerrors", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_reserved, { + "Reserved", "opa.pm.portstatus.reserved", + FT_UINT8, BASE_DEC, NULL, 0xF8, NULL, HFILL } + }, + { &hf_opa_PortStatus_LinkQualityIndicator, { + "LinkQualityIndicator", "opa.pm.portstatus.linkqualityindicator", + FT_UINT8, BASE_DEC, VALS(LinkQualityIndicator), 0x07, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitData, { + "PortVLXmitData", "opa.pm.portstatus.vl.xmitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLRcvData, { + "PortVLRcvData", "opa.pm.portstatus.vl.rcvdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitPkts, { + "PortVLXmitPkts", "opa.pm.portstatus.vl.xmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLRcvPkts, { + "PortVLRcvPkts", "opa.pm.portstatus.vl.rcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitWait, { + "PortVLXmitWait", "opa.pm.portstatus.vl.xmitwait", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_SwPortVLCongestion, { + "SwPortVLCongestion", "opa.pm.portstatus.vl.swcongestion", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLRcvFECN, { + "PortVLRcvFECN", "opa.pm.portstatus.vl.rcvfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLRcvBECN, { + "PortVLRcvBECN", "opa.pm.portstatus.vl.rcvbecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitTimeCong, { + "PortVLXmitTimeCong", "opa.pm.portstatus.vl.xmittimecong", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitWastedBW, { + "PortVLXmitWastedBW", "opa.pm.portstatus.vl.xmitwastedbw", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitWaitData, { + "PortVLXmitWaitData", "opa.pm.portstatus.vl.xmitwaitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLRcvBubble, { + "PortVLRcvBubble", "opa.pm.portstatus.vl.rcvbubble", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLMarkFECN, { + "PortVLMarkFECN", "opa.pm.portstatus.vl.markfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PortStatus_PortVLXmitDiscards, { + "PortVLXmitDiscards", "opa.pm.portstatus.vl.xmitdiscards", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + +/******************* +* ClearPortStatus * +*******************/ + + { &hf_opa_ClearPortStatus, { + "Clear Port Status", "opa.pm.clearportstatus", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortSelectMask, { + "Port Select Mask", "opa.pm.clearportstatus.portselectmask", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_CounterSelectMask, { + "CounterSelectMask", "opa.pm.clearportstatus.counterselectmask", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitData, { + "PortXmitData", "opa.pm.clearportstatus.portxmitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x80000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvData, { + "PortRcvData", "opa.pm.clearportstatus.portrcvdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x40000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitPkts, { + "PortXmitPkts", "opa.pm.clearportstatus.portxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x20000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvPkts, { + "PortRcvPkts", "opa.pm.clearportstatus.portrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x10000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortMulticastXmitPkts, { + "PortMulticastXmitPkts", "opa.pm.clearportstatus.portmulticastxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x08000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortMulticastRcvPkts, { + "PortMulticastRcvPkts", "opa.pm.clearportstatus.portmulticastrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x04000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitWait, { + "PortXmitWait", "opa.pm.clearportstatus.portxmitwait", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x02000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_SwPortCongestion, { + "SwPortCongestion", "opa.pm.clearportstatus.swportcongestion", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x01000000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvFECN, { + "PortRcvFECN", "opa.pm.clearportstatus.portrecvfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00800000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvBECN, { + "PortRcvBECN", "opa.pm.clearportstatus.portrecvbecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00400000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pm.clearportstatus.portxmittimecong", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00200000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitWastedBW, { + "PortXmitWastedBW", "opa.pm.clearportstatus.portxmitwastedbw", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00100000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitWaitData, { + "PortXmitWaitData", "opa.pm.clearportstatus.portxmitwaitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00080000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvBubble, { + "PortRcvBubble", "opa.pm.clearportstatus.portrcvbubble", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00040000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortMarkFECN, { + "PortMarkFECN", "opa.pm.clearportstatus.portmarkfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00020000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvConstraintErrors, { + "PortRcvConstraintErrors", "opa.pm.clearportstatus.portrcvconstrainterrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00010000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvSwitchRelayErrors, { + "PortRcvSwitchRelayErrors", "opa.pm.clearportstatus.portrcvswitchrelayerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00008000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitDiscards, { + "PortXmitDiscards", "opa.pm.clearportstatus.portxmitdiscards", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00004000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortXmitConstraintErrors, { + "PortXmitConstraintErrors", "opa.pm.clearportstatus.portxmitconstrainterrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00002000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvRemotePhysicalErrors, { + "PortRcvRemotePhysicalErrors", "opa.pm.clearportstatus.portrcvremotephysicalerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00001000, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pm.clearportstatus.locallinkintegrityerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000800, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_PortRcvErrors, { + "PortRcvErrors", "opa.pm.clearportstatus.portrcverrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000400, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_ExcessiveBufferOverruns, { + "ExcessiveBufferOverruns", "opa.pm.clearportstatus.excessivebufferoverruns", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000200, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_FMConfigErrors, { + "FMConfigErrors", "opa.pm.clearportstatus.fmconfigerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000100, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pm.clearportstatus.linkerrorrecovery", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000080, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_LinkDowned, { + "LinkDowned", "opa.pm.clearportstatus.linkdowned", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000040, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_UncorrectableErrors, { + "UncorrectableErrors", "opa.pm.clearportstatus.uncorrectableerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000020, NULL, HFILL } + }, + { &hf_opa_ClearPortStatus_reserved, { + "Reserved (5 bits)", "opa.pm.clearportstatus.reserved", + FT_UINT32, BASE_DEC, NULL, 0x0000001F, NULL, HFILL } + }, + + /* DataPortCounters */ + { &hf_opa_DataPortCounters, { + "Data Port Counters", "opa.pm.dataportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortSelectMask, { + "Port Select Mask", "opa.pm.dataportcounters.portselectmask", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_VLSelectMask, { + "VL Select Mask", "opa.pm.dataportcounters.vlselectmask", + FT_UINT32, BASE_CUSTOM, CF_FUNC(cf_opa_mad_32b_mask), 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_resolution_reserved, { + "Reserved (24 bits)", "opa.pm.dataportcounters.reserved", + FT_UINT32, BASE_HEX, NULL, 0xFFFFFF00, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_LocalLinkIntegrityResolution, { + "Local Link Integrity Resolution", "opa.pm.dataportcounters.locallinkintegrityresolution", + FT_UINT32, BASE_DEC, NULL, 0x000000F0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_LinkErrorRecoveryResolution, { + "Link Error Recovery Resolution", "opa.pm.dataportcounters.linkerrorrecoveryresolution", + FT_UINT32, BASE_DEC, NULL, 0x0000000F, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortNumber, { + "PortNumber", "opa.pm.dataportcounters.portnumber", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_lqi_reserved, { + "Reserved (29 bits)", "opa.pm.dataportcounters.reserved", + FT_UINT32, BASE_DEC, NULL, 0xFFFFFFF8, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_LinkQualityIndicator, { + "LinkQualityIndicator", "opa.pm.dataportcounters.linkqualityindicator", + FT_UINT32, BASE_DEC, VALS(LinkQualityIndicator), 0x00000007, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortXmitData, { + "PortXmitData", "opa.pm.dataportcounters.portxmitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortRcvData, { + "PortRcvData", "opa.pm.dataportcounters.portrcvdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortXmitPkts, { + "PortXmitPkts", "opa.pm.dataportcounters.portxmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortRcvPkts, { + "PortRcvPkts", "opa.pm.dataportcounters.portrcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortMulticastXmitPkts, { + "PortMulticastXmitPkts", "opa.pm.dataportcounters.portmulticastxmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortMulticastRcvPkts, { + "PortMulticastRcvPkts", "opa.pm.dataportcounters.portmulticastrcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortXmitWait, { + "PortXmitWait", "opa.pm.dataportcounters.portxmitwait", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_SwPortCongestion, { + "SwPortCongestion", "opa.pm.dataportcounters.swportcongestion", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortRcvFECN, { + "PortRcvFECN", "opa.pm.dataportcounters.portrecvfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortRcvBECN, { + "PortRcvBECN", "opa.pm.dataportcounters.portrecvbecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pm.dataportcounters.portxmittimecong", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortXmitWastedBW, { + "PortXmitWastedBW", "opa.pm.dataportcounters.portxmitwastedbw", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortXmitWaitData, { + "PortXmitWaitData", "opa.pm.dataportcounters.portxmitwaitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortRcvBubble, { + "PortRcvBubble", "opa.pm.dataportcounters.portrcvbubble", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortMarkFECN, { + "PortMarkFECN", "opa.pm.dataportcounters.portmarkfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortErrorCounterSummary, { + "PortErrorCounterSummary", "opa.pm.dataportcounters.porterrorcountersummary", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLXmitData, { + "PortVLXmitData", "opa.pm.dataportcounters.vl.xmitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLRcvData, { + "PortVLRcvData", "opa.pm.dataportcounters.vl.rcvdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLXmitPkts, { + "PortVLXmitPkts", "opa.pm.dataportcounters.vl.xmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLRcvPkts, { + "PortVLRcvPkts", "opa.pm.dataportcounters.vl.rcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLXmitWait, { + "PortVLXmitWait", "opa.pm.dataportcounters.vl.xmitwait", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_SwPortVLCongestion, { + "SwPortVLCongestion", "opa.pm.dataportcounters.vl.swcongestion", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLRcvFECN, { + "PortVLRcvFECN", "opa.pm.dataportcounters.vl.rcvfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLRcvBECN, { + "PortVLRcvBECN", "opa.pm.dataportcounters.vl.rcvbecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLXmitTimeCong, { + "PortVLXmitTimeCong", "opa.pm.dataportcounters.vl.xmittimecong", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLXmitWastedBW, { + "PortVLXmitWastedBW", "opa.pm.dataportcounters.vl.xmitwastedbw", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLXmitWaitData, { + "PortVLXmitWaitData", "opa.pm.dataportcounters.vl.xmitwaitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLRcvBubble, { + "PortVLRcvBubble", "opa.pm.dataportcounters.vl.rcvbubble", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_DataPortCounters_PortVLMarkFECN, { + "PortVLMarkFECN", "opa.pm.dataportcounters.vl.markfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + + /* ErrorPortCounters */ + { &hf_opa_ErrorPortCounters, { + "Error Port Counters", "opa.pm.errorportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortSelectMask, { + "Port Select Mask", "opa.pm.errorportcounters.portselectmask", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_VLSelectMask, { + "VL Select Mask", "opa.pm.errorportcounters.vlselectmask", + FT_UINT32, BASE_CUSTOM, CF_FUNC(cf_opa_mad_32b_mask), 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortNumber, { + "PortNumber", "opa.pm.errorportcounters.portnumber", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortRcvConstraintErrors, { + "PortRcvConstraintErrors", "opa.pm.errorportcounters.portrcvconstrainterrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortRcvSwitchRelayErrors, { + "PortRcvSwitchRelayErrors", "opa.pm.errorportcounters.portrcvswitchrelayerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortXmitDiscards, { + "PortXmitDiscards", "opa.pm.errorportcounters.portxmitdiscards", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortXmitConstraintErrors, { + "PortXmitConstraintErrors", "opa.pm.errorportcounters.portxmitconstrainterrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortRcvRemotePhysicalErrors, { + "PortRcvRemotePhysicalErrors", "opa.pm.errorportcounters.portrcvremotephysicalerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pm.errorportcounters.locallinkintegrityerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortRcvErrors, { + "PortRcvErrors", "opa.pm.errorportcounters.portrcverrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_ExcessiveBufferOverruns, { + "ExcessiveBufferOverruns", "opa.pm.errorportcounters.excessivebufferoverruns", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_FMConfigErrors, { + "FMConfigErrors", "opa.pm.errorportcounters.fmconfigerrors", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pm.errorportcounters.linkerrorrecovery", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_LinkDowned, { + "LinkDowned", "opa.pm.errorportcounters.linkdowned", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_UncorrectableErrors, { + "UncorrectableErrors", "opa.pm.errorportcounters.uncorrectableerrors", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortCounters_PortVLXmitDiscards, { + "PortVLXmitDiscards", "opa.pm.errorportcounters.portvlxmitdiscards", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + + /* ErrorPortInfo */ + { &hf_opa_ErrorPortInfo, { + "Error Port Info", "opa.pm.errorportinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortSelectMask, { + "Port Select Mask", "opa.pm.errorportinfo.portselectmask", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvErrorInfo, { + "Port Rcv Error Info", "opa.pm.errorportinfo.errorinfoselectmask.portrcverrorinfo", + FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_ExcessiveBufferOverrunInfo, { + "ExcessiveBufferOverrunInfo", "opa.pm.errorportinfo.errorinfoselectmask.excessivebufferoverruninfo", + FT_BOOLEAN, 32, NULL, 0x40000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortXmitConstraintErrorInfo, { + "PortXmitConstraintErrorInfo", "opa.pm.errorportinfo.errorinfoselectmask.portxmitconstrainterrorinfo", + FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvConstraintErrorInfo, { + "PortRcvConstraintErrorInfo", "opa.pm.errorportinfo.errorinfoselectmask.portrcvconstrainterrorinfo", + FT_BOOLEAN, 32, NULL, 0x10000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_PortRcvSwitchRelayErrorInfo, { + "PortRcvSwitchRelayErrorInfo", "opa.pm.errorportinfo.errorinfoselectmask.portrcvswitchrelayerrorinfo", + FT_BOOLEAN, 32, NULL, 0x08000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_UncorrectableErrorInfo, { + "UncorrectableErrorInfo", "opa.pm.errorportinfo.errorinfoselectmask.uncorrectableerrorinfo", + FT_BOOLEAN, 32, NULL, 0x04000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_FMConfigErrorInfo, { + "Fmconfigerrorinfo", "opa.pm.errorportinfo.errorinfoselectmask.fmconfigerrorinfo", + FT_BOOLEAN, 32, NULL, 0x02000000, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ErrorInfoSelectMask_reserved, { + "Reserved (25 bits)", "opa.pm.errorportinfo.errorinfoselectmask.reserved", + FT_UINT32, BASE_HEX, NULL, 0x01FFFFFF, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortNumber, { + "Port Number", "opa.pm.errorportinfo.Portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.portrcverrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved, { + "Reserved", "opa.pm.errorportinfo.portrcverrorinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_ErrorCode, { + "ErrorCode", "opa.pm.errorportinfo.portrcverrorinfo.errorcode", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketFlit1, { + "PacketFlit1", "opa.pm.errorportinfo.portrcverrorinfo.packetflit1", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketFlit2, { + "PacketFlit2", "opa.pm.errorportinfo.portrcverrorinfo.packetflit2", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_Flit1Bits, { + "Flit1Bits", "opa.pm.errorportinfo.portrcverrorinfo.flit1bits", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_Flit2Bits, { + "Flit2Bits", "opa.pm.errorportinfo.portrcverrorinfo.flit2bits", + FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved2, { + "Reserved (4 bits)", "opa.pm.errorportinfo.portrcverrorinfo.reserved2", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_PacketBytes, { + "PacketBytes", "opa.pm.errorportinfo.portrcverrorinfo.packetbytes", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_FlitBits, { + "FlitBits", "opa.pm.errorportinfo.portrcverrorinfo.flitbits", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved3, { + "Reserved (6 bits)", "opa.pm.errorportinfo.portrcverrorinfo.reserved3", + FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvErrorInfo_reserved4, { + "Reserved (17 bytes)", "opa.pm.errorportinfo.portrcverrorinfo.reserved4", + FT_BYTES, FT_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.excessivebufferoverrunerrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_SC, { + "SC", "opa.pm.errorportinfo.excessivebufferoverrunerrorinfo.sc", + FT_UINT8, BASE_HEX, NULL, 0x7C, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_ExcessiveBufferOverrunErrorInfo_reserved, { + "Reserved (2 bits)", "opa.pm.errorportinfo.ExcessiveBufferOverrunErrorInfo.Reserved", + FT_UINT8, BASE_HEX, NULL, 0x03, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.portxmitconstrainterrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_reserved, { + "Reserved (7 bits)", "opa.pm.errorportinfo.portxmitconstrainterrorinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_P_Key, { + "P_Key", "opa.pm.errorportinfo.portxmitconstrainterrorinfo.pkey", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortXmitConstraintErrorInfo_SLID, { + "SLID", "opa.pm.errorportinfo.portxmitconstrainterrorinfo.slid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.portrcvconstrainterrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_reserved, { + "Reserved (7 bits)", "opa.pm.errorportinfo.portrcvconstrainterrorinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0x7F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_P_Key, { + "P_Key", "opa.pm.errorportinfo.portrcvconstrainterrorinfo.pkey", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvConstraintErrorInfo_SLID, { + "SLID", "opa.pm.errorportinfo.portrcvconstrainterrorinfo.slid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.portrcvswitchrelayerrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_reserved, { + "Reserved (3 bits)", "opa.pm.errorportinfo.portrcvswitchrelayerrorinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_ErrorCode, { + "ErrorCode", "opa.pm.errorportinfo.portrcvswitchrelayerrorinfo.errorcode", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_DLID, { + "DLID", "opa.pm.errorportinfo.portrcvswitchrelayerrorinfo.dlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_EgressPortNum, { + "EgressPortNum", "opa.pm.errorportinfo.portrcvswitchrelayerrorinfo.egressportnum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_PortRcvSwitchRelayErrorInfo_SC, { + "SC", "opa.pm.errorportinfo.portrcvswitchrelayerrorinfo.scorsl", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_UncorrectableErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.uncorrectableerrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_UncorrectableErrorInfo_reserved, { + "Reserved (3 bits)", "opa.pm.errorportinfo.uncorrectableerrorinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_UncorrectableErrorInfo_ErrorCode, { + "ErrorCode", "opa.pm.errorportinfo.uncorrectableerrorinfo.errorcode", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_Status, { + "Status", "opa.pm.errorportinfo.fmconfigerrorinfo.status", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_reserved, { + "Reserved (3 bits)", "opa.pm.errorportinfo.fmconfigerrorinfo.reserved", + FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_ErrorCode, { + "ErrorCode", "opa.pm.errorportinfo.fmconfigerrorinfo.errorcode", + FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_VL, { + "VL", "opa.pm.errorportinfo.fmconfigerrorinfo.vl", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_Distance, { + "Distance", "opa.pm.errorportinfo.fmconfigerrorinfo.distance", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_BadFlitBits, { + "BadFlitBits", "opa.pm.errorportinfo.fmconfigerrorinfo.badflitbits", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ErrorPortInfo_FMConfigErrorInfo_SC, { + "SC", "opa.pm.errorportinfo.fmconfigerrorinfo.sc", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* Gerneral PA */ + { &hf_opa_ImageID_imageNumber, { + "imageNumber", "opa.pa.imageid.imagenumber", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ImageID_imageOffset, { + "imageOffset", "opa.pa.imageid.imageoffset", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* GetGroupList */ + { &hf_opa_GetGroupList, { + "Group List", "opa.pa.getgrouplist", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupList_groupName, { + "Group Name", "opa.pa.getgrouplist.groupname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + + /* GetGroupInfo */ + { &hf_opa_GetGroupInfo, { + "Group Info", "opa.pa.getgroupinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_groupName, { + "Group Name", "opa.pa.getgroupinfo.groupname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_numInternalPorts, { + "numInternalPorts", "opa.pa.getgroupinfo.numinternalports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_numExternalPorts, { + "numExternalPorts", "opa.pa.getgroupinfo.numexternalports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_totalMBps, { + "totalMBps", "opa.pa.getgroupinfo.totalmbps", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_totalKPps, { + "totalKPps", "opa.pa.getgroupinfo.totalkpps", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_avgMBps, { + "avgMBps", "opa.pa.getgroupinfo.avgmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_minMBps, { + "minMBps", "opa.pa.getgroupinfo.minmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_maxMBps, { + "maxMBps", "opa.pa.getgroupinfo.maxmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_numBWBuckets, { + "numBWBuckets", "opa.pa.getgroupinfo.numbwbuckets", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_BWBuckets, { + "BWBuckets", "opa.pa.getgroupinfo.bwbuckets", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_avgKPps, { + "avgKPps", "opa.pa.getgroupinfo.avgkpps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_minKPps, { + "minKPps", "opa.pa.getgroupinfo.minkpps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_maxKPps, { + "maxKPps", "opa.pa.getgroupinfo.maxkpps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_pmaFailedPorts, { + "pmaFailedPorts", "opa.pa.getgroupinfo.pmafailedports", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_topoFailedPorts, { + "topoFailedPorts", "opa.pa.getgroupinfo.topofailedports", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_integrityErrors, { + "integrityErrors", "opa.pa.getgroupinfo.integrityerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_congestionErrors, { + "congestionErrors", "opa.pa.getgroupinfo.congestionerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_smaCongestionErrors, { + "smaCongestionErrors", "opa.pa.getgroupinfo.smacongestionerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_bubbleErrors, { + "bubbleErrors", "opa.pa.getgroupinfo.bubbleerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_securityErrors, { + "securityErrors", "opa.pa.getgroupinfo.securityerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_routingErrors, { + "routingErrors", "opa.pa.getgroupinfo.routingerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_utlizationPct10, { + "utlizationPct10", "opa.pa.getgroupinfo.utlizationpct10", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_computed_pct10), 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_discardsPct10, { + "discardsPct10", "opa.pa.getgroupinfo.discardspct10", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_computed_pct10), 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_maxInternalRate, { + "maxInternalRate", "opa.pa.getgroupinfo.maxinternalrate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_minInternalRate, { + "minInternalRate", "opa.pa.getgroupinfo.mininternalrate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_maxExternalRate, { + "maxExternalRate", "opa.pa.getgroupinfo.maxexternalrate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_minExternalRate, { + "minExternalRate", "opa.pa.getgroupinfo.minexternalrate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_maxInternalMBps, { + "maxInternalMBps", "opa.pa.getgroupinfo.maxinternalmbps", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupInfo_maxExternalMBps, { + "maxExternalMBps", "opa.pa.getgroupinfo.maxexternalmbps", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* GetGroupConfig */ + { &hf_opa_GetGroupConfig, { + "Group Config", "opa.pa.getgroupconfig", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupConfig_groupName, { + "Group Name", "opa.pa.getgroupconfig.groupname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupConfig_Port_NodeGUID, { + "NodeGUID", "opa.pa.getgroupconfig.port.nodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupConfig_Port_nodeDesc, { + "nodeDesc", "opa.pa.getgroupconfig.port.nodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupConfig_Port_NodeLID, { + "NodeLID", "opa.pa.getgroupconfig.port.nodelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetGroupConfig_Port_PortNumber, { + "PortNumber", "opa.pa.getgroupconfig.port.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* GetPortCounters */ + { &hf_opa_GetPortCounters, { + "Port Counters", "opa.pa.getportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_nodeLID, { + "nodeLID", "opa.pa.getportcounters.nodelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortNumber, { + "PortNumber", "opa.pa.getportcounters.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_flags, { + "flags", "opa.pa.getportcounters.flags", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitData, { + "PortXmitData", "opa.pa.getportcounters.portxmitdata", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvData, { + "PortRcvData", "opa.pa.getportcounters.portrcvdata", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitPkts, { + "PortXmitPkts", "opa.pa.getportcounters.portxmitpkts", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvPkts, { + "PortRcvPkts", "opa.pa.getportcounters.portrcvpkts", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortMulticastXmitPkts, { + "PortMulticastXmitPkts", "opa.pa.getportcounters.portmulticastxmitpkts", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortMulticastRcvPkts, { + "PortMulticastRcvPkts", "opa.pa.getportcounters.portmulticastrcvpkts", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pa.getportcounters.locallinkintegrityerrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_FMConfigErrors, { + "FMConfigErrors", "opa.pa.getportcounters.fmconfigerrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvErrors, { + "PortRcvErrors", "opa.pa.getportcounters.portrcverrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_ExcessiveBufferOverruns, { + "ExcessiveBufferOverruns", "opa.pa.getportcounters.excessivebufferoverruns", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvConstraintErrors, { + "PortRcvConstraintErrors", "opa.pa.getportcounters.portrcvconstrainterrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvSwitchRelayErrors, { + "PortRcvSwitchRelayErrors", "opa.pa.getportcounters.portrcvswitchrelayerrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitDiscards, { + "PortXmitDiscards", "opa.pa.getportcounters.portxmitdiscards", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitConstraintErrors, { + "PortXmitConstraintErrors", "opa.pa.getportcounters.portxmitconstrainterrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvRemotePhysicalErrors, { + "PortRcvRemotePhysicalErrors", "opa.pa.getportcounters.portrcvremotephysicalerrors", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_SwPortCongestion, { + "SwPortCongestion", "opa.pa.getportcounters.swportcongestion", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitWait, { + "PortXmitWait", "opa.pa.getportcounters.portxmitwait", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvFECN, { + "PortRcvFECN", "opa.pa.getportcounters.portrcvfecn", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvBECN, { + "PortRcvBECN", "opa.pa.getportcounters.portrcvbecn", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pa.getportcounters.portxmittimecong", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitWastedBW, { + "PortXmitWastedBW", "opa.pa.getportcounters.portxmitwastedbw", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortXmitWaitData, { + "PortXmitWaitData", "opa.pa.getportcounters.portxmitwaitdata", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortRcvBubble, { + "PortRcvBubble", "opa.pa.getportcounters.portrcvbubble", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_PortMarkFECN, { + "PortMarkFECN", "opa.pa.getportcounters.portmarkfecn", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pa.getportcounters.linkerrorrecovery", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_LinkDowned, { + "LinkDowned", "opa.pa.getportcounters.linkdowned", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_UncorrectableErrors, { + "UncorrectableErrors", "opa.pa.getportcounters.uncorrectableerrors", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_NumLanesDown, { + "NumLanesDown", "opa.pa.getportcounters.numlanesdown", + FT_UINT8, BASE_DEC, NULL, 0xF0, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_reserved, { + "Reserved", "opa.pa.getportcounters.reserved", + FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL } + }, + { &hf_opa_GetPortCounters_LinkQualityIndicator, { + "LinkQualityIndicator", "opa.pa.getportcounters.linkqualityindicator", + FT_UINT8, BASE_DEC, VALS(LinkQualityIndicator), 0x07, NULL, HFILL } + }, + + /* ClearPortCounters */ + { &hf_opa_ClearPortCounters, { + "Clear User Port Counters", "opa.pa.clearportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_nodeLID, { + "nodeLID", "opa.pa.clearportcounters.nodelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortNumber, { + "PortNumber", "opa.pa.clearportcounters.portnumber", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_CounterSelectMask, { + "CounterSelectMask", "opa.pa.clearportcounters.counterselectmask", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitData, { + "PortXmitData", "opa.pa.clearportcounters.portxmitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x80000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvData, { + "PortRcvData", "opa.pa.clearportcounters.portrcvdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x40000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitPkts, { + "PortXmitPkts", "opa.pa.clearportcounters.portxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x20000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvPkts, { + "PortRcvPkts", "opa.pa.clearportcounters.portrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x10000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortMulticastXmitPkts, { + "PortMulticastXmitPkts", "opa.pa.clearportcounters.portmulticastxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x08000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortMulticastRcvPkts, { + "PortMulticastRcvPkts", "opa.pa.clearportcounters.portmulticastrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x04000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitWait, { + "PortXmitWait", "opa.pa.clearportcounters.portxmitwait", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x02000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_SwPortCongestion, { + "SwPortCongestion", "opa.pa.clearportcounters.swportcongestion", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x01000000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvFECN, { + "PortRcvFECN", "opa.pa.clearportcounters.portrecvfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00800000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvBECN, { + "PortRcvBECN", "opa.pa.clearportcounters.portrecvbecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00400000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pa.clearportcounters.portxmittimecong", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00200000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitWastedBW, { + "PortXmitWastedBW", "opa.pa.clearportcounters.portxmitwastedbw", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00100000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitWaitData, { + "PortXmitWaitData", "opa.pa.clearportcounters.portxmitwaitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00080000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvBubble, { + "PortRcvBubble", "opa.pa.clearportcounters.portrcvbubble", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00040000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortMarkFECN, { + "PortMarkFECN", "opa.pa.clearportcounters.portmarkfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00020000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvConstraintErrors, { + "PortRcvConstraintErrors", "opa.pa.clearportcounters.portrcvconstrainterrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00010000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvSwitchRelayErrors, { + "PortRcvSwitchRelayErrors", "opa.pa.clearportcounters.portrcvswitchrelayerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00008000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitDiscards, { + "PortXmitDiscards", "opa.pa.clearportcounters.portxmitdiscards", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00004000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortXmitConstraintErrors, { + "PortXmitConstraintErrors", "opa.pa.clearportcounters.portxmitconstrainterrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00002000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvRemotePhysicalErrors, { + "PortRcvRemotePhysicalErrors", "opa.pa.clearportcounters.portrcvremotephysicalerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00001000, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pa.clearportcounters.locallinkintegrityerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000800, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_PortRcvErrors, { + "PortRcvErrors", "opa.pa.clearportcounters.portrcverrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000400, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_ExcessiveBufferOverruns, { + "ExcessiveBufferOverruns", "opa.pa.clearportcounters.excessivebufferoverruns", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000200, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_FMConfigErrors, { + "FMConfigErrors", "opa.pa.clearportcounters.fmconfigerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000100, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pa.clearportcounters.linkerrorrecovery", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000080, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_LinkDowned, { + "LinkDowned", "opa.pa.clearportcounters.linkdowned", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000040, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_UncorrectableErrors, { + "UncorrectableErrors", "opa.pa.clearportcounters.uncorrectableerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000020, NULL, HFILL } + }, + { &hf_opa_ClearPortCounters_reserved, { + "Reserved (5 bits)", "opa.pa.clearportcounters.reserved", + FT_UINT32, BASE_DEC, NULL, 0x0000001F, NULL, HFILL } + }, + + /* ClearAllPortCounters */ + { &hf_opa_ClearAllPortCounters, { + "Clear All User Port Counters", "opa.pa.clearallportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_CounterSelectMask, { + "CounterSelectMask", "opa.pa.clearallportcounters.counterselectmask", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitData, { + "PortXmitData", "opa.pa.clearallportcounters.portxmitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x80000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvData, { + "PortRcvData", "opa.pa.clearallportcounters.portrcvdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x40000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitPkts, { + "PortXmitPkts", "opa.pa.clearallportcounters.portxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x20000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvPkts, { + "PortRcvPkts", "opa.pa.clearallportcounters.portrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x10000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortMulticastXmitPkts, { + "PortMulticastXmitPkts", "opa.pa.clearallportcounters.portmulticastxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x08000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortMulticastRcvPkts, { + "PortMulticastRcvPkts", "opa.pa.clearallportcounters.portmulticastrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x04000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitWait, { + "PortXmitWait", "opa.pa.clearallportcounters.portxmitwait", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x02000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_SwPortCongestion, { + "SwPortCongestion", "opa.pa.clearallportcounters.swportcongestion", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x01000000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvFECN, { + "PortRcvFECN", "opa.pa.clearallportcounters.portrecvfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00800000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvBECN, { + "PortRcvBECN", "opa.pa.clearallportcounters.portrecvbecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00400000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pa.clearallportcounters.portxmittimecong", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00200000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitWastedBW, { + "PortXmitWastedBW", "opa.pa.clearallportcounters.portxmitwastedbw", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00100000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitWaitData, { + "PortXmitWaitData", "opa.pa.clearallportcounters.portxmitwaitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00080000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvBubble, { + "PortRcvBubble", "opa.pa.clearallportcounters.portrcvbubble", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00040000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortMarkFECN, { + "PortMarkFECN", "opa.pa.clearallportcounters.portmarkfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00020000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvConstraintErrors, { + "PortRcvConstraintErrors", "opa.pa.clearallportcounters.portrcvconstrainterrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00010000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvSwitchRelayErrors, { + "PortRcvSwitchRelayErrors", "opa.pa.clearallportcounters.portrcvswitchrelayerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00008000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitDiscards, { + "PortXmitDiscards", "opa.pa.clearallportcounters.portxmitdiscards", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00004000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortXmitConstraintErrors, { + "PortXmitConstraintErrors", "opa.pa.clearallportcounters.portxmitconstrainterrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00002000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvRemotePhysicalErrors, { + "PortRcvRemotePhysicalErrors", "opa.pa.clearallportcounters.portrcvremotephysicalerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00001000, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pa.clearallportcounters.locallinkintegrityerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000800, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_PortRcvErrors, { + "PortRcvErrors", "opa.pa.clearallportcounters.portrcverrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000400, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_ExcessiveBufferOverruns, { + "ExcessiveBufferOverruns", "opa.pa.clearallportcounters.excessivebufferoverruns", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000200, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_FMConfigErrors, { + "FMConfigErrors", "opa.pa.clearallportcounters.fmconfigerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000100, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pa.clearallportcounters.linkerrorrecovery", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000080, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_LinkDowned, { + "LinkDowned", "opa.pa.clearallportcounters.linkdowned", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000040, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_UncorrectableErrors, { + "UncorrectableErrors", "opa.pa.clearallportcounters.uncorrectableerrors", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00000020, NULL, HFILL } + }, + { &hf_opa_ClearAllPortCounters_reserved, { + "Reserved (5 bits)", "opa.pa.clearallportcounters.reserved", + FT_UINT32, BASE_DEC, NULL, 0x0000001F, NULL, HFILL } + }, + + /* PMConfig */ + { &hf_opa_PMConfig, { + "PM Config", "opa.pa.pmconfig", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_sweepInterval, { + "sweepInterval", "opa.pa.pmconfig.sweepinterval", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_maxClients, { + "maxClients", "opa.pa.pmconfig.maxclients", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_sizeHistory, { + "sizeHistory", "opa.pa.pmconfig.sizehistory", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_sizeFreeze, { + "sizeFreeze", "opa.pa.pmconfig.sizefreeze", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_lease, { + "lease", "opa.pa.pmconfig.lease", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_pmFlags, { + "pmFlags", "opa.pa.pmconfig.pmflags", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_PortXmitWait, { + "PortXmitWait", "opa.pa.pmconfig.portxmitwait", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_SwPortCongestion, { + "SwPortCongestion", "opa.pa.pmconfig.swportcongestion", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_PortRcvFECN, { + "PortRcvFECN", "opa.pa.pmconfig.portrcvfecn", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_PortRcvBECN, { + "PortRcvBECN", "opa.pa.pmconfig.portrcvbecn", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_PortXmitTimeCong, { + "PortXmitTimeCong", "opa.pa.pmconfig.portxmittimecong", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_PortMarkFECN, { + "PortMarkFECN", "opa.pa.pmconfig.portmarkfecn", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_integrityErrors, { + "integrityErrors", "opa.pa.pmconfig.integrityerrors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_congestionErrors, { + "congestionErrors", "opa.pa.pmconfig.congestionerrors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_bubbleErrors, { + "bubbleErrors", "opa.pa.pmconfig.bubbleerrors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_smaCongestionErrors, { + "smaCongestionErrors", "opa.pa.pmconfig.smacongestionerrors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_securityErrors, { + "securityErrors", "opa.pa.pmconfig.securityerrors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_routingErrors, { + "routingErrors", "opa.pa.pmconfig.routingerrors", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_LocalLinkIntegrityErrors, { + "LocalLinkIntegrityErrors", "opa.pa.pmconfig.locallinkintegrityerrors", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_PortRcvErrors, { + "PortRcvErrors", "opa.pa.pmconfig.portrcverrors", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_ExcessiveBufferOverrunErrors, { + "ExcessiveBufferOverrunErrors", "opa.pa.pmconfig.excessivebufferoverrunerrors", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_LinkErrorRecovery, { + "LinkErrorRecovery", "opa.pa.pmconfig.linkerrorrecovery", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_LinkDowned, { + "LinkDowned", "opa.pa.pmconfig.linkdowned", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_UncorrectableErrors, { + "UncorrectableErrors", "opa.pa.pmconfig.uncorrectableerrors", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_FMConfigErrors, { + "FMConfigErrors", "opa.pa.pmconfig.fmconfigerrors", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_LinkQualityIndicator, { + "LinkQualityIndicator", "opa.pa.pmconfig.linkqualityindicator", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_LinkWidthDowngrade, { + "LinkWidthDowngrade", "opa.pa.pmconfig.linkwidthdowngrade", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_memoryFootprint, { + "memoryFootprint", "opa.pa.pmconfig.memoryfootprint", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_maxAttempts, { + "maxAttempts", "opa.pa.pmconfig.maxattempts", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_respTimeout, { + "respTimeout", "opa.pa.pmconfig.resptimeout", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_minRespTimeout, { + "minRespTimeout", "opa.pa.pmconfig.minresptimeout", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_maxParallelNodes, { + "maxParallelNodes", "opa.pa.pmconfig.maxparallelnodes", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_pmaBatchSize, { + "pmaBatchSize", "opa.pa.pmconfig.pmabatchsize", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_PMConfig_errorClear, { + "errorClear", "opa.pa.pmconfig.errorclear", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* MoveFreezeFrame */ + { &hf_opa_MoveFreezeFrame_old, { + "Old Image", "opa.pa.movefreezeframe.old", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_MoveFreezeFrame_new, { + "New Image", "opa.pa.movefreezeframe.new", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + + /* GetFocusPorts */ + { &hf_opa_GetFocusPorts, { + "Focus Ports", "opa.pa.getfocusports", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_groupName, { + "Group Name", "opa.pa.getfocusports.groupname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_select, { + "select", "opa.pa.getfocusports.select", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_start, { + "start", "opa.pa.getfocusports.start", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_range, { + "range", "opa.pa.getfocusports.range", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_nodeLID, { + "nodeLID", "opa.pa.getfocusports.nodelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_portNumber, { + "portNumber", "opa.pa.getfocusports.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_rate, { + "rate", "opa.pa.getfocusports.rate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_mtu, { + "mtu", "opa.pa.getfocusports.mtu", + FT_UINT8, BASE_HEX, VALS(MTU), 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_localFlags, { + "localFlags", "opa.pa.getfocusports.localflags", + FT_UINT8, BASE_DEC, VALS(FocusPortFlags), 0xF0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_neighborFlags, { + "neighborFlags", "opa.pa.getfocusports.neighborflags", + FT_UINT8, BASE_DEC, VALS(FocusPortFlags), 0x0F, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_value, { + "value", "opa.pa.getfocusports.value", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_nodeGUID, { + "nodeGUID", "opa.pa.getfocusports.nodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_nodeDesc, { + "nodeDesc", "opa.pa.getfocusports.nodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_neighborLid, { + "neighborLid", "opa.pa.getfocusports.neighborlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_neighborPortNumber, { + "neighborPortNumber", "opa.pa.getfocusports.neighborportnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_neighborValue, { + "neighborValue", "opa.pa.getfocusports.neighborvalue", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_neighborGuid, { + "neighborGuid", "opa.pa.getfocusports.neighborguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetFocusPorts_neighborNodeDesc, { + "neighborNodeDesc", "opa.pa.getfocusports.neighbornodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + + /* GetImageInfo */ + { &hf_opa_GetImageInfo, { + "Image Info", "opa.pa.getimageinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_sweepStart, { + "sweepStart", "opa.pa.getimageinfo.sweepstart", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_sweepDuration, { + "sweepDuration", "opa.pa.getimageinfo.sweepduration", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numHFIPorts, { + "numHHIPorts", "opa.pa.getimageinfo.numhfiports", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numSwitchNodes, { + "numSwitchNodes", "opa.pa.getimageinfo.numswitchnodes", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numSwitchPorts, { + "numSwitchPorts", "opa.pa.getimageinfo.numswitchports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numLinks, { + "numLinks", "opa.pa.getimageinfo.numlinks", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numSMs, { + "numSMs", "opa.pa.getimageinfo.numsms", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numFailedNodes, { + "numFailedNodes", "opa.pa.getimageinfo.numfailednodes", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numFailedPorts, { + "numFailedPorts", "opa.pa.getimageinfo.numfailedports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numSkippedNodes, { + "numSkippedNodes", "opa.pa.getimageinfo.numskippednodes", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numSkippedPorts, { + "numSkippedPorts", "opa.pa.getimageinfo.numskippedports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_numUnexpectedClearPorts, { + "numUnexpectedClearPorts", "opa.pa.getimageinfo.numunexpectedclearports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_imageInterval, { + "imageInterval", "opa.pa.getimageinfo.imageinterval", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_lid, { + "lid", "opa.pa.getimageinfo.sminfo.lid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_state, { + "state", "opa.pa.getimageinfo.sminfo.state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_priority, { + "priority", "opa.pa.getimageinfo.sminfo.priority", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_portNumber, { + "portNumber", "opa.pa.getimageinfo.sminfo.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_smPortGuid, { + "portGUID", "opa.pa.getimageinfo.sminfo.portguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetImageInfo_smNodeDesc, { + "nodeDesc", "opa.pa.getimageinfo.sminfo.nodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + + /* GetVFList */ + { &hf_opa_GetVFList, { + "Vf List", "opa.pa.getvflist", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFList_vfName, { + "VF Name", "opa.pa.getvflist.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + + /* GetVFInfo */ + { &hf_opa_GetVFInfo, { + "VF Info", "opa.pa.getvfinfo", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_vfName, { + "VF Name", "opa.pa.getvfinfo.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_numPorts, { + "numPorts", "opa.pa.getvfinfo.numports", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_totalMBps, { + "totalMBps", "opa.pa.getvfinfo.totalmbps", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_totalKPps, { + "totalKPps", "opa.pa.getvfinfo.totalkpps", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_avgMBps, { + "avgMBps", "opa.pa.getvfinfo.avgmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_minMBps, { + "minMBps", "opa.pa.getvfinfo.minmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_maxMBps, { + "maxMBps", "opa.pa.getvfinfo.maxmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_numBWBuckets, { + "numBWBuckets", "opa.pa.getvfinfo.numbwbuckets", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_BWBuckets, { + "BWBuckets", "opa.pa.getvfinfo.bwbuckets", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_avgKPps, { + "avgKPps", "opa.pa.getvfinfo.avgkpps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_minKPps, { + "minKPps", "opa.pa.getvfinfo.minkpps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_maxKPps, { + "maxKPps", "opa.pa.getvfinfo.maxkpps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_pmaFailedPorts, { + "pmaFailedPorts", "opa.pa.getvfinfo.pmafailedports", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_topoFailedPorts, { + "topoFailedPorts", "opa.pa.getvfinfo.topofailedports", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_integrityErrors, { + "integrityErrors", "opa.pa.getvfinfo.integrityerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_congestionErrors, { + "congestionErrors", "opa.pa.getvfinfo.congestionerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_smaCongestionErrors, { + "smaCongestionErrors", "opa.pa.getvfinfo.smacongestionerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_bubbleErrors, { + "bubbleErrors", "opa.pa.getvfinfo.bubbleerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_securityErrors, { + "securityErrors", "opa.pa.getvfinfo.securityerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_routingErrors, { + "routingErrors", "opa.pa.getvfinfo.routingerrors", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_utlizationPct10, { + "utlizationPct10", "opa.pa.getvfinfo.utlizationpct10", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_computed_pct10), 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_discardsPct10, { + "discardsPct10", "opa.pa.getvfinfo.discardspct10", + FT_UINT16, BASE_CUSTOM, CF_FUNC(cf_opa_mad_computed_pct10), 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_maxInternalRate, { + "maxInternalRate", "opa.pa.getvfinfo.maxinternalrate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_minInternalRate, { + "minInternalRate", "opa.pa.getvfinfo.mininternalrate", + FT_UINT8, BASE_HEX, VALS(Rate), 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFInfo_maxInternalMBps, { + "maxInternalMBps", "opa.pa.getvfinfo.maxinternalmbps", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* GetVFConfig */ + { &hf_opa_GetVFConfig, { + "VF Config", "opa.pa.getvfconfig", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFConfig_vfName, { + "VF Name", "opa.pa.getvfconfig.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFConfig_Port_NodeGUID, { + "NodeGUID", "opa.pa.getvfconfig.port.nodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFConfig_Port_nodeDesc, { + "nodeDesc", "opa.pa.getvfconfig.port.nodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFConfig_Port_NodeLID, { + "NodeLID", "opa.pa.getvfconfig.port.nodelid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFConfig_Port_PortNumber, { + "PortNumber", "opa.pa.getvfconfig.port.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + + /* GetVFPortCounters */ + { &hf_opa_GetVFPortCounters, { + "VF Port Counters", "opa.pa.getvfportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_vfName, { + "VF Name", "opa.pa.getvfportcounters.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_nodeLID, { + "nodeLID", "opa.pa.getvfportcounters.nodelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortNumber, { + "PortNumber", "opa.pa.getvfportcounters.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_flags, { + "flags", "opa.pa.getvfportcounters.flags", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitData, { + "PortVFXmitData", "opa.pa.getvfportcounters.portvfxmitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFRcvData, { + "PortVFRcvData", "opa.pa.getvfportcounters.portvfrcvdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitPkts, { + "PortVFXmitPkts", "opa.pa.getvfportcounters.portvfxmitpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFRcvPkts, { + "PortVFRcvPkts", "opa.pa.getvfportcounters.portvfrcvpkts", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitDiscards, { + "PortVFXmitDiscards", "opa.pa.getvfportcounters.portvfxmitdiscards", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_SwPortVFCongestion, { + "SwPortCongestion", "opa.pa.getvfportcounters.swportcongestion", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitWait, { + "PortVFXmitWait", "opa.pa.getvfportcounters.portvfxmitwait", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFRcvFECN, { + "PortVFRcvFECN", "opa.pa.getvfportcounters.portvfrcvfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFRcvBECN, { + "PortVFRcvBECN", "opa.pa.getvfportcounters.portvfrcvbecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitTimeCong, { + "PortVFXmitTimeCong", "opa.pa.getvfportcounters.portvfxmittimecong", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitWastedBW, { + "PortVFXmitWastedBW", "opa.pa.getvfportcounters.portvfxmitwastedbw", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFXmitWaitData, { + "PortVFXmitWaitData", "opa.pa.getvfportcounters.portvfxmitwaitdata", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFRcvBubble, { + "PortVFRcvBubble", "opa.pa.getvfportcounters.portvfrcvbubble", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFPortCounters_PortVFMarkFECN, { + "PortVFMarkFECN", "opa.pa.getvfportcounters.portvfmarkfecn", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } + }, + + /* ClearVFPortCounters */ + { &hf_opa_ClearVFPortCounters, { + "Clear VF Port Counters", "opa.pa.clearvfportcounters", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_vfName, { + "VF Name", "opa.pa.clearvfportcounters.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_nodeLID, { + "nodeLID", "opa.pa.clearvfportcounters.nodelid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortNumber, { + "PortNumber", "opa.pa.clearvfportcounters.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_CounterSelectMask, { + "CounterSelectMask", "opa.pa.clearvfportcounters.counterselectmask", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitData, { + "PortVFXmitData", "opa.pa.clearvfportcounters.portvfxmitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x80000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFRcvData, { + "PortVFRcvData", "opa.pa.clearvfportcounters.portvfrcvdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x40000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitPkts, { + "PortVFXmitPkts", "opa.pa.clearvfportcounters.portvfxmitpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x20000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFRcvPkts, { + "PortVFRcvPkts", "opa.pa.clearvfportcounters.portvfrcvpkts", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x10000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitDiscards, { + "PortVFXmitDiscards", "opa.pa.clearvfportcounters.portvfxmitdiscards", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x08000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_SwPortVFCongestion, { + "SwPortVFCongestion", "opa.pa.clearvfportcounters.swportvfcongestion", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x04000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitWait, { + "PortVFXmitWait", "opa.pa.clearvfportcounters.portvfxmitwait", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x02000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFRcvFECN, { + "PortVFRcvFECN", "opa.pa.clearvfportcounters.portvfrcvfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x01000000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFRcvBECN, { + "PortVFRcvBECN", "opa.pa.clearvfportcounters.portvfrcvbecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00800000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitTimeCong, { + "PortVFXmitTimeCong", "opa.pa.clearvfportcounters.portvfxmittimecong", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00400000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitWastedBW, { + "PortVFXmitWastedBW", "opa.pa.clearvfportcounters.portvfxmitwastedbw", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00200000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFXmitWaitData, { + "PortVFXmitWaitData", "opa.pa.clearvfportcounters.portvfxmitwaitdata", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00100000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFRcvBubble, { + "PortVFRcvBubble", "opa.pa.clearvfportcounters.portvfrcvbubble", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00080000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_PortVFMarkFECN, { + "PortVFMarkFECN", "opa.pa.clearvfportcounters.portvfmarkfecn", + FT_BOOLEAN, 32, TFS(&tfs_clear_dont_clear), 0x00040000, NULL, HFILL } + }, + { &hf_opa_ClearVFPortCounters_reserved, { + "Reserved", "opa.pa.clearvfportcounters.reserved", + FT_UINT32, BASE_HEX, NULL, 0x0003FFFF, NULL, HFILL } + }, + + /* GetVFFocusPorts */ + { &hf_opa_GetVFFocusPorts, { + "VF Focus Ports", "opa.pa.getvffocusports", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_vfName, { + "VF Name", "opa.pa.getvffocusports.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_select, { + "select", "opa.pa.getvffocusports.select", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_start, { + "start", "opa.pa.getvffocusports.start", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_range, { + "range", "opa.pa.getvffocusports.range", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_nodeLID, { + "nodeLID", "opa.pa.getvffocusports.nodelid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_portNumber, { + "portNumber", "opa.pa.getvffocusports.portnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_rate, { + "rate", "opa.pa.getvffocusports.rate", + FT_UINT8, BASE_HEX, VALS(Rate), 0xF8, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_mtu, { + "mtu", "opa.pa.getvffocusports.mtu", + FT_UINT8, BASE_HEX, VALS(MTU), 0x07, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_localFlags, { + "localFlags", "opa.pa.getvffocusports.localflags", + FT_UINT8, BASE_DEC, VALS(FocusPortFlags), 0xF0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_neighborFlags, { + "neighborFlags", "opa.pa.getvffocusports.neighborflags", + FT_UINT8, BASE_DEC, VALS(FocusPortFlags), 0x0F, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_value, { + "value", "opa.pa.getvffocusports.value", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_nodeGUID, { + "nodeGUID", "opa.pa.getvffocusports.nodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_nodeDesc, { + "nodeDesc", "opa.pa.getvffocusports.nodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_neighborLid, { + "neighborLid", "opa.pa.getvffocusports.neighborlid", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_neighborPortNumber, { + "neighborPortNumber", "opa.pa.getvffocusports.neighborportnumber", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_neighborValue, { + "neighborValue", "opa.pa.getvffocusports.neighborvalue", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_neighborGuid, { + "neighborGuid", "opa.pa.getvffocusports.neighborguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_GetVFFocusPorts_neighborNodeDesc, { + "neighborNodeDesc", "opa.pa.getvffocusports.neighbornodedesc", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + + /* VFInfoRecord */ + { &hf_opa_VFInfoRecord, { + "VF Info Record", "opa.vfinforecorf", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_vfIndex, { + "VF Index", "opa.vfinforecorf.vfindex", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_pKey, { + "P Key", "opa.vfinforecord.pkey", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_vfName, { + "VF Name", "opa.vfinforecord.vfname", + FT_STRING, STR_ASCII, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_MGID, { + "M GID", "opa.vfinforecord.mgid", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_SelectFlags, { + "Select Flags", "opa.vfinforecord.selectflags", + FT_UINT8, BASE_HEX, NULL, 0xC0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_reserved, { + "Reserved (1 bit)", "opa.vfinforecord.reserved", + FT_UINT8, BASE_HEX, NULL, 0x20, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_SL, { + "SL", "opa.vfinforecord.sl", + FT_UINT8, BASE_HEX, NULL, 0x1F, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_MTUSpecified, { + "MTU Specified", "opa.vfinforecord.mtuspecified", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_reserved2, { + "Reserved (1 bit)", "opa.vfinforecord.reserved2", + FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_MTU, { + "MTU", "opa.vfinforecord.mtu", + FT_UINT8, BASE_HEX, VALS(MTU), 0x3F, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_RateSpecified, { + "Rate Specified", "opa.vfinforecord.ratespecified", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_reserved4, { + "Reserved (1 bit)", "opa.vfinforecord.reserved4", + FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_Rate, { + "Rate", "opa.vfinforecord.rate", + FT_UINT8, BASE_HEX, NULL, 0x3F, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_PktLifeSpecified, { + "Packet Life Time Specified", "opa.vfinforecord.pktlifespecified", + FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_reserved5, { + "Reserved (4 bits)", "opa.vfinforecord.reserved5", + FT_UINT8, BASE_HEX, NULL, 0x78, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_PktLifeTimeInc, { + "Packet Life Time", "opa.vfinforecord.pktlifetime", + FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_OptionFlags, { + "Option Flags", "opa.vfinforecord.optionflags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_BandwidthPercent, { + "Bandwidth Percent", "opa.vfinforecord.bandwidthpercent", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_reserved6, { + "Reserved (7 bits)", "opa.vfinforecord.reserved6", + FT_UINT8, BASE_HEX, NULL, 0xFE, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_Priority, { + "Priority", "opa.vfinforecord.priority", + FT_UINT8, BASE_HEX, NULL, 0x01, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_RoutingSLs, { + "Routing SLs", "opa.vfinforecord.routingsls", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_VFInfoRecord_reserved7, { + "Rezerved (24 Bytes)", "opa.vfinforecord.reserved7", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + /* QuarantinedNodeRecord */ + { &hf_opa_QuarantinedNodeRecord, { + "Quarantined Node Record", "opa.quarantinednoderecord", + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_TrustedLid, { + "Trusted LID", "opa.quarantinednoderecord.trustedlid", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_TrustedNodeGUID, { + "Trusted Node GUID", "opa.quarantinednoderecord.trustednodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_TrustedPortNum, { + "Trusted Port Num", "opa.quarantinednoderecord.trustedportnum", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_TrustedNeighborNodeGUID, { + "Trusted Neighbor Node GUID", "opa.quarantinednoderecord.trustedneighbornodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_QuarantineReasons, { + "Quarantine Reasons", "opa.quarantinednoderecord.quarantinereasons", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_ExpectedNodeDesc, { + "Expected Node Desc", "opa.quarantinednoderecord.expectednodedesc", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_ExpectedNodeGUID, { + "Expected Node GUID", "opa.quarantinednoderecord.expectednodeguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + }, + { &hf_opa_QuarantinedNodeRecord_ExpectedPortGUID, { + "Expected Port GUID", "opa.quarantinednoderecord.expectedportguid", + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL } + } + }; + + static gint *ett[] = { + &ett_payload, + &ett_sm_lid, + &ett_sm_dr, + &ett_sa, + &ett_pm, + &ett_pa, + &ett_mad, + &ett_mad_status, + &ett_mad_attributemod, + &ett_rmpp, + &ett_sm_attribute, + &ett_sa_attribute, + &ett_pm_attribute, + &ett_pa_attribute, + /* Common */ + &ett_noticestraps, + &ett_datadetails, + &ett_datadetails_trap259datavalid, + &ett_informinfo, + &ett_classportinfo, + &ett_classportinfo_redirect, + &ett_classportinfo_trap, + /* SM */ + &ett_nodedescription, + &ett_nodeinfo, + &ett_switchinfo, + &ett_switchinfo_switchcapabilitymask, + &ett_portinfo, + &ett_portinfo_vl, + &ett_portinfo_link, + &ett_portinfo_portmode, + &ett_portinfo_flitcontrol, + &ett_portinfo_porterroraction, + &ett_portinfo_neighbormtu, + &ett_portinfo_xmitq, + &ett_portinfo_capmask, + &ett_portinfo_capmask3, + &ett_portstates, + &ett_pkeytable, + &ett_pkeytable_block, + &ett_sltoscmapping, + &ett_sltoscmapping_block, + &ett_sctoscmapping, + &ett_sctoscmapping_block, + &ett_sctoslmapping, + &ett_sctoslmapping_block, + &ett_sctovlxmappingtable, + &ett_sctovlxmappingtable_block, + &ett_vlarbitrationtable, + &ett_vlarbitrationtable_port, + &ett_linearforwardingtable, + &ett_linearforwardingtable_block, + &ett_multicastforwardingtable, + &ett_multicastforwardingtable_block, + &ett_portgroupforwardingtable, + &ett_portgroupforwardingtable_block, + &ett_portgrouptable, + &ett_portgrouptable_block, + &ett_sminfo, + &ett_ledinfo, + &ett_cableinfo, + &ett_aggregate, + &ett_buffercontroltable, + &ett_buffercontroltable_port, + &ett_fabricinforecord, + &ett_congestioninfo, + &ett_switchcongestionlog, + &ett_switchcongestionlog_entry, + &ett_switchcongestionsetting, + &ett_switchportcongestionsetting, + &ett_switchportcongestionsetting_port, + &ett_hficongestionlog, + &ett_hficongestionlog_entry, + &ett_hficongestionsetting, + &ett_hficongestioncontroltable, + &ett_hficongestioncontroltable_block, + /* SA */ + &ett_portinforecord_linkdownreason, + &ett_portinforecord_linkdownreason_entry, + &ett_scmappingrecord, + &ett_lftrecord, + &ett_linkrecord, + &ett_servicerecord, + &ett_pathrecord, + &ett_pathrecord_dgid, + &ett_pathrecord_sgid, + &ett_mcmemberrecord, + &ett_tracerecord, + &ett_multipathrecord_gid, + &ett_multipathrecord_guid, + &ett_multipathrecord_lid, + &ett_cableinforecord, + &ett_serviceassocrecord, + &ett_sctoslmappingtablerecord, + &ett_portgroupforwardingtablerecord, + &ett_vfinforecord, + &ett_quarantinednoderecord, + /* PM */ + &ett_portstatus, + &ett_portstatus_vl, + &ett_clearportstatus, + &ett_clearportstatus_counterselectmask, + &ett_dataportcounters, + &ett_dataportcounters_port, + &ett_dataportcounters_vl, + &ett_errorportcounters, + &ett_errorportcounters_port, + &ett_errorportinfo, + &ett_errorportinfoport, + &ett_errorportinfo_portrcverrorinfo, + &ett_errorportinfo_excessivebufferoverruninfo, + &ett_errorportinfo_portxmitconstrainterrorinfo, + &ett_errorportinfo_portrcvconstrainterrorinfo, + &ett_errorportinfo_portrcvswitchrelayerrorinfo, + &ett_errorportinfo_uncorrectableerrorinfo, + &ett_errorportinfo_fmconfigerrorinfo, + /* PA */ + &ett_getgrouplist, + &ett_getgroupinfo, + &ett_getgroupinfoutilstats, + &ett_getgroupinfoutilbuckets, + &ett_getgroupinfoerrorsummary, + &ett_getgroupinfoerrintegritybucket, + &ett_getgroupinfoerrcongestionbucket, + &ett_getgroupinfoerrsmacongestionbucket, + &ett_getgroupinfoerrbubblebucket, + &ett_getgroupinfoerrsecuritybucket, + &ett_getgroupinfoerrroutingbucket, + &ett_getportcounters, + &ett_clearportcounters, + &ett_clearportcounters_counterselectmask, + &ett_clearallportcounters, + &ett_clearallportcounters_counterselectmask, + &ett_pmconfig, + &ett_getgroupconfig, + &ett_getgroupconfigport, + &ett_movefreezeframeold, + &ett_movefreezeframenew, + &ett_getfocusports, + &ett_getfocusportsport, + &ett_getimageinfo, + &ett_getimageinfosm, + &ett_getvflist, + &ett_getvfinfo, + &ett_getvfinfoutilstats, + &ett_getvfinfoutilbuckets, + &ett_getvfinfoerrorsummary, + &ett_getvfinfoerrintegritybucket, + &ett_getvfinfoerrcongestionbucket, + &ett_getvfinfoerrsmacongestionbucket, + &ett_getvfinfoerrbubblebucket, + &ett_getvfinfoerrsecuritybucket, + &ett_getvfinfoerrroutingbucket, + &ett_getvfconfig, + &ett_getvfconfigport, + &ett_getvffocusports, + &ett_getvffocusportsport, + &ett_getvfportcounters, + &ett_clearvfportcounters, + &ett_clearvfportcounters_counterselectmask + }; + + static ei_register_info ei[] = { + { &ei_opa_mad_error, { + "opa.mad.error", PI_RESPONSE_CODE, PI_WARN, + "MAD Status Error", EXPFILL } + }, + { &ei_opa_mad_no_attribute_dissector, { + "opa.mad.noattributedissector", PI_UNDECODED, PI_NOTE, + "Attribute Dissector Not Implemented", EXPFILL } + }, + { &ei_opa_mad_attribute_modifier_error_nonzero, { + "opa.mad.attributemodifiererrornonzero", PI_PROTOCOL, PI_WARN, + "Attribute Modifier is unexpectedly Non-zero", EXPFILL } + }, + { &ei_opa_rmpp_undecoded, { + "opa.rmpp.undecoded", PI_UNDECODED, PI_NOTE, + "RMPP Records Undecoded", EXPFILL } + }, + { &ei_opa_aggregate_error, { + "opa.aggregate.error", PI_RESPONSE_CODE, PI_WARN, + "Aggregate Error", EXPFILL } + } + }; + + proto_opa_mad = proto_register_protocol("Intel Omni-Path MAD", "OPA MAD", "opa.mad"); + opa_mad_handle = register_dissector("opa.mad", dissect_opa_mad, proto_opa_mad); + + proto_register_field_array(proto_opa_mad, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + expert_opa_mad = expert_register_protocol(proto_opa_mad); + expert_register_field_array(expert_opa_mad, ei, array_length(ei)); + + range_convert_str(&global_mad_vendor_class, OPA_VENDOR_RANGE_STR, 0xFF); + range_convert_str(&global_mad_vendor_rmpp_class, OPA_VENDOR_RMPP_RANGE_STR, 0xFF); + range_convert_str(&global_mad_application_class, OPA_APPLICATION_RANGE_STR, 0xFF); + range_convert_str(&global_mad_reserved_class, OPA_RESERVED_RANGE_STR, 0xFF); + range_convert_str(&global_mad_opa_class, OPA_MGMTCLASS_RANGE_STR, 0xFF); + + opa_mad_module = prefs_register_protocol(proto_opa_mad, proto_reg_handoff_opa_mad); + prefs_register_bool_preference(opa_mad_module, "parse_mad_error", + "Enable Parsing of Mad Payload on Mad Status Error", + "Attempt to parse mad payload even when MAD.Status is non-zero", + &pref_parse_on_mad_status_error); +} + +void proto_reg_handoff_opa_mad(void) +{ + eth_handle = find_dissector("eth"); + ethertype_dissector_table = find_dissector_table("ethertype"); +} + +/* +* Editor modelines - https://www.wireshark.org/tools/modelines.html +* +* Local variables: +* c-basic-offset: 4 +* tab-width: 8 +* indent-tabs-mode: nil +* End: +* +* vi: set shiftwidth=4 tabstop=8 expandtab: +* :indentSize=4:tabSize=8:noTabs=true: +*/ |