From 792c7add3a53d450e6f87fc3c20b2a8e664eca44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20T=C3=BCxen?= Date: Wed, 23 Jun 2010 07:47:15 +0000 Subject: [PATCH] From Robin Seggelmann: Improve SCTP chunk statistics. svn path=/trunk/; revision=33297 --- AUTHORS | 1 + gtk/sctp_chunk_stat.c | 59 +++++-------- gtk/sctp_chunk_stat_dlg.c | 180 ++++++++++++++++++++++++++------------ gtk/sctp_stat.c | 34 ++----- gtk/sctp_stat.h | 36 ++++---- gtk/sctp_stat_dlg.c | 2 +- 6 files changed, 169 insertions(+), 143 deletions(-) diff --git a/AUTHORS b/AUTHORS index 53e2fe9e2e..0eb78484aa 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2672,6 +2672,7 @@ Abhik Sarkar { Robin Seggelmann { Support for SCTP reassembly. + Improve chunk statistics. } Chris Bontje { diff --git a/gtk/sctp_chunk_stat.c b/gtk/sctp_chunk_stat.c index 3b6d19f101..8ca0bba866 100644 --- a/gtk/sctp_chunk_stat.c +++ b/gtk/sctp_chunk_stat.c @@ -53,6 +53,7 @@ #include "gtk/tap_dfilter_dlg.h" #include "gtk/gui_utils.h" #include "gtk/main.h" +#include "gtk/sctp_stat.h" static void sctpstat_init(const char *optarg, void *userdata); @@ -86,30 +87,6 @@ typedef struct _sctp_stat_t { typedef struct _sctp_info sctp_into_t; -#define SCTP_DATA_CHUNK_ID 0 -#define SCTP_INIT_CHUNK_ID 1 -#define SCTP_INIT_ACK_CHUNK_ID 2 -#define SCTP_SACK_CHUNK_ID 3 -#define SCTP_HEARTBEAT_CHUNK_ID 4 -#define SCTP_HEARTBEAT_ACK_CHUNK_ID 5 -#define SCTP_ABORT_CHUNK_ID 6 -#define SCTP_SHUTDOWN_CHUNK_ID 7 -#define SCTP_SHUTDOWN_ACK_CHUNK_ID 8 -#define SCTP_ERROR_CHUNK_ID 9 -#define SCTP_COOKIE_ECHO_CHUNK_ID 10 -#define SCTP_COOKIE_ACK_CHUNK_ID 11 -#define SCTP_ECNE_CHUNK_ID 12 -#define SCTP_CWR_CHUNK_ID 13 -#define SCTP_SHUTDOWN_COMPLETE_CHUNK_ID 14 -#define SCTP_AUTH_CHUNK_ID 15 -#define SCTP_NR_SACK_CHUNK_ID 16 -#define SCTP_ASCONF_ACK_CHUNK_ID 0x80 -#define SCTP_PKTDROP_CHUNK_ID 0x81 -#define SCTP_FORWARD_TSN_CHUNK_ID 0xC0 -#define SCTP_ASCONF_CHUNK_ID 0xC1 -#define SCTP_IETF_EXT 0xFF - -#define CHUNK_TYPE_OFFSET 0 #define CHUNK_TYPE(x)(tvb_get_guint8((x), CHUNK_TYPE_OFFSET)) static void @@ -159,7 +136,6 @@ sctpstat_packet(void *phs, packet_info *pinfo _U_, epan_dissect_t *edt _U_, cons sctp_ep_t *tmp = NULL, *te = NULL; struct _sctp_info *si = (struct _sctp_info *) phi; guint32 tvb_number; - guint8 chunk_type; if (!hs) return (0); @@ -191,14 +167,11 @@ sctpstat_packet(void *phs, packet_info *pinfo _U_, epan_dissect_t *edt _U_, cons if (si->number_of_tvbs > 0) { - chunk_type = CHUNK_TYPE(si->tvb[0]); - if ((chunk_type == SCTP_INIT_CHUNK_ID) || - (chunk_type == SCTP_INIT_ACK_CHUNK_ID)) { - (te->chunk_count[chunk_type])++; - } else { - for(tvb_number = 0; tvb_number < si->number_of_tvbs; tvb_number++) { + for(tvb_number = 0; tvb_number < si->number_of_tvbs; tvb_number++) { + if (IS_SCTP_CHUNK_TYPE(CHUNK_TYPE(si->tvb[tvb_number]))) (te->chunk_count[CHUNK_TYPE(si->tvb[tvb_number])])++; - } + else + (te->chunk_count[OTHER_CHUNKS_INDEX])++; } } return (1); @@ -237,6 +210,11 @@ sctpstat_draw(void *phs) 12, tmp->chunk_count[SCTP_ABORT_CHUNK_ID], 13, tmp->chunk_count[SCTP_ERROR_CHUNK_ID], 14, tmp->chunk_count[SCTP_NR_SACK_CHUNK_ID], + 15, tmp->chunk_count[SCTP_ASCONF_ACK_CHUNK_ID], + 16, tmp->chunk_count[SCTP_PKTDROP_CHUNK_ID], + 17, tmp->chunk_count[SCTP_FORWARD_TSN_CHUNK_ID], + 18, tmp->chunk_count[SCTP_ASCONF_CHUNK_ID], + 19, tmp->chunk_count[OTHER_CHUNKS_INDEX], -1 ); } @@ -267,14 +245,19 @@ static const stat_column titles[]={ {G_TYPE_UINT, RIGHT, "DATA" }, {G_TYPE_UINT, RIGHT, "SACK" }, {G_TYPE_UINT, RIGHT, "HBEAT" }, - {G_TYPE_UINT, RIGHT, "HBEAT_ACK" }, + {G_TYPE_UINT, RIGHT, "HBEAT-ACK" }, {G_TYPE_UINT, RIGHT, "INIT" }, - {G_TYPE_UINT, RIGHT, "INIT_ACK" }, + {G_TYPE_UINT, RIGHT, "INIT-ACK" }, {G_TYPE_UINT, RIGHT, "COOKIE" }, - {G_TYPE_UINT, RIGHT, "COOKIE_ACK" }, + {G_TYPE_UINT, RIGHT, "COOKIE-ACK" }, {G_TYPE_UINT, RIGHT, "ABORT" }, {G_TYPE_UINT, RIGHT, "ERROR" }, - {G_TYPE_UINT, RIGHT, "NR_SACK" } + {G_TYPE_UINT, RIGHT, "NR-SACK" }, + {G_TYPE_UINT, RIGHT, "ASCONF-ACK" }, + {G_TYPE_UINT, RIGHT, "PKTDROP" }, + {G_TYPE_UINT, RIGHT, "FORWARD-TSN" }, + {G_TYPE_UINT, RIGHT, "ASCONF" }, + {G_TYPE_UINT, RIGHT, "Others" } }; static void @@ -297,7 +280,7 @@ sctpstat_init(const char *optarg, void *userdata _U_) hs->win = dlg_window_new("Wireshark: SCTP Chunk Statistics"); /* transient_for top_level */ gtk_window_set_destroy_with_parent (GTK_WINDOW(hs->win), TRUE); - gtk_window_set_default_size(GTK_WINDOW(hs->win), 600, 200); + gtk_window_set_default_size(GTK_WINDOW(hs->win), 700, 250); hs->vbox=gtk_vbox_new(FALSE, 3); gtk_container_set_border_width(GTK_CONTAINER(hs->vbox), 12); @@ -307,7 +290,7 @@ sctpstat_init(const char *optarg, void *userdata _U_) /* init a scrolled window*/ hs->scrolled_window = scrolled_window_new(NULL, NULL); - hs->table = create_stat_table(hs->scrolled_window, hs->vbox, 15, titles); + hs->table = create_stat_table(hs->scrolled_window, hs->vbox, 20, titles); error_string=register_tap_listener("sctp", hs, hs->filter, 0, sctpstat_reset, diff --git a/gtk/sctp_chunk_stat_dlg.c b/gtk/sctp_chunk_stat_dlg.c index e019d4a612..7e9f0a3d1d 100644 --- a/gtk/sctp_chunk_stat_dlg.c +++ b/gtk/sctp_chunk_stat_dlg.c @@ -64,7 +64,11 @@ enum chunk_types { CWR = 13, SHUT_COMPLETE = 14, AUTH = 15, - NR_SACK = 16 + NR_SACK = 16, + ASCONF_ACK = 0x80, + PKTDROP = 0x81, + FORWARD_TSN = 0xC0, + ASCONF = 0xC1 }; enum { @@ -86,6 +90,10 @@ enum SHUT_COMPLETE_COLUMN, AUTH_COLUMN, NR_SACK_COLUMN, + ASCONF_ACK_COLUMN, + PKTDROP_COLUMN, + FORWARD_TSN_COLUMN, + ASCONF_COLUMN, OTHERS_COLUMN, N_COLUMN /* The number of columns */ }; @@ -123,6 +131,10 @@ GtkWidget* create_list(void) G_TYPE_INT, /* SHUT_COMPLETE */ G_TYPE_INT, /* AUTH */ G_TYPE_INT, /* NR_SACK */ + G_TYPE_INT, /* ASCONF_ACK */ + G_TYPE_INT, /* PKTDROP */ + G_TYPE_INT, /* FORWARD_TSN */ + G_TYPE_INT, /* ASCONF */ G_TYPE_INT); /* Others */ /* Create a view */ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store)); @@ -184,13 +196,13 @@ GtkWidget* create_list(void) /* 4:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("INIT_ACK", renderer, + column = gtk_tree_view_column_new_with_attributes ("INIT-ACK", renderer, "text", INIT_ACK_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, INIT_ACK_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 80); + gtk_tree_view_column_set_min_width(column, 90); gtk_tree_view_append_column (list_view, column); /* 5:th column... */ @@ -212,18 +224,18 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_sort_column_id(column, HEARTBEAT_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 80); + gtk_tree_view_column_set_min_width(column, 110); gtk_tree_view_append_column (list_view, column); /* 7:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("HEARTBEAT_ACK", renderer, + column = gtk_tree_view_column_new_with_attributes ("HEARTBEAT-ACK", renderer, "text", HEARTBEAT_ACK_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, HEARTBEAT_ACK_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 120); + gtk_tree_view_column_set_min_width(column, 140); gtk_tree_view_append_column (list_view, column); /* 8:th column... */ @@ -234,7 +246,7 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_sort_column_id(column, ABORT_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_min_width(column, 80); gtk_tree_view_append_column (list_view, column); @@ -246,18 +258,18 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_sort_column_id(column, SHUTDOWN_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_min_width(column, 120); gtk_tree_view_append_column (list_view, column); /* 10:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("SHUTDOWN_ACK", renderer, + column = gtk_tree_view_column_new_with_attributes ("SHUTDOWN-ACK", renderer, "text", SHUTDOWN_ACK_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, SHUTDOWN_ACK_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 120); + gtk_tree_view_column_set_min_width(column, 150); gtk_tree_view_append_column (list_view, column); /* 11:th column... */ @@ -268,29 +280,29 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_sort_column_id(column, ERROR_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_min_width(column, 80); gtk_tree_view_append_column (list_view, column); /* 12:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("COOKIE_ECHO", renderer, - "text", COOKIE_ECHO, + column = gtk_tree_view_column_new_with_attributes ("COOKIE-ECHO", renderer, + "text", COOKIE_ECHO_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, COOKIE_ECHO_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 120); + gtk_tree_view_column_set_min_width(column, 130); gtk_tree_view_append_column (list_view, column); /* 13:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("COOKIE_ACK", renderer, + column = gtk_tree_view_column_new_with_attributes ("COOKIE-ACK", renderer, "text", COOKIE_ACK_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, COOKIE_ACK_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 120); + gtk_tree_view_column_set_min_width(column, 130); gtk_tree_view_append_column (list_view, column); /* 14:th column... */ @@ -317,13 +329,13 @@ GtkWidget* create_list(void) /* 16:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("SHUT_COMPLETE", renderer, + column = gtk_tree_view_column_new_with_attributes ("SHUT-COMPLETE", renderer, "text", SHUT_COMPLETE_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, SHUT_COMPLETE_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 140); + gtk_tree_view_column_set_min_width(column, 150); gtk_tree_view_append_column (list_view, column); /* 17:th column... */ @@ -339,7 +351,7 @@ GtkWidget* create_list(void) /* 18:th column... */ renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("NR_SACK", renderer, + column = gtk_tree_view_column_new_with_attributes ("NR-SACK", renderer, "text", NR_SACK_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, NR_SACK_COLUMN); @@ -350,13 +362,57 @@ GtkWidget* create_list(void) /* 19:th column... */ renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("ASCONF-ACK", renderer, + "text", ASCONF_ACK_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, ASCONF_ACK_COLUMN); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 120); + gtk_tree_view_append_column (list_view, column); + + /* 20:th column... */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("PKTDROP", renderer, + "text", PKTDROP_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, PKTDROP_COLUMN); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 100); + gtk_tree_view_append_column (list_view, column); + + /* 21:st column... */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("FORWARD-TSN", renderer, + "text", FORWARD_TSN_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, FORWARD_TSN_COLUMN); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 140); + gtk_tree_view_append_column (list_view, column); + + /* 22:nd column... */ + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("ASCONF", renderer, + "text", ASCONF_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, ASCONF_COLUMN); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 90); + gtk_tree_view_append_column (list_view, column); + + /* 23:rd column... */ + renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Others", renderer, "text", OTHERS_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id(column, OTHERS_COLUMN); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_min_width(column, 70); + gtk_tree_view_column_set_min_width(column, 80); gtk_tree_view_append_column (list_view, column); /* Now enable the sorting of each column */ @@ -394,6 +450,10 @@ static const char *chunk_name(int type) CASE(SHUT_COMPLETE); CASE(AUTH); CASE(NR_SACK); + CASE(ASCONF_ACK); + CASE(PKTDROP); + CASE(FORWARD_TSN); + CASE(ASCONF); } return s; } @@ -447,24 +507,28 @@ static void add_to_clist(sctp_addr_chunk* sac) gtk_list_store_set (list_store, &iter, #endif IP_ADDR_COLUMN, field[0], - DATA_COLUMN, sac->addr_count[0], - INIT_COLUMN, sac->addr_count[1], - INIT_ACK_COLUMN, sac->addr_count[2], - SACK_COLUMN, sac->addr_count[3], - HEARTBEAT_COLUMN, sac->addr_count[4], - HEARTBEAT_ACK_COLUMN, sac->addr_count[5], - ABORT_COLUMN, sac->addr_count[6], - SHUTDOWN_COLUMN, sac->addr_count[7], - SHUTDOWN_ACK_COLUMN, sac->addr_count[8], - ERROR_COLUMN, sac->addr_count[9], - COOKIE_ECHO_COLUMN, sac->addr_count[10], - COOKIE_ACK_COLUMN, sac->addr_count[11], - ECNE_COLUMN, sac->addr_count[12], - CWR_COLUMN, sac->addr_count[13], - SHUT_COMPLETE_COLUMN, sac->addr_count[14], - AUTH_COLUMN, sac->addr_count[15], - NR_SACK_COLUMN, sac->addr_count[16], - OTHERS_COLUMN, sac->addr_count[17], + DATA_COLUMN, sac->addr_count[SCTP_DATA_CHUNK_ID], + INIT_COLUMN, sac->addr_count[SCTP_INIT_CHUNK_ID], + INIT_ACK_COLUMN, sac->addr_count[SCTP_INIT_ACK_CHUNK_ID], + SACK_COLUMN, sac->addr_count[SCTP_SACK_CHUNK_ID], + HEARTBEAT_COLUMN, sac->addr_count[SCTP_HEARTBEAT_CHUNK_ID], + HEARTBEAT_ACK_COLUMN, sac->addr_count[SCTP_HEARTBEAT_ACK_CHUNK_ID], + ABORT_COLUMN, sac->addr_count[SCTP_ABORT_CHUNK_ID], + SHUTDOWN_COLUMN, sac->addr_count[SCTP_SHUTDOWN_CHUNK_ID], + SHUTDOWN_ACK_COLUMN, sac->addr_count[SCTP_SHUTDOWN_ACK_CHUNK_ID], + ERROR_COLUMN, sac->addr_count[SCTP_ERROR_CHUNK_ID], + COOKIE_ECHO_COLUMN, sac->addr_count[SCTP_COOKIE_ECHO_CHUNK_ID], + COOKIE_ACK_COLUMN, sac->addr_count[SCTP_COOKIE_ACK_CHUNK_ID], + ECNE_COLUMN, sac->addr_count[SCTP_ECNE_CHUNK_ID], + CWR_COLUMN, sac->addr_count[SCTP_CWR_CHUNK_ID], + SHUT_COMPLETE_COLUMN, sac->addr_count[SCTP_SHUTDOWN_COMPLETE_CHUNK_ID], + AUTH_COLUMN, sac->addr_count[SCTP_AUTH_CHUNK_ID], + NR_SACK_COLUMN, sac->addr_count[SCTP_NR_SACK_CHUNK_ID], + ASCONF_ACK_COLUMN, sac->addr_count[SCTP_ASCONF_ACK_CHUNK_ID], + PKTDROP_COLUMN, sac->addr_count[SCTP_PKTDROP_CHUNK_ID], + FORWARD_TSN_COLUMN, sac->addr_count[SCTP_FORWARD_TSN_CHUNK_ID], + ASCONF_COLUMN, sac->addr_count[SCTP_ASCONF_CHUNK_ID], + OTHERS_COLUMN, sac->addr_count[OTHER_CHUNKS_INDEX], -1); } @@ -647,24 +711,27 @@ static void sctp_chunk_dlg(struct sctp_udata *u_data) gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1); row ++; - for (i=0; ichunk_count[i]); - label = gtk_label_new(label_txt); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); - gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, row, row+1); - g_snprintf(label_txt, 10, "%u", selected_stream->ep1_chunk_count[i]); - label = gtk_label_new(label_txt); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); - gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, row, row+1); - g_snprintf(label_txt, 10, "%u", selected_stream->ep2_chunk_count[i]); - label = gtk_label_new(label_txt); - gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); - gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1); - row ++; + if (IS_SCTP_CHUNK_TYPE(i)) + { + label = gtk_label_new(chunk_name(i)); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, row, row+1); + g_snprintf(label_txt, 10, "%u", selected_stream->chunk_count[i]); + label = gtk_label_new(label_txt); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); + gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, row, row+1); + g_snprintf(label_txt, 10, "%u", selected_stream->ep1_chunk_count[i]); + label = gtk_label_new(label_txt); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); + gtk_table_attach_defaults(GTK_TABLE(table), label, 2, 3, row, row+1); + g_snprintf(label_txt, 10, "%u", selected_stream->ep2_chunk_count[i]); + label = gtk_label_new(label_txt); + gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); + gtk_table_attach_defaults(GTK_TABLE(table), label, 3, 4, row, row+1); + row ++; + } } label = gtk_label_new("Others"); @@ -716,7 +783,8 @@ void sctp_chunk_dlg_show(struct sctp_analyse* userdata) selected_stream=u_data->assoc; for (i=0; ichunk_count[i]=u_data->assoc->chunk_count[i]; + if (IS_SCTP_CHUNK_TYPE(i) || i == OTHER_CHUNKS_INDEX) + selected_stream->chunk_count[i]=u_data->assoc->chunk_count[i]; } set_child(u_data, u_data->parent); increase_childcount(u_data->parent); diff --git a/gtk/sctp_stat.c b/gtk/sctp_stat.c index a67bbade04..3220dab444 100644 --- a/gtk/sctp_stat.c +++ b/gtk/sctp_stat.c @@ -44,26 +44,6 @@ #include "gtk/sctp_stat.h" #include "gtk/main.h" - -#define SCTP_HEARTBEAT_CHUNK_ID 4 -#define SCTP_HEARTBEAT_ACK_CHUNK_ID 5 -#define SCTP_ABORT_CHUNK_ID 6 -#define SCTP_SHUTDOWN_CHUNK_ID 7 -#define SCTP_SHUTDOWN_ACK_CHUNK_ID 8 -#define SCTP_ERROR_CHUNK_ID 9 -#define SCTP_COOKIE_ECHO_CHUNK_ID 10 -#define SCTP_COOKIE_ACK_CHUNK_ID 11 -#define SCTP_ECNE_CHUNK_ID 12 -#define SCTP_CWR_CHUNK_ID 13 -#define SCTP_SHUTDOWN_COMPLETE_CHUNK_ID 14 -#define SCTP_AUTH_CHUNK_ID 15 -#define SCTP_NR_SACK_CHUNK_ID 16 -#define SCTP_FORWARD_TSN_CHUNK_ID 192 -#define SCTP_ASCONF_ACK_CHUNK_ID 0x80 -#define SCTP_PKTDROP_CHUNK_ID 0X81 -#define SCTP_ASCONF_CHUNK_ID 0XC1 -#define SCTP_IETF_EXT 255 - #define SCTP_ABORT_CHUNK_T_BIT 0x01 #define PARAMETER_TYPE_LENGTH 2 @@ -471,7 +451,7 @@ static sctp_assoc_info_t * add_chunk_count(address * vadd, sctp_assoc_info_t * i guint8 * dat; int i; - list = g_list_first(info->addr_chunk_count); + list = g_list_first(info->addr_chunk_count); while (list) { @@ -481,7 +461,7 @@ static sctp_assoc_info_t * add_chunk_count(address * vadd, sctp_assoc_info_t * i v = (address *) (ch->addr); if (ADDRESSES_EQUAL(vadd, v)) { - if (type <= UPPER_BOUND_CHUNK_TYPE) + if (IS_SCTP_CHUNK_TYPE(type)) ch->addr_count[type]++; else ch->addr_count[OTHER_CHUNKS_INDEX]++; @@ -506,7 +486,7 @@ static sctp_assoc_info_t * add_chunk_count(address * vadd, sctp_assoc_info_t * i for (i=0; i < NUM_CHUNKS; i++) ch->addr_count[i] = 0; - if (type <= UPPER_BOUND_CHUNK_TYPE) + if (IS_SCTP_CHUNK_TYPE(type)) ch->addr_count[type]++; else ch->addr_count[OTHER_CHUNKS_INDEX]++; @@ -791,7 +771,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v } idx = tvb_get_guint8(sctp_info->tvb[0],0); - if (idx > UPPER_BOUND_CHUNK_TYPE) + if (!IS_SCTP_CHUNK_TYPE(idx)) idx = OTHER_CHUNKS_INDEX; info->chunk_count[idx]++; @@ -816,7 +796,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v for (chunk_number = 0; chunk_number < sctp_info->number_of_tvbs; chunk_number++) { idx = tvb_get_guint8(sctp_info->tvb[0],0); - if ( idx > UPPER_BOUND_CHUNK_TYPE ) + if (!IS_SCTP_CHUNK_TYPE(idx)) idx = OTHER_CHUNKS_INDEX; info->chunk_count[idx]++; @@ -1064,7 +1044,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v } idx = tvb_get_guint8(sctp_info->tvb[0],0); - if (idx > UPPER_BOUND_CHUNK_TYPE) + if (!IS_SCTP_CHUNK_TYPE(idx)) idx = OTHER_CHUNKS_INDEX; info->chunk_count[idx]++; if (info->direction == 1) @@ -1122,7 +1102,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v for (chunk_number = 0; chunk_number < sctp_info->number_of_tvbs; chunk_number++) { idx = tvb_get_guint8(sctp_info->tvb[chunk_number],0); - if (idx > UPPER_BOUND_CHUNK_TYPE) + if (!IS_SCTP_CHUNK_TYPE(idx)) idx = OTHER_CHUNKS_INDEX; info->chunk_count[idx]++; diff --git a/gtk/sctp_stat.h b/gtk/sctp_stat.h index 15c83c3129..7a27c7174b 100644 --- a/gtk/sctp_stat.h +++ b/gtk/sctp_stat.h @@ -49,7 +49,19 @@ #define SCTP_ERROR_CHUNK_ID 9 #define SCTP_COOKIE_ECHO_CHUNK_ID 10 #define SCTP_COOKIE_ACK_CHUNK_ID 11 +#define SCTP_ECNE_CHUNK_ID 12 +#define SCTP_CWR_CHUNK_ID 13 +#define SCTP_SHUTDOWN_COMPLETE_CHUNK_ID 14 +#define SCTP_AUTH_CHUNK_ID 15 #define SCTP_NR_SACK_CHUNK_ID 16 +#define SCTP_FORWARD_TSN_CHUNK_ID 0xc0 +#define SCTP_ASCONF_ACK_CHUNK_ID 0x80 +#define SCTP_PKTDROP_CHUNK_ID 0x81 +#define SCTP_ASCONF_CHUNK_ID 0xc1 +#define SCTP_IETF_EXT 255 + +#define IS_SCTP_CHUNK_TYPE(t) \ + (((t) <= 16) || ((t) == 0xC0) || ((t) == 0xC1) || ((t) == 0x80) || ((t) == 0x81)) #define CHUNK_TYPE_LENGTH 1 #define CHUNK_FLAGS_LENGTH 1 @@ -90,33 +102,15 @@ DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH) #define MAX_ADDRESS_LEN 47 -/* - * The NUM_CHUNKS field is used as the bound on the size of - * counter arrays that store the sctp chunk counts for each - * "Chunk Type" in a given association. - * UPPER_BOUND_CHUNK_TYPE variable is the upper bound on the - * "Chunk Type" field of an SCTP PDU, which will be - * interpreted by the current version of wireshark for - * displaying statistical information. - * As per RFC 4960 Chunk Types 0 to 14 are in use. - * Chunk Type 15 is AUTHENTICATION CHUNK defined in RFC 4895 - * The Chunk Type 16 is to be assigned to Non Renagable Sacks - * This version of wireshark will interpret chunk types from 0 - * to 16 and information corresponding to all chunk types - * > 16 are summed up and stored as "other" chunks at - * an index of 17 in appropriate data structures. - */ -#define UPPER_BOUND_CHUNK_TYPE 16 - -/* The below value is 18 */ -#define NUM_CHUNKS UPPER_BOUND_CHUNK_TYPE+2 +/* The below value is 256 */ +#define NUM_CHUNKS 0xff /* This variable is used as an index into arrays * which store the cumulative information corresponding * all chunks with Chunk Type greater > 16 * The value for the below variable is 17 */ -#define OTHER_CHUNKS_INDEX NUM_CHUNKS-1 +#define OTHER_CHUNKS_INDEX 0xfe /* VNB */ /* This variable stores the maximum chunk type value diff --git a/gtk/sctp_stat_dlg.c b/gtk/sctp_stat_dlg.c index 631e66f4b8..196a5f633c 100644 --- a/gtk/sctp_stat_dlg.c +++ b/gtk/sctp_stat_dlg.c @@ -126,7 +126,7 @@ GtkWidget *create_list(void) GtkCellRenderer *renderer; GtkTreeView *list_view; GtkTreeSelection *selection; - + list_store = gtk_list_store_new(N_COLUMN, G_TYPE_UINT, /* Port1*/ G_TYPE_UINT, /* Port2*/