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
This commit is contained in:
Ulf Lamping 2005-06-02 18:52:55 +00:00
parent 5c4f877031
commit e2c3b60280
7 changed files with 44 additions and 17 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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,

View File

@ -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);
}

View File

@ -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,