diff options
author | Guy Harris <guy@alum.mit.edu> | 2002-03-27 04:27:05 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2002-03-27 04:27:05 +0000 |
commit | 588c50944de744c40f127a52519e1e5aef8d83a5 (patch) | |
tree | 8924bfb6fae808780d2d8d36ffd53261749ec67b /packet-ipv6.c | |
parent | 31cf9563c236737b2edc397f0bd4369e2f30cc05 (diff) |
In the protocol tree entries for lists of fragments/segments, make the
top-level item correspond to the reassembled data, and make the item for
each fragment/segment correspond to the part of that reassembled data
that came from that fragment/segment.
svn path=/trunk/; revision=5025
Diffstat (limited to 'packet-ipv6.c')
-rw-r--r-- | packet-ipv6.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/packet-ipv6.c b/packet-ipv6.c index 2d23f17e69..7bd4c257e7 100644 --- a/packet-ipv6.c +++ b/packet-ipv6.c @@ -1,7 +1,7 @@ /* packet-ipv6.c * Routines for IPv6 packet disassembly * - * $Id: packet-ipv6.c,v 1.78 2002/02/27 05:45:48 guy Exp $ + * $Id: packet-ipv6.c,v 1.79 2002/03/27 04:27:03 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -823,10 +823,25 @@ again: proto_tree *ft = NULL; proto_item *fi = NULL; - /* OK, we have the complete reassembled payload. */ + /* OK, we have the complete reassembled payload. + Allocate a new tvbuff, referring to the reassembled payload. */ + next_tvb = tvb_new_real_data(ipfd_head->data, ipfd_head->datalen, + ipfd_head->datalen); + + /* Add the tvbuff to the list of tvbuffs to which the tvbuff we + were handed refers, so it'll get cleaned up when that tvbuff + is cleaned up. */ + tvb_set_child_real_data_tvbuff(tvb, next_tvb); + + /* Add the defragmented data to the data source list. */ + add_new_data_source(pinfo->fd, next_tvb, "Reassembled IPv6"); + + /* It's not fragmented. */ + pinfo->fragmented = FALSE; + /* show all fragments */ fi = proto_tree_add_item(ipv6_tree, hf_ipv6_fragments, - tvb, 0, 0, FALSE); + next_tvb, 0, -1, FALSE); ft = proto_item_add_subtree(fi, ett_ipv6_fragments); for (ipfd = ipfd_head->next; ipfd; ipfd = ipfd->next){ if (ipfd->flags & (FD_OVERLAP|FD_OVERLAPCONFLICT @@ -845,7 +860,7 @@ again: hf = hf_ipv6_fragment; } fei = proto_tree_add_none_format(ft, hf, - tvb, 0, 0, + next_tvb, ipfd->offset, ipfd->len, "Frame:%u payload:%u-%u", ipfd->frame, ipfd->offset, @@ -854,28 +869,28 @@ again: fet = proto_item_add_subtree(fei, ett_ipv6_fragment); if (ipfd->flags&FD_OVERLAP) { proto_tree_add_boolean(fet, - hf_ipv6_fragment_overlap, tvb, 0, 0, + hf_ipv6_fragment_overlap, next_tvb, 0, 0, TRUE); } if (ipfd->flags&FD_OVERLAPCONFLICT) { proto_tree_add_boolean(fet, - hf_ipv6_fragment_overlap_conflict, tvb, 0, 0, + hf_ipv6_fragment_overlap_conflict, next_tvb, 0, 0, TRUE); } if (ipfd->flags&FD_MULTIPLETAILS) { proto_tree_add_boolean(fet, - hf_ipv6_fragment_multiple_tails, tvb, 0, 0, + hf_ipv6_fragment_multiple_tails, next_tvb, 0, 0, TRUE); } if (ipfd->flags&FD_TOOLONGFRAGMENT) { proto_tree_add_boolean(fet, - hf_ipv6_fragment_too_long_fragment, tvb, 0, 0, + hf_ipv6_fragment_too_long_fragment, next_tvb, 0, 0, TRUE); } } else { /* nothing of interest for this fragment */ proto_tree_add_none_format(ft, hf_ipv6_fragment, - tvb, 0, 0, + next_tvb, ipfd->offset, ipfd->len, "Frame:%u payload:%u-%u", ipfd->frame, ipfd->offset, @@ -890,21 +905,6 @@ again: update_col_info = FALSE; } } - - /* Allocate a new tvbuff, referring to the reassembled payload. */ - next_tvb = tvb_new_real_data(ipfd_head->data, ipfd_head->datalen, - ipfd_head->datalen); - - /* Add the tvbuff to the list of tvbuffs to which the tvbuff we - were handed refers, so it'll get cleaned up when that tvbuff - is cleaned up. */ - tvb_set_child_real_data_tvbuff(tvb, next_tvb); - - /* Add the defragmented data to the data source list. */ - add_new_data_source(pinfo->fd, next_tvb, "Reassembled IPv6"); - - /* It's not fragmented. */ - pinfo->fragmented = FALSE; } else { /* We don't have the complete reassembled payload. */ next_tvb = NULL; |