diff options
author | Birol Capa <birol.capa@siemens.com> | 2017-03-16 13:55:17 +0300 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-03-17 20:51:19 +0000 |
commit | cea41157fde841ca8771ef1f9919ecba09de4faa (patch) | |
tree | 4b82daa8defb299c67e683a69ebb2689175350f4 /plugins | |
parent | c9efc5d0ab19044554ca3cb3829c668a2555a525 (diff) | |
download | wireshark-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.c | 118 |
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[] = { |