2 * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
4 * Wireshark - Network traffic analyzer
5 * By Gerald Combs <gerald@wireshark.org>
6 * Copyright 1998 Gerald Combs
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 #include "epan/to_str.h"
30 #include <epan/stat_groups.h>
32 #include "ui/gtk/gui_stat_menu.h"
33 #include "ui/gtk/gui_utils.h"
34 #include "ui/gtk/main.h"
35 #include "ui/gtk/sctp_stat_gtk.h"
36 #include "ui/gtk/gtkglobals.h"
38 #include "ui/gtk/stock_icons.h"
40 static GtkWidget *sctp_stat_dlg = NULL;
41 static GtkWidget *clist = NULL;
42 static GList *last_list = NULL;
43 static gchar *filter_string = NULL;
44 static sctp_assoc_info_t *selected_stream = NULL; /* current selection */
45 static sctp_allassocs_info_t *sctp_assocs = NULL;
46 static guint16 n_children = 0;
47 static GtkWidget *bt_afilter = NULL, *bt_unselect = NULL, *bt_analyse = NULL, *bt_filter = NULL;
48 static gboolean prevent_update = FALSE, filter_applied = FALSE;
56 CHECKSUM_ERRORS_COLUMN,
66 sctp_stat_on_select_row(GtkTreeSelection *sel, gpointer user_data _U_)
71 sctp_assoc_info_t *assoc;
72 gboolean stream_found = FALSE;
74 guint32 checksum, data_chunks, data_bytes, packets, vtag1, vtag2;
76 if (gtk_tree_selection_get_selected(sel, &model, &iter)) {
77 gtk_tree_model_get(model, &iter,
80 PACKETS_COLUMN, &packets,
81 CHECKSUM_ERRORS_COLUMN, &checksum,
82 DATA_CHUNKS_COLUMN, &data_chunks,
83 DATA_BYTES_COLUMN, &data_bytes,
88 /* Nothing selected */
92 list = g_list_first(sctp_assocs->assoc_info_list);
96 assoc = (sctp_assoc_info_t*)(list->data);
97 if ((assoc->port1 == port1) && (assoc->port2 == port2)
98 && (assoc->n_packets == packets)
99 && (assoc->n_data_chunks == data_chunks)
100 && (assoc->n_data_bytes == data_bytes)
101 && (assoc->verification_tag1 == vtag1) && (assoc->verification_tag2 == vtag2))
103 selected_stream = assoc;
107 list = g_list_next(list);
111 selected_stream = NULL;
113 gtk_widget_set_sensitive(bt_unselect,TRUE);
114 gtk_widget_set_sensitive(bt_analyse,TRUE);
115 gtk_widget_set_sensitive(bt_filter,TRUE);
119 GtkWidget *create_list(void)
121 GtkListStore *list_store;
123 GtkTreeViewColumn *column;
124 GtkCellRenderer *renderer;
125 GtkTreeView *list_view;
126 GtkTreeSelection *selection;
128 list_store = gtk_list_store_new(N_COLUMN,
129 G_TYPE_UINT, /* Port1*/
130 G_TYPE_UINT, /* Port2*/
131 G_TYPE_UINT, /* number of packets */
132 G_TYPE_STRING, /* checksum type */
133 G_TYPE_UINT, /* number of checksum errors */
134 G_TYPE_UINT, /* number of data chunks */
135 G_TYPE_UINT, /* number of data bytes */
136 G_TYPE_UINT, /* vtag1 */
137 G_TYPE_UINT); /* vtag2 */
140 list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store));
142 list_view = GTK_TREE_VIEW(list);
144 /* Speed up the list display */
145 gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
147 gtk_tree_view_set_headers_clickable(list_view, TRUE);
149 /* The view now holds a reference. We can get rid of our own reference */
150 g_object_unref(G_OBJECT(list_store));
153 * Create the first column packet, associating the "text" attribute of the
154 * cell_renderer to the first column of the model
157 renderer = gtk_cell_renderer_text_new();
158 column = gtk_tree_view_column_new_with_attributes("Port 1", renderer,
159 "text", PORT1_COLUMN,
162 gtk_tree_view_column_set_sort_column_id(column, PORT1_COLUMN);
163 gtk_tree_view_column_set_resizable(column, TRUE);
164 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
165 gtk_tree_view_column_set_min_width(column, 80);
167 /* Add the column to the view. */
168 gtk_tree_view_append_column(list_view, column);
171 renderer = gtk_cell_renderer_text_new();
172 column = gtk_tree_view_column_new_with_attributes("Port 2", renderer,
173 "text", PORT2_COLUMN,
175 gtk_tree_view_column_set_sort_column_id(column, PORT2_COLUMN);
176 gtk_tree_view_column_set_resizable(column, TRUE);
177 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
178 gtk_tree_view_column_set_min_width(column, 80);
179 gtk_tree_view_append_column(list_view, column);
182 renderer = gtk_cell_renderer_text_new();
183 column = gtk_tree_view_column_new_with_attributes("No of Packets", renderer,
184 "text", PACKETS_COLUMN,
186 gtk_tree_view_column_set_sort_column_id(column, PACKETS_COLUMN);
187 gtk_tree_view_column_set_resizable(column, TRUE);
188 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
189 gtk_tree_view_column_set_min_width(column, 120);
190 gtk_tree_view_append_column(list_view, column);
193 renderer = gtk_cell_renderer_text_new();
194 column = gtk_tree_view_column_new_with_attributes("Checksum", renderer,
195 "text", CHECKSUM_TYPE_COLUMN,
197 gtk_tree_view_column_set_sort_column_id(column, CHECKSUM_TYPE_COLUMN);
198 gtk_tree_view_column_set_resizable(column, TRUE);
199 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
200 gtk_tree_view_column_set_min_width(column, 120);
201 gtk_tree_view_append_column(list_view, column);
204 renderer = gtk_cell_renderer_text_new();
205 column = gtk_tree_view_column_new_with_attributes("No of Errors", renderer,
206 "text", CHECKSUM_ERRORS_COLUMN,
208 gtk_tree_view_column_set_sort_column_id(column, CHECKSUM_ERRORS_COLUMN);
209 gtk_tree_view_column_set_resizable(column, TRUE);
210 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
211 gtk_tree_view_column_set_min_width(column, 120);
212 gtk_tree_view_append_column(list_view, column);
215 renderer = gtk_cell_renderer_text_new();
216 column = gtk_tree_view_column_new_with_attributes("Data Chunks", renderer,
217 "text", DATA_CHUNKS_COLUMN,
219 gtk_tree_view_column_set_sort_column_id(column, DATA_CHUNKS_COLUMN);
220 gtk_tree_view_column_set_resizable(column, TRUE);
221 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
222 gtk_tree_view_column_set_min_width(column, 120);
223 gtk_tree_view_append_column(list_view, column);
226 renderer = gtk_cell_renderer_text_new();
227 column = gtk_tree_view_column_new_with_attributes("Data Bytes", renderer,
228 "text", DATA_BYTES_COLUMN,
230 gtk_tree_view_column_set_sort_column_id(column, DATA_BYTES_COLUMN);
231 gtk_tree_view_column_set_resizable(column, TRUE);
232 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
233 gtk_tree_view_column_set_min_width(column, 120);
234 gtk_tree_view_append_column(list_view, column);
237 renderer = gtk_cell_renderer_text_new();
238 column = gtk_tree_view_column_new_with_attributes("VTag 1", renderer,
239 "text", VTAG1_COLUMN,
241 gtk_tree_view_column_set_sort_column_id(column, VTAG1_COLUMN);
242 gtk_tree_view_column_set_resizable(column, TRUE);
243 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
244 gtk_tree_view_column_set_min_width(column, 120);
245 gtk_tree_view_append_column(list_view, column);
249 renderer = gtk_cell_renderer_text_new();
250 column = gtk_tree_view_column_new_with_attributes("VTag 2", renderer,
251 "text", VTAG2_COLUMN,
253 gtk_tree_view_column_set_sort_column_id(column, VTAG2_COLUMN);
254 gtk_tree_view_column_set_resizable(column, TRUE);
255 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
256 gtk_tree_view_column_set_min_width(column, 120);
257 gtk_tree_view_append_column(list_view, column);
259 /* Now enable the sorting of each column */
260 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
261 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
263 /* Setup the selection handler */
264 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
265 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
266 g_signal_connect(selection, "changed", G_CALLBACK(sctp_stat_on_select_row), NULL);
271 dlg_destroy(GtkWidget *w _U_, gpointer user_data _U_)
275 struct sctp_analyse *child_data;
280 list = g_list_last(sctp_assocs->children);
281 child_data = (struct sctp_analyse *)list->data;
282 gtk_grab_remove(GTK_WIDGET(child_data->window));
283 gtk_widget_destroy(GTK_WIDGET(child_data->window));
285 g_list_free(sctp_assocs->children);
286 sctp_assocs->children = NULL;
287 sctp_stat_dlg = NULL;
288 prevent_update = FALSE;
289 filter_applied = FALSE;
293 decrease_analyse_childcount(void)
299 increase_analyse_childcount(void)
305 set_analyse_child(struct sctp_analyse *child)
307 sctp_assocs->children = g_list_append(sctp_assocs->children, child);
311 remove_analyse_child(struct sctp_analyse *child)
313 sctp_assocs->children = g_list_remove(sctp_assocs->children, child);
318 static void add_to_clist(sctp_assoc_info_t* assinfo)
320 GtkListStore *list_store;
323 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))); /* Get store */
325 gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
326 PORT1_COLUMN, (guint32)assinfo->port1,
327 PORT2_COLUMN, (guint32)assinfo->port2,
328 PACKETS_COLUMN, assinfo->n_packets,
329 CHECKSUM_TYPE_COLUMN, assinfo->checksum_type,
330 CHECKSUM_ERRORS_COLUMN, assinfo->n_checksum_errors,
331 DATA_CHUNKS_COLUMN, assinfo->n_data_chunks,
332 DATA_BYTES_COLUMN, assinfo->n_data_bytes,
333 VTAG1_COLUMN, assinfo->verification_tag1,
334 VTAG2_COLUMN, assinfo->verification_tag2,
339 sctp_stat_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
341 if (filter_string != NULL) {
342 g_free(filter_string);
343 filter_string = NULL;
346 selected_stream = NULL;
347 gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), "");
348 main_filter_packets(&cfile, "", FALSE);
349 gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(clist)));
350 gtk_widget_set_sensitive(bt_unselect,FALSE);
351 gtk_widget_set_sensitive(bt_filter,FALSE);
352 gtk_widget_set_sensitive(bt_analyse,FALSE);
353 gtk_widget_set_sensitive(bt_afilter,FALSE);
354 prevent_update = FALSE;
355 filter_applied = FALSE;
358 void sctp_stat_dlg_update(void)
362 list = (sctp_stat_get_info()->assoc_info_list);
363 if ((sctp_stat_dlg != NULL) && !prevent_update)
365 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
366 list = g_list_first(sctp_stat_get_info()->assoc_info_list);
370 add_to_clist((sctp_assoc_info_t*)(list->data));
371 list = g_list_next(list);
380 sctp_stat_on_apply_filter(GtkButton *button _U_, gpointer user_data _U_)
383 sctp_assoc_info_t *assoc;
384 guint16 port1, port2;
385 guint32 data_chunks, data_bytes, packets, vtag1, vtag2;
387 if (filter_string != NULL)
389 port1 = selected_stream->port1;
390 port2 = selected_stream->port2;
391 data_chunks = selected_stream->n_data_chunks;
392 data_bytes = selected_stream->n_data_bytes;
393 packets = selected_stream->n_packets;
394 vtag1 = selected_stream->verification_tag1;
395 vtag2 = selected_stream->verification_tag2;
396 main_filter_packets(&cfile, filter_string, FALSE);
397 list = g_list_first(sctp_assocs->assoc_info_list);
401 assoc = (sctp_assoc_info_t*)(list->data);
402 if ((assoc->port1 == port1) && (assoc->port2 == port2)
403 && (assoc->n_packets == packets)
404 && (assoc->n_data_chunks == data_chunks)
405 && (assoc->n_data_bytes == data_bytes)
406 && (assoc->verification_tag1 == vtag1) && (assoc->verification_tag2 == vtag2))
408 selected_stream = assoc;
411 list = g_list_next(list);
413 gtk_widget_set_sensitive(bt_afilter,FALSE);
414 prevent_update = TRUE;
415 filter_applied = TRUE;
420 sctp_stat_on_filter(GtkButton *button _U_, gpointer user_data _U_)
422 if (selected_stream == NULL) {
423 gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), "");
427 if (selected_stream->check_address == FALSE)
431 f_string = g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && "
432 "((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
433 "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) || "
434 "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || "
435 "sctp.shutdown_complete_t_bit==1)))) ||"
436 "(sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x "
437 "&& sctp.verification_tag!=0x0) || "
438 "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
439 "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 ||"
440 " sctp.shutdown_complete_t_bit==1)))))",
441 selected_stream->port1,
442 selected_stream->port2,
443 selected_stream->verification_tag1,
444 selected_stream->initiate_tag,
445 selected_stream->verification_tag2,
446 selected_stream->port2,
447 selected_stream->port1,
448 selected_stream->verification_tag2,
449 selected_stream->initiate_tag,
450 selected_stream->verification_tag1);
451 filter_string = f_string;
457 GList *srclist, *dstlist;
458 struct sockaddr_in *infosrc;
459 struct sockaddr_in *infodst;
463 srclist = g_list_first(selected_stream->addr1);
464 infosrc = (struct sockaddr_in *)(srclist->data);
465 set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
466 addr_str = (char*)address_to_str(NULL, &addr);
467 gstring = g_string_new(g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && (ip.src==%s",
468 selected_stream->port1, selected_stream->port2, addr_str));
469 srclist= g_list_next(srclist);
470 wmem_free(NULL, addr_str);
474 infosrc = (struct sockaddr_in *)(srclist->data);
475 set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
476 addr_str = (char*)address_to_str(NULL, &addr);
477 str = g_strdup_printf("|| ip.src==%s", addr_str);
478 g_string_append(gstring, str);
479 wmem_free(NULL, addr_str);
480 srclist = g_list_next(srclist);
482 dstlist = g_list_first(selected_stream->addr2);
483 infodst = (struct sockaddr_in *)(dstlist->data);
484 set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
485 addr_str = (char*)address_to_str(NULL, &addr);
486 str = g_strdup_printf(") && (ip.dst==%s", addr_str);
487 g_string_append(gstring, str);
488 wmem_free(NULL, addr_str);
489 dstlist = g_list_next(dstlist);
492 infodst = (struct sockaddr_in *)(dstlist->data);
493 set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
494 addr_str = (char*)address_to_str(NULL, &addr);
495 str = g_strdup_printf("|| ip.dst==%s", addr_str);
496 g_string_append(gstring, str);
497 wmem_free(NULL, addr_str);
498 dstlist = g_list_next(dstlist);
500 srclist = g_list_first(selected_stream->addr1);
501 infosrc = (struct sockaddr_in *)(srclist->data);
502 set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
503 addr_str = (char*)address_to_str(NULL, &addr);
504 str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
505 selected_stream->port1, selected_stream->port2, addr_str);
506 g_string_append(gstring, str);
507 wmem_free(NULL, addr_str);
508 srclist = g_list_next(srclist);
512 infosrc = (struct sockaddr_in *)(srclist->data);
513 set_address(&addr, AT_IPv4, 4, &(infosrc->sin_addr.s_addr));
514 addr_str = (char*)address_to_str(NULL, &addr);
515 str = g_strdup_printf("|| ip.dst==%s", addr_str);
516 g_string_append(gstring, str);
517 wmem_free(NULL, addr_str);
518 srclist= g_list_next(srclist);
521 dstlist = g_list_first(selected_stream->addr2);
522 infodst = (struct sockaddr_in *)(dstlist->data);
523 set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
524 addr_str = (char*)address_to_str(NULL, &addr);
525 str = g_strdup_printf(") && (ip.src==%s", addr_str);
526 g_string_append(gstring, str);
527 wmem_free(NULL, addr_str);
528 dstlist = g_list_next(dstlist);
531 infodst = (struct sockaddr_in *)(dstlist->data);
532 set_address(&addr, AT_IPv4, 4, &(infodst->sin_addr.s_addr));
533 addr_str = (char*)address_to_str(NULL, &addr);
534 str = g_strdup_printf("|| ip.src==%s", addr_str);
535 g_string_append(gstring, str);
536 wmem_free(NULL, addr_str);
537 dstlist = g_list_next(dstlist);
539 str = g_strdup_printf(")))");
540 g_string_append(gstring, str);
541 filter_string = g_string_free(gstring,FALSE);
544 if (filter_string != NULL) {
545 gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
547 g_assert_not_reached();
549 gtk_widget_set_sensitive(bt_afilter,TRUE);
550 gtk_widget_set_sensitive(bt_filter,FALSE);
551 prevent_update = TRUE;
552 filter_applied = FALSE;
557 sctp_stat_on_close(GtkWidget *button _U_, gpointer user_data _U_)
559 gtk_grab_remove(sctp_stat_dlg);
560 gtk_widget_destroy(sctp_stat_dlg);
561 prevent_update = FALSE;
562 filter_applied = FALSE;
566 sctp_stat_on_analyse(GtkButton *button _U_, gpointer user_data _U_)
568 if (selected_stream == NULL)
571 assoc_analyse(selected_stream);
572 gtk_widget_set_sensitive(bt_analyse,FALSE);
574 gtk_widget_set_sensitive(bt_filter,TRUE);
575 prevent_update = TRUE;
580 gtk_sctpstat_dlg(void)
582 GtkWidget *sctp_stat_dlg_w;
584 GtkWidget *scrolledwindow1;
585 GtkWidget *hbuttonbox2;
588 sctp_stat_dlg_w = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: SCTP Associations");
589 gtk_window_set_position(GTK_WINDOW(sctp_stat_dlg_w), GTK_WIN_POS_CENTER);
590 gtk_window_set_default_size(GTK_WINDOW(sctp_stat_dlg_w), 1000, 300);
591 g_signal_connect(sctp_stat_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
593 /* Container for each row of widgets */
594 vbox1 = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 2, FALSE);
595 gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
596 gtk_container_add(GTK_CONTAINER(sctp_stat_dlg_w), vbox1);
597 gtk_widget_show(vbox1);
599 scrolledwindow1 = scrolled_window_new(NULL, NULL);
600 gtk_widget_show(scrolledwindow1);
601 gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
603 clist = create_list();
604 gtk_widget_show(clist);
605 gtk_container_add(GTK_CONTAINER(scrolledwindow1), clist);
606 gtk_widget_set_size_request(clist, 1050, 200);
608 gtk_widget_show(sctp_stat_dlg_w);
610 hbuttonbox2 = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
611 gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox2, FALSE, FALSE, 0);
612 gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox2), 10);
613 gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox2), GTK_BUTTONBOX_SPREAD);
614 gtk_box_set_spacing(GTK_BOX(hbuttonbox2), 0);
615 gtk_widget_show(hbuttonbox2);
617 bt_unselect = gtk_button_new_with_label("Unselect");
618 gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_unselect);
619 gtk_widget_show(bt_unselect);
620 gtk_widget_set_sensitive(bt_unselect,FALSE);
622 bt_filter = gtk_button_new_with_label("Set filter");
623 gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_filter);
624 gtk_widget_show(bt_filter);
625 gtk_widget_set_sensitive(bt_filter,FALSE);
627 bt_afilter = gtk_button_new_with_label("Apply filter");
628 gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_afilter);
629 gtk_widget_show(bt_afilter);
630 gtk_widget_set_sensitive(bt_afilter,FALSE);
632 bt_analyse = gtk_button_new_with_label("Analyse");
633 gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_analyse);
634 gtk_widget_show(bt_analyse);
635 gtk_widget_set_sensitive(bt_analyse,FALSE);
637 bt_close = ws_gtk_button_new_from_stock(GTK_STOCK_CLOSE);
638 gtk_container_add(GTK_CONTAINER(hbuttonbox2), bt_close);
639 gtk_widget_set_can_default(bt_close, TRUE);
640 window_set_cancel_button(sctp_stat_dlg_w, bt_close, sctp_stat_on_close);
641 gtk_widget_grab_focus(bt_close);
642 gtk_widget_show(bt_close);
644 g_signal_connect(sctp_stat_dlg_w, "destroy", G_CALLBACK(dlg_destroy), NULL);
645 g_signal_connect(bt_unselect, "clicked", G_CALLBACK(sctp_stat_on_unselect), NULL);
646 g_signal_connect(bt_filter, "clicked", G_CALLBACK(sctp_stat_on_filter), NULL);
647 g_signal_connect(bt_afilter, "clicked", G_CALLBACK(sctp_stat_on_apply_filter), NULL);
648 g_signal_connect(bt_analyse, "clicked", G_CALLBACK(sctp_stat_on_analyse), NULL);
650 sctp_stat_dlg = sctp_stat_dlg_w;
651 cf_retap_packets(&cfile);
652 gdk_window_raise(gtk_widget_get_window(sctp_stat_dlg_w));
656 static void sctp_stat_dlg_show(void)
658 if (sctp_stat_dlg != NULL)
660 /* There's already a dialog box; reactivate it. */
661 reactivate_window(sctp_stat_dlg);
662 /* Another list since last call? */
663 if ((sctp_stat_get_info()->assoc_info_list) != last_list)
664 sctp_stat_dlg_update();
668 /* Create and show the dialog box */
670 sctp_stat_dlg_update();
675 void sctp_stat_start(GtkAction *action _U_, gpointer user_data _U_)
677 prevent_update = FALSE;
678 filter_applied = FALSE;
679 sctp_assocs = (sctp_allassocs_info_t *)g_malloc(sizeof(sctp_allassocs_info_t));
680 sctp_assocs = (sctp_allassocs_info_t*)sctp_stat_get_info();
681 /* Register the tap listener */
682 if (sctp_stat_get_info()->is_registered == FALSE)
683 register_tap_listener_sctp_stat();
684 /* (redissect all packets) */
687 /* Show the dialog box with the list of streams */
688 sctp_stat_dlg_show();
691 /****************************************************************************/
693 GtkWidget *get_stat_dlg(void)
695 return sctp_stat_dlg;
700 * Editor modelines - http://www.wireshark.org/tools/modelines.html
705 * indent-tabs-mode: t
708 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
709 * :indentSize=8:tabSize=8:noTabs=false: