aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorUlf Lamping <ulf.lamping@web.de>2005-06-02 18:52:55 +0000
committerUlf Lamping <ulf.lamping@web.de>2005-06-02 18:52:55 +0000
commite2c3b60280ff697553e360089ee84af905a311c3 (patch)
treeeff0348fc3925c767288ab7d60e5d5944d061234 /epan
parent5c4f8770318963d77a7829cb2113d625bb654a50 (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.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,