aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorD. Ulis <daulis0@gmail.com>2015-12-07 10:20:19 -0500
committerAnders Broman <a.broman58@gmail.com>2015-12-09 16:59:01 +0000
commit0a33e352f4116b850cded331482e3a9171cc6306 (patch)
treec4e284923b11d06811881636f7d2f40e55bd0fd5 /epan
parentafaf929d0da03a27ef8824eac3c6b45b4419b062 (diff)
CIP: Ensure that all generated data is properly flagged as Generated and no lengths are set for it.
This ensures: 1. Generated data shows inside brackets [], so it's obvious that the data was actually generated. 2. Clicking on generated data should not highlight bytes in the packet. Previously, this would sometimes highlight parts of the response packet that were unrelated. 3. Fixes some assertions that hit in PDML exporting code, due to wrong data locations being referenced. Bug: 11863 Change-Id: Ia7ea9d886c8fff0c302088bed44b974ff9447a92 Reviewed-on: https://code.wireshark.org/review/12468 Reviewed-by: Michael Mann <mmann78@netscape.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-cip.c170
1 files changed, 110 insertions, 60 deletions
diff --git a/epan/dissectors/packet-cip.c b/epan/dissectors/packet-cip.c
index dac9171f54..3fcc72a7a2 100644
--- a/epan/dissectors/packet-cip.c
+++ b/epan/dissectors/packet-cip.c
@@ -3150,6 +3150,7 @@ dissect_cia(tvbuff_t *tvb, int offset, int* pathpos, unsigned char segment_type,
const char* segment_name, const value_string* vals, int* value,
int hf8, int hf16, int hf32)
{
+ int segment_len;
int temp_data;
wmem_strbuf_t *strbuf;
@@ -3180,18 +3181,18 @@ dissect_cia(tvbuff_t *tvb, int offset, int* pathpos, unsigned char segment_type,
if (value != NULL)
*value = temp_data;
- proto_item_set_len( item, 2);
- proto_item_set_len( path_item, 2);
- (*pathpos) += 2;
+ segment_len = 2;
break;
case CI_LOGICAL_SEG_16_BIT:
if (packed)
{
temp_data = tvb_get_letohs( tvb, offset + *pathpos + 1 );
+ segment_len = 3;
}
else
{
temp_data = tvb_get_letohs( tvb, offset + *pathpos + 2 );
+ segment_len = 4;
}
if ( generate )
@@ -3211,6 +3212,7 @@ dissect_cia(tvbuff_t *tvb, int offset, int* pathpos, unsigned char segment_type,
}
}
+
if (vals == NULL)
{
proto_item_append_text( epath_item, "%s: 0x%04X", segment_name, temp_data);
@@ -3226,27 +3228,17 @@ dissect_cia(tvbuff_t *tvb, int offset, int* pathpos, unsigned char segment_type,
if (value != NULL)
*value = temp_data;
- if (packed)
- {
- proto_item_set_len( item, 3);
- proto_item_set_len( path_item, 3);
- (*pathpos) += 3;
- }
- else
- {
- proto_item_set_len( item, 4);
- proto_item_set_len( path_item, 4);
- (*pathpos) += 4;
- }
break;
case CI_LOGICAL_SEG_32_BIT:
if (packed)
{
temp_data = tvb_get_letohl( tvb, offset + *pathpos + 1 );
+ segment_len = 5;
}
else
{
temp_data = tvb_get_letohl( tvb, offset + *pathpos + 2 );
+ segment_len = 6;
}
if ( generate )
@@ -3281,24 +3273,19 @@ dissect_cia(tvbuff_t *tvb, int offset, int* pathpos, unsigned char segment_type,
if (value != NULL)
*value = temp_data;
- if (packed)
- {
- proto_item_set_len( item, 5);
- proto_item_set_len( path_item, 5);
- (*pathpos) += 5;
- }
- else
- {
- proto_item_set_len( item, 6);
- proto_item_set_len( path_item, 6);
- (*pathpos) += 6;
- }
break;
default:
expert_add_info(pinfo, epath_item, &ei_proto_log_seg_format);
return FALSE;
}
+ if (generate == FALSE)
+ {
+ proto_item_set_len(item, segment_len);
+ proto_item_set_len(path_item, segment_len);
+ }
+ (*pathpos) += segment_len;
+
return TRUE;
}
@@ -3448,6 +3435,9 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
switch( segment_type & CI_SEGMENT_TYPE_MASK )
{
case CI_PORT_SEGMENT:
+ {
+ int port_segment_len;
+
/* Add Extended Link Address flag & Port Identifier*/
if ( generate )
{
@@ -3492,19 +3482,16 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
/* Pad byte */
if( opt_link_size % 2 )
{
- proto_item_set_len( port_item, 3 + opt_link_size );
- proto_item_set_len( path_seg_item, 3 + opt_link_size );
- pathpos += (3 + opt_link_size);
+ port_segment_len = 3 + opt_link_size;
}
else
{
- proto_item_set_len( port_item, 2 + opt_link_size );
- proto_item_set_len( path_seg_item, 2 + opt_link_size );
- pathpos += (2 + opt_link_size);
+ port_segment_len = 2 + opt_link_size;
}
}
else
{
+ port_segment_len = 2;
/* Add Link Address */
if ( generate )
{
@@ -3518,12 +3505,17 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
proto_item_append_text( epath_item, ", Address: %d",tvb_get_guint8( tvb, offset + pathpos + 1 ) );
- proto_item_set_len( port_item, 2 );
- proto_item_set_len( path_seg_item, 2);
- pathpos += 2;
}
+ if (generate == FALSE)
+ {
+ proto_item_set_len(port_item, port_segment_len);
+ proto_item_set_len(path_seg_item, port_segment_len);
+ }
+
+ pathpos += port_segment_len;
break;
+ }
case CI_LOGICAL_SEGMENT:
@@ -3615,14 +3607,23 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
if( temp_data == CI_E_KEY_FORMAT_VAL )
{
- proto_item_set_len(path_seg_item, 10);
- proto_item_set_len(cia_item, 10);
- proto_tree_add_item( cia_tree, hf_cip_ekey_format, tvb, offset + pathpos+1, 1, ENC_LITTLE_ENDIAN);
-
- /* dissect the device ID */
- dissect_deviceid(tvb, offset + pathpos + 2, cia_tree,
- hf_cip_ekey_vendor, hf_cip_ekey_devtype, hf_cip_ekey_prodcode,
- hf_cip_ekey_compatibility, hf_cip_ekey_comp_bit, hf_cip_ekey_majorrev, hf_cip_ekey_minorrev);
+ if (generate)
+ {
+ it = proto_tree_add_uint(cia_tree, hf_cip_ekey_format, NULL, 0, 0, temp_data);
+ PROTO_ITEM_SET_GENERATED(it);
+ }
+ else
+ {
+ proto_tree_add_item(cia_tree, hf_cip_ekey_format, tvb, offset + pathpos + 1, 1, ENC_LITTLE_ENDIAN);
+
+ /* dissect the device ID */
+ dissect_deviceid(tvb, offset + pathpos + 2, cia_tree,
+ hf_cip_ekey_vendor, hf_cip_ekey_devtype, hf_cip_ekey_prodcode,
+ hf_cip_ekey_compatibility, hf_cip_ekey_comp_bit, hf_cip_ekey_majorrev, hf_cip_ekey_minorrev);
+
+ proto_item_set_len(path_seg_item, 10);
+ proto_item_set_len(cia_item, 10);
+ }
/* Add "summary" information to parent item */
temp_data = tvb_get_letohs( tvb, offset + pathpos + 2 );
@@ -3683,11 +3684,20 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
/* Segment size */
seg_size = tvb_get_guint8( tvb, offset + pathpos+1 )*2;
- proto_tree_add_uint_format_value(ds_tree, hf_cip_data_seg_size,
- tvb, offset + pathpos+1, 1, seg_size, "%d (words)", seg_size/2);
+ if (generate)
+ {
+ it = proto_tree_add_uint_format_value(ds_tree, hf_cip_data_seg_size,
+ NULL, 0, 0, seg_size, "%d (words)", seg_size / 2);
+ PROTO_ITEM_SET_GENERATED(it);
+ }
+ else
+ {
+ proto_tree_add_uint_format_value(ds_tree, hf_cip_data_seg_size,
+ tvb, offset + pathpos + 1, 1, seg_size, "%d (words)", seg_size / 2);
+ }
/* Segment data */
- if( seg_size != 0 )
+ if( seg_size != 0 && generate == FALSE )
{
ds_data_tree = proto_tree_add_subtree( ds_tree, tvb, offset + pathpos+2, 0, ett_data_seg_data, &ds_data_item, "Data" );
@@ -3697,8 +3707,11 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
proto_item_set_len(ds_data_item, seg_size);
}
- proto_item_set_len( ds_item, 2 + seg_size );
- proto_item_set_len( path_seg_item, 2 + seg_size );
+ if (generate == FALSE)
+ {
+ proto_item_set_len(ds_item, 2 + seg_size);
+ proto_item_set_len(path_seg_item, 2 + seg_size);
+ }
pathpos += (2 + seg_size);
proto_item_append_text(epath_item, "[Data]" );
@@ -3776,37 +3789,74 @@ void dissect_epath( tvbuff_t *tvb, packet_info *pinfo, proto_tree *path_tree, pr
switch( segment_type & CI_NETWORK_SEG_TYPE_MASK )
{
case CI_NETWORK_SEG_SCHEDULE:
- proto_tree_add_item(net_tree, hf_cip_seg_schedule, tvb, offset+pathpos+1, 1, ENC_LITTLE_ENDIAN );
+ if (generate)
+ {
+ it = proto_tree_add_uint(net_tree, hf_cip_seg_schedule, NULL, 0, 0, tvb_get_guint8(tvb, offset + pathpos + 1));
+ PROTO_ITEM_SET_GENERATED(it);
+ }
+ else
+ {
+ proto_tree_add_item(net_tree, hf_cip_seg_schedule, tvb, offset + pathpos + 1, 1, ENC_LITTLE_ENDIAN);
+
+ proto_item_set_len(net_item, 2);
+ proto_item_set_len(path_seg_item, 2);
+ }
- proto_item_set_len( net_item, 2);
- proto_item_set_len( path_seg_item, 2);
pathpos += 2;
break;
case CI_NETWORK_SEG_FIXED_TAG:
- proto_tree_add_item(net_tree, hf_cip_seg_fixed_tag, tvb, offset+pathpos+1, 1, ENC_LITTLE_ENDIAN );
+ if (generate)
+ {
+ it = proto_tree_add_uint(net_tree, hf_cip_seg_fixed_tag, NULL, 0, 0, tvb_get_guint8(tvb, offset + pathpos + 1));
+ PROTO_ITEM_SET_GENERATED(it);
+ }
+ else
+ {
+ proto_tree_add_item(net_tree, hf_cip_seg_fixed_tag, tvb, offset + pathpos + 1, 1, ENC_LITTLE_ENDIAN);
+
+ proto_item_set_len(net_item, 2);
+ proto_item_set_len(path_seg_item, 2);
+ }
- proto_item_set_len( net_item, 2);
- proto_item_set_len( path_seg_item, 2);
pathpos += 2;
break;
case CI_NETWORK_SEG_PROD_INHI:
temp_data = tvb_get_guint8( tvb, offset + pathpos + 1 );
- proto_tree_add_uint_format_value(net_tree, hf_cip_seg_prod_inhibit_time,
- tvb, offset + pathpos+1, 1, temp_data, "%dms", temp_data);
- proto_item_set_len( net_item, 2);
- proto_item_set_len( path_seg_item, 2);
+ if (generate)
+ {
+ it = proto_tree_add_uint_format_value(net_tree, hf_cip_seg_prod_inhibit_time,
+ NULL, 0, 0, temp_data, "%dms", temp_data);
+ PROTO_ITEM_SET_GENERATED(it);
+ }
+ else
+ {
+ proto_tree_add_uint_format_value(net_tree, hf_cip_seg_prod_inhibit_time,
+ tvb, offset + pathpos + 1, 1, temp_data, "%dms", temp_data);
+
+ proto_item_set_len(net_item, 2);
+ proto_item_set_len(path_seg_item, 2);
+ }
+
pathpos += 2;
break;
case CI_NETWORK_SEG_SAFETY:
proto_item_append_text(epath_item, "[Safety]" );
+ seg_size = tvb_get_guint8(tvb, offset + pathpos + 1) * 2;
+ if (generate)
+ {
+ /* TODO: Skip printing information in response packets for now. Think of a better way to handle
+ generated data that doesn't require a lot of copy-paste. */
+ pathpos += (seg_size + 2);
+ break;
+ }
+
/* Segment size */
- seg_size = tvb_get_guint8( tvb, offset + pathpos+1 )*2;
proto_tree_add_uint_format_value(net_tree, hf_cip_seg_network_size,
tvb, offset + pathpos+1, 1, seg_size/2, "%d (words)", seg_size/2);