X-Git-Url: http://git.samba.org/samba.git/?p=obnox%2Fwireshark%2Fwip.git;a=blobdiff_plain;f=proto_hier_stats.c;h=420e725e702167249c242c9db221a3a223557777;hp=8974e52ac1ca59275887c73ef4d6398a3f0d7be8;hb=faf70f117c9df940cfc3ec4e6c0de91059a4002c;hpb=0f4379723401ff6b5df9c652e9f41e878bda47d4 diff --git a/proto_hier_stats.c b/proto_hier_stats.c index 8974e52ac1..420e725e70 100644 --- a/proto_hier_stats.c +++ b/proto_hier_stats.c @@ -3,8 +3,8 @@ * * $Id$ * - * Ethereal - Network traffic analyzer - * By Gerald Combs + * Wireshark - Network traffic analyzer + * By Gerald Combs * Copyright 1998 Gerald Combs * * This program is free software; you can redistribute it and/or @@ -26,14 +26,16 @@ # include "config.h" #endif +#include + #include "globals.h" #include "proto_hier_stats.h" #include "progress_dlg.h" -#include "simple_dialog.h" #include #include #include +#include #include /* Update the progress bar this many times when scanning the packet list. */ @@ -42,11 +44,6 @@ #define STAT_NODE_STATS(n) ((ph_stats_node_t*)(n)->data) #define STAT_NODE_HFINFO(n) (STAT_NODE_STATS(n)->hfinfo) -static double -secs_usecs(guint32 s, guint32 us) -{ - return (us / 1000000.0) + (double)s; -} static GNode* find_stat_node(GNode *parent_stat_node, header_field_info *needle_hfinfo) @@ -89,24 +86,37 @@ process_node(proto_node *ptree_node, GNode *parent_stat_node, ph_stats_t *ps, gu proto_node *proto_sibling_node; GNode *stat_node; - finfo = PITEM_FINFO(ptree_node); - g_assert(finfo); - - stat_node = find_stat_node(parent_stat_node, finfo->hfinfo); - - /* Assert that the finfo is related to a protocol, not a field. */ - g_assert(finfo->hfinfo->parent == -1); - - stats = STAT_NODE_STATS(stat_node); - stats->num_pkts_total++; - stats->num_bytes_total += pkt_len; + finfo = PNODE_FINFO(ptree_node); + /* We don't fake protocol nodes we expect them to have a field_info */ + g_assert(finfo && "dissection with faked proto tree?"); + + /* 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; + } proto_sibling_node = ptree_node->next; 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(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); - } - else { + } else { stats->num_pkts_last++; stats->num_bytes_last += pkt_len; } @@ -130,30 +140,26 @@ process_tree(proto_tree *protocol_tree, ph_stats_t* ps, guint pkt_len) static gboolean process_frame(frame_data *frame, column_info *cinfo, ph_stats_t* ps) { - epan_dissect_t *edt; + epan_dissect_t edt; union wtap_pseudo_header phdr; guint8 pd[WTAP_MAX_PACKET_SIZE]; - int err; - gchar *err_info; 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); + if (!cf_read_frame_r(&cfile, frame, &phdr, pd)) return FALSE; /* failure */ - } - /* Dissect the frame */ - edt = epan_dissect_new(TRUE, FALSE); - epan_dissect_run(edt, &phdr, pd, frame, cinfo); + /* Dissect the frame tree not visible */ + epan_dissect_init(&edt, TRUE, FALSE); + /* Don't fake protocols. We need them for the protocol hierarchy */ + epan_dissect_fake_protocols(&edt, FALSE); + epan_dissect_run(&edt, &phdr, pd, 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 = secs_usecs(frame->abs_secs, frame->abs_usecs); + cur_time = nstime_to_sec(&frame->abs_ts); if (cur_time < ps->first_time) { ps->first_time = cur_time; } @@ -162,7 +168,7 @@ process_frame(frame_data *frame, column_info *cinfo, ph_stats_t* ps) } /* Free our memory. */ - epan_dissect_free(edt); + epan_dissect_cleanup(&edt); return TRUE; /* success */ } @@ -171,12 +177,13 @@ ph_stats_t* ph_stats_new(void) { ph_stats_t *ps; + guint32 framenum; frame_data *frame; guint tot_packets, tot_bytes; progdlg_t *progbar = NULL; gboolean stop_flag; int count; - float prog_val; + float progbar_val; GTimeVal start_time; gchar status_str[100]; int progbar_nextstep; @@ -197,6 +204,8 @@ ph_stats_new(void) progbar_quantum = cfile.count/N_PROGBAR_UPDATES; /* Count of packets at which we've looked. */ count = 0; + /* Progress so far. */ + progbar_val = 0.0f; stop_flag = FALSE; g_get_current_time(&start_time); @@ -204,7 +213,20 @@ ph_stats_new(void) 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 + it (otherwise, for a large file, we might take + considerably longer than that standard time in order + to get to the next progress bar step). */ + if (progbar == NULL) + progbar = delayed_create_progress_dlg( + "Computing", "protocol hierarchy statistics", + TRUE, &stop_flag, &start_time, progbar_val); + /* Update the progress bar, but do it only N_PROGBAR_UPDATES times; when we update it, we have to run the GTK+ main loop to get it to repaint what's pending, and doing so @@ -217,18 +239,12 @@ ph_stats_new(void) */ g_assert(cfile.count > 0); - prog_val = (gfloat) count / cfile.count; - - if (progbar == NULL) - /* Create the progress bar if necessary */ - progbar = delayed_create_progress_dlg( - "Computing", "protocol hierarchy statistics", - &stop_flag, &start_time, prog_val); + progbar_val = (gfloat) count / cfile.count; if (progbar != NULL) { g_snprintf(status_str, sizeof(status_str), "%4u of %u frames", count, cfile.count); - update_progress_dlg(progbar, prog_val, status_str); + update_progress_dlg(progbar, progbar_val, status_str); } progbar_nextstep += progbar_quantum; @@ -248,13 +264,13 @@ ph_stats_new(void) if (frame->flags.passed_dfilter) { if (tot_packets == 0) { - double cur_time = secs_usecs(frame->abs_secs, - frame->abs_usecs); + double cur_time = nstime_to_sec(&frame->abs_ts); ps->first_time = cur_time; ps->last_time = cur_time; } - if (!process_frame(frame, &cfile.cinfo, ps)) { + /* we don't care about colinfo */ + if (!process_frame(frame, NULL, ps)) { /* * Give up, and set "stop_flag" so we * just abort rather than popping up @@ -295,7 +311,7 @@ ph_stats_new(void) 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);