Add a popup to the ServicveResponseTime tables where the user can select

Prepare/Match/FindFrame similar to chat the ConversationList has.

Only enabled for SMB and ONC-RPC at this point

svn path=/trunk/; revision=8391
This commit is contained in:
Ronnie Sahlberg 2003-09-05 10:26:44 +00:00
parent ceb390bd7c
commit 95b3b8ca6d
9 changed files with 224 additions and 16 deletions

View File

@ -825,6 +825,11 @@ If an optional filter string is used only such ONC-RPC request/response pairs
that match that filter will be used to calculate the statistics. If no filter
string is specified all request/response pairs will be used.
By first selecting a conversation by clicking on it and then using the
right mouse button (on those platforms that have a right
mouse button) ethereal will display a popup menu offering several different
filter operations to apply to the capture.
=item Tools:Statistics:Service Response Time:SMB
Collect call/reply SRT (Service Response Time) data for SMB. Data collected
@ -843,6 +848,10 @@ You can apply an optional filter string in a dialog box, before starting
the calculation. The stats will only be calculated
on those calls matching that filter.
By first selecting a conversation by clicking on it and then using the
right mouse button (on those platforms that have a right
mouse button) ethereal will display a popup menu offering several different
filter operations to apply to the capture.
=item Tools:Statistics:Conversation List

View File

