aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-dcerpc.c6
-rw-r--r--epan/dissectors/packet-rpc.c4
-rw-r--r--epan/dissectors/packet-smb-pipe.c5
-rw-r--r--epan/dissectors/packet-smb.c8
-rw-r--r--epan/dissectors/packet-tcp.c13
-rw-r--r--epan/reassemble.c23
-rw-r--r--epan/reassemble.h2
7 files changed, 44 insertions, 17 deletions
diff --git a/epan/dissectors/packet-dcerpc.c b/epan/dissectors/packet-dcerpc.c
index 054d9129c9..5397f3fb36 100644
--- a/epan/dissectors/packet-dcerpc.c
+++ b/epan/dissectors/packet-dcerpc.c
@@ -3127,12 +3127,13 @@ end_cn_stub:
if(pinfo->fd->num==fd_head->reassembled_in){
tvbuff_t *next_tvb;
+ proto_item *frag_tree_item;
next_tvb = tvb_new_real_data(fd_head->data, fd_head->datalen, fd_head->datalen);
tvb_set_child_real_data_tvbuff(decrypted_tvb, next_tvb);
add_new_data_source(pinfo, next_tvb, "Reassembled DCE/RPC");
show_fragment_tree(fd_head, &dcerpc_frag_items,
- dcerpc_tree, pinfo, next_tvb);
+ dcerpc_tree, pinfo, next_tvb, &frag_tree_item);
pinfo->fragmented = FALSE;
@@ -3727,12 +3728,13 @@ dissect_dcerpc_cn_fault (tvbuff_t *tvb, gint offset, packet_info *pinfo,
if(fd_head){
/* We completed reassembly */
tvbuff_t *next_tvb;
+ proto_item *frag_tree_item;
next_tvb = tvb_new_real_data(fd_head->data, fd_head->datalen, fd_head->datalen);
tvb_set_child_real_data_tvbuff(tvb, next_tvb);
add_new_data_source(pinfo, next_tvb, "Reassembled DCE/RPC");
show_fragment_tree(fd_head, &dcerpc_frag_items,
- dcerpc_tree, pinfo, next_tvb);
+ dcerpc_tree, pinfo, next_tvb, &frag_tree_item);
/*
* XXX - should there be a third routine for each
diff --git a/epan/dissectors/packet-rpc.c b/epan/dissectors/packet-rpc.c
index 0eb0204d11..c92763eeef 100644
--- a/epan/dissectors/packet-rpc.c
+++ b/epan/dissectors/packet-rpc.c
@@ -2722,6 +2722,8 @@ void
show_rpc_fraginfo(tvbuff_t *tvb, tvbuff_t *frag_tvb, proto_tree *tree,
guint32 rpc_rm, fragment_data *ipfd_head, packet_info *pinfo)
{
+ proto_item *frag_tree_item;
+
if (tree == NULL)
return; /* don't do any work */
@@ -2737,7 +2739,7 @@ show_rpc_fraginfo(tvbuff_t *tvb, tvbuff_t *frag_tvb, proto_tree *tree,
/*
* Show a tree with information about all fragments.
*/
- show_fragment_tree(ipfd_head, &rpc_frag_items, tree, pinfo, tvb);
+ show_fragment_tree(ipfd_head, &rpc_frag_items, tree, pinfo, tvb, &frag_tree_item);
} else {
/*
* This message was all in one fragment, so just show
diff --git a/epan/dissectors/packet-smb-pipe.c b/epan/dissectors/packet-smb-pipe.c
index 4032785262..ad59b54d99 100644
--- a/epan/dissectors/packet-smb-pipe.c
+++ b/epan/dissectors/packet-smb-pipe.c
@@ -3263,6 +3263,7 @@ dissect_pipe_dcerpc(tvbuff_t *d_tvb, packet_info *pinfo, proto_tree *parent_tree
guint32 hash_key;
fragment_data *fd_head;
tvbuff_t *new_tvb;
+ proto_item *frag_tree_item;
pinfo->dcetransportsalt = fid;
@@ -3398,7 +3399,7 @@ dissect_pipe_dcerpc(tvbuff_t *d_tvb, packet_info *pinfo, proto_tree *parent_tree
/* list what segments we have */
show_fragment_tree(fd_head, &smb_pipe_frag_items,
- tree, pinfo, d_tvb);
+ tree, pinfo, d_tvb, &frag_tree_item);
/* dissect the full PDU */
result = dissector_try_heuristic(smb_transact_heur_subdissector_list, d_tvb, pinfo, parent_tree);
@@ -3449,7 +3450,7 @@ dissect_pipe_dcerpc(tvbuff_t *d_tvb, packet_info *pinfo, proto_tree *parent_tree
/* list what segments we have */
show_fragment_tree(fd_head, &smb_pipe_frag_items,
- tree, pinfo, d_tvb);
+ tree, pinfo, d_tvb, &frag_tree_item);
/* dissect the full PDU */
result = dissector_try_heuristic(smb_transact_heur_subdissector_list, d_tvb, pinfo, parent_tree);
diff --git a/epan/dissectors/packet-smb.c b/epan/dissectors/packet-smb.c
index 7a093b0d0c..5be3c9717d 100644
--- a/epan/dissectors/packet-smb.c
+++ b/epan/dissectors/packet-smb.c
@@ -8217,12 +8217,14 @@ dissect_nt_transaction_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
must create pd_tvb from it
*/
if(r_fd){
+ proto_item *frag_tree_item;
+
pd_tvb = tvb_new_real_data(r_fd->data, r_fd->datalen,
r_fd->datalen);
tvb_set_child_real_data_tvbuff(tvb, pd_tvb);
add_new_data_source(pinfo, pd_tvb, "Reassembled SMB");
- show_fragment_tree(r_fd, &smb_frag_items, tree, pinfo, pd_tvb);
+ show_fragment_tree(r_fd, &smb_frag_items, tree, pinfo, pd_tvb, &frag_tree_item);
}
@@ -13597,11 +13599,13 @@ dissect_transaction_response(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *
create pd_tvb from it
*/
if(r_fd){
+ proto_item *frag_tree_item;
+
pd_tvb = tvb_new_real_data(r_fd->data, r_fd->datalen,
r_fd->datalen);
tvb_set_child_real_data_tvbuff(tvb, pd_tvb);
add_new_data_source(pinfo, pd_tvb, "Reassembled SMB");
- show_fragment_tree(r_fd, &smb_frag_items, tree, pinfo, pd_tvb);
+ show_fragment_tree(r_fd, &smb_frag_items, tree, pinfo, pd_tvb, &frag_tree_item);
}
diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c
index 82a702bff2..5dbabd1c96 100644
--- a/epan/dissectors/packet-tcp.c
+++ b/epan/dissectors/packet-tcp.c
@@ -1678,6 +1678,9 @@ desegment_tcp(tvbuff_t *tvb, packet_info *pinfo, int offset,
guint32 deseg_seq;
gint nbytes;
proto_item *item;
+ proto_item *frag_tree_item;
+ proto_item *tcp_tree_item;
+
/*
* Initialize these to assume no desegmentation.
@@ -1872,7 +1875,13 @@ desegment_tcp(tvbuff_t *tvb, packet_info *pinfo, int offset,
* so we show a tree with all segments.
*/
show_fragment_tree(ipfd_head, &tcp_segment_items,
- tcp_tree, pinfo, next_tvb);
+ tree, pinfo, next_tvb, &frag_tree_item);
+ /* the toplevel fragment subtree is now behind all desegmented data,
+ * move it right behind the TCP tree */
+ tcp_tree_item = proto_tree_get_parent(tcp_tree);
+ if(frag_tree_item && tcp_tree_item) {
+ proto_tree_move_item(tree, tcp_tree_item, frag_tree_item);
+ }
/* Did the subdissector ask us to desegment
some more data? This means that the data
@@ -3278,7 +3287,7 @@ proto_register_tcp(void)
"TCP Segment", HFILL }},
{ &hf_tcp_segments,
- { "TCP Segments", "tcp.segments", FT_NONE, BASE_NONE, NULL, 0x0,
+ { "Reassembled TCP Segments", "tcp.segments", FT_NONE, BASE_NONE, NULL, 0x0,
"TCP Segments", HFILL }},
{ &hf_tcp_reassembled_in,
diff --git a/epan/reassemble.c b/epan/reassemble.c
index fb8de997b7..3c3b62b93a 100644
--- a/epan/reassemble.c
+++ b/epan/reassemble.c
@@ -1612,6 +1612,7 @@ process_reassembled_data(tvbuff_t *tvb, int offset, packet_info *pinfo,
{
tvbuff_t *next_tvb;
gboolean update_col_info;
+ proto_item *frag_tree_item;
if (fd_head != NULL && pinfo->fd->num == fd_head->reassembled_in) {
/*
@@ -1649,7 +1650,7 @@ process_reassembled_data(tvbuff_t *tvb, int offset, packet_info *pinfo,
fd_head, fit, tree, pinfo, next_tvb);
} else {
update_col_info = !show_fragment_tree(fd_head,
- fit, tree, pinfo, next_tvb);
+ fit, tree, pinfo, next_tvb, &frag_tree_item);
}
} else {
/*
@@ -1780,22 +1781,30 @@ show_fragment_errs_in_col(fragment_data *fd_head, const fragment_items *fit,
*/
gboolean
show_fragment_tree(fragment_data *fd_head, const fragment_items *fit,
- proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb)
+ proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, proto_item **fi)
{
fragment_data *fd;
proto_tree *ft;
- proto_item *fi;
+ int i = 0;
/* It's not fragmented. */
pinfo->fragmented = FALSE;
- fi = proto_tree_add_item(tree, *(fit->hf_fragments),
+ *fi = proto_tree_add_item(tree, *(fit->hf_fragments),
tvb, 0, -1, FALSE);
- PROTO_ITEM_SET_GENERATED(fi);
+ PROTO_ITEM_SET_GENERATED(*fi);
- ft = proto_item_add_subtree(fi, *(fit->ett_fragments));
- for (fd = fd_head->next; fd != NULL; fd = fd->next)
+ ft = proto_item_add_subtree(*fi, *(fit->ett_fragments));
+ for (fd = fd_head->next; fd != NULL; fd = fd->next) {
show_fragment(fd, fd->offset, fit, ft, tvb);
+ if(i == 0) {
+ proto_item_append_text(*fi, " (%u bytes): ", tvb_length(tvb));
+ } else {
+ proto_item_append_text(*fi, ", ");
+ }
+ proto_item_append_text(*fi, "#%u(%u)", fd->frame, fd->len);
+ i++;
+ }
return show_fragment_errs_in_col(fd_head, fit, pinfo);
}
diff --git a/epan/reassemble.h b/epan/reassemble.h
index 85c66942c9..9e8d36df19 100644
--- a/epan/reassemble.h
+++ b/epan/reassemble.h
@@ -237,7 +237,7 @@ process_reassembled_data(tvbuff_t *tvb, int offset, packet_info *pinfo,
extern gboolean
show_fragment_tree(fragment_data *ipfd_head, const fragment_items *fit,
- proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb);
+ proto_tree *tree, packet_info *pinfo, tvbuff_t *tvb, proto_item **fi);
extern gboolean
show_fragment_seq_tree(fragment_data *ipfd_head, const fragment_items *fit,