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
This commit is contained in:
Alexis La Goutte 2012-03-29 17:26:56 +00:00
parent 91f2f97f28
commit 508cb1aa2f
1 changed files with 68 additions and 49 deletions

View File

@ -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,56 +867,68 @@ 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);
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 );
}
}
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 )
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 );
}
}
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];
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 );
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 );
}
}
}
}