From Irene Ruengeler: Bugfixes and support of chunk statistics per end point.
[obnox/wireshark/wip.git] / gtk / sctp_assoc_analyse.c
index 4b9047a10b29ab43f51c65e560b1aca6f8f9ae2f..6a76e603fda544b6736f72da6028d0d8fe54f674 100644 (file)
 
 #include "sctp_stat.h"
 
-struct v4addr {
-address_type   type;
-int            len;
-guint32                addr;
-};
-
-struct v6addr {
-address_type   type;
-int            len;
-guint8         addr[16];
-};
+static sctp_assoc_info_t static_assoc;
 
 void
 decrease_childcount(struct sctp_analyse *parent)
@@ -79,14 +69,14 @@ remove_child(struct sctp_udata *child, struct sctp_analyse *parent)
 }
 
 static void
-on_destroy(GtkObject       *object _U_, gpointer         user_data)
+on_destroy(GtkObject  *object _U_, gpointer user_data)
 {
-struct sctp_analyse *u_data;
-guint16 i, j;
-GList *list;
-struct sctp_udata *child_data;
+       struct sctp_analyse *u_data;
+       guint16 i, j;
+       GList *list;
+       struct sctp_udata *child_data;
 
-u_data=(struct sctp_analyse*)user_data;
+       u_data=(struct sctp_analyse*)user_data;
 
        if (u_data->window)
        {
@@ -107,6 +97,7 @@ u_data=(struct sctp_analyse*)user_data;
                g_list_free(u_data->children);
                u_data->children = NULL;
        }
+       
        g_free(u_data->analyse_nb->page2);
        g_free(u_data->analyse_nb->page3);
        g_free(u_data->analyse_nb);
@@ -119,14 +110,26 @@ u_data=(struct sctp_analyse*)user_data;
 }
 
 static void
-on_notebook_switch_page(void)
+on_notebook_switch_page()
 {
 }
 
-static void on_error_bt(GtkWidget *widget _U_, struct sctp_analyse* u_data)
+static void on_chunk_stat_bt(GtkWidget *widget _U_, struct sctp_analyse* u_data)
 {
+       sctp_assoc_info_t* assinfo=NULL;
+       int i;
 
-       sctp_error_dlg_show(u_data->assoc);
+       assinfo = g_malloc(sizeof(sctp_assoc_info_t));
+       assinfo=&static_assoc;
+       assinfo->addr_chunk_count=(static_assoc.addr_chunk_count);
+       for (i=0; i<NUM_CHUNKS; i++)
+       {
+               assinfo->chunk_count[i]=static_assoc.chunk_count[i];
+               assinfo->ep1_chunk_count[i]=static_assoc.ep1_chunk_count[i];
+               assinfo->ep2_chunk_count[i]=static_assoc.ep2_chunk_count[i];
+       }
+       u_data->assoc=assinfo;
+       sctp_chunk_dlg_show(u_data);
 }
 
 static void on_close_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
@@ -139,6 +142,28 @@ static void on_close_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
        }
 }
 
