aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rtps.c
diff options
context:
space:
mode:
authorJuanjo Martin <juanjo@rti.com>2016-01-19 11:48:20 +0100
committerAnders Broman <a.broman58@gmail.com>2016-02-04 05:10:51 +0000
commitf6ff90fed6b18af3885d2cd66452004977cbcf24 (patch)
treef21c73df1defbf874d698fa00401e55b0e7cf0ea /epan/dissectors/packet-rtps.c
parent2a2cb9dace5179565dcdd87bd60aef1c94440af4 (diff)
RTPS: Added custom type dissection support for RTPS batches
In RTPS, regular samples are serialized with the format <encapsulation, serialized data> and thus, the dissection of the encapsulation was suggested to be done in the custom dissector. However, batches are serializing the encapsulation only once as <encapsulation, sample 1, sample 2>. This makes us need to dissect the encapsulation in the RTPS dissector and providing as (void*) data to the custom dissector. This way we support the regular samples dissection as well as the batches dissection. I have defined rtps_dissector_data in packet-rtps.h and I suggest we include that header file when we want to write a custom dissector. Bug: 12029 Change-Id: I74ed4c31484f9a99ad6c44c6c34cc52be2adb7c8 Reviewed-on: https://code.wireshark.org/review/13413 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-rtps.c')
-rw-r--r--epan/dissectors/packet-rtps.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/epan/dissectors/packet-rtps.c b/epan/dissectors/packet-rtps.c
index 2c7f1114fe..541cf553e8 100644
--- a/epan/dissectors/packet-rtps.c
+++ b/epan/dissectors/packet-rtps.c
@@ -2863,7 +2863,8 @@ static void rtps_util_format_typename(gchar * type_name, gchar ** output) {
}
static gboolean rtps_util_show_topic_info(proto_tree *tree, packet_info *pinfo,
- tvbuff_t *tvb, gint offset, endpoint_guid * guid) {
+ tvbuff_t *tvb, gint offset, endpoint_guid * guid,
+ rtps_dissector_data * data) {
if (enable_topic_info) {
type_mapping * type_mapping_object = rtps_util_get_topic_info(guid);
if (type_mapping_object != NULL) {
@@ -2873,7 +2874,7 @@ static gboolean rtps_util_show_topic_info(proto_tree *tree, packet_info *pinfo,
tvbuff_t *next_tvb;
/* This part shows information available for the sample */
- if (tree) {
+ if (data && !(data->info_displayed)) {
topic_info_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
ett_rtps_topic_info, NULL, "[Topic Information (from Discovery)]");
ti = proto_tree_add_string(topic_info_tree, hf_rtps_param_topic_name, tvb, offset, 0,
@@ -2882,13 +2883,15 @@ static gboolean rtps_util_show_topic_info(proto_tree *tree, packet_info *pinfo,
ti = proto_tree_add_string(topic_info_tree, hf_rtps_param_type_name, tvb, offset, 0,
type_mapping_object->type_name);
PROTO_ITEM_SET_GENERATED(ti);
+ col_append_sep_str(pinfo->cinfo, COL_INFO, " -> ", type_mapping_object->topic_name);
+ data->info_displayed = TRUE;
}
- col_append_sep_str(pinfo->cinfo, COL_INFO, " -> ", type_mapping_object->topic_name);
/* This part tries to dissect the content using a dissector */
next_tvb = tvb_new_subset_remaining(tvb, offset);
/* After calling this API, we must call g_free in dissector_name */
rtps_util_format_typename(type_mapping_object->type_name, &dissector_name);
- if (dissector_try_string(rtps_type_name_table, dissector_name, next_tvb, pinfo, tree, NULL)) {
+ if (dissector_try_string(rtps_type_name_table, dissector_name,
+ next_tvb, pinfo, tree, data)) {
g_free(dissector_name);
return TRUE;
} else {
@@ -4785,19 +4788,20 @@ static void dissect_serialized_data(proto_tree *tree, packet_info *pinfo, tvbuff
proto_tree *rtps_parameter_sequence_tree;
guint16 encapsulation_id;
gboolean encapsulation_little_endian = FALSE;
+ rtps_dissector_data * data = NULL;
+ data = wmem_new(wmem_packet_scope(), rtps_dissector_data);
+ data->info_displayed = FALSE;
+ data->encapsulation_id = 0;
/* Creates the sub-tree */
rtps_parameter_sequence_tree = proto_tree_add_subtree(tree, tvb, offset, size,
ett_rtps_serialized_data, &ti, label);
- /* Add Topic Information if enabled (checked inside). This call attemps to dissect
- * the sample and will return TRUE if it did. We should return in that case.*/
- if (rtps_util_show_topic_info(rtps_parameter_sequence_tree, pinfo, tvb, offset, guid))
- return;
-
/* Encapsulation ID */
encapsulation_id = NEXT_guint16(tvb, offset, ENC_BIG_ENDIAN); /* Always big endian */
- proto_tree_add_uint(rtps_parameter_sequence_tree, hf_rtps_param_serialize_encap_kind, tvb, offset, 2, encapsulation_id);
+ proto_tree_add_uint(rtps_parameter_sequence_tree,
+ hf_rtps_param_serialize_encap_kind, tvb, offset, 2, encapsulation_id);
+ data->encapsulation_id = encapsulation_id;
offset += 2;
/* Sets the correct values for encapsulation_le */
@@ -4810,6 +4814,12 @@ static void dissect_serialized_data(proto_tree *tree, packet_info *pinfo, tvbuff
proto_tree_add_item(rtps_parameter_sequence_tree, hf_rtps_param_serialize_encap_len, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
+ /* Add Topic Information if enabled (checked inside). This call attemps to dissect
+ * the sample and will return TRUE if it did. We should return in that case.*/
+ if (rtps_util_show_topic_info(rtps_parameter_sequence_tree, pinfo, tvb,
+ offset, guid, data))
+ return;
+
/* The payload */
size -= 4;
switch (encapsulation_id) {
@@ -6757,7 +6767,7 @@ static void dissect_RTPS_DATA_FRAG(tvbuff_t *tvb, packet_info *pinfo, gint offse
/* *********************************************************************** */
static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offset,
guint8 flags, gboolean little_endian, int octets_to_next_header,
- proto_tree *tree, guint16 vendor_id) {
+ proto_tree *tree, guint16 vendor_id, endpoint_guid * guid) {
/*
*
* 0...2...........7...............15.............23...............31
@@ -6840,6 +6850,10 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
gint32 sample_info_count = 0,
sample_info_max = rtps_max_batch_samples_dissected;
proto_item *octet_item;
+ rtps_dissector_data * data = NULL;
+ data = wmem_new(wmem_packet_scope(), rtps_dissector_data);
+ data->info_displayed = FALSE;
+ data->encapsulation_id = 0;
proto_tree_add_bitmask_value(tree, tvb, offset + 1, hf_rtps_sm_flags, ett_rtps_flags, RTPS_DATA_BATCH_FLAGS, flags);
@@ -6875,6 +6889,7 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
/* writerEntityId */
rtps_util_add_entity_id(tree, tvb, offset, hf_rtps_sm_wrentity_id, hf_rtps_sm_wrentity_id_key,
hf_rtps_sm_wrentity_id_kind, ett_rtps_wrentity, "writerEntityId", &wid);
+ guid->entity_id = wid;
offset += 4;
@@ -6998,6 +7013,7 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
/* Encapsulation ID for the entire data sequence */
encapsulation_id = NEXT_guint16(tvb, offset, FALSE); /* Always big endian */
proto_tree_add_uint(tree, hf_rtps_encapsulation_id, tvb, offset, 2, encapsulation_id);
+ data->encapsulation_id = encapsulation_id;
offset += 2;
/* The next two bytes are ignored */
@@ -7029,9 +7045,13 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
}
if ((sample_info_flags[count] & FLAG_SAMPLE_INFO_K) != 0) {
- proto_tree_add_bytes_format(sil_tree, hf_rtps_serialized_key, tvb, offset, sample_info_length[count], NULL, "serializedKey[%d]", count);
+ proto_tree_add_bytes_format(sil_tree, hf_rtps_serialized_key,
+ tvb, offset, sample_info_length[count], NULL, "serializedKey[%d]", count);
} else {
- proto_tree_add_bytes_format(sil_tree, hf_rtps_serialized_data, tvb, offset, sample_info_length[count], NULL, "serializedData[%d]", count);
+ if (!rtps_util_show_topic_info(sil_tree, pinfo, tvb, offset, guid, data)) {
+ proto_tree_add_bytes_format(sil_tree, hf_rtps_serialized_data,
+ tvb, offset, sample_info_length[count], NULL, "serializedData[%d]", count);
+ }
}
offset += sample_info_length[count];
}
@@ -7502,7 +7522,7 @@ static gboolean dissect_rtps_submessage_v2(tvbuff_t *tvb, packet_info *pinfo, gi
case SUBMESSAGE_RTPS_DATA_BATCH:
dissect_RTPS_DATA_BATCH(tvb, pinfo, offset, flags, little_endian, octets_to_next_header,
- rtps_submessage_tree, vendor_id);
+ rtps_submessage_tree, vendor_id, guid);
break;
default: