diff options
author | Ulf Lamping <ulf.lamping@web.de> | 2005-06-02 18:52:55 +0000 |
---|---|---|
committer | Ulf Lamping <ulf.lamping@web.de> | 2005-06-02 18:52:55 +0000 |
commit | e2c3b60280ff697553e360089ee84af905a311c3 (patch) | |
tree | eff0348fc3925c767288ab7d60e5d5944d061234 /epan | |
parent | 5c4f8770318963d77a7829cb2113d625bb654a50 (diff) |
add a generated toplevel line between the TCP protocol and the desegmented content, to better understand what's going on while desegmenting.
We'll have to add similar mechanisms for other protocols as well...
svn path=/trunk/; revision=14527
Diffstat (limited to 'epan')
-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, |