+static void on_chunk1_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
+{
+sctp_assoc_info_t* assinfo=NULL;
+       
+       assinfo = g_malloc(sizeof(sctp_assoc_info_t));
+       assinfo=&static_assoc;
+       assinfo->addr_chunk_count=(static_assoc.addr_chunk_count);
+       u_data->assoc=assinfo;
+       sctp_chunk_stat_dlg_show(1, u_data);
+}
+
+static void on_chunk2_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
+{
+sctp_assoc_info_t* assinfo=NULL;
+
+       assinfo = g_malloc(sizeof(sctp_assoc_info_t));
+       assinfo=&static_assoc;
+       assinfo->addr_chunk_count=(static_assoc.addr_chunk_count);      
+       u_data->assoc=assinfo;
+       sctp_chunk_stat_dlg_show(2, u_data);
+}
+
 static void on_graph1_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
 {
        create_graph(1, u_data);
@@ -162,17 +187,15 @@ static void on_graph_byte2_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_dat
 void
 update_analyse_dlg(struct sctp_analyse* u_data)
 {
-gchar label_txt[50];
-gchar *data[1];
-gchar field[1][32];
-gint added_row;
-GList *list;
-struct v4addr  *v4=NULL;
-struct v6addr *v6=NULL;
-address *store=NULL;
-
-if (u_data->assoc==NULL)
-       return;
+       gchar label_txt[50];
+       gchar *data[1];
+       gchar field[1][MAX_ADDRESS_LEN];
+       gint added_row;
+       GList *list;
+       address *store=NULL;
+
+       if (u_data->assoc==NULL)
+               return;
 
        if (u_data->window != NULL)
        {
@@ -203,7 +226,7 @@ if (u_data->assoc==NULL)
        gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->bytes_ep2), label_txt);
 
        if (u_data->assoc->init==TRUE)
-               gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page2->addr_frame), "Complete list of IP-Addresses as provided in the INIT-Chunk");
+               gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page2->addr_frame), "Complete list of IP-Addresses as provided in the INIT-Chunk");
        else if (u_data->assoc->initack==TRUE && u_data->assoc->initack_dir==1)
                gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page2->addr_frame), "Complete list of IP-Addresses as provided in the INITACK-Chunk");
        else
@@ -211,32 +234,30 @@ if (u_data->assoc==NULL)
 
 
 
-               if (u_data->assoc->addr1!=NULL)
+       if (u_data->assoc->addr1!=NULL)
+       {
+               list = g_list_first(u_data->assoc->addr1);
+               while (list)
                {
-                       list = g_list_first(u_data->assoc->addr1);
-                       while (list)
+                       data[0]=&field[0][0];
+                       store = (address *) (list->data);
+                       if (store->type==AT_IPv4)
                        {
-                               data[0]=&field[0][0];
-                               store = (address *) (list->data);
-                               if (store->type==AT_IPv4)
-                               {
-                                       v4 = (struct v4addr *)(list->data);
-                                       g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)&(v4->addr)));
-                               }
-                               else if (store->type==AT_IPv6)
-                               {               
-                               v6 = (struct v6addr *)(list->data);
-                                       g_snprintf(field[0], 30, "%s", ip6_to_str((const struct e_in6_addr *)&(v6->addr)));
-                               }
-                               added_row = gtk_clist_append(GTK_CLIST(u_data->analyse_nb->page2->clist), data);
-                               gtk_clist_set_row_data(GTK_CLIST(u_data->analyse_nb->page2->clist), added_row, u_data->assoc);
-                               list = g_list_next(list);
+                               g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)(store->data)));
                        }
+                       else if (store->type==AT_IPv6)
+                       {               
+                               g_snprintf(field[0], 40, "%s", ip6_to_str((const struct e_in6_addr *)(store->data)));
+                       }
+                       added_row = gtk_clist_append(GTK_CLIST(u_data->analyse_nb->page2->clist), data);
+                       gtk_clist_set_row_data(GTK_CLIST(u_data->analyse_nb->page2->clist), added_row, u_data->assoc);
+                       list = g_list_next(list);
                }
-               else
-               {
+       }
+       else
+       {
                return;
-               }
+       }
        g_snprintf(label_txt, 50,"Port: %u",u_data->assoc->port1);
        gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->port), label_txt);
        g_snprintf(label_txt, 50,"Sent Verification Tag: 0x%x",u_data->assoc->verification_tag1);
