forked from osmocom/wireshark
RTPS: Added an analysis field to the ACKNACK dissection
A lot of people fail when interpreting ACKNACKs. I added a new field that interprets the numeric values and shows a brief sentence with the analysis. Bug: 12312 Change-Id: I89a33f04c52ebd5ca486d2e23bddb7a6646945e7 Reviewed-on: https://code.wireshark.org/review/14724 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
This commit is contained in:
parent
450c0d518b
commit
9a7a54c0b7
|
@ -276,6 +276,7 @@ static int hf_rtps_encapsulation_kind = -1;
|
|||
static int hf_rtps_octets_to_inline_qos = -1;
|
||||
static int hf_rtps_filter_signature = -1;
|
||||
static int hf_rtps_bitmap = -1;
|
||||
static int hf_rtps_acknack_analysis = -1;
|
||||
static int hf_rtps_property_name = -1;
|
||||
static int hf_rtps_property_value = -1;
|
||||
static int hf_rtps_union = -1;
|
||||
|
@ -2756,27 +2757,49 @@ static int rtps_util_add_bitmap(proto_tree *tree,
|
|||
tvbuff_t *tvb,
|
||||
gint offset,
|
||||
gboolean little_endian,
|
||||
const char *label _U_) {
|
||||
const char *label) {
|
||||
gint32 num_bits;
|
||||
guint32 data;
|
||||
wmem_strbuf_t *temp_buff = wmem_strbuf_new_label(wmem_packet_scope());
|
||||
int i, j, idx;
|
||||
wmem_strbuf_t *analysis_buff = wmem_strbuf_new_label(wmem_packet_scope());
|
||||
gint i, j, idx;
|
||||
gchar *last_one;
|
||||
proto_item *ti;
|
||||
proto_item *ti = NULL, *ti_tree = NULL;
|
||||
proto_tree *bitmap_tree;
|
||||
const gint original_offset = offset;
|
||||
guint32 datamask;
|
||||
guint64 first_seq_number;
|
||||
gboolean first_nack = TRUE;
|
||||
|
||||
bitmap_tree = proto_tree_add_subtree(tree, tvb, original_offset, offset-original_offset, ett_rtps_bitmap, &ti, label);
|
||||
bitmap_tree = proto_tree_add_subtree(tree, tvb, original_offset, offset-original_offset,
|
||||
ett_rtps_bitmap, &ti_tree, label);
|
||||
|
||||
/* Bitmap base sequence number */
|
||||
rtps_util_add_seq_number(bitmap_tree, tvb, offset, little_endian, "bitmapBase");
|
||||
first_seq_number = rtps_util_add_seq_number(bitmap_tree, tvb, offset, little_endian, "bitmapBase");
|
||||
offset += 8;
|
||||
|
||||
/* Reads the bitmap size */
|
||||
num_bits = NEXT_guint32(tvb, offset, little_endian);
|
||||
proto_tree_add_uint(bitmap_tree, hf_rtps_bitmap_num_bits, tvb, offset, 4, num_bits);
|
||||
offset += 4;
|
||||
/* bitmap base 0 means that this is a preemptive ACKNACK */
|
||||
if (first_seq_number == 0) {
|
||||
ti = proto_tree_add_uint_format(bitmap_tree, hf_rtps_acknack_analysis, tvb, 0, 0,
|
||||
1, "Acknack Analysis: Preemptive ACKNACK");
|
||||
PROTO_ITEM_SET_GENERATED(ti);
|
||||
}
|
||||
|
||||
if (first_seq_number > 0 && num_bits == 0) {
|
||||
ti = proto_tree_add_uint_format(bitmap_tree, hf_rtps_acknack_analysis, tvb, 0, 0,
|
||||
2, "Acknack Analysis: Expecting sample %" G_GINT64_MODIFIER "u", first_seq_number);
|
||||
PROTO_ITEM_SET_GENERATED(ti);
|
||||
}
|
||||
|
||||
if (num_bits > 0) {
|
||||
ti = proto_tree_add_uint_format(bitmap_tree, hf_rtps_acknack_analysis, tvb, 0, 0,
|
||||
3, "Acknack Analysis: Lost samples");
|
||||
PROTO_ITEM_SET_GENERATED(ti);
|
||||
}
|
||||
|
||||
/* Reads the bits (and format the print buffer) */
|
||||
idx = 0;
|
||||
|
@ -2786,6 +2809,12 @@ static int rtps_util_add_bitmap(proto_tree *tree,
|
|||
for (j = 0; j < 32; ++j) {
|
||||
datamask = (1U << (31-j));
|
||||
wmem_strbuf_append_c(temp_buff, ((data & datamask) == datamask) ? '1':'0');
|
||||
if ((data & datamask) == datamask) {
|
||||
proto_item_append_text(ti,
|
||||
first_nack ? " %" G_GINT64_MODIFIER "u" : ", %" G_GINT64_MODIFIER "u",
|
||||
first_seq_number + idx);
|
||||
first_nack = FALSE;
|
||||
}
|
||||
++idx;
|
||||
if ((idx >= num_bits) || (wmem_strbuf_get_len(temp_buff) >= (ITEM_LABEL_LENGTH - 1))) {
|
||||
break;
|
||||
|
@ -2800,11 +2829,19 @@ static int rtps_util_add_bitmap(proto_tree *tree,
|
|||
}
|
||||
|
||||
if (wmem_strbuf_get_len(temp_buff) > 0) {
|
||||
proto_tree_add_bytes_format_value(bitmap_tree, hf_rtps_bitmap, tvb, original_offset + 12, offset - original_offset - 12,
|
||||
NULL, "%s", wmem_strbuf_get_str(temp_buff));
|
||||
proto_tree_add_bytes_format_value(bitmap_tree, hf_rtps_bitmap, tvb,
|
||||
original_offset + 12, offset - original_offset - 12,
|
||||
NULL, "%s", wmem_strbuf_get_str(temp_buff));
|
||||
}
|
||||
|
||||
proto_item_set_len(ti_tree, offset-original_offset);
|
||||
|
||||
/* Add analysis of the information */
|
||||
if (num_bits > 0) {
|
||||
proto_item_append_text(ti, "%s in range [%" G_GINT64_MODIFIER "u,%" G_GINT64_MODIFIER "u]",
|
||||
wmem_strbuf_get_str(analysis_buff), first_seq_number, first_seq_number + num_bits - 1);
|
||||
}
|
||||
|
||||
proto_item_set_len(ti, offset-original_offset);
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
@ -5921,11 +5958,7 @@ static void dissect_ACKNACK(tvbuff_t *tvb, packet_info *pinfo, gint offset, guin
|
|||
|
||||
proto_tree_add_bitmask_value(tree, tvb, offset + 1, hf_rtps_sm_flags, ett_rtps_flags, ACKNACK_FLAGS, flags);
|
||||
|
||||
octet_item = proto_tree_add_item(tree,
|
||||
hf_rtps_sm_octets_to_next_header,
|
||||
tvb,
|
||||
offset + 2,
|
||||
2,
|
||||
octet_item = proto_tree_add_item(tree, hf_rtps_sm_octets_to_next_header, tvb, offset + 2, 2,
|
||||
little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN);
|
||||
|
||||
if (octets_to_next_header < 20) {
|
||||
|
@ -5937,36 +5970,17 @@ static void dissect_ACKNACK(tvbuff_t *tvb, packet_info *pinfo, gint offset, guin
|
|||
original_offset = offset;
|
||||
|
||||
/* readerEntityId */
|
||||
rtps_util_add_entity_id(tree,
|
||||
tvb,
|
||||
offset,
|
||||
hf_rtps_sm_rdentity_id,
|
||||
hf_rtps_sm_rdentity_id_key,
|
||||
hf_rtps_sm_rdentity_id_kind,
|
||||
ett_rtps_rdentity,
|
||||
"readerEntityId",
|
||||
NULL);
|
||||
rtps_util_add_entity_id(tree, tvb, offset, hf_rtps_sm_rdentity_id, hf_rtps_sm_rdentity_id_key,
|
||||
hf_rtps_sm_rdentity_id_kind, ett_rtps_rdentity, "readerEntityId", NULL);
|
||||
offset += 4;
|
||||
|
||||
/* 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",
|
||||
NULL);
|
||||
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", NULL);
|
||||
offset += 4;
|
||||
|
||||
/* Bitmap */
|
||||
offset = rtps_util_add_bitmap(tree,
|
||||
tvb,
|
||||
offset,
|
||||
little_endian,
|
||||
"readerSNState");
|
||||
|
||||
offset = rtps_util_add_bitmap(tree, tvb, offset, little_endian, "readerSNState");
|
||||
|
||||
/* RTPS 1.0 didn't have count: make sure we don't decode it wrong
|
||||
* in this case
|
||||
|
@ -9297,6 +9311,12 @@ void proto_register_rtps(void) {
|
|||
NULL, HFILL }
|
||||
},
|
||||
|
||||
{ &hf_rtps_acknack_analysis,
|
||||
{ "Acknack Analysis", "rtps.sm.acknack_analysis",
|
||||
FT_UINT32, BASE_DEC, NULL, 0,
|
||||
NULL, HFILL }
|
||||
},
|
||||
|
||||
{ &hf_rtps_param_partition_num,
|
||||
{ "Size", "rtps.param.partition_num",
|
||||
FT_INT32, BASE_DEC, NULL, 0,
|
||||
|
|
Loading…
Reference in New Issue