forked from osmocom/wireshark
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>
This commit is contained in:
parent
2a2cb9dace
commit
f6ff90fed6
|
@ -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,
|
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) {
|
if (enable_topic_info) {
|
||||||
type_mapping * type_mapping_object = rtps_util_get_topic_info(guid);
|
type_mapping * type_mapping_object = rtps_util_get_topic_info(guid);
|
||||||
if (type_mapping_object != NULL) {
|
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;
|
tvbuff_t *next_tvb;
|
||||||
|
|
||||||
/* This part shows information available for the sample */
|
/* 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,
|
topic_info_tree = proto_tree_add_subtree(tree, tvb, offset, 0,
|
||||||
ett_rtps_topic_info, NULL, "[Topic Information (from Discovery)]");
|
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,
|
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,
|
ti = proto_tree_add_string(topic_info_tree, hf_rtps_param_type_name, tvb, offset, 0,
|
||||||
type_mapping_object->type_name);
|
type_mapping_object->type_name);
|
||||||
PROTO_ITEM_SET_GENERATED(ti);
|
PROTO_ITEM_SET_GENERATED(ti);
|
||||||
}
|
|
||||||
col_append_sep_str(pinfo->cinfo, COL_INFO, " -> ", type_mapping_object->topic_name);
|
col_append_sep_str(pinfo->cinfo, COL_INFO, " -> ", type_mapping_object->topic_name);
|
||||||
|
data->info_displayed = TRUE;
|
||||||
|
}
|
||||||
/* This part tries to dissect the content using a dissector */
|
/* This part tries to dissect the content using a dissector */
|
||||||
next_tvb = tvb_new_subset_remaining(tvb, offset);
|
next_tvb = tvb_new_subset_remaining(tvb, offset);
|
||||||
/* After calling this API, we must call g_free in dissector_name */
|
/* After calling this API, we must call g_free in dissector_name */
|
||||||
rtps_util_format_typename(type_mapping_object->type_name, &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);
|
g_free(dissector_name);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
} else {
|
} else {
|
||||||
|
@ -4785,19 +4788,20 @@ static void dissect_serialized_data(proto_tree *tree, packet_info *pinfo, tvbuff
|
||||||
proto_tree *rtps_parameter_sequence_tree;
|
proto_tree *rtps_parameter_sequence_tree;
|
||||||
guint16 encapsulation_id;
|
guint16 encapsulation_id;
|
||||||
gboolean encapsulation_little_endian = FALSE;
|
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 */
|
/* Creates the sub-tree */
|
||||||
rtps_parameter_sequence_tree = proto_tree_add_subtree(tree, tvb, offset, size,
|
rtps_parameter_sequence_tree = proto_tree_add_subtree(tree, tvb, offset, size,
|
||||||
ett_rtps_serialized_data, &ti, label);
|
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 */
|
||||||
encapsulation_id = NEXT_guint16(tvb, offset, ENC_BIG_ENDIAN); /* Always big endian */
|
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;
|
offset += 2;
|
||||||
|
|
||||||
/* Sets the correct values for encapsulation_le */
|
/* 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);
|
proto_tree_add_item(rtps_parameter_sequence_tree, hf_rtps_param_serialize_encap_len, tvb, offset, 2, ENC_BIG_ENDIAN);
|
||||||
offset += 2;
|
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 */
|
/* The payload */
|
||||||
size -= 4;
|
size -= 4;
|
||||||
switch (encapsulation_id) {
|
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,
|
static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offset,
|
||||||
guint8 flags, gboolean little_endian, int octets_to_next_header,
|
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
|
* 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,
|
gint32 sample_info_count = 0,
|
||||||
sample_info_max = rtps_max_batch_samples_dissected;
|
sample_info_max = rtps_max_batch_samples_dissected;
|
||||||
proto_item *octet_item;
|
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);
|
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 */
|
/* writerEntityId */
|
||||||
rtps_util_add_entity_id(tree, tvb, offset, hf_rtps_sm_wrentity_id, hf_rtps_sm_wrentity_id_key,
|
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);
|
hf_rtps_sm_wrentity_id_kind, ett_rtps_wrentity, "writerEntityId", &wid);
|
||||||
|
guid->entity_id = wid;
|
||||||
offset += 4;
|
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 for the entire data sequence */
|
||||||
encapsulation_id = NEXT_guint16(tvb, offset, FALSE); /* Always big endian */
|
encapsulation_id = NEXT_guint16(tvb, offset, FALSE); /* Always big endian */
|
||||||
proto_tree_add_uint(tree, hf_rtps_encapsulation_id, tvb, offset, 2, encapsulation_id);
|
proto_tree_add_uint(tree, hf_rtps_encapsulation_id, tvb, offset, 2, encapsulation_id);
|
||||||
|
data->encapsulation_id = encapsulation_id;
|
||||||
offset += 2;
|
offset += 2;
|
||||||
|
|
||||||
/* The next two bytes are ignored */
|
/* 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) {
|
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 {
|
} 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];
|
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:
|
case SUBMESSAGE_RTPS_DATA_BATCH:
|
||||||
dissect_RTPS_DATA_BATCH(tvb, pinfo, offset, flags, little_endian, octets_to_next_header,
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -110,6 +110,12 @@ typedef enum {
|
||||||
RTI_CDR_TYPE_OBJECT_TYPE_KIND_ANNOTATION_TYPE=23
|
RTI_CDR_TYPE_OBJECT_TYPE_KIND_ANNOTATION_TYPE=23
|
||||||
} RTICdrTypeObjectTypeKind;
|
} RTICdrTypeObjectTypeKind;
|
||||||
|
|
||||||
|
typedef struct _rtps_dissector_data {
|
||||||
|
guint16 encapsulation_id;
|
||||||
|
gboolean info_displayed;
|
||||||
|
} rtps_dissector_data;
|
||||||
|
|
||||||
|
|
||||||
#define RTPS_MAGIC_NUMBER 0x52545053 /* RTPS */
|
#define RTPS_MAGIC_NUMBER 0x52545053 /* RTPS */
|
||||||
#define RTPX_MAGIC_NUMBER 0x52545058 /* RTPX */
|
#define RTPX_MAGIC_NUMBER 0x52545058 /* RTPX */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue