Add a pointer to an hf_ value for a "reassembled_in" field (which can be
null) to the "fragment_items" structure, and don't pass that value into "process_reassembled_data()", just have it use the value in the "fragment_items" structure passed to it. Make "process_reassembled_data()" capable of handling reassembly done by "fragment_add_seq_check()", and use it in the ATP and 802.11 dissectors; give them "reassembled_in" fields. Make "process_reassembled_data()" handle only the case of a completed reassembly (fd_head != NULL) so that we can use it in those dissectors without gunking the code up too much. svn path=/trunk/; revision=7513
This commit is contained in:
parent
4af58d8967
commit
d359286841
|
@ -2,7 +2,7 @@
|
|||
* Routines for AppleTalk packet disassembly: LLAP, DDP, NBP, ATP, ASP,
|
||||
* RTMP.
|
||||
*
|
||||
* $Id: packet-atalk.c,v 1.87 2003/03/05 07:17:49 guy Exp $
|
||||
* $Id: packet-atalk.c,v 1.88 2003/04/20 11:36:11 guy Exp $
|
||||
*
|
||||
* Simon Wilkinson <sxw@dcs.ed.ac.uk>
|
||||
*
|
||||
|
@ -127,6 +127,7 @@ static int hf_atp_segment_overlap_conflict = -1;
|
|||
static int hf_atp_segment_multiple_tails = -1;
|
||||
static int hf_atp_segment_too_long_segment = -1;
|
||||
static int hf_atp_segment_error = -1;
|
||||
static int hf_atp_reassembled_in = -1;
|
||||
|
||||
/* ------------------------- */
|
||||
static int proto_zip = -1;
|
||||
|
@ -346,6 +347,7 @@ static const fragment_items atp_frag_items = {
|
|||
&hf_atp_segment_multiple_tails,
|
||||
&hf_atp_segment_too_long_segment,
|
||||
&hf_atp_segment_error,
|
||||
&hf_atp_reassembled_in,
|
||||
"segments"
|
||||
};
|
||||
|
||||
|
@ -857,14 +859,8 @@ dissect_atp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
|
|||
more_fragment);
|
||||
if (fd_head != NULL) {
|
||||
if (fd_head->next != NULL) {
|
||||
new_tvb = tvb_new_real_data(fd_head->data, fd_head->len, fd_head->len);
|
||||
tvb_set_child_real_data_tvbuff(tvb, new_tvb);
|
||||
add_new_data_source(pinfo, new_tvb, "Reassembled ATP");
|
||||
/* Show all fragments. */
|
||||
if (tree) {
|
||||
show_fragment_seq_tree(fd_head, &atp_frag_items,
|
||||
atp_tree, pinfo, new_tvb);
|
||||
}
|
||||
new_tvb = process_reassembled_data(tvb, pinfo, "Reassembled ATP",
|
||||
fd_head, &atp_frag_items, NULL, atp_tree);
|
||||
}
|
||||
else
|
||||
new_tvb = tvb_new_subset(tvb, ATP_HDRSIZE -1, -1, -1);
|
||||
|
@ -1965,6 +1961,10 @@ proto_register_atalk(void)
|
|||
{ &hf_atp_segments,
|
||||
{ "ATP Fragments", "atp.fragments", FT_NONE, BASE_NONE,
|
||||
NULL, 0x0, "ATP Fragments", HFILL }},
|
||||
|
||||
{ &hf_atp_reassembled_in,
|
||||
{ "Reassembled ATP in frame", "atp.reassembled_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
||||
"This ATP packet is reassembled in this frame", HFILL }}
|
||||
};
|
||||
|
||||
static hf_register_info hf_asp[] = {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* packet-clnp.c
|
||||
* Routines for ISO/OSI network and transport protocol packet disassembly
|
||||
*
|
||||
* $Id: packet-clnp.c,v 1.72 2003/04/20 08:06:00 guy Exp $
|
||||
* $Id: packet-clnp.c,v 1.73 2003/04/20 11:36:13 guy Exp $
|
||||
* Laurent Deniel <laurent.deniel@free.fr>
|
||||
* Ralf Schneider <Ralf.Schneider@t-online.de>
|
||||
*
|
||||
|
@ -92,6 +92,7 @@ static const fragment_items clnp_frag_items = {
|
|||
&hf_clnp_segment_multiple_tails,
|
||||
&hf_clnp_segment_too_long_segment,
|
||||
&hf_clnp_segment_error,
|
||||
&hf_clnp_reassembled_in,
|
||||
"segments"
|
||||
};
|
||||
|
||||
|
@ -1885,9 +1886,14 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
clnp_reassembled_table, segment_offset,
|
||||
segment_length - cnf_hdr_len,
|
||||
cnf_type & CNF_MORE_SEGS);
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled CLNP",
|
||||
fd_head, &clnp_frag_items, hf_clnp_reassembled_in, &update_col_info,
|
||||
clnp_tree);
|
||||
|
||||
if (fd_head != NULL) {
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled CLNP",
|
||||
fd_head, &clnp_frag_items, &update_col_info, clnp_tree);
|
||||
} else {
|
||||
/* We don't have the complete reassembled payload. */
|
||||
next_tvb = NULL;
|
||||
}
|
||||
} else {
|
||||
/* If this is the first segment, dissect its contents, otherwise
|
||||
just show it as a segment.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Routines for DCERPC packet disassembly
|
||||
* Copyright 2001, Todd Sabin <tas@webspan.net>
|
||||
*
|
||||
* $Id: packet-dcerpc.c,v 1.116 2003/04/15 08:04:54 guy Exp $
|
||||
* $Id: packet-dcerpc.c,v 1.117 2003/04/20 11:36:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -425,6 +425,7 @@ static const fragment_items dcerpc_frag_items = {
|
|||
&hf_dcerpc_fragment_multiple_tails,
|
||||
&hf_dcerpc_fragment_too_long_fragment,
|
||||
&hf_dcerpc_fragment_error,
|
||||
NULL,
|
||||
|
||||
"fragments"
|
||||
};
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Routines for EAP Extensible Authentication Protocol dissection
|
||||
* RFC 2284
|
||||
*
|
||||
* $Id: packet-eap.c,v 1.33 2003/04/01 19:17:53 guy Exp $
|
||||
* $Id: packet-eap.c,v 1.34 2003/04/20 11:36:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -213,6 +213,7 @@ static const fragment_items eaptls_frag_items = {
|
|||
&hf_eaptls_fragment_multiple_tails,
|
||||
&hf_eaptls_fragment_too_long_fragment,
|
||||
&hf_eaptls_fragment_error,
|
||||
NULL,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Copyright 2000, Axis Communications AB
|
||||
* Inquiries/bugreports should be sent to Johan.Jorgensen@axis.com
|
||||
*
|
||||
* $Id: packet-ieee80211.c,v 1.84 2003/04/01 19:05:55 guy Exp $
|
||||
* $Id: packet-ieee80211.c,v 1.85 2003/04/20 11:36:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -328,6 +328,7 @@ static int hf_fragment_overlap_conflict = -1;
|
|||
static int hf_fragment_multiple_tails = -1;
|
||||
static int hf_fragment_too_long_fragment = -1;
|
||||
static int hf_fragment_error = -1;
|
||||
static int hf_reassembled_in = -1;
|
||||
|
||||
|
||||
static int proto_wlan_mgt = -1;
|
||||
|
@ -399,6 +400,7 @@ static const fragment_items frag_items = {
|
|||
&hf_fragment_multiple_tails,
|
||||
&hf_fragment_too_long_fragment,
|
||||
&hf_fragment_error,
|
||||
&hf_reassembled_in,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
@ -1776,12 +1778,8 @@ dissect_ieee80211_common (tvbuff_t * tvb, packet_info * pinfo,
|
|||
* a non-fragmented frame.
|
||||
*/
|
||||
if (fd_head->next != NULL) {
|
||||
next_tvb = tvb_new_real_data(fd_head->data, fd_head->len, fd_head->len);
|
||||
tvb_set_child_real_data_tvbuff(tvb, next_tvb);
|
||||
add_new_data_source(pinfo, next_tvb, "Reassembled 802.11");
|
||||
|
||||
/* Show all fragments. */
|
||||
show_fragment_seq_tree(fd_head, &frag_items, hdr_tree, pinfo, next_tvb);
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled 802.11",
|
||||
fd_head, &frag_items, NULL, hdr_tree);
|
||||
} else {
|
||||
/*
|
||||
* Not fragmented, really.
|
||||
|
@ -2234,6 +2232,10 @@ proto_register_ieee80211 (void)
|
|||
{"802.11 Fragments", "wlan.fragments", FT_NONE, BASE_NONE, NULL, 0x0,
|
||||
"802.11 Fragments", HFILL }},
|
||||
|
||||
{&hf_reassembled_in,
|
||||
{"Reassembled 802.11 in frame", "wlan.reassembled_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
||||
"This 802.11 packet is reassembled in this frame", HFILL }},
|
||||
|
||||
{&hf_wep_iv,
|
||||
{"Initialization Vector", "wlan.wep.iv", FT_UINT24, BASE_HEX, NULL, 0,
|
||||
"Initialization Vector", HFILL }},
|
||||
|
|
15
packet-ip.c
15
packet-ip.c
|
@ -1,7 +1,7 @@
|
|||
/* packet-ip.c
|
||||
* Routines for IP and miscellaneous IP protocol packet disassembly
|
||||
*
|
||||
* $Id: packet-ip.c,v 1.189 2003/04/20 08:06:00 guy Exp $
|
||||
* $Id: packet-ip.c,v 1.190 2003/04/20 11:36:13 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -120,6 +120,7 @@ static const fragment_items ip_frag_items = {
|
|||
&hf_ip_fragment_multiple_tails,
|
||||
&hf_ip_fragment_too_long_fragment,
|
||||
&hf_ip_fragment_error,
|
||||
&hf_ip_reassembled_in,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
@ -1033,9 +1034,14 @@ dissect_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
(iph->ip_off & IP_OFFSET)*8,
|
||||
pinfo->iplen - pinfo->iphdrlen,
|
||||
iph->ip_off & IP_MF);
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled IPv4",
|
||||
ipfd_head, &ip_frag_items, hf_ip_reassembled_in, &update_col_info,
|
||||
ip_tree);
|
||||
|
||||
if (ipfd_head != NULL) {
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled IPv4",
|
||||
ipfd_head, &ip_frag_items, &update_col_info, ip_tree);
|
||||
} else {
|
||||
/* We don't have the complete reassembled payload. */
|
||||
next_tvb = NULL;
|
||||
}
|
||||
} else {
|
||||
/* If this is the first fragment, dissect its contents, otherwise
|
||||
just show it as a fragment.
|
||||
|
@ -1693,7 +1699,6 @@ proto_register_ip(void)
|
|||
{ &hf_ip_reassembled_in,
|
||||
{ "Reassembled IP in frame", "ip.reassembled_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
|
||||
"This IP packet is reassembled in this frame", HFILL }}
|
||||
|
||||
};
|
||||
static gint *ett[] = {
|
||||
&ett_ip,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* packet-ipv6.c
|
||||
* Routines for IPv6 packet disassembly
|
||||
*
|
||||
* $Id: packet-ipv6.c,v 1.96 2003/04/20 08:06:01 guy Exp $
|
||||
* $Id: packet-ipv6.c,v 1.97 2003/04/20 11:36:14 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -91,6 +91,7 @@ static const fragment_items ipv6_frag_items = {
|
|||
&hf_ipv6_fragment_multiple_tails,
|
||||
&hf_ipv6_fragment_too_long_fragment,
|
||||
&hf_ipv6_fragment_error,
|
||||
&hf_ipv6_reassembled_in,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
@ -645,9 +646,14 @@ again:
|
|||
offlg & IP6F_OFF_MASK,
|
||||
plen,
|
||||
offlg & IP6F_MORE_FRAG);
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled IPv6",
|
||||
ipfd_head, &ipv6_frag_items, hf_ipv6_reassembled_in, &update_col_info,
|
||||
ipv6_tree);
|
||||
|
||||
if (ipfd_head != NULL) {
|
||||
next_tvb = process_reassembled_data(tvb, pinfo, "Reassembled IPv6",
|
||||
ipfd_head, &ipv6_frag_items, &update_col_info, ipv6_tree);
|
||||
} else {
|
||||
/* We don't have the complete reassembled payload. */
|
||||
next_tvb = NULL;
|
||||
}
|
||||
} else {
|
||||
/* If this is the first fragment, dissect its contents, otherwise
|
||||
just show it as a fragment.
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Greg Morris <gmorris@novell.com>
|
||||
* Copyright (c) Novell, Inc. 2002-2003
|
||||
*
|
||||
* $Id: packet-ndps.c,v 1.19 2003/04/09 22:33:19 guy Exp $
|
||||
* $Id: packet-ndps.c,v 1.20 2003/04/20 11:36:14 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -3013,6 +3013,7 @@ static const fragment_items ndps_frag_items = {
|
|||
&hf_ndps_segment_multiple_tails,
|
||||
&hf_ndps_segment_too_long_segment,
|
||||
&hf_ndps_segment_error,
|
||||
NULL,
|
||||
"segments"
|
||||
};
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*
|
||||
* derived from the packet-nbns.c
|
||||
*
|
||||
* $Id: packet-netbios.c,v 1.56 2003/03/04 06:47:10 guy Exp $
|
||||
* $Id: packet-netbios.c,v 1.57 2003/04/20 11:36:14 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -131,6 +131,7 @@ static const fragment_items netbios_frag_items = {
|
|||
&hf_netb_fragment_multiple_tails,
|
||||
&hf_netb_fragment_too_long_fragment,
|
||||
&hf_netb_fragment_error,
|
||||
NULL,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Routines for rpc dissection
|
||||
* Copyright 1999, Uwe Girlich <Uwe.Girlich@philosys.de>
|
||||
*
|
||||
* $Id: packet-rpc.c,v 1.118 2003/04/20 00:27:29 guy Exp $
|
||||
* $Id: packet-rpc.c,v 1.119 2003/04/20 11:36:14 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -229,6 +229,7 @@ static const fragment_items rpc_frag_items = {
|
|||
&hf_rpc_fragment_multiple_tails,
|
||||
&hf_rpc_fragment_too_long_fragment,
|
||||
&hf_rpc_fragment_error,
|
||||
NULL,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ XXX Fixme : shouldnt show [malformed frame] for long packets
|
|||
* significant rewrite to tvbuffify the dissector, Ronnie Sahlberg and
|
||||
* Guy Harris 2001
|
||||
*
|
||||
* $Id: packet-smb-pipe.c,v 1.93 2003/04/15 09:23:42 guy Exp $
|
||||
* $Id: packet-smb-pipe.c,v 1.94 2003/04/20 11:36:15 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -87,6 +87,7 @@ static const fragment_items smb_pipe_frag_items = {
|
|||
&hf_pipe_fragment_multiple_tails,
|
||||
&hf_pipe_fragment_too_long_fragment,
|
||||
&hf_pipe_fragment_error,
|
||||
NULL,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Copyright 1999, Richard Sharpe <rsharpe@ns.aus.com>
|
||||
* 2001 Rewrite by Ronnie Sahlberg and Guy Harris
|
||||
*
|
||||
* $Id: packet-smb.c,v 1.331 2003/04/18 18:07:50 sharpe Exp $
|
||||
* $Id: packet-smb.c,v 1.332 2003/04/20 11:36:15 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -691,6 +691,7 @@ static const fragment_items smb_frag_items = {
|
|||
&hf_smb_segment_multiple_tails,
|
||||
&hf_smb_segment_too_long_fragment,
|
||||
&hf_smb_segment_error,
|
||||
NULL,
|
||||
|
||||
"segments"
|
||||
};
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* packet-tcp.c
|
||||
* Routines for TCP packet disassembly
|
||||
*
|
||||
* $Id: packet-tcp.c,v 1.189 2003/03/27 19:55:59 guy Exp $
|
||||
* $Id: packet-tcp.c,v 1.190 2003/04/20 11:36:16 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -144,6 +144,7 @@ static const fragment_items tcp_segment_items = {
|
|||
&hf_tcp_segment_multiple_tails,
|
||||
&hf_tcp_segment_too_long_fragment,
|
||||
&hf_tcp_segment_error,
|
||||
NULL,
|
||||
"Segments"
|
||||
};
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Copyright 2000-2002, Brian Bruns <camber@ais.org>
|
||||
* Copyright 2002, Steve Langasek <vorlon@netexpress.net>
|
||||
*
|
||||
* $Id: packet-tds.c,v 1.11 2003/03/04 06:47:10 guy Exp $
|
||||
* $Id: packet-tds.c,v 1.12 2003/04/20 11:36:16 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -289,6 +289,7 @@ static const fragment_items tds_frag_items = {
|
|||
&hf_tds_fragment_multiple_tails,
|
||||
&hf_tds_fragment_too_long_fragment,
|
||||
&hf_tds_fragment_error,
|
||||
NULL,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
*
|
||||
* Routines to dissect WTP component of WAP traffic.
|
||||
*
|
||||
* $Id: packet-wtp.c,v 1.44 2003/04/09 18:15:53 guy Exp $
|
||||
* $Id: packet-wtp.c,v 1.45 2003/04/20 11:36:16 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -213,6 +213,7 @@ static const fragment_items wtp_frag_items = {
|
|||
&hf_wtp_fragment_multiple_tails,
|
||||
&hf_wtp_fragment_too_long_fragment,
|
||||
&hf_wtp_fragment_error,
|
||||
NULL,
|
||||
"fragments"
|
||||
};
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* Routines for X.25 packet disassembly
|
||||
* Olivier Abad <oabad@noos.fr>
|
||||
*
|
||||
* $Id: packet-x25.c,v 1.83 2003/03/05 05:20:38 guy Exp $
|
||||
* $Id: packet-x25.c,v 1.84 2003/04/20 11:36:16 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -203,6 +203,7 @@ static const fragment_items x25_frag_items = {
|
|||
&hf_x25_segment_multiple_tails,
|
||||
&hf_x25_segment_too_long_segment,
|
||||
&hf_x25_segment_error,
|
||||
NULL,
|
||||
"segments"
|
||||
};
|
||||
|
||||
|
|
95
reassemble.c
95
reassemble.c
|
@ -1,7 +1,7 @@
|
|||
/* reassemble.c
|
||||
* Routines for {fragment,segment} reassembly
|
||||
*
|
||||
* $Id: reassemble.c,v 1.36 2003/04/20 08:40:45 guy Exp $
|
||||
* $Id: reassemble.c,v 1.37 2003/04/20 11:36:16 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -434,7 +434,8 @@ fragment_unhash(GHashTable *fragment_table, fragment_key *key)
|
|||
/*
|
||||
* This function adds fragment_data structure to a reassembled-packet
|
||||
* hash table, using the frame numbers of each of the frames from
|
||||
* which it was reassembled as keys.
|
||||
* which it was reassembled as keys, and sets the "reassembled_in"
|
||||
* frame number.
|
||||
*/
|
||||
void
|
||||
fragment_reassembled(fragment_data *fd_head, packet_info *pinfo,
|
||||
|
@ -442,10 +443,23 @@ fragment_reassembled(fragment_data *fd_head, packet_info *pinfo,
|
|||
{
|
||||
fragment_data *fd;
|
||||
|
||||
for (fd = fd_head->next; fd != NULL; fd = fd->next){
|
||||
g_hash_table_insert(reassembled_table, (gpointer)fd->frame,
|
||||
if (fd_head->next == NULL) {
|
||||
/*
|
||||
* This was not fragmented, so there's no fragment
|
||||
* table; just hash it using the current frame number.
|
||||
*/
|
||||
g_hash_table_insert(reassembled_table, (gpointer)pinfo->fd->num,
|
||||
fd_head);
|
||||
} else {
|
||||
/*
|
||||
* Hash it with the frame numbers for all the frames.
|
||||
*/
|
||||
for (fd = fd_head->next; fd != NULL; fd = fd->next){
|
||||
g_hash_table_insert(reassembled_table,
|
||||
(gpointer)fd->frame, fd_head);
|
||||
}
|
||||
}
|
||||
fd_head->reassembled_in = pinfo->fd->num;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1353,43 +1367,60 @@ fragment_add_seq_next(tvbuff_t *tvb, int offset, packet_info *pinfo,
|
|||
*/
|
||||
tvbuff_t *
|
||||
process_reassembled_data(tvbuff_t *tvb, packet_info *pinfo, char *name,
|
||||
fragment_data *fd_head, const fragment_items *frag_items,
|
||||
int hf_reassembled_in, gboolean *update_col_infop, proto_tree *tree)
|
||||
fragment_data *fd_head, const fragment_items *fit,
|
||||
gboolean *update_col_infop, proto_tree *tree)
|
||||
{
|
||||
tvbuff_t *next_tvb;
|
||||
gboolean update_col_info;
|
||||
|
||||
if (fd_head != NULL) {
|
||||
if (pinfo->fd->num == fd_head->reassembled_in) {
|
||||
/*
|
||||
* OK, we have the complete reassembled payload.
|
||||
* Allocate a new tvbuff, referring to the reassembled
|
||||
* payload.
|
||||
*/
|
||||
if (pinfo->fd->num == fd_head->reassembled_in) {
|
||||
/*
|
||||
* OK, we have the complete reassembled payload.
|
||||
* Allocate a new tvbuff, referring to the reassembled
|
||||
* payload.
|
||||
*/
|
||||
if (fd_head->flags & FD_BLOCKSEQUENCE) {
|
||||
next_tvb = tvb_new_real_data(fd_head->data,
|
||||
fd_head->datalen, fd_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, next_tvb, name);
|
||||
|
||||
/* show all fragments */
|
||||
*update_col_infop = !show_fragment_tree(fd_head,
|
||||
frag_items, tree, pinfo, next_tvb);
|
||||
fd_head->len, fd_head->len);
|
||||
} else {
|
||||
/* We don't have the complete reassembled payload. */
|
||||
next_tvb = NULL;
|
||||
proto_tree_add_uint(tree, hf_reassembled_in, tvb, 0, 0,
|
||||
fd_head->reassembled_in);
|
||||
next_tvb = tvb_new_real_data(fd_head->data,
|
||||
fd_head->datalen, fd_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, next_tvb, name);
|
||||
|
||||
/* show all fragments */
|
||||
if (fd_head->flags & FD_BLOCKSEQUENCE) {
|
||||
update_col_info = !show_fragment_seq_tree(fd_head,
|
||||
fit, tree, pinfo, next_tvb);
|
||||
} else {
|
||||
update_col_info = !show_fragment_tree(fd_head,
|
||||
fit, tree, pinfo, next_tvb);
|
||||
}
|
||||
if (update_col_infop != NULL)
|
||||
*update_col_infop = update_col_info;
|
||||
} else {
|
||||
/* We don't have the complete reassembled payload. */
|
||||
next_tvb = NULL;
|
||||
|
||||
/*
|
||||
* If there's a field to use for the number of
|
||||
* the frame in which the packet was reassembled,
|
||||
* add it to the protocol tree.
|
||||
*/
|
||||
if (fit->hf_reassembled_in != NULL) {
|
||||
proto_tree_add_uint(tree,
|
||||
*(fit->hf_reassembled_in), tvb,
|
||||
0, 0, fd_head->reassembled_in);
|
||||
}
|
||||
}
|
||||
return next_tvb;
|
||||
}
|
||||
|
|
15
reassemble.h
15
reassemble.h
|
@ -1,7 +1,7 @@
|
|||
/* reassemble.h
|
||||
* Declarations of outines for {fragment,segment} reassembly
|
||||
*
|
||||
* $Id: reassemble.h,v 1.17 2003/04/20 08:06:01 guy Exp $
|
||||
* $Id: reassemble.h,v 1.18 2003/04/20 11:36:16 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -194,14 +194,16 @@ fragment_delete(packet_info *pinfo, guint32 id, GHashTable *fragment_table);
|
|||
|
||||
/*
|
||||
* This function adds fragment_data structure to a reassembled-packet
|
||||
* hash table, using the frame data structure as the key.
|
||||
* hash table, using the frame numbers of each of the frames from
|
||||
* which it was reassembled as keys, and sets the "reassembled_in"
|
||||
* frame number.
|
||||
*/
|
||||
extern void
|
||||
fragment_reassembled(fragment_data *fd_head, packet_info *pinfo,
|
||||
GHashTable *reassembled_table);
|
||||
|
||||
/* hf_fragment and hf_fragment_error should be FT_FRAMENUM,
|
||||
the others should be FT_BOOLEAN
|
||||
/* hf_fragment, hf_fragment_error, and hf_reassembled_in should be
|
||||
FT_FRAMENUM, the others should be FT_BOOLEAN
|
||||
*/
|
||||
typedef struct _fragment_items {
|
||||
gint *ett_fragment;
|
||||
|
@ -214,14 +216,15 @@ typedef struct _fragment_items {
|
|||
int *hf_fragment_multiple_tails;
|
||||
int *hf_fragment_too_long_fragment;
|
||||
int *hf_fragment_error;
|
||||
int *hf_reassembled_in;
|
||||
|
||||
char *tag;
|
||||
} fragment_items;
|
||||
|
||||
extern tvbuff_t *
|
||||
process_reassembled_data(tvbuff_t *tvb, packet_info *pinfo, char *name,
|
||||
fragment_data *fd_head, const fragment_items *frag_items,
|
||||
int hf_reassembled_in, gboolean *update_col_infop, proto_tree *tree);
|
||||
fragment_data *fd_head, const fragment_items *fit,
|
||||
gboolean *update_col_infop, proto_tree *tree);
|
||||
|
||||
extern gboolean
|
||||
show_fragment_tree(fragment_data *ipfd_head, const fragment_items *fit,
|
||||
|
|
Loading…
Reference in New Issue