aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2012-07-15 16:24:35 +0000
committerAnders Broman <anders.broman@ericsson.com>2012-07-15 16:24:35 +0000
commit5d9d9b82219cb87ee74b94ee3a8bf0d5ec51b57c (patch)
treec494459b75db5141e5035de2546e23ce53f01fc9
parent7deecbf36bcd15eda28be17fbf00d7fc05b31003 (diff)
From Wonil Kim: Enable statistics menu register for the tap plug-in. Fixes https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=7466
svn path=/trunk/; revision=43726
-rw-r--r--epan/libwireshark.def2
-rw-r--r--epan/stats_tree.c24
-rw-r--r--epan/stats_tree.h16
-rw-r--r--epan/stats_tree_priv.h5
-rw-r--r--plugins/stats_tree/pinfo_stats_tree.c9
-rw-r--r--ui/gtk/main_menubar.c63
6 files changed, 107 insertions, 12 deletions
diff --git a/epan/libwireshark.def b/epan/libwireshark.def
index 52b2eff149..caca3de840 100644
--- a/epan/libwireshark.def
+++ b/epan/libwireshark.def
@@ -1013,6 +1013,7 @@ stats_tree_create_range_node_string
stats_tree_free
stats_tree_get_abbr
stats_tree_get_cfg_by_abbr
+stats_tree_get_cfg_list
stats_tree_get_strs_from_node
stats_tree_manip_node
stats_tree_new
@@ -1022,6 +1023,7 @@ stats_tree_parent_id_by_name
stats_tree_presentation
stats_tree_range_node_with_pname
stats_tree_register
+stats_tree_register_plugin
stats_tree_register_with_group
stats_tree_reinit
stats_tree_reset
diff --git a/epan/stats_tree.c b/epan/stats_tree.c
index 6e1c52d56e..799bcdb88a 100644
--- a/epan/stats_tree.c
+++ b/epan/stats_tree.c
@@ -270,6 +270,7 @@ stats_tree_register_with_group(const char *tapname, const char *abbr, const char
/* at the very least the abbrev and the packet function should be given */
g_assert( tapname && abbr && packet );
+ cfg->plugin = FALSE;
cfg->tapname = g_strdup(tapname);
cfg->abbr = g_strdup(abbr);
cfg->name = name ? g_strdup(name) : g_strdup(abbr);
@@ -294,7 +295,6 @@ stats_tree_register_with_group(const char *tapname, const char *abbr, const char
if (!registry) registry = g_hash_table_new(g_str_hash,g_str_equal);
g_hash_table_insert(registry,cfg->abbr,cfg);
-
}
/* register a new stats_tree with default group REGISTER_STAT_GROUP_UNSORTED */
@@ -310,6 +310,23 @@ stats_tree_register(const char *tapname, const char *abbr, const char *name,
cleanup, REGISTER_STAT_GROUP_UNSORTED);
}
+/* register a new stat_tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin */
+extern void
+stats_tree_register_plugin(const char *tapname, const char *abbr, const char *name,
+ guint flags,
+ stat_tree_packet_cb packet, stat_tree_init_cb init,
+ stat_tree_cleanup_cb cleanup)
+{
+ stats_tree_cfg *cfg;
+
+ stats_tree_register(tapname, abbr, name,
+ flags,
+ packet, init,
+ cleanup);
+ cfg = stats_tree_get_cfg_by_abbr((char*)abbr);
+ cfg->plugin = TRUE;
+}
+
extern stats_tree*
stats_tree_new(stats_tree_cfg *cfg, tree_pres *pr, const char *filter)
{
@@ -362,6 +379,11 @@ stats_tree_get_cfg_by_abbr(char *abbr)
return g_hash_table_lookup(registry,abbr);
}
+extern GList*
+stats_tree_get_cfg_list(void)
+{
+ return g_hash_table_get_values(registry);
+}
struct _stats_tree_pres_cbs {
void (*setup_node_pr)(stat_node*);
diff --git a/epan/stats_tree.h b/epan/stats_tree.h
index 98c6309d20..12385763a4 100644
--- a/epan/stats_tree.h
+++ b/epan/stats_tree.h
@@ -66,6 +66,22 @@ extern void stats_tree_register(const gchar *tapname,
stat_tree_init_cb init,
stat_tree_cleanup_cb cleanup);
+/* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin
+ * abbr: protocol abbr
+ * name: protocol display name
+ * flags: tap listener flags for per-packet callback
+ * packet: per packet callback
+ * init: tree initialization callback
+ * cleanup: cleanup callback
+ */
+extern void stats_tree_register_plugin(const gchar *tapname,
+ const gchar *abbr,
+ const gchar *name,
+ guint flags,
+ stat_tree_packet_cb packet,
+ stat_tree_init_cb init,
+ stat_tree_cleanup_cb cleanup);
+
/* registers a new stats tree
* abbr: protocol abbr
* name: protocol display name
diff --git a/epan/stats_tree_priv.h b/epan/stats_tree_priv.h
index c6c3e153bd..6c90bf0cfe 100644
--- a/epan/stats_tree_priv.h
+++ b/epan/stats_tree_priv.h
@@ -113,6 +113,7 @@ struct _stats_tree_cfg {
register_stat_group_t stat_group;
gboolean in_use;
+ gboolean plugin;
/** dissector defined callbacks */
stat_tree_packet_cb packet;
@@ -181,6 +182,10 @@ extern gchar *stats_tree_get_abbr(const gchar *optarg);
/** obtains a stats tree from the registry given its abbr */
extern stats_tree_cfg *stats_tree_get_cfg_by_abbr(gchar *abbr);
+/** obtains a stats tree list from the registry
+ caller should free returned list with g_list_free() */
+extern GList *stats_tree_get_cfg_list(void);
+
/** extracts node data as strings from a stat_node into
the buffers given by value, rate and precent
if NULL they are ignored */
diff --git a/plugins/stats_tree/pinfo_stats_tree.c b/plugins/stats_tree/pinfo_stats_tree.c
index 853beb468d..4371a92e8e 100644
--- a/plugins/stats_tree/pinfo_stats_tree.c
+++ b/plugins/stats_tree/pinfo_stats_tree.c
@@ -208,10 +208,10 @@ void register_pinfo_stat_trees(void) {
UAT_END_FIELDS
};
- stats_tree_register("ip","ip_hosts",st_str_ip, 0, ip_hosts_stats_tree_packet, ip_hosts_stats_tree_init, NULL );
- stats_tree_register("ip","ptype",st_str_ptype, 0, ptype_stats_tree_packet, ptype_stats_tree_init, NULL );
+ stats_tree_register_plugin("ip","ip_hosts",st_str_ip, 0, ip_hosts_stats_tree_packet, ip_hosts_stats_tree_init, NULL );
+ stats_tree_register_plugin("ip","ptype",st_str_ptype, 0, ptype_stats_tree_packet, ptype_stats_tree_init, NULL );
stats_tree_register_with_group("frame","plen",st_str_plen, 0, plen_stats_tree_packet, plen_stats_tree_init, NULL, REGISTER_STAT_GROUP_GENERIC );
- stats_tree_register("ip","dests",st_str_dsts, 0, dsts_stats_tree_packet, dsts_stats_tree_init, NULL );
+ stats_tree_register_plugin("ip","dests",st_str_dsts, 0, dsts_stats_tree_packet, dsts_stats_tree_init, NULL );
stat_module = prefs_register_stat("stat_tree", "Stats Tree", "Stats Tree", NULL);
@@ -231,5 +231,4 @@ void register_pinfo_stat_trees(void) {
prefs_register_uat_preference(stat_module, "packet_lengths",
"Packet Lengths", "Delineated packet sizes to count", plen_uat);
-}
-
+} \ No newline at end of file
diff --git a/ui/gtk/main_menubar.c b/ui/gtk/main_menubar.c
index 03b53e4fc0..523b1c7206 100644
--- a/ui/gtk/main_menubar.c
+++ b/ui/gtk/main_menubar.c
@@ -43,6 +43,7 @@
#include <epan/plugins.h>
#include <epan/epan_dissect.h>
#include <epan/column.h>
+#include <epan/stats_tree_priv.h>
#include <epan/filesystem.h>
@@ -144,6 +145,7 @@ GtkWidget *popup_menu_object;
static void menu_open_recent_file_cmd_cb(GtkAction *action, gpointer data _U_ );
static void add_recent_items (guint merge_id, GtkUIManager *ui_manager);
+static void add_tap_plugins (guint merge_id, GtkUIManager *ui_manager);
static void menus_init(void);
static void merge_lua_menu_items(GList *node);
@@ -1272,9 +1274,6 @@ static const char *ui_desc_menubar =
" <menuitem name='http_req' action='/StatisticsMenu/HTTP/http_req'/>\n"
" <menuitem name='http_srv' action='/StatisticsMenu/HTTP/http_srv'/>\n"
" </menu>\n"
-" <menuitem name='IPAddresses' action='/StatisticsMenu/ip_hosts'/>\n"
-" <menuitem name='IPDestinations' action='/StatisticsMenu/dests'/>\n"
-" <menuitem name='IPptype' action='/StatisticsMenu/ptype'/>\n"
" <menuitem name='ONC-RPC-Programs' action='/StatisticsMenu/ONC-RPC-Programs'/>\n"
" <menu name= 'SametimeMenu' action='/StatisticsMenu/Sametime'>\n"
" <menuitem name='sametime' action='/StatisticsMenu/Sametime/sametime'/>\n"
@@ -1736,9 +1735,6 @@ static const GtkActionEntry main_menu_bar_entries[] = {
{ "/StatisticsMenu/HTTP/http_req", NULL, "Requests", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
{ "/StatisticsMenu/HTTP/http_srv", NULL, "Load Distribution", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/StatisticsMenu/ip_hosts", NULL, "IP Addresses...", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/StatisticsMenu/dests", NULL, "IP Destinations...", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
- { "/StatisticsMenu/ptype", NULL, "IP Protocol Types..", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
{ "/StatisticsMenu/ONC-RPC-Programs", NULL, "ONC-RPC Programs", NULL, NULL, G_CALLBACK(gtk_rpcprogs_cb) },
{ "/StatisticsMenu/Sametime", NULL, "Sametime", NULL, NULL, NULL },
{ "/StatisticsMenu/Sametime/sametime", NULL, "Messages", NULL, NULL, G_CALLBACK(gtk_stats_tree_cb) },
@@ -3462,6 +3458,11 @@ menus_init(void) {
merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
add_recent_items (merge_id, ui_manager_main_menubar);
+ /* Add statistics tap plug-in to the menu
+ */
+ merge_id = gtk_ui_manager_new_merge_id (ui_manager_main_menubar);
+ add_tap_plugins (merge_id, ui_manager_main_menubar);
+
statusbar_profiles_action_group = gtk_action_group_new ("StatusBarProfilesPopUpMenuActionGroup");
gtk_action_group_add_actions (statusbar_profiles_action_group, /* the action group */
@@ -4123,6 +4124,56 @@ add_recent_items (guint merge_id, GtkUIManager *ui_manager)
}
+#define MENU_STATISTICS_PATH "/Menubar/StatisticsMenu"
+
+static void
+add_tap_plugins (guint merge_id, GtkUIManager *ui_manager)
+{
+ GtkActionGroup *action_group;
+ GtkAction *action;
+ GtkWidget *submenu_statistics;
+ GList *cfg_list;
+ GList *iter;
+ gchar *action_name;
+
+ action_group = gtk_action_group_new ("tap-plugins-group");
+
+ submenu_statistics = gtk_ui_manager_get_widget(ui_manager_main_menubar, MENU_STATISTICS_PATH);
+ if(!submenu_statistics){
+ g_warning("add_tap_plugins: No submenu_statistics found, path= MENU_STATISTICS_PATH");
+ return;
+ }
+ gtk_ui_manager_insert_action_group (ui_manager_main_menubar, action_group, 0);
+ g_object_set_data (G_OBJECT (ui_manager_main_menubar),
+ "tap-plugins-merge-id", GUINT_TO_POINTER (merge_id));
+
+ cfg_list = stats_tree_get_cfg_list();
+ iter = g_list_first(cfg_list);
+ while (iter) {
+ stats_tree_cfg *cfg = (stats_tree_cfg*)iter->data;
+ if (cfg->plugin) {
+ action_name = g_strdup_printf(MENU_STATISTICS_PATH "/%s", cfg->abbr);
+ action = g_object_new (GTK_TYPE_ACTION,
+ "name", action_name,
+ "label", cfg->name,
+ NULL);
+ g_signal_connect (action, "activate", G_CALLBACK (gtk_stats_tree_cb), NULL);
+ gtk_action_group_add_action (action_group, action);
+ g_object_unref (action);
+
+ gtk_ui_manager_add_ui (ui_manager, merge_id,
+ MENU_STATISTICS_PATH,
+ action_name,
+ action_name,
+ GTK_UI_MANAGER_MENUITEM,
+ FALSE);
+
+ g_free (action_name);
+ }
+ iter = g_list_next(iter);
+ }
+ g_list_free(cfg_list);
+}
/* Open a file by it's name
(Beware: will not ask to close existing capture file!) */