diff options
-rw-r--r-- | epan/dissectors/packet-dcerpc.c | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-rpc.c | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-smb-pipe.c | 5 | ||||
-rw-r--r-- | epan/dissectors/packet-smb.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-tcp.c | 13 | ||||
-rw-r--r-- | epan/reassemble.c | 23 | ||||
-rw-r--r-- | epan/reassemble.h | 2 |
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, |