2 * ldap_stat 2003 Ronnie Sahlberg
6 * Ethereal - Network traffic analyzer
7 * By Gerald Combs <gerald@ethereal.com>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 #ifdef HAVE_SYS_TYPES_H
30 # include <sys/types.h>
37 #include <epan/packet_info.h>
38 #include <epan/epan.h>
39 #include <epan/value_string.h>
43 #include <epan/dissectors/packet-ldap.h>
44 #include "../register.h"
45 #include "../timestats.h"
46 #include "compat_macros.h"
47 #include "../simple_dialog.h"
49 #include "dlg_utils.h"
51 #include "../globals.h"
52 #include "filter_dlg.h"
53 #include "service_response_time_table.h"
54 #include "gtkglobals.h"
57 /* used to keep track of the statistics for an entire program interface */
58 typedef struct _ldapstat_t {
60 srt_stat_table ldap_srt_table;
64 ldapstat_set_title(ldapstat_t *ldap)
68 title = g_strdup_printf("LDAP Service Response Time statistics: %s",
69 cf_get_display_name(&cfile));
70 gtk_window_set_title(GTK_WINDOW(ldap->win), title);
75 ldapstat_reset(void *pldap)
77 ldapstat_t *ldap=(ldapstat_t *)pldap;
79 reset_srt_table_data(&ldap->ldap_srt_table);
80 ldapstat_set_title(ldap);
84 ldapstat_packet(void *pldap, packet_info *pinfo, epan_dissect_t *edt _U_, const void *psi)
86 const ldap_call_response_t *ldap=psi;
87 ldapstat_t *fs=(ldapstat_t *)pldap;
89 /* we are only interested in reply packets */
93 /* if we havnt seen the request, just ignore it */
98 /* only use the commands we know how to handle */
99 switch(ldap->protocolOpTag){
101 case LDAP_REQ_SEARCH:
102 case LDAP_REQ_MODIFY:
104 case LDAP_REQ_DELETE:
105 case LDAP_REQ_MODRDN:
106 case LDAP_REQ_COMPARE:
107 case LDAP_REQ_EXTENDED:
113 add_srt_table_data(&fs->ldap_srt_table, ldap->protocolOpTag, &ldap->req_time, pinfo);
121 ldapstat_draw(void *pldap)
123 ldapstat_t *ldap=(ldapstat_t *)pldap;
125 draw_srt_table_data(&ldap->ldap_srt_table);
129 void protect_thread_critical_region(void);
130 void unprotect_thread_critical_region(void);
132 win_destroy_cb(GtkWindow *win _U_, gpointer data)
134 ldapstat_t *ldap=(ldapstat_t *)data;
136 protect_thread_critical_region();
137 remove_tap_listener(ldap);
138 unprotect_thread_critical_region();
140 free_srt_table_data(&ldap->ldap_srt_table);
146 gtk_ldapstat_init(char *optarg)
151 char filter_string[256];
152 GString *error_string;
157 if(!strncmp(optarg,"ldap,srt,",9)){
163 ldap=g_malloc(sizeof(ldapstat_t));
165 ldap->win=window_new(GTK_WINDOW_TOPLEVEL, "ldap-stat");
166 gtk_window_set_default_size(GTK_WINDOW(ldap->win), 550, 400);
167 ldapstat_set_title(ldap);
169 vbox=gtk_vbox_new(FALSE, 3);
170 gtk_container_add(GTK_CONTAINER(ldap->win), vbox);
171 gtk_container_set_border_width(GTK_CONTAINER(vbox), 12);
173 label=gtk_label_new("LDAP Service Response Time statistics");
174 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
176 g_snprintf(filter_string,255,"Filter:%s",filter?filter:"");
177 label=gtk_label_new(filter_string);
178 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
180 label=gtk_label_new("LDAP Commands");
181 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
183 /* We must display TOP LEVEL Widget before calling init_srt_table() */
184 gtk_widget_show_all(ldap->win);
186 init_srt_table(&ldap->ldap_srt_table, 24, vbox, NULL);
187 init_srt_table_row(&ldap->ldap_srt_table, 0, "Bind");
188 init_srt_table_row(&ldap->ldap_srt_table, 1, "<unknown>");
189 init_srt_table_row(&ldap->ldap_srt_table, 2, "<unknown>");
190 init_srt_table_row(&ldap->ldap_srt_table, 3, "Search");
191 init_srt_table_row(&ldap->ldap_srt_table, 4, "<unknown>");
192 init_srt_table_row(&ldap->ldap_srt_table, 5, "<unknown>");
193 init_srt_table_row(&ldap->ldap_srt_table, 6, "Modify");
194 init_srt_table_row(&ldap->ldap_srt_table, 7, "<unknown>");
195 init_srt_table_row(&ldap->ldap_srt_table, 8, "Add");
196 init_srt_table_row(&ldap->ldap_srt_table, 9, "<unknown>");
197 init_srt_table_row(&ldap->ldap_srt_table, 10, "Delete");
198 init_srt_table_row(&ldap->ldap_srt_table, 11, "<unknown>");
199 init_srt_table_row(&ldap->ldap_srt_table, 12, "Modrdn");
200 init_srt_table_row(&ldap->ldap_srt_table, 13, "<unknown>");
201 init_srt_table_row(&ldap->ldap_srt_table, 14, "Compare");
202 init_srt_table_row(&ldap->ldap_srt_table, 15, "<unknown>");
203 init_srt_table_row(&ldap->ldap_srt_table, 16, "<unknown>");
204 init_srt_table_row(&ldap->ldap_srt_table, 17, "<unknown>");
205 init_srt_table_row(&ldap->ldap_srt_table, 18, "<unknown>");
206 init_srt_table_row(&ldap->ldap_srt_table, 19, "<unknown>");
207 init_srt_table_row(&ldap->ldap_srt_table, 20, "<unknown>");
208 init_srt_table_row(&ldap->ldap_srt_table, 21, "<unknown>");
209 init_srt_table_row(&ldap->ldap_srt_table, 22, "<unknown>");
210 init_srt_table_row(&ldap->ldap_srt_table, 23, "Extended");
213 error_string=register_tap_listener("ldap", ldap, filter, ldapstat_reset, ldapstat_packet, ldapstat_draw);
215 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, error_string->str);
216 g_string_free(error_string, TRUE);
222 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
223 gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
225 close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
226 window_set_cancel_button(ldap->win, close_bt, window_cancel_button_cb);
228 SIGNAL_CONNECT(ldap->win, "delete_event", window_delete_event_cb, NULL);
229 SIGNAL_CONNECT(ldap->win, "destroy", win_destroy_cb, ldap);
231 gtk_widget_show_all(ldap->win);
232 window_present(ldap->win);
234 retap_packets(&cfile);
239 static GtkWidget *dlg=NULL;
240 static GtkWidget *filter_entry;
249 ldapstat_start_button_clicked(GtkWidget *item _U_, gpointer data _U_)
254 str = g_string_new("ldap,srt");
255 filter=gtk_entry_get_text(GTK_ENTRY(filter_entry));
257 g_string_sprintfa(str,",%s", filter);
259 gtk_ldapstat_init(str->str);
260 g_string_free(str, TRUE);
264 gtk_ldapstat_cb(GtkWidget *w _U_, gpointer d _U_)
267 GtkWidget *filter_box, *filter_bt;
268 GtkWidget *bbox, *start_button, *cancel_button;
270 static construct_args_t args = {
271 "Service Response Time Statistics Filter",
276 /* if the window is already open, bring it to front */
278 gdk_window_raise(dlg->window);
282 dlg=dlg_window_new("Ethereal: Compute LDAP Service Response Time statistics");
283 gtk_window_set_default_size(GTK_WINDOW(dlg), 300, -1);
285 dlg_box=gtk_vbox_new(FALSE, 10);
286 gtk_container_border_width(GTK_CONTAINER(dlg_box), 10);
287 gtk_container_add(GTK_CONTAINER(dlg), dlg_box);
288 gtk_widget_show(dlg_box);
291 filter_box=gtk_hbox_new(FALSE, 3);
294 filter_bt=BUTTON_NEW_FROM_STOCK(ETHEREAL_STOCK_DISPLAY_FILTER_ENTRY);
295 SIGNAL_CONNECT(filter_bt, "clicked", display_filter_construct_cb, &args);
296 gtk_box_pack_start(GTK_BOX(filter_box), filter_bt, FALSE, FALSE, 0);
297 gtk_widget_show(filter_bt);
300 filter_entry=gtk_entry_new();
301 SIGNAL_CONNECT(filter_entry, "changed", filter_te_syntax_check_cb, NULL);
303 /* filter prefs dialog */
304 OBJECT_SET_DATA(filter_bt, E_FILT_TE_PTR_KEY, filter_entry);
305 /* filter prefs dialog */
307 gtk_box_pack_start(GTK_BOX(filter_box), filter_entry, TRUE, TRUE, 0);
308 filter=gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget));
310 gtk_entry_set_text(GTK_ENTRY(filter_entry), filter);
312 gtk_widget_show(filter_entry);
314 gtk_box_pack_start(GTK_BOX(dlg_box), filter_box, TRUE, TRUE, 0);
315 gtk_widget_show(filter_box);
318 bbox = dlg_button_row_new(ETHEREAL_STOCK_CREATE_STAT, GTK_STOCK_CANCEL, NULL);
319 gtk_box_pack_start(GTK_BOX(dlg_box), bbox, FALSE, FALSE, 0);
320 gtk_widget_show(bbox);
322 start_button = OBJECT_GET_DATA(bbox, ETHEREAL_STOCK_CREATE_STAT);
323 SIGNAL_CONNECT_OBJECT(start_button, "clicked",
324 ldapstat_start_button_clicked, NULL);
326 cancel_button = OBJECT_GET_DATA(bbox, GTK_STOCK_CANCEL);
327 window_set_cancel_button(dlg, cancel_button, window_cancel_button_cb);
329 /* Catch the "activate" signal on the filter text entry, so that
330 if the user types Return there, we act as if the "Create Stat"
331 button had been selected, as happens if Return is typed if some
332 widget that *doesn't* handle the Return key has the input
334 dlg_set_activate(filter_entry, start_button);
336 gtk_widget_grab_default(start_button );
338 /* Give the initial focus to the "Filter" entry box. */
339 gtk_widget_grab_focus(filter_entry);
341 SIGNAL_CONNECT(dlg, "destroy", dlg_destroy_cb, NULL);
343 gtk_widget_show_all(dlg);
348 register_tap_listener_gtkldapstat(void)
350 register_ethereal_tap("ldap,srt", gtk_ldapstat_init);
352 register_tap_menu_item("LDAP...", REGISTER_TAP_GROUP_RESPONSE_TIME,
353 gtk_ldapstat_cb, NULL, NULL, NULL);