@@ -244,7 +265,7 @@ if (u_data->assoc==NULL)
 
        if (u_data->assoc->init==TRUE || (u_data->assoc->initack==TRUE && u_data->assoc->initack_dir==1))
        {
-       g_snprintf(label_txt, 50,"Requested Number of Inbound Streams: %u",u_data->assoc->instream1);
+               g_snprintf(label_txt, 50,"Requested Number of Inbound Streams: %u",u_data->assoc->instream1);
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_in), label_txt);
                g_snprintf(label_txt, 50,"Minimum Number of Inbound Streams: %u",((u_data->assoc->instream1>u_data->assoc->outstream2)?u_data->assoc->outstream2:u_data->assoc->instream1));
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->min_in), label_txt);
@@ -256,14 +277,14 @@ if (u_data->assoc==NULL)
        }
        else
        {
-       g_snprintf(label_txt, 50,"Used Number of Inbound Streams: %u",u_data->assoc->instream1);
+               g_snprintf(label_txt, 50,"Used Number of Inbound Streams: %u",u_data->assoc->instream1);
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_in), label_txt);
                g_snprintf(label_txt, 50,"Used Number of Outbound Streams: %u",u_data->assoc->outstream1);
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page2->max_out), label_txt);
        }
 
        if (u_data->assoc->initack==TRUE && u_data->assoc->initack_dir==2)
-               gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page3->addr_frame), "Complete list of IP-Addresses as provided in the INITACK-Chunk");
+               gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page3->addr_frame), "Complete list of IP-Addresses as provided in the INITACK-Chunk");
        else
                gtk_frame_set_label(GTK_FRAME (u_data->analyse_nb->page3->addr_frame), "List of used IP-Addresses");
 
@@ -271,7 +292,7 @@ if (u_data->assoc==NULL)
        if (u_data->assoc->addr2!=NULL)
        {
 
-       list = g_list_first(u_data->assoc->addr2);
+               list = g_list_first(u_data->assoc->addr2);
 
                while (list)
                {
@@ -279,14 +300,11 @@ if (u_data->assoc==NULL)
                        store = (address *) (list->data);
                        if (store->type==AT_IPv4)
                        {
-                               
-                               v4 = (struct v4addr *)(list->data);
-                               g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)&(v4->addr)));
+                               g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)(store->data)));
                        }
                        else if (store->type==AT_IPv6)
                        {
-                               v6 = (struct v6addr *)(list->data);
-                               g_snprintf(field[0], 30, "%s", ip6_to_str((const struct e_in6_addr *)&(v6->addr)));
+                               g_snprintf(field[0], 40, "%s", ip6_to_str((const struct e_in6_addr *)(store->data)));
                        }
                        added_row = gtk_clist_append(GTK_CLIST(u_data->analyse_nb->page3->clist), data);
                        gtk_clist_set_row_data(GTK_CLIST(u_data->analyse_nb->page3->clist), added_row, u_data->assoc);
@@ -294,9 +312,9 @@ if (u_data->assoc==NULL)
                }
        }
                else
-               {
+       {
                return;
-               }
+       }
 
        g_snprintf(label_txt, 50,"Port: %u",u_data->assoc->port2);
        gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->port), label_txt);
@@ -305,7 +323,7 @@ if (u_data->assoc==NULL)
 
        if (u_data->assoc->initack==TRUE)
        {
-       g_snprintf(label_txt, 50,"Requested Number of Inbound Streams: %u",u_data->assoc->instream2);
+               g_snprintf(label_txt, 50,"Requested Number of Inbound Streams: %u",u_data->assoc->instream2);
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_in), label_txt);
                g_snprintf(label_txt, 50,"Minimum Number of Inbound Streams: %u",((u_data->assoc->instream2>u_data->assoc->outstream1)?u_data->assoc->outstream1:u_data->assoc->instream2));
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_in), label_txt);
@@ -317,7 +335,7 @@ if (u_data->assoc==NULL)
        }
        else
        {
-       g_snprintf(label_txt, 50,"Used Number of Inbound Streams: %u",u_data->assoc->instream2);
+               g_snprintf(label_txt, 50,"Used Number of Inbound Streams: %u",u_data->assoc->instream2);
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->max_in), label_txt);
                g_snprintf(label_txt, 50,"Used Number of Outbound Streams: %u",u_data->assoc->outstream2);
                gtk_label_set_text(GTK_LABEL(u_data->analyse_nb->page3->min_out), label_txt);
@@ -326,12 +344,13 @@ if (u_data->assoc==NULL)
 
 static void analyse_window_set_title(struct sctp_analyse *u_data)
 {
-       char            *title;
+       char *title;
+       
        if(!u_data->window){
                return;
        }
        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);
+                               cf_get_display_name(&cfile), u_data->assoc->port1, u_data->assoc->port2);
        gtk_window_set_title(GTK_WINDOW(u_data->window), title);
        g_free(title);
 }
@@ -342,7 +361,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
        GtkWidget *notebook;
        GtkWidget *main_vb, *page1, *page2, *page3, *hbox, *vbox_l, *vbox_r, *addr_hb, *stat_fr;
        GtkWidget *hbox_l1, *hbox_l2,*label, *h_button_box;
-       GtkWidget *error_bt, *close_bt, *graph_bt1, *graph_bt2;
+       GtkWidget *chunk_stat_bt, *close_bt, *graph_bt1, *graph_bt2, *chunk_bt1;
 
        u_data->analyse_nb = g_malloc(sizeof(struct notes));
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -411,10 +430,10 @@ void create_analyse_window(struct sctp_analyse* u_data)
        gtk_button_box_set_child_ipadding(GTK_BUTTON_BOX (hbox), 4, 0);
        gtk_widget_show(hbox);
 
-       error_bt = gtk_button_new_with_label ("Show Errors");
-       gtk_box_pack_start(GTK_BOX(hbox), error_bt, FALSE, FALSE, 0);
-       gtk_widget_show(error_bt);
-       SIGNAL_CONNECT(error_bt, "clicked", on_error_bt, u_data);
+       chunk_stat_bt = gtk_button_new_with_label ("Chunk Statistics");
+       gtk_box_pack_start(GTK_BOX(hbox), chunk_stat_bt, FALSE, FALSE, 0);
+       gtk_widget_show(chunk_stat_bt);
+       SIGNAL_CONNECT(chunk_stat_bt, "clicked", on_chunk_stat_bt, u_data);
 
 
        close_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE);
@@ -433,7 +452,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
 
        u_data->analyse_nb->page2 = g_malloc(sizeof(struct page));
 
-               u_data->analyse_nb->page2->addr_frame = gtk_frame_new(NULL);
+       u_data->analyse_nb->page2->addr_frame = gtk_frame_new(NULL);
        gtk_container_add(GTK_CONTAINER(page2), u_data->analyse_nb->page2->addr_frame);
 
        addr_hb = gtk_hbox_new(FALSE, 3);
@@ -456,7 +475,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
        gtk_widget_show(u_data->analyse_nb->page2->scrolled_window);
 
        stat_fr = gtk_frame_new(NULL);
-       gtk_container_add(GTK_CONTAINER(page2), stat_fr);
+       gtk_container_add(GTK_CONTAINER(page2), stat_fr);
 
        hbox = gtk_hbox_new(FALSE,3);
        gtk_container_border_width(GTK_CONTAINER(hbox), 5);
@@ -465,6 +484,8 @@ void create_analyse_window(struct sctp_analyse* u_data)
        vbox_l=gtk_vbox_new(FALSE, 3);
        gtk_box_pack_start(GTK_BOX(hbox), vbox_l, TRUE, TRUE, 0);
 
+
+
        hbox_l1=gtk_hbox_new(FALSE,3);
        gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l1, TRUE, TRUE, 0);
 
@@ -509,6 +530,11 @@ void create_analyse_window(struct sctp_analyse* u_data)
        gtk_button_box_set_spacing(GTK_BUTTON_BOX (h_button_box), 0);
        gtk_button_box_set_child_ipadding(GTK_BUTTON_BOX (h_button_box), 4, 0);
        gtk_widget_show(h_button_box);
+       
+       chunk_bt1 = gtk_button_new_with_label("Chunk Statistics");
+       gtk_box_pack_start(GTK_BOX(h_button_box), chunk_bt1, FALSE, FALSE, 0);
+       gtk_widget_show(chunk_bt1);
+       SIGNAL_CONNECT(chunk_bt1, "clicked", on_chunk1_dlg,u_data);
 
        graph_bt1 = gtk_button_new_with_label("Graph TSN");
        gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt1, FALSE, FALSE, 0);
@@ -528,7 +554,8 @@ void create_analyse_window(struct sctp_analyse* u_data)
        label = gtk_label_new(" Endpoint 1 ");
        gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page2, label);
 
-/* same page for endpoint 2*/
+       /* same page for endpoint 2*/
+
        page3 = gtk_vbox_new(FALSE, 8);
        gtk_container_set_border_width(GTK_CONTAINER(page3), 8);
        u_data->analyse_nb->page3 = g_malloc(sizeof(struct page));
@@ -542,10 +569,9 @@ void create_analyse_window(struct sctp_analyse* u_data)
 
        u_data->analyse_nb->page3->scrolled_window = scrolled_window_new(NULL, NULL);
        WIDGET_SET_SIZE(u_data->analyse_nb->page3->scrolled_window, 560, 100);
-       u_data->analyse_nb->page3->scrolled_window = scrolled_window_new(NULL, NULL);
-       WIDGET_SET_SIZE(u_data->analyse_nb->page3->scrolled_window, 560, 100);
+
        u_data->analyse_nb->page3->clist = gtk_clist_new(1);
-       gtk_widget_show(u_data->analyse_nb->page3->clist);
+       gtk_widget_show(u_data->analyse_nb->page3->clist);              
 
        gtk_clist_set_column_width(GTK_CLIST(u_data->analyse_nb->page3->clist), 0, 200);
        gtk_clist_set_column_justification(GTK_CLIST(u_data->analyse_nb->page3->clist), 0, GTK_JUSTIFY_LEFT);
@@ -557,7 +583,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
        gtk_widget_show(u_data->analyse_nb->page3->scrolled_window);
 
        stat_fr = gtk_frame_new(NULL);
-       gtk_container_add(GTK_CONTAINER(page3), stat_fr);
+       gtk_container_add(GTK_CONTAINER(page3), stat_fr);
 
        hbox = gtk_hbox_new(FALSE,3);
        gtk_container_border_width(GTK_CONTAINER(hbox), 5);
@@ -565,7 +591,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
 
        vbox_l=gtk_vbox_new(FALSE, 3);
        gtk_box_pack_start(GTK_BOX(hbox), vbox_l, TRUE, TRUE, 0);
-
+               
        hbox_l1=gtk_hbox_new(FALSE,3);
        gtk_box_pack_start(GTK_BOX(vbox_l), hbox_l1, TRUE, TRUE, 0);
 
@@ -590,7 +616,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
        gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->max_in),0,0);
        u_data->analyse_nb->page3->min_in = gtk_label_new("");
        gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->min_in, TRUE, TRUE, 0);
-       gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->min_in),0,0);
+       gtk_misc_set_alignment (GTK_MISC(u_data->analyse_nb->page3->min_in),0,0);               
 
        u_data->analyse_nb->page3->max_out = gtk_label_new("");
        gtk_box_pack_start(GTK_BOX(vbox_r), u_data->analyse_nb->page3->max_out, TRUE, TRUE, 0);
@@ -608,7 +634,12 @@ void create_analyse_window(struct sctp_analyse* u_data)
        gtk_button_box_set_spacing(GTK_BUTTON_BOX (h_button_box), 0);
        gtk_button_box_set_child_ipadding(GTK_BUTTON_BOX (h_button_box), 4, 0);
        gtk_widget_show(h_button_box);
-
+       
+       chunk_bt1 = gtk_button_new_with_label("Chunk Statistics");
+       gtk_box_pack_start(GTK_BOX(h_button_box), chunk_bt1, FALSE, FALSE, 0);
+       gtk_widget_show(chunk_bt1);
+       SIGNAL_CONNECT(chunk_bt1, "clicked", on_chunk2_dlg, u_data);
+       
        graph_bt1 = gtk_button_new_with_label("Graph");
        gtk_box_pack_start(GTK_BOX(h_button_box), graph_bt1, FALSE, FALSE, 0);
        gtk_widget_show(graph_bt1);
