2 * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
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.
31 #include <epan/epan_dissect.h>
32 #include "epan/filesystem.h"
33 #include <epan/strutil.h>
35 #include "../globals.h"
36 #include "../simple_dialog.h"
37 #include "../stat_menu.h"
39 #include "gtk/gui_stat_menu.h"
40 #include "gtk/dlg_utils.h"
41 #include "gtk/gui_utils.h"
43 #include "gtk/sctp_stat.h"
44 #include "gtk/gtkglobals.h"
46 static sctp_assoc_info_t static_assoc;
49 decrease_childcount(struct sctp_analyse *parent)
51 if (parent->num_children > 0)
52 parent->num_children--;
56 increase_childcount(struct sctp_analyse *parent)
58 parent->num_children++;
62 set_child(struct sctp_udata *child, struct sctp_analyse *parent)
64 parent->children = g_list_append(parent->children, child);
68 remove_child(struct sctp_udata *child, struct sctp_analyse *parent)
70 parent->children = g_list_remove(parent->children, child);
74 on_destroy(GObject *object _U_, gpointer user_data)
76 struct sctp_analyse *u_data;
79 struct sctp_udata *child_data;
81 u_data = (struct sctp_analyse*)user_data;
85 gtk_grab_remove(GTK_WIDGET(u_data->window));
86 gtk_widget_destroy(GTK_WIDGET(u_data->window));
88 if (u_data->num_children>0)
90 j = u_data->num_children;
93 list = g_list_last(u_data->children);
94 child_data = (struct sctp_udata *)list->data;
95 gtk_grab_remove(GTK_WIDGET(child_data->io->window));
96 gtk_widget_destroy(GTK_WIDGET(child_data->io->window));
97 list = g_list_previous(list);
99 g_list_free(u_data->children);
100 u_data->children = NULL;
103 g_free(u_data->analyse_nb->page2);
104 g_free(u_data->analyse_nb->page3);
105 g_free(u_data->analyse_nb);
106 if (sctp_stat_get_info()->children != NULL)
108 remove_analyse_child(u_data);
109 decrease_analyse_childcount();
115 on_notebook_switch_page(void)
119 static void on_chunk_stat_bt(GtkWidget *widget _U_, struct sctp_analyse* u_data)
121 sctp_assoc_info_t* assinfo = NULL;
124 assinfo = &static_assoc;
125 assinfo->addr_chunk_count = (static_assoc.addr_chunk_count);
126 for (i=0; i<NUM_CHUNKS; i++)
128 assinfo->chunk_count[i] = static_assoc.chunk_count[i];
129 assinfo->ep1_chunk_count[i] = static_assoc.ep1_chunk_count[i];
130 assinfo->ep2_chunk_count[i] = static_assoc.ep2_chunk_count[i];
132 u_data->assoc = assinfo;
133 sctp_chunk_dlg_show(u_data);
136 static void on_close_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
141 gtk_grab_remove(GTK_WIDGET(u_data->window));
142 gtk_widget_destroy(GTK_WIDGET(u_data->window));
146 static void on_chunk1_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
148 sctp_assoc_info_t* assinfo = NULL;
150 assinfo = &static_assoc;
151 assinfo->addr_chunk_count = (static_assoc.addr_chunk_count);
152 u_data->assoc = assinfo;
153 sctp_chunk_stat_dlg_show(1, u_data);
156 static void on_chunk2_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
158 sctp_assoc_info_t* assinfo=NULL;
160 assinfo = &static_assoc;
161 assinfo->addr_chunk_count = (static_assoc.addr_chunk_count);
162 u_data->assoc = assinfo;
163 sctp_chunk_stat_dlg_show(2, u_data);
166 static void on_graph1_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
168 create_graph(1, u_data);
171 static void on_graph2_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
173 create_graph(2, u_data);
176 static void on_graph_byte1_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
178 create_byte_graph(1, u_data);
181 static void on_graph_byte2_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
183 create_byte_graph(2, u_data);
187 update_analyse_dlg(struct sctp_analyse* u_data)
190 gchar field[1][MAX_ADDRESS_LEN];
192 address *store = NULL;
193 GtkListStore *list_store = NULL;
196 if (u_data->assoc == NULL)
199 if (u_data->window != NULL)
201 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
202 (u_data->analyse_nb->page2->clist))));
203 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW
204 (u_data->analyse_nb->page3->clist))));
208 g_snprintf(label_txt, sizeof(label_txt),"Checksum Type: %s",u_data->assoc->checksum_type);
209 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->checktype), label_txt);
210 g_snprintf(label_txt, sizeof(label_txt),"Checksum Errors: %u",u_data->assoc->n_checksum_errors);
211 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->checksum), label_txt);
212 g_snprintf(label_txt, sizeof(label_txt),"Bundling Errors: %u",u_data->assoc->n_bundling_errors);
213 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bundling), label_txt);
214 g_snprintf(label_txt, sizeof(label_txt),"Padding Errors: %u",u_data->assoc->n_padding_errors);
215 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->padding), label_txt);
216 g_snprintf(label_txt, sizeof(label_txt),"Length Errors: %u",u_data->assoc->n_length_errors);
217 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->length), label_txt);
218 g_snprintf(label_txt, sizeof(label_txt),"Value Errors: %u",u_data->assoc->n_value_errors);
219 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->value), label_txt);
220 g_snprintf(label_txt, sizeof(label_txt),"No of Data Chunks from EP1 to EP2: %u",u_data->assoc->n_data_chunks_ep1);
221 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->chunks_ep1), label_txt);
222 g_snprintf(label_txt, sizeof(label_txt),"No of Data Bytes from EP1 to EP2: %u",u_data->assoc->n_data_bytes_ep1);
223 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bytes_ep1), label_txt);
224 g_snprintf(label_txt, sizeof(label_txt),"No of Data Chunks from EP2 to EP1: %u",u_data->assoc->n_data_chunks_ep2);
225 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->chunks_ep2), label_txt);
226 g_snprintf(label_txt, sizeof(label_txt),"No of Data Bytes from EP2 to EP1: %u",u_data->assoc->n_data_bytes_ep2);
227 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bytes_ep2), label_txt);
229 if (u_data->assoc->init == TRUE)
230 gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page2->addr_frame), "Complete list of IP-Addresses as provided in the INIT-Chunk");
231 else if (u_data->assoc->initack == TRUE && u_data->assoc->initack_dir == 1)
232 gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page2->addr_frame), "Complete list of IP-Addresses as provided in the INITACK-Chunk");
234 gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page2->addr_frame), "List of used IP-Addresses");
238 if (u_data->assoc->addr1 != NULL)
240 list = g_list_first(u_data->assoc->addr1);
243 store = (address *) (list->data);
244 if (store->type == AT_IPv4)
246 g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)(store->data)));
248 else if (store->type == AT_IPv6)
250 g_snprintf(field[0], 40, "%s", ip6_to_str((const struct e_in6_addr *)(store->data)));
252 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (u_data->analyse_nb->page2->clist))); /* Get store */
254 gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
256 list = g_list_next(list);
263 g_snprintf(label_txt, sizeof(label_txt),"Port: %u",u_data->assoc->port1);
264 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->port), label_txt);
265 g_snprintf(label_txt, sizeof(label_txt),"Sent Verification Tag: 0x%x",u_data->assoc->verification_tag1);
266 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->veritag), label_txt);
268 if (u_data->assoc->init == TRUE || (u_data->assoc->initack == TRUE && u_data->assoc->initack_dir == 1))
270 g_snprintf(label_txt, sizeof(label_txt),"Requested Number of Inbound Streams: %u",u_data->assoc->instream1);
271 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_in), label_txt);
272 g_snprintf(label_txt, sizeof(label_txt),"Minimum Number of Inbound Streams: %u",((u_data->assoc->instream1>u_data->assoc->outstream2)?u_data->assoc->outstream2:u_data->assoc->instream1));
273 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->min_in), label_txt);
275 g_snprintf(label_txt, sizeof(label_txt),"Provided Number of Outbound Streams: %u",u_data->assoc->outstream1);
276 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_out), label_txt);
277 g_snprintf(label_txt, sizeof(label_txt),"Minimum Number of Outbound Streams: %u",((u_data->assoc->outstream1>u_data->assoc->instream2)?u_data->assoc->instream2:u_data->assoc->outstream1));
278 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_out), label_txt);
282 g_snprintf(label_txt, sizeof(label_txt),"Used Number of Inbound Streams: %u",u_data->assoc->instream1);
283 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_in), label_txt);
284 g_snprintf(label_txt, sizeof(label_txt),"Used Number of Outbound Streams: %u",u_data->assoc->outstream1);
285 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_out), label_txt);
288 if (u_data->assoc->initack == TRUE && u_data->assoc->initack_dir == 2)
289 gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page3->addr_frame), "Complete list of IP-Addresses as provided in the INITACK-Chunk");
291 gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page3->addr_frame), "List of used IP-Addresses");
294 if (u_data->assoc->addr2 != NULL)
297 list = g_list_first(u_data->assoc->addr2);
301 store = (address *) (list->data);
302 if (store->type == AT_IPv4)
304 g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)(store->data)));
306 else if (store->type == AT_IPv6)
308 g_snprintf(field[0], 40, "%s", ip6_to_str((const struct e_in6_addr *)(store->data)));
310 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (u_data->analyse_nb->page3->clist))); /* Get store */
312 gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
314 list = g_list_next(list);
322 g_snprintf(label_txt, sizeof(label_txt),"Port: %u",u_data->assoc->port2);
323 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->port), label_txt);
324 g_snprintf(label_txt, sizeof(label_txt),"Sent Verification Tag: 0x%x",u_data->assoc->verification_tag2);
325 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->veritag), label_txt);
327 if (u_data->assoc->initack == TRUE)
329 g_snprintf(label_txt, sizeof(label_txt),"Requested Number of Inbound Streams: %u",u_data->assoc->instream2);
330 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_in), label_txt);
331 g_snprintf(label_txt, sizeof(label_txt),"Minimum Number of Inbound Streams: %u",((u_data->assoc->instream2>u_data->assoc->outstream1)?u_data->assoc->outstream1:u_data->assoc->instream2));
332 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_in), label_txt);
334 g_snprintf(label_txt, sizeof(label_txt),"Provided Number of Outbound Streams: %u",u_data->assoc->outstream2);
335 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_out), label_txt);
336 g_snprintf(label_txt, sizeof(label_txt),"Minimum Number of Outbound Streams: %u",((u_data->assoc->outstream2>u_data->assoc->instream1)?u_data->assoc->instream1:u_data->assoc->outstream2));
337 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_out), label_txt);
341 g_snprintf(label_txt, sizeof(label_txt),"Used Number of Inbound Streams: %u",u_data->assoc->instream2);
342 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_in), label_txt);
343 g_snprintf(label_txt, sizeof(label_txt),"Used Number of Outbound Streams: %u",u_data->assoc->outstream2);
344 gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_out), label_txt);
350 sctp_set_filter (GtkButton *button _U_, struct sctp_analyse* u_data)
352 gchar *f_string = NULL;
353 GList *srclist, *dstlist;
355 GString *gstring=NULL;
356 struct sockaddr_in *infosrc=NULL;
357 struct sockaddr_in *infodst=NULL;
358 sctp_assoc_info_t *selected_stream;
359 gchar *filter_string = NULL;
360 selected_stream=u_data->assoc;
362 if (selected_stream->check_address==FALSE)
364 f_string = g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
365 "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) || "
366 "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || sctp.shutdown_complete_t_bit==1)))) ||"
367 "(sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
368 "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
369 "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || sctp.shutdown_complete_t_bit==1)))))",
370 selected_stream->port1,
371 selected_stream->port2,
372 selected_stream->verification_tag1,
373 selected_stream->initiate_tag,
374 selected_stream->verification_tag2,
375 selected_stream->port2,
376 selected_stream->port1,
377 selected_stream->verification_tag2,
378 selected_stream->initiate_tag,
379 selected_stream->verification_tag1);
380 filter_string = f_string;
384 srclist = g_list_first(selected_stream->addr1);
385 infosrc=(struct sockaddr_in *) (srclist->data);
386 gstring = g_string_new(g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && (ip.src==%s",
387 selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr))));
388 srclist= g_list_next(srclist);
392 infosrc=(struct sockaddr_in *) (srclist->data);
393 str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
394 g_string_append(gstring, str);
395 srclist= g_list_next(srclist);
398 dstlist = g_list_first(selected_stream->addr2);
399 infodst=(struct sockaddr_in *) (dstlist->data);
400 str = g_strdup_printf(") && (ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
401 g_string_append(gstring, str);
402 dstlist= g_list_next(dstlist);
405 infodst=(struct sockaddr_in *) (dstlist->data);
406 str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
407 g_string_append(gstring, str);
408 dstlist= g_list_next(dstlist);
411 srclist = g_list_first(selected_stream->addr1);
412 infosrc=(struct sockaddr_in *) (srclist->data);
413 str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
414 selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
415 g_string_append(gstring, str);
416 srclist= g_list_next(srclist);
420 infosrc=(struct sockaddr_in *) (srclist->data);
421 str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
422 g_string_append(gstring, str);
423 srclist= g_list_next(srclist);
426 dstlist = g_list_first(selected_stream->addr2);
427 infodst=(struct sockaddr_in *) (dstlist->data);
428 str = g_strdup_printf(") && (ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
429 g_string_append(gstring, str);
430 dstlist= g_list_next(dstlist);
433 infodst=(struct sockaddr_in *) (dstlist->data);
434 str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
435 g_string_append(gstring, str);
436 dstlist= g_list_next(dstlist);
438 str = g_strdup_printf(")))");
439 g_string_append(gstring, str);
440 filter_string = gstring->str;
441 g_string_free(gstring,FALSE);
444 if (filter_string != NULL) {
445 gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), filter_string);
447 g_assert_not_reached();
451 static void analyse_window_set_title(struct sctp_analyse *u_data)
458 title = g_strdup_printf("SCTP Analyse Association: %s Port1 %u Port2 %u", cf_get_display_name(&cfile), u_data->assoc->port1, u_data->assoc->port2);
459 gtk_window_set_title(GTK_WINDOW(u_data->window), title);
464 GtkWidget *create_list(void)
466 GtkListStore *list_store;
468 GtkTreeViewColumn *column;
469 GtkCellRenderer *renderer;
470 GtkTreeView *list_view;
471 list_store = gtk_list_store_new(1,
472 G_TYPE_STRING /* IP address */
476 list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
478 list_view = GTK_TREE_VIEW(list);
480 /* Speed up the list display */
481 gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
483 /* The view now holds a reference. We can get rid of our own reference */
484 g_object_unref (G_OBJECT (list_store));
487 * Create the first column packet, associating the "text" attribute of the
488 * cell_renderer to the first column of the model
490 renderer = gtk_cell_renderer_text_new ();
491 column = gtk_tree_view_column_new_with_attributes ("Address", renderer,
495 gtk_tree_view_column_set_resizable(column, TRUE);
496 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
497 gtk_tree_view_column_set_min_width(column, 300);
499 /* Add the column to the view. */
500 gtk_tree_view_append_column (list_view, column);
502 gtk_tree_view_set_headers_visible(list_view, FALSE);
506 static void create_analyse_window(struct sctp_analyse* u_data)
508 GtkWidget *window = NULL;
510 GtkWidget *main_vb, *page1, *page2, *page3, *hbox, *vbox_l, *vbox_r, *addr_hb, *stat_fr;
511 GtkWidget *hbox_l1, *hbox_l2,*label, *h_button_box;
512 GtkWidget *chunk_stat_bt, *close_bt, *graph_bt1, *graph_bt2, *chunk_bt1, *bt_filter;
514 u_data->analyse_nb = g_malloc(sizeof(struct notes));
515 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
516 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
517 g_signal_connect(window, "destroy", G_CALLBACK(on_destroy), u_data);
519 /* Container for each row of widgets */
520 main_vb = gtk_vbox_new(FALSE, 2);
521 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 2);
522 gtk_container_add(GTK_CONTAINER(window), main_vb);
523 gtk_widget_show(main_vb);
525 /* Start a notebook for flipping between sets of changes */
526 notebook = gtk_notebook_new();
527 gtk_container_add(GTK_CONTAINER(main_vb), notebook);
528 g_object_set_data(G_OBJECT(window), "notebook", notebook);
529 g_signal_connect(notebook, "switch_page", G_CALLBACK(on_notebook_switch_page), NULL);
531 page1 = gtk_vbox_new(FALSE, 8);
532 gtk_container_set_border_width(GTK_CONTAINER(page1), 8);
534 u_data->analyse_nb->checktype = gtk_label_new("");
535 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->checktype, TRUE, TRUE, 0);
537 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->checktype),0,0);
539 u_data->analyse_nb->checksum = gtk_label_new("");
540 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->checksum, TRUE, TRUE, 0);
541 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->checksum),0,0);
543 u_data->analyse_nb->bundling = gtk_label_new("");
544 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->bundling, TRUE, TRUE, 0);
545 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->bundling),0,0);
547 u_data->analyse_nb->padding = gtk_label_new("");
548 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->padding, TRUE, TRUE, 0);
549 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->padding),0,0);
551 u_data->analyse_nb->length = gtk_label_new("");
552 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->length, TRUE, TRUE, 0);
553 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->length),0,0);
555 u_data->analyse_nb->value = gtk_label_new("");
556 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->value, TRUE, TRUE, 0);
557 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->value),0,0);
560 u_data->analyse_nb->chunks_ep1 = gtk_label_new("");
561 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->chunks_ep1, TRUE, TRUE, 0);
562 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->chunks_ep1),0,0);
563 u_data->analyse_nb->bytes_ep1 = gtk_label_new("");
564 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->bytes_ep1, TRUE, TRUE, 0);
565 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->bytes_ep1),0,0);
566 u_data->analyse_nb->chunks_ep2 = gtk_label_new("");
567 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->chunks_ep2, TRUE, TRUE, 0);
568 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->chunks_ep2),0,0);
569 u_data->analyse_nb->bytes_ep2 = gtk_label_new("");
570 gtk_box_pack_start(GTK_BOX(page1), u_data->analyse_nb->bytes_ep2, TRUE, TRUE, 0);
571 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->bytes_ep2),0,0);
573 hbox = gtk_hbutton_box_new();
574 gtk_box_pack_start(GTK_BOX(page1), hbox, FALSE, FALSE, 0);
575 gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
576 gtk_button_box_set_layout(GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_SPREAD);
577 gtk_box_set_spacing(GTK_BOX (hbox), 0);
578 gtk_widget_show(hbox);
580 chunk_stat_bt = gtk_button_new_with_label ("Chunk Statistics");
581 gtk_box_pack_start(GTK_BOX(hbox), chunk_stat_bt, FALSE, FALSE, 0);
582 gtk_widget_show(chunk_stat_bt);
583 g_signal_connect(chunk_stat_bt, "clicked", G_CALLBACK(on_chunk_stat_bt), u_data);
585 bt_filter = gtk_button_new_with_label ("Set filter");
586 gtk_box_pack_start(GTK_BOX(hbox), bt_filter, FALSE, FALSE, 0);
587 gtk_widget_show (bt_filter);
588 g_signal_connect(bt_filter, "clicked", G_CALLBACK(sctp_set_filter), u_data);
590 close_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
591 gtk_box_pack_start(GTK_BOX(hbox), close_bt, FALSE, FALSE, 0);
592 gtk_widget_show(close_bt);
593 g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
596 label = gtk_label_new(" Statistics ");
597 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page1, label);
600 /* page for endpoint 1 */
601 page2 = gtk_vbox_new(FALSE, 8);
602 gtk_container_set_border_width(GTK_CONTAINER(page2), 8);
604 u_data->analyse_nb->page2 = g_malloc(sizeof(struct page));
606 u_data->analyse_nb->page2->addr_frame = gtk_frame_new(NULL);
607 gtk_container_add(GTK_CONTAINER(page2), u_data->analyse_nb->page2->addr_frame);
609 addr_hb = gtk_hbox_new(FALSE, 3);
610 gtk_container_set_border_width(GTK_CONTAINER(addr_hb), 5);
611 gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page2->addr_frame), addr_hb);
613 u_data->analyse_nb->page2->scrolled_window = scrolled_window_new(NULL, NULL);
614 gtk_widget_set_size_request(u_data->analyse_nb->page2->scrolled_window, 560, 100);
616 u_data->analyse_nb->page2->clist = create_list();
617 gtk_widget_show(u_data->analyse_nb->page2->clist);
619 gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page2->scrolled_window), u_data->analyse_nb->page2->clist);
621 gtk_box_pack_start(GTK_BOX(addr_hb), u_data->analyse_nb->page2->scrolled_window, TRUE, TRUE, 0);
622 gtk_widget_show(u_data->analyse_nb->page2->scrolled_window);
624 stat_fr = gtk_frame_new(NULL);
625 gtk_container_add(GTK_CONTAINER(page2), stat_fr);
627 hbox = gtk_hbox_new(FALSE,3);
628 gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
629 gtk_container_add(GTK_CONTAINER(stat_fr), hbox);
631 vbox_l = gtk_vbox_new(FALSE, 3);
632 gtk_box_pack_start(GTK_BOX(hbox), vbox_l, TRUE, TRUE, 0);
636 hbox_l1 = gtk_hbox_new(FALSE,3);
637 gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l1, TRUE, TRUE, 0);
639 u_data->analyse_nb->page2->port = gtk_label_new("");
640 gtk_box_pack_start(GTK_BOX(hbox_l1), u_data->analyse_nb->page2->port, TRUE, TRUE, 0);
641 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->port),0,0);
643 hbox_l2 = gtk_hbox_new(FALSE,3);
644 gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l2, TRUE, TRUE, 0);
647 u_data->analyse_nb->page2->veritag = gtk_label_new("");
649 gtk_box_pack_start(GTK_BOX(hbox_l2), u_data->analyse_nb->page2->veritag, TRUE, TRUE, 0);
650 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->veritag),0,0);
651 gtk_widget_show(vbox_l);
653 vbox_r = gtk_vbox_new(FALSE, 3);
654 gtk_box_pack_start(GTK_BOX(hbox), vbox_r, TRUE, TRUE, 0);
656 u_data->analyse_nb->page2->max_in = gtk_label_new("");
657 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->max_in, TRUE, TRUE, 0);
658 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->max_in),0,0);
659 u_data->analyse_nb->page2->min_in = gtk_label_new("");
660 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->min_in, TRUE, TRUE, 0);
661 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->min_in),0,0);
663 u_data->analyse_nb->page2->max_out = gtk_label_new("");
664 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->max_out, TRUE, TRUE, 0);
665 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->max_out),0,0);
666 u_data->analyse_nb->page2->min_out = gtk_label_new("");
667 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page2->min_out, TRUE, TRUE, 0);
668 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page2->min_out),0,0);
671 gtk_widget_show(vbox_r);
673 h_button_box=gtk_hbutton_box_new();
674 gtk_box_pack_start(GTK_BOX(page2), h_button_box, FALSE, FALSE, 0);
675 gtk_container_set_border_width(GTK_CONTAINER(h_button_box), 10);
676 gtk_button_box_set_layout(GTK_BUTTON_BOX (h_button_box), GTK_BUTTONBOX_SPREAD);
677 gtk_box_set_spacing(GTK_BOX (h_button_box), 0);
678 gtk_widget_show(h_button_box);
680 chunk_bt1 = gtk_button_new_with_label("Chunk Statistics");
681 gtk_box_pack_start(GTK_BOX(h_button_box), chunk_bt1, FALSE, FALSE, 0);
682 gtk_widget_show(chunk_bt1);
683 g_signal_connect(chunk_bt1, "clicked", G_CALLBACK(on_chunk1_dlg), u_data);
685 graph_bt1 = gtk_button_new_with_label("Graph TSN");
686 gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt1, FALSE, FALSE, 0);
687 gtk_widget_show(graph_bt1);
688 g_signal_connect(graph_bt1, "clicked", G_CALLBACK(on_graph1_dlg), u_data);
690 graph_bt2 = gtk_button_new_with_label("Graph Bytes");
691 gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt2, FALSE, FALSE, 0);
692 gtk_widget_show(graph_bt2);
693 g_signal_connect(graph_bt2, "clicked", G_CALLBACK(on_graph_byte1_dlg), u_data);
694 if (u_data->assoc->n_array_tsn1==0)
696 gtk_widget_set_sensitive(graph_bt1, FALSE);
697 gtk_widget_set_sensitive(graph_bt2, FALSE);
699 close_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
700 gtk_box_pack_start(GTK_BOX(h_button_box), close_bt, FALSE, FALSE, 0);
701 gtk_widget_show(close_bt);
702 g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
704 label = gtk_label_new(" Endpoint 1 ");
705 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page2, label);
707 /* same page for endpoint 2*/
709 page3 = gtk_vbox_new(FALSE, 8);
710 gtk_container_set_border_width(GTK_CONTAINER(page3), 8);
711 u_data->analyse_nb->page3 = g_malloc(sizeof(struct page));
712 u_data->analyse_nb->page3->addr_frame = gtk_frame_new(NULL);
714 gtk_container_add(GTK_CONTAINER(page3), u_data->analyse_nb->page3->addr_frame);
716 addr_hb = gtk_hbox_new(FALSE, 3);
717 gtk_container_set_border_width(GTK_CONTAINER(addr_hb), 5);
718 gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page3->addr_frame), addr_hb);
720 u_data->analyse_nb->page3->scrolled_window = scrolled_window_new(NULL, NULL);
721 gtk_widget_set_size_request(u_data->analyse_nb->page3->scrolled_window, 560, 100);
723 u_data->analyse_nb->page3->clist = create_list();
724 gtk_widget_show(u_data->analyse_nb->page3->clist);
726 gtk_container_add(GTK_CONTAINER(u_data->analyse_nb->page3->scrolled_window),
727 u_data->analyse_nb->page3->clist);
729 gtk_box_pack_start(GTK_BOX(addr_hb), u_data->analyse_nb->page3->scrolled_window, TRUE, TRUE, 0);
730 gtk_widget_show(u_data->analyse_nb->page3->scrolled_window);
732 stat_fr = gtk_frame_new(NULL);
733 gtk_container_add(GTK_CONTAINER(page3), stat_fr);
735 hbox = gtk_hbox_new(FALSE,3);
736 gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
737 gtk_container_add(GTK_CONTAINER(stat_fr), hbox);
739 vbox_l = gtk_vbox_new(FALSE, 3);
740 gtk_box_pack_start(GTK_BOX(hbox), vbox_l, TRUE, TRUE, 0);
742 hbox_l1 = gtk_hbox_new(FALSE,3);
743 gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l1, TRUE, TRUE, 0);
745 u_data->analyse_nb->page3->port = gtk_label_new("");
746 gtk_box_pack_start(GTK_BOX(hbox_l1), u_data->analyse_nb->page3->port, TRUE, TRUE, 0);
747 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->port),0,0);
749 hbox_l2 = gtk_hbox_new(FALSE,3);
750 gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l2, TRUE, TRUE, 0);
753 u_data->analyse_nb->page3->veritag = gtk_label_new("");
754 gtk_box_pack_start(GTK_BOX(hbox_l2), u_data->analyse_nb->page3->veritag, TRUE, TRUE, 0);
755 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->veritag),0,0);
756 gtk_widget_show(vbox_l);
758 vbox_r=gtk_vbox_new(FALSE, 3);
759 gtk_box_pack_start(GTK_BOX(hbox), vbox_r, TRUE, TRUE, 0);
761 u_data->analyse_nb->page3->max_in = gtk_label_new("");
762 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->max_in, TRUE, TRUE, 0);
763 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->max_in),0,0);
764 u_data->analyse_nb->page3->min_in = gtk_label_new("");
765 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->min_in, TRUE, TRUE, 0);
766 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->min_in),0,0);
768 u_data->analyse_nb->page3->max_out = gtk_label_new("");
769 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->max_out, TRUE, TRUE, 0);
770 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->max_out),0,0);
771 u_data->analyse_nb->page3->min_out = gtk_label_new("");
772 gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->min_out, TRUE, TRUE, 0);
773 gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->min_out),0,0);
775 gtk_widget_show(vbox_r);
777 h_button_box=gtk_hbutton_box_new();
778 gtk_box_pack_start(GTK_BOX(page3), h_button_box, FALSE, FALSE, 0);
779 gtk_container_set_border_width(GTK_CONTAINER(h_button_box), 10);
780 gtk_button_box_set_layout(GTK_BUTTON_BOX (h_button_box), GTK_BUTTONBOX_SPREAD);
781 gtk_box_set_spacing(GTK_BOX (h_button_box), 0);
782 gtk_widget_show(h_button_box);
784 chunk_bt1 = gtk_button_new_with_label("Chunk Statistics");
785 gtk_box_pack_start(GTK_BOX(h_button_box), chunk_bt1, FALSE, FALSE, 0);
786 gtk_widget_show(chunk_bt1);
787 g_signal_connect(chunk_bt1, "clicked", G_CALLBACK(on_chunk2_dlg), u_data);
789 graph_bt1 = gtk_button_new_with_label("Graph TSN");
790 gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt1, FALSE, FALSE, 0);
791 gtk_widget_show(graph_bt1);
792 g_signal_connect(graph_bt1, "clicked", G_CALLBACK(on_graph2_dlg), u_data);
793 graph_bt2 = gtk_button_new_with_label("Graph Bytes");
794 gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt2, FALSE, FALSE, 0);
795 gtk_widget_show(graph_bt2);
796 g_signal_connect(graph_bt2, "clicked", G_CALLBACK(on_graph_byte2_dlg), u_data);
797 if (u_data->assoc->n_array_tsn2==0)
799 gtk_widget_set_sensitive(graph_bt1, FALSE);
800 gtk_widget_set_sensitive(graph_bt2, FALSE);
802 close_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
803 gtk_box_pack_start(GTK_BOX(h_button_box), close_bt, FALSE, FALSE, 0);
804 gtk_widget_show(close_bt);
805 g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
807 label = gtk_label_new(" Endpoint 2 ");
808 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page3, label);
810 /* show all notebooks */
811 gtk_widget_show_all(notebook);
813 gtk_widget_show(window);
815 u_data->window = window;
816 analyse_window_set_title(u_data);
818 update_analyse_dlg(u_data);
823 void assoc_analyse(sctp_assoc_info_t* assoc)
825 struct sctp_analyse* u_data;
828 u_data = g_malloc(sizeof(struct sctp_analyse));
829 u_data->assoc = assoc;
830 u_data->assoc->addr_chunk_count = assoc->addr_chunk_count;
831 u_data->window = NULL;
832 u_data->analyse_nb = NULL;
833 u_data->children = NULL;
834 u_data->num_children = 0;
835 static_assoc.addr_chunk_count =assoc->addr_chunk_count;
836 static_assoc.port1 = assoc->port1;
837 static_assoc.port2 = assoc->port2;
838 for (i=0; i<NUM_CHUNKS; i++)
840 static_assoc.chunk_count[i] = assoc->chunk_count[i];
841 static_assoc.ep1_chunk_count[i] = assoc->ep1_chunk_count[i];
842 static_assoc.ep2_chunk_count[i] = assoc->ep2_chunk_count[i];
844 set_analyse_child(u_data);
845 increase_analyse_childcount();
846 static_assoc.addr_chunk_count = assoc->addr_chunk_count;
847 create_analyse_window(u_data);
851 static void sctp_analyse_cb(struct sctp_analyse* u_data, gboolean ext)
853 GList *list, *framelist;
857 gboolean frame_matched, frame_found = FALSE;
859 gchar filter_text[256];
860 sctp_assoc_info_t* assoc = NULL;
864 g_strlcpy(filter_text,"sctp",250);
865 if (!dfilter_compile(filter_text, &sfcode)) {
866 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", dfilter_error_msg);
871 fdata = cf->current_frame;
873 /* we are on the selected frame now */
875 return; /* if we exit here it's an error */
877 /* dissect the current frame */
878 if (!cf_read_frame(cf, fdata))
879 return; /* error reading the frame */
881 epan_dissect_init(&edt, TRUE, FALSE);
882 epan_dissect_prime_dfilter(&edt, sfcode);
883 epan_dissect_run(&edt, &cf->pseudo_header, cf->pd, fdata, NULL);
884 frame_matched = dfilter_apply_edt(sfcode, &edt);
886 /* if it is not an sctp frame, show the dialog */
888 if (frame_matched != 1) {
889 epan_dissect_cleanup(&edt);
890 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
891 "Please choose an SCTP packet!");
895 list = g_list_first(sctp_stat_get_info()->assoc_info_list);
899 assoc = (sctp_assoc_info_t*)(list->data);
900 framelist = g_list_first(assoc->frame_numbers);
903 fn = (guint32 *)framelist->data;
904 if (*fn == fdata->num)
909 framelist = g_list_next(framelist);
913 u_data->assoc = assoc;
914 u_data->assoc->addr_chunk_count = assoc->addr_chunk_count;
915 static_assoc.addr_chunk_count = assoc->addr_chunk_count;
916 static_assoc.port1 = assoc->port1;
917 static_assoc.port2 = assoc->port2;
918 for (i=0; i<NUM_CHUNKS; i++)
920 static_assoc.chunk_count[i] = assoc->chunk_count[i];
921 static_assoc.ep1_chunk_count[i] = assoc->ep1_chunk_count[i];
922 static_assoc.ep2_chunk_count[i] = assoc->ep2_chunk_count[i];
925 create_analyse_window(u_data);
929 list = g_list_next(list);
933 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Assoc not found!");
936 void sctp_set_assoc_filter(void)
938 struct sctp_analyse * u_data;
940 /* Register the tap listener */
941 if (sctp_stat_get_info()->is_registered == FALSE)
942 register_tap_listener_sctp_stat();
943 /* (redissect all packets) */
946 u_data = g_malloc(sizeof(struct sctp_analyse));
947 u_data->assoc = NULL;
948 u_data->children = NULL;
949 u_data->analyse_nb = NULL;
950 u_data->window = NULL;
951 u_data->num_children = 0;
952 cf_retap_packets(&cfile);
953 sctp_analyse_cb(u_data, TRUE);
954 sctp_set_filter(NULL, u_data);
957 #ifdef MAIN_MENU_USE_UIMANAGER
958 void sctp_analyse_start(GtkAction *action _U_, gpointer user_data _U_)
960 void sctp_analyse_start(GtkWidget *w _U_, gpointer data _U_)
963 struct sctp_analyse * u_data;
965 /* Register the tap listener */
966 if (sctp_stat_get_info()->is_registered == FALSE)
967 register_tap_listener_sctp_stat();
968 /* (redissect all packets) */
972 u_data = g_malloc(sizeof(struct sctp_analyse));
973 u_data->assoc = NULL;
974 u_data->children = NULL;
975 u_data->analyse_nb = NULL;
976 u_data->window = NULL;
977 u_data->num_children = 0;
979 cf_retap_packets(&cfile);
980 sctp_analyse_cb(u_data, FALSE);
985 register_tap_listener_sctp_analyse(void)
987 #ifdef MAIN_MENU_USE_UIMANAGER
989 register_stat_menu_item("S_CTP/Analyse this Association", REGISTER_STAT_GROUP_TELEPHONY,
990 sctp_analyse_start, NULL, NULL, NULL);