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:
parent
5c4f877031
commit
e2c3b60280
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue