2 * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
3 * Copyright 2009, Varun Notibala <nbvarun [AT] gmail.com>
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
33 #include "epan/filesystem.h"
35 #include "../globals.h"
37 #include "gtk/dlg_utils.h"
38 #include "gtk/gui_utils.h"
40 #include "gtk/sctp_stat.h"
42 static GtkWidget *sctp_chunk_stat_dlg=NULL;
43 static GtkWidget *clist = NULL;
44 static GList *last_list = NULL;
45 static sctp_assoc_info_t* selected_stream = NULL; /* current selection */
90 N_COLUMN /* The number of columns */
95 GtkWidget* create_list(void)
98 GtkListStore *list_store;
100 GtkTreeViewColumn *column;
101 GtkCellRenderer *renderer;
102 GtkTreeSortable *sortable;
103 GtkTreeView *list_view;
104 GtkTreeSelection *selection;
106 /* Create the store */
107 list_store = gtk_list_store_new(N_COLUMN, /* Total number of columns XXX */
108 G_TYPE_STRING, /* IP Address */
109 G_TYPE_INT, /* DATA */
110 G_TYPE_INT, /* INIT */
111 G_TYPE_INT, /* INIT_ACK */
112 G_TYPE_INT, /* SACK */
113 G_TYPE_INT, /* HEARTBEAT */
114 G_TYPE_INT, /* HEARTBEAT_ACK */
115 G_TYPE_INT, /* ABORT */
116 G_TYPE_INT, /* SHUTDOWN */
117 G_TYPE_INT, /* SHUTDOWN_ACK */
118 G_TYPE_INT, /* ERROR */
119 G_TYPE_INT, /* COOKIE_ECHO */
120 G_TYPE_INT, /* COOKIE_ACK */
121 G_TYPE_INT, /* ECNE */
122 G_TYPE_INT, /* CWR */
123 G_TYPE_INT, /* SHUT_COMPLETE */
124 G_TYPE_INT, /* AUTH */
125 G_TYPE_INT, /* NR_SACK */
126 G_TYPE_INT); /* Others */
128 list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
130 list_view = GTK_TREE_VIEW(list);
131 sortable = GTK_TREE_SORTABLE(list_store);
133 #if GTK_CHECK_VERSION(2,6,0)
134 /* Speed up the list display */
135 gtk_tree_view_set_fixed_height_mode(list_view, TRUE);
138 /* Setup the sortable columns */
139 gtk_tree_sortable_set_sort_column_id(sortable, IP_ADDR_COLUMN, GTK_SORT_ASCENDING);
140 gtk_tree_view_set_headers_clickable(list_view, FALSE);
142 /* The view now holds a reference. We can get rid of our own reference */
143 g_object_unref (G_OBJECT (list_store));
146 * Create the first column packet, associating the "text" attribute of the
147 * cell_renderer to the first column of the model
150 renderer = gtk_cell_renderer_text_new ();
151 column = gtk_tree_view_column_new_with_attributes ("IP Address", renderer,
152 "text", IP_ADDR_COLUMN,
155 gtk_tree_view_column_set_sort_column_id(column, IP_ADDR_COLUMN);
156 gtk_tree_view_column_set_resizable(column, TRUE);
157 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
158 gtk_tree_view_column_set_min_width(column, 135);
160 /* Add the column to the view. */
161 gtk_tree_view_append_column (list_view, column);
164 renderer = gtk_cell_renderer_text_new ();
165 column = gtk_tree_view_column_new_with_attributes ("DATA", renderer,
168 gtk_tree_view_column_set_sort_column_id(column, DATA_COLUMN);
169 gtk_tree_view_column_set_resizable(column, TRUE);
170 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
171 gtk_tree_view_column_set_min_width(column, 70);
172 gtk_tree_view_append_column (list_view, column);
175 renderer = gtk_cell_renderer_text_new ();
176 column = gtk_tree_view_column_new_with_attributes ("INIT", renderer,
179 gtk_tree_view_column_set_sort_column_id(column, INIT_COLUMN);
180 gtk_tree_view_column_set_resizable(column, TRUE);
181 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
182 gtk_tree_view_column_set_min_width(column, 70);
183 gtk_tree_view_append_column (list_view, column);
186 renderer = gtk_cell_renderer_text_new ();
187 column = gtk_tree_view_column_new_with_attributes ("INIT_ACK", renderer,
188 "text", INIT_ACK_COLUMN,
190 gtk_tree_view_column_set_sort_column_id(column, INIT_ACK_COLUMN);
191 gtk_tree_view_column_set_resizable(column, TRUE);
192 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
193 gtk_tree_view_column_set_min_width(column, 80);
194 gtk_tree_view_append_column (list_view, column);
197 renderer = gtk_cell_renderer_text_new ();
198 column = gtk_tree_view_column_new_with_attributes ("SACK", renderer,
201 gtk_tree_view_column_set_sort_column_id(column, SACK_COLUMN);
202 gtk_tree_view_column_set_resizable(column, TRUE);
203 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
204 gtk_tree_view_column_set_min_width(column, 70);
205 gtk_tree_view_append_column (list_view, column);
208 renderer = gtk_cell_renderer_text_new ();
209 column = gtk_tree_view_column_new_with_attributes ("HEARTBEAT", renderer,
210 "text", HEARTBEAT_COLUMN,
212 gtk_tree_view_column_set_sort_column_id(column, HEARTBEAT_COLUMN);
213 gtk_tree_view_column_set_resizable(column, TRUE);
214 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
215 gtk_tree_view_column_set_min_width(column, 80);
216 gtk_tree_view_append_column (list_view, column);
219 renderer = gtk_cell_renderer_text_new ();
220 column = gtk_tree_view_column_new_with_attributes ("HEARTBEAT_ACK", renderer,
221 "text", HEARTBEAT_ACK_COLUMN,
223 gtk_tree_view_column_set_sort_column_id(column, HEARTBEAT_ACK_COLUMN);
224 gtk_tree_view_column_set_resizable(column, TRUE);
225 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
226 gtk_tree_view_column_set_min_width(column, 120);
227 gtk_tree_view_append_column (list_view, column);
230 renderer = gtk_cell_renderer_text_new ();
231 column = gtk_tree_view_column_new_with_attributes ("ABORT", renderer,
232 "text", ABORT_COLUMN,
234 gtk_tree_view_column_set_sort_column_id(column, ABORT_COLUMN);
235 gtk_tree_view_column_set_resizable(column, TRUE);
236 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
237 gtk_tree_view_column_set_min_width(column, 70);
238 gtk_tree_view_append_column (list_view, column);
242 renderer = gtk_cell_renderer_text_new ();
243 column = gtk_tree_view_column_new_with_attributes ("SHUTDOWN", renderer,
244 "text", SHUTDOWN_COLUMN,
246 gtk_tree_view_column_set_sort_column_id(column, SHUTDOWN_COLUMN);
247 gtk_tree_view_column_set_resizable(column, TRUE);
248 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
249 gtk_tree_view_column_set_min_width(column, 70);
250 gtk_tree_view_append_column (list_view, column);
252 /* 10:th column... */
253 renderer = gtk_cell_renderer_text_new ();
254 column = gtk_tree_view_column_new_with_attributes ("SHUTDOWN_ACK", renderer,
255 "text", SHUTDOWN_ACK_COLUMN,
257 gtk_tree_view_column_set_sort_column_id(column, SHUTDOWN_ACK_COLUMN);
258 gtk_tree_view_column_set_resizable(column, TRUE);
259 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
260 gtk_tree_view_column_set_min_width(column, 120);
261 gtk_tree_view_append_column (list_view, column);
263 /* 11:th column... */
264 renderer = gtk_cell_renderer_text_new ();
265 column = gtk_tree_view_column_new_with_attributes ("ERROR", renderer,
266 "text", ERROR_COLUMN,
268 gtk_tree_view_column_set_sort_column_id(column, ERROR_COLUMN);
269 gtk_tree_view_column_set_resizable(column, TRUE);
270 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
271 gtk_tree_view_column_set_min_width(column, 70);
272 gtk_tree_view_append_column (list_view, column);
274 /* 12:th column... */
275 renderer = gtk_cell_renderer_text_new ();
276 column = gtk_tree_view_column_new_with_attributes ("COOKIE_ECHO", renderer,
279 gtk_tree_view_column_set_sort_column_id(column, COOKIE_ECHO_COLUMN);
280 gtk_tree_view_column_set_resizable(column, TRUE);
281 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
282 gtk_tree_view_column_set_min_width(column, 120);
283 gtk_tree_view_append_column (list_view, column);
285 /* 13:th column... */
286 renderer = gtk_cell_renderer_text_new ();
287 column = gtk_tree_view_column_new_with_attributes ("COOKIE_ACK", renderer,
288 "text", COOKIE_ACK_COLUMN,
290 gtk_tree_view_column_set_sort_column_id(column, COOKIE_ACK_COLUMN);
291 gtk_tree_view_column_set_resizable(column, TRUE);
292 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
293 gtk_tree_view_column_set_min_width(column, 120);
294 gtk_tree_view_append_column (list_view, column);
296 /* 14:th column... */
297 renderer = gtk_cell_renderer_text_new ();
298 column = gtk_tree_view_column_new_with_attributes ("ECNE", renderer,
301 gtk_tree_view_column_set_sort_column_id(column, ECNE_COLUMN);
302 gtk_tree_view_column_set_resizable(column, TRUE);
303 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
304 gtk_tree_view_column_set_min_width(column, 70);
305 gtk_tree_view_append_column (list_view, column);
307 /* 15:th column... */
308 renderer = gtk_cell_renderer_text_new ();
309 column = gtk_tree_view_column_new_with_attributes ("CWR", renderer,
312 gtk_tree_view_column_set_sort_column_id(column, CWR_COLUMN);
313 gtk_tree_view_column_set_resizable(column, TRUE);
314 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
315 gtk_tree_view_column_set_min_width(column, 70);
316 gtk_tree_view_append_column (list_view, column);
318 /* 16:th column... */
319 renderer = gtk_cell_renderer_text_new ();
320 column = gtk_tree_view_column_new_with_attributes ("SHUT_COMPLETE", renderer,
321 "text", SHUT_COMPLETE_COLUMN,
323 gtk_tree_view_column_set_sort_column_id(column, SHUT_COMPLETE_COLUMN);
324 gtk_tree_view_column_set_resizable(column, TRUE);
325 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
326 gtk_tree_view_column_set_min_width(column, 140);
327 gtk_tree_view_append_column (list_view, column);
329 /* 17:th column... */
330 renderer = gtk_cell_renderer_text_new ();
331 column = gtk_tree_view_column_new_with_attributes ("AUTH", renderer,
334 gtk_tree_view_column_set_sort_column_id(column, AUTH_COLUMN);
335 gtk_tree_view_column_set_resizable(column, TRUE);
336 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
337 gtk_tree_view_column_set_min_width(column, 80);
338 gtk_tree_view_append_column (list_view, column);
340 /* 18:th column... */
341 renderer = gtk_cell_renderer_text_new ();
342 column = gtk_tree_view_column_new_with_attributes ("NR_SACK", renderer,
343 "text", NR_SACK_COLUMN,
345 gtk_tree_view_column_set_sort_column_id(column, NR_SACK_COLUMN);
346 gtk_tree_view_column_set_resizable(column, TRUE);
347 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
348 gtk_tree_view_column_set_min_width(column, 100);
349 gtk_tree_view_append_column (list_view, column);
351 /* 19:th column... */
352 renderer = gtk_cell_renderer_text_new ();
353 column = gtk_tree_view_column_new_with_attributes ("Others", renderer,
354 "text", OTHERS_COLUMN,
356 gtk_tree_view_column_set_sort_column_id(column, OTHERS_COLUMN);
357 gtk_tree_view_column_set_resizable(column, TRUE);
358 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
359 gtk_tree_view_column_set_min_width(column, 70);
360 gtk_tree_view_append_column (list_view, column);
362 /* Now enable the sorting of each column */
363 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(list_view), TRUE);
364 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(list_view), TRUE);
366 /* Setup the selection handler */
367 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
368 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
374 static const char *chunk_name(int type)
376 #define CASE(x) case x: s=#x; break
377 const char *s = "unknown";
401 typedef struct column_arrows {
403 GtkWidget *ascend_pm;
404 GtkWidget *descend_pm;
409 chunk_dlg_destroy(GtkObject *object _U_, gpointer user_data)
411 struct sctp_udata *u_data=(struct sctp_udata*)user_data;
412 decrease_childcount(u_data->parent);
413 remove_child(u_data, u_data->parent);
419 on_destroy(GtkObject *object _U_, gpointer user_data)
421 struct sctp_udata *u_data=(struct sctp_udata*)user_data;
422 decrease_childcount(u_data->parent);
423 remove_child(u_data, u_data->parent);
429 static void add_to_clist(sctp_addr_chunk* sac)
431 GtkListStore *list_store = NULL;
433 gchar field[1][MAX_ADDRESS_LEN];
435 list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (clist))); /* Get store */
437 if (sac->addr->type==AT_IPv4) {
438 g_snprintf(field[0], MAX_ADDRESS_LEN, "%s", ip_to_str((const guint8 *)(sac->addr->data)));
439 } else if (sac->addr->type==AT_IPv6) {
440 g_snprintf(field[0], MAX_ADDRESS_LEN, "%s", ip6_to_str((const struct e_in6_addr *)(sac->addr->data)));
443 #if GTK_CHECK_VERSION(2,6,0)
444 gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT,
446 gtk_list_store_append (list_store, &iter);
447 gtk_list_store_set (list_store, &iter,
449 IP_ADDR_COLUMN, field[0],
450 DATA_COLUMN, sac->addr_count[0],
451 INIT_COLUMN, sac->addr_count[1],
452 INIT_ACK_COLUMN, sac->addr_count[2],
453 SACK_COLUMN, sac->addr_count[3],
454 HEARTBEAT_COLUMN, sac->addr_count[4],
455 HEARTBEAT_ACK_COLUMN, sac->addr_count[5],
456 ABORT_COLUMN, sac->addr_count[6],
457 SHUTDOWN_COLUMN, sac->addr_count[7],
458 SHUTDOWN_ACK_COLUMN, sac->addr_count[8],
459 ERROR_COLUMN, sac->addr_count[9],
460 COOKIE_ECHO_COLUMN, sac->addr_count[10],
461 COOKIE_ACK_COLUMN, sac->addr_count[11],
462 ECNE_COLUMN, sac->addr_count[12],
463 CWR_COLUMN, sac->addr_count[13],
464 SHUT_COMPLETE_COLUMN, sac->addr_count[14],
465 AUTH_COLUMN, sac->addr_count[15],
466 NR_SACK_COLUMN, sac->addr_count[16],
467 OTHERS_COLUMN, sac->addr_count[17],
471 void sctp_chunk_stat_dlg_update(struct sctp_udata* udata, unsigned int direction)
474 sctp_addr_chunk* sac;
476 if (udata->io->window != NULL)
478 gtk_list_store_clear(GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(clist))));
479 if (udata->assoc->addr_chunk_count!=NULL)
481 list = g_list_first(udata->assoc->addr_chunk_count);
485 sac = (sctp_addr_chunk*)(list->data);
486 if (sac->direction==direction)
489 list = g_list_next(list);
492 list = g_list_next(list);
502 sctp_chunk_stat_on_close (GtkButton *button _U_, gpointer user_data)
504 struct sctp_udata *udata;
506 udata = (struct sctp_udata *)user_data;
507 gtk_grab_remove(udata->io->window);
508 gtk_widget_destroy(udata->io->window);
512 on_close_dlg (GtkButton *button _U_, gpointer user_data)
514 struct sctp_udata *udata;
516 udata = (struct sctp_udata *)user_data;
517 gtk_grab_remove(udata->io->window);
518 gtk_widget_destroy(udata->io->window);
522 static void path_window_set_title(struct sctp_udata *u_data, unsigned int direction)
525 if(!u_data->io->window){
528 title = g_strdup_printf("SCTP Path Chunk Statistics for Endpoint %u: %s Port1 %u Port2 %u",direction,
529 cf_get_display_name(&cfile), u_data->assoc->port1, u_data->assoc->port2);
530 gtk_window_set_title(GTK_WINDOW(u_data->io->window), title);
535 gtk_sctpstat_dlg(struct sctp_udata *u_data, unsigned int direction)
538 GtkWidget *scrolledwindow1;
539 GtkWidget *hbuttonbox2;
543 sctp_graph_t* io=g_malloc(sizeof(sctp_graph_t));
546 u_data->io->window= gtk_window_new (GTK_WINDOW_TOPLEVEL);
547 gtk_window_set_default_size(GTK_WINDOW(u_data->io->window), 850, 200);
548 gtk_window_set_position (GTK_WINDOW (u_data->io->window), GTK_WIN_POS_CENTER);
549 path_window_set_title(u_data, direction);
550 g_signal_connect(u_data->io->window, "destroy", G_CALLBACK(chunk_dlg_destroy), u_data);
552 /* Container for each row of widgets */
553 vbox1 = gtk_vbox_new(FALSE, 2);
554 gtk_container_set_border_width(GTK_CONTAINER(vbox1), 8);
555 gtk_container_add(GTK_CONTAINER(u_data->io->window), vbox1);
556 gtk_widget_show(vbox1);
558 scrolledwindow1 = scrolled_window_new (NULL, NULL);
559 gtk_widget_show (scrolledwindow1);
560 gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow1, TRUE, TRUE, 0);
562 clist = create_list();
563 gtk_widget_show (clist);
564 gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
566 gtk_widget_show(u_data->io->window);
569 hbuttonbox2 = gtk_hbutton_box_new();
570 gtk_box_pack_start(GTK_BOX(vbox1), hbuttonbox2, FALSE, FALSE, 0);
571 gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox2), 10);
572 gtk_button_box_set_layout(GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_SPREAD);
573 gtk_box_set_spacing(GTK_BOX (hbuttonbox2), 0);
574 gtk_widget_show(hbuttonbox2);
576 bt_close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
577 gtk_container_add (GTK_CONTAINER (hbuttonbox2), bt_close);
578 gtk_widget_show (bt_close);
580 g_signal_connect(bt_close, "clicked", G_CALLBACK(sctp_chunk_stat_on_close), u_data);
582 cf_retap_packets(&cfile, FALSE);
587 static void chunk_window_set_title(struct sctp_udata *u_data)
590 if(!u_data->io->window){
593 title = g_strdup_printf("SCTP Association Chunk Statistics: %s Port1 %u Port2 %u",
594 cf_get_display_name(&cfile), u_data->assoc->port1, u_data->assoc->port2);
595 gtk_window_set_title(GTK_WINDOW(u_data->io->window), title);
599 static void sctp_chunk_dlg(struct sctp_udata *u_data)
601 GtkWidget *main_vb, *table;
602 GtkWidget *label, *h_button_box;
607 sctp_graph_t* io=g_malloc(sizeof(sctp_graph_t));
610 u_data->io->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
611 gtk_window_set_position (GTK_WINDOW (u_data->io->window), GTK_WIN_POS_CENTER);
612 gtk_widget_set_size_request(u_data->io->window, 500, 650);
613 g_signal_connect(u_data->io->window, "destroy", G_CALLBACK(on_destroy), u_data);
615 /* Container for each row of widgets */
616 main_vb = gtk_vbox_new(FALSE, 12);
617 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
618 gtk_container_add(GTK_CONTAINER(u_data->io->window), main_vb);
621 table = gtk_table_new(1, 4, FALSE);
622 gtk_table_set_col_spacings(GTK_TABLE(table), 6);
623 gtk_table_set_row_spacings(GTK_TABLE(table), 3);
624 gtk_container_add(GTK_CONTAINER(main_vb), table);
627 label = gtk_label_new("ChunkType");
628 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
629 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, row, row+1);
630 label = gtk_label_new("Association");
631 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
632 gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, row, row+1);
633 label = gtk_label_new("Endpoint 1");
634 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
635 gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, row, row+1);
636 label = gtk_label_new("Endpoint 2");
637 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
638 gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1);
640 label = gtk_label_new("");
641 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, row, row+1);
642 label = gtk_label_new("");
643 gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, row, row+1);
644 label = gtk_label_new("");
645 gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, row, row+1);
646 label = gtk_label_new("");
647 gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1);
650 for (i=0; i<NUM_CHUNKS-1; i++)
652 label = gtk_label_new(chunk_name(i));
653 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
654 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, row, row+1);
655 g_snprintf(label_txt, 10, "%u", selected_stream->chunk_count[i]);
656 label = gtk_label_new(label_txt);
657 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
658 gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, row, row+1);
659 g_snprintf(label_txt, 10, "%u", selected_stream->ep1_chunk_count[i]);
660 label = gtk_label_new(label_txt);
661 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
662 gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, row, row+1);
663 g_snprintf(label_txt, 10, "%u", selected_stream->ep2_chunk_count[i]);
664 label = gtk_label_new(label_txt);
665 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
666 gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1);
670 label = gtk_label_new("Others");
671 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
672 gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, row, row+1);
673 g_snprintf(label_txt, 10, "%u", selected_stream->chunk_count[OTHER_CHUNKS_INDEX]);
674 label = gtk_label_new(label_txt);
675 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
676 gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, row, row+1);
677 g_snprintf(label_txt, 10, "%u", selected_stream->ep1_chunk_count[OTHER_CHUNKS_INDEX]);
678 label = gtk_label_new(label_txt);
679 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
680 gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, row, row+1);
681 g_snprintf(label_txt, 10, "%u", selected_stream->ep2_chunk_count[OTHER_CHUNKS_INDEX]);
682 label = gtk_label_new(label_txt);
683 gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f);
684 gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1);
686 h_button_box=gtk_hbutton_box_new();
687 gtk_box_pack_start(GTK_BOX(main_vb), h_button_box, FALSE, FALSE, 0);
688 gtk_container_set_border_width(GTK_CONTAINER(h_button_box), 10);
689 gtk_button_box_set_layout(GTK_BUTTON_BOX (h_button_box), GTK_BUTTONBOX_SPREAD);
690 gtk_box_set_spacing(GTK_BOX (h_button_box), 0);
691 gtk_widget_show(h_button_box);
693 close_bt = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
694 gtk_box_pack_start(GTK_BOX(h_button_box), close_bt, FALSE, FALSE, 0);
695 gtk_widget_show(close_bt);
696 g_signal_connect(close_bt, "clicked", G_CALLBACK(on_close_dlg), u_data);
698 gtk_widget_show_all(u_data->io->window);
699 chunk_window_set_title(u_data);
702 void sctp_chunk_dlg_show(struct sctp_analyse* userdata)
705 struct sctp_udata *u_data;
707 u_data=g_malloc(sizeof(struct sctp_udata));
708 u_data->assoc=g_malloc(sizeof(sctp_assoc_info_t));
709 u_data->assoc=userdata->assoc;
711 u_data->parent = userdata;
713 if (selected_stream==NULL)
714 selected_stream=g_malloc(sizeof(sctp_assoc_info_t));
716 selected_stream=u_data->assoc;
717 for (i=0; i<NUM_CHUNKS; i++)
719 selected_stream->chunk_count[i]=u_data->assoc->chunk_count[i];
721 set_child(u_data, u_data->parent);
722 increase_childcount(u_data->parent);
723 sctp_chunk_dlg(u_data);
726 void sctp_chunk_stat_dlg_show(unsigned int direction, struct sctp_analyse* userdata)
728 struct sctp_udata *u_data;
730 u_data=g_malloc(sizeof(struct sctp_udata));
731 u_data->assoc=g_malloc(sizeof(sctp_assoc_info_t));
732 u_data->assoc=userdata->assoc;
734 u_data->parent = userdata;
736 if (selected_stream==NULL)
737 selected_stream=g_malloc(sizeof(sctp_assoc_info_t));
738 selected_stream=u_data->assoc;
739 selected_stream->addr_chunk_count=u_data->assoc->addr_chunk_count;
741 set_child(u_data, u_data->parent);
742 increase_childcount(u_data->parent);
743 gtk_sctpstat_dlg(u_data, direction);
744 sctp_chunk_stat_dlg_update(u_data,direction);
747 GtkWidget* get_chunk_stat_dlg(void)
749 return sctp_chunk_stat_dlg;