Bluetooth: Use dissector data instead of pinfo->private_data. Bug 7893 (https:/...
[metze/wireshark/wip.git] / proto_hier_stats.c
index d402492098ae93a47b57a9b05d4afb559f2e00f9..d1ac0232b6872e4c2aa806dbd12fa80a75d47e12 100644 (file)
  *
  * 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>
 
@@ -85,26 +85,34 @@ 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);
+       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);
@@ -132,27 +140,24 @@ 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;
-       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);
@@ -164,7 +169,8 @@ process_frame(frame_data *frame, column_info *cinfo, ph_stats_t* ps)
        }
 
        /* Free our memory. */
-       epan_dissect_free(edt);
+       epan_dissect_cleanup(&edt);
+       buffer_free(&buf);
 
        return TRUE;    /* success */
 }
@@ -173,6 +179,7 @@ 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;
@@ -200,7 +207,7 @@ ph_stats_new(void)
        /* 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);
@@ -208,7 +215,9 @@ 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
@@ -217,7 +226,8 @@ ph_stats_new(void)
                   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
@@ -261,7 +271,7 @@ ph_stats_new(void)
                                ps->first_time = cur_time;
                                ps->last_time = cur_time;
                        }
-                       
+
                        /* we don't care about colinfo */
                        if (!process_frame(frame, NULL, ps)) {
                                /*
@@ -304,7 +314,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);