diff options
-rw-r--r-- | doc/ethereal.pod.template | 9 | ||||
-rw-r--r-- | gtk/dcerpc_stat.c | 4 | ||||
-rw-r--r-- | gtk/fc_stat.c | 4 | ||||
-rw-r--r-- | gtk/rpc_stat.c | 8 | ||||
-rw-r--r-- | gtk/service_response_time_table.c | 178 | ||||
-rw-r--r-- | gtk/service_response_time_table.h | 7 | ||||
-rw-r--r-- | gtk/smb_stat.c | 8 | ||||
-rw-r--r-- | packet-rpc.c | 19 | ||||
-rw-r--r-- | packet-rpc.h | 3 |
9 files changed, 224 insertions, 16 deletions
diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template index 7f896dee67..ec23181432 100644 --- a/doc/ethereal.pod.template +++ b/doc/ethereal.pod.template @@ -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 diff --git a/gtk/dcerpc_stat.c b/gtk/dcerpc_stat.c index 9064974361..d6a4f82e46 100644 --- a/gtk/dcerpc_stat.c +++ b/gtk/dcerpc_stat.c @@ -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; diff --git a/gtk/fc_stat.c b/gtk/fc_stat.c index 940251e749..549d5038f6 100644 --- a/gtk/fc_stat.c +++ b/gtk/fc_stat.c @@ -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)")); } diff --git a/gtk/rpc_stat.c b/gtk/rpc_stat.c index 47c9d66fbd..4419192422 100644 --- a/gtk/rpc_stat.c +++ b/gtk/rpc_stat.c @@ -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)); diff --git a/gtk/service_response_time_table.c b/gtk/service_response_time_table.c index d8cd4cf7fc..e6f592768c 100644 --- a/gtk/service_response_time_table.c +++ b/gtk/service_response_time_table.c @@ -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; diff --git a/gtk/service_response_time_table.h b/gtk/service_response_time_table.h index cd28b1afcd..d98e2414be 100644 --- a/gtk/service_response_time_table.h +++ b/gtk/service_response_time_table.h @@ -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); diff --git a/gtk/smb_stat.c b/gtk/smb_stat.c index 39e58fb931..d5a2d4a8e2 100644 --- a/gtk/smb_stat.c +++ b/gtk/smb_stat.c @@ -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)")); } diff --git a/packet-rpc.c b/packet-rpc.c index 219923ae29..c2a44bc5d2 100644 --- a/packet-rpc.c +++ b/packet-rpc.c @@ -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 */ diff --git a/packet-rpc.h b/packet-rpc.h index 35a5f6b659..b01f2b469a 100644 --- a/packet-rpc.h +++ b/packet-rpc.h @@ -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, |