From Johannes via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=5440 :
authormorriss <morriss@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 10 Aug 2011 15:52:52 +0000 (15:52 +0000)
committermorriss <morriss@f5534014-38df-0310-8fa8-9805f1628bb7>
Wed, 10 Aug 2011 15:52:52 +0000 (15:52 +0000)
Metadata Blocks in the bundle protocol (DTN) can contain EID references. These
are not considered by the current implementation and following blocks are
parsed wrong. The attached patch solves this bug and increment the offset as
much as needed to skip the EID references.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@38448 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dissectors/packet-dtn.c

index b2667fb1d849cdc45e9534b2246329aeabf6033d..41d513a02adf70fbd9bd20964a6ae873390ae22d 100644 (file)
@@ -1920,6 +1920,9 @@ display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean *la
     int block_length;
     guint8 type;
     int control_flags;
+    proto_tree *block_flag_tree = NULL;
+    int num_eid_ref = 0;
+    int i = 0, ref_scheme = 0, ref_ssp = 0;
 
     type = tvb_get_guint8(tvb, offset);
     header_start = offset;      /*Used to compute total payload length*/
@@ -1933,13 +1936,43 @@ display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean *la
     control_flags = evaluate_sdnv(tvb, header_start + offset, &sdnv_length);
     if(control_flags & BLOCK_CONTROL_LAST_BLOCK) {
         *lastheader = TRUE;
-    }
-    else {
+    } else {
         *lastheader = FALSE;
     }
     proto_tree_add_text(block_tree, tvb, header_start + offset, 1, "Block Flags: 0x%x", control_flags);
     offset += sdnv_length;
 
+    block_flag_tree = proto_item_add_subtree(block_item, ett_block_flags);
+
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_replicate,
+                          tvb, offset, sdnv_length, control_flags);
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_transmit_status,
+                          tvb, offset, sdnv_length, control_flags);
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_delete_bundle,
+                          tvb, offset, sdnv_length, control_flags);
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_last_block,
+                          tvb, offset, sdnv_length, control_flags);
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_discard_block,
+                          tvb, offset, sdnv_length, control_flags);
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_not_processed,
+                          tvb, offset, sdnv_length, control_flags);
+    proto_tree_add_boolean(block_flag_tree, hf_block_control_eid_reference,
+                          tvb, offset, sdnv_length, control_flags);
+
+    if (control_flags & BLOCK_CONTROL_EID_REFERENCE) {
+       num_eid_ref = evaluate_sdnv(tvb, header_start + offset, &sdnv_length);
+       offset += sdnv_length;
+
+       for (i = 0; i < num_eid_ref; i++)
+       {
+               ref_scheme = evaluate_sdnv(tvb, header_start + offset, &sdnv_length);
+               offset += sdnv_length;
+
+               ref_ssp = evaluate_sdnv(tvb, header_start + offset, &sdnv_length);
+               offset += sdnv_length;
+       }
+    }
+
     block_length = evaluate_sdnv(tvb, header_start + offset, &sdnv_length);
     proto_item_set_len(block_item, offset + sdnv_length + block_length);
     if(block_length < 0) {