aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/profinet/packet-dcerpc-pn-io.c89
1 files changed, 72 insertions, 17 deletions
diff --git a/plugins/profinet/packet-dcerpc-pn-io.c b/plugins/profinet/packet-dcerpc-pn-io.c
index f00c758965..1f7ffffa7c 100644
--- a/plugins/profinet/packet-dcerpc-pn-io.c
+++ b/plugins/profinet/packet-dcerpc-pn-io.c
@@ -689,6 +689,8 @@ static int hf_pn_io_rs_specifier_sequence = -1;
static int hf_pn_io_rs_specifier_reserved = -1;
static int hf_pn_io_rs_specifier_specifier = -1;
static int hf_pn_io_rs_time_stamp = -1;
+static int hf_pn_io_rs_time_stamp_status = -1;
+static int hf_pn_io_rs_time_stamp_value = -1;
static int hf_pn_io_rs_minus_error = -1;
static int hf_pn_io_rs_plus_error = -1;
static int hf_pn_io_rs_extension_block_type = -1;
@@ -770,6 +772,7 @@ static gint ett_pn_io_rs_event_block = -1;
static gint ett_pn_io_rs_adjust_block = -1;
static gint ett_pn_io_rs_event_data_extension = -1;
static gint ett_pn_io_rs_specifier = -1;
+static gint ett_pn_io_rs_time_stamp = -1;
static gint ett_pn_io_am_device_identification = -1;
static gint ett_pn_io_rs_reason_code = -1;
static gint ett_pn_io_soe_digital_input_current_value = -1;
@@ -2777,7 +2780,7 @@ static const range_string pn_io_rs_block_type[] = {
/* Following ranges are used for events */
{ 0x0000, 0x0000, "reserved" },
{ 0x0001, 0x3FFF, "Manufacturer specific" },
- { 0x4000, 0x4000, "Stop observer - RS_StopObserver" },
+ { 0x4000, 0x4000, "Stop observer - Observer Status Observer" },
{ 0x4001, 0x4001, "Buffer observer - RS_BufferObserver" },
{ 0x4002, 0x4002, "Time status observer - RS_TimeStatus" },
{ 0x4003, 0x4003, "System redundancy layer observer - RS_SRLObserver" },
@@ -2804,6 +2807,13 @@ static const value_string pn_io_rs_specifier_specifier[] = {
{ 0, NULL }
};
+static const value_string pn_io_rs_time_stamp_status[] = {
+ { 0x0, "TimeStamp related to global synchronized time" },
+ { 0x1, "TimeStamp related to local time" },
+ { 0x2, "TimeStamp related to local (arbitrary timescale) time" },
+ { 0, NULL }
+};
+
static const value_string pn_io_rs_reason_code_reason[] = {
{ 0x00000000, "Reserved" },
{ 0x00000001, "Observed data status unclear" },
@@ -2813,7 +2823,7 @@ static const value_string pn_io_rs_reason_code_reason[] = {
};
static const value_string pn_io_rs_reason_code_detail[] = {
- { 0x00000000, "Reserved" },
+ { 0x00000000, "No Detail" },
/* 0x0001 - 0xFFFF Reserved */
{ 0, NULL }
};
@@ -3451,6 +3461,10 @@ dissect_RS_EventDataCommon(tvbuff_t *tvb, int offset,
guint16 u16RSPlusError;
proto_item *sub_item;
proto_tree *sub_tree;
+ proto_item *sub_item_time_stamp;
+ proto_tree *sub_tree_time_stamp;
+ nstime_t timestamp;
+ guint16 u16RSTimeStampStatus;
/* RS_AddressInfo */
offset = dissect_RS_AddressInfo(tvb, offset, pinfo, tree, drep, u16RSBodyLength);
@@ -3473,7 +3487,23 @@ dissect_RS_EventDataCommon(tvbuff_t *tvb, int offset,
*u16RSBodyLength -= 2;
/* RS_TimeStamp */
- proto_tree_add_item(tree, hf_pn_io_rs_time_stamp, tvb, offset, 12, ENC_ASCII|ENC_NA);
+ sub_item_time_stamp = proto_tree_add_item(tree, hf_pn_io_rs_time_stamp, tvb, offset, 12, ENC_NA);
+ sub_tree_time_stamp = proto_item_add_subtree(sub_item_time_stamp, ett_pn_io_rs_time_stamp);
+
+ /* RS_TimeStamp.Status */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree_time_stamp, drep,
+ hf_pn_io_rs_time_stamp_status, &u16RSTimeStampStatus);
+
+ /* RS_TimeStamp.TimeStamp */
+
+ /* Start after from 2 bytes Status */
+ timestamp.secs = (time_t)tvb_get_ntoh48(tvb, offset + 2);
+
+ /* Start after from 4 bytes timestamp.secs */
+ timestamp.nsecs = (int)tvb_get_ntohl(tvb, offset + 8);
+
+ /* Start after from 2 bytes Status and get all 10 bytes */
+ proto_tree_add_time(sub_tree_time_stamp, hf_pn_io_rs_time_stamp_value, tvb, offset + 2, 10, &timestamp);
*u16RSBodyLength -= 12;
offset += 12;
@@ -3543,6 +3573,10 @@ dissect_RS_EventDataExtension_Data(tvbuff_t *tvb, int offset,
proto_item *sub_item;
proto_tree *sub_tree;
+ nstime_t timestamp;
+ guint16 u16RSTimeStampStatus;
+ proto_item *sub_item_time_stamp;
+ proto_tree *sub_tree_time_stamp;
switch (*u16RSBlockType) {
case(0x4000): /* RS_StopObserver */
@@ -3566,28 +3600,38 @@ dissect_RS_EventDataExtension_Data(tvbuff_t *tvb, int offset,
break;
case(0x4002): /* RS_TimeStatus */
+ /* Padding 1 + 1 + 16 + 8 = 26 or 1 + 1 + 16 + 8 + 12 = 38 */
+ /* Therefore we need 2 byte padding to make the block u32 aligned */
+ offset = dissect_pn_padding(tvb, offset, pinfo, tree, 2);
+ *u8RSExtensionBlockLength -= 2;
+
/* RS_DomainIdentification */
- proto_tree_add_item(tree, hf_pn_io_rs_domain_identification, tvb, offset, u8LengthRSDomainIdentification, ENC_ASCII|ENC_NA);
+ proto_tree_add_item(tree, hf_pn_io_rs_domain_identification, tvb, offset, u8LengthRSDomainIdentification, ENC_NA);
offset += u8LengthRSDomainIdentification;
*u8RSExtensionBlockLength -= 16;
/* RS_MasterIdentification */
- proto_tree_add_item(tree, hf_pn_io_rs_master_identification, tvb, offset, u8LengthRSMasterIdentification, ENC_ASCII|ENC_NA);
+ proto_tree_add_item(tree, hf_pn_io_rs_master_identification, tvb, offset, u8LengthRSMasterIdentification, ENC_NA);
offset += u8LengthRSMasterIdentification;
*u8RSExtensionBlockLength -= 8;
- /* RS_TimeStamp */
if (*u8RSExtensionBlockLength > 2)
{
- proto_tree_add_item(tree, hf_pn_io_rs_time_stamp, tvb, offset, 12, ENC_ASCII|ENC_NA);
- *u8RSExtensionBlockLength -= 12;
+ /* RS_TimeStamp */
+ sub_item_time_stamp = proto_tree_add_item(tree, hf_pn_io_rs_time_stamp, tvb, offset, 12, ENC_NA);
+ sub_tree_time_stamp = proto_item_add_subtree(sub_item_time_stamp, ett_pn_io_rs_time_stamp);
+
+ /* RS_TimeStamp.Status */
+ dissect_dcerpc_uint16(tvb, offset, pinfo, sub_tree_time_stamp, drep,
+ hf_pn_io_rs_time_stamp_status, &u16RSTimeStampStatus);
+
+ /* RS_TimeStamp.TimeStamp */
+ timestamp.secs = (time_t)tvb_get_ntoh48(tvb, offset + 2); // Start after from 2 bytes Status
+ timestamp.nsecs = (int)tvb_get_ntohl(tvb, offset + 8); // Start after from 4 bytes timestamp.secs
+ // Start after from 2 bytes Status and get all 10 bytes
+ proto_tree_add_time(sub_tree_time_stamp, hf_pn_io_rs_time_stamp_value, tvb, offset + 2, 10, &timestamp);
offset += 12;
}
-
- /* Padding 1 + 1 + 16 + 8 = 26 or 1 + 1 + 16 + 8 + 12 = 38 */
- /* Therefore we need 2 byte padding to make the block u32 aligned */
- offset = dissect_pn_padding(tvb, offset, pinfo, tree, 2);
- *u8RSExtensionBlockLength -= 2;
break;
case(0x4003): /* RS_SRLObserver */
offset = dissect_pn_user_data(tvb, offset, pinfo, tree, *u8RSExtensionBlockLength, "UserData");
@@ -13681,8 +13725,18 @@ proto_register_pn_io (void)
NULL, HFILL }
},
{ &hf_pn_io_rs_time_stamp,
- { "RS_TimeStamp", "pn_io.rs_time_stamp",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ { "RS_TimeStamp", "pn_io.rs_time_stamp",
+ FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_rs_time_stamp_status,
+ { "RS_TimeStamp.Status", "pn_io.rs_time_stamp.status",
+ FT_UINT16, BASE_HEX, VALS(pn_io_rs_time_stamp_status), 0x0003,
+ NULL, HFILL }
+ },
+ { &hf_pn_io_rs_time_stamp_value,
+ { "RS_TimeStamp.Value", "pn_io.rs_time_stamp.value",
+ FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pn_io_rs_minus_error,
@@ -13722,12 +13776,12 @@ proto_register_pn_io (void)
},
{ &hf_pn_io_rs_domain_identification,
{ "RS_DomainIdentification", "pn_io.rs_domain_identification",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pn_io_rs_master_identification,
{ "RS_MasterIdentification", "pn_io.rs_master_identification",
- FT_STRING, BASE_NONE, NULL, 0x0,
+ FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pn_io_soe_digital_input_current_value,
@@ -13872,6 +13926,7 @@ proto_register_pn_io (void)
&ett_pn_io_rs_adjust_block,
&ett_pn_io_rs_event_data_extension,
&ett_pn_io_rs_specifier,
+ &ett_pn_io_rs_time_stamp,
&ett_pn_io_am_device_identification,
&ett_pn_io_rs_reason_code,
&ett_pn_io_soe_digital_input_current_value,