*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include "config.h"
+
+#include <stdio.h>
#include "globals.h"
#include "proto_hier_stats.h"
-#include "progress_dlg.h"
-#include "simple_dialog.h"
+#include "frame_tvbuff.h"
+#include "ui/progress_dlg.h"
#include <epan/epan_dissect.h>
#include <wtap.h>
proto_node *proto_sibling_node;
GNode *stat_node;
- finfo = PITEM_FINFO(ptree_node);
+ finfo = PNODE_FINFO(ptree_node);
+ /* We don't fake protocol nodes we expect them to have a field_info.
+ * Dissection with faked proto tree? */
g_assert(finfo);
- stat_node = find_stat_node(parent_stat_node, finfo->hfinfo);
+ /* If the field info isn't related to a protocol but to a field,
+ * don't count them, as they don't belong to any protocol.
+ * (happens e.g. for toplevel tree item of desegmentation "[Reassembled TCP Segments]") */
+ if (finfo->hfinfo->parent != -1) {
+ /* Skip this element, use parent status node */
+ stat_node = parent_stat_node;
+ stats = STAT_NODE_STATS(stat_node);
+ } else {
+ stat_node = find_stat_node(parent_stat_node, finfo->hfinfo);
- stats = STAT_NODE_STATS(stat_node);
- stats->num_pkts_total++;
- stats->num_bytes_total += pkt_len;
+ stats = STAT_NODE_STATS(stat_node);
+ stats->num_pkts_total++;
+ stats->num_bytes_total += pkt_len;
+ }
proto_sibling_node = ptree_node->next;
- /* If the field info isn't related to a protocol but to a field (parent != -1),
- * don't count them, as they don't belong to any protocol.
- * (happens e.g. for toplevel tree item of desegmentation "[Reassembled TCP Segments]") */
- if (proto_sibling_node && proto_sibling_node->finfo->hfinfo->parent == -1) {
+ if (proto_sibling_node) {
/* If the name does not exist for this proto_sibling_node, then it is
* not a normal protocol in the top-level tree. It was instead
* added as a normal tree such as IPv6's Hop-by-hop Option Header and
* should be skipped when creating the protocol hierarchy display. */
- if(strlen(proto_sibling_node->finfo->hfinfo->name) == 0 && ptree_node->next)
+ if(strlen(PNODE_FINFO(proto_sibling_node)->hfinfo->name) == 0 && ptree_node->next)
proto_sibling_node = proto_sibling_node->next;
process_node(proto_sibling_node, stat_node, ps, pkt_len);
static gboolean
process_frame(frame_data *frame, column_info *cinfo, ph_stats_t* ps)
{
- epan_dissect_t *edt;
- union wtap_pseudo_header phdr;
- guint8 pd[WTAP_MAX_PACKET_SIZE];
- int err;
- gchar *err_info;
+ epan_dissect_t edt;
+ struct wtap_pkthdr phdr;
+ Buffer buf;
double cur_time;
/* Load the frame from the capture file */
- if (!wtap_seek_read(cfile.wth, frame->file_off, &phdr, pd,
- frame->cap_len, &err, &err_info)) {
- simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
- cf_read_error_message(err, err_info), cfile.filename);
+ buffer_init(&buf, 1500);
+ if (!cf_read_frame_r(&cfile, frame, &phdr, &buf))
return FALSE; /* failure */
- }
/* Dissect the frame tree not visible */
- edt = epan_dissect_new(TRUE, FALSE);
- epan_dissect_run(edt, &phdr, pd, frame, cinfo);
+ epan_dissect_init(&edt, cfile.epan, TRUE, FALSE);
+ /* Don't fake protocols. We need them for the protocol hierarchy */
+ epan_dissect_fake_protocols(&edt, FALSE);
+ epan_dissect_run(&edt, &phdr, frame_tvbuff_new_buffer(frame, &buf), frame, cinfo);
/* Get stats from this protocol tree */
- process_tree(edt->tree, ps, frame->pkt_len);
+ process_tree(edt.tree, ps, frame->pkt_len);
/* Update times */
cur_time = nstime_to_sec(&frame->abs_ts);
}
/* Free our memory. */
- epan_dissect_free(edt);
+ epan_dissect_cleanup(&edt);
+ buffer_free(&buf);
return TRUE; /* success */
}
ph_stats_new(void)
{
ph_stats_t *ps;
+ guint32 framenum;
frame_data *frame;
guint tot_packets, tot_bytes;
progdlg_t *progbar = NULL;
/* Count of packets at which we've looked. */
count = 0;
/* Progress so far. */
- progbar_val = 0.0;
+ progbar_val = 0.0f;
stop_flag = FALSE;
g_get_current_time(&start_time);
tot_packets = 0;
tot_bytes = 0;
- for (frame = cfile.plist; frame != NULL; frame = frame->next) {
+ for (framenum = 1; framenum <= cfile.count; framenum++) {
+ frame = frame_data_sequence_find(cfile.frames, framenum);
+
/* Create the progress bar if necessary.
We check on every iteration of the loop, so that
it takes no longer than the standard time to create
to get to the next progress bar step). */
if (progbar == NULL)
progbar = delayed_create_progress_dlg(
- "Computing", "protocol hierarchy statistics",
+ cfile.window, "Computing",
+ "protocol hierarchy statistics",
TRUE, &stop_flag, &start_time, progbar_val);
/* Update the progress bar, but do it only N_PROGBAR_UPDATES
ps->first_time = cur_time;
ps->last_time = cur_time;
}
-
+
/* we don't care about colinfo */
if (!process_frame(frame, NULL, ps)) {
/*
static gboolean
stat_node_free(GNode *node, gpointer data _U_)
{
- ph_stats_node_t *stats = node->data;
+ ph_stats_node_t *stats = (ph_stats_node_t *)node->data;
if (stats) {
g_free(stats);