aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rtps.c
diff options
context:
space:
mode:
authorRobert Shade <robert.shade@gmail.com>2021-11-10 20:20:10 -0500
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-11-11 17:16:47 +0000
commitf277ef5e27b469daba246f16241a90bb2ce049e5 (patch)
tree99a6daeb2598b9394bf4cb4b534da9adfcbf2520 /epan/dissectors/packet-rtps.c
parent599d3e2c94d732860b42cfef583341a46ef3157b (diff)
RTPS: Enable dissection of PLAIN_CDR2
Diffstat (limited to 'epan/dissectors/packet-rtps.c')
-rw-r--r--epan/dissectors/packet-rtps.c170
1 files changed, 119 insertions, 51 deletions
diff --git a/epan/dissectors/packet-rtps.c b/epan/dissectors/packet-rtps.c
index d34be1a622..d5b886ba1e 100644
--- a/epan/dissectors/packet-rtps.c
+++ b/epan/dissectors/packet-rtps.c
@@ -2478,7 +2478,7 @@ static void rtps_util_dissect_parameter_header(tvbuff_t * tvb, gint * offset,
}
}
-static gint dissect_mutable_member(proto_tree *tree , tvbuff_t * tvb, gint offset, guint encoding,
+static gint dissect_mutable_member(proto_tree *tree , tvbuff_t * tvb, gint offset, guint encoding, guint encoding_version,
dissection_info * info, gboolean * is_end, gboolean show);
static gint get_native_type_cdr_length(guint64 member_kind) {
@@ -2539,8 +2539,82 @@ static gint get_native_type_cdr_length(guint64 member_kind) {
return length;
}
+static gint get_native_type_cdr_alignment(guint64 member_kind, gint encapsulation_version) {
+ guint align = 0;
+
+ switch (member_kind) {
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_BOOLEAN_TYPE: {
+ align = 1;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_CHAR_8_TYPE:
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_BYTE_TYPE: {
+ align = 1;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_INT_16_TYPE: {
+ align = 2;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_UINT_16_TYPE: {
+ align = 2;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_ENUMERATION_TYPE:
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_INT_32_TYPE: {
+ align = 4;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_UINT_32_TYPE: {
+ align = 4;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_INT_64_TYPE: {
+ align = (encapsulation_version == 1) ? 8 : 4;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_UINT_64_TYPE: {
+ align = (encapsulation_version == 1) ? 8 : 4;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_FLOAT_32_TYPE: {
+ align = 4;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_FLOAT_64_TYPE: {
+ align = (encapsulation_version == 1) ? 8 : 4;
+ break;
+ }
+ case RTI_CDR_TYPE_OBJECT_TYPE_KIND_FLOAT_128_TYPE: {
+ align = (encapsulation_version == 1) ? 8 : 4;
+ break;
+ }
+ default: {
+ align = -1;
+ break;
+ }
+ }
+ return align;
+}
+
+static gint get_encapsulation_endianness(gint encapsulation_id)
+{
+ return (encapsulation_id == ENCAPSULATION_CDR_LE ||
+ encapsulation_id == ENCAPSULATION_PL_CDR_LE ||
+ encapsulation_id == ENCAPSULATION_CDR2_LE ||
+ encapsulation_id == ENCAPSULATION_D_CDR2_LE ||
+ encapsulation_id == ENCAPSULATION_PL_CDR2_LE) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+}
+
+static gint get_encapsulation_version(gint encapsulation_id)
+{
+ return (encapsulation_id == ENCAPSULATION_CDR2_LE ||
+ encapsulation_id == ENCAPSULATION_D_CDR2_LE ||
+ encapsulation_id == ENCAPSULATION_PL_CDR2_LE) ? 2 : 1;
+}
+
/* this is a recursive function. _info may or may not be NULL depending on the use iteration */
-static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset, guint encoding,
+static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset, guint encoding, guint encoding_version,
dissection_info * _info, guint64 type_id, gchar * name,
RTICdrTypeObjectExtensibility extensibility, gint offset_zero,
guint16 flags, guint32 element_member_id, gboolean show) {
@@ -2588,7 +2662,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_BOOLEAN_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gint16 value = tvb_get_gint8(tvb, offset);
proto_tree_add_boolean_format(tree, hf_rtps_dissection_boolean, tvb, offset, length, value,
"%s: %d", name, value);
@@ -2600,7 +2674,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_BYTE_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gint16 value = tvb_get_gint8(tvb, offset);
proto_tree_add_uint_format(tree, hf_rtps_dissection_byte, tvb, offset, length, value,
"%s: %d", name, value);
@@ -2611,7 +2685,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_INT_16_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gint16 value = tvb_get_gint16(tvb, offset, encoding);
proto_tree_add_int_format(tree, hf_rtps_dissection_int16, tvb, offset, length, value,
"%s: %d", name, value);
@@ -2622,7 +2696,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_UINT_16_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
guint16 value = tvb_get_guint16(tvb, offset, encoding);
proto_tree_add_uint_format(tree, hf_rtps_dissection_uint16, tvb, offset, length, value,
"%s: %u", name, value);
@@ -2634,7 +2708,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_INT_32_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gint value = tvb_get_gint32(tvb, offset, encoding);
proto_tree_add_int_format(tree, hf_rtps_dissection_int32, tvb, offset, length, value,
"%s: %d", name, value);
@@ -2645,7 +2719,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_UINT_32_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
guint value = tvb_get_guint32(tvb, offset, encoding);
proto_tree_add_uint_format(tree, hf_rtps_dissection_uint32, tvb, offset, length, value,
"%s: %u", name, value);
@@ -2656,7 +2730,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_INT_64_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gint64 value = tvb_get_gint64(tvb, offset, encoding);
proto_tree_add_int64_format(tree, hf_rtps_dissection_int64, tvb, offset, length, value,
"%s: %"G_GINT64_MODIFIER"d", name, value);
@@ -2667,7 +2741,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_UINT_64_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
guint64 value = tvb_get_guint64(tvb, offset, encoding);
proto_tree_add_uint64_format(tree, hf_rtps_dissection_uint64, tvb, offset, length, value,
"%s: %"G_GINT64_MODIFIER"u", name, value);
@@ -2678,7 +2752,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_FLOAT_32_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gfloat value = tvb_get_ieee_float(tvb, offset, encoding);
proto_tree_add_float_format(tree, hf_rtps_dissection_float, tvb, offset, length, value,
"%s: %.6f", name, value);
@@ -2689,7 +2763,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_FLOAT_64_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
gdouble value = tvb_get_ieee_double(tvb, offset, encoding);
if (show)
proto_tree_add_double_format(tree, hf_rtps_dissection_double, tvb, offset, length, value,
@@ -2701,7 +2775,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_FLOAT_128_TYPE: {
gint length = get_native_type_cdr_length(member_kind);
if (show) {
- ALIGN_ZERO(offset, length, offset_zero);
+ ALIGN_ZERO(offset, get_native_type_cdr_alignment(member_kind, encoding_version), offset_zero);
proto_tree_add_item(tree, hf_rtps_dissection_int128, tvb, offset, length, encoding);
}
offset += length;
@@ -2755,7 +2829,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
break;
}
}
- offset = dissect_user_defined(aux_tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(aux_tree, tvb, offset, encoding, encoding_version, NULL,
info->base_type_id, temp_buff, EXTENSIBILITY_INVALID, offset_zero, 0, 0, show_current_element);
}
@@ -2826,7 +2900,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
}
}
if (info->base_type_id > 0)
- offset = dissect_user_defined(aux_tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(aux_tree, tvb, offset, encoding, encoding_version, NULL,
info->base_type_id, temp_buff, EXTENSIBILITY_INVALID, offset_zero, 0, 0, show_current_element);
}
/* If reached the limit and there are remaining elements we need to show the message and
@@ -2863,7 +2937,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
break;
}
case RTI_CDR_TYPE_OBJECT_TYPE_KIND_ALIAS_TYPE: {
- offset = dissect_user_defined(tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(tree, tvb, offset, encoding, encoding_version, NULL,
info->base_type_id, name, EXTENSIBILITY_INVALID, offset_zero, 0, 0, show);
break;
}
@@ -2881,7 +2955,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
proto_item_append_text(tree, " (discriminator = %d, type_id = 0x%016" G_GINT64_MODIFIER "x)",
value, result->member_type_id);
}
- offset = dissect_user_defined(tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(tree, tvb, offset, encoding, encoding_version, NULL,
result->member_type_id, result->member_name, EXTENSIBILITY_INVALID, offset, 0, 0, show);
} else {
/* the hashmap uses the type_id to index the objects. substracting -2 here to lookup the discriminator
@@ -2893,7 +2967,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
proto_item_append_text(tree, " (discriminator = %d, type_id = 0x%016" G_GINT64_MODIFIER "x)",
value, result->member_type_id);
}
- offset = dissect_user_defined(tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(tree, tvb, offset, encoding, encoding_version, NULL,
result->member_type_id, result->member_name, EXTENSIBILITY_INVALID, offset, 0, 0, show);
}
}
@@ -2925,7 +2999,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
/* Updated only once */
first_skipped_element_offset = offset;
}
- offset = dissect_mutable_member(aux_tree, tvb, offset, encoding, info, &is_end, show_current_element);
+ offset = dissect_mutable_member(aux_tree, tvb, offset, encoding, encoding_version, info, &is_end, show_current_element);
++num_elements;
if (show_current_element) {
++shown_elements;
@@ -2936,7 +3010,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
if (show) {
proto_item_append_text(tree, "(BaseId: 0x%016" G_GINT64_MODIFIER "x)", info->base_type_id);
}
- offset = dissect_user_defined(aux_tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(aux_tree, tvb, offset, encoding, encoding_version, NULL,
info->base_type_id, info->member_name, EXTENSIBILITY_INVALID,
offset, 0, 0, show);
}
@@ -2955,7 +3029,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
first_skipped_element_offset = offset;
}
/* If a member is not shown all it children will inherit the "show_current_element" value */
- offset = dissect_user_defined(aux_tree, tvb, offset, encoding, NULL,
+ offset = dissect_user_defined(aux_tree, tvb, offset, encoding, encoding_version, NULL,
info->elements[i].type_id, info->elements[i].member_name, info->extensibility,
offset_zero, info->elements[i].flags, info->elements[i].member_id, show_current_element);
}
@@ -2994,7 +3068,7 @@ static gint dissect_user_defined(proto_tree *tree, tvbuff_t * tvb, gint offset,
}
}
-static gint dissect_mutable_member(proto_tree *tree , tvbuff_t * tvb, gint offset, guint encoding,
+static gint dissect_mutable_member(proto_tree *tree , tvbuff_t * tvb, gint offset, guint encoding, guint encoding_version,
dissection_info * info, gboolean * is_end, gboolean show) {
proto_tree * member;
@@ -3023,7 +3097,7 @@ static gint dissect_mutable_member(proto_tree *tree , tvbuff_t * tvb, gint offse
mapping = (mutable_member_mapping *) wmem_map_lookup(mutable_member_mappings, &(key));
if (mapping) { /* the library knows how to dissect this */
proto_item_append_text(member, "(base found 0x%016" G_GINT64_MODIFIER "x)", key);
- dissect_user_defined(tree, tvb, offset, encoding, NULL, mapping->member_type_id,
+ dissect_user_defined(tree, tvb, offset, encoding, encoding_version, NULL, mapping->member_type_id,
mapping->member_name, EXTENSIBILITY_INVALID, offset, 0, mapping->member_id, show);
PROTO_ITEM_SET_HIDDEN(member);
return offset + member_length;
@@ -3037,7 +3111,7 @@ static gint dissect_mutable_member(proto_tree *tree , tvbuff_t * tvb, gint offse
mapping = (mutable_member_mapping *) wmem_map_lookup(mutable_member_mappings, &(key));
if (mapping) { /* the library knows how to dissect this */
proto_item_append_text(member, "(found 0x%016" G_GINT64_MODIFIER "x)", key);
- dissect_user_defined(tree, tvb, offset, encoding, NULL, mapping->member_type_id,
+ dissect_user_defined(tree, tvb, offset, encoding, encoding_version, NULL, mapping->member_type_id,
mapping->member_name, EXTENSIBILITY_INVALID, offset, 0, mapping->member_id, show);
} else
@@ -6048,7 +6122,7 @@ static void rtps_util_topic_info_add_tree(proto_tree *tree, tvbuff_t *tvb,
static gboolean rtps_util_topic_info_add_column_info_and_try_dissector(proto_tree *tree,
packet_info *pinfo, tvbuff_t *tvb, gint offset, endpoint_guid * guid,
- rtps_dissector_data * data, guint encoding, gboolean try_dissection_from_type_object) {
+ rtps_dissector_data * data, guint encoding, guint encoding_version, gboolean try_dissection_from_type_object) {
if (enable_topic_info) {
type_mapping * type_mapping_object = rtps_util_get_topic_info(guid);
if (type_mapping_object != NULL) {
@@ -6065,7 +6139,7 @@ static gboolean rtps_util_topic_info_add_column_info_and_try_dissector(proto_tre
dissection_info * info = (dissection_info *) wmem_map_lookup(dissection_infos, &(type_mapping_object->type_id));
if (info != NULL) {
proto_item_append_text(tree, " (TypeId: 0x%016" G_GINT64_MODIFIER "x)", info->type_id);
- return dissect_user_defined(tree, tvb, offset, encoding, info,
+ return dissect_user_defined(tree, tvb, offset, encoding, encoding_version, info,
info->type_id, info->member_name, EXTENSIBILITY_INVALID, offset,
0 /* flags */, 0 /* member_id */, TRUE);
}
@@ -6114,7 +6188,7 @@ static gint rtps_util_add_rti_topic_query_service_request(proto_tree * tree,
proto_tree_add_uint(topic_query_tree, hf_rtps_encapsulation_id,
tvb, offset, 2, encapsulation_id);
offset += 2;
- encoding = (encapsulation_id == ENCAPSULATION_CDR_LE || encapsulation_id == ENCAPSULATION_PL_CDR_LE) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+ encoding = get_encapsulation_endianness(encapsulation_id);
/* Encapsulation length (or option) */
encapsulation_opt = tvb_get_ntohs(tvb, offset); /* Always big endian */
proto_tree_add_uint(topic_query_tree, hf_rtps_encapsulation_options, tvb,
@@ -6210,7 +6284,7 @@ static gint rtps_util_add_rti_locator_reachability_service_request(proto_tree *
proto_tree_add_uint(locator_reachability_tree, hf_rtps_encapsulation_id,
tvb, offset, 2, encapsulation_id);
offset += 2;
- encoding = (encapsulation_id == ENCAPSULATION_CDR_LE || encapsulation_id == ENCAPSULATION_PL_CDR_LE) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+ encoding = get_encapsulation_endianness(encapsulation_id);
/* Encapsulation length (or option) */
encapsulation_opt = tvb_get_ntohs(tvb, offset); /* Always big endian */
proto_tree_add_uint(locator_reachability_tree, hf_rtps_encapsulation_options, tvb,
@@ -8786,6 +8860,7 @@ static void dissect_serialized_data(proto_tree *tree, packet_info *pinfo, tvbuff
guint16 encapsulation_id;
gboolean try_dissection_from_type_object = FALSE;
guint encapsulation_encoding = ENC_BIG_ENDIAN;
+ guint encapsulation_encoding_version = 1;
rtps_dissector_data * data = wmem_new(wmem_packet_scope(), rtps_dissector_data);
data->info_displayed = FALSE;
data->encapsulation_id = 0;
@@ -8807,14 +8882,11 @@ static void dissect_serialized_data(proto_tree *tree, packet_info *pinfo, tvbuff
data->encapsulation_id = encapsulation_id;
offset += 2;
- /* Sets the correct values for encapsulation_le */
- if (encapsulation_id == ENCAPSULATION_CDR_LE ||
- encapsulation_id == ENCAPSULATION_PL_CDR_LE ||
- encapsulation_id == ENCAPSULATION_CDR2_LE ||
- encapsulation_id == ENCAPSULATION_D_CDR2_LE ||
- encapsulation_id == ENCAPSULATION_PL_CDR2_LE) {
- encapsulation_encoding = ENC_LITTLE_ENDIAN;
- }
+ /* Sets the correct values for encapsulation_encoding */
+ encapsulation_encoding = get_encapsulation_endianness(encapsulation_id);
+
+ /* Sets the correct values for encapsulation_encoding_version */
+ encapsulation_encoding_version = get_encapsulation_version(encapsulation_id);
/* Encapsulation length (or option) */
proto_tree_add_item(rtps_parameter_sequence_tree, hf_rtps_param_serialize_encap_len, tvb, offset, 2, ENC_BIG_ENDIAN);
@@ -8824,12 +8896,14 @@ static void dissect_serialized_data(proto_tree *tree, packet_info *pinfo, tvbuff
* the sample and will return TRUE if it did. We should return in that case.*/
if (encapsulation_id == ENCAPSULATION_CDR_LE ||
encapsulation_id == ENCAPSULATION_CDR_BE ||
+ encapsulation_id == ENCAPSULATION_CDR2_LE ||
+ encapsulation_id == ENCAPSULATION_CDR2_BE ||
encapsulation_id == ENCAPSULATION_PL_CDR_LE ||
encapsulation_id == ENCAPSULATION_PL_CDR_BE) {
try_dissection_from_type_object = TRUE;
}
if (rtps_util_topic_info_add_column_info_and_try_dissector(rtps_parameter_sequence_tree,
- pinfo, tvb, offset, guid, data, encapsulation_encoding, try_dissection_from_type_object))
+ pinfo, tvb, offset, guid, data, encapsulation_encoding, encapsulation_encoding_version, try_dissection_from_type_object))
return;
/* The payload */
@@ -10601,12 +10675,7 @@ static void dissect_RTPS_DATA(tvbuff_t *tvb, packet_info *pinfo, gint offset, gu
proto_tree_add_item_ret_uint(rtps_pm_tree, hf_rtps_param_serialize_encap_kind, tvb, offset, 2, ENC_BIG_ENDIAN, &encapsulation_id);
offset += 2;
- encoding = (encapsulation_id == ENCAPSULATION_CDR_LE ||
- encapsulation_id == ENCAPSULATION_PL_CDR_LE ||
- encapsulation_id == ENCAPSULATION_CDR2_LE ||
- encapsulation_id == ENCAPSULATION_D_CDR2_LE ||
- encapsulation_id == ENCAPSULATION_PL_CDR2_LE)
- ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+ encoding = get_encapsulation_endianness(encapsulation_id);
/* Encapsulation length (or option) */
proto_tree_add_item_ret_uint(rtps_pm_tree, hf_rtps_param_serialize_encap_len, tvb, offset, 2, ENC_BIG_ENDIAN, &encapsulation_len);
@@ -10639,11 +10708,7 @@ static void dissect_RTPS_DATA(tvbuff_t *tvb, packet_info *pinfo, gint offset, gu
proto_tree_add_item_ret_uint(rtps_pgm_tree, hf_rtps_param_serialize_encap_kind,
tvb, offset, 2, ENC_BIG_ENDIAN, &encapsulation_id);
- encoding = (encapsulation_id == ENCAPSULATION_CDR_LE ||
- encapsulation_id == ENCAPSULATION_PL_CDR_LE ||
- encapsulation_id == ENCAPSULATION_CDR2_LE ||
- encapsulation_id == ENCAPSULATION_D_CDR2_LE ||
- encapsulation_id == ENCAPSULATION_PL_CDR2_LE) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+ encoding = get_encapsulation_endianness(encapsulation_id);
offset += 2;
proto_tree_add_item_ret_uint(rtps_pgm_tree, hf_rtps_param_serialize_encap_len,
@@ -10729,7 +10794,8 @@ static void dissect_RTPS_DATA(tvbuff_t *tvb, packet_info *pinfo, gint offset, gu
proto_tree_add_item_ret_uint(locator_ping_tree, hf_rtps_encapsulation_id,
tvb, offset, 2, ENC_BIG_ENDIAN, &encapsulation_id);
offset += 2;
- encoding = (encapsulation_id == ENCAPSULATION_CDR_LE || encapsulation_id == ENCAPSULATION_PL_CDR_LE) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+ encoding = get_encapsulation_endianness(encapsulation_id);
+
/* Encapsulation length (or option) */
proto_tree_add_item_ret_uint(locator_ping_tree, hf_rtps_encapsulation_options,
tvb, offset, 2, ENC_BIG_ENDIAN, &encapsulation_opt);
@@ -10766,7 +10832,7 @@ static void dissect_RTPS_DATA(tvbuff_t *tvb, packet_info *pinfo, gint offset, gu
proto_tree_add_item_ret_uint(service_request_tree, hf_rtps_encapsulation_id,
tvb, offset, 2, ENC_BIG_ENDIAN, &encapsulation_id);
offset += 2;
- encoding = (encapsulation_id == ENCAPSULATION_CDR_LE || encapsulation_id == ENCAPSULATION_PL_CDR_LE) ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+ encoding = get_encapsulation_endianness(encapsulation_id);
/* Encapsulation length (or option) */
proto_tree_add_item_ret_uint(service_request_tree, hf_rtps_encapsulation_options, tvb,
offset, 2, ENC_BIG_ENDIAN, &encapsulation_opt);
@@ -11327,6 +11393,8 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
data->position_in_batch = count;
if (encapsulation_id == ENCAPSULATION_CDR_LE ||
encapsulation_id == ENCAPSULATION_CDR_BE ||
+ encapsulation_id == ENCAPSULATION_CDR2_LE ||
+ encapsulation_id == ENCAPSULATION_CDR2_BE ||
encapsulation_id == ENCAPSULATION_PL_CDR_LE ||
encapsulation_id == ENCAPSULATION_PL_CDR_BE) {
try_dissection_from_type_object = TRUE;
@@ -11336,7 +11404,7 @@ static void dissect_RTPS_DATA_BATCH(tvbuff_t *tvb, packet_info *pinfo, gint offs
tvb, offset, sample_info_length[count], NULL, "serializedKey[%d]", count);
} else {
if (!rtps_util_topic_info_add_column_info_and_try_dissector(
- sil_tree, pinfo, tvb, offset, guid, data, encoding, try_dissection_from_type_object)) {
+ sil_tree, pinfo, tvb, offset, guid, data, get_encapsulation_endianness(encapsulation_id), get_encapsulation_version(encapsulation_id), try_dissection_from_type_object)) {
proto_tree_add_bytes_format(sil_tree, hf_rtps_serialized_data,
tvb, offset, sample_info_length[count], NULL, "serializedData[%d]", count);
}