@ -1,7 +1,7 @@
/* dcerpc_stat.c
* dcerpc_stat 2002 Ronnie Sahlberg
*
* $Id: dcerpc_stat.c,v 1.15 2003/09/05 00:48:58 sahlberg Exp $
* $Id: dcerpc_stat.c,v 1.16 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -239,7 +239,7 @@ gtk_dcerpcstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(rs->win);
init_srt_table(&rs->srt_table, max_procs+1, vbox);
init_srt_table(&rs->srt_table, max_procs+1, vbox, NULL);
for(i=0;i<(max_procs+1);i++){
int j;

View File

@ -1,7 +1,7 @@
/* fc_stat.c
* fc_stat 2003 Ronnie Sahlberg
*
* $Id: fc_stat.c,v 1.4 2003/09/02 08:27:33 sahlberg Exp $
* $Id: fc_stat.c,v 1.5 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -164,7 +164,7 @@ gtk_fcstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(fc->win);
init_srt_table(&fc->fc_srt_table, 256, vbox);
init_srt_table(&fc->fc_srt_table, 256, vbox, NULL);
for(i=0;i<256;i++){
init_srt_table_row(&fc->fc_srt_table, i, val_to_str(i, fc_fc4_val, "Unknown(0x%02x)"));
}

View File

@ -1,7 +1,7 @@
/* rpc_stat.c
* rpc_stat 2002 Ronnie Sahlberg
*
* $Id: rpc_stat.c,v 1.15 2003/09/02 08:27:41 sahlberg Exp $
* $Id: rpc_stat.c,v 1.16 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -190,6 +190,8 @@ gtk_rpcstat_init(char *optarg)
int program, version, pos;
char *filter=NULL;
GString *error_string;
int hf_index;
header_field_info *hfi;
pos=0;
if(sscanf(optarg,"rpc,srt,%d,%d,%n",&program,&version,&pos)==2){
@ -209,6 +211,8 @@ gtk_rpcstat_init(char *optarg)
rs->prog=rpc_prog_name(rpc_program);
rs->program=rpc_program;
rs->version=rpc_version;
hf_index=rpc_prog_hf(rpc_program, rpc_version);
hfi=proto_registrar_get_nth(hf_index);
rs->win=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(rs->win), 550, 400);
@ -238,7 +242,7 @@ gtk_rpcstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(rs->win);
init_srt_table(&rs->srt_table, rpc_max_proc+1, vbox);
init_srt_table(&rs->srt_table, rpc_max_proc+1, vbox, hfi->abbrev);
for(i=0;i<rs->num_procedures;i++){
init_srt_table_row(&rs->srt_table, i, rpc_proc_name(rpc_program, rpc_version, i));

View File

@ -3,7 +3,7 @@
* Helper routines common to all service response time statistics
* tap.
*
* $Id: service_response_time_table.c,v 1.6 2003/09/03 10:10:18 sahlberg Exp $
* $Id: service_response_time_table.c,v 1.7 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -38,6 +38,12 @@
#include "service_response_time_table.h"
#include "image/clist_ascend.xpm"
#include "image/clist_descend.xpm"
#include "simple_dialog.h"
#include "globals.h"
#include "gtk/find_dlg.h"
extern GtkWidget *main_display_filter_widget;
#define GTK_MENU_FUNC(a) ((GtkItemFactoryCallback)(a))
typedef struct column_arrows {
@ -124,8 +130,164 @@ srt_sort_column(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
return 0;
}
/* action is encoded as
filter_action*256+filter_type
filter_action:
0: Match
1: Prepare
2: Find
filter_type:
0: Selected
1: Not Selected
2: And Selected
3: Or Selected
4: And Not Selected
5: Or Not Selected
*/
static void
srt_select_filter_cb(GtkWidget *widget _U_, gpointer callback_data, guint callback_action)
{
int action, type, selection;
srt_stat_table *rst = (srt_stat_table *)callback_data;
char str[256];
char *current_filter;
if(rst->filter_string==NULL){
return;
}
action=(callback_action>>8)&0xff;
type=callback_action&0xff;
selection=GPOINTER_TO_INT(g_list_nth_data(GTK_CLIST(rst->table)->selection, 0));
if(selection>=(int)rst->num_procs){
simple_dialog(ESD_TYPE_WARN, NULL, "No procedure selected");
return;
}
/* translate it back from row index to index in procedures array */
selection=GPOINTER_TO_INT(gtk_clist_get_row_data(rst->table, selection));
current_filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
switch(type){
case 0:
/* selected */
snprintf(str, 255, "%s==%d", rst->filter_string, selection);
break;
case 1:
/* not selected */
snprintf(str, 255, "!(%s==%d)", rst->filter_string, selection);
break;
case 2:
/* and selected */
snprintf(str, 255, "(%s) && (%s==%d)", current_filter, rst->filter_string, selection);
break;
case 3:
/* or selected */
snprintf(str, 255, "(%s) || (%s==%d)", current_filter, rst->filter_string, selection);
break;
case 4:
/* and not selected */
snprintf(str, 255, "(%s) && !(%s==%d)", current_filter, rst->filter_string, selection);
break;
case 5:
/* or not selected */
snprintf(str, 255, "(%s) || !(%s==%d)", current_filter, rst->filter_string, selection);
break;
}
gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), str);
switch(action){
case 0:
/* match */
filter_packets(&cfile, str);
case 1:
/* prepare */
/* do nothing */
break;
case 2:
/* find frame */
find_frame_with_filter(str);
break;
}
}
static gint
srt_show_popup_menu_cb(void *widg _U_, GdkEvent *event, srt_stat_table *rst)
{
GdkEventButton *bevent = (GdkEventButton *)event;
if(event->type==GDK_BUTTON_PRESS && bevent->button==3){
gtk_menu_popup(GTK_MENU(rst->menu), NULL, NULL, NULL, NULL,
bevent->button, bevent->time);
}
return FALSE;
}
static GtkItemFactoryEntry srt_list_menu_items[] =
{
/* Match */
ITEM_FACTORY_ENTRY("/Match Display Filter", NULL, NULL, 0, "<Branch>", NULL),
ITEM_FACTORY_ENTRY("/Match Display Filter/Selected", NULL,
srt_select_filter_cb, 0*256+0, NULL, NULL),
ITEM_FACTORY_ENTRY("/Match Display Filter/Not Selected", NULL,
srt_select_filter_cb, 0*256+1, NULL, NULL),
ITEM_FACTORY_ENTRY("/Match Display Filter/And Selected", NULL,
srt_select_filter_cb, 0*256+2, NULL, NULL),
ITEM_FACTORY_ENTRY("/Match Display Filter/Or Selected", NULL,
srt_select_filter_cb, 0*256+3, NULL, NULL),
ITEM_FACTORY_ENTRY("/Match Display Filter/And Not Selected", NULL,
srt_select_filter_cb, 0*256+4, NULL, NULL),
ITEM_FACTORY_ENTRY("/Match Display Filter/Or Not Selected", NULL,
srt_select_filter_cb, 0*256+5, NULL, NULL),
/* Prepare */
ITEM_FACTORY_ENTRY("/Prepare Display Filter", NULL, NULL, 0, "<Branch>", NULL),
ITEM_FACTORY_ENTRY("/Prepare Display Filter/Selected", NULL,
srt_select_filter_cb, 1*256+0, NULL, NULL),
ITEM_FACTORY_ENTRY("/Prepare Display Filter/Not Selected", NULL,
srt_select_filter_cb, 1*256+1, NULL, NULL),
ITEM_FACTORY_ENTRY("/Prepare Display Filter/And Selected", NULL,
srt_select_filter_cb, 1*256+2, NULL, NULL),
ITEM_FACTORY_ENTRY("/Prepare Display Filter/Or Selected", NULL,
srt_select_filter_cb, 1*256+3, NULL, NULL),
ITEM_FACTORY_ENTRY("/Prepare Display Filter/And Not Selected", NULL,
srt_select_filter_cb, 1*256+4, NULL, NULL),
ITEM_FACTORY_ENTRY("/Prepare Display Filter/Or Not Selected", NULL,
srt_select_filter_cb, 1*256+5, NULL, NULL),
/* Find Frame */
ITEM_FACTORY_ENTRY("/Find Frame", NULL, NULL, 0, "<Branch>", NULL),
ITEM_FACTORY_ENTRY("/Find Frame/Selected", NULL,
srt_select_filter_cb, 2*256+0, NULL, NULL),
ITEM_FACTORY_ENTRY("/Find Frame/Not Selected", NULL,
srt_select_filter_cb, 2*256+1, NULL, NULL),
};
static void
srt_create_popup_menu(srt_stat_table *rst)
{
GtkItemFactory *item_factory;
item_factory = gtk_item_factory_new(GTK_TYPE_MENU, "<main>", NULL);
gtk_item_factory_create_items_ac(item_factory, sizeof(srt_list_menu_items)/sizeof(srt_list_menu_items[0]), srt_list_menu_items, rst, 2);
rst->menu = gtk_item_factory_get_widget(item_factory, "<main>");
SIGNAL_CONNECT(rst->table, "button_press_event", srt_show_popup_menu_cb, rst);
}
void
init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox)
init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox, char *filter_string)
{
int i, j;
column_arrows *col_arrows;
@ -136,6 +298,11 @@ init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox)
char *default_titles[] = { "Index", "Procedure", "Calls", "Min SRT", "Max SRT", "Avg SRT" };
if(filter_string){
rst->filter_string=g_strdup(filter_string);
} else {
rst->filter_string=NULL;
}
rst->scrolled_window=gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(rst->scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
gtk_box_pack_start(GTK_BOX(vbox), rst->scrolled_window, TRUE, TRUE, 0);
@ -212,6 +379,11 @@ init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox)
rst->procedures[i].entries[j]=NULL;
}
}
/* create popup menu for this table */
if(rst->filter_string){
srt_create_popup_menu(rst);
}
}
void
@ -368,6 +540,8 @@ free_srt_table_data(srt_stat_table *rst)
}
}
}
g_free(rst->filter_string);
rst->filter_string=NULL;
g_free(rst->procedures);
rst->procedures=NULL;
rst->num_procs=0;

View File

@ -3,7 +3,7 @@
* Helper routines common to all service response time statistics
* tap.
*
* $Id: service_response_time_table.h,v 1.1 2003/06/21 01:42:46 sahlberg Exp $
* $Id: service_response_time_table.h,v 1.2 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -39,11 +39,14 @@ typedef struct _srt_procedure_t {
typedef struct _srt_stat_table {
GtkWidget *scrolled_window;
GtkCList *table;
GtkWidget *menu;
char *filter_string; /* append procedure number (%d) to this string
to create a display filter */
int num_procs;
srt_procedure_t *procedures;
} srt_stat_table;
void init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox);
void init_srt_table(srt_stat_table *rst, int num_procs, GtkWidget *vbox, char *filter_string);
void init_srt_table_row(srt_stat_table *rst, int index, char *procedure);

View File

@ -1,7 +1,7 @@
/* smb_stat.c
* smb_stat 2003 Ronnie Sahlberg
*
* $Id: smb_stat.c,v 1.12 2003/09/02 08:27:43 sahlberg Exp $
* $Id: smb_stat.c,v 1.13 2003/09/05 10:26:44 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -182,7 +182,7 @@ gtk_smbstat_init(char *optarg)
/* We must display TOP LEVEL Widget before calling init_srt_table() */
gtk_widget_show(ss->win);
init_srt_table(&ss->smb_srt_table, 256, vbox);
init_srt_table(&ss->smb_srt_table, 256, vbox, "smb.cmd");
for(i=0;i<256;i++){
init_srt_table_row(&ss->smb_srt_table, i, val_to_str(i, smb_cmd_vals, "Unknown(0x%02x)"));
}
@ -191,7 +191,7 @@ gtk_smbstat_init(char *optarg)
label=gtk_label_new("Transaction2 Sub-Commands");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
init_srt_table(&ss->trans2_srt_table, 256, vbox);
init_srt_table(&ss->trans2_srt_table, 256, vbox, "smb.trans2.cmd");
for(i=0;i<256;i++){
init_srt_table_row(&ss->trans2_srt_table, i, val_to_str(i, trans2_cmd_vals, "Unknown(0x%02x)"));
}
@ -200,7 +200,7 @@ gtk_smbstat_init(char *optarg)
label=gtk_label_new("NT Transaction Sub-Commands");
gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
gtk_widget_show(label);
init_srt_table(&ss->nt_trans_srt_table, 256, vbox);
init_srt_table(&ss->nt_trans_srt_table, 256, vbox, "smb.nt.function");
for(i=0;i<256;i++){
init_srt_table_row(&ss->nt_trans_srt_table, i, val_to_str(i, nt_cmd_vals, "Unknown(0x%02x)"));
}

View File

@ -2,7 +2,7 @@
* Routines for rpc dissection
* Copyright 1999, Uwe Girlich <Uwe.Girlich@philosys.de>
*
* $Id: packet-rpc.c,v 1.137 2003/09/03 07:11:13 guy Exp $
* $Id: packet-rpc.c,v 1.138 2003/09/05 10:26:42 sahlberg Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -322,6 +322,7 @@ rpc_init_proc_table(guint prog, guint vers, const vsff *proc_table,
}
}
/* return the name associated with a previously registered procedure. */
char *rpc_proc_name(guint32 prog, guint32 vers, guint32 proc)
{
@ -394,6 +395,22 @@ rpc_init_prog(int proto, guint32 prog, int ett)
g_hash_table_insert(rpc_progs,key,value);
}
/* return the hf_field associated with a previously registered program.
*/
int rpc_prog_hf(guint32 prog, guint32 vers)
{
rpc_prog_info_key rpc_prog_key;
rpc_prog_info_value *rpc_prog;
rpc_prog_key.prog = prog;
if ((rpc_prog = g_hash_table_lookup(rpc_progs,&rpc_prog_key))) {
return g_array_index(rpc_prog->procedure_hfs, int, vers);
}
return -1;
}
/* return the name associated with a previously registered program. This
should probably eventually be expanded to use the rpc YP/NIS map
so that it can give names for programs not handled by ethereal */

View File

@ -1,6 +1,6 @@
/* packet-rpc.h
*
* $Id: packet-rpc.h,v 1.42 2003/05/21 02:48:40 sharpe Exp $
* $Id: packet-rpc.h,v 1.43 2003/09/05 10:26:43 sahlberg Exp $
*
* (c) 1999 Uwe Girlich
*
@ -121,6 +121,7 @@ extern void rpc_init_proc_table(guint prog, guint vers, const vsff *proc_table,
extern void rpc_init_prog(int proto, guint32 prog, int ett);
extern char *rpc_prog_name(guint32 prog);
extern char *rpc_proc_name(guint32 prog, guint32 vers, guint32 proc);
extern int rpc_prog_hf(guint32 prog, guint32 vers);
extern unsigned int rpc_roundup(unsigned int a);
extern int dissect_rpc_bool(tvbuff_t *tvb,