summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorBirol Capa <birol.capa@siemens.com>2017-03-16 13:55:17 +0300
committerMichael Mann <mmann78@netscape.net>2017-03-17 20:51:19 +0000
commitcea41157fde841ca8771ef1f9919ecba09de4faa (patch)
tree4b82daa8defb299c67e683a69ebb2689175350f4 /plugins
parentc9efc5d0ab19044554ca3cb3829c668a2555a525 (diff)
downloadwireshark-cea41157fde841ca8771ef1f9919ecba09de4faa.tar.gz
PROFINET: Support the new BlockVersion 1.1 of the record PDPortStatistic.
PDPortStatistic with BlockVersionLow = 1 has 2 bytes CounterStatus while PDPortStatistic with BlockVersionLow = 0 has 2 bytes Padding. Change-Id: I39783ad29993501249bfa7875760b505ded6a8e9 Reviewed-on: https://code.wireshark.org/review/20563 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/profinet/packet-dcerpc-pn-io.c118
1 files changed, 110 insertions, 8 deletions
diff --git a/plugins/profinet/packet-dcerpc-pn-io.c b/plugins/profinet/packet-dcerpc-pn-io.c
index 2f75ee34ac..36fae81bff 100644
--- a/plugins/profinet/packet-dcerpc-pn-io.c
+++ b/plugins/profinet/packet-dcerpc-pn-io.c
@@ -454,6 +454,14 @@ static int hf_pn_io_MultipleInterfaceMode_NameOfDevice = -1;
static int hf_pn_io_MultipleInterfaceMode_reserved_1 = -1;
static int hf_pn_io_MultipleInterfaceMode_reserved_2 = -1;
/* added Portstatistics */
+static int hf_pn_io_pdportstatistic_counter_status = -1;
+static int hf_pn_io_pdportstatistic_counter_status_ifInOctets = -1;
+static int hf_pn_io_pdportstatistic_counter_status_ifOutOctets = -1;
+static int hf_pn_io_pdportstatistic_counter_status_ifInDiscards = -1;
+static int hf_pn_io_pdportstatistic_counter_status_ifOutDiscards = -1;
+static int hf_pn_io_pdportstatistic_counter_status_ifInErrors = -1;
+static int hf_pn_io_pdportstatistic_counter_status_ifOutErrors = -1;
+static int hf_pn_io_pdportstatistic_counter_status_reserved = -1;
static int hf_pn_io_pdportstatistic_ifInOctets = -1;
static int hf_pn_io_pdportstatistic_ifOutOctets = -1;
static int hf_pn_io_pdportstatistic_ifInDiscards = -1;
@@ -816,6 +824,7 @@ static gint ett_pn_io_rs_adjust_info = -1;
static gint ett_pn_io_soe_adjust_specifier = -1;
static gint ett_pn_io_sr_properties = -1;
static gint ett_pn_io_line_delay = -1;
+static gint ett_pn_io_counter_status = -1;
static gint ett_pn_io_GroupProperties = -1;
@@ -2951,6 +2960,16 @@ static const range_string pn_io_cable_delay_value[] = {
{ 0, 0, NULL }
};
+static const true_false_string pn_io_pdportstatistic_counter_status_contents = {
+ "The contents of the field are invalid. They shall be set to zero.",
+ "The contents of the field are valid"
+};
+
+static const value_string pn_io_pdportstatistic_counter_status_reserved[] = {
+ { 0x00, "Reserved" },
+ { 0, NULL }
+};
+
static int
dissect_profidrive_value(tvbuff_t *tvb, gint offset, packet_info *pinfo,
proto_tree *tree, guint8 *drep, guint8 format_val)
@@ -6817,14 +6836,47 @@ dissect_PDPortStatistic_block(tvbuff_t *tvb, int offset,
packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint8 *drep, guint8 u8BlockVersionHigh, guint8 u8BlockVersionLow)
{
guint32 u32StatValue;
-
- if (u8BlockVersionHigh != 1 || u8BlockVersionLow != 0) {
+ guint16 u16CounterStatus;
+ proto_item *sub_item;
+ proto_tree *sub_tree;
+ if (u8BlockVersionHigh != 1 || (u8BlockVersionLow != 0 && u8BlockVersionLow != 1)) {
expert_add_info_format(pinfo, item, &ei_pn_io_block_version,
"Block version %u.%u not implemented yet!", u8BlockVersionHigh, u8BlockVersionLow);
return offset;
}
- /* Padding */
- offset = dissect_pn_align4(tvb, offset, pinfo, tree);
+ switch (u8BlockVersionLow) {
+ case(0):
+ /* Padding */
+ offset = dissect_pn_align4(tvb, offset, pinfo, tree);
+ break;
+ case(1):
+ sub_item = proto_tree_add_item(tree, hf_pn_io_pdportstatistic_counter_status, tvb, offset, 2, ENC_BIG_ENDIAN);
+ sub_tree = proto_item_add_subtree(sub_item, ett_pn_io_counter_status);
+ /* bit 0 */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_ifInOctets, &u16CounterStatus);
+ /* bit 1 */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_ifOutOctets, &u16CounterStatus);
+ /* bit 2 */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_ifInDiscards, &u16CounterStatus);
+ /* bit 3 */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_ifOutDiscards, &u16CounterStatus);
+ /* bit 4 */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_ifInErrors, &u16CounterStatus);
+ /* bit 5 */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_ifOutErrors, &u16CounterStatus);
+ /* bit 6-15 */
+ offset = dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree, drep,
+ hf_pn_io_pdportstatistic_counter_status_reserved, &u16CounterStatus);
+ break;
+ default: /* will not execute because of the line preceding the switch */
+ break;
+ }
offset = dissect_dcerpc_uint32(tvb, offset, pinfo, tree, drep,
hf_pn_io_pdportstatistic_ifInOctets, &u32StatValue);
@@ -13309,11 +13361,60 @@ proto_register_pn_io (void)
NULL, HFILL }
},
{ &hf_pn_io_MultipleInterfaceMode_NameOfDevice,
- { "MultipleInterfaceMode.NameOfDevice", "pn_io.MultipleInterfaceMode_NameOfDevice", FT_UINT32, BASE_HEX, VALS(pn_io_MultipleInterfaceMode_NameOfDevice), 0x01, NULL, HFILL }},
+ { "MultipleInterfaceMode.NameOfDevice", "pn_io.MultipleInterfaceMode_NameOfDevice",
+ FT_UINT32, BASE_HEX, VALS(pn_io_MultipleInterfaceMode_NameOfDevice), 0x01,
+ NULL, HFILL }
+ },
{ &hf_pn_io_MultipleInterfaceMode_reserved_1,
- { "MultipleInterfaceMode.Reserved_1", "pn_io.MultipleInterfaceMode_reserved_1", FT_UINT32, BASE_HEX, NULL, 0xFFFE, NULL, HFILL }},
+ { "MultipleInterfaceMode.Reserved_1", "pn_io.MultipleInterfaceMode_reserved_1",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFE,
+ NULL, HFILL }
+ },
{ &hf_pn_io_MultipleInterfaceMode_reserved_2,
- { "MultipleInterfaceMode.Reserved_2", "pn_io.MultipleInterfaceMode_reserved_2", FT_UINT32, BASE_HEX, NULL, 0xFFFF0000, NULL, HFILL }},
+ { "MultipleInterfaceMode.Reserved_2", "pn_io.MultipleInterfaceMode_reserved_2",
+ FT_UINT32, BASE_HEX, NULL, 0xFFFF0000,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status,
+ { "CounterStatus", "pn_io.CounterStatus",
+ FT_UINT16, BASE_HEX, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_ifInOctets,
+ { "CounterStatus.ifInOctets", "pn_io.CounterStatus.ifInOctets",
+ FT_BOOLEAN, 16, TFS(&pn_io_pdportstatistic_counter_status_contents), 0x0001,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_ifOutOctets,
+ { "CounterStatus.ifOutOctets", "pn_io.CounterStatus.ifOutOctets",
+ FT_BOOLEAN, 16, TFS(&pn_io_pdportstatistic_counter_status_contents), 0x0002,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_ifInDiscards,
+ { "CounterStatus.ifInDiscards", "pn_io.CounterStatus.ifInDiscards",
+ FT_BOOLEAN, 16, TFS(&pn_io_pdportstatistic_counter_status_contents), 0x0004,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_ifOutDiscards,
+ { "CounterStatus.ifOutDiscards", "pn_io.CounterStatus.ifOutDiscards",
+ FT_BOOLEAN, 16, TFS(&pn_io_pdportstatistic_counter_status_contents), 0x0008,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_ifInErrors,
+ { "CounterStatus.ifInErrors", "pn_io.CounterStatus.ifInErrors",
+ FT_BOOLEAN, 16, TFS(&pn_io_pdportstatistic_counter_status_contents), 0x0010,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_ifOutErrors,
+ { "CounterStatus.ifOutErrors", "pn_io.CounterStatus.ifOutErrors",
+ FT_BOOLEAN, 16, TFS(&pn_io_pdportstatistic_counter_status_contents), 0x0020,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_pdportstatistic_counter_status_reserved,
+ { "CounterStatus.Reserved", "pn_io.CounterStatus.Reserved",
+ FT_UINT16, BASE_HEX, VALS(pn_io_pdportstatistic_counter_status_reserved), 0xFFC0,
+ NULL, HFILL }
+ },
{ &hf_pn_io_pdportstatistic_ifInOctets,
{ "ifInOctets", "pn_io.ifInOctets",
FT_UINT32, BASE_HEX, NULL, 0x0,
@@ -14699,7 +14800,8 @@ proto_register_pn_io (void)
&ett_pn_io_asset_management_block,
&ett_pn_io_am_location,
&ett_pn_io_sr_properties,
- &ett_pn_io_line_delay
+ &ett_pn_io_line_delay,
+ &ett_pn_io_counter_status
};
static ei_register_info ei[] = {