aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debian/libwireshark0.symbols3
-rw-r--r--epan/dissectors/packet-ancp.c4
-rw-r--r--epan/dissectors/packet-bacapp.c4
-rw-r--r--epan/dissectors/packet-collectd.c4
-rw-r--r--epan/dissectors/packet-dns.c58
-rw-r--r--epan/dissectors/packet-f5ethtrailer.c16
-rw-r--r--epan/dissectors/packet-gsm_osmux.c18
-rw-r--r--epan/dissectors/packet-hartip.c8
-rw-r--r--epan/dissectors/packet-hpfeeds.c8
-rw-r--r--epan/dissectors/packet-http.c30
-rw-r--r--epan/dissectors/packet-http2.c2
-rw-r--r--epan/dissectors/packet-isup.c4
-rw-r--r--epan/dissectors/packet-lbmr.c22
-rw-r--r--epan/dissectors/packet-rtsp.c18
-rw-r--r--epan/dissectors/packet-sametime.c2
-rw-r--r--epan/dissectors/packet-smpp.c8
-rw-r--r--epan/dissectors/packet-ucp.c12
-rw-r--r--epan/stats_tree.c284
-rw-r--r--epan/stats_tree.h38
-rw-r--r--epan/stats_tree_priv.h23
-rw-r--r--plugins/epan/stats_tree/pinfo_stats_tree.c12
-rw-r--r--sharkd_session.c16
22 files changed, 401 insertions, 193 deletions
diff --git a/debian/libwireshark0.symbols b/debian/libwireshark0.symbols
index 70231d2805..d47e979c30 100644
--- a/debian/libwireshark0.symbols
+++ b/debian/libwireshark0.symbols
@@ -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
diff --git a/epan/dissectors/packet-ancp.c b/epan/dissectors/packet-ancp.c
index dde614241a..e8a4bcc118 100644
--- a/epan/dissectors/packet-ancp.c
+++ b/epan/dissectors/packet-ancp.c
@@ -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
diff --git a/epan/dissectors/packet-bacapp.c b/epan/dissectors/packet-bacapp.c
index 66a10790ed..da6a20776a 100644
--- a/epan/dissectors/packet-bacapp.c
+++ b/epan/dissectors/packet-bacapp.c
@@ -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 *
diff --git a/epan/dissectors/packet-collectd.c b/epan/dissectors/packet-collectd.c
index f065a76789..823aa3a15a 100644
--- a/epan/dissectors/packet-collectd.c
+++ b/epan/dissectors/packet-collectd.c
@@ -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);
diff --git a/epan/dissectors/packet-dns.c b/epan/dissectors/packet-dns.c
index 3dd3bd7f9d..4c5e169fa6 100644
--- a/epan/dissectors/packet-dns.c
+++ b/epan/dissectors/packet-dns.c
@@ -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));
}
}
}
diff --git a/epan/dissectors/packet-f5ethtrailer.c b/epan/dissectors/packet-f5ethtrailer.c
index 540ed0eaab..557ccbf0d0 100644
--- a/epan/dissectors/packet-f5ethtrailer.c
+++ b/epan/dissectors/packet-f5ethtrailer.c
@@ -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() */
diff --git a/epan/dissectors/packet-gsm_osmux.c b/epan/dissectors/packet-gsm_osmux.c
index e6cf2e8797..f291814085 100644
--- a/epan/dissectors/packet-gsm_osmux.c
+++ b/epan/dissectors/packet-gsm_osmux.c
@@ -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;
diff --git a/epan/dissectors/packet-hartip.c b/epan/dissectors/packet-hartip.c
index 5a47d3af21..7a4a598a07 100644
--- a/epan/dissectors/packet-hartip.c
+++ b/epan/dissectors/packet-hartip.c
@@ -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
diff --git a/epan/dissectors/packet-hpfeeds.c b/epan/dissectors/packet-hpfeeds.c
index ae85c72552..41fa3f9415 100644
--- a/epan/dissectors/packet-hpfeeds.c
+++ b/epan/dissectors/packet-hpfeeds.c
@@ -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,
diff --git a/epan/dissectors/packet-http.c b/epan/dissectors/packet-http.c
index 0d18765687..8fd72e5aa2 100644
--- a/epan/dissectors/packet-http.c
+++ b/epan/dissectors/packet-http.c
@@ -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);
diff --git a/epan/dissectors/packet-http2.c b/epan/dissectors/packet-http2.c
index 9e6b048a61..30d00f2513 100644
--- a/epan/dissectors/packet-http2.c
+++ b/epan/dissectors/packet-http2.c
@@ -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);
}
diff --git a/epan/dissectors/packet-isup.c b/epan/dissectors/packet-isup.c
index 60ba243642..437e071745 100644
--- a/epan/dissectors/packet-isup.c
+++ b/epan/dissectors/packet-isup.c
@@ -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
diff --git a/epan/dissectors/packet-lbmr.c b/epan/dissectors/packet-lbmr.c
index c0541f0b85..2898610a6d 100644
--- a/epan/dissectors/packet-lbmr.c
+++ b/epan/dissectors/packet-lbmr.c
@@ -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)
diff --git a/epan/dissectors/packet-rtsp.c b/epan/dissectors/packet-rtsp.c
index 295c91bc00..eb91ae9f66 100644
--- a/epan/dissectors/packet-rtsp.c
+++ b/epan/dissectors/packet-rtsp.c
@@ -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 */
diff --git a/epan/dissectors/packet-sametime.c b/epan/dissectors/packet-sametime.c
index 21e3905091..39e93edd12 100644
--- a/epan/dissectors/packet-sametime.c
+++ b/epan/dissectors/packet-sametime.c
@@ -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);
diff --git a/epan/dissectors/packet-smpp.c b/epan/dissectors/packet-smpp.c
index 0605a12105..6591781968 100644
--- a/epan/dissectors/packet-smpp.c
+++ b/epan/dissectors/packet-smpp.c
@@ -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);
}
diff --git a/epan/dissectors/packet-ucp.c b/epan/dissectors/packet-ucp.c
index a57b679c88..752e6ee468 100644
--- a/epan/dissectors/packet-ucp.c
+++ b/epan/dissectors/packet-ucp.c
@@ -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
diff --git a/epan/stats_tree.c b/epan/stats_tree.c
index be90f8e2ef..f46527f69b 100644
--- a/epan/stats_tree.c
+++ b/epan/stats_tree.c
@@ -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:
diff --git a/epan/stats_tree.h b/epan/stats_tree.h
index e42e8ed289..5587d2f41b 100644
--- a/epan/stats_tree.h
+++ b/epan/stats_tree.h
@@ -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
}
diff --git a/epan/stats_tree_priv.h b/epan/stats_tree_priv.h
index 1a3420a281..ec4b4de54d 100644
--- a/epan/stats_tree_priv.h
+++ b/epan/stats_tree_priv.h
@@ -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;
diff --git a/plugins/epan/stats_tree/pinfo_stats_tree.c b/plugins/epan/stats_tree/pinfo_stats_tree.c
index 0a7edf4dac..710fb0beea 100644
--- a/plugins/epan/stats_tree/pinfo_stats_tree.c
+++ b/plugins/epan/stats_tree/pinfo_stats_tree.c
@@ -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) {
diff --git a/sharkd_session.c b/sharkd_session.c
index 3c821627b9..b1aff99a89 100644
--- a/sharkd_session.c
+++ b/sharkd_session.c
@@ -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)