aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-opensafety.c
diff options
context:
space:
mode:
authorRoland Knall <roland.knall@br-automation.com>2015-10-06 10:00:54 +0200
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2015-10-06 12:17:31 +0000
commit63b9bc110dd2423baac539a3d8762cc92be0b223 (patch)
tree33ad6e02982e85d8062c6d0284ef21e13dbb525c /epan/dissectors/packet-opensafety.c
parent295641dece432c189eb35003f4d88b42ec6097d5 (diff)
openSAFETY: Add Producer ID to info field
Cosmetic change, to better distinguish if multiple SPDO packages have been detected. This should also be back-ported to 1.12 and 2.0 Change-Id: I3d0b26ecb6e0cc60b3cdc9861920c5ccaeb70cbd Reviewed-on: https://code.wireshark.org/review/10829 Reviewed-by: Roland Knall <rknall@gmail.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>
Diffstat (limited to 'epan/dissectors/packet-opensafety.c')
-rw-r--r--epan/dissectors/packet-opensafety.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/epan/dissectors/packet-opensafety.c b/epan/dissectors/packet-opensafety.c
index c8c30d90f9..f389d14e4b 100644
--- a/epan/dissectors/packet-opensafety.c
+++ b/epan/dissectors/packet-opensafety.c
@@ -779,7 +779,10 @@ dissect_opensafety_spdo_message(tvbuff_t *message_tvb, packet_info *pinfo, proto
if ( (OPENSAFETY_SPDO_FEAT_40BIT_USED & spdoFlags ) == OPENSAFETY_SPDO_FEAT_40BIT_USED )
sdn = OPENSAFETY_DEFAULT_DOMAIN;
+ /* Determine the producer and set it, as opensafety_packet_node does not */
addr = OSS_FRAME_ADDR_T(message_tvb, packet->frame.subframe1);
+ packet->sender = addr;
+
opensafety_packet_node ( message_tvb, pinfo, opensafety_tree, hf_oss_msg_sender,
addr, OSS_FRAME_POS_ADDR + packet->frame.subframe1, packet->frame.subframe2, sdn );
proto_item_append_text(opensafety_item, "; Producer: 0x%03X (%d)", addr, addr);
@@ -1758,7 +1761,7 @@ static gboolean
dissect_opensafety_message(opensafety_packet_info *packet,
tvbuff_t *message_tvb, packet_info *pinfo,
proto_item *opensafety_item, proto_tree *opensafety_tree,
- guint8 u_nrInPackage)
+ guint8 u_nrInPackage, guint8 previous_msg_id)
{
guint8 b_ID, ctr, spdoFlags;
GByteArray *scmUDID = NULL;
@@ -1770,17 +1773,17 @@ dissect_opensafety_message(opensafety_packet_info *packet,
for ( ctr = 0; ctr < 6; ctr++ )
packet->scm_udid[ctr] = 0;
- /* Clearing connection valid bit */
- if ( packet->msg_type == OPENSAFETY_SPDO_MESSAGE_TYPE )
- packet->msg_id = packet->msg_id & 0xF8;
-
packet->saddr = OSS_FRAME_ADDR_T(message_tvb, packet->frame.subframe1);
/* Sender / Receiver is determined by message type */
packet->sender = 0;
packet->receiver = 0;
- col_append_fstr(pinfo->cinfo, COL_INFO, (u_nrInPackage > 1 ? " | %s" : "%s" ),
+ /* SPDO is handled below */
+ if ( packet->msg_type != OPENSAFETY_SPDO_MESSAGE_TYPE )
+ {
+ col_append_fstr(pinfo->cinfo, COL_INFO, (u_nrInPackage > 1 ? " | %s" : "%s" ),
val_to_str(packet->msg_id, opensafety_message_type_values, "Unknown Message (0x%02X) "));
+ }
if ( packet->msg_type == OPENSAFETY_SNMT_MESSAGE_TYPE )
{
@@ -1848,6 +1851,16 @@ dissect_opensafety_message(opensafety_packet_info *packet,
{
proto_item_append_text(opensafety_item, ", SPDO" );
dissect_opensafety_spdo_message ( message_tvb, pinfo, opensafety_tree, packet, opensafety_item );
+
+ /* Now we know packet->sender, therefore we can add the info text */
+ if ( previous_msg_id != packet->msg_id )
+ {
+ col_append_fstr(pinfo->cinfo, COL_INFO, (u_nrInPackage > 1 ? " | %s - 0x%03X" : "%s - 0x%03X" ),
+ val_to_str(packet->msg_id, opensafety_message_type_values, "Unknown Message (0x%02X) "),
+ packet->sender );
+ } else {
+ col_append_fstr(pinfo->cinfo, COL_INFO, ", 0x%03X", packet->sender );
+ }
}
else
{
@@ -1890,7 +1903,7 @@ opensafety_package_dissector(const gchar *protocolName, const gchar *sub_diss_ha
guint length, len, frameOffset, frameLength, nodeAddress, gapStart;
guint8 *swbytes;
gboolean handled, dissectorCalled, call_sub_dissector, markAsMalformed;
- guint8 type, found, i, tempByte;
+ guint8 type, found, i, tempByte, previous_msg_id;
guint16 frameStart1, frameStart2, byte_offset;
gint reported_len;
dissector_handle_t protocol_dissector = NULL;
@@ -1903,6 +1916,7 @@ opensafety_package_dissector(const gchar *protocolName, const gchar *sub_diss_ha
dissectorCalled = FALSE;
call_sub_dissector = FALSE;
markAsMalformed = FALSE;
+ previous_msg_id = 0;
/* registering frame end routine, to prevent a malformed dissection preventing
* further dissector calls (see bug #6950) */
@@ -2170,9 +2184,15 @@ opensafety_package_dissector(const gchar *protocolName, const gchar *sub_diss_ha
packet->frame.length = frameLength;
packet->frame.malformed = FALSE;
- if ( dissect_opensafety_message(packet, next_tvb, pinfo, opensafety_item, opensafety_tree, found) != TRUE )
+ /* Clearing connection valid bit */
+ if ( packet->msg_type == OPENSAFETY_SPDO_MESSAGE_TYPE )
+ packet->msg_id = packet->msg_id & 0xF8;
+
+ if ( dissect_opensafety_message(packet, next_tvb, pinfo, opensafety_item, opensafety_tree, found, previous_msg_id) != TRUE )
markAsMalformed = TRUE;
+ previous_msg_id = packet->msg_id;
+
if ( markAsMalformed )
{
packet->frame.malformed = TRUE;