diff options
author | ismaelrti <ismael@rti.com> | 2019-06-21 12:49:25 +0200 |
---|---|---|
committer | Alexis La Goutte <alexis.lagoutte@gmail.com> | 2019-06-25 11:37:51 +0000 |
commit | 3f12d58a62e5f694142a0231228e2c25b0baeb60 (patch) | |
tree | fc8a15246739bbc1039a943f936631d59b450d8f /epan | |
parent | deb81bd99fbea012d9c10923c174e0b1b7284dea (diff) |
RTPS: Micro release and revision versions swapped
In Connext DDS Micro versions lower than 3.0.0 revison version is
placed before release version in the packet. From 3.0.0 release version
is followed by revision version.
Bug: 15868
Change-Id: I6c0db7b687e1d452737b4545cf5f0605b527f603
Reviewed-on: https://code.wireshark.org/review/33692
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-rtps.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/epan/dissectors/packet-rtps.c b/epan/dissectors/packet-rtps.c index 9da4d184f7..0ee5e29de4 100644 --- a/epan/dissectors/packet-rtps.c +++ b/epan/dissectors/packet-rtps.c @@ -2602,7 +2602,11 @@ static void rtps_util_add_product_version(proto_tree *tree, tvbuff_t *tvb, gint proto_tree *subtree; guint8 major, minor, release, revision; + gint release_offset; + gint revision_offset; + release_offset = 2; + revision_offset = 3; major = tvb_get_guint8(tvb, offset); minor = tvb_get_guint8(tvb, offset+1); release = tvb_get_guint8(tvb, offset+2); @@ -2620,24 +2624,41 @@ static void rtps_util_add_product_version(proto_tree *tree, tvbuff_t *tvb, gint "Product version: %d.%d.%d.%d", major, minor, release, revision); } } else if (vendor_id == RTPS_VENDOR_RTI_DDS_MICRO) { - subtree = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_rtps_product_version, NULL, - "Product version: %d.%d.%d", major, minor, revision); + /* In Micro < 3.0.0 release and revision numbers are switched */ + if (major < 3) { + revision = revision ^ release; + release = revision ^ release; + revision = revision ^ release; + + revision_offset = revision_offset ^ release_offset; + release_offset = revision_offset ^ release_offset; + revision_offset = revision_offset ^ release_offset; + } + if (revision != 0) { + subtree = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_rtps_product_version, NULL, + "Product version: %d.%d.%d.%d", major, minor, release, revision); + } else { + subtree = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_rtps_product_version, NULL, + "Product version: %d.%d.%d", major, minor, release); + } } else { return; } + proto_tree_add_item(subtree, hf_rtps_param_product_version_major, tvb, offset, 1, ENC_NA); proto_tree_add_item(subtree, hf_rtps_param_product_version_minor, tvb, offset+1, 1, ENC_NA); - if (vendor_id == RTPS_VENDOR_RTI_DDS && major < 5) { /* If major revision is smaller than 5, release interpreted as char */ + /* If major revision is smaller than 5, release interpreted as char */ + if (vendor_id == RTPS_VENDOR_RTI_DDS && major < 5) { proto_tree_add_item(subtree, hf_rtps_param_product_version_release_as_char, - tvb, offset+2, 1, ENC_ASCII|ENC_NA); + tvb, offset + release_offset, 1, ENC_ASCII|ENC_NA); } else { proto_tree_add_item(subtree, hf_rtps_param_product_version_release, - tvb, offset+2, 1, ENC_NA); + tvb, offset + release_offset, 1, ENC_NA); } proto_tree_add_item(subtree, hf_rtps_param_product_version_revision, - tvb, offset+3, 1, ENC_NA); + tvb, offset + revision_offset, 1, ENC_NA); } /* ------------------------------------------------------------------------- */ |