Allow floating point values for stats_tree
authorMichael Mann <mmann78@netscape.net>
Thu, 27 Dec 2018 19:47:02 +0000 (14:47 -0500)
committerMichael Mann <mmann78@netscape.net>
Fri, 28 Dec 2018 14:50:45 +0000 (14:50 +0000)
Bug: 4234
Change-Id: Ibd59809b2dd9890a7851eb57ef7af384e280a74b
Reviewed-on: https://code.wireshark.org/review/31222
Reviewed-by: Michael Mann <mmann78@netscape.net>
22 files changed:
debian/libwireshark0.symbols
epan/dissectors/packet-ancp.c
epan/dissectors/packet-bacapp.c
epan/dissectors/packet-collectd.c
epan/dissectors/packet-dns.c
epan/dissectors/packet-f5ethtrailer.c
epan/dissectors/packet-gsm_osmux.c
epan/dissectors/packet-hartip.c
epan/dissectors/packet-hpfeeds.c
epan/dissectors/packet-http.c
epan/dissectors/packet-http2.c
epan/dissectors/packet-isup.c
epan/dissectors/packet-lbmr.c
epan/dissectors/packet-rtsp.c
epan/dissectors/packet-sametime.c
epan/dissectors/packet-smpp.c
epan/dissectors/packet-ucp.c
epan/stats_tree.c
epan/stats_tree.h
epan/stats_tree_priv.h
plugins/epan/stats_tree/pinfo_stats_tree.c
sharkd_session.c

index 70231d2805fcdcd7347b14207bc4cfcb2bec4886..d47e979c3054177dfb26a0f0b558627ddb6ac38f 100644 (file)
@@ -1499,7 +1499,8 @@ libwireshark.so.0 libwireshark0 #MINVER#
  stats_tree_get_displayname@Base 1.12.0~rc1
  stats_tree_get_values_from_node@Base 1.12.0~rc1
  stats_tree_is_default_sort_DESC@Base 1.12.0~rc1
- stats_tree_manip_node@Base 1.9.1
+ stats_tree_manip_node_float@Base 2.9.0
+ stats_tree_manip_node_int@Base 2.9.0
  stats_tree_new@Base 1.9.1
  stats_tree_node_to_str@Base 1.9.1
  stats_tree_packet@Base 1.9.1
index dde614241a7cc64513f4e5d2b1e987cea517cdc1..e8a4bcc1187d926abc435390f7a44aede04511a2 100644 (file)
@@ -590,11 +590,11 @@ dissect_ancp_adj_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ancp_tree,
 static void
 ancp_stats_tree_init(stats_tree *st)
 {
-    st_node_packets = stats_tree_create_node(st, st_str_packets, 0, TRUE);
+    st_node_packets = stats_tree_create_node(st, st_str_packets, 0, STAT_DT_INT, TRUE);
     st_node_packet_types = stats_tree_create_pivot(st, st_str_packet_types,
             st_node_packets);
     st_node_adj_pack_types = stats_tree_create_node(st, st_str_adj_pack_types,
-            st_node_packets, TRUE);
+            st_node_packets, STAT_DT_INT, TRUE);
 }
 
 static int
index 66a10790edc78270ea789df1324c14b87926efbe..da6a20776ab9574d9214322068c18959f0390146 100644 (file)
@@ -6174,8 +6174,8 @@ static void
 bacapp_packet_stats_tree_init(stats_tree* st)
 {
     st_node_packets_by_ip = stats_tree_create_pivot(st, st_str_packets_by_ip, 0);
-    st_node_packets_by_ip_src = stats_tree_create_node(st, st_str_packets_by_ip_src, st_node_packets_by_ip, TRUE);
-    st_node_packets_by_ip_dst = stats_tree_create_node(st, st_str_packets_by_ip_dst, st_node_packets_by_ip, TRUE);
+    st_node_packets_by_ip_src = stats_tree_create_node(st, st_str_packets_by_ip_src, st_node_packets_by_ip, STAT_DT_INT, TRUE);
+    st_node_packets_by_ip_dst = stats_tree_create_node(st, st_str_packets_by_ip_dst, st_node_packets_by_ip, STAT_DT_INT, TRUE);
 }
 
 static gchar *
index f065a767890cbd801c462307d6973deeb0b3678b..823aa3a15a829f5471f682edb5f0be85b10bb7d8 100644 (file)
@@ -200,8 +200,8 @@ collectd_time_to_nstime (guint64 t)
 static void
 collectd_stats_tree_init (stats_tree *st)
 {
-       st_collectd_packets = stats_tree_create_node (st, "Packets", 0, FALSE);
-       st_collectd_values = stats_tree_create_node (st, "Values", 0, TRUE);
+       st_collectd_packets = stats_tree_create_node (st, "Packets", 0, STAT_DT_INT, FALSE);
+       st_collectd_values = stats_tree_create_node (st, "Values", 0, STAT_DT_INT, TRUE);
 
        st_collectd_values_hosts = stats_tree_create_pivot (st, "By host",
                                                           st_collectd_values);
index 3dd3bd7f9da9e60acf8c4979a2f7d1712f0083d9..4c5e169fa60a7f83296bef6a11b07215a39c995a 100644 (file)
@@ -4152,33 +4152,33 @@ dissect_dns(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
 
 static void dns_stats_tree_init(stats_tree* st)
 {
-  st_node_packets = stats_tree_create_node(st, st_str_packets, 0, TRUE);
+  st_node_packets = stats_tree_create_node(st, st_str_packets, 0, STAT_DT_INT, TRUE);
   st_node_packet_qr = stats_tree_create_pivot(st, st_str_packet_qr, st_node_packets);
   st_node_packet_qtypes = stats_tree_create_pivot(st, st_str_packet_qtypes, st_node_packets);
   st_node_packet_qclasses = stats_tree_create_pivot(st, st_str_packet_qclasses, st_node_packets);
   st_node_packet_rcodes = stats_tree_create_pivot(st, st_str_packet_rcodes, st_node_packets);
   st_node_packet_opcodes = stats_tree_create_pivot(st, st_str_packet_opcodes, st_node_packets);
-  st_node_packets_avg_size = stats_tree_create_node(st, st_str_packets_avg_size, 0, FALSE);
-  st_node_query_stats = stats_tree_create_node(st, st_str_query_stats, 0, TRUE);
-  st_node_query_qname_len = stats_tree_create_node(st, st_str_query_qname_len, st_node_query_stats, FALSE);
-  st_node_query_domains = stats_tree_create_node(st, st_str_query_domains, st_node_query_stats, TRUE);
-  st_node_query_domains_l1 = stats_tree_create_node(st, st_str_query_domains_l1, st_node_query_domains, FALSE);
-  st_node_query_domains_l2 = stats_tree_create_node(st, st_str_query_domains_l2, st_node_query_domains, FALSE);
-  st_node_query_domains_l3 = stats_tree_create_node(st, st_str_query_domains_l3, st_node_query_domains, FALSE);
-  st_node_query_domains_lmore = stats_tree_create_node(st, st_str_query_domains_lmore, st_node_query_domains, FALSE);
-  st_node_response_stats = stats_tree_create_node(st, st_str_response_stats, 0, TRUE);
+  st_node_packets_avg_size = stats_tree_create_node(st, st_str_packets_avg_size, 0, STAT_DT_INT, FALSE);
+  st_node_query_stats = stats_tree_create_node(st, st_str_query_stats, 0, STAT_DT_INT, TRUE);
+  st_node_query_qname_len = stats_tree_create_node(st, st_str_query_qname_len, st_node_query_stats, STAT_DT_INT, FALSE);
+  st_node_query_domains = stats_tree_create_node(st, st_str_query_domains, st_node_query_stats, STAT_DT_INT, TRUE);
+  st_node_query_domains_l1 = stats_tree_create_node(st, st_str_query_domains_l1, st_node_query_domains, STAT_DT_INT, FALSE);
+  st_node_query_domains_l2 = stats_tree_create_node(st, st_str_query_domains_l2, st_node_query_domains, STAT_DT_INT, FALSE);
+  st_node_query_domains_l3 = stats_tree_create_node(st, st_str_query_domains_l3, st_node_query_domains, STAT_DT_INT, FALSE);
+  st_node_query_domains_lmore = stats_tree_create_node(st, st_str_query_domains_lmore, st_node_query_domains, STAT_DT_INT, FALSE);
+  st_node_response_stats = stats_tree_create_node(st, st_str_response_stats, 0, STAT_DT_INT, TRUE);
   st_node_response_nquestions = stats_tree_create_node(st, st_str_response_nquestions,
-    st_node_response_stats, FALSE);
+    st_node_response_stats, STAT_DT_INT, FALSE);
   st_node_response_nanswers = stats_tree_create_node(st, st_str_response_nanswers,
-    st_node_response_stats, FALSE);
+    st_node_response_stats, STAT_DT_INT, FALSE);
   st_node_response_nauthorities = stats_tree_create_node(st, st_str_response_nauthorities,
-    st_node_response_stats, FALSE);
+    st_node_response_stats, STAT_DT_INT, FALSE);
   st_node_response_nadditionals = stats_tree_create_node(st, st_str_response_nadditionals,
-    st_node_response_stats, FALSE);
-  st_node_service_stats = stats_tree_create_node(st, st_str_service_stats, 0, TRUE);
-  st_node_service_unsolicited = stats_tree_create_node(st, st_str_service_unsolicited, st_node_service_stats, FALSE);
-  st_node_service_retransmission = stats_tree_create_node(st, st_str_service_retransmission, st_node_service_stats, FALSE);
-  st_node_service_rrt = stats_tree_create_node(st, st_str_service_rrt, st_node_service_stats, FALSE);
+    st_node_response_stats, STAT_DT_INT, FALSE);
+  st_node_service_stats = stats_tree_create_node(st, st_str_service_stats, 0, STAT_DT_INT, TRUE);
+  st_node_service_unsolicited = stats_tree_create_node(st, st_str_service_unsolicited, st_node_service_stats, STAT_DT_INT, FALSE);
+  st_node_service_retransmission = stats_tree_create_node(st, st_str_service_retransmission, st_node_service_stats, STAT_DT_INT, FALSE);
+  st_node_service_rrt = stats_tree_create_node(st, st_str_service_rrt, st_node_service_stats, STAT_DT_INT, FALSE);
 }
 
 static int dns_stats_tree_packet(stats_tree* st, packet_info* pinfo _U_, epan_dissect_t* edt _U_, const void* p)
