From f3af25f2707f25446a89b3b9d172766adead543a Mon Sep 17 00:00:00 2001 From: Bill Meier Date: Sun, 3 Apr 2011 15:39:01 +0000 Subject: [PATCH] Don't assign to a proto_item* if the value won't be used: Coverity 885-889 Also: Significant code rework including: - Fix bug wherein a timestamp was incorrectly reported as being an Error; - Replace many proto_tree_add_text()/proto_item_set_text() sequences each by a single proto_tree_add_text(). - remove unneeded #include - Whitespace clanup including replacing mixed space/tab indentation by spaces. svn path=/trunk/; revision=36437 --- epan/dissectors/packet-dtn.c | 2539 +++++++++++++++++----------------- 1 file changed, 1254 insertions(+), 1285 deletions(-) diff --git a/epan/dissectors/packet-dtn.c b/epan/dissectors/packet-dtn.c index 0f0f4feba0..b2667fb1d8 100644 --- a/epan/dissectors/packet-dtn.c +++ b/epan/dissectors/packet-dtn.c @@ -37,7 +37,6 @@ #include "config.h" #endif -#include #include #include @@ -49,13 +48,15 @@ void proto_reg_handoff_bundle(void); static int dissect_primary_header(packet_info *pinfo, proto_tree *primary_tree, tvbuff_t *tvb); static int dissect_admin_record(proto_tree *primary_tree, tvbuff_t *tvb, int offset); -static int dissect_payload_header(proto_tree *tree, tvbuff_t *tvb, int bundle_offset, int *lastheader); -static int display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int bundle_offset, int *lastheader); +static int dissect_payload_header(proto_tree *tree, tvbuff_t *tvb, int bundle_offset, gboolean *lastheader); +static int display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int bundle_offset, gboolean *lastheader); static int dissect_contact_header(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *conv_tree, proto_item *conv_item); + proto_tree *conv_tree, proto_item *conv_item); static int dissect_tcp_convergence_data_header(tvbuff_t *tvb, proto_tree *tree); -static int dissect_version_5_primary_header(packet_info *pinfo, - proto_tree *primary_tree, tvbuff_t *tvb); +static int dissect_version_4_primary_header(packet_info *pinfo, + proto_tree *primary_tree, tvbuff_t *tvb); +static int dissect_version_5_and_6_primary_header(packet_info *pinfo, + proto_tree *primary_tree, tvbuff_t *tvb); static int add_sdnv_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, const char *field_id); static int add_dtn_time_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, const char *field_id); static int add_sdnv_time_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, const char *field_id); @@ -64,10 +65,6 @@ static int add_sdnv_time_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, co static GHashTable *msg_fragment_table = NULL; static GHashTable *msg_reassembled_table = NULL; -static int gbl_segment_length; -static int gbl_bundle_header_length; -static int gbl_bundle_header_dict_length; - static char magic[] = {'d', 't', 'n', '!'}; static int proto_bundle = -1; @@ -108,6 +105,7 @@ static int hf_msg_reassembled_length = -1; /* Primary Header Processing Flag Variables */ static guint8 pri_hdr_procflags; /*This is global to allow processing Payload Header*/ + static int hf_bundle_procflags = -1; static int hf_bundle_procflags_fragment = -1; static int hf_bundle_procflags_admin = -1; @@ -263,24 +261,13 @@ static const fragment_items msg_frag_items = { "Message fragments" }; - static void dissect_tcp_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *ti = NULL; - proto_tree *bundle_tree = NULL; - proto_item *ci = NULL; + int buffer_size; /*Number of bytes in buffer that can be processed*/ + int frame_offset; /*To handle the case of > 1 bundle in an Ethernet Frame*/ proto_tree *conv_proto_tree = NULL; - int buffer_size; /*Number of bytes in buffer that can be processed*/ - int bundle_size = 0; - tvbuff_t *new_tvb; - guint8 conv_hdr; - int sdnv_length; - int frame_offset; /*To handle the case of > 1 bundle in an Ethernet Frame*/ - int convergence_hdr_size; - int fixed; - char *sptr; buffer_size = tvb_reported_length(tvb); frame_offset = 0; @@ -288,217 +275,229 @@ dissect_tcp_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) col_clear(pinfo->cinfo,COL_INFO); /* Clear out stuff in the info column */ while(frame_offset < buffer_size) { + guint8 conv_hdr; - fragment_data *frag_msg = NULL; - gboolean more_frags = TRUE; + conv_hdr = tvb_get_guint8(tvb, frame_offset); + if((conv_hdr & TCP_CONVERGENCE_TYPE_MASK) == TCP_CONVERGENCE_DATA_SEGMENT) { + fragment_data *frag_msg; + tvbuff_t *new_tvb; + proto_tree *bundle_tree; + proto_tree *conv_proto_tree; + proto_item *ci; + int segment_length; + gboolean more_frags; + int sdnv_length; + int convergence_hdr_size; + int fixed; - conv_hdr = tvb_get_guint8(tvb, frame_offset); - if((conv_hdr & TCP_CONVERGENCE_TYPE_MASK) == TCP_CONVERGENCE_DATA_SEGMENT) { + /* Only Start and End flags (bits 0 & 1) are valid in Data Segment */ + if((conv_hdr & ~(TCP_CONVERGENCE_TYPE_MASK | TCP_CONVERGENCE_DATA_FLAGS)) != 0) { + col_set_str(pinfo->cinfo, COL_INFO, "Invalid TCP CL Data Segment Flags"); + return; + } + fixed = 1; + segment_length = evaluate_sdnv(tvb, fixed + frame_offset, &sdnv_length); + if(segment_length < 0) { + col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error (Length)"); + return; + } + convergence_hdr_size = sdnv_length + fixed; + if((buffer_size - frame_offset - convergence_hdr_size) < segment_length) { + /*Segment not complete -- wait for the rest of it*/ + pinfo->desegment_len = + segment_length - (buffer_size - frame_offset + - convergence_hdr_size); + pinfo->desegment_offset = frame_offset; + return; + } - /* Only Start and End flags (bits 0 & 1) are valid in Data Segment */ - if((conv_hdr & ~(TCP_CONVERGENCE_TYPE_MASK | TCP_CONVERGENCE_DATA_FLAGS)) != 0) { - col_set_str(pinfo->cinfo, COL_INFO, "Invalid TCP CL Data Segment Flags"); - return; - } - fixed = 1; - gbl_segment_length = evaluate_sdnv(tvb, fixed + frame_offset, &sdnv_length); - if(gbl_segment_length < 0) { - col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error (Length)"); - return; - } - convergence_hdr_size = sdnv_length + fixed; - if((buffer_size - frame_offset - convergence_hdr_size) < gbl_segment_length) { - /*Segment not complete -- wait for the rest of it*/ - pinfo->desegment_len = - gbl_segment_length - (buffer_size - frame_offset - - convergence_hdr_size); - pinfo->desegment_offset = frame_offset; - return; - } + /* + * 1/11/2006 - If I got here, I should have a complete convergence layer + * "segment" beginning at frame_offset. However that might not be a + * complete bundle. Or there might be a complete bundle plus one or more + * additional convergence layer headers. + */ - /* - * 1/11/2006 - If I got here, I should have a complete convergence layer - * "segment" beginning at frame_offset. However that might not be a - * complete bundle. Or there might be a complete bundle plus one or more - * additional convergence layer headers. - */ + bundle_tree = NULL; + new_tvb = NULL; + if((conv_hdr & TCP_CONVERGENCE_DATA_END_FLAG) == TCP_CONVERGENCE_DATA_END_FLAG) { + more_frags = FALSE; + } + else { + more_frags = TRUE; + } + ci = proto_tree_add_item(tree, proto_tcp_conv, tvb, + frame_offset, -1, FALSE); + conv_proto_tree = proto_item_add_subtree(ci, ett_tcp_conv); + dissect_tcp_convergence_data_header(tvb, conv_proto_tree); - new_tvb = NULL; - if((conv_hdr & TCP_CONVERGENCE_DATA_END_FLAG) == - TCP_CONVERGENCE_DATA_END_FLAG) { - more_frags = FALSE; - } - else { - more_frags = TRUE; - } - ci = proto_tree_add_item(tree, proto_tcp_conv, tvb, - frame_offset, -1, FALSE); - conv_proto_tree = proto_item_add_subtree(ci, ett_tcp_conv); - dissect_tcp_convergence_data_header(tvb, conv_proto_tree); + /* + * Note: The reassembled bundle will only include the first + * Convergence layer header. + */ - /* - * Note: The reassembled bundle will only include the first - * Convergence layer header. - */ + frag_msg = fragment_add_seq_next(tvb, frame_offset + convergence_hdr_size, + pinfo, 0, msg_fragment_table, + msg_reassembled_table, segment_length, + more_frags); + if(frag_msg && !more_frags) { + proto_item *ti; - frag_msg = fragment_add_seq_next(tvb, frame_offset + convergence_hdr_size, - pinfo, 0, msg_fragment_table, - msg_reassembled_table, gbl_segment_length, - more_frags); - if(frag_msg && !more_frags) { - ti = proto_tree_add_item(tree, proto_bundle, tvb, - frame_offset, -1, FALSE); - bundle_tree = proto_item_add_subtree(ti, ett_bundle); - new_tvb = process_reassembled_data(tvb, - frame_offset + convergence_hdr_size, - pinfo, "Reassembled DTN", frag_msg, - &msg_frag_items, NULL, bundle_tree); - } - if(new_tvb){ - bundle_size = dissect_complete_bundle(new_tvb, pinfo, bundle_tree); - if(bundle_size == 0) { /*Couldn't parse bundle*/ - col_set_str(pinfo->cinfo, COL_INFO, "Dissection Failed"); - return; /*Give up*/ - } - } - else { + ti = proto_tree_add_item(tree, proto_bundle, tvb, + frame_offset, -1, FALSE); + bundle_tree = proto_item_add_subtree(ti, ett_bundle); + new_tvb = process_reassembled_data(tvb, + frame_offset + convergence_hdr_size, + pinfo, "Reassembled DTN", frag_msg, + &msg_frag_items, NULL, bundle_tree); + } + if(new_tvb) { + int bundle_size; + bundle_size = dissect_complete_bundle(new_tvb, pinfo, bundle_tree); + if(bundle_size == 0) { /*Couldn't parse bundle*/ + col_set_str(pinfo->cinfo, COL_INFO, "Dissection Failed"); + return; /*Give up*/ + } + } + else { - /* - * If there are 2 segments, the second of which is very short, this - * gets displayed instead of the usual Source EID/Destination EID in - * the Bundle Dissection frame. If these statements are left out entirely, - * nothing is displayed, i.e., there seems to be no way to get the - * Source/Destination in the 2-segment case. I'll leave it in because I - * think it is informative in the multi-segment case although confusing in the - * 2-segment case. - */ + /* + * If there are 2 segments, the second of which is very short, this + * gets displayed instead of the usual Source EID/Destination EID in + * the Bundle Dissection frame. If these statements are left out entirely, + * nothing is displayed, i.e., there seems to be no way to get the + * Source/Destination in the 2-segment case. I'll leave it in because I + * think it is informative in the multi-segment case although confusing in the + * 2-segment case. + */ - col_set_str(pinfo->cinfo, COL_INFO, "[Reassembled Segment of a Bundle]"); - } + col_set_str(pinfo->cinfo, COL_INFO, "[Reassembled Segment of a Bundle]"); + } - /* - * If we could be sure that the current tvb buffer ended with the CL segment, - * we could return here. But the buffer could contain multiple complete segments - * or bundles or a bundle plus other CL messages. In order to process whatever - * follow the current segment, we have to continue through the buffer until - * frame_offset indicates everything in the buffer has been processed. - */ + /* + * If we could be sure that the current tvb buffer ended with the CL segment, + * we could return here. But the buffer could contain multiple complete segments + * or bundles or a bundle plus other CL messages. In order to process whatever + * follow the current segment, we have to continue through the buffer until + * frame_offset indicates everything in the buffer has been processed. + */ - frame_offset += (gbl_segment_length + convergence_hdr_size); - } - else { /*Else this is not a Data Segment*/ + frame_offset += (segment_length + convergence_hdr_size); + } + else { /*Else this is not a Data Segment*/ - proto_item *conv_item = NULL; - proto_tree *conv_tree = NULL; + proto_item *conv_item; + proto_tree *conv_tree; + proto_item *ci; + char *sptr; - if(frame_offset == 0) { - ci = proto_tree_add_item(tree, proto_tcp_conv, tvb, - frame_offset, -1, FALSE); - conv_proto_tree = proto_item_add_subtree(ci, ett_tcp_conv); - } + if(frame_offset == 0) { + ci = proto_tree_add_item(tree, proto_tcp_conv, tvb, + frame_offset, -1, FALSE); + conv_proto_tree = proto_item_add_subtree(ci, ett_tcp_conv); + } - /* - * Other Convergence Layer messages are short; assume they won't need - * reassembly. Start with the Convergence Layer Tree. - */ + /* + * Other Convergence Layer messages are short; assume they won't need + * reassembly. Start with the Convergence Layer Tree. + */ - conv_item = proto_tree_add_text(conv_proto_tree, tvb, frame_offset, -1, - "TCP Convergence Header"); - conv_tree = proto_item_add_subtree(conv_item, ett_tcp_conv_hdr); + conv_item = proto_tree_add_text(conv_proto_tree, tvb, frame_offset, -1, + "TCP Convergence Header"); + conv_tree = proto_item_add_subtree(conv_item, ett_tcp_conv_hdr); - if(conv_hdr == (guint8)magic[0]) { - sptr = (char *) tvb_get_ephemeral_string(tvb, frame_offset, 4); - if(!memcmp(sptr, magic, 4)){ - dissect_contact_header(tvb, pinfo, conv_tree, conv_item); - return; /*Assumes Contact Header is alone in segment*/ - } - } - if(conv_hdr == TCP_CONVERGENCE_ACK_SEGMENT) { /*No valid flags in Ack*/ - int ack_length; - proto_item *ack_length_item = NULL; + if(conv_hdr == (guint8)magic[0]) { + sptr = (char *) tvb_get_ephemeral_string(tvb, frame_offset, 4); + if(!memcmp(sptr, magic, 4)){ + dissect_contact_header(tvb, pinfo, conv_tree, conv_item); + return; /*Assumes Contact Header is alone in segment*/ + } + } + if(conv_hdr == TCP_CONVERGENCE_ACK_SEGMENT) { /*No valid flags in Ack*/ + int ack_length; + int sdnv_length; + int fixed; - proto_tree_add_text(conv_tree, tvb, frame_offset, 1, "Pkt Type: Ack"); - fixed = 1; - ack_length = evaluate_sdnv(tvb, frame_offset + fixed, &sdnv_length); - ack_length_item = proto_tree_add_text(conv_tree, tvb, - frame_offset + fixed, sdnv_length, " "); - if(ack_length < 0) { - proto_item_set_text(ack_length_item, "Ack Length: Error"); - return; - } - proto_item_set_text(ack_length_item, "Ack Length: %d", ack_length); - /*return (sdnv_length + fixed);*/ - frame_offset += (sdnv_length + fixed); - proto_item_set_len(conv_item, sdnv_length + fixed); - } - else if(conv_hdr == TCP_CONVERGENCE_KEEP_ALIVE) { /*No valid flags in Keep Alive*/ - proto_item_set_len(conv_item, 1); - proto_tree_add_text(conv_tree, tvb, frame_offset, 1, "Pkt Type: Keep Alive"); - frame_offset += 1; - } - else if((conv_hdr & TCP_CONVERGENCE_TYPE_MASK) == - TCP_CONVERGENCE_SHUTDOWN) { - proto_item *shutdown_flag_item = NULL; - proto_tree *shutdown_flag_tree = NULL; - guint8 shutdown_flags; - proto_item *shutdown_reason_item = NULL; - proto_item *shutdown_delay_item = NULL; - int field_length; + proto_tree_add_text(conv_tree, tvb, frame_offset, 1, "Pkt Type: Ack"); + fixed = 1; + ack_length = evaluate_sdnv(tvb, frame_offset + fixed, &sdnv_length); + if(ack_length < 0) { + proto_tree_add_text(conv_tree, tvb, frame_offset + fixed, sdnv_length, + "Ack Length: Error"); + return; + } + proto_tree_add_text(conv_tree, tvb, frame_offset + fixed, sdnv_length, + "Ack Length: %d", ack_length); - if((conv_hdr & - ~(TCP_CONVERGENCE_TYPE_MASK | TCP_CONVERGENCE_SHUTDOWN_FLAGS)) != 0) { - proto_tree_add_text(conv_tree, tvb, frame_offset, - -1, "Invalid Convergence Layer Shutdown Packet"); - return; - } - proto_item_set_len(conv_item, 1); - proto_tree_add_text(conv_tree, tvb, 0, 1, "Pkt Type: Shutdown"); + /*return (sdnv_length + fixed);*/ + frame_offset += (sdnv_length + fixed); + proto_item_set_len(conv_item, sdnv_length + fixed); + } + else if(conv_hdr == TCP_CONVERGENCE_KEEP_ALIVE) { /*No valid flags in Keep Alive*/ + proto_item_set_len(conv_item, 1); + proto_tree_add_text(conv_tree, tvb, frame_offset, 1, "Pkt Type: Keep Alive"); + frame_offset += 1; + } + else if((conv_hdr & TCP_CONVERGENCE_TYPE_MASK) == TCP_CONVERGENCE_SHUTDOWN) { + proto_item *shutdown_flag_item; + proto_tree *shutdown_flag_tree; + guint8 shutdown_flags; + int field_length; - /* Add tree for Shutdown Flags */ - shutdown_flags = conv_hdr; - shutdown_flag_item = proto_tree_add_item(conv_tree, - hf_tcp_convergence_shutdown_flags, tvb, - frame_offset, 1, FALSE); - shutdown_flag_tree = proto_item_add_subtree(shutdown_flag_item, - ett_shutdown_flags); - proto_tree_add_boolean(shutdown_flag_tree, - hf_tcp_convergence_shutdown_flags_reason, - tvb, frame_offset, 1, shutdown_flags); - proto_tree_add_boolean(shutdown_flag_tree, - hf_tcp_convergence_shutdown_flags_delay, - tvb, frame_offset, 1, shutdown_flags); + if((conv_hdr & + ~(TCP_CONVERGENCE_TYPE_MASK | TCP_CONVERGENCE_SHUTDOWN_FLAGS)) != 0) { + proto_tree_add_text(conv_tree, tvb, frame_offset, + -1, "Invalid Convergence Layer Shutdown Packet"); + return; + } + proto_item_set_len(conv_item, 1); + proto_tree_add_text(conv_tree, tvb, 0, 1, "Pkt Type: Shutdown"); - frame_offset += 1; - field_length = 1; - if(conv_hdr & TCP_CONVERGENCE_SHUTDOWN_REASON) { - shutdown_reason_item = proto_tree_add_item(conv_tree, - hf_tcp_convergence_shutdown_reason, tvb, - frame_offset, 1, FALSE); - frame_offset += 1; - field_length += 1; - } - if(conv_hdr & TCP_CONVERGENCE_SHUTDOWN_DELAY) { - shutdown_delay_item = proto_tree_add_item(conv_tree, - hf_tcp_convergence_shutdown_delay, tvb, - frame_offset, 2, FALSE); - frame_offset += 2; - field_length += 2; - } - proto_item_set_len(conv_item, field_length); - } - else if(conv_hdr == TCP_CONVERGENCE_REFUSE_BUNDLE) { /*No valid flags*/ - proto_item_set_len(conv_item, 1); - proto_tree_add_text(conv_tree, tvb, frame_offset, - 1, "Pkt Type: Refuse Bundle"); - frame_offset += 1; - } - else { - proto_tree_add_text(conv_tree, tvb, frame_offset, - -1, "Invalid/Partial Convergence Layer Packet"); - return; - } - } - } /*end while()*/ + /* Add tree for Shutdown Flags */ + shutdown_flags = conv_hdr; + shutdown_flag_item = proto_tree_add_item(conv_tree, + hf_tcp_convergence_shutdown_flags, tvb, + frame_offset, 1, FALSE); + shutdown_flag_tree = proto_item_add_subtree(shutdown_flag_item, + ett_shutdown_flags); + proto_tree_add_boolean(shutdown_flag_tree, + hf_tcp_convergence_shutdown_flags_reason, + tvb, frame_offset, 1, shutdown_flags); + proto_tree_add_boolean(shutdown_flag_tree, + hf_tcp_convergence_shutdown_flags_delay, + tvb, frame_offset, 1, shutdown_flags); + + frame_offset += 1; + field_length = 1; + if(conv_hdr & TCP_CONVERGENCE_SHUTDOWN_REASON) { + proto_tree_add_item(conv_tree, + hf_tcp_convergence_shutdown_reason, tvb, + frame_offset, 1, FALSE); + frame_offset += 1; + field_length += 1; + } + if(conv_hdr & TCP_CONVERGENCE_SHUTDOWN_DELAY) { + proto_tree_add_item(conv_tree, + hf_tcp_convergence_shutdown_delay, tvb, + frame_offset, 2, FALSE); + frame_offset += 2; + field_length += 2; + } + proto_item_set_len(conv_item, field_length); + } + else if(conv_hdr == TCP_CONVERGENCE_REFUSE_BUNDLE) { /*No valid flags*/ + proto_item_set_len(conv_item, 1); + proto_tree_add_text(conv_tree, tvb, frame_offset, + 1, "Pkt Type: Refuse Bundle"); + frame_offset += 1; + } + else { + proto_tree_add_text(conv_tree, tvb, frame_offset, + -1, "Invalid/Partial Convergence Layer Packet"); + return; + } + } + } /*end while()*/ return; } @@ -506,14 +505,14 @@ static void dissect_udp_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - int buffer_size; /*Number of bytes in buffer that can be processed*/ - int hdr_offset; - int lasthdrflag; - guint8 next_header_type; - proto_item *ti = NULL; - proto_tree *bundle_tree = NULL; - proto_item *primary_item = NULL; - proto_tree *primary_tree = NULL; + int buffer_size; /*Number of bytes in buffer that can be processed*/ + int hdr_offset; + int lasthdrflag; + guint8 next_header_type; + proto_item *ti; + proto_tree *bundle_tree; + proto_item *primary_item; + proto_tree *primary_tree; buffer_size = tvb_reported_length_remaining(tvb, 0); col_set_str(pinfo->cinfo, COL_PROTOCOL, "Bundle"); @@ -524,12 +523,12 @@ dissect_udp_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) bundle_tree = proto_item_add_subtree(ti, ett_bundle); primary_item = proto_tree_add_text(bundle_tree, tvb, 0, -1, - "Primary Bundle Header"); + "Primary Bundle Header"); primary_tree = proto_item_add_subtree(primary_item, ett_primary_hdr); hdr_offset = dissect_primary_header(pinfo, primary_tree, tvb); if(hdr_offset == 0) { - col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error"); - return; + col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error"); + return; } proto_item_set_len(primary_item, hdr_offset); @@ -539,25 +538,25 @@ dissect_udp_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) lasthdrflag = 0; while((hdr_offset > 0) && (buffer_size > hdr_offset)) { - gint payload_size; + gint payload_size; - next_header_type = tvb_get_guint8(tvb, hdr_offset); - if(next_header_type == PAYLOAD_HEADER_TYPE) { - payload_size = - dissect_payload_header(bundle_tree, tvb, hdr_offset, &lasthdrflag); - } - else { /*Assume anything else is a Metadata Block*/ - payload_size = display_metadata_block(bundle_tree, tvb, - hdr_offset, &lasthdrflag); - } - if(payload_size == 0) { - col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error"); - return; - } - hdr_offset += payload_size; - if(lasthdrflag) { - return; - } + next_header_type = tvb_get_guint8(tvb, hdr_offset); + if(next_header_type == PAYLOAD_HEADER_TYPE) { + payload_size = + dissect_payload_header(bundle_tree, tvb, hdr_offset, &lasthdrflag); + } + else { /*Assume anything else is a Metadata Block*/ + payload_size = display_metadata_block(bundle_tree, tvb, + hdr_offset, &lasthdrflag); + } + if(payload_size == 0) { + col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error"); + return; + } + hdr_offset += payload_size; + if(lasthdrflag) { + return; + } } return; } @@ -565,15 +564,16 @@ dissect_udp_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static int dissect_tcp_convergence_data_header(tvbuff_t *tvb, proto_tree *tree) { - proto_item *conv_item = NULL; - proto_tree *conv_tree = NULL; - int buflen = tvb_length(tvb); - int sdnv_length; - int segment_length; - proto_item *conv_flag_item = NULL; - proto_tree *conv_flag_tree = NULL; - guint8 tcp_convergence_hdr_procflags; + proto_item *conv_item; + proto_tree *conv_tree; + int buflen; + int sdnv_length; + int segment_length; + proto_item *conv_flag_item; + proto_tree *conv_flag_tree; + guint8 tcp_convergence_hdr_procflags; + buflen = tvb_length(tvb); conv_item = proto_tree_add_text(tree, tvb, 0, -1, "TCP Convergence Header"); conv_tree = proto_item_add_subtree(conv_item, ett_tcp_conv_hdr); proto_tree_add_text(conv_tree, tvb, 0, 1, "Pkt Type: Data"); @@ -581,12 +581,12 @@ dissect_tcp_convergence_data_header(tvbuff_t *tvb, proto_tree *tree) /* Add tree for Start/End bits */ tcp_convergence_hdr_procflags = tvb_get_guint8(tvb, 0); conv_flag_item = proto_tree_add_item(conv_tree, hf_tcp_convergence_data_procflags, tvb, - 0, 1, FALSE); + 0, 1, FALSE); conv_flag_tree = proto_item_add_subtree(conv_flag_item, ett_conv_flags); proto_tree_add_boolean(conv_flag_tree, hf_tcp_convergence_data_procflags_start, - tvb, 0, 1, tcp_convergence_hdr_procflags); + tvb, 0, 1, tcp_convergence_hdr_procflags); proto_tree_add_boolean(conv_flag_tree, hf_tcp_convergence_data_procflags_end, - tvb, 0, 1, tcp_convergence_hdr_procflags); + tvb, 0, 1, tcp_convergence_hdr_procflags); segment_length = evaluate_sdnv(tvb, 1, &sdnv_length); proto_tree_add_text(conv_tree, tvb, 1, sdnv_length, "Segment Length: %d", segment_length); @@ -602,21 +602,19 @@ dissect_tcp_convergence_data_header(tvbuff_t *tvb, proto_tree *tree) int dissect_complete_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_item *primary_item = NULL; - proto_tree *primary_tree = NULL; - int primary_header_size; - int payload_size = 0; - int lastheader = 0; - int offset; - guint8 next_header_type; + proto_item *primary_item; + proto_tree *primary_tree; + int primary_header_size; + gboolean lastheader = FALSE; + int offset; primary_item = proto_tree_add_text(tree, tvb, 0, -1, - "Primary Bundle Header"); + "Primary Bundle Header"); primary_tree = proto_item_add_subtree(primary_item, ett_primary_hdr); primary_header_size = dissect_primary_header(pinfo, primary_tree, tvb); - if(primary_header_size == 0) { /*Couldn't parse primary header*/ - col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error"); - return(0); /*Give up*/ + if(primary_header_size == 0) { /*Couldn't parse primary header*/ + col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error"); + return(0); /*Give up*/ } proto_item_set_len(primary_item, primary_header_size); offset = primary_header_size; @@ -625,26 +623,26 @@ dissect_complete_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) * Done with primary header; decode the remaining headers */ - while(lastheader == 0) { - next_header_type = tvb_get_guint8(tvb, offset); - if(next_header_type == PAYLOAD_HEADER_TYPE) { + while(lastheader == FALSE) { + guint8 next_header_type; + int payload_size; - /* - * Returns payload size or 0 if can't parse payload - */ + next_header_type = tvb_get_guint8(tvb, offset); + if(next_header_type == PAYLOAD_HEADER_TYPE) { - payload_size = dissect_payload_header(tree, tvb, offset, &lastheader); - } - else { /*Assume anything else is a Metadata Block*/ - payload_size = display_metadata_block(tree, tvb, - offset, &lastheader); - } - if(payload_size == 0) { /*Payload header parse failed*/ - - col_set_str(pinfo->cinfo, COL_INFO, "Dissection Failed"); - return (0); - } - offset += payload_size; + /* + * Returns payload size or 0 if can't parse payload + */ + payload_size = dissect_payload_header(tree, tvb, offset, &lastheader); + } + else { /*Assume anything else is a Metadata Block*/ + payload_size = display_metadata_block(tree, tvb, offset, &lastheader); + } + if(payload_size == 0) { /*Payload header parse failed*/ + col_set_str(pinfo->cinfo, COL_INFO, "Dissection Failed"); + return (0); + } + offset += payload_size; } return(offset); } @@ -657,109 +655,117 @@ dissect_complete_bundle(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static int dissect_primary_header(packet_info *pinfo, proto_tree *primary_tree, tvbuff_t *tvb) { - guint8 cosflags; - guint8 *dict_ptr; - guint8 *string_ptr; - gint string_length; - int offset; /*Total offset into frame (frame_offset + convergence layer size)*/ - int sdnv_length; - int dest_scheme_offset, dest_ssp_offset, source_scheme_offset, source_ssp_offset; - int report_scheme_offset, report_ssp_offset, cust_scheme_offset, cust_ssp_offset; - int fragment_offset, total_adu_length; - int dst_scheme_pos, src_scheme_pos, rpt_scheme_pos, cust_scheme_pos; - int dst_scheme_len, src_scheme_len, rpt_scheme_len, cust_scheme_len; - int dst_ssp_len, src_ssp_len, rpt_ssp_len, cust_ssp_len; - const gchar *src_node; - const gchar *dst_node; - - guint8 srrflags; + gint offset; guint8 version; - proto_item *srr_flag_item = NULL; - proto_tree *srr_flag_tree = NULL; - - proto_item *proc_flag_item = NULL; - proto_tree *proc_flag_tree = NULL; - proto_item *cos_flag_item = NULL; - proto_tree *cos_flag_tree = NULL; - proto_item *hdr_length_item = NULL; - proto_item *dict_length_item = NULL; - proto_item *dict_item = NULL; - proto_tree *dict_tree = NULL; - proto_item *dest_item = NULL; - proto_item *source_scheme_item = NULL; - proto_item *source_item = NULL; - proto_item *rpt_scheme_item = NULL; - proto_item *rpt_item = NULL; - proto_item *cust_scheme_item = NULL; - proto_item *cust_item = NULL; offset = 0; - version = tvb_get_guint8(tvb, offset); - /* Primary Header Version */ + version = tvb_get_guint8(tvb, 0); /* Primary Header Version */ + if((version != 4) && (version != 5) && (version != 6)) { - proto_tree_add_text(primary_tree, tvb, offset, 1, "Invalid Version Number"); - return 0; - } - proto_tree_add_item(primary_tree, hf_bundle_pdu_version, tvb, offset, 1, FALSE); - if((version == 5) || (version == 6)) { - return dissect_version_5_primary_header(pinfo, primary_tree, tvb); + proto_tree_add_text(primary_tree, tvb, offset, 1, "Invalid Version Number"); + return 0; } + proto_tree_add_item(primary_tree, hf_bundle_pdu_version, tvb, offset, 1, FALSE); + if (version == 4) { + return dissect_version_4_primary_header(pinfo, primary_tree, tvb); + } + else { + return dissect_version_5_and_6_primary_header(pinfo, primary_tree, tvb); + } +} + +/* XXX: Consider common functions for use by dissect_version_4_primary_header() and + dissect_version_5_and_6_primary_header() since there's much identical code + between the two. +*/ + +static int +dissect_version_4_primary_header(packet_info *pinfo, proto_tree *primary_tree, tvbuff_t *tvb) +{ + guint8 cosflags; + const guint8 *dict_ptr; + int bundle_header_length; + int bundle_header_dict_length; + int offset; /*Total offset into frame (frame_offset + convergence layer size)*/ + int sdnv_length; + int dest_scheme_offset, dest_ssp_offset, source_scheme_offset, source_ssp_offset; + int report_scheme_offset, report_ssp_offset, cust_scheme_offset, cust_ssp_offset; + int fragment_offset, total_adu_length; + int dst_scheme_pos, src_scheme_pos, rpt_scheme_pos, cust_scheme_pos; + int dst_scheme_len, src_scheme_len, rpt_scheme_len, cust_scheme_len; + int dst_ssp_len, src_ssp_len, rpt_ssp_len, cust_ssp_len; + const gchar *src_node; + const gchar *dst_node; + + guint8 srrflags; + proto_item *srr_flag_item; + proto_tree *srr_flag_tree; + + proto_item *proc_flag_item; + proto_tree *proc_flag_tree; + proto_item *cos_flag_item; + proto_tree *cos_flag_tree; + proto_item *dict_item; + proto_tree *dict_tree; + + offset = 1; /* Version Number already displayed*/ + /* Primary Header Processing Flags */ - ++offset; pri_hdr_procflags = tvb_get_guint8(tvb, offset); proc_flag_item = proto_tree_add_item(primary_tree, hf_bundle_procflags, tvb, - offset, 1, FALSE); + offset, 1, FALSE); proc_flag_tree = proto_item_add_subtree(proc_flag_item, ett_proc_flags); proto_tree_add_boolean(proc_flag_tree, hf_bundle_procflags_fragment, - tvb, offset, 1, pri_hdr_procflags); + tvb, offset, 1, pri_hdr_procflags); proto_tree_add_boolean(proc_flag_tree, hf_bundle_procflags_admin, - tvb, offset, 1, pri_hdr_procflags); + tvb, offset, 1, pri_hdr_procflags); proto_tree_add_boolean(proc_flag_tree, hf_bundle_procflags_dont_fragment, - tvb, offset, 1, pri_hdr_procflags); + tvb, offset, 1, pri_hdr_procflags); proto_tree_add_boolean(proc_flag_tree, hf_bundle_procflags_cust_xfer_req, - tvb, offset, 1, pri_hdr_procflags); + tvb, offset, 1, pri_hdr_procflags); proto_tree_add_boolean(proc_flag_tree, hf_bundle_procflags_dest_singleton, - tvb, offset, 1, pri_hdr_procflags); + tvb, offset, 1, pri_hdr_procflags); /* Primary Header COS Flags */ ++offset; cosflags = tvb_get_guint8(tvb, offset); cos_flag_item = proto_tree_add_item(primary_tree, hf_bundle_cosflags, tvb, - offset, 1, FALSE); + offset, 1, FALSE); cos_flag_tree = proto_item_add_subtree(cos_flag_item, ett_cos_flags); proto_tree_add_uint(cos_flag_tree, hf_bundle_cosflags_priority, - tvb, offset, 1, cosflags); + tvb, offset, 1, cosflags); /* Status Report Request Flags */ ++offset; srrflags = tvb_get_guint8(tvb, offset); srr_flag_item = proto_tree_add_item(primary_tree, hf_bundle_srrflags, tvb, - offset, 1, FALSE); + offset, 1, FALSE); srr_flag_tree = proto_item_add_subtree(srr_flag_item, ett_srr_flags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_receipt, - tvb, offset, 1, srrflags); + tvb, offset, 1, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_cust_accept, - tvb, offset, 1, srrflags); + tvb, offset, 1, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_forward, - tvb, offset, 1, srrflags); + tvb, offset, 1, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_delivery, - tvb, offset, 1, srrflags); + tvb, offset, 1, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_deletion, - tvb, offset, 1, srrflags); + tvb, offset, 1, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_ack, - tvb, offset, 1, srrflags); + tvb, offset, 1, srrflags); ++offset; - gbl_bundle_header_length = evaluate_sdnv(tvb, offset, &sdnv_length); - hdr_length_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if(gbl_bundle_header_length < 0) { - proto_item_set_text(hdr_length_item, "Bundle Header Length: Error"); - return 0; + + bundle_header_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(bundle_header_length < 0) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, "Bundle Header Length: Error"); + return 0; } - proto_item_set_text(hdr_length_item, - "Bundle Header Length: %d", gbl_bundle_header_length); - tvb_ensure_bytes_exist(tvb, offset + sdnv_length, gbl_bundle_header_length); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Bundle Header Length: %d", bundle_header_length); + + tvb_ensure_bytes_exist(tvb, offset + sdnv_length, bundle_header_length); offset += sdnv_length; /* @@ -770,175 +776,173 @@ dissect_primary_header(packet_info *pinfo, proto_tree *primary_tree, tvbuff_t *t dst_scheme_pos = offset; dst_scheme_len = 2; proto_tree_add_item(primary_tree, hf_bundle_dest_scheme_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; dest_ssp_offset = tvb_get_ntohs(tvb, offset); dst_ssp_len = 2; proto_tree_add_item(primary_tree, hf_bundle_dest_ssp_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; source_scheme_offset = tvb_get_ntohs(tvb, offset); src_scheme_pos = offset; src_scheme_len = 2; proto_tree_add_item(primary_tree, hf_bundle_source_scheme_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; source_ssp_offset = tvb_get_ntohs(tvb, offset); src_ssp_len = 2; proto_tree_add_item(primary_tree, hf_bundle_source_ssp_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; report_scheme_offset = tvb_get_ntohs(tvb, offset); rpt_scheme_pos = offset; rpt_scheme_len = 2; proto_tree_add_item(primary_tree, hf_bundle_report_scheme_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; report_ssp_offset = tvb_get_ntohs(tvb, offset); rpt_ssp_len = 2; proto_tree_add_item(primary_tree, hf_bundle_report_ssp_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; cust_scheme_offset = tvb_get_ntohs(tvb, offset); cust_scheme_pos = offset; cust_scheme_len = 2; proto_tree_add_item(primary_tree, hf_bundle_cust_scheme_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; cust_ssp_offset = tvb_get_ntohs(tvb, offset); cust_ssp_len = 2; proto_tree_add_item(primary_tree, hf_bundle_cust_ssp_offset, - tvb, offset, 2, FALSE); + tvb, offset, 2, FALSE); offset += 2; proto_tree_add_item(primary_tree, hf_bundle_creation_timestamp, - tvb, offset, 8, FALSE); + tvb, offset, 8, FALSE); offset += 8; proto_tree_add_item(primary_tree, hf_bundle_lifetime, tvb, offset, 4, FALSE); offset += 4; - gbl_bundle_header_dict_length = evaluate_sdnv(tvb, offset, &sdnv_length); - dict_length_item = proto_tree_add_text(primary_tree, - tvb, offset, sdnv_length, " "); - if(gbl_bundle_header_dict_length < 0) { - proto_item_set_text(dict_length_item, "Dictionary Length: Error"); - return 0; + bundle_header_dict_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(bundle_header_dict_length < 0) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, "Dictionary Length: Error"); + return 0; } - proto_item_set_text(dict_length_item, "Dictionary Length: %d", - gbl_bundle_header_dict_length); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Dictionary Length: %d", bundle_header_dict_length); offset += sdnv_length; - tvb_ensure_bytes_exist(tvb, offset, gbl_bundle_header_dict_length); /* * Pull out stuff from the dictionary */ - dict_item = proto_tree_add_text(primary_tree, tvb, offset, - gbl_bundle_header_dict_length, "Dictionary"); + tvb_ensure_bytes_exist(tvb, offset, bundle_header_dict_length); + + dict_item = proto_tree_add_text(primary_tree, tvb, offset, bundle_header_dict_length, "Dictionary"); dict_tree = proto_item_add_subtree(dict_item, ett_dictionary); - dict_ptr = (guint8 *) tvb_get_ptr(tvb, offset, gbl_bundle_header_dict_length); + /* * If the dictionary length is 0, then the CBHE block compression method is applied. * So the scheme offset is the node number and the ssp offset is the service number. * If destination scheme offset is 2 and destination ssp offset is 1, then the EID is * ipn:2.1 */ - if(gbl_bundle_header_dict_length == 0) + if(bundle_header_dict_length == 0) { - /* - * Destination info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Destination Scheme: %s",IPN_SCHEME_STR); - if(dest_scheme_offset == 0 && dest_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, dst_scheme_pos, - dst_scheme_len + dst_ssp_len, "Destination: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, dst_scheme_pos, - dst_scheme_len + dst_ssp_len, - "Destination: %d.%d",dest_scheme_offset,dest_ssp_offset); - } - - /* - * Source info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Source Scheme: %s",IPN_SCHEME_STR); - if(source_scheme_offset == 0 && source_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, src_scheme_pos, - src_scheme_len + src_ssp_len, "Source: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, src_scheme_pos, - src_scheme_len + src_ssp_len, - "Source: %d.%d",source_scheme_offset,source_ssp_offset); - } + /* + * Destination info + */ + proto_tree_add_text(dict_tree, tvb, 0, + 0, "Destination Scheme: %s",IPN_SCHEME_STR); + if(dest_scheme_offset == 0 && dest_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, dst_scheme_pos, + dst_scheme_len + dst_ssp_len, "Destination: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, dst_scheme_pos, + dst_scheme_len + dst_ssp_len, + "Destination: %d.%d",dest_scheme_offset,dest_ssp_offset); + } - /* - * Report to info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Report Scheme: %s",IPN_SCHEME_STR); - if(report_scheme_offset == 0 && report_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, rpt_scheme_pos, - rpt_scheme_len + rpt_ssp_len, "Report: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, rpt_scheme_pos, - rpt_scheme_len + rpt_ssp_len, - "Report: %d.%d",report_scheme_offset,report_ssp_offset); - } + /* + * Source info + */ + proto_tree_add_text(dict_tree, tvb, 0, + 0, "Source Scheme: %s",IPN_SCHEME_STR); + if(source_scheme_offset == 0 && source_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, src_scheme_pos, + src_scheme_len + src_ssp_len, "Source: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, src_scheme_pos, + src_scheme_len + src_ssp_len, + "Source: %d.%d",source_scheme_offset,source_ssp_offset); + } - /* - * Custodian info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Custodian Scheme: %s",IPN_SCHEME_STR); - if(cust_scheme_offset == 0 && cust_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, - cust_scheme_len + cust_ssp_len, "Custodian: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, - cust_scheme_len + cust_ssp_len, - "Custodian: %d.%d",cust_scheme_offset,cust_ssp_offset); - } + /* + * Report to info + */ + proto_tree_add_text(dict_tree, tvb, 0, + 0, "Report Scheme: %s",IPN_SCHEME_STR); + if(report_scheme_offset == 0 && report_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, rpt_scheme_pos, + rpt_scheme_len + rpt_ssp_len, "Report: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, rpt_scheme_pos, + rpt_scheme_len + rpt_ssp_len, + "Report: %d.%d",report_scheme_offset,report_ssp_offset); + } - if(source_scheme_offset == 0 && source_ssp_offset == 0) - { - src_node = "Null"; - } - else - { - src_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, source_scheme_offset, source_ssp_offset); - } - if(dest_scheme_offset == 0 && dest_ssp_offset == 0) - { - dst_node = "Null"; - } - else - { - dst_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, dest_scheme_offset, dest_ssp_offset); - } + /* + * Custodian info + */ + proto_tree_add_text(dict_tree, tvb, 0, + 0, "Custodian Scheme: %s",IPN_SCHEME_STR); + if(cust_scheme_offset == 0 && cust_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, + cust_scheme_len + cust_ssp_len, "Custodian: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, + cust_scheme_len + cust_ssp_len, + "Custodian: %d.%d",cust_scheme_offset,cust_ssp_offset); + } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s > %s", src_node,dst_node); + if(source_scheme_offset == 0 && source_ssp_offset == 0) + { + src_node = "Null"; + } + else + { + src_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, source_scheme_offset, source_ssp_offset); + } + if(dest_scheme_offset == 0 && dest_ssp_offset == 0) + { + dst_node = "Null"; + } + else + { + dst_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, dest_scheme_offset, dest_ssp_offset); + } + + col_add_fstr(pinfo->cinfo, COL_INFO, "%s > %s", src_node,dst_node); } /* @@ -948,94 +952,66 @@ dissect_primary_header(packet_info *pinfo, proto_tree *primary_tree, tvbuff_t *t else { - /* - * Destination info - */ - string_ptr = tvb_get_ephemeral_stringz(tvb, offset + dest_scheme_offset, &string_length); + /* + * Destination info + */ - proto_tree_add_text(dict_tree, tvb, offset + dest_scheme_offset, - (gint)strlen((char *) (dict_ptr + dest_scheme_offset)), - "Destination Scheme: %s", string_ptr); - string_ptr = tvb_get_ephemeral_stringz(tvb, offset + dest_ssp_offset, &string_length); - dest_item = proto_tree_add_text(dict_tree, tvb, offset + dest_ssp_offset, - (gint)strlen((char *) (dict_ptr + dest_ssp_offset)), " "); - proto_item_set_text(dest_item, "Destination: %s", string_ptr); + proto_tree_add_item(dict_tree, hf_bundle_dest_scheme, tvb, offset + dest_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_dest_ssp, tvb, offset + dest_ssp_offset, -1, FALSE); - /* - * Source info - */ - - string_ptr = tvb_get_ephemeral_stringz(tvb, - offset + source_scheme_offset, &string_length); - source_scheme_item = proto_tree_add_text(dict_tree, tvb, offset+source_scheme_offset, - (gint)strlen((char *) (dict_ptr + source_scheme_offset)), " "); - proto_item_set_text(source_scheme_item, "Source Scheme: %s", string_ptr); - string_ptr = tvb_get_ephemeral_stringz(tvb, - offset + source_ssp_offset, &string_length); - source_item = proto_tree_add_text(dict_tree, tvb, offset + source_ssp_offset, - (gint)strlen((char *) (dict_ptr + source_ssp_offset)), " "); - proto_item_set_text(source_item, "Source: %s", string_ptr); + /* + * Source info + */ - /* - * Report to info - */ + proto_tree_add_item(dict_tree, hf_bundle_source_scheme, tvb, offset + source_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_source_ssp, tvb, offset + source_ssp_offset, -1, FALSE); - string_ptr = tvb_get_ephemeral_stringz(tvb, - offset + report_scheme_offset, &string_length); - rpt_scheme_item = proto_tree_add_text(dict_tree, tvb, offset + report_scheme_offset, - (gint)strlen((char *) (dict_ptr + report_scheme_offset)), " "); - proto_item_set_text(rpt_scheme_item, "Report To Scheme: %s", string_ptr); - string_ptr = tvb_get_ephemeral_stringz(tvb, - offset + report_ssp_offset, &string_length); - rpt_item = proto_tree_add_text(dict_tree, tvb, offset + report_ssp_offset, - (gint)strlen((char *) (dict_ptr + report_ssp_offset)), " "); - proto_item_set_text(rpt_item, "Report To: %s", string_ptr); + /* + * Report to info + */ - /* - * Custodian info - */ - - string_ptr = tvb_get_ephemeral_stringz(tvb, - offset + cust_scheme_offset, &string_length); - cust_scheme_item = proto_tree_add_text(dict_tree, tvb, offset + cust_scheme_offset, - (gint)strlen((char *) (dict_ptr + cust_scheme_offset)), " "); - proto_item_set_text(cust_scheme_item, "Custodian Scheme: %s", string_ptr); - string_ptr = tvb_get_ephemeral_stringz(tvb, - offset + cust_ssp_offset, &string_length); - cust_item = proto_tree_add_text(dict_tree, tvb, offset + cust_ssp_offset, - (gint)strlen((char *) (dict_ptr + cust_ssp_offset)), " "); - proto_item_set_text(cust_item, "Custodian: %s", string_ptr); + proto_tree_add_item(dict_tree, hf_bundle_report_scheme, tvb, offset + report_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_report_ssp, tvb, offset + report_ssp_offset, -1, FALSE); - /* - * Add Source/Destination to INFO Field - */ + /* + * Custodian info + */ - col_add_fstr(pinfo->cinfo, COL_INFO, "%s:%s > %s:%s", - dict_ptr + source_scheme_offset, dict_ptr + source_ssp_offset, - dict_ptr + dest_scheme_offset, dict_ptr + dest_ssp_offset); + proto_tree_add_item(dict_tree, hf_bundle_custodian_scheme, tvb, offset + cust_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_custodian_ssp, tvb, offset + cust_ssp_offset, -1, FALSE); + + /* + * Add Source/Destination to INFO Field + */ + + /* Note: If we get this far, the offsets (and the strings) are at least within the TVB */ + dict_ptr = tvb_get_ptr(tvb, offset, bundle_header_dict_length); + col_add_fstr(pinfo->cinfo, COL_INFO, "%s:%s > %s:%s", + dict_ptr + source_scheme_offset, dict_ptr + source_ssp_offset, + dict_ptr + dest_scheme_offset, dict_ptr + dest_ssp_offset); } - offset += gbl_bundle_header_dict_length; /*Skip over dictionary*/ + offset += bundle_header_dict_length; /*Skip over dictionary*/ /* * Do this only if Fragment Flag is set */ if(pri_hdr_procflags & BUNDLE_PROCFLAGS_FRAG_MASK) { - fragment_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - if(fragment_offset < 0) { - return 0; - } - proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, - "Fragment Offset: %d", fragment_offset); - offset += sdnv_length; + fragment_offset = evaluate_sdnv(tvb, offset, &sdnv_length); + if(fragment_offset < 0) { + return 0; + } + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Fragment Offset: %d", fragment_offset); + offset += sdnv_length; - total_adu_length = evaluate_sdnv(tvb, offset, &sdnv_length); - if(total_adu_length < 0) { - return 0; - } - proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, - "Total Application Data Unit Length: %d", fragment_offset); - offset += sdnv_length; + total_adu_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(total_adu_length < 0) { + return 0; + } + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Total Application Data Unit Length: %d", fragment_offset); + offset += sdnv_length; } return (offset); } @@ -1047,21 +1023,21 @@ dissect_primary_header(packet_info *pinfo, proto_tree *primary_tree, tvbuff_t *t */ static int -dissect_version_5_primary_header(packet_info *pinfo, - proto_tree *primary_tree, tvbuff_t *tvb) +dissect_version_5_and_6_primary_header(packet_info *pinfo, + proto_tree *primary_tree, tvbuff_t *tvb) { guint64 bundle_processing_control_flags; guint8 cosflags; - guint8 *dict_ptr; - gchar *string_ptr; - gint string_length; - int offset; /*Total offset into frame (frame_offset + convergence layer size)*/ + const guint8 *dict_ptr; + int bundle_header_length; + int bundle_header_dict_length; + int offset; /*Total offset into frame (frame_offset + convergence layer size)*/ int sdnv_length; int dest_scheme_offset, dest_ssp_offset, source_scheme_offset, source_ssp_offset; int report_scheme_offset, report_ssp_offset, cust_scheme_offset, cust_ssp_offset; - int dst_scheme_pos, src_scheme_pos, rpt_scheme_pos, cust_scheme_pos; - int dst_scheme_len, src_scheme_len, rpt_scheme_len, cust_scheme_len; - int dst_ssp_len, src_ssp_len, rpt_ssp_len, cust_ssp_len; + int dest_scheme_pos, source_scheme_pos, report_scheme_pos, cust_scheme_pos; + int dest_scheme_len, source_scheme_len, report_scheme_len, cust_scheme_len; + int dest_ssp_len, source_ssp_len, report_ssp_len, cust_ssp_len; int fragment_offset, total_adu_length; int timestamp; time_t time_since_2000; @@ -1071,116 +1047,104 @@ dissect_version_5_primary_header(packet_info *pinfo, const gchar *src_node; const gchar *dst_node; guint8 srrflags; - proto_item *srr_flag_item = NULL; - proto_tree *srr_flag_tree = NULL; - proto_item *gen_flag_item = NULL; - proto_tree *gen_flag_tree = NULL; + proto_item *srr_flag_item; + proto_tree *srr_flag_tree; + proto_item *gen_flag_item; + proto_tree *gen_flag_tree; - proto_item *proc_flag_item = NULL; - proto_tree *proc_flag_tree = NULL; - proto_item *cos_flag_item = NULL; - proto_item *cos_flag_value = NULL; - proto_tree *cos_flag_tree = NULL; - proto_item *hdr_length_item = NULL; - proto_item *dict_length_item = NULL; - proto_item *dict_item = NULL; - proto_tree *dict_tree = NULL; + proto_item *proc_flag_item; + proto_tree *proc_flag_tree; + proto_item *cos_flag_item; + proto_tree *cos_flag_tree; + proto_item *dict_item; + proto_tree *dict_tree; - proto_item *timestamp_item = NULL; - proto_item *timestamp_sequence_item = NULL; - proto_item *lifetime_item = NULL; - proto_item *dest_scheme_offset_item = NULL; - proto_item *dest_ssp_offset_item = NULL; - proto_item *source_scheme_offset_item = NULL; - proto_item *source_ssp_offset_item = NULL; - proto_item *report_scheme_offset_item = NULL; - proto_item *report_ssp_offset_item = NULL; - proto_item *cust_scheme_offset_item = NULL; - proto_item *cust_ssp_offset_item = NULL; - offset = 1; /*Already displayed Version Number*/ + offset = 1; /* Version Number already displayed */ bundle_processing_control_flags = evaluate_sdnv_64(tvb, offset, &sdnv_length); /* Primary Header Processing Flags */ pri_hdr_procflags = (guint8) (bundle_processing_control_flags & 0x7f); if (sdnv_length < 1) { - expert_add_info_format(pinfo, primary_tree, PI_UNDECODED, PI_WARN, "Wrong bundle control flag length: %d", sdnv_length); - return 0; + expert_add_info_format(pinfo, primary_tree, PI_UNDECODED, PI_WARN, + "Wrong bundle control flag length: %d", sdnv_length); + return 0; } proc_flag_item = proto_tree_add_item(primary_tree, hf_bundle_control_flags, tvb, - offset, sdnv_length, FALSE); + offset, sdnv_length, FALSE); proc_flag_tree = proto_item_add_subtree(proc_flag_item, ett_proc_flags); gen_flag_item = proto_tree_add_text(proc_flag_tree, tvb, offset, - sdnv_length, "General Flags"); + sdnv_length, "General Flags"); gen_flag_tree = proto_item_add_subtree(gen_flag_item, ett_gen_flags); proto_tree_add_boolean(gen_flag_tree, hf_bundle_procflags_fragment, - tvb, offset, sdnv_length, pri_hdr_procflags); + tvb, offset, sdnv_length, pri_hdr_procflags); proto_tree_add_boolean(gen_flag_tree, hf_bundle_procflags_admin, - tvb, offset, sdnv_length, pri_hdr_procflags); + tvb, offset, sdnv_length, pri_hdr_procflags); proto_tree_add_boolean(gen_flag_tree, hf_bundle_procflags_dont_fragment, - tvb, offset, sdnv_length, pri_hdr_procflags); + tvb, offset, sdnv_length, pri_hdr_procflags); proto_tree_add_boolean(gen_flag_tree, hf_bundle_procflags_cust_xfer_req, - tvb, offset, sdnv_length, pri_hdr_procflags); + tvb, offset, sdnv_length, pri_hdr_procflags); proto_tree_add_boolean(gen_flag_tree, hf_bundle_procflags_dest_singleton, - tvb, offset, sdnv_length, pri_hdr_procflags); + tvb, offset, sdnv_length, pri_hdr_procflags); proto_tree_add_boolean(gen_flag_tree, hf_bundle_procflags_application_ack, - tvb, offset, sdnv_length, pri_hdr_procflags); + tvb, offset, sdnv_length, pri_hdr_procflags); /* Primary Header COS Flags */ cosflags = (guint8) ((bundle_processing_control_flags >> 7) & 0x7f); cos_flag_item = proto_tree_add_text(proc_flag_tree, tvb, offset, - sdnv_length, "Class of Service Flags"); + sdnv_length, "Class of Service Flags"); cos_flag_tree = proto_item_add_subtree(cos_flag_item, ett_cos_flags); if((cosflags & BUNDLE_COSFLAGS_PRIORITY_MASK) == BUNDLE_COSFLAGS_PRIORITY_BULK) { - cos_flag_value = proto_tree_add_text(cos_flag_tree, tvb, offset, - sdnv_length, "00 -- Priority = Bulk"); + proto_tree_add_text(cos_flag_tree, tvb, offset, + sdnv_length, "00 -- Priority = Bulk"); } else if((cosflags & BUNDLE_COSFLAGS_PRIORITY_MASK) == - BUNDLE_COSFLAGS_PRIORITY_NORMAL) { - cos_flag_value = proto_tree_add_text(cos_flag_tree, tvb, offset, - sdnv_length, "01 -- Priority = Normal"); + BUNDLE_COSFLAGS_PRIORITY_NORMAL) { + proto_tree_add_text(cos_flag_tree, tvb, offset, + sdnv_length, "01 -- Priority = Normal"); } else if((cosflags & BUNDLE_COSFLAGS_PRIORITY_MASK) == - BUNDLE_COSFLAGS_PRIORITY_EXP) { - cos_flag_value = proto_tree_add_text(cos_flag_tree, tvb, offset, - sdnv_length, "10 -- Priority = Expedited"); + BUNDLE_COSFLAGS_PRIORITY_EXP) { + proto_tree_add_text(cos_flag_tree, tvb, offset, + sdnv_length, "10 -- Priority = Expedited"); } else { - cos_flag_value = proto_tree_add_text(cos_flag_tree, tvb, offset, - sdnv_length, "11 -- Invalid (Reserved)"); - return 0; + proto_tree_add_text(cos_flag_tree, tvb, offset, + sdnv_length, "11 -- Invalid (Reserved)"); + return 0; } /* Status Report Request Flags */ srrflags = (guint8) ((bundle_processing_control_flags >> 14) & 0x7f); srr_flag_item = proto_tree_add_text(proc_flag_tree, tvb, offset, - sdnv_length, "Status Report Request Flags"); + sdnv_length, "Status Report Request Flags"); srr_flag_tree = proto_item_add_subtree(srr_flag_item, ett_srr_flags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_receipt, - tvb, offset, sdnv_length, srrflags); + tvb, offset, sdnv_length, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_cust_accept, - tvb, offset, sdnv_length, srrflags); + tvb, offset, sdnv_length, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_forward, - tvb, offset, sdnv_length, srrflags); + tvb, offset, sdnv_length, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_delivery, - tvb, offset, sdnv_length, srrflags); + tvb, offset, sdnv_length, srrflags); proto_tree_add_boolean(srr_flag_tree, hf_bundle_srrflags_report_deletion, - tvb, offset, sdnv_length, srrflags); + tvb, offset, sdnv_length, srrflags); offset += sdnv_length; - gbl_bundle_header_length = evaluate_sdnv(tvb, offset, &sdnv_length); - hdr_length_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if(gbl_bundle_header_length < 0) { - proto_item_set_text(hdr_length_item, "Bundle Header Length: Error"); - return 0; + /* -- hdr_length -- */ + bundle_header_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(bundle_header_length < 0) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Bundle Header Length: Error"); + return 0; } - proto_item_set_text(hdr_length_item, - "Bundle Header Length: %d", gbl_bundle_header_length); - tvb_ensure_bytes_exist(tvb, offset + sdnv_length, gbl_bundle_header_length); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Bundle Header Length: %d", bundle_header_length); + tvb_ensure_bytes_exist(tvb, offset + sdnv_length, bundle_header_length); offset += sdnv_length; /* @@ -1188,334 +1152,345 @@ dissect_version_5_primary_header(packet_info *pinfo, * hasn't told us to access way past the Primary Header. */ + /* -- dest_scheme -- */ dest_scheme_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - dst_scheme_pos = offset; - dst_scheme_len = sdnv_length; - dest_scheme_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((dest_scheme_offset < 0) || (dest_scheme_offset > gbl_bundle_header_length)) { - proto_item_set_text(dest_scheme_offset_item, "Destination Scheme Offset: Error"); - return 0; + dest_scheme_pos = offset; + dest_scheme_len = sdnv_length; + + if((dest_scheme_offset < 0) || (dest_scheme_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Destination Scheme Offset: Error"); + return 0; } - proto_item_set_text(dest_scheme_offset_item, - "Destination Scheme Offset: %d", dest_scheme_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Destination Scheme Offset: %d", dest_scheme_offset); offset += sdnv_length; + /* -- dest_ssp -- */ dest_ssp_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - dst_ssp_len = sdnv_length; - dest_ssp_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((dest_ssp_offset < 0) || (dest_ssp_offset > gbl_bundle_header_length)) { - proto_item_set_text(dest_ssp_offset_item, "Destination SSP Offset: Error"); - return 0; + dest_ssp_len = sdnv_length; + + if((dest_ssp_offset < 0) || (dest_ssp_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Destination SSP Offset: Error"); + return 0; } - proto_item_set_text(dest_ssp_offset_item, - "Destination SSP Offset: %d", dest_ssp_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Destination SSP Offset: %d", dest_ssp_offset); offset += sdnv_length; + + /* -- source_scheme -- */ source_scheme_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - src_scheme_pos = offset; - src_scheme_len = sdnv_length; - source_scheme_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((source_scheme_offset < 0) || (source_scheme_offset > gbl_bundle_header_length)) { - proto_item_set_text(source_scheme_offset_item, "Source Scheme Offset: Error"); - return 0; + source_scheme_pos = offset; + source_scheme_len = sdnv_length; + + if((source_scheme_offset < 0) || (source_scheme_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Source Scheme Offset: Error"); + return 0; } - proto_item_set_text(source_scheme_offset_item, - "Source Scheme Offset: %d", source_scheme_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Source Scheme Offset: %d", source_scheme_offset); offset += sdnv_length; + /* -- source_ssp -- */ source_ssp_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - src_ssp_len = sdnv_length; - source_ssp_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((source_ssp_offset < 0) || (source_ssp_offset > gbl_bundle_header_length)) { - proto_item_set_text(source_ssp_offset_item, "Source SSP Offset: Error"); - return 0; + source_ssp_len = sdnv_length; + + if((source_ssp_offset < 0) || (source_ssp_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Source SSP Offset: Error"); + return 0; } - proto_item_set_text(source_ssp_offset_item, - "Source SSP Offset: %d", source_ssp_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Source SSP Offset: %d", source_ssp_offset); offset += sdnv_length; + + /* -- report_scheme -- */ report_scheme_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - rpt_scheme_pos = offset; - rpt_scheme_len = sdnv_length; - report_scheme_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((report_scheme_offset < 0) || (report_scheme_offset > gbl_bundle_header_length)) { - proto_item_set_text(report_scheme_offset_item, "Report Scheme Offset: Error"); - return 0; + report_scheme_pos = offset; + report_scheme_len = sdnv_length; + + if((report_scheme_offset < 0) || (report_scheme_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Report Scheme Offset: Error"); + return 0; } - proto_item_set_text(report_scheme_offset_item, - "Report Scheme Offset: %d", report_scheme_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Report Scheme Offset: %d", report_scheme_offset); offset += sdnv_length; + /* -- report_ssp -- */ report_ssp_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - rpt_ssp_len = sdnv_length; - report_ssp_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((report_ssp_offset < 0) || (report_ssp_offset > gbl_bundle_header_length)) { - proto_item_set_text(report_ssp_offset_item, "Report SSP Offset: Error"); - return 0; + report_ssp_len = sdnv_length; + + if((report_ssp_offset < 0) || (report_ssp_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Report SSP Offset: Error"); + return 0; } - proto_item_set_text(report_ssp_offset_item, - "Report SSP Offset: %d", report_ssp_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Report SSP Offset: %d", report_ssp_offset); offset += sdnv_length; + + /* -- cust_scheme -- */ cust_scheme_offset = evaluate_sdnv(tvb, offset, &sdnv_length); cust_scheme_pos = offset; cust_scheme_len = sdnv_length; - cust_scheme_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((cust_scheme_offset < 0) || (cust_scheme_offset > gbl_bundle_header_length)) { - proto_item_set_text(cust_scheme_offset_item, "Custodian Scheme Offset: Error"); - return 0; + + if((cust_scheme_offset < 0) || (cust_scheme_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Custodian Scheme Offset: Error"); + return 0; } - proto_item_set_text(cust_scheme_offset_item, - "Custodian Scheme Offset: %d", cust_scheme_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Custodian Scheme Offset: %d", cust_scheme_offset); offset += sdnv_length; + /* -- cust_ssp -- */ cust_ssp_offset = evaluate_sdnv(tvb, offset, &sdnv_length); cust_ssp_len = sdnv_length; - cust_ssp_offset_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if((cust_ssp_offset < 0) || (cust_ssp_offset > gbl_bundle_header_length)) { - proto_item_set_text(cust_ssp_offset_item, "Custodian SSP Offset: Error"); - return 0; + + if((cust_ssp_offset < 0) || (cust_ssp_offset > bundle_header_length)) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Custodian SSP Offset: Error"); + return 0; } - proto_item_set_text(cust_ssp_offset_item, - "Custodian SSP Offset: %d", cust_ssp_offset); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Custodian SSP Offset: %d", cust_ssp_offset); offset += sdnv_length; + + /* -- timestamp -- */ timestamp = evaluate_sdnv(tvb, offset, &sdnv_length); - timestamp_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); if(timestamp < 0) { - proto_item_set_text(timestamp_item, "Timestamp: Error"); - return 0; + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Timestamp: Error"); + return 0; } time_since_2000 = (time_t) (timestamp + 946684800); time_string = abs_time_secs_to_str(time_since_2000, ABSOLUTE_TIME_LOCAL, TRUE); - proto_item_set_text(timestamp_item, - "Timestamp: 0x%x [%s]", timestamp, time_string); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Timestamp: 0x%x [%s]", timestamp, time_string); offset += sdnv_length; + /* -- timestamp_sequence -- */ timestamp_sequence = evaluate_sdnv(tvb, offset, &sdnv_length); - timestamp_sequence_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); - if(timestamp_sequence < 0) { - gint64 ts_seq; + gint64 ts_seq; - if((ts_seq = evaluate_sdnv_64(tvb, offset, &sdnv_length)) < 0) { - proto_item_set_text(timestamp_sequence_item, "Timestamp Sequence Number: Error"); - return 0; - } - proto_item_set_text(timestamp_sequence_item, - "Timestamp Sequence Number: 0x%" G_GINT64_MODIFIER "x", ts_seq); - proto_item_set_text(timestamp_sequence_item, "Timestamp Sequence Number: Error"); - return 0; + if((ts_seq = evaluate_sdnv_64(tvb, offset, &sdnv_length)) < 0) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Timestamp Sequence Number: Error"); + return 0; + } + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Timestamp Sequence Number: 0x%" G_GINT64_MODIFIER "x", ts_seq); } else { - proto_item_set_text(timestamp_sequence_item, - "Timestamp Sequence Number: %d", timestamp_sequence); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Timestamp Sequence Number: %d", timestamp_sequence); } offset += sdnv_length; + /* -- lifetime -- */ lifetime = evaluate_sdnv(tvb, offset, &sdnv_length); - lifetime_item = proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, " "); if(lifetime < 0) { - proto_item_set_text(lifetime_item, "Lifetime: Error"); - return 0; + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Lifetime: Error"); + return 0; } - proto_item_set_text(lifetime_item, "Lifetime: %d", lifetime); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Lifetime: %d", lifetime); offset += sdnv_length; - gbl_bundle_header_dict_length = evaluate_sdnv(tvb, offset, &sdnv_length); - dict_length_item = proto_tree_add_text(primary_tree, - tvb, offset, sdnv_length, " "); - if(gbl_bundle_header_dict_length < 0) { - proto_item_set_text(dict_length_item, "Dictionary Length: Error"); - return 0; + /* -- dict_length -- */ + bundle_header_dict_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(bundle_header_dict_length < 0) { + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Dictionary Length: Error"); + return 0; } - proto_item_set_text(dict_length_item, "Dictionary Length: %d", - gbl_bundle_header_dict_length); + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Dictionary Length: %d",bundle_header_dict_length); offset += sdnv_length; - tvb_ensure_bytes_exist(tvb, offset, gbl_bundle_header_dict_length); /* * Pull out stuff from the dictionary */ - dict_item = proto_tree_add_text(primary_tree, tvb, offset, - gbl_bundle_header_dict_length, "Dictionary"); + tvb_ensure_bytes_exist(tvb, offset, bundle_header_dict_length); + + dict_item = proto_tree_add_text(primary_tree, tvb, offset, bundle_header_dict_length, + "Dictionary"); dict_tree = proto_item_add_subtree(dict_item, ett_dictionary); - dict_ptr = (guint8 *) tvb_get_ptr(tvb, offset, gbl_bundle_header_dict_length); - if(gbl_bundle_header_dict_length == 0) + if(bundle_header_dict_length == 0) { - /* - * Destination info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Destination Scheme: %s",IPN_SCHEME_STR); - if(dest_scheme_offset == 0 && dest_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, dst_scheme_pos, - dst_scheme_len + dst_ssp_len, "Destination: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, dst_scheme_pos, - dst_scheme_len + dst_ssp_len, - "Destination: %d.%d",dest_scheme_offset,dest_ssp_offset); - } - - /* - * Source info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Source Scheme: %s",IPN_SCHEME_STR); - if(source_scheme_offset == 0 && source_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, src_scheme_pos, - src_scheme_len + src_ssp_len, "Source: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, src_scheme_pos, - src_scheme_len + src_ssp_len, - "Source: %d.%d",source_scheme_offset,source_ssp_offset); - } + /* + * Destination info + */ + proto_tree_add_text(dict_tree, tvb, + 0, 0, + "Destination Scheme: %s",IPN_SCHEME_STR); + if(dest_scheme_offset == 0 && dest_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, + dest_scheme_pos, dest_scheme_len + dest_ssp_len, + "Destination: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, + dest_scheme_pos, dest_scheme_len + dest_ssp_len, + "Destination: %d.%d",dest_scheme_offset,dest_ssp_offset); + } - /* - * Report to info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Report Scheme: %s",IPN_SCHEME_STR); - if(report_scheme_offset == 0 && report_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, rpt_scheme_pos, - rpt_scheme_len + rpt_ssp_len, "Report: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, rpt_scheme_pos, - rpt_scheme_len + rpt_ssp_len, - "Report: %d.%d",report_scheme_offset,report_ssp_offset); - } + /* + * Source info + */ + proto_tree_add_text(dict_tree, tvb, + 0, 0, + "Source Scheme: %s",IPN_SCHEME_STR); + if(source_scheme_offset == 0 && source_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, + source_scheme_pos, source_scheme_len + source_ssp_len, + "Source: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, + source_scheme_pos, source_scheme_len + source_ssp_len, + "Source: %d.%d",source_scheme_offset,source_ssp_offset); + } - /* - * Custodian info - */ - proto_tree_add_text(dict_tree, tvb, 0, - 0, "Custodian Scheme: %s",IPN_SCHEME_STR); - if(cust_scheme_offset == 0 && cust_ssp_offset == 0) - { - proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, - cust_scheme_len + cust_ssp_len, "Custodian: Null"); - } - else - { - proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, - cust_scheme_len + cust_ssp_len, - "Custodian: %d.%d",cust_scheme_offset,cust_ssp_offset); - } + /* + * Report to info + */ + proto_tree_add_text(dict_tree, tvb, + 0, 0, + "Report Scheme: %s",IPN_SCHEME_STR); + if((report_scheme_offset == 0) && (report_ssp_offset == 0)) + { + proto_tree_add_text(dict_tree, tvb, + report_scheme_pos, report_scheme_len + report_ssp_len, + "Report: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, + report_scheme_pos, report_scheme_len + report_ssp_len, + "Report: %d.%d",report_scheme_offset,report_ssp_offset); + } - if(source_scheme_offset == 0 && source_ssp_offset == 0) - { - src_node = "Null"; - } - else - { - src_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, source_scheme_offset, source_ssp_offset); - } - if(dest_scheme_offset == 0 && dest_ssp_offset == 0) - { - dst_node = "Null"; - } - else - { - dst_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, dest_scheme_offset, dest_ssp_offset); - } + /* + * Custodian info + */ + proto_tree_add_text(dict_tree, tvb, 0, + 0, "Custodian Scheme: %s",IPN_SCHEME_STR); + if(cust_scheme_offset == 0 && cust_ssp_offset == 0) + { + proto_tree_add_text(dict_tree, tvb, + cust_scheme_pos, cust_scheme_len + cust_ssp_len, + "Custodian: Null"); + } + else + { + proto_tree_add_text(dict_tree, tvb, cust_scheme_pos, + cust_scheme_len + cust_ssp_len, + "Custodian: %d.%d",cust_scheme_offset,cust_ssp_offset); + } - col_add_fstr(pinfo->cinfo, COL_INFO, "%s > %s", src_node, dst_node); + if(source_scheme_offset == 0 && source_ssp_offset == 0) + { + src_node = "Null"; + } + else + { + src_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, source_scheme_offset, source_ssp_offset); + } + if(dest_scheme_offset == 0 && dest_ssp_offset == 0) + { + dst_node = "Null"; + } + else + { + dst_node = ep_strdup_printf("%s:%d.%d",IPN_SCHEME_STR, dest_scheme_offset, dest_ssp_offset); + } + + col_add_fstr(pinfo->cinfo, COL_INFO, "%s > %s", src_node, dst_node); } else { - /* - * This pointer can be made to address outside the packet boundaries so we - * need to check for improperly formatted strings (no null termination). - */ + /* + * Note that the various "offset" pointers may address outside the packet boundaries. + * proto_tree_add_item() will throw a "bounds exception" for invalid "offset" values. + */ - /* - * Destination info - */ + /* + * Destination info + */ - tvb_ensure_bytes_exist(tvb, offset, dest_scheme_offset); - proto_tree_add_item(dict_tree, hf_bundle_dest_scheme, tvb, offset + dest_scheme_offset, - (gint)strlen((char *) (dict_ptr + dest_scheme_offset)), FALSE); - tvb_ensure_bytes_exist(tvb, offset, dest_ssp_offset); - string_ptr = tvb_get_ephemeral_stringz(tvb, offset + dest_ssp_offset, &string_length); - proto_tree_add_item(dict_tree, hf_bundle_dest_ssp, tvb, offset + dest_ssp_offset, - (gint)strlen((char *) (dict_ptr + dest_ssp_offset)), FALSE); + proto_tree_add_item(dict_tree, hf_bundle_dest_scheme, tvb, offset + dest_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_dest_ssp, tvb, offset + dest_ssp_offset, -1, FALSE); - /* - * Destination info - */ + /* + * Source info + */ - tvb_ensure_bytes_exist(tvb, offset, source_scheme_offset); - proto_tree_add_item(dict_tree, hf_bundle_source_scheme, tvb, offset + source_scheme_offset, - (gint)strlen((char *) (dict_ptr + source_scheme_offset)), FALSE); - tvb_ensure_bytes_exist(tvb, offset, source_ssp_offset); - string_ptr = tvb_get_ephemeral_stringz(tvb, offset + source_ssp_offset, &string_length); - proto_tree_add_item(dict_tree, hf_bundle_source_ssp, tvb, offset + source_ssp_offset, - (gint)strlen((char *) (dict_ptr + source_ssp_offset)), FALSE); + proto_tree_add_item(dict_tree, hf_bundle_source_scheme, tvb, offset + source_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_source_ssp, tvb, offset + source_ssp_offset, -1, FALSE); - /* - * Report to info - */ + /* + * Report to info + */ - tvb_ensure_bytes_exist(tvb, offset, report_scheme_offset); - proto_tree_add_item(dict_tree, hf_bundle_report_scheme, tvb, offset + report_scheme_offset, - (gint)strlen((char *) (dict_ptr + report_scheme_offset)), FALSE); - tvb_ensure_bytes_exist(tvb, offset, report_ssp_offset); - proto_tree_add_item(dict_tree, hf_bundle_report_ssp, tvb, offset + report_ssp_offset, - (gint)strlen((char *) (dict_ptr + report_ssp_offset)), FALSE); + proto_tree_add_item(dict_tree, hf_bundle_report_scheme, tvb, offset + report_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_report_ssp, tvb, offset + report_ssp_offset, -1, FALSE); - /* - * Custodian info - */ + /* + * Custodian info + */ - tvb_ensure_bytes_exist(tvb, offset, cust_scheme_offset); - proto_tree_add_item(dict_tree, hf_bundle_custodian_scheme, tvb, offset + cust_scheme_offset, - (gint)strlen((char *) (dict_ptr + cust_scheme_offset)), FALSE); + proto_tree_add_item(dict_tree, hf_bundle_custodian_scheme, tvb, offset + cust_scheme_offset, -1, FALSE); + proto_tree_add_item(dict_tree, hf_bundle_custodian_ssp, tvb, offset + cust_ssp_offset, -1, FALSE); - tvb_ensure_bytes_exist(tvb, offset, cust_ssp_offset); - proto_tree_add_item(dict_tree, hf_bundle_custodian_ssp, tvb, offset + cust_ssp_offset, - (gint)strlen((char *) (dict_ptr + cust_ssp_offset)), FALSE); + /* + * Add Source/Destination to INFO Field + */ - /* - * Add Source/Destination to INFO Field - */ - - col_add_fstr(pinfo->cinfo, COL_INFO, "%s:%s > %s:%s", - dict_ptr + source_scheme_offset, dict_ptr + source_ssp_offset, - dict_ptr + dest_scheme_offset, dict_ptr + dest_ssp_offset); + /* Note: If we get this far, the offsets (and the strings) are at least within the TVB */ + dict_ptr = tvb_get_ptr(tvb, offset, bundle_header_dict_length); + col_add_fstr(pinfo->cinfo, COL_INFO, "%s:%s > %s:%s", + dict_ptr + source_scheme_offset, dict_ptr + source_ssp_offset, + dict_ptr + dest_scheme_offset, dict_ptr + dest_ssp_offset); } - offset += gbl_bundle_header_dict_length; /*Skip over dictionary*/ + offset += bundle_header_dict_length; /*Skip over dictionary*/ /* * Do this only if Fragment Flag is set */ if(pri_hdr_procflags & BUNDLE_PROCFLAGS_FRAG_MASK) { - fragment_offset = evaluate_sdnv(tvb, offset, &sdnv_length); - if(fragment_offset < 0) { - return 0; - } - proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, - "Fragment Offset: %d", fragment_offset); - offset += sdnv_length; + fragment_offset = evaluate_sdnv(tvb, offset, &sdnv_length); + if(fragment_offset < 0) { + return 0; + } + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Fragment Offset: %d", fragment_offset); + offset += sdnv_length; - total_adu_length = evaluate_sdnv(tvb, offset, &sdnv_length); - if(total_adu_length < 0) { - return 0; - } - proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, - "Total Application Data Unit Length: %d", fragment_offset); - offset += sdnv_length; + total_adu_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(total_adu_length < 0) { + return 0; + } + proto_tree_add_text(primary_tree, tvb, offset, sdnv_length, + "Total Application Data Unit Length: %d", fragment_offset); + offset += sdnv_length; } return (offset); } @@ -1526,103 +1501,103 @@ dissect_version_5_primary_header(packet_info *pinfo, */ static int -dissect_payload_header(proto_tree *tree, tvbuff_t *tvb, int offset, int *lastheader) +dissect_payload_header(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean *lastheader) { - proto_item *payload_item = NULL; - proto_tree *payload_tree = NULL; - proto_item *proc_flag_item = NULL; - proto_tree *proc_flag_tree = NULL; - proto_item *hdr_length_item = NULL; - proto_item *type_item = NULL; - guint8 procflags; - int sdnv_length; - int header_start; - int payload_length; + proto_item *payload_item; + proto_tree *payload_tree; + int sdnv_length; + int header_start; + int payload_length; - header_start = offset; /*Used to compute total payload length*/ + header_start = offset; /*Used to compute total payload length*/ payload_item = proto_tree_add_text(tree, tvb, offset, -1, "Payload Header"); - payload_tree = proto_item_add_subtree(payload_item, ett_payload_hdr); + payload_tree = proto_item_add_subtree(payload_item, ett_payload_hdr); - type_item = proto_tree_add_text(payload_tree, tvb, offset, 1, "Header Type: 1"); + proto_tree_add_text(payload_tree, tvb, offset, 1, "Header Type: 1"); ++offset; /* Add tree for processing flags */ /* This is really a SDNV but there are only 7 bits defined so leave it this way*/ if(hf_bundle_pdu_version == 4) { - procflags = tvb_get_guint8(tvb, offset); - if(procflags & HEADER_PROCFLAGS_LAST_HEADER) { - *lastheader = 1; - } - else { - *lastheader = 0; - } - proc_flag_item = proto_tree_add_item(payload_tree, hf_bundle_payload_flags, tvb, - offset, 1, FALSE); - proc_flag_tree = proto_item_add_subtree(proc_flag_item, ett_payload_flags); - proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_replicate_hdr, - tvb, offset, 1, procflags); - proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_xmit_report, - tvb, offset, 1, procflags); - proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_discard_on_fail, - tvb, offset, 1, procflags); - proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_last_header, - tvb, offset, 1, procflags); - ++offset; - } - else { /*Bundle Protocol Version 5*/ - int control_flags; - proto_item *block_flag_item = NULL; - proto_tree *block_flag_tree = NULL; + proto_item *proc_flag_item; + proto_tree *proc_flag_tree; + guint8 procflags; - control_flags = evaluate_sdnv(tvb, offset, &sdnv_length); - if(control_flags & BLOCK_CONTROL_LAST_BLOCK) { - *lastheader = 1; - } - else { - *lastheader = 0; - } - block_flag_item = proto_tree_add_item(payload_tree, hf_block_control_flags, tvb, - offset, sdnv_length, FALSE); - block_flag_tree = proto_item_add_subtree(block_flag_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); - offset += sdnv_length; + procflags = tvb_get_guint8(tvb, offset); + if(procflags & HEADER_PROCFLAGS_LAST_HEADER) { + *lastheader = TRUE; + } + else { + *lastheader = FALSE; + } + proc_flag_item = proto_tree_add_item(payload_tree, hf_bundle_payload_flags, tvb, + offset, 1, FALSE); + proc_flag_tree = proto_item_add_subtree(proc_flag_item, ett_payload_flags); + proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_replicate_hdr, + tvb, offset, 1, procflags); + proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_xmit_report, + tvb, offset, 1, procflags); + proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_discard_on_fail, + tvb, offset, 1, procflags); + proto_tree_add_boolean(proc_flag_tree, hf_bundle_payload_flags_last_header, + tvb, offset, 1, procflags); + ++offset; } + else { /*Bundle Protocol Version 5*/ + int control_flags; + proto_item *block_flag_item; + proto_tree *block_flag_tree; + + control_flags = evaluate_sdnv(tvb, offset, &sdnv_length); + if(control_flags & BLOCK_CONTROL_LAST_BLOCK) { + *lastheader = TRUE; + } + else { + *lastheader = FALSE; + } + block_flag_item = proto_tree_add_item(payload_tree, hf_block_control_flags, tvb, + offset, sdnv_length, FALSE); + block_flag_tree = proto_item_add_subtree(block_flag_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); + offset += sdnv_length; + } + payload_length = evaluate_sdnv(tvb, offset, &sdnv_length); proto_item_set_len(payload_item, 2 + sdnv_length); - hdr_length_item = proto_tree_add_text(payload_tree, tvb, offset, sdnv_length, " "); + if(payload_length < 0) { - proto_item_set_text(hdr_length_item, "Payload Length: Error"); - return 0; + proto_tree_add_text(payload_tree, tvb, offset, sdnv_length, "Payload Length: Error"); + return 0; } - proto_item_set_text(hdr_length_item, "Payload Length: %d", payload_length); + proto_tree_add_text(payload_tree, tvb, offset, sdnv_length, "Payload Length: %d", payload_length); offset += sdnv_length; if(pri_hdr_procflags & BUNDLE_PROCFLAGS_ADMIN_MASK) { - int admin_size; + int admin_size; - /* - * XXXX - Have not allowed for admin record spanning multiple segments! - */ + /* + * XXXX - Have not allowed for admin record spanning multiple segments! + */ - admin_size = dissect_admin_record(payload_tree, tvb, offset); - if(admin_size == 0) { - return 0; - } + admin_size = dissect_admin_record(payload_tree, tvb, offset); + if(admin_size == 0) { + return 0; + } } return (payload_length + (offset - header_start)); } @@ -1634,11 +1609,8 @@ dissect_payload_header(proto_tree *tree, tvbuff_t *tvb, int offset, int *lasthea static int dissect_admin_record(proto_tree *primary_tree, tvbuff_t *tvb, int offset) { - proto_item *admin_record_item = NULL; - proto_tree *admin_record_tree = NULL; - proto_item *status_flag_item = NULL; - proto_tree *status_flag_tree = NULL; - proto_item *admin_record_type = NULL; + proto_item *admin_record_item; + proto_tree *admin_record_tree; guint8 record_type; guint8 status; guint8 reason; @@ -1648,232 +1620,236 @@ dissect_admin_record(proto_tree *primary_tree, tvbuff_t *tvb, int offset) guint8 *string_ptr; admin_record_item = proto_tree_add_text(primary_tree, tvb, offset, -1, - "Administrative Record"); + "Administrative Record"); admin_record_tree = proto_item_add_subtree(admin_record_item, ett_admin_record); record_type = tvb_get_guint8(tvb, offset); if(record_type == (0x05 << 4)) { - proto_tree_add_text(admin_record_tree, tvb, offset, 1, "Announce Record (Contact)"); - return 1; /*Special case for poxy TCP Convergence Layer Announce Bundle*/ + proto_tree_add_text(admin_record_tree, tvb, offset, 1, "Announce Record (Contact)"); + return 1; /*Special case for poxy TCP Convergence Layer Announce Bundle*/ } if(record_type & ADMIN_REC_FLAGS_FRAGMENT) { - proto_tree_add_text(admin_record_tree, tvb, offset, 1, "Record is for a Fragment"); + proto_tree_add_text(admin_record_tree, tvb, offset, 1, "Record is for a Fragment"); } else { - proto_tree_add_text(admin_record_tree, - tvb, offset, 1, "Record is not for a Fragment"); + proto_tree_add_text(admin_record_tree, + tvb, offset, 1, "Record is not for a Fragment"); } switch((record_type >> 4) & 0xf) { case ADMIN_REC_TYPE_STATUS_REPORT: - admin_record_type = proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Administrative Record Type: Bundle Status Report"); - ++record_size; ++offset; + { + proto_item *status_flag_item; + proto_tree *status_flag_tree; - /* Decode Bundle Status Report Flags */ - status = tvb_get_guint8(tvb, offset); - status_flag_item = proto_tree_add_item(admin_record_tree, - hf_bundle_admin_statflags, tvb, offset, 1, FALSE); - status_flag_tree = proto_item_add_subtree(status_flag_item, - ett_admin_rec_status); - proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_rcvd, - tvb, offset, 1, status); - proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_accepted, - tvb, offset, 1, status); - proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_forwarded, - tvb, offset, 1, status); - proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_delivered, - tvb, offset, 1, status); - proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_deleted, - tvb, offset, 1, status); - proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_acked, - tvb, offset, 1, status); - ++record_size; ++offset; + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Administrative Record Type: Bundle Status Report"); + ++record_size; ++offset; - reason = tvb_get_guint8(tvb, offset); - if(reason == 0) { - proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Reason Code: 0 (No Additional Information)"); - } - else { - proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Reason Code: 0x%x (%s)", reason, - val_to_str(reason, status_report_reason_codes, - "Invalid")); - } - ++record_size; ++offset; - if(record_type & ADMIN_REC_FLAGS_FRAGMENT) { - sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, - "Fragment Offset"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, - "Fragment Length"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } - if(status & ADMIN_STATUS_FLAGS_RECEIVED) { - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Received Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } - if(status & ADMIN_STATUS_FLAGS_ACCEPTED) { - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Accepted Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } - if(status & ADMIN_STATUS_FLAGS_FORWARDED) { - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Forwarded Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } - if(status & ADMIN_STATUS_FLAGS_DELIVERED) { - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Delivered Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } - if(status & ADMIN_STATUS_FLAGS_DELETED) { - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Deleted Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } - if(status & ADMIN_STATUS_FLAGS_ACKNOWLEDGED) { - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Acknowledged Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } + /* Decode Bundle Status Report Flags */ + status = tvb_get_guint8(tvb, offset); + status_flag_item = proto_tree_add_item(admin_record_tree, + hf_bundle_admin_statflags, tvb, offset, 1, FALSE); + status_flag_tree = proto_item_add_subtree(status_flag_item, + ett_admin_rec_status); + proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_rcvd, + tvb, offset, 1, status); + proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_accepted, + tvb, offset, 1, status); + proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_forwarded, + tvb, offset, 1, status); + proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_delivered, + tvb, offset, 1, status); + proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_deleted, + tvb, offset, 1, status); + proto_tree_add_boolean(status_flag_tree, hf_bundle_admin_acked, + tvb, offset, 1, status); + ++record_size; ++offset; - /* Get 2 SDNVs for Creation Timestamp */ - sdnv_length = add_sdnv_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Creation Timestamp"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, - "Bundle Creation Timestamp Sequence"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; + reason = tvb_get_guint8(tvb, offset); + if(reason == 0) { + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Reason Code: 0 (No Additional Information)"); + } + else { + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Reason Code: 0x%x (%s)", reason, + val_to_str(reason, status_report_reason_codes, + "Invalid")); + } + ++record_size; ++offset; + if(record_type & ADMIN_REC_FLAGS_FRAGMENT) { + sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, + "Fragment Offset"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, + "Fragment Length"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } + if(status & ADMIN_STATUS_FLAGS_RECEIVED) { + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Received Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } + if(status & ADMIN_STATUS_FLAGS_ACCEPTED) { + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Accepted Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } + if(status & ADMIN_STATUS_FLAGS_FORWARDED) { + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Forwarded Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } + if(status & ADMIN_STATUS_FLAGS_DELIVERED) { + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Delivered Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } + if(status & ADMIN_STATUS_FLAGS_DELETED) { + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Deleted Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } + if(status & ADMIN_STATUS_FLAGS_ACKNOWLEDGED) { + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Acknowledged Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } - endpoint_length = evaluate_sdnv(tvb, offset, &sdnv_length); - if(endpoint_length < 0) { - return 0; - } - proto_tree_add_text(admin_record_tree, tvb, offset, sdnv_length, - "Endpoint Length: %d", endpoint_length); - offset += sdnv_length; record_size += sdnv_length; + /* Get 2 SDNVs for Creation Timestamp */ + sdnv_length = add_sdnv_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Creation Timestamp"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, + "Bundle Creation Timestamp Sequence"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; - /* - * Endpoint name may not be null terminated. This routine is supposed - * to add the null at the end of the string buffer. - */ - string_ptr = tvb_get_ephemeral_string(tvb, offset, endpoint_length); - proto_tree_add_text(admin_record_tree, tvb, offset, endpoint_length, - "Bundle Endpoint ID: %s", string_ptr); - offset += endpoint_length; record_size += endpoint_length; + endpoint_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(endpoint_length < 0) { + return 0; + } + proto_tree_add_text(admin_record_tree, tvb, offset, sdnv_length, + "Endpoint Length: %d", endpoint_length); + offset += sdnv_length; record_size += sdnv_length; - return record_size; + /* + * Endpoint name may not be null terminated. This routine is supposed + * to add the null at the end of the string buffer. + */ + string_ptr = tvb_get_ephemeral_string(tvb, offset, endpoint_length); + proto_tree_add_text(admin_record_tree, tvb, offset, endpoint_length, + "Bundle Endpoint ID: %s", string_ptr); + offset += endpoint_length; record_size += endpoint_length; + return record_size; + } case ADMIN_REC_TYPE_CUSTODY_SIGNAL: - admin_record_type = proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Administrative Record Type: Custody Signal"); - ++record_size; ++offset; + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Administrative Record Type: Custody Signal"); + ++record_size; ++offset; - status = tvb_get_guint8(tvb, offset); - proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Custody Transfer Succeeded Flag: %d", (status >> 7) & 0x01); - if((status & ADMIN_REC_CUSTODY_REASON_MASK) == 0) { - proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Reason Code: 0 (No Additional Information)"); - } - else { - proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Reason Code: 0x%x (%s)", - status & ADMIN_REC_CUSTODY_REASON_MASK, - val_to_str(status & ADMIN_REC_CUSTODY_REASON_MASK, - custody_signal_reason_codes, "Invalid")); - } - ++record_size; ++offset; - if(record_type & ADMIN_REC_FLAGS_FRAGMENT) { - sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, - "Fragment Offset"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, - "Fragment Length"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - } + status = tvb_get_guint8(tvb, offset); + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Custody Transfer Succeeded Flag: %d", (status >> 7) & 0x01); + if((status & ADMIN_REC_CUSTODY_REASON_MASK) == 0) { + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Reason Code: 0 (No Additional Information)"); + } + else { + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Reason Code: 0x%x (%s)", + status & ADMIN_REC_CUSTODY_REASON_MASK, + val_to_str(status & ADMIN_REC_CUSTODY_REASON_MASK, + custody_signal_reason_codes, "Invalid")); + } + ++record_size; ++offset; + if(record_type & ADMIN_REC_FLAGS_FRAGMENT) { + sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, + "Fragment Offset"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, + "Fragment Length"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + } - /* Signal Time */ - sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Signal Time"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; + /* Signal Time */ + sdnv_length = add_dtn_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Signal Time"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; - /* Timestamp copy */ - sdnv_length = add_sdnv_time_to_tree(admin_record_tree, tvb, offset, - "Bundle Creation Timestamp"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; - sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, - "Bundle Creation Timestamp Sequence"); - if(sdnv_length <= 0) { - return 0; - } - offset += sdnv_length; record_size += sdnv_length; + /* Timestamp copy */ + sdnv_length = add_sdnv_time_to_tree(admin_record_tree, tvb, offset, + "Bundle Creation Timestamp"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; + sdnv_length = add_sdnv_to_tree(admin_record_tree, tvb, offset, + "Bundle Creation Timestamp Sequence"); + if(sdnv_length <= 0) { + return 0; + } + offset += sdnv_length; record_size += sdnv_length; - endpoint_length = evaluate_sdnv(tvb, offset, &sdnv_length); - if(endpoint_length < 0) { - return 0; - } - proto_tree_add_text(admin_record_tree, tvb, offset, sdnv_length, - "Endpoint Length: %d", endpoint_length); - offset += sdnv_length; record_size += sdnv_length; - string_ptr = tvb_get_ephemeral_string(tvb, offset, endpoint_length); - proto_tree_add_text(admin_record_tree, tvb, offset, endpoint_length, - "Bundle Endpoint ID: %s", string_ptr); - offset += endpoint_length; record_size += endpoint_length; - return record_size; + endpoint_length = evaluate_sdnv(tvb, offset, &sdnv_length); + if(endpoint_length < 0) { + return 0; + } + proto_tree_add_text(admin_record_tree, tvb, offset, sdnv_length, + "Endpoint Length: %d", endpoint_length); + offset += sdnv_length; record_size += sdnv_length; + string_ptr = tvb_get_ephemeral_string(tvb, offset, endpoint_length); + proto_tree_add_text(admin_record_tree, tvb, offset, endpoint_length, + "Bundle Endpoint ID: %s", string_ptr); + offset += endpoint_length; record_size += endpoint_length; + return record_size; - } /* End Switch */ + } /* End Switch */ - admin_record_type = proto_tree_add_text(admin_record_tree, tvb, offset, 1, - "Administrative Record Type: Unknown"); + proto_tree_add_text(admin_record_tree, tvb, offset, 1, + "Administrative Record Type: Unknown"); return 0; } @@ -1883,12 +1859,11 @@ dissect_admin_record(proto_tree *primary_tree, tvbuff_t *tvb, int offset) static int dissect_contact_header(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *conv_tree, proto_item *conv_item) + proto_tree *conv_tree, proto_item *conv_item) { guint8 contact_hdr_flags; - proto_item *contact_hdr_flag_item = NULL; - proto_tree *contact_hdr_flag_tree = NULL; - proto_item *eid_item = NULL; + proto_item *contact_hdr_flag_item; + proto_tree *contact_hdr_flag_tree; int eid_length; int sdnv_length; char *sptr; @@ -1905,15 +1880,15 @@ dissect_contact_header(tvbuff_t *tvb, packet_info *pinfo, /* Subtree to expand the bits in the Contact Header Flags */ contact_hdr_flags = tvb_get_guint8(tvb, 5); contact_hdr_flag_item = - proto_tree_add_item(conv_tree, hf_contact_hdr_flags, tvb, 5, 1, FALSE); + proto_tree_add_item(conv_tree, hf_contact_hdr_flags, tvb, 5, 1, FALSE); contact_hdr_flag_tree = - proto_item_add_subtree(contact_hdr_flag_item, ett_contact_hdr_flags); + proto_item_add_subtree(contact_hdr_flag_item, ett_contact_hdr_flags); proto_tree_add_boolean(contact_hdr_flag_tree, hf_contact_hdr_flags_ack_req, - tvb, 5, 1, contact_hdr_flags); + tvb, 5, 1, contact_hdr_flags); proto_tree_add_boolean(contact_hdr_flag_tree, hf_contact_hdr_flags_frag_enable, - tvb, 5, 1, contact_hdr_flags); + tvb, 5, 1, contact_hdr_flags); proto_tree_add_boolean(contact_hdr_flag_tree, hf_contact_hdr_flags_nak, - tvb, 5, 1, contact_hdr_flags); + tvb, 5, 1, contact_hdr_flags); proto_tree_add_item(conv_tree, hf_contact_hdr_keep_alive, tvb, 6, 2, FALSE); /* @@ -1922,67 +1897,61 @@ dissect_contact_header(tvbuff_t *tvb, packet_info *pinfo, eid_length = evaluate_sdnv(tvb, 8, &sdnv_length); if(eid_length < 0) { - col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error (Local EID Length)"); - return 0; + col_set_str(pinfo->cinfo, COL_INFO, "Protocol Error (Local EID Length)"); + return 0; } proto_tree_add_text(conv_tree, tvb, 8, sdnv_length, - "Local EID Length: %d", eid_length); + "Local EID Length: %d", eid_length); proto_item_set_len(conv_item, sdnv_length + eid_length + 8); - eid_item = proto_tree_add_text(conv_tree, tvb, sdnv_length + 8, eid_length, " "); + sptr = (char *) tvb_get_ephemeral_string(tvb, sdnv_length + 8, eid_length); - proto_item_set_text(eid_item, "Local EID: %s", sptr); + proto_tree_add_text(conv_tree, tvb, sdnv_length + 8, eid_length, "Local EID: %s", sptr); + return(sdnv_length + eid_length + 8); } static int -display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int offset, int *lastheader) +display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int offset, gboolean *lastheader) { - proto_item *block_item = NULL; - proto_tree *block_tree = NULL; - proto_item *hdr_length_item = NULL; - proto_item *type_item = NULL; + proto_item *block_item; + proto_tree *block_tree; int sdnv_length; int header_start; int block_length; guint8 type; int control_flags; - proto_item *block_flag_item = NULL; type = tvb_get_guint8(tvb, offset); - header_start = offset; /*Used to compute total payload length*/ + header_start = offset; /*Used to compute total payload length*/ offset = 0; - block_item = proto_tree_add_text(tree, tvb, - header_start + offset, -1, "Metadata Block"); + block_item = proto_tree_add_text(tree, tvb, header_start + offset, -1, "Metadata Block"); block_tree = proto_item_add_subtree(block_item, ett_metadata_hdr); - type_item = proto_tree_add_text(block_tree, tvb, header_start + offset, 1, " "); - proto_item_set_text(type_item, "Block Type: %d", type); + proto_tree_add_text(block_tree, tvb, header_start + offset, 1, "Block Type: %d", type); ++offset; control_flags = evaluate_sdnv(tvb, header_start + offset, &sdnv_length); if(control_flags & BLOCK_CONTROL_LAST_BLOCK) { - *lastheader = 1; + *lastheader = TRUE; } else { - *lastheader = 0; + *lastheader = FALSE; } - block_flag_item = proto_tree_add_text(block_tree, tvb, header_start + offset, 1, " "); - proto_item_set_text(block_flag_item, "Block Flags: 0x%x", control_flags); + proto_tree_add_text(block_tree, tvb, header_start + offset, 1, "Block Flags: 0x%x", control_flags); offset += sdnv_length; block_length = evaluate_sdnv(tvb, header_start + offset, &sdnv_length); proto_item_set_len(block_item, offset + sdnv_length + block_length); - hdr_length_item = proto_tree_add_text(block_tree, tvb, - header_start + offset, sdnv_length, " "); if(block_length < 0) { - proto_item_set_text(hdr_length_item, "Metadata Block Length: Error"); - return 0; + proto_tree_add_text(block_tree, tvb, header_start + offset, sdnv_length, "Metadata Block Length: Error"); + return 0; } - proto_item_set_text(hdr_length_item, "Block Length: %d", block_length); + proto_tree_add_text(block_tree, tvb, header_start + offset, sdnv_length, "Block Length: %d", block_length); offset += (sdnv_length + block_length); return offset; } + /* * SDNV has a zero in high-order bit position of last byte. The high-order * bit of all preceding bytes is set to one. This returns the numeric value @@ -1991,7 +1960,7 @@ display_metadata_block(proto_tree *tree, tvbuff_t *tvb, int offset, int *lasthea * (value exceeds maximum for signed integer). 0 is an acceptable value. */ -#define SDNV_MASK 0x7f +#define SDNV_MASK 0x7f /*3rd arg is number of bytes in field (returned)*/ int @@ -2007,14 +1976,14 @@ evaluate_sdnv(tvbuff_t *tvb, int offset, int *bytecount) */ while((curbyte = tvb_get_guint8(tvb, offset)) & ~SDNV_MASK) { - if(*bytecount >= (int) sizeof(int)) { - *bytecount = 0; - return -1; - } - value = value << 7; - value |= (curbyte & SDNV_MASK); - ++offset; - ++*bytecount; + if(*bytecount >= (int) sizeof(int)) { + *bytecount = 0; + return -1; + } + value = value << 7; + value |= (curbyte & SDNV_MASK); + ++offset; + ++*bytecount; } /* @@ -2041,14 +2010,14 @@ evaluate_sdnv_64(tvbuff_t *tvb, int offset, int *bytecount) */ while((curbyte = tvb_get_guint8(tvb, offset)) & ~SDNV_MASK) { - if(*bytecount >= (int) sizeof(gint64)) { - *bytecount = 0; - return -1; - } - value = value << 7; - value |= (curbyte & SDNV_MASK); - ++offset; - ++*bytecount; + if(*bytecount >= (int) sizeof(gint64)) { + *bytecount = 0; + return -1; + } + value = value << 7; + value |= (curbyte & SDNV_MASK); + ++offset; + ++*bytecount; } /* @@ -2069,7 +2038,7 @@ add_sdnv_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, const char *field_ sdnv_value = evaluate_sdnv(tvb, offset, &sdnv_length); if(sdnv_value < 0) { - return 0; + return 0; } proto_tree_add_text(tree, tvb, offset, sdnv_length, "%s: %d", field_id, sdnv_value); return sdnv_length; @@ -2089,20 +2058,20 @@ add_dtn_time_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, const char *fi sdnv_value = evaluate_sdnv(tvb, offset, &sdnv_length); if(sdnv_value < 0) { - return 0; + return 0; } time_since_2000 = (time_t) (sdnv_value + 946684800); time_string = abs_time_secs_to_str(time_since_2000, ABSOLUTE_TIME_LOCAL, TRUE); proto_tree_add_text(tree, tvb, offset, sdnv_length, - "%s (sec): %d [%s]", field_id, sdnv_value, time_string); + "%s (sec): %d [%s]", field_id, sdnv_value, time_string); offset += sdnv_length; sdnv_value = evaluate_sdnv(tvb, offset, &sdnv2_length); if(sdnv_value < 0) { - return 0; + return 0; } proto_tree_add_text(tree, tvb, offset, sdnv2_length, - "%s (ns): %d", field_id, sdnv_value); + "%s (ns): %d", field_id, sdnv_value); return (sdnv_length + sdnv2_length); } @@ -2120,12 +2089,12 @@ add_sdnv_time_to_tree(proto_tree *tree, tvbuff_t *tvb, int offset, const char *f sdnv_value = evaluate_sdnv(tvb, offset, &sdnv_length); if(sdnv_value < 0) { - return 0; + return 0; } time_since_2000 = (time_t) (sdnv_value + 946684800); time_string = abs_time_secs_to_str(time_since_2000, ABSOLUTE_TIME_LOCAL, TRUE); proto_tree_add_text(tree, tvb, offset, sdnv_length, - "%s: %d [%s]", field_id, sdnv_value, time_string); + "%s: %d [%s]", field_id, sdnv_value, time_string); return sdnv_length; } @@ -2142,373 +2111,373 @@ proto_register_bundle(void) static hf_register_info hf[] = { {&hf_bundle_pdu_version, {"Bundle Version", "bundle.version", - FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_contact_hdr_version, {"Version", "bundle.tcp_conv.contact_hdr.version", - FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_contact_hdr_flags, {"Flags", "bundle.tcp_conv.contact_hdr.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_contact_hdr_flags_ack_req, {"Bundle Acks Requested", "bundle.tcp_conv.contact_hdr.flags.ackreq", - FT_BOOLEAN, 8, NULL, TCP_CONV_BUNDLE_ACK_FLAG, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONV_BUNDLE_ACK_FLAG, NULL, HFILL} }, {&hf_contact_hdr_flags_frag_enable, {"Reactive Fragmentation Enabled", "bundle.tcp_conv.contact_hdr.flags.fragen", - FT_BOOLEAN, 8, NULL, TCP_CONV_REACTIVE_FRAG_FLAG, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONV_REACTIVE_FRAG_FLAG, NULL, HFILL} }, {&hf_contact_hdr_flags_nak, {"Support Negative Acknowledgements", "bundle.tcp_conv.contact_hdr.flags.nak", - FT_BOOLEAN, 8, NULL, TCP_CONV_CONNECTOR_RCVR_FLAG, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONV_CONNECTOR_RCVR_FLAG, NULL, HFILL} }, {&hf_contact_hdr_keep_alive, {"Keep Alive", "bundle.tcp_conv.contact_hdr.keep_alive", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_tcp_convergence_data_procflags, {"TCP Convergence Data Flags", "bundle.tcp_conv.data.proc.flag", - FT_UINT8, BASE_HEX, NULL, TCP_CONVERGENCE_DATA_FLAGS, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, TCP_CONVERGENCE_DATA_FLAGS, NULL, HFILL} }, {&hf_tcp_convergence_data_procflags_start, {"Segment contains start of bundle", "bundle.tcp_conv.data.proc.start", - FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_DATA_START_FLAG, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_DATA_START_FLAG, NULL, HFILL} }, {&hf_tcp_convergence_data_procflags_end, {"Segment contains end of Bundle", "bundle.tcp_conv.data.proc.end", - FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_DATA_END_FLAG, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_DATA_END_FLAG, NULL, HFILL} }, {&hf_tcp_convergence_shutdown_flags, {"TCP Convergence Shutdown Flags", "bundle.tcp_conv.shutdown.flags", - FT_UINT8, BASE_HEX, NULL, TCP_CONVERGENCE_SHUTDOWN_FLAGS, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, TCP_CONVERGENCE_SHUTDOWN_FLAGS, NULL, HFILL} }, {&hf_tcp_convergence_shutdown_flags_reason, {"Shutdown includes Reason Code", "bundle.tcp_conv.shutdown.reason.flag", - FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_SHUTDOWN_REASON, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_SHUTDOWN_REASON, NULL, HFILL} }, {&hf_tcp_convergence_shutdown_flags_delay, {"Shutdown includes Reconnection Delay", "bundle.tcp_conv.shutdown.delay.flag", - FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_SHUTDOWN_DELAY, NULL, HFILL} + FT_BOOLEAN, 8, NULL, TCP_CONVERGENCE_SHUTDOWN_DELAY, NULL, HFILL} }, {&hf_tcp_convergence_shutdown_reason, {"Shutdown Reason Code", "bundle.tcp_conv.shutdown.reason", - FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_tcp_convergence_shutdown_delay, {"Shutdown Reconnection Delay", "bundle.tcp_conv.shutdown.delay", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragments, {"Message Fragments", "bundle.msg.fragments", - FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment, {"Message Fragment", "bundle.msg.fragment", - FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment_overlap, {"Message fragment overlap", "bundle.msg.fragment.overlap", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment_overlap_conflicts, {"Message fragment overlapping with conflicting data", - "bundle.msg.fragment.overlap.conflicts", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} + "bundle.msg.fragment.overlap.conflicts", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment_multiple_tails, {"Message has multiple tails", "bundle.msg.fragment.multiple_tails", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment_too_long_fragment, {"Message fragment too long", "bundle.msg.fragment.too_long_fragment", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment_error, {"Message defragmentation error", "bundle.msg.fragment.error", - FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_fragment_count, {"Message fragment count", "bundle.msg.fragment.count", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_msg_reassembled_in, {"Reassembled in", "bundle.msg.reassembled.in", - FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_FRAMENUM, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_msg_reassembled_length, {"Reassembled DTN length", "bundle.msg.reassembled.length", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_procflags, {"Primary Header Processing Flags", "bundle.primary.proc.flag", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_procflags_fragment, {"Bundle is a Fragment", "bundle.primary.proc.frag", - FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_FRAG_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_FRAG_MASK, NULL, HFILL} }, {&hf_bundle_procflags_admin, {"Administrative Record", "bundle.primary.proc.admin", - FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_ADMIN_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_ADMIN_MASK, NULL, HFILL} }, {&hf_bundle_procflags_dont_fragment, {"Do Not Fragment Bundle", "bundle.primary.proc.dontfrag", - FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_DONTFRAG_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_DONTFRAG_MASK, NULL, HFILL} }, {&hf_bundle_procflags_cust_xfer_req, {"Request Custody Transfer", "bundle.primary.proc.xferreq", - FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_XFERREQ_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_XFERREQ_MASK, NULL, HFILL} }, {&hf_bundle_procflags_dest_singleton, {"Destination is Singleton", "bundle.primary.proc.single", - FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_SINGLETON_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_SINGLETON_MASK, NULL, HFILL} }, {&hf_bundle_procflags_application_ack, {"Request Acknowledgement by Application", "bundle.primary.proc.ack", - FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_APP_ACK_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_PROCFLAGS_APP_ACK_MASK, NULL, HFILL} }, {&hf_bundle_control_flags, {"Bundle Processing Control Flags", "bundle.primary.proc.flag", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_procflags_general, {"General Flags", "bundle.primary.proc.gen", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_procflags_cos, {"Cloass of Service Flags", "bundle.primary.proc.cos", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_procflags_status, {"Status Report Flags", "bundle.primary.proc.status", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_cosflags, {"Primary Header COS Flags", "bundle.primary.cos.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_cosflags_priority, {"Priority", "bundle.primary.cos.priority", - FT_UINT8, BASE_DEC, NULL, BUNDLE_COSFLAGS_PRIORITY_MASK, NULL, HFILL} + FT_UINT8, BASE_DEC, NULL, BUNDLE_COSFLAGS_PRIORITY_MASK, NULL, HFILL} }, {&hf_bundle_srrflags, {"Primary Header Report Request Flags", "bundle.primary.srr.flag", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_srrflags_report_receipt, {"Request Reception Report", "bundle.primary.srr.report", - FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_REPORT_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_REPORT_MASK, NULL, HFILL} }, {&hf_bundle_srrflags_report_cust_accept, {"Request Report of Custody Acceptance", "bundle.primary.srr.custaccept", - FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_CUSTODY_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_CUSTODY_MASK, NULL, HFILL} }, {&hf_bundle_srrflags_report_forward, {"Request Report of Bundle Forwarding", "bundle.primary.srr.forward", - FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_FORWARD_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_FORWARD_MASK, NULL, HFILL} }, {&hf_bundle_srrflags_report_delivery, {"Request Report of Bundle Delivery", "bundle.primary.srr.delivery", - FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_DELIVERY_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_DELIVERY_MASK, NULL, HFILL} }, {&hf_bundle_srrflags_report_deletion, {"Request Report of Bundle Deletion", "bundle.primary.srr.delete", - FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_DELETION_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_DELETION_MASK, NULL, HFILL} }, {&hf_bundle_srrflags_report_ack, {"Request Report of Application Ack", "bundle.primary.srr.ack", - FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_ACK_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BUNDLE_SRRFLAGS_ACK_MASK, NULL, HFILL} }, {&hf_bundle_primary_header_len, {"Bundle Header Length", "bundle.primary.len", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_dest_scheme_offset, {"Destination Scheme Offset", "bundle.primary.destschemeoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_dest_ssp_offset, {"Destination SSP Offset", "bundle.primary.destssspoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_source_scheme_offset, {"Source Scheme Offset", "bundle.primary.srcschemeoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_source_ssp_offset, {"Source SSP Offset", "bundle.primary.srcsspoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_report_scheme_offset, {"Report Scheme Offset", "bundle.primary.rptschemeoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_report_ssp_offset, {"Report SSP Offset", "bundle.primary.rptsspoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_cust_scheme_offset, {"Custodian Scheme Offset", "bundle.primary.custschemeoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_cust_ssp_offset, {"Custodian SSP Offset", "bundle.primary.custsspoff", - FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_dest_scheme, {"Destination Scheme", "bundle.primary.destination_scheme", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_dest_ssp, {"Destination", "bundle.primary.destination", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_source_scheme, {"Source Scheme", "bundle.primary.source_scheme", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_source_ssp, {"Source", "bundle.primary.source", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_report_scheme, {"Report Scheme", "bundle.primary.report_scheme", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_report_ssp, {"Report", "bundle.primary.report", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_custodian_scheme, {"Custodian Scheme", "bundle.primary.custodian_scheme", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_custodian_ssp, {"Custodian", "bundle.primary.custodian", - FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} + FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_creation_timestamp, {"Creation Timestamp", "bundle.primary.timestamp", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_lifetime, {"Lifetime", "bundle.primary.lifetime", - FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_payload_flags, {"Payload Header Processing Flags", "bundle.payload.proc.flag", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_payload_flags_replicate_hdr, {"Replicate Header in Every Fragment", "bundle.payload.proc.replicate", - FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_REPLICATE_MASK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_REPLICATE_MASK, NULL, HFILL} }, {&hf_bundle_payload_flags_xmit_report, {"Report if Can't Process Header", "bundle.payload.proc.report", - FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_XMIT_STATUS, NULL, HFILL} + FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_XMIT_STATUS, NULL, HFILL} }, {&hf_bundle_payload_flags_discard_on_fail, {"Discard if Can't Process Header", "bundle.payload.proc.discard", - FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_DISCARD_FAILURE, NULL, HFILL} + FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_DISCARD_FAILURE, NULL, HFILL} }, {&hf_bundle_payload_flags_last_header, {"Last Header", "bundle.payload.proc.lastheader", - FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_LAST_HEADER, NULL, HFILL} + FT_BOOLEAN, 8, NULL, PAYLOAD_PROCFLAGS_LAST_HEADER, NULL, HFILL} }, {&hf_bundle_admin_statflags, {"Administrative Record Status Flags", "bundle.admin.status.flag", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_rcvd, {"Reporting Node Received Bundle", "bundle.admin.status.rcvd", - FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_RECEIVED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_RECEIVED, NULL, HFILL} }, {&hf_bundle_admin_accepted, {"Reporting Node Accepted Custody", "bundle.admin.status.accept", - FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_ACCEPTED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_ACCEPTED, NULL, HFILL} }, {&hf_bundle_admin_forwarded, {"Reporting Node Forwarded Bundle", "bundle.admin.status.forward", - FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_FORWARDED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_FORWARDED, NULL, HFILL} }, {&hf_bundle_admin_delivered, {"Reporting Node Delivered Bundle", "bundle.admin.status.delivered", - FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_DELIVERED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_DELIVERED, NULL, HFILL} }, {&hf_bundle_admin_deleted, {"Reporting Node Deleted Bundle", "bundle.admin.status.delete", - FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_DELETED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_DELETED, NULL, HFILL} }, {&hf_bundle_admin_acked, {"Acknowledged by Application", "bundle.admin.status.ack", - FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_ACKNOWLEDGED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, ADMIN_STATUS_FLAGS_ACKNOWLEDGED, NULL, HFILL} }, {&hf_bundle_admin_receipt_time, {"Time of Receipt", "bundle.admin.status.receipttime", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_accept_time, {"Time of Custody Acceptance", "bundle.admin.status.accepttime", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_forward_time, {"Time of Forwarding", "bundle.admin.status.forwardtime", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_delivery_time, {"Time of Delivery", "bundle.admin.status.deliverytime", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_delete_time, {"Time of Deletion", "bundle.admin.status.deletetime", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_ack_time, {"Time of Acknowledgement", "bundle.admin.status.acktime", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_timestamp_copy, {"Copy of Creation Timestamp", "bundle.admin.status.timecopy", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_bundle_admin_signal_time, {"Time of Signal", "bundle.admin.signal.time", - FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_block_control_flags, {"Block Processing Control Flags", "bundle.block.control.flags", - FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} }, {&hf_block_control_replicate, {"Replicate Block in Every Fragment", "bundle.block.control.replicate", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_REPLICATE, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_REPLICATE, NULL, HFILL} }, {&hf_block_control_transmit_status, {"Transmit Status if Block Can't be Processeed", "bundle.block.control.status", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_TRANSMIT_STATUS, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_TRANSMIT_STATUS, NULL, HFILL} }, {&hf_block_control_delete_bundle, {"Delete Bundle if Block Can't be Processeed", "bundle.block.control.delete", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_DELETE_BUNDLE, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_DELETE_BUNDLE, NULL, HFILL} }, {&hf_block_control_last_block, {"Last Block", "bundle.block.control.last", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_LAST_BLOCK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_LAST_BLOCK, NULL, HFILL} }, {&hf_block_control_discard_block, {"Discard Block If Can't Process", "bundle.block.control.discard", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_DISCARD_BLOCK, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_DISCARD_BLOCK, NULL, HFILL} }, {&hf_block_control_not_processed, {"Block Was Forwarded Without Processing", "bundle.block.control.process", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_NOT_PROCESSED, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_NOT_PROCESSED, NULL, HFILL} }, {&hf_block_control_eid_reference, {"Block Contains an EID-reference Field", "bundle.block.control.eid", - FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_EID_REFERENCE, NULL, HFILL} + FT_BOOLEAN, 8, NULL, BLOCK_CONTROL_EID_REFERENCE, NULL, HFILL} } }; @@ -2539,29 +2508,29 @@ proto_register_bundle(void) module_t *bundle_module; proto_bundle = proto_register_protocol ( - "Bundle Protocol", - "Bundle", - "bundle" - ); + "Bundle Protocol", + "Bundle", + "bundle" + ); bundle_module = prefs_register_protocol(proto_bundle, proto_reg_handoff_bundle); proto_tcp_conv = proto_register_protocol ( - "DTN TCP Convergence Layer Protocol", - "TCPCL", - "tcpcl" - ); + "DTN TCP Convergence Layer Protocol", + "TCPCL", + "tcpcl" + ); prefs_register_uint_preference(bundle_module, "tcp.port", - "Bundle Protocol TCP Port", - "TCP Port to Accept Bundle Protocol Connections", - 10, - &bundle_tcp_port); + "Bundle Protocol TCP Port", + "TCP Port to Accept Bundle Protocol Connections", + 10, + &bundle_tcp_port); prefs_register_uint_preference(bundle_module, "udp.port", - "Bundle Protocol UDP Port", - "UDP Port to Accept Bundle Protocol Connections", - 10, - &bundle_udp_port); + "Bundle Protocol UDP Port", + "UDP Port to Accept Bundle Protocol Connections", + 10, + &bundle_udp_port); proto_register_field_array(proto_bundle, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); @@ -2579,13 +2548,13 @@ proto_reg_handoff_bundle(void) static int Initialized = FALSE; if (!Initialized) { - tcp_bundle_handle = create_dissector_handle(dissect_tcp_bundle, proto_bundle); - udp_bundle_handle = create_dissector_handle(dissect_udp_bundle, proto_bundle); - Initialized = TRUE; + tcp_bundle_handle = create_dissector_handle(dissect_tcp_bundle, proto_bundle); + udp_bundle_handle = create_dissector_handle(dissect_udp_bundle, proto_bundle); + Initialized = TRUE; } else { - dissector_delete_uint("tcp.port", tcp_port, tcp_bundle_handle); - dissector_delete_uint("udp.port", udp_port, udp_bundle_handle); + dissector_delete_uint("tcp.port", tcp_port, tcp_bundle_handle); + dissector_delete_uint("udp.port", udp_port, udp_bundle_handle); } tcp_port = bundle_tcp_port; udp_port = bundle_udp_port;