diff options
-rw-r--r-- | debian/libwireshark0.symbols | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-ancp.c | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-bacapp.c | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-collectd.c | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-dns.c | 58 | ||||
-rw-r--r-- | epan/dissectors/packet-f5ethtrailer.c | 16 | ||||
-rw-r--r-- | epan/dissectors/packet-gsm_osmux.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-hartip.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-hpfeeds.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-http.c | 30 | ||||
-rw-r--r-- | epan/dissectors/packet-http2.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-isup.c | 4 | ||||
-rw-r--r-- | epan/dissectors/packet-lbmr.c | 22 | ||||
-rw-r--r-- | epan/dissectors/packet-rtsp.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-sametime.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-smpp.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-ucp.c | 12 | ||||
-rw-r--r-- | epan/stats_tree.c | 284 | ||||
-rw-r--r-- | epan/stats_tree.h | 38 | ||||
-rw-r--r-- | epan/stats_tree_priv.h | 23 | ||||
-rw-r--r-- | plugins/epan/stats_tree/pinfo_stats_tree.c | 12 | ||||
-rw-r--r-- | sharkd_session.c | 16 |
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) |