@@ -643,40 +674,52 @@ void create_analyse_window(struct sctp_analyse* u_data)
 
 void assoc_analyse(sctp_assoc_info_t* assoc)
 {
-struct sctp_analyse* u_data;
+       struct sctp_analyse* u_data;
+       int i;
 
        u_data = g_malloc(sizeof(struct sctp_analyse));
        u_data->assoc=assoc;
+       u_data->assoc->addr_chunk_count=assoc->addr_chunk_count;
        u_data->window=NULL;
        u_data->analyse_nb=NULL;
        u_data->children=NULL;
        u_data->num_children=0;
+       static_assoc.addr_chunk_count=assoc->addr_chunk_count;
+       static_assoc.port1=assoc->port1;
+       static_assoc.port2=assoc->port2;
+       for (i=0; i<NUM_CHUNKS; i++)
+       {
+               static_assoc.chunk_count[i]=assoc->chunk_count[i];
+               static_assoc.ep1_chunk_count[i]=assoc->ep1_chunk_count[i];
+               static_assoc.ep2_chunk_count[i]=assoc->ep2_chunk_count[i];
+       }
        set_analyse_child(u_data);
        increase_analyse_childcount();
-
+       static_assoc.addr_chunk_count=assoc->addr_chunk_count;
        create_analyse_window(u_data);
 }
 
 
 void sctp_analyse_cb(struct sctp_analyse* u_data)
 {
-guint32 ip_src;
-guint16 srcport;
-guint32 ip_dst;
-guint16 dstport;
-GList *list, *srclist, *dstlist;
-dfilter_t *sfcode;
-capture_file *cf;
-epan_dissect_t *edt;
-gint err;
-gchar *err_info;
-gboolean frame_matched;
-frame_data *fdata;
-gchar filter_text[256];
-sctp_assoc_info_t* assoc=NULL;
-struct v4addr *src, *dst;
-
-       strcpy(filter_text,"sctp && ip");
+       guint8* ip_src;
+       guint16 srcport;
+       guint8* ip_dst;
+       guint16 dstport;
+       GList *list, *srclist, *dstlist;
+       dfilter_t *sfcode;
+       capture_file *cf;
+       epan_dissect_t *edt;
+       gint err;
+       gchar *err_info;
+       gboolean frame_matched;
+       frame_data *fdata;
+       gchar filter_text[256];
+       sctp_assoc_info_t* assoc=NULL;
+       address *src, *dst;
+       int i;
+
+       strcpy(filter_text,"sctp");
        if (!dfilter_compile(filter_text, &sfcode)) {
                simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, dfilter_error_msg);
                return;
@@ -711,8 +754,10 @@ struct v4addr *src, *dst;
                return;
        }
 
-       g_memmove(&ip_src, edt->pi.src.data, 4);
-       g_memmove(&ip_dst, edt->pi.dst.data, 4);
+       ip_src = malloc(edt->pi.src.len);
+       memcpy(ip_src, edt->pi.src.data, edt->pi.src.len);
+       ip_dst = malloc(edt->pi.dst.len);
+       memcpy(ip_dst, edt->pi.dst.data, edt->pi.dst.len);
        srcport = edt->pi.srcport;
        dstport = edt->pi.destport;
 
