aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2009-04-13 18:14:25 +0000
committeretxrab <etxrab@f5534014-38df-0310-8fa8-9805f1628bb7>2009-04-13 18:14:25 +0000
commit37e5faf56e61548d58c908993d44e768e9222d10 (patch)
treeccd525b2cb914d2e43779930a7bbfc63598c2bd9
parentdb40bfac958d0f9f425f8d585b2989ae1b79ff9a (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.c2
-rw-r--r--epan/dissectors/packet-diameter.h5
-rw-r--r--gtk/diameter_stat.c32
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){