aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorAlexis La Goutte <alexis.lagoutte@gmail.com>2012-03-29 17:26:56 +0000
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2012-03-29 17:26:56 +0000
commit508cb1aa2f5a5aad56ddc8d1e4640c95206d56bc (patch)
tree1926f186dafdafc4695f639e2f3906a5ea98f57a /epan
parent91f2f97f28c3cf02576bd78456a77ea1348087c3 (diff)
From Roland Knall via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7003
openSAFETY - Cleanup SSDO dissection, add additional information, remove logic bug - rename isRequest to isResponse, which is the right name for it - clean-up elseif to a better readable stand-alone if-clause - add sender for response package without valid scm svn path=/trunk/; revision=41824
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-opensafety.c117
1 files changed, 68 insertions, 49 deletions
diff --git a/epan/dissectors/packet-opensafety.c b/epan/dissectors/packet-opensafety.c
index 47fe831450..a42f22d281 100644
--- a/epan/dissectors/packet-opensafety.c
+++ b/epan/dissectors/packet-opensafety.c
@@ -745,10 +745,11 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot
guint8 db0Offset, db0, sacmd, payloadOffset, payloadSize, n;
guint dataLength;
gint calcDataLength;
- gboolean isRequest;
+ gboolean isResponse, decodePayload;
guint8 *payload;
dataLength = tvb_get_guint8(message_tvb, OSS_FRAME_POS_LEN + frameStart1);
+ decodePayload = FALSE;
db0Offset = frameStart1 + OSS_FRAME_POS_DATA;
db0 = bytes[db0Offset];
@@ -757,7 +758,7 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot
if ( ( sacmd & OPENSAFETY_SSDO_SACMD_TGL ) == OPENSAFETY_SSDO_SACMD_TGL )
sacmd = sacmd & ( ~OPENSAFETY_SSDO_SACMD_TGL );
- isRequest = ( ( OSS_FRAME_ID(bytes, frameStart1) & 0x04 ) == 0x04 );
+ isResponse = ( ( OSS_FRAME_ID(bytes, frameStart1) & 0x04 ) == 0x04 );
if ( validSCMUDID )
{
@@ -768,11 +769,16 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot
frameStart2,
( ( OSS_FRAME_ADDR(bytes, frameStart1) ) ^ ( OSS_FRAME_ADDR(bytes, frameStart2) ) ));
}
- else if ( ! isRequest )
+ else if ( ! isResponse )
{
PACKET_RECEIVER(pinfo, OSS_FRAME_ADDR(bytes, frameStart1), frameStart1, frameStart2,
-1 * ( ( OSS_FRAME_ADDR(bytes, frameStart1) ) ^ ( OSS_FRAME_ADDR(bytes, frameStart2) ) ) );
}
+ else if ( isResponse )
+ {
+ PACKET_SENDER(pinfo, OSS_FRAME_ADDR(bytes, frameStart1), frameStart1, frameStart2,
+ -1 * ( ( OSS_FRAME_ADDR(bytes, frameStart1) ) ^ ( OSS_FRAME_ADDR(bytes, frameStart2) ) ) );
+ }
if ( ( OSS_FRAME_ID(bytes, frameStart1) == OPENSAFETY_MSG_SSDO_SLIM_SERVICE_REQUEST ) ||
( OSS_FRAME_ID(bytes, frameStart1) == OPENSAFETY_MSG_SSDO_SLIM_SERVICE_RESPONSE ) )
@@ -798,7 +804,8 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot
OSS_FRAME_ID(bytes, frameStart1),
"%s", val_to_str_const(OSS_FRAME_ID(bytes, frameStart1), message_type_values, "Unknown") );
- if ( isRequest )
+
+ if ( isResponse )
{
if ( validSCMUDID )
{
@@ -810,7 +817,7 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot
proto_tree_add_uint(ssdo_tree, hf_oss_ssdo_server, message_tvb, frameStart1, 2, OSS_FRAME_ADDR(bytes, frameStart1));
}
}
- else if ( ! isRequest )
+ else if ( ! isResponse )
{
if ( validSCMUDID )
{
@@ -860,57 +867,69 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot
val_to_str_const(abortcode, abort_codes, "Unknown"));
- } else if ( ( isRequest && (sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_INITIATE_SEGMENTED ||
- sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_INITIATE_EXPEDITED ||
- sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_SEGMENT_MIDDLE ||
- sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_SEGMENT_END
- ) ) ||
- ( !isRequest && (sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_INITIATE_EXPEDITED ||
- sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_INITIATE_SEGMENTED ||
- sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_SEGMENT_MIDDLE ||
- sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_SEGMENT_END
- ) )
- )
- {
- if ( ( sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_INITIATE_SEGMENTED ) || ( sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_INITIATE_SEGMENTED ) )
+ } else {
+
+ /* Either the SSDO msg is a response, then data is sent by the server and only in uploads,
+ * or the message is a request, then data is comming from the client and payload data is
+ * sent in downloads */
+ if ( ( isResponse && (sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_INITIATE_SEGMENTED ||
+ sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_INITIATE_EXPEDITED ||
+ sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_SEGMENT_MIDDLE ||
+ sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_SEGMENT_END ) )||
+ ( !isResponse && (sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_INITIATE_SEGMENTED ||
+ sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_INITIATE_EXPEDITED ||
+ sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_SEGMENT_MIDDLE ||
+ sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_SEGMENT_END ) ) )
+ {
+ decodePayload = TRUE;
+ }
+
+ if ( decodePayload )
{
- payloadOffset += 4;
- /* using payloadSize as helper var for for-loop */
- payloadSize = dataLength - (payloadOffset - db0Offset);
- payload = (guint8*)ep_alloc(sizeof(guint8)*payloadSize);
- for ( n = 0; n < payloadSize; n++)
- payload[payloadSize - n - 1] = bytes[frameStart1 + OSS_FRAME_POS_DATA + (payloadOffset - db0Offset) + n];
-
- /* reading real size */
- payloadSize = 0;
- for ( n = 0; n < 4; n++ )
+
+ /* If payload data has to be calculated, either a total size is given, or not */
+ if ( ( sacmd == OPENSAFETY_MSG_SSDO_DOWNLOAD_INITIATE_SEGMENTED ) ||
+ ( sacmd == OPENSAFETY_MSG_SSDO_UPLOAD_INITIATE_SEGMENTED )
+ )
{
- payloadSize += ( bytes[frameStart1 + OSS_FRAME_POS_DATA + 4 + n] ) << (8 * n);
- }
+ payloadOffset += 4;
+ /* using payloadSize as helper var for for-loop */
+ payloadSize = dataLength - (payloadOffset - db0Offset);
+ payload = (guint8*)ep_alloc(sizeof(guint8)*payloadSize);
+ for ( n = 0; n < payloadSize; n++)
+ payload[payloadSize - n - 1] = bytes[frameStart1 + OSS_FRAME_POS_DATA + (payloadOffset - db0Offset) + n];
+
+ /* reading real size */
+ payloadSize = 0;
+ for ( n = 0; n < 4; n++ )
+ {
+ payloadSize += ( bytes[frameStart1 + OSS_FRAME_POS_DATA + 4 + n] ) << (8 * n);
+ }
- calcDataLength = dataLength - (payloadOffset - db0Offset);
+ calcDataLength = dataLength - (payloadOffset - db0Offset);
- item = proto_tree_add_uint_format_value(ssdo_tree, hf_oss_ssdo_payload_size, message_tvb, payloadOffset - 4, 4,
- payloadSize, "%d octets total (%d octets in this frame)", payloadSize, calcDataLength);
- if ( (gint) calcDataLength > (gint) 0 )
+ item = proto_tree_add_uint_format_value(ssdo_tree, hf_oss_ssdo_payload_size, message_tvb, payloadOffset - 4, 4,
+ payloadSize, "%d octets total (%d octets in this frame)", payloadSize, calcDataLength);
+ if ( (gint) calcDataLength > (gint) 0 )
+ {
+ proto_tree_add_bytes(ssdo_tree, hf_oss_ssdo_payload, message_tvb, payloadOffset, calcDataLength, payload );
+ } else {
+ opensafety_add_warning1(pinfo, item, "Calculation for payload length yielded non-positive result [%d]", (guint) calcDataLength );
+ }
+ }
+ else
{
- proto_tree_add_bytes(ssdo_tree, hf_oss_ssdo_payload, message_tvb, payloadOffset, calcDataLength, payload );
- } else {
- opensafety_add_warning1(pinfo, item, "Calculation for payload length yielded non-positive result [%d]", (guint) calcDataLength );
+ payloadSize = dataLength - (payloadOffset - db0Offset);
+ payload = (guint8*)ep_alloc(sizeof(guint8)*payloadSize);
+ for ( n = 0; n < payloadSize; n++)
+ payload[payloadSize - n - 1] = bytes[frameStart1 + OSS_FRAME_POS_DATA + (payloadOffset - db0Offset) + n];
+
+ item = proto_tree_add_uint_format_value(ssdo_tree, hf_oss_ssdo_payload_size, message_tvb, 0, 0, payloadSize,
+ "%d octets", payloadSize);
+ PROTO_ITEM_SET_GENERATED(item);
+ proto_tree_add_bytes(ssdo_tree, hf_oss_ssdo_payload, message_tvb, payloadOffset, payloadSize, payload );
}
}
- else
- {
- payloadSize = dataLength - (payloadOffset - db0Offset);
- payload = (guint8*)ep_alloc(sizeof(guint8)*payloadSize);
- for ( n = 0; n < payloadSize; n++)
- payload[payloadSize - n - 1] = bytes[frameStart1 + OSS_FRAME_POS_DATA + (payloadOffset - db0Offset) + n];
-
- item = proto_tree_add_uint_format_value(ssdo_tree, hf_oss_ssdo_payload_size, message_tvb, 0, 0, payloadSize,
- "%d octets", payloadSize);
- PROTO_ITEM_SET_GENERATED(item);
- proto_tree_add_bytes(ssdo_tree, hf_oss_ssdo_payload, message_tvb, payloadOffset, payloadSize, payload );
- }
}
}