diff options
author | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2009-04-13 18:14:25 +0000 |
---|---|---|
committer | etxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7> | 2009-04-13 18:14:25 +0000 |
commit | 37e5faf56e61548d58c908993d44e768e9222d10 (patch) | |
tree | ccd525b2cb914d2e43779930a7bbfc63598c2bd9 | |
parent | db40bfac958d0f9f425f8d585b2989ae1b79ff9a (diff) |
From Abhik Sarkar:
Diameter SRT stats - split by command
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=3403
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@28039 f5534014-38df-0310-8fa8-9805f1628bb7
-rw-r--r-- | epan/dissectors/packet-diameter.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-diameter.h | 5 | ||||
-rw-r--r-- | gtk/diameter_stat.c | 32 |
3 files changed, 26 insertions, 13 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c index 991bedd0cd..b6de03d352 100644 --- a/epan/dissectors/packet-diameter.c +++ b/epan/dissectors/packet-diameter.c @@ -623,7 +623,6 @@ static const char* msgflags_str[] = { "RP--", "RP-T", "RPE-", "RPET" }; - static void dissect_diameter_common(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree) { @@ -784,6 +783,7 @@ dissect_diameter_common(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree) diameter_pair = se_alloc(sizeof(diameter_req_ans_pair_t)); diameter_pair->hop_by_hop_id = hop_by_hop_id; diameter_pair->cmd_code = cmd; + diameter_pair->cmd_str = cmd_str; diameter_pair->req_frame = pinfo->fd->num; diameter_pair->ans_frame = 0; diameter_pair->req_time = pinfo->fd->abs_ts; diff --git a/epan/dissectors/packet-diameter.h b/epan/dissectors/packet-diameter.h index 503cde660c..cecba8b4cd 100644 --- a/epan/dissectors/packet-diameter.h +++ b/epan/dissectors/packet-diameter.h @@ -26,9 +26,10 @@ /* Request-Answer Pair */ typedef struct _diameter_req_ans_pair_t { - guint32 hop_by_hop_id; - guint32 cmd_code; + guint32 hop_by_hop_id; + guint32 cmd_code; guint32 result_code; + const char* cmd_str; guint32 req_frame; /* frame number in which request was seen */ guint32 ans_frame; /* frame number in which answer was seen */ nstime_t req_time; diff --git a/gtk/diameter_stat.c b/gtk/diameter_stat.c index 68c4b21069..50e51f9e6f 100644 --- a/gtk/diameter_stat.c +++ b/gtk/diameter_stat.c @@ -1,14 +1,9 @@ /* diameter_stat.c - * Diameter Statistics + * Diameter Service Response Time Statistics * (c) 2008 Abhik Sarkar * * Based almost completely on gtp_stat by Kari Tiirikainen * - * FIXME - * In the present version, the SRT for all Diameter commands - * is bunched into one statistic. The statistics should ideally - * be grouped by vendor/application id and then by command code. - * * $Id$ * * Wireshark - Network traffic analyzer @@ -44,7 +39,6 @@ #include <epan/packet_info.h> #include <epan/epan.h> -#include <epan/value_string.h> #include <epan/tap.h> #include <epan/dissectors/packet-diameter.h> @@ -69,6 +63,8 @@ typedef struct _diameterstat_t { srt_stat_table diameter_srt_table; } diameterstat_t; +GHashTable* cmd_str_hash; + static void diameterstat_set_title(diameterstat_t *diameter) { @@ -89,14 +85,24 @@ diameterstat_reset(void *pdiameter) diameterstat_set_title(diameter); } + static int diameterstat_packet(void *pdiameter, packet_info *pinfo, epan_dissect_t *edt _U_, const void *pdi) { const diameter_req_ans_pair_t *diameter=pdi; diameterstat_t *fs=(diameterstat_t *)pdiameter; - int index=0; + int* index = NULL; + + + index = (int*) g_hash_table_lookup(cmd_str_hash, diameter->cmd_str); + if (index == NULL) { + index = g_malloc(sizeof(int)); + *index = (int) g_hash_table_size(cmd_str_hash); + g_hash_table_insert(cmd_str_hash, (gchar*) diameter->cmd_str, index); + init_srt_table_row(&fs->diameter_srt_table, *index, (const char*) diameter->cmd_str); + } - add_srt_table_data(&fs->diameter_srt_table, index, &diameter->req_time, pinfo); + add_srt_table_data(&fs->diameter_srt_table, *index, &diameter->req_time, pinfo); return 1; } @@ -123,6 +129,7 @@ win_destroy_cb(GtkWindow *win _U_, gpointer data) free_srt_table_data(&diameter->diameter_srt_table); g_free(diameter); + g_hash_table_destroy(cmd_str_hash); } @@ -137,6 +144,7 @@ gtk_diameterstat_init(const char *optarg, void *userdata _U_) GtkWidget *vbox; GtkWidget *bbox; GtkWidget *close_bt; + int* index; if(!strncmp(optarg,"diameter,",9)){ filter=optarg+9; @@ -145,6 +153,10 @@ gtk_diameterstat_init(const char *optarg, void *userdata _U_) } diameter=g_malloc(sizeof(diameterstat_t)); + index = g_malloc(sizeof(int)); + *index = 0; + cmd_str_hash = g_hash_table_new(g_str_hash,g_str_equal); + g_hash_table_insert(cmd_str_hash, (gchar *)"Unknown", index); diameter->win=window_new(GTK_WINDOW_TOPLEVEL, "diameter-stat"); gtk_window_set_default_size(GTK_WINDOW(diameter->win), 550, 400); @@ -170,7 +182,7 @@ gtk_diameterstat_init(const char *optarg, void *userdata _U_) gtk_widget_show_all(diameter->win); init_srt_table(&diameter->diameter_srt_table, 1, vbox, NULL); - init_srt_table_row(&diameter->diameter_srt_table, 0, "All"); + init_srt_table_row(&diameter->diameter_srt_table, 0, "Unknown"); error_string=register_tap_listener("diameter", diameter, filter, diameterstat_reset, diameterstat_packet, diameterstat_draw); if(error_string){ |