@@ -4195,12 +4195,12 @@ static int dns_stats_tree_packet(stats_tree* st, packet_info* pinfo _U_, epan_di
           val_to_str(pi->packet_rcode, rcode_vals, "Unknown rcode (%d)"));
   stats_tree_tick_pivot(st, st_node_packet_opcodes,
           val_to_str(pi->packet_opcode, opcode_vals, "Unknown opcode (%d)"));
-  avg_stat_node_add_value(st, st_str_packets_avg_size, 0, FALSE,
+  avg_stat_node_add_value_int(st, st_str_packets_avg_size, 0, FALSE,
           pi->payload_size);
 
   /* split up stats for queries and responses */
   if (pi->packet_qr == 0) {
-    avg_stat_node_add_value(st, st_str_query_qname_len, 0, FALSE, pi->qname_len);
+    avg_stat_node_add_value_int(st, st_str_query_qname_len, 0, FALSE, pi->qname_len);
     switch(pi->qname_labels) {
       case 1:
         tick_stat_node(st, st_str_query_domains_l1, 0, FALSE);
@@ -4216,24 +4216,24 @@ static int dns_stats_tree_packet(stats_tree* st, packet_info* pinfo _U_, epan_di
         break;
     }
   } else {
-    avg_stat_node_add_value(st, st_str_response_nquestions, 0, FALSE, pi->nquestions);
-    avg_stat_node_add_value(st, st_str_response_nanswers, 0, FALSE, pi->nanswers);
-    avg_stat_node_add_value(st, st_str_response_nauthorities, 0, FALSE, pi->nauthorities);
-    avg_stat_node_add_value(st, st_str_response_nadditionals, 0, FALSE, pi->nadditionals);
+    avg_stat_node_add_value_int(st, st_str_response_nquestions, 0, FALSE, pi->nquestions);
+    avg_stat_node_add_value_int(st, st_str_response_nanswers, 0, FALSE, pi->nanswers);
+    avg_stat_node_add_value_int(st, st_str_response_nauthorities, 0, FALSE, pi->nauthorities);
+    avg_stat_node_add_value_int(st, st_str_response_nadditionals, 0, FALSE, pi->nadditionals);
     if (pi->unsolicited) {
       tick_stat_node(st, st_str_service_unsolicited, 0, FALSE);
     } else {
-        avg_stat_node_add_value(st, st_str_response_nquestions, 0, FALSE, pi->nquestions);
-        avg_stat_node_add_value(st, st_str_response_nanswers, 0, FALSE, pi->nanswers);
-        avg_stat_node_add_value(st, st_str_response_nauthorities, 0, FALSE, pi->nauthorities);
-        avg_stat_node_add_value(st, st_str_response_nadditionals, 0, FALSE, pi->nadditionals);
+        avg_stat_node_add_value_int(st, st_str_response_nquestions, 0, FALSE, pi->nquestions);
+        avg_stat_node_add_value_int(st, st_str_response_nanswers, 0, FALSE, pi->nanswers);
+        avg_stat_node_add_value_int(st, st_str_response_nauthorities, 0, FALSE, pi->nauthorities);
+        avg_stat_node_add_value_int(st, st_str_response_nadditionals, 0, FALSE, pi->nadditionals);
         if (pi->unsolicited) {
           tick_stat_node(st, st_str_service_unsolicited, 0, FALSE);
         } else {
           if (pi->retransmission)
             tick_stat_node(st, st_str_service_retransmission, 0, FALSE);
           else
-            avg_stat_node_add_value(st, st_str_service_rrt, 0, FALSE, (guint32)(pi->rrt.secs * 1000000 + pi->rrt.nsecs/1000));
+            avg_stat_node_add_value_int(st, st_str_service_rrt, 0, FALSE, (guint32)(pi->rrt.secs * 1000000 + pi->rrt.nsecs/1000));
         }
     }
   }
index 540ed0eaabcc05c0a079d1fed52844b17d6a6286..557ccbf0d0a1f57dac189d546dedfd801c13051a 100644 (file)
@@ -633,9 +633,9 @@ static const gchar *st_str_virtdist_novirt = "Flow without virtual server name";
 static void f5eth_tmmdist_stats_tree_init(
        stats_tree *st
 ) {
-       st_node_tmmpktdist = stats_tree_create_node(st, st_str_tmmdist_pkts, 0, TRUE);
+       st_node_tmmpktdist = stats_tree_create_node(st, st_str_tmmdist_pkts, 0, STAT_DT_INT, TRUE);
        stat_node_set_flags(st, st_str_tmmdist_pkts, 0, TRUE, ST_FLG_SORT_TOP);
-       st_node_tmmbytedist = stats_tree_create_node(st, st_str_tmmdist_bytes, 0, TRUE);
+       st_node_tmmbytedist = stats_tree_create_node(st, st_str_tmmdist_bytes, 0, STAT_DT_INT, TRUE);
 } /* f5eth_tmmdist_stats_tree_init() */
 
 #define PER_TMM_STAT_NAME_BUF_LEN (sizeof("slot SSS,tmm TTT"))
@@ -741,18 +741,18 @@ static int f5eth_tmmdist_stats_tree_packet(
 static void f5eth_virtdist_stats_tree_init(
        stats_tree *st
 ) {
-       st_node_virtpktdist = stats_tree_create_node(st, st_str_virtdist_pkts, 0, TRUE);
+       st_node_virtpktdist = stats_tree_create_node(st, st_str_virtdist_pkts, 0, STAT_DT_INT, TRUE);
        stat_node_set_flags(st, st_str_virtdist_pkts, 0, TRUE, ST_FLG_SORT_TOP);
-       st_node_virtbytedist = stats_tree_create_node(st, st_str_virtdist_bytes, 0, TRUE);
+       st_node_virtbytedist = stats_tree_create_node(st, st_str_virtdist_bytes, 0, STAT_DT_INT, TRUE);
 
-       stats_tree_create_node(st, st_str_virtdist_noflow, st_node_virtpktdist, TRUE);
+       stats_tree_create_node(st, st_str_virtdist_noflow, st_node_virtpktdist, STAT_DT_INT, TRUE);
        stat_node_set_flags(st, st_str_virtdist_noflow, st_node_virtpktdist, TRUE, ST_FLG_SORT_TOP);
-       stats_tree_create_node(st, st_str_virtdist_novirt, st_node_virtpktdist, TRUE);
+       stats_tree_create_node(st, st_str_virtdist_novirt, st_node_virtpktdist, STAT_DT_INT, TRUE);
        stat_node_set_flags(st, st_str_virtdist_novirt, st_node_virtpktdist, TRUE, ST_FLG_SORT_TOP);
 
-       stats_tree_create_node(st, st_str_virtdist_noflow, st_node_virtbytedist, TRUE);
+       stats_tree_create_node(st, st_str_virtdist_noflow, st_node_virtbytedist, STAT_DT_INT, TRUE);
        stat_node_set_flags(st, st_str_virtdist_noflow, st_node_virtbytedist, TRUE, ST_FLG_SORT_TOP);
-       stats_tree_create_node(st, st_str_virtdist_novirt, st_node_virtbytedist, TRUE);
+       stats_tree_create_node(st, st_str_virtdist_novirt, st_node_virtbytedist, STAT_DT_INT, TRUE);
        stat_node_set_flags(st, st_str_virtdist_novirt, st_node_virtbytedist, TRUE, ST_FLG_SORT_TOP);
 } /* f5eth_virtdist_stats_tree_init() */
 
index e6cf2e8797ae2dc6e86261f11573a0de49aa8c34..f29181408588dccdefc51dbd18f588bc90daf921 100644 (file)
@@ -379,8 +379,8 @@ static void stream_hash_clean_stats(gpointer key _U_, gpointer value, gpointer u
 static void osmux_stats_tree_init(stats_tree *st)
 {
     wmem_map_foreach(osmux_stream_hash, stream_hash_clean_stats, NULL);
-    st_osmux_stats = stats_tree_create_node(st, st_str_total_pkts, 0, TRUE);
-    st_osmux_stats_conn = stats_tree_create_node(st, st_str_conn, st_osmux_stats, TRUE);
+    st_osmux_stats = stats_tree_create_node(st, st_str_total_pkts, 0, STAT_DT_INT, TRUE);
+    st_osmux_stats_conn = stats_tree_create_node(st, st_str_conn, st_osmux_stats, STAT_DT_INT, TRUE);
 }
 
 static int osmux_stats_tree_packet(stats_tree *st, packet_info *pinfo,
@@ -397,7 +397,7 @@ static int osmux_stats_tree_packet(stats_tree *st, packet_info *pinfo,
 
     if (!stream->stats.node_id) {
         tick_stat_node(st, st_str_conn, st_osmux_stats, TRUE);
-        stream->stats.node_id = stats_tree_create_node(st, stream_name, st_osmux_stats_conn, TRUE);
+        stream->stats.node_id = stats_tree_create_node(st, stream_name, st_osmux_stats_conn, STAT_DT_INT, TRUE);
     }
 
     tick_stat_node(st, stream_name, st_osmux_stats_conn, TRUE);
@@ -417,9 +417,9 @@ static int osmux_stats_tree_packet(stats_tree *st, packet_info *pinfo,
 
         /* Calculate relative transmit time */
         if ((stream->stats.prev_ts.secs == 0 && stream->stats.prev_ts.nsecs == 0) || osmuxh->rtp_m) {
-            avg_stat_node_add_value(st, st_str_jit_rtt, stream->stats.node_id, TRUE, 0);
-            avg_stat_node_add_value(st, st_str_jit_rtt_abs, stream->stats.node_id, TRUE, 0);
-            avg_stat_node_add_value(st, st_str_jit_jit, stream->stats.node_id, TRUE, 0);
+            avg_stat_node_add_value_int(st, st_str_jit_rtt, stream->stats.node_id, TRUE, 0);
+            avg_stat_node_add_value_int(st, st_str_jit_rtt_abs, stream->stats.node_id, TRUE, 0);
+            avg_stat_node_add_value_int(st, st_str_jit_jit, stream->stats.node_id, TRUE, 0);
             stream->stats.jitter = 0;
         } else {
             nstime_t diff_rx;
@@ -431,9 +431,9 @@ static int osmux_stats_tree_packet(stats_tree *st, packet_info *pinfo,
             Dij = diff_rx_ms - diff_tx_ms;
             abs_Dij = Dij * ( Dij >= 0 ? 1 : -1 );
             stream->stats.jitter = stream->stats.jitter + ((double) abs_Dij - stream->stats.jitter)/16.0;
-            avg_stat_node_add_value(st, st_str_jit_rtt, stream->stats.node_id, TRUE, Dij);
-            avg_stat_node_add_value(st, st_str_jit_rtt_abs, stream->stats.node_id, TRUE, abs_Dij);
-            avg_stat_node_add_value(st, st_str_jit_jit, stream->stats.node_id, TRUE, (gint) stream->stats.jitter);
+            avg_stat_node_add_value_int(st, st_str_jit_rtt, stream->stats.node_id, TRUE, Dij);
+            avg_stat_node_add_value_int(st, st_str_jit_rtt_abs, stream->stats.node_id, TRUE, abs_Dij);
+            avg_stat_node_add_value_int(st, st_str_jit_jit, stream->stats.node_id, TRUE, (gint) stream->stats.jitter);
         }
         stream->stats.prev_ts = pinfo->abs_ts;
         stream->stats.prev_seq = osmuxh->seq;
index 5a47d3af2129083fa12e5e3666e8d6ae8df352ed..7a4a598a07977890c797b11b60f3adbdb1f8fbf3 100644 (file)
@@ -322,11 +322,11 @@ static int st_node_errors = -1;
 static void
 hartip_stats_tree_init(stats_tree* st)
 {
-  st_node_packets   = stats_tree_create_node(st, st_str_packets, 0, TRUE);
+  st_node_packets   = stats_tree_create_node(st, st_str_packets, 0, STAT_DT_INT, TRUE);
   st_node_requests  = stats_tree_create_pivot(st, st_str_requests, st_node_packets);
-  st_node_responses = stats_tree_create_node(st, st_str_responses, st_node_packets, TRUE);
-  st_node_publish   = stats_tree_create_node(st, st_str_publish, st_node_packets, TRUE);
-  st_node_errors    = stats_tree_create_node(st, st_str_errors, st_node_packets, TRUE);
+  st_node_responses = stats_tree_create_node(st, st_str_responses, st_node_packets, STAT_DT_INT, TRUE);
+  st_node_publish   = stats_tree_create_node(st, st_str_publish, st_node_packets, STAT_DT_INT, TRUE);
+  st_node_errors    = stats_tree_create_node(st, st_str_errors, st_node_packets, STAT_DT_INT, TRUE);
 }
 
 static int
index ae85c725527b9588d6eea056e95580545766a04d..41fa3f941590fb91702487aa2249c479c701dfce 100644 (file)
@@ -206,7 +206,7 @@ dissect_hpfeeds_publish_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
 
 static void hpfeeds_stats_tree_init(stats_tree* st)
 {
-    st_node_channels_payload = stats_tree_create_node(st, st_str_channels_payload, 0, TRUE);
+    st_node_channels_payload = stats_tree_create_node(st, st_str_channels_payload, 0, STAT_DT_INT, TRUE);
     st_node_opcodes = stats_tree_create_pivot(st, st_str_opcodes, 0);
 
     channels_list = wmem_list_new(wmem_epan_scope());
@@ -233,12 +233,12 @@ static int hpfeeds_stats_tree_packet(stats_tree* st _U_, packet_info* pinfo _U_,
             ch_node = (struct channel_node*)wmem_alloc0(wmem_file_scope(), sizeof(struct channel_node));
             ch_node->channel = wmem_strdup(wmem_file_scope(), pi->channel);
             ch_node->st_node_channel_payload = stats_tree_create_node(st, ch_node->channel,
-                st_node_channels_payload, FALSE);
+                st_node_channels_payload, STAT_DT_INT, FALSE);
             wmem_list_append(channels_list, ch_node);
         }
 
-        avg_stat_node_add_value(st, st_str_channels_payload, 0, FALSE, pi->payload_size);
-        avg_stat_node_add_value(st, ch_node->channel, 0, FALSE, pi->payload_size);
+        avg_stat_node_add_value_int(st, st_str_channels_payload, 0, FALSE, pi->payload_size);
+        avg_stat_node_add_value_int(st, ch_node->channel, 0, FALSE, pi->payload_size);
     }
 
     stats_tree_tick_pivot(st, st_node_opcodes,
index 0d18765687ed6e93cfc6a25289aa41b7330bc824..8fd72e5aa2a512cc7592d45418b45a0d3d688cb5 100644 (file)
@@ -456,10 +456,10 @@ static int st_node_resps_by_srv_addr = -1;
 static void
 http_reqs_stats_tree_init(stats_tree* st)
 {
-       st_node_reqs = stats_tree_create_node(st, st_str_reqs, 0, TRUE);
-       st_node_reqs_by_srv_addr = stats_tree_create_node(st, st_str_reqs_by_srv_addr, st_node_reqs, TRUE);
-       st_node_reqs_by_http_host = stats_tree_create_node(st, st_str_reqs_by_http_host, st_node_reqs, TRUE);
-       st_node_resps_by_srv_addr = stats_tree_create_node(st, st_str_resps_by_srv_addr, 0, TRUE);
+       st_node_reqs = stats_tree_create_node(st, st_str_reqs, 0, STAT_DT_INT, TRUE);
+       st_node_reqs_by_srv_addr = stats_tree_create_node(st, st_str_reqs_by_srv_addr, st_node_reqs, STAT_DT_INT, TRUE);
+       st_node_reqs_by_http_host = stats_tree_create_node(st, st_str_reqs_by_http_host, st_node_reqs, STAT_DT_INT, TRUE);
+       st_node_resps_by_srv_addr = stats_tree_create_node(st, st_str_resps_by_srv_addr, 0, STAT_DT_INT, TRUE);
 }
 
 /* HTTP/Load Distribution stats packet function */
@@ -521,7 +521,7 @@ static const gchar *st_str_requests_by_host = "HTTP Requests by HTTP Host";
 static void
 http_req_stats_tree_init(stats_tree* st)
 {
-       st_node_requests_by_host = stats_tree_create_node(st, st_str_requests_by_host, 0, TRUE);
+       st_node_requests_by_host = stats_tree_create_node(st, st_str_requests_by_host, 0, STAT_DT_INT, TRUE);
 }
 
 /* HTTP/Requests stats packet function */
@@ -575,16 +575,16 @@ static int st_node_other = -1;
 static void
 http_stats_tree_init(stats_tree* st)
 {
-       st_node_packets = stats_tree_create_node(st, st_str_packets, 0, TRUE);
+       st_node_packets = stats_tree_create_node(st, st_str_packets, 0, STAT_DT_INT, TRUE);
        st_node_requests = stats_tree_create_pivot(st, st_str_requests, st_node_packets);
-       st_node_responses = stats_tree_create_node(st, st_str_responses, st_node_packets, TRUE);
-       st_node_resp_broken = stats_tree_create_node(st, st_str_resp_broken, st_node_responses, TRUE);
-       st_node_resp_100    = stats_tree_create_node(st, st_str_resp_100,    st_node_responses, TRUE);
-       st_node_resp_200    = stats_tree_create_node(st, st_str_resp_200,    st_node_responses, TRUE);
-       st_node_resp_300    = stats_tree_create_node(st, st_str_resp_300,    st_node_responses, TRUE);
-       st_node_resp_400    = stats_tree_create_node(st, st_str_resp_400,    st_node_responses, TRUE);
-       st_node_resp_500    = stats_tree_create_node(st, st_str_resp_500,    st_node_responses, TRUE);
-       st_node_other = stats_tree_create_node(st, st_str_other, st_node_packets,FALSE);
+       st_node_responses = stats_tree_create_node(st, st_str_responses, st_node_packets, STAT_DT_INT, TRUE);
+       st_node_resp_broken = stats_tree_create_node(st, st_str_resp_broken, st_node_responses, STAT_DT_INT, TRUE);
+       st_node_resp_100    = stats_tree_create_node(st, st_str_resp_100,    st_node_responses, STAT_DT_INT, TRUE);
+       st_node_resp_200    = stats_tree_create_node(st, st_str_resp_200,    st_node_responses, STAT_DT_INT, TRUE);
+       st_node_resp_300    = stats_tree_create_node(st, st_str_resp_300,    st_node_responses, STAT_DT_INT, TRUE);
+       st_node_resp_400    = stats_tree_create_node(st, st_str_resp_400,    st_node_responses, STAT_DT_INT, TRUE);
+       st_node_resp_500    = stats_tree_create_node(st, st_str_resp_500,    st_node_responses, STAT_DT_INT, TRUE);
+       st_node_other = stats_tree_create_node(st, st_str_other, st_node_packets, STAT_DT_INT, FALSE);
 }
 
 /* HTTP/Packet Counter stats packet function */
@@ -687,7 +687,7 @@ http_seq_stats_tree_init(stats_tree* st)
        refstats_uri_to_node_id_hash = wmem_map_new(wmem_file_scope(), wmem_str_hash, g_str_equal);
 
        /* Add the root node and its mappings */
-       st_node_requests_by_referer = stats_tree_create_node(st, st_str_request_sequences, root_node_id, TRUE);
+       st_node_requests_by_referer = stats_tree_create_node(st, st_str_request_sequences, root_node_id, STAT_DT_INT, TRUE);
        node_id_p = GINT_TO_POINTER(st_node_requests_by_referer);
        uri = wmem_strdup(wmem_file_scope(), st_str_request_sequences);
 
index 9e6b048a61b107e9db11555ebe540f05459432af..30d00f25137bc86aabeb80eae4402c7279ff34f7 100644 (file)
@@ -3364,7 +3364,7 @@ proto_register_http2(void)
 
 static void http2_stats_tree_init(stats_tree* st)
 {
-    st_node_http2 = stats_tree_create_node(st, st_str_http2, 0, TRUE);
+    st_node_http2 = stats_tree_create_node(st, st_str_http2, 0, STAT_DT_INT, TRUE);
     st_node_http2_type = stats_tree_create_pivot(st, st_str_http2_type, st_node_http2);
 
 }
index 60ba2436425e886bb2aed4bfb05bb44048ab6d52..437e07174514acae4bd926a378b7444f9fa55524 100644 (file)
@@ -10420,8 +10420,8 @@ static int st_node_dir = -1;
 static void
 msg_stats_tree_init(stats_tree *st)
 {
-  st_node_msg = stats_tree_create_node(st, "Messages by Type", 0, TRUE);
-  st_node_dir = stats_tree_create_node(st, "Messages by Direction", 0, TRUE);
+  st_node_msg = stats_tree_create_node(st, "Messages by Type", 0, STAT_DT_INT, TRUE);
+  st_node_dir = stats_tree_create_node(st, "Messages by Direction", 0, STAT_DT_INT, TRUE);
 }
 
 static int
index c0541f0b85dd863149cab00d2d8cb0a3d436a4ca..2898610a6db315197d325bc90c750f43cbadde37 100644 (file)
@@ -2840,7 +2840,7 @@ static void add_contents_qir(lbmr_contents_t * contents, const char * queue, con
 
 static void lbmr_topic_ads_topic_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_ads_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_topic, 0, TRUE);
+    lbmr_stats_tree_handle_topic_ads_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_topic, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_ads_topic_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -2867,7 +2867,7 @@ static int lbmr_topic_ads_topic_stats_tree_packet(stats_tree * tree, packet_info
 
 static void lbmr_topic_ads_source_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_source, 0, TRUE);
+    lbmr_stats_tree_handle_topic_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_source, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_ads_source_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -2893,7 +2893,7 @@ static int lbmr_topic_ads_source_stats_tree_packet(stats_tree * tree, packet_inf
 
 static void lbmr_topic_ads_transport_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_ads_transport = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_transport, 0, TRUE);
+    lbmr_stats_tree_handle_topic_ads_transport = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_ads_transport, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_ads_transport_stats_tree_packet(stats_tree * tree, packet_info * pinfo _U_, epan_dissect_t * edt _U_, const void * data)
@@ -2917,7 +2917,7 @@ static int lbmr_topic_ads_transport_stats_tree_packet(stats_tree * tree, packet_
 
 static void lbmr_topic_queries_topic_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_queries_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_topic, 0, TRUE);
+    lbmr_stats_tree_handle_topic_queries_topic = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_topic, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_queries_topic_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -2939,7 +2939,7 @@ static int lbmr_topic_queries_topic_stats_tree_packet(stats_tree * tree, packet_
 
 static void lbmr_topic_queries_receiver_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_receiver, 0, TRUE);
+    lbmr_stats_tree_handle_topic_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_receiver, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_queries_receiver_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -2961,7 +2961,7 @@ static int lbmr_topic_queries_receiver_stats_tree_packet(stats_tree * tree, pack
 
 static void lbmr_topic_queries_pattern_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_queries_pattern = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern, 0, TRUE);
+    lbmr_stats_tree_handle_topic_queries_pattern = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_queries_pattern_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -2987,7 +2987,7 @@ static int lbmr_topic_queries_pattern_stats_tree_packet(stats_tree * tree, packe
 
 static void lbmr_topic_queries_pattern_receiver_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_topic_queries_pattern_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern_receiver, 0, TRUE);
+    lbmr_stats_tree_handle_topic_queries_pattern_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_topic_queries_pattern_receiver, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_topic_queries_pattern_receiver_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -3013,7 +3013,7 @@ static int lbmr_topic_queries_pattern_receiver_stats_tree_packet(stats_tree * tr
 
 static void lbmr_queue_ads_queue_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_queue_ads_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_queue, 0, TRUE);
+    lbmr_stats_tree_handle_queue_ads_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_queue, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_queue_ads_queue_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -3037,7 +3037,7 @@ static int lbmr_queue_ads_queue_stats_tree_packet(stats_tree * tree, packet_info
 
 static void lbmr_queue_ads_source_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_queue_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_source, 0, TRUE);
+    lbmr_stats_tree_handle_queue_ads_source = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_ads_source, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_queue_ads_source_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -3061,7 +3061,7 @@ static int lbmr_queue_ads_source_stats_tree_packet(stats_tree * tree, packet_inf
 
 static void lbmr_queue_queries_queue_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_queue_queries_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_queue, 0, TRUE);
+    lbmr_stats_tree_handle_queue_queries_queue = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_queue, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_queue_queries_queue_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
@@ -3083,7 +3083,7 @@ static int lbmr_queue_queries_queue_stats_tree_packet(stats_tree * tree, packet_
 
 static void lbmr_queue_queries_receiver_stats_tree_init(stats_tree * tree)
 {
-    lbmr_stats_tree_handle_queue_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_receiver, 0, TRUE);
+    lbmr_stats_tree_handle_queue_queries_receiver = stats_tree_create_node(tree, lbmr_stat_tree_name_queue_queries_receiver, 0, STAT_DT_INT, TRUE);
 }
 
 static int lbmr_queue_queries_receiver_stats_tree_packet(stats_tree * tree, packet_info * pinfo, epan_dissect_t * edt _U_, const void * data)
index 295c91bc00806571b275ca960bb5ae580726da3d..eb91ae9f66befa43e5b056e930c7f2b3c615b60f 100644 (file)
@@ -168,16 +168,16 @@ static int st_node_other = -1;
 static void
 rtsp_stats_tree_init(stats_tree* st)
 {
-    st_node_packets     = stats_tree_create_node(st, st_str_packets, 0, TRUE);
+    st_node_packets     = stats_tree_create_node(st, st_str_packets, 0, STAT_DT_INT, TRUE);
     st_node_requests    = stats_tree_create_pivot(st, st_str_requests, st_node_packets);
-    st_node_responses   = stats_tree_create_node(st, st_str_responses, st_node_packets, TRUE);
-    st_node_resp_broken = stats_tree_create_node(st, st_str_resp_broken, st_node_responses, TRUE);
-    st_node_resp_100    = stats_tree_create_node(st, st_str_resp_100,    st_node_responses, TRUE);
-    st_node_resp_200    = stats_tree_create_node(st, st_str_resp_200,    st_node_responses, TRUE);
-    st_node_resp_300    = stats_tree_create_node(st, st_str_resp_300,    st_node_responses, TRUE);
-    st_node_resp_400    = stats_tree_create_node(st, st_str_resp_400,    st_node_responses, TRUE);
-    st_node_resp_500    = stats_tree_create_node(st, st_str_resp_500,    st_node_responses, TRUE);
-    st_node_other       = stats_tree_create_node(st, st_str_other, st_node_packets, FALSE);
+    st_node_responses   = stats_tree_create_node(st, st_str_responses, st_node_packets, STAT_DT_INT, TRUE);
+    st_node_resp_broken = stats_tree_create_node(st, st_str_resp_broken, st_node_responses, STAT_DT_INT, TRUE);
+    st_node_resp_100    = stats_tree_create_node(st, st_str_resp_100,    st_node_responses, STAT_DT_INT, TRUE);
+    st_node_resp_200    = stats_tree_create_node(st, st_str_resp_200,    st_node_responses, STAT_DT_INT, TRUE);
+    st_node_resp_300    = stats_tree_create_node(st, st_str_resp_300,    st_node_responses, STAT_DT_INT, TRUE);
+    st_node_resp_400    = stats_tree_create_node(st, st_str_resp_400,    st_node_responses, STAT_DT_INT, TRUE);
+    st_node_resp_500    = stats_tree_create_node(st, st_str_resp_500,    st_node_responses, STAT_DT_INT, TRUE);
+    st_node_other       = stats_tree_create_node(st, st_str_other, st_node_packets, STAT_DT_INT, FALSE);
 }
 
 /* RTSP/Packet Counter stats packet function */
index 21e39050918e18926845fd2ad849b55ddb9cb1b2..39e93edd12d60a5900e00675ba4b6584c08a8e04 100644 (file)
@@ -640,7 +640,7 @@ sametime_stats_tree_packet(stats_tree* st, packet_info* pinfo _U_, epan_dissect_
 static void
 sametime_stats_tree_init(stats_tree* st)
 {
-   st_node_packet = stats_tree_create_node(st, st_str_packet, 0, TRUE);
+   st_node_packet = stats_tree_create_node(st, st_str_packet, 0, STAT_DT_INT, TRUE);
    st_node_message_type = stats_tree_create_pivot(st, st_str_message_type, st_node_packet);
    st_node_send_type = stats_tree_create_pivot(st, st_str_send_type, st_node_packet);
    st_node_user_status = stats_tree_create_pivot(st, st_str_user_status, st_node_packet);
index 0605a12105c1ae3950f18aebd1ad2630334c13e9..6591781968b1559d0481d69a4104a156f12ca6ce 100644 (file)
@@ -1094,10 +1094,10 @@ static dissector_handle_t gsm_sms_handle;
 static void
 smpp_stats_tree_init(stats_tree* st)
 {
-    st_smpp_ops = stats_tree_create_node(st, "SMPP Operations", 0, TRUE);
-    st_smpp_req = stats_tree_create_node(st, "SMPP Requests", st_smpp_ops, TRUE);
-    st_smpp_res = stats_tree_create_node(st, "SMPP Responses", st_smpp_ops, TRUE);
-    st_smpp_res_status = stats_tree_create_node(st, "SMPP Response Status", 0, TRUE);
+    st_smpp_ops = stats_tree_create_node(st, "SMPP Operations", 0, STAT_DT_INT, TRUE);
+    st_smpp_req = stats_tree_create_node(st, "SMPP Requests", st_smpp_ops, STAT_DT_INT, TRUE);
+    st_smpp_res = stats_tree_create_node(st, "SMPP Responses", st_smpp_ops, STAT_DT_INT, TRUE);
+    st_smpp_res_status = stats_tree_create_node(st, "SMPP Response Status", 0, STAT_DT_INT, TRUE);
 
 }
 
index a57b679c887eb2bde5a3ab07002e44bd335f9e5a..752e6ee4688db6e5afdd827cf56dc07f4114a99a 100644 (file)
@@ -657,12 +657,12 @@ static value_string_ext vals_xser_service_ext = VALUE_STRING_EXT_INIT(vals_xser_
 static void
 ucp_stats_tree_init(stats_tree* st)
 {
-    st_ucp_messages    = stats_tree_create_node(st, st_str_ucp, 0, TRUE);
-    st_ucp_ops         = stats_tree_create_node(st, st_str_ops, st_ucp_messages, TRUE);
-    st_ucp_res         = stats_tree_create_node(st, st_str_res, st_ucp_messages, TRUE);
-    st_ucp_results     = stats_tree_create_node(st, st_str_ucp_res, 0, TRUE);
-    st_ucp_results_pos = stats_tree_create_node(st, st_str_pos, st_ucp_results, TRUE);
-    st_ucp_results_neg = stats_tree_create_node(st, st_str_neg, st_ucp_results, TRUE);
+    st_ucp_messages    = stats_tree_create_node(st, st_str_ucp, 0, STAT_DT_INT, TRUE);
+    st_ucp_ops         = stats_tree_create_node(st, st_str_ops, st_ucp_messages, STAT_DT_INT, TRUE);
+    st_ucp_res         = stats_tree_create_node(st, st_str_res, st_ucp_messages, STAT_DT_INT, TRUE);
+    st_ucp_results     = stats_tree_create_node(st, st_str_ucp_res, 0, STAT_DT_INT, TRUE);
+    st_ucp_results_pos = stats_tree_create_node(st, st_str_pos, st_ucp_results, STAT_DT_INT, TRUE);
+    st_ucp_results_neg = stats_tree_create_node(st, st_str_neg, st_ucp_results, STAT_DT_INT, TRUE);
 }
 
 static int
index be90f8e2efc4298433934162795fbe68140713a0..f46527f69bba4dbda7286d19e195c06c12c8913b 100644 (file)
@@ -156,9 +156,19 @@ reset_stat_node(stat_node *node)
     burst_bucket *bucket;
 
     node->counter = 0;
-    node->total = 0;
-    node->minvalue = G_MAXINT;
-    node->maxvalue = G_MININT;
+    switch (node->datatype)
+    {
+    case STAT_DT_INT:
+        node->total.int_total = 0;
+        node->minvalue.int_min = G_MAXINT;
+        node->maxvalue.int_max = G_MININT;
+        break;
+    case STAT_DT_FLOAT:
+        node->total.float_total = 0;
+        node->minvalue.float_min = G_MAXFLOAT;
+        node->maxvalue.float_max = G_MINFLOAT;
+        break;
+    }
     node->st_flags = 0;
 
     while (node->bh) {
@@ -206,9 +216,19 @@ stats_tree_reinit(void *p)
 
     st->root.children = NULL;
     st->root.counter = 0;
-    st->root.total = 0;
-    st->root.minvalue = G_MAXINT;
-    st->root.maxvalue = G_MININT;
+    switch (st->root.datatype)
+    {
+    case STAT_DT_INT:
+        st->root.total.int_total = 0;
+        st->root.minvalue.int_min = G_MAXINT;
+        st->root.maxvalue.int_max = G_MININT;
+        break;
+    case STAT_DT_FLOAT:
+        st->root.total.float_total = 0;
+        st->root.minvalue.float_min = G_MAXFLOAT;
+        st->root.maxvalue.float_max = G_MINFLOAT;
+        break;
+    }
     st->root.st_flags = 0;
 
     st->root.bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket));
@@ -317,8 +337,17 @@ stats_tree_new(stats_tree_cfg *cfg, tree_pres *pr, const char *filter)
     st->start = -1.0;
     st->elapsed = 0.0;
 
-    st->root.minvalue = G_MAXINT;
-    st->root.maxvalue = G_MININT;
+    switch (st->root.datatype)
+    {
+    case STAT_DT_INT:
+        st->root.minvalue.int_min = G_MAXINT;
+        st->root.maxvalue.int_max = G_MININT;
+        break;
+    case STAT_DT_FLOAT:
+        st->root.minvalue.float_min = G_MAXFLOAT;
+        st->root.maxvalue.float_max = G_MINFLOAT;
+        break;
+    }
 
     st->root.bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket));
     st->root.bt = st->root.bh;
@@ -429,15 +458,25 @@ stats_tree_presentation(void (*registry_iterator)(gpointer,gpointer,gpointer),
 *    as_named_node: whether or not it has to be registered in the root namespace
 */
 static stat_node*
-new_stat_node(stats_tree *st, const gchar *name, int parent_id,
+new_stat_node(stats_tree *st, const gchar *name, int parent_id, stat_node_datatype datatype,
           gboolean with_hash, gboolean as_parent_node)
 {
 
     stat_node *node = (stat_node *)g_malloc0(sizeof(stat_node));
     stat_node *last_chld = NULL;
 
-    node->minvalue = G_MAXINT;
-    node->maxvalue = G_MININT;
+    node->datatype = datatype;
+    switch (datatype)
+    {
+    case STAT_DT_INT:
+        node->minvalue.int_min = G_MAXINT;
+        node->maxvalue.int_max = G_MININT;
+        break;
+    case STAT_DT_FLOAT:
+        node->minvalue.float_min = G_MAXFLOAT;
+        node->maxvalue.float_max = G_MINFLOAT;
+        break;
+    }
     node->st_flags = parent_id?0:ST_FLG_ROOTCHILD;
 
     node->bh = (burst_bucket*)g_malloc0(sizeof(burst_bucket));
@@ -496,9 +535,9 @@ new_stat_node(stats_tree *st, const gchar *name, int parent_id,
 /***/
 
 extern int
-stats_tree_create_node(stats_tree *st, const gchar *name, int parent_id, gboolean with_hash)
+stats_tree_create_node(stats_tree *st, const gchar *name, int parent_id, stat_node_datatype datatype, gboolean with_hash)
 {
-    stat_node *node = new_stat_node(st,name,parent_id,with_hash,TRUE);
+    stat_node *node = new_stat_node(st,name,parent_id,datatype,with_hash,TRUE);
 
     if (node)
         return node->id;
@@ -509,9 +548,9 @@ stats_tree_create_node(stats_tree *st, const gchar *name, int parent_id, gboolea
 /* XXX: should this be a macro? */
 extern int
 stats_tree_create_node_by_pname(stats_tree *st, const gchar *name,
-                const gchar *parent_name, gboolean with_children)
+                const gchar *parent_name, stat_node_datatype datatype, gboolean with_children)
 {
-    return stats_tree_create_node(st,name,stats_tree_parent_id_by_name(st,parent_name),with_children);
+    return stats_tree_create_node(st,name,stats_tree_parent_id_by_name(st,parent_name),datatype,with_children);
 }
 
 /* Internal function to update the burst calculation data - add entry to bucket */
@@ -607,8 +646,8 @@ update_burst_calc(stat_node *node, gint value)
  * using parent_name as parent node.
  * with_hash=TRUE to indicate that the created node will have a parent
  */
-extern int
-stats_tree_manip_node(manip_node_mode mode, stats_tree *st, const char *name,
+int
+stats_tree_manip_node_int(manip_node_mode mode, stats_tree *st, const char *name,
               int parent_id, gboolean with_hash, gint value)
 {
     stat_node *node = NULL;
@@ -625,25 +664,27 @@ stats_tree_manip_node(manip_node_mode mode, stats_tree *st, const char *name,
     }
 
     if ( node == NULL )
-        node = new_stat_node(st,name,parent_id,with_hash,with_hash);
+        node = new_stat_node(st,name,parent_id,STAT_DT_INT,with_hash,with_hash);
 
     switch (mode) {
         case MN_INCREASE:
             node->counter += value;
             update_burst_calc(node, value);
             break;
-        case MN_SET: node->counter = value; break;
+        case MN_SET:
+            node->counter = value;
+            break;
         case MN_AVERAGE:
             node->counter++;
             update_burst_calc(node, 1);
             /* fall through */ /*to average code */
         case MN_AVERAGE_NOTICK:
-            node->total += value;
-            if (node->minvalue > value) {
-                node->minvalue = value;
+            node->total.int_total += value;
+            if (node->minvalue.int_min > value) {
+                node->minvalue.int_min = value;
             }
-            if (node->maxvalue < value) {
-                node->maxvalue = value;
+            if (node->maxvalue.int_max < value) {
+                node->maxvalue.int_max = value;
             }
             node->st_flags |= ST_FLG_AVERAGE;
             break;
@@ -661,6 +702,59 @@ stats_tree_manip_node(manip_node_mode mode, stats_tree *st, const char *name,
         return -1;
 }
 
+/*
+* Increases by delta the counter of the node whose name is given
+* if the node does not exist yet it's created (with counter=1)
+* using parent_name as parent node.
+* with_hash=TRUE to indicate that the created node will have a parent
+*/
+int
+stats_tree_manip_node_float(manip_node_mode mode, stats_tree *st, const char *name,
+    int parent_id, gboolean with_hash, gfloat value)
+{
+    stat_node *node = NULL;
+    stat_node *parent = NULL;
+
+    g_assert(parent_id >= 0 && parent_id < (int)st->parents->len);
+
+    parent = (stat_node *)g_ptr_array_index(st->parents, parent_id);
+
+    if (parent->hash) {
+        node = (stat_node *)g_hash_table_lookup(parent->hash, name);
+    }
+    else {
+        node = (stat_node *)g_hash_table_lookup(st->names, name);
+    }
+
+    if (node == NULL)
+        node = new_stat_node(st, name, parent_id, STAT_DT_FLOAT, with_hash, with_hash);
+
+    switch (mode) {
+    case MN_AVERAGE:
+        node->counter++;
+        update_burst_calc(node, 1);
+        /* fall through */ /*to average code */
+    case MN_AVERAGE_NOTICK:
+        node->total.float_total += value;
+        if (node->minvalue.float_min > value) {
+            node->minvalue.float_min = value;
+        }
+        if (node->maxvalue.float_max < value) {
+            node->maxvalue.float_max = value;
+        }
+        node->st_flags |= ST_FLG_AVERAGE;
+        break;
+    default:
+        //only average is currently supported
+        g_assert_not_reached();
+        break;
+    }
+
+    if (node)
+        return node->id;
+    else
+        return -1;
+}
 
 extern char*
 stats_tree_get_abbr(const char *opt_arg)
@@ -746,12 +840,12 @@ stats_tree_create_range_node(stats_tree *st, const gchar *name, int parent_id, .
 {
     va_list list;
     gchar *curr_range;
-    stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE);
+    stat_node *rng_root = new_stat_node(st, name, parent_id, STAT_DT_INT, FALSE, TRUE);
     stat_node *range_node = NULL;
 
     va_start( list, parent_id );
     while (( curr_range = va_arg(list, gchar*) )) {
-        range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE);
+        range_node = new_stat_node(st, curr_range, rng_root->id, STAT_DT_INT, FALSE, FALSE);
         range_node->rng = get_range(curr_range);
     }
     va_end( list );
@@ -765,14 +859,14 @@ stats_tree_create_range_node_string(stats_tree *st, const gchar *name,
                     gchar** str_ranges)
 {
     int i;
-    stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE);
+    stat_node *rng_root = new_stat_node(st, name, parent_id, STAT_DT_INT, FALSE, TRUE);
     stat_node *range_node = NULL;
 
     for (i = 0; i < num_str_ranges - 1; i++) {
-        range_node = new_stat_node(st, str_ranges[i], rng_root->id, FALSE, FALSE);
+        range_node = new_stat_node(st, str_ranges[i], rng_root->id, STAT_DT_INT, FALSE, FALSE);
         range_node->rng = get_range(str_ranges[i]);
     }
-    range_node = new_stat_node(st, str_ranges[i], rng_root->id, FALSE, FALSE);
+    range_node = new_stat_node(st, str_ranges[i], rng_root->id, STAT_DT_INT, FALSE, FALSE);
     range_node->rng = get_range(str_ranges[i]);
     if (range_node->rng->floor == range_node->rng->ceil) {
         range_node->rng->ceil = G_MAXINT;
@@ -802,11 +896,11 @@ stats_tree_range_node_with_pname(stats_tree *st, const gchar *name,
     gchar *curr_range;
     stat_node *range_node = NULL;
     int parent_id = stats_tree_parent_id_by_name(st,parent_name);
-    stat_node *rng_root = new_stat_node(st, name, parent_id, FALSE, TRUE);
+    stat_node *rng_root = new_stat_node(st, name, parent_id, STAT_DT_INT, FALSE, TRUE);
 
     va_start( list, parent_name );
     while (( curr_range = va_arg(list, gchar*) )) {
-        range_node = new_stat_node(st, curr_range, rng_root->id, FALSE, FALSE);
+        range_node = new_stat_node(st, curr_range, rng_root->id, STAT_DT_INT, FALSE, FALSE);
         range_node->rng = get_range(curr_range);
     }
     va_end( list );
@@ -841,12 +935,12 @@ stats_tree_tick_range(stats_tree *st, const gchar *name, int parent_id,
         g_assert_not_reached();
 
     /* update stats for container node. counter should already be ticked so we only update total and min/max */
-    node->total += value_in_range;
-    if (node->minvalue > value_in_range) {
-        node->minvalue = value_in_range;
+    node->total.int_total += value_in_range;
+    if (node->minvalue.int_min > value_in_range) {
+        node->minvalue.int_min = value_in_range;
     }
-    if (node->maxvalue < value_in_range) {
-        node->maxvalue = value_in_range;
+    if (node->maxvalue.int_max < value_in_range) {
+        node->maxvalue.int_max = value_in_range;
     }
     node->st_flags |= ST_FLG_AVERAGE;
 
@@ -856,12 +950,12 @@ stats_tree_tick_range(stats_tree *st, const gchar *name, int parent_id,
 
         if ( value_in_range >= stat_floor && value_in_range <= stat_ceil ) {
             child->counter++;
-            child->total += value_in_range;
-            if (child->minvalue > value_in_range) {
-                child->minvalue = value_in_range;
+            child->total.int_total += value_in_range;
+            if (child->minvalue.int_min > value_in_range) {
+                child->minvalue.int_min = value_in_range;
             }
-            if (child->maxvalue < value_in_range) {
-                child->maxvalue = value_in_range;
+            if (child->maxvalue.int_max < value_in_range) {
+                child->maxvalue.int_max = value_in_range;
             }
             child->st_flags |= ST_FLG_AVERAGE;
             update_burst_calc(child, 1);
@@ -875,7 +969,7 @@ stats_tree_tick_range(stats_tree *st, const gchar *name, int parent_id,
 extern int
 stats_tree_create_pivot(stats_tree *st, const gchar *name, int parent_id)
 {
-    stat_node *node = new_stat_node(st,name,parent_id,TRUE,TRUE);
+    stat_node *node = new_stat_node(st,name,parent_id,STAT_DT_INT,TRUE,TRUE);
 
     if (node)
         return node->id;
@@ -890,7 +984,7 @@ stats_tree_create_pivot_by_pname(stats_tree *st, const gchar *name,
     int parent_id = stats_tree_parent_id_by_name(st,parent_name);
     stat_node *node;
 
-    node = new_stat_node(st,name,parent_id,TRUE,TRUE);
+    node = new_stat_node(st,name,parent_id,STAT_DT_INT,TRUE,TRUE);
 
     if (node)
         return node->id;
@@ -905,7 +999,7 @@ stats_tree_tick_pivot(stats_tree *st, int pivot_id, const gchar *pivot_value)
 
     parent->counter++;
     update_burst_calc(parent, 1);
-    stats_tree_manip_node( MN_INCREASE, st, pivot_value, pivot_id, FALSE, 1);
+    stats_tree_manip_node_int( MN_INCREASE, st, pivot_value, pivot_id, FALSE, 1);
 
     return pivot_id;
 }
@@ -1007,15 +1101,64 @@ stats_tree_get_values_from_node (const stat_node* node)
 
     values[COL_NAME] = (node->st_flags&ST_FLG_ROOTCHILD)?stats_tree_get_displayname(node->name):g_strdup(node->name);
     values[COL_COUNT] = g_strdup_printf("%u",node->counter);
-    values[COL_AVERAGE] = ((node->st_flags&ST_FLG_AVERAGE)||node->rng)?
-                (node->counter?g_strdup_printf("%.2f",((float)node->total)/node->counter):g_strdup("-")):
-                g_strdup("");
-    values[COL_MIN] = ((node->st_flags&ST_FLG_AVERAGE)||node->rng)?
-                (node->counter?g_strdup_printf("%u",node->minvalue):g_strdup("-")):
-                g_strdup("");
-    values[COL_MAX] = ((node->st_flags&ST_FLG_AVERAGE)||node->rng)?
-                (node->counter?g_strdup_printf("%u",node->maxvalue):g_strdup("-")):
-                g_strdup("");
+    if (((node->st_flags&ST_FLG_AVERAGE) || node->rng)) {
+        if (node->counter) {
+            switch (node->datatype)
+            {
+            case STAT_DT_INT:
+                values[COL_AVERAGE] = g_strdup_printf("%.2f", ((float)node->total.int_total) / node->counter);
+                break;
+            case STAT_DT_FLOAT:
+                values[COL_AVERAGE] = g_strdup_printf("%.2f", node->total.float_total / node->counter);
+                break;
+            }
+        } else {
+            values[COL_AVERAGE] = g_strdup("-");
+        }
+    } else {
+        values[COL_AVERAGE] = g_strdup("");
+    }
+
+    if (((node->st_flags&ST_FLG_AVERAGE) || node->rng)) {
+        if (node->counter) {
+            switch (node->datatype)
+            {
+            case STAT_DT_INT:
+                values[COL_MIN] = g_strdup_printf("%u", node->minvalue.int_min);
+                break;
+            case STAT_DT_FLOAT:
+                values[COL_MIN] = g_strdup_printf("%f", node->minvalue.float_min);
+                break;
+            }
+        }
+        else {
+            values[COL_MIN] = g_strdup("-");
+        }
+    }
+    else {
+        values[COL_MIN] = g_strdup("");
+    }
+
+    if (((node->st_flags&ST_FLG_AVERAGE) || node->rng)) {
+        if (node->counter) {
+            switch (node->datatype)
+            {
+            case STAT_DT_INT:
+                values[COL_MAX] = g_strdup_printf("%u", node->maxvalue.int_max);
+                break;
+            case STAT_DT_FLOAT:
+                values[COL_MAX] = g_strdup_printf("%f", node->maxvalue.float_max);
+                break;
+            }
+        }
+        else {
+            values[COL_MAX] = g_strdup("-");
+        }
+    }
+    else {
+        values[COL_MAX] = g_strdup("");
+    }
+
     values[COL_RATE] = (node->st->elapsed)?g_strdup_printf("%.4f",((float)node->counter)/node->st->elapsed):g_strdup("");
     values[COL_PERCENT] = ((node->parent)&&(node->parent->counter))?
                 g_strdup_printf("%.2f%%",(node->counter*100.0)/node->parent->counter):
@@ -1037,7 +1180,7 @@ stats_tree_sort_compare (const stat_node *a, const stat_node *b, gint sort_colum
                     gboolean sort_descending)
 {
     int result = 0;
-    float avg_a, avg_b;
+    float avg_a = 0, avg_b = 0;
 
     if  (prefs.st_sort_rng_nameonly&&(a->rng&&b->rng)) {
         /* always sort ranges by range name */
@@ -1068,17 +1211,42 @@ stats_tree_sort_compare (const stat_node *a, const stat_node *b, gint sort_colum
             break;
 
         case COL_AVERAGE:
-            avg_a = a->counter ? ((float)a->total)/a->counter : 0;
-            avg_b = b->counter ? ((float)b->total)/b->counter : 0;
+            switch (a->datatype)
+            {
+            case STAT_DT_INT:
+                avg_a = a->counter ? ((float)a->total.int_total)/a->counter : 0;
+                avg_b = b->counter ? ((float)b->total.int_total)/b->counter : 0;
+                break;
+            case STAT_DT_FLOAT:
+                avg_a = a->counter ? ((float)a->total.float_total) / a->counter : 0;
+                avg_b = b->counter ? ((float)b->total.float_total) / b->counter : 0;
+                break;
+            }
             result = (avg_a>avg_b) ? 1 : ( (avg_a<avg_b) ? -1 : 0);
             break;
 
         case COL_MIN:
-            result = a->minvalue - b->minvalue;
+            switch (a->datatype)
+            {
+            case STAT_DT_INT:
+                result = a->minvalue.int_min - b->minvalue.int_min;
+                break;
+            case STAT_DT_FLOAT:
+                result = (a->minvalue.float_min>b->minvalue.int_min) ? 1 : ((a->minvalue.float_min<b->minvalue.int_min) ? -1 : 0);
+                break;
+            }
             break;
 
         case COL_MAX:
-            result = a->maxvalue - b->maxvalue;
+            switch (a->datatype)
+            {
+            case STAT_DT_INT:
+                result = a->maxvalue.int_max - b->maxvalue.int_max;
+                break;
+            case STAT_DT_FLOAT:
+                result = (a->maxvalue.float_max>b->maxvalue.float_max) ? 1 : ((a->maxvalue.float_max<b->maxvalue.float_max) ? -1 : 0);
+                break;
+            }
             break;
 
         case COL_BURSTRATE:
index e42e8ed2891a520eae2a9e20e9c9e5f9b7554e81..5587d2f41bb6af1935e084ef421f872efaf4e405 100644 (file)
@@ -57,6 +57,11 @@ typedef void  (*stat_tree_init_cb)(stats_tree *);
 /* stats_tree cleanup callback */
 typedef void  (*stat_tree_cleanup_cb)(stats_tree *);
 
+typedef enum _stat_node_datatype {
+    STAT_DT_INT,
+    STAT_DT_FLOAT
+} stat_node_datatype;
+
 /* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED
  * abbr: protocol abbr
  * name: protocol display name
@@ -113,17 +118,20 @@ WS_DLL_PUBLIC int stats_tree_parent_id_by_name(stats_tree *st, const gchar *pare
  * st: the stats_tree in which to create it
  * name: the name of the new node
  * parent_name: the name of the parent_node (NULL for root)
+ * datatype: datatype used for the value of the node
  * with_children: TRUE if this node will have "dynamically created" children
  */
 WS_DLL_PUBLIC int stats_tree_create_node(stats_tree *st,
                                          const gchar *name,
                                          int parent_id,
+                                         stat_node_datatype datatype,
                                          gboolean with_children);
 
 /* creates a node using its parent's tree name */
 WS_DLL_PUBLIC int stats_tree_create_node_by_pname(stats_tree *st,
                                                   const gchar *name,
                                                   const gchar *parent_name,
+                                                  stat_node_datatype datatype,
                                                   gboolean with_children);
 
 /* creates a node in the tree, that will contain a ranges list.
@@ -186,24 +194,31 @@ typedef enum _manip_node_mode {
     MN_SET_FLAGS,
     MN_CLEAR_FLAGS
 } manip_node_mode;
-WS_DLL_PUBLIC int stats_tree_manip_node(manip_node_mode mode,
+WS_DLL_PUBLIC int stats_tree_manip_node_int(manip_node_mode mode,
                                         stats_tree *st,
                                         const gchar *name,
                                         int parent_id,
                                         gboolean with_children,
                                         gint value);
 
+WS_DLL_PUBLIC int stats_tree_manip_node_float(manip_node_mode mode,
+                                        stats_tree *st,
+                                        const gchar *name,
+                                        int parent_id,
+                                        gboolean with_children,
+                                        gfloat value);
+
 #define increase_stat_node(st,name,parent_id,with_children,value)       \
-    (stats_tree_manip_node(MN_INCREASE,(st),(name),(parent_id),(with_children),(value)))
+    (stats_tree_manip_node_int(MN_INCREASE,(st),(name),(parent_id),(with_children),(value)))
 
 #define tick_stat_node(st,name,parent_id,with_children)                 \
-    (stats_tree_manip_node(MN_INCREASE,(st),(name),(parent_id),(with_children),1))
+    (stats_tree_manip_node_int(MN_INCREASE,(st),(name),(parent_id),(with_children),1))
 
 #define set_stat_node(st,name,parent_id,with_children,value)            \
-    (stats_tree_manip_node(MN_SET,(st),(name),(parent_id),(with_children),value))
+    (stats_tree_manip_node_int(MN_SET,(st),(name),(parent_id),(with_children),value))
 
 #define zero_stat_node(st,name,parent_id,with_children)                 \
-    (stats_tree_manip_node(MN_SET,(st),(name),(parent_id),(with_children),0))
+    (stats_tree_manip_node_int(MN_SET,(st),(name),(parent_id),(with_children),0))
 
 /*
  * Add value to average calculation WITHOUT ticking node. Node MUST be ticked separately!
@@ -213,19 +228,22 @@ WS_DLL_PUBLIC int stats_tree_manip_node(manip_node_mode mode,
  * least show a count instead of 0.
  */
 #define avg_stat_node_add_value_notick(st,name,parent_id,with_children,value) \
-    (stats_tree_manip_node(MN_AVERAGE_NOTICK,(st),(name),(parent_id),(with_children),value))
+    (stats_tree_manip_node_int(MN_AVERAGE_NOTICK,(st),(name),(parent_id),(with_children),value))
 
 /* Tick node and add a new value to the average calculation for this stats node. */
-#define avg_stat_node_add_value(st,name,parent_id,with_children,value)  \
-    (stats_tree_manip_node(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
+#define avg_stat_node_add_value_int(st,name,parent_id,with_children,value)  \
+    (stats_tree_manip_node_int(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
+
+#define avg_stat_node_add_value_float(st,name,parent_id,with_children,value)  \
+    (stats_tree_manip_node_float(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
 
 /* Set flags for this node. Node created if it does not yet exist. */
 #define stat_node_set_flags(st,name,parent_id,with_children,flags)      \
-    (stats_tree_manip_node(MN_SET_FLAGS,(st),(name),(parent_id),(with_children),flags))
+    (stats_tree_manip_node_int(MN_SET_FLAGS,(st),(name),(parent_id),(with_children),flags))
 
 /* Clear flags for this node. Node created if it does not yet exist. */
 #define stat_node_clear_flags(st,name,parent_id,with_children,flags)    \
-    (stats_tree_manip_node(MN_CLEAR_FLAGS,(st),(name),(parent_id),(with_children),flags))
+    (stats_tree_manip_node_int(MN_CLEAR_FLAGS,(st),(name),(parent_id),(with_children),flags))
 
 #ifdef __cplusplus
 }
index 1a3420a281683606101f445e91dcdbc1717e7ab1..ec4b4de54d9a860127886609869226af789fc89c 100644 (file)
@@ -53,16 +53,27 @@ struct _burst_bucket {
 };
 
 struct _stat_node {
-       gchar*                  name;
-       int                     id;
+       gchar*                          name;
+       int                                     id;
+       stat_node_datatype      datatype;
 
        /** the counter it keeps */
        gint                    counter;
        /** total of all values submitted - for computing averages */
-       gint64                  total;
-       gint                    minvalue;
-       gint                    maxvalue;
-       int                             st_flags;
+       union {
+               gint64  int_total;
+               gdouble float_total;
+       } total;
+       union {
+               gint    int_min;
+               gfloat  float_min;
+       } minvalue;
+       union {
+               gint    int_max;
+               gfloat  float_max;
+       } maxvalue;
+
+       gint                    st_flags;
 
        /** fields for burst rate calculation */
        gint                    bcount;
index 0a7edf4dac980cb4431e7e23aa069e9d00273fe1..710fb0beea8d4787d30666437a60c9f6793ab03b 100644 (file)
@@ -99,11 +99,11 @@ static const gchar *st_str_ipv4 = "IPv4 Statistics/All Addresses";
 static const gchar *st_str_ipv6 = "IPv6 Statistics/All Addresses";
 
 static void ipv4_hosts_stats_tree_init(stats_tree *st) {
-       st_node_ipv4 = stats_tree_create_node(st, st_str_ipv4, 0, TRUE);
+       st_node_ipv4 = stats_tree_create_node(st, st_str_ipv4, 0, STAT_DT_INT, TRUE);
 }
 
 static void ipv6_hosts_stats_tree_init(stats_tree *st) {
-       st_node_ipv6 = stats_tree_create_node(st, st_str_ipv6, 0, TRUE);
+       st_node_ipv6 = stats_tree_create_node(st, st_str_ipv6, 0, STAT_DT_INT, TRUE);
 }
 
 static int ip_hosts_stats_tree_packet(stats_tree *st, packet_info *pinfo, int st_node, const gchar *st_str) {
@@ -137,11 +137,11 @@ static void ip_srcdst_stats_tree_init(stats_tree *st,
                                const gchar *st_str_src, int *st_node_src_ptr,
                                const gchar *st_str_dst, int *st_node_dst_ptr) {
        /* create one tree branch for source */
-       *st_node_src_ptr = stats_tree_create_node(st, st_str_src, 0, TRUE);
+       *st_node_src_ptr = stats_tree_create_node(st, st_str_src, 0, STAT_DT_INT, TRUE);
        /* set flag so this branch will always be sorted to top of tree */
        stat_node_set_flags(st, st_str_src, 0, FALSE, ST_FLG_SORT_TOP);
        /* creat another top level node for destination branch */
-       *st_node_dst_ptr = stats_tree_create_node(st, st_str_dst, 0, TRUE);
+       *st_node_dst_ptr = stats_tree_create_node(st, st_str_dst, 0, STAT_DT_INT, TRUE);
        /* set flag so this branch will not be expanded by default */
        stat_node_set_flags(st, st_str_dst, 0, FALSE, ST_FLG_DEF_NOEXPAND);
 }
@@ -210,11 +210,11 @@ static const gchar *st_str_ipv4_dsts = "IPv4 Statistics/Destinations and Ports";
 static const gchar *st_str_ipv6_dsts = "IPv6 Statistics/Destinations and Ports";
 
 static void ipv4_dsts_stats_tree_init(stats_tree *st) {
-       st_node_ipv4_dsts = stats_tree_create_node(st, st_str_ipv4_dsts, 0, TRUE);
+       st_node_ipv4_dsts = stats_tree_create_node(st, st_str_ipv4_dsts, 0, STAT_DT_INT, TRUE);
 }
 
 static void ipv6_dsts_stats_tree_init(stats_tree *st) {
-       st_node_ipv6_dsts = stats_tree_create_node(st, st_str_ipv6_dsts, 0, TRUE);
+       st_node_ipv6_dsts = stats_tree_create_node(st, st_str_ipv6_dsts, 0, STAT_DT_INT, TRUE);
 }
 
 static int dsts_stats_tree_packet(stats_tree *st, packet_info *pinfo, int st_node, const gchar *st_str) {
index 3c821627b9d3a8728631272a541f2cb6f7bffe46..b1aff99a8954e17b010c536182cbed4db15dd84e 100644 (file)
@@ -1052,9 +1052,19 @@ sharkd_session_process_tap_stats_node_cb(const stat_node *n)
                sharkd_json_value_anyf(TRUE, "count", "%d", node->counter);
                if (node->counter && ((node->st_flags & ST_FLG_AVERAGE) || node->rng))
                {
-                       sharkd_json_value_anyf(TRUE, "avg", "%.2f", ((float)node->total) / node->counter);
-                       sharkd_json_value_anyf(TRUE, "min", "%d", node->minvalue);
-                       sharkd_json_value_anyf(TRUE, "max", "%d", node->maxvalue);
+                       switch(node->datatype)
+                       {
+                       case STAT_DT_INT:
+                               sharkd_json_value_anyf(TRUE, "avg", "%.2f", ((float)node->total.int_total) / node->counter);
+                               sharkd_json_value_anyf(TRUE, "min", "%d", node->minvalue.int_min);
+                               sharkd_json_value_anyf(TRUE, "max", "%d", node->maxvalue.int_max);
+                               break;
+                       case STAT_DT_FLOAT:
+                               sharkd_json_value_anyf(TRUE, "avg", "%.2f", node->total.float_total / node->counter);
+                               sharkd_json_value_anyf(TRUE, "min", "%f", node->minvalue.float_min);
+                               sharkd_json_value_anyf(TRUE, "max", "%f", node->maxvalue.float_max);
+                               break;
+                       }
                }
 
                if (node->st->elapsed)