@@ -727,18 +772,28 @@ struct v4addr *src, *dst;
                        srclist = g_list_first(assoc->addr1);
                        while(srclist)
                        {
-                               src = (struct v4addr *)(srclist->data);
+                               src = (address *)(srclist->data);
                                
-                               if (src->addr == ip_src)
+                               if (*src->data == *ip_src)
                                {
                                        dstlist = g_list_first(assoc->addr2);
                                        while(dstlist)
                                        {
-                                               dst = (struct v4addr *)(dstlist->data);
-                                               if (dst->addr == ip_dst)
+                                               dst = (address *)(dstlist->data);
+                                               if (*dst->data == *ip_dst)
                                                {
                                                        u_data->assoc=assoc;
-                                                               create_analyse_window(u_data);
+                                                       u_data->assoc->addr_chunk_count=assoc->addr_chunk_count;
+                                                       static_assoc.addr_chunk_count=assoc->addr_chunk_count;
+                                                       static_assoc.port1=assoc->port1;
+                                                       static_assoc.port2=assoc->port2;
+                                                       for (i=0; i<NUM_CHUNKS; i++)
+                                                       {
+                                                               static_assoc.chunk_count[i]=assoc->chunk_count[i];
+                                                               static_assoc.ep1_chunk_count[i]=assoc->ep1_chunk_count[i];
+                                                               static_assoc.ep2_chunk_count[i]=assoc->ep2_chunk_count[i];
+                                                       }
+                                                       create_analyse_window(u_data);
                                                        return;
                                                }
                                                else
@@ -748,26 +803,35 @@ struct v4addr *src, *dst;
                                else
                                        srclist = g_list_next(srclist);
                        }
-                       simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                   "Assoc not found!");
+                       simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Assoc not found!");
                        return;
                }
                else if (assoc->port2 == srcport && assoc->port1 == dstport)
-               {               
+               {
                        srclist = g_list_first(assoc->addr2);
                        while(srclist)
                        {
-                               src = (struct v4addr *)(srclist->data);
-                               if (src->addr == ip_src)
+                               src = (address *)(srclist->data);
+                               if (*src->data == *ip_src)
                                {
                                        dstlist = g_list_first(assoc->addr1);
                                        while(dstlist)
                                        {
-                                               dst = (struct v4addr *)(dstlist->data);
-                                               if (dst->addr == ip_dst)
+                                               dst = (address *)(dstlist->data);
+                                               if (*dst->data == *ip_dst)
                                                {
                                                        u_data->assoc=assoc;
-                                                               create_analyse_window(u_data);
+                                                       u_data->assoc->addr_chunk_count=assoc->addr_chunk_count;
+                                                       static_assoc.addr_chunk_count=assoc->addr_chunk_count;
+                                                       static_assoc.port1=assoc->port1;
+                                                       static_assoc.port2=assoc->port2;
+                                                       for (i=0; i<NUM_CHUNKS; i++)
+                                                       {
+                                                               static_assoc.chunk_count[i]=assoc->chunk_count[i];
+                                                               static_assoc.ep1_chunk_count[i]=assoc->ep1_chunk_count[i];
+                                                               static_assoc.ep2_chunk_count[i]=assoc->ep2_chunk_count[i];
+                                                       }
+                                                       create_analyse_window(u_data);
                                                        return;
                                                }
                                                else
@@ -777,8 +841,7 @@ struct v4addr *src, *dst;
                                else
                                        srclist = g_list_next(srclist);
                        }
-                       simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
-                   "Assoc not found!");
+                       simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Assoc not found!");
                        return;
                }
                else
@@ -790,14 +853,14 @@ struct v4addr *src, *dst;
 
 void sctp_analyse_start(GtkWidget *w _U_, gpointer data _U_)
 {
-struct sctp_analyse * u_data;
+       struct sctp_analyse * u_data;
 
        /* Register the tap listener */
        if (sctp_stat_get_info()->is_registered==FALSE)
-       register_tap_listener_sctp_stat();
-       /*  (redissect all packets) */
+               register_tap_listener_sctp_stat();
+       /* (redissect all packets) */
        
-       sctp_stat_scan();       
+       sctp_stat_scan();
 
        u_data = g_malloc(sizeof(struct sctp_analyse));
        u_data->assoc=NULL;
@@ -805,6 +868,7 @@ struct sctp_analyse * u_data;
        u_data->analyse_nb=NULL;
        u_data->window=NULL;
        u_data->num_children=0;
+
        cf_retap_packets(&cfile);
        sctp_analyse_cb(u_data);
 }
@@ -814,5 +878,5 @@ void
 register_tap_listener_sctp_analyse(void)
 {
        register_tap_menu_item("SCTP/Analyse Association", REGISTER_TAP_GROUP_NONE,
-           sctp_analyse_start, NULL, NULL, NULL);
+                              sctp_analyse_start, NULL, NULL, NULL);
 }