A fix from Irene Ruengeler to keep assocs selected when
authortuexen <tuexen@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 9 Feb 2007 21:05:43 +0000 (21:05 +0000)
committertuexen <tuexen@f5534014-38df-0310-8fa8-9805f1628bb7>
Fri, 9 Feb 2007 21:05:43 +0000 (21:05 +0000)
setting/applying filters.
Remove some warnings.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@20759 f5534014-38df-0310-8fa8-9805f1628bb7

gtk/sctp_assoc_analyse.c
gtk/sctp_byte_graph_dlg.c
gtk/sctp_graph_dlg.c
gtk/sctp_stat.c
gtk/sctp_stat_dlg.c

index e5edececb2dd1cbfbd4266b29334355ce1977a6b..ee1f136d7a9d2104d2928eb71d673df9f51e2030 100644 (file)
@@ -853,7 +853,7 @@ static void sctp_analyse_cb(struct sctp_analyse* u_data, gboolean ext)
        gchar filter_text[256];
        sctp_assoc_info_t* assoc = NULL;
        int i;
-       guint32 *fn; //frame_number
+       guint32 *fn;
 
        strcpy(filter_text,"sctp");
        if (!dfilter_compile(filter_text, &sfcode)) {
index b5a192f72cbc9badd03a276685b8e9a281fcd1e6..9473a2ed7178a6717adad2710331576d0543b7b8 100644 (file)
@@ -904,8 +904,8 @@ on_button_press (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_udata
        {
                gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->white_gc,
                                   FALSE,
-                                  (gint)floor(MIN(u_data->io->x_old,u_data->io->x_new)),
-                                  (gint)floor(MIN(u_data->io->y_old,u_data->io->y_new)),
+                                  floor(MIN(u_data->io->x_old,u_data->io->x_new)),
+                                  floor(MIN(u_data->io->y_old,u_data->io->y_new)),
                                   (gint)abs((long)(u_data->io->x_new-u_data->io->x_old)),
                                   (gint)abs((long)(u_data->io->y_new-u_data->io->y_old)));
                ios=(sctp_graph_t *)OBJECT_GET_DATA(u_data->io->draw_area, "sctp_graph_t");
@@ -973,10 +973,10 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
 
        if (abs((long)(event->x-u_data->io->x_old))>10 || abs((long)(event->y-u_data->io->y_old))>10)
        {
-               u_data->io->rect_x_min = (gint)floor(MIN(u_data->io->x_old,event->x));
-               u_data->io->rect_x_max = (gint)ceil(MAX(u_data->io->x_old,event->x));
-               u_data->io->rect_y_min = (gint)floor(MIN(u_data->io->y_old,event->y));
-               u_data->io->rect_y_max = (gint)ceil(MAX(u_data->io->y_old,event->y));
+               u_data->io->rect_x_min = floor(MIN(u_data->io->x_old,event->x));
+               u_data->io->rect_x_max = ceil(MAX(u_data->io->x_old,event->x));
+               u_data->io->rect_y_min = floor(MIN(u_data->io->y_old,event->y));
+               u_data->io->rect_y_max = ceil(MAX(u_data->io->y_old,event->y));
                gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,
                                   FALSE,
                                   u_data->io->rect_x_min, u_data->io->rect_y_min,
@@ -996,8 +996,8 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
                                u_data->io->draw_area->allocation.width,
                                u_data->io->draw_area->allocation.height);
 
-               x1_tmp=(unsigned int)floor(u_data->io->min_x+((u_data->io->x_old-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
-               x2_tmp=(unsigned int)floor(u_data->io->min_x+((event->x-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
+               x1_tmp=floor(u_data->io->min_x+((u_data->io->x_old-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
+               x2_tmp=floor(u_data->io->min_x+((event->x-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
                helpx=MIN(x1_tmp, x2_tmp);
                if (helpx==x2_tmp)
                {
@@ -1062,7 +1062,7 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
                        x_value = ((event->x-LEFT_BORDER-u_data->io->offset) * ((u_data->io->x2_tmp_sec+u_data->io->x2_tmp_usec/1000000.0)-(u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0)) / (u_data->io->pixmap_width-LEFT_BORDER-u_data->io->offset))+u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0;
                        y_value = floor((u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset-event->y) * (max_tsn - min_tsn) / (u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset)) + min_tsn;
                        text_color = u_data->io->draw_area->style->black_gc;
-                       g_snprintf(label_string, 30, "(%.6lf, %u)", x_value, y_value);
+                       g_snprintf(label_string, 30, "(%.6f, %u)", x_value, y_value);
                        label_set = TRUE;
 
                        gdk_draw_line(u_data->io->pixmap,text_color, event->x-2, event->y, event->x+2, event->y);
index 698d116012785f566fa12d4094587aa9578687a3..cfe547f0390aed60068fd879ba8b2e79f92b9d83 100644 (file)
@@ -946,10 +946,10 @@ on_button_press (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_udata
        {
                gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->white_gc,
                                   FALSE,
-                                  (gint)floor(MIN(u_data->io->x_old,u_data->io->x_new)),
-                                  (gint)floor(MIN(u_data->io->y_old,u_data->io->y_new)),
-                                  (gint)floor(abs((long)(u_data->io->x_new-u_data->io->x_old))),
-                                  (gint)floor(abs((long)(u_data->io->y_new-u_data->io->y_old))));
+                                  floor(MIN(u_data->io->x_old,u_data->io->x_new)),
+                                  floor(MIN(u_data->io->y_old,u_data->io->y_new)),
+                                  floor(abs((long)(u_data->io->x_new-u_data->io->x_old))),
+                                  floor(abs((long)(u_data->io->y_new-u_data->io->y_old))));
                ios=(sctp_graph_t *)OBJECT_GET_DATA(u_data->io->draw_area, "sctp_graph_t");
 
                if(!ios){
@@ -1014,10 +1014,10 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
                event->x = LEFT_BORDER+u_data->io->offset;
        if (abs((long)(event->x-u_data->io->x_old))>10 || abs((long)(event->y-u_data->io->y_old))>10)
        {
-               u_data->io->rect_x_min = (gint)floor(MIN(u_data->io->x_old,event->x));
-               u_data->io->rect_x_max = (gint)ceil(MAX(u_data->io->x_old,event->x));
-               u_data->io->rect_y_min = (gint)floor(MIN(u_data->io->y_old,event->y));
-               u_data->io->rect_y_max = (gint)ceil(MAX(u_data->io->y_old,event->y))+POINT_SIZE;
+               u_data->io->rect_x_min = floor(MIN(u_data->io->x_old,event->x));
+               u_data->io->rect_x_max = ceil(MAX(u_data->io->x_old,event->x));
+               u_data->io->rect_y_min = floor(MIN(u_data->io->y_old,event->y));
+               u_data->io->rect_y_max = ceil(MAX(u_data->io->y_old,event->y))+POINT_SIZE;
                gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,
                                   FALSE,
                                   u_data->io->rect_x_min, u_data->io->rect_y_min,
@@ -1037,8 +1037,8 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
                                u_data->io->draw_area->allocation.width,
                                u_data->io->draw_area->allocation.height);
 
-               x1_tmp=(unsigned int)floor(u_data->io->min_x+((u_data->io->x_old-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
-               x2_tmp=(unsigned int)floor(u_data->io->min_x+((event->x-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
+               x1_tmp=floor(u_data->io->min_x+((u_data->io->x_old-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
+               x2_tmp=floor(u_data->io->min_x+((event->x-LEFT_BORDER-u_data->io->offset)*u_data->io->tmp_width/u_data->io->axis_width));
                helpx=MIN(x1_tmp, x2_tmp);
                if (helpx==x2_tmp)
                {
@@ -1103,7 +1103,7 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
                        x_value = ((event->x-LEFT_BORDER-u_data->io->offset) * ((u_data->io->x2_tmp_sec+u_data->io->x2_tmp_usec/1000000.0)-(u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0)) / (u_data->io->pixmap_width-LEFT_BORDER-u_data->io->offset))+u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0;
                        y_value = floor((u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset-event->y) * (max_tsn - min_tsn) / (u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset)) + min_tsn;
                        text_color = u_data->io->draw_area->style->black_gc;
-                       g_snprintf(label_string, 30, "(%.6lf, %u)", x_value, y_value);
+                       g_snprintf(label_string, 30, "(%.6f, %u)", x_value, y_value);
                        label_set = TRUE;
 
                        gdk_draw_line(u_data->io->pixmap,text_color, event->x-2, event->y, event->x+2, event->y);
index ff0d5bebafa9efbdf731363bdacf2b24933cbc94..e86dd812c72ef010e12172ab423cec06ee07d59d 100644 (file)
@@ -307,7 +307,7 @@ static gint sctp_assoc_vtag_cmp(gconstpointer aa, gconstpointer bb)
            (a->port2 == b->port2) &&
            (a->verification_tag1 == b->verification_tag1) && a->verification_tag1==0 && a->initiate_tag != 0 &&
            (a->initiate_tag != b->initiate_tag ))
-               return(ASSOC_NOT_FOUND);   //two INITs that belong to different assocs
+               return(ASSOC_NOT_FOUND);
 
        /* assoc known*/
        if ((a->port1 == b->port1) &&
@@ -354,236 +354,6 @@ static gint sctp_assoc_vtag_cmp(gconstpointer aa, gconstpointer bb)
        return(ASSOC_NOT_FOUND);
 }
 
-/*
-static gint sctp_assoc_address_cmp(gconstpointer aa, gconstpointer bb)
-{
-       GList *srclist, *dstlist;
-       const struct _sctp_tmp_info* a = aa;
-       const struct _sctp_assoc_info* b = bb;
-       address *srcstore=NULL;
-       address *dststore=NULL;
-       address *src=NULL;
-       address *dst=NULL;
-       gboolean src_v4=FALSE;
-       gboolean src_v6=FALSE;
-       gboolean dst_v4=FALSE;
-       gboolean dst_v6=FALSE;
-       guint8* addr;
-
-       src = g_malloc(sizeof(address));
-       if (a->src.type == AT_IPv4)
-       {
-               src->type = AT_IPv4;
-               src->len  = 4;
-               src_v4    = TRUE;
-       }
-       else if (a->src.type==AT_IPv6)
-       {
-               src->type = AT_IPv6;
-               src->len  = 16;
-               src_v6    = TRUE;
-       }
-       addr = g_malloc(src->len);
-       memcpy(addr, a->src.data, src->len);
-       src->data = addr;
-
-       dst = g_malloc(sizeof(address));
-       if (a->dst.type == AT_IPv4)
-       {
-               dst->type = AT_IPv4;
-               dst->len  = 4;
-               dst_v4    = TRUE;
-       }
-       else if (a->dst.type==AT_IPv6)
-       {
-               dst->type = AT_IPv6;
-               dst->len  = 16;
-               dst_v6    = TRUE;
-       }
-       addr = g_malloc(dst->len);
-       memcpy(addr, a->dst.data, dst->len);
-       dst->data = addr;
-
-       srclist = g_list_first(b->addr1);
-       while (srclist)
-       {
-               srcstore = (address *) (srclist->data);
-               if (srcstore->type==AT_IPv4 && src_v4==TRUE)
-               {
-                       if (*src->data==*srcstore->data && a->port1 == b->port1)
-                       {
-                               dstlist = g_list_first(b->addr2);
-                               while (dstlist)
-                               {
-                                               dststore = (address *) (dstlist->data);
-                                               if ((dststore->type==AT_IPv4 && dst_v4==TRUE) ||(dststore->type==AT_IPv6 && dst_v6==TRUE) )
-                                               {
-                                                       if (*dst->data==*dststore->data && a->port2 == b->port2)
-                                                       {
-                                                               if ((a->verification_tag1 !=0)&& (b->verification_tag1 == 0)&& (b->verification_tag2 !=0))
-                                                                       return ADDRESS_FORWARD_ADD_FORWARD_VTAG;
-                                                               else
-                                                                       return ADDRESS_FORWARD_STREAM;
-                                                       }
-                                                       else
-                                                               dstlist=g_list_next(dstlist);
-                                               }
-                                               else
-                                                       dstlist=g_list_next(dstlist);
-                               }
-                               srclist=g_list_next(srclist);
-                       }
-                       else
-                               srclist=g_list_next(srclist);
-               }
-               else if (srcstore->type==AT_IPv6 && src_v6==TRUE)
-               {
-                       if (*src->data == *srcstore->data  && a->port1 == b->port1)
-                       {
-                               dstlist = g_list_first(b->addr2);
-                               while (dstlist)
-                               {
-                                       dststore = (address *) (dstlist->data);
-                                       if ((dststore->type==AT_IPv4 && dst_v4==TRUE) || (dststore->type==AT_IPv6 && dst_v6==TRUE))
-                                       {
-                                               if (*dst->data==*dststore->data && a->port2 == b->port2)
-                                               {
-                                                       if ((a->verification_tag1 !=0)&& (b->verification_tag1 == 0)&& (b->verification_tag2 !=0))
-                                                               return ADDRESS_FORWARD_ADD_FORWARD_VTAG;
-                                                       else
-                                                               return ADDRESS_FORWARD_STREAM;
-                                               }
-                                               else
-                                                       dstlist=g_list_next(dstlist);
-                                       }
-                                       else
-                                               dstlist=g_list_next(dstlist);
-                               }
-                               srclist=g_list_next(srclist);
-                       }
-                       else
-                               srclist=g_list_next(srclist);
-               }
-               else
-                       srclist=g_list_next(srclist);
-       }
-
-       g_free(src);
-       g_free(dst);
-
-       src = g_malloc(sizeof(address));
-       if (a->dst.type == AT_IPv4)
-       {
-               src->type = AT_IPv4;
-               src->len  = 4;
-               src_v4    = TRUE;
-       }
-       else if (a->dst.type==AT_IPv6)
-       {
-               src->type = AT_IPv6;
-               src->len  = 16;
-               src_v6    = TRUE;
-       }
-       addr = g_malloc(src->len);
-       memcpy(addr, a->dst.data, src->len);
-       src->data = addr;
-       
-       dst = g_malloc(sizeof(address));
-       if (a->src.type == AT_IPv4)
-       {
-               dst->type = AT_IPv4;
-               dst->len  = 4;
-               dst_v4    = TRUE;
-       }
-       else if (a->src.type==AT_IPv6)
-       {
-               dst->type = AT_IPv6;
-               dst->len  = 16;
-               dst_v6    = TRUE;
-       }
-       addr = g_malloc(dst->len);
-       memcpy(addr, a->src.data, dst->len);
-       dst->data = addr;
-       
-       srclist = g_list_first(b->addr1);
-       while (srclist)
-       {
-               srcstore = (address *) (srclist->data);
-               if (srcstore->type==AT_IPv4 && src_v4==TRUE)
-               {
-                       if (*src->data==*srcstore->data && a->port2 == b->port1)
-                       {
-                               dstlist = g_list_first(b->addr2);
-                               while (dstlist)
-                               {
-                                               dststore = (address *) (dstlist->data);
-                                               if ((dststore->type==AT_IPv4 && src_v4==TRUE) || (dststore->type==AT_IPv6 && src_v6==TRUE))
-                                               {
-                                                       if (*dst->data==*dststore->data && a->port1 == b->port2)
-                                                       {
-                                                               if ((a->verification_tag1 ==b->verification_tag2)&& (b->verification_tag1 == 0))
-                                                                       return ADDRESS_BACKWARD_ADD_FORWARD_VTAG;
-                                                               else if ((a->verification_tag1 !=0)     && (b->verification_tag1 != 0)&& (b->verification_tag2 == 0))
-                                                                       return ADDRESS_BACKWARD_ADD_BACKWARD_VTAG;
-                                                               else
-                                                                       return ADDRESS_BACKWARD_STREAM;
-                                                       }
-                                                       else
-                                                               dstlist=g_list_next(dstlist);
-                                               }
-                                               else
-                                                       dstlist=g_list_next(dstlist);
-                               }
-                               srclist=g_list_next(srclist);
-                       }
-                       else
-                               srclist=g_list_next(srclist);
-               }
-               else if (srcstore->type==AT_IPv6 && src_v6==TRUE)
-               {
-                       if (*src->data == *srcstore->data && a->port2 == b->port1)
-                       {
-                               dstlist = g_list_first(b->addr2);
-                               while (dstlist)
-                               {
-                                       dststore = (address *) (dstlist->data);
-                                       if ((dststore->type==AT_IPv4 && src_v4==TRUE) || (dststore->type==AT_IPv6 && src_v6==TRUE))
-                                       {
-                                               if (*dst->data==*dststore->data && a->port1 == b->port2)
-                                               {
-                                                               if ((a->verification_tag1 ==b->verification_tag2)&& (b->verification_tag1 == 0))
-                                                                       return ADDRESS_BACKWARD_ADD_FORWARD_VTAG;
-                                                               else if ((a->verification_tag1 !=0)     && (b->verification_tag1 != 0)&& (b->verification_tag2 == 0))
-                                                                       return ADDRESS_BACKWARD_ADD_BACKWARD_VTAG;
-                                                               else
-                                                                       return ADDRESS_BACKWARD_STREAM;
-                                               }
-                                               else
-                                                       dstlist=g_list_next(dstlist);
-                                       }
-                                       else
-                                               dstlist=g_list_next(dstlist);
-                               }
-                               srclist=g_list_next(srclist);
-                       }
-                       else
-                               srclist=g_list_next(srclist);
-               }
-               else
-                       srclist=g_list_next(srclist);
-       }
-
-
-       g_free(src);
-       g_free(dst);
-       return ASSOC_NOT_FOUND;
-}
-*/
-
-
-
-
-
 static sctp_assoc_info_t * find_assoc(sctp_tmp_info_t * needle)
 {
        sctp_allassocs_info_t *assoc_info;
@@ -754,8 +524,8 @@ static sctp_assoc_info_t * add_address(address * vadd, sctp_assoc_info_t *info,
        if (direction == 1)
                info->addr1 = g_list_append(info->addr1, vadd);
        else if (direction==2)
-               info->addr2 = g_list_append(info->addr2, vadd);
-       
+               info->addr2 = g_list_append(info->addr2, vadd); 
+
        return info;
 }
 
@@ -871,6 +641,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
                        info->n_tvbs            = tmp_info.n_tvbs;
                        info->init              = FALSE;
                        info->initack           = FALSE;
+                       info->check_address     = FALSE;
                        info->direction         = 0;
                        info = calc_checksum(sctp_info, info);
                        info->n_packets         = 1;
index 435c86f5c124a935fe8f6fa35e0c468845bd31ec..c11407c929c757a19b405cabc86648a101597777 100644 (file)
@@ -50,12 +50,13 @@ static GtkWidget *sctp_stat_dlg=NULL;
 static GtkWidget *clist = NULL;
 static GList *last_list = NULL;
 static gchar *filter_string = NULL;
-static sctp_assoc_info_t* selected_stream = NULL;  /* current selection */
+static sctp_assoc_info_t* selected_stream=NULL;  /* current selection */
 static sctp_allassocs_info_t *sctp_assocs=NULL;
 static guint16 n_children=0;
 static GtkWidget *bt_afilter = NULL, *bt_unselect=NULL, *bt_analyse=NULL, *bt_filter=NULL;
+static gboolean prevent_update = FALSE, filter_applied = FALSE;
 
-#define NUM_COLS    7
+#define NUM_COLS    9
 #define FRAME_LIMIT 8
 
 typedef struct column_arrows {
@@ -84,6 +85,8 @@ dlg_destroy(void)
        g_list_free(sctp_assocs->children);
        sctp_assocs->children = NULL;
        sctp_stat_dlg = NULL;
+       prevent_update = FALSE;
+       filter_applied = FALSE;
 }
 
 void
@@ -127,6 +130,8 @@ static void add_to_clist(sctp_assoc_info_t* assinfo)
        g_snprintf(field[4], 20, "%u", assinfo->n_checksum_errors);
        g_snprintf(field[5], 20, "%u", assinfo->n_data_chunks);
        g_snprintf(field[6], 20, "%u", assinfo->n_data_bytes);
+       g_snprintf(field[7], 20, "0x%x", assinfo->verification_tag1);
+       g_snprintf(field[8], 20, "0x%x", assinfo->verification_tag2);
 
        added_row = gtk_clist_append(GTK_CLIST(clist), data);
        gtk_clist_set_row_data(GTK_CLIST(clist), added_row, assinfo);
@@ -142,11 +147,14 @@ sctp_stat_on_unselect(GtkButton *button _U_, gpointer user_data _U_)
 
        selected_stream = NULL;
        gtk_entry_set_text(GTK_ENTRY(main_display_filter_widget), "");
+       main_filter_packets(&cfile, "", FALSE);
        gtk_clist_unselect_all(GTK_CLIST(clist));
        gtk_widget_set_sensitive(bt_unselect,FALSE);
        gtk_widget_set_sensitive(bt_filter,FALSE);
        gtk_widget_set_sensitive(bt_analyse,FALSE);
        gtk_widget_set_sensitive(bt_afilter,FALSE);
+       prevent_update = FALSE;
+       filter_applied = FALSE;
 }
 
 void sctp_stat_dlg_update(void)
@@ -154,10 +162,9 @@ void sctp_stat_dlg_update(void)
        GList *list;
 
        list=(sctp_stat_get_info()->assoc_info_list);
-       if (sctp_stat_dlg != NULL)
+       if (sctp_stat_dlg != NULL && !prevent_update)
        {
                gtk_clist_clear(GTK_CLIST(clist));
-
                list = g_list_first(sctp_stat_get_info()->assoc_info_list);
 
                while (list)
@@ -165,37 +172,38 @@ void sctp_stat_dlg_update(void)
                        add_to_clist((sctp_assoc_info_t*)(list->data));
                        list = g_list_next(list);
                }
-
-               sctp_stat_on_unselect(NULL, NULL);
        }
        last_list = list;
 }
 
+
 static void
 sctp_stat_on_select_row(GtkCList *clist, gint row, gint column _U_,
                         GdkEventButton *event _U_, gpointer user_data _U_)
 {
        gchar *text[1];
        guint16 port1, port2;
-       guint32 checksum, data_chunks, data_bytes, packets;
+       guint32 checksum, data_chunks, data_bytes, packets, vtag1, vtag2;
        GList *list;
        sctp_assoc_info_t* assoc;
+       gboolean stream_found=FALSE;
 
-       selected_stream = gtk_clist_get_row_data(GTK_CLIST(clist), row);
-
+       gtk_clist_get_row_data(GTK_CLIST(clist), row);
        gtk_clist_get_text(GTK_CLIST(clist), row, 0, text);
        port1=atoi(text[0]);
        gtk_clist_get_text(GTK_CLIST(clist), row, 1, text);
        port2=atoi(text[0]);
-
-       gtk_clist_get_text(GTK_CLIST(clist), row, 4, text);
+       gtk_clist_get_text(GTK_CLIST(clist), row, 7, text);
+       sscanf(text[0],"0x%x",&vtag1);
+       gtk_clist_get_text(GTK_CLIST(clist), row, 8, text);
+       sscanf(text[0],"0x%x",&vtag2);
+       gtk_clist_get_text(GTK_CLIST(clist), row, 2, text);
        packets=atoi(text[0]);
-       gtk_clist_get_text(GTK_CLIST(clist), row, 5, text);
+       gtk_clist_get_text(GTK_CLIST(clist), row, 4, text);
        checksum=atoi(text[0]);
-       gtk_clist_get_text(GTK_CLIST(clist), row, 7, text);
+       gtk_clist_get_text(GTK_CLIST(clist), row, 5, text);
        data_chunks=atoi(text[0]);
-
-       gtk_clist_get_text(GTK_CLIST(clist), row, 8, text);
+       gtk_clist_get_text(GTK_CLIST(clist), row, 6, text);
        data_bytes=atoi(text[0]);
 
        list = g_list_first(sctp_assocs->assoc_info_list);
@@ -203,15 +211,20 @@ sctp_stat_on_select_row(GtkCList *clist, gint row, gint column _U_,
        while (list)
        {
                assoc = (sctp_assoc_info_t*)(list->data);
-               if (assoc->port1==port1 && assoc->port2==port2 &&
-               assoc->n_packets==packets && assoc->n_checksum_errors==checksum
-               && assoc->n_data_chunks==data_chunks && assoc->n_data_bytes==data_bytes)
+               if (assoc->port1==port1 && assoc->port2==port2 
+               && assoc->n_packets==packets && assoc->n_data_chunks==data_chunks && assoc->n_data_bytes==data_bytes 
+               && assoc->verification_tag1==vtag1 && assoc->verification_tag2==vtag2)
                {
                        selected_stream=assoc;
+                       stream_found=TRUE;
                        break;
                }
                list=g_list_next(list);
        }
+
+       if (!stream_found)
+               selected_stream = NULL;
+
        gtk_widget_set_sensitive(bt_unselect,TRUE);
        gtk_widget_set_sensitive(bt_analyse,TRUE);
        gtk_widget_set_sensitive(bt_filter,TRUE);
@@ -220,9 +233,39 @@ sctp_stat_on_select_row(GtkCList *clist, gint row, gint column _U_,
 static void
 sctp_stat_on_apply_filter (GtkButton *button _U_, gpointer user_data _U_)
 {
+       GList *list;
+       sctp_assoc_info_t* assoc;
+       guint16 port1, port2;
+       guint32 checksum, data_chunks, data_bytes, packets, vtag1, vtag2;
+
        if (filter_string != NULL)
        {
+               port1 = selected_stream->port1;
+               port2 = selected_stream->port2; 
+               checksum = selected_stream->n_checksum_errors;
+               data_chunks = selected_stream->n_data_chunks;
+               data_bytes = selected_stream->n_data_bytes;
+               packets = selected_stream->n_packets;
+               vtag1 = selected_stream->verification_tag1;
+               vtag2 = selected_stream->verification_tag2;
                main_filter_packets(&cfile, filter_string, FALSE);
+               list = g_list_first(sctp_assocs->assoc_info_list);
+
+               while (list)
+               {
+                       assoc = (sctp_assoc_info_t*)(list->data);
+                       if (assoc->port1==port1 && assoc->port2==port2 
+                       && assoc->n_packets==packets && assoc->n_data_chunks==data_chunks && assoc->n_data_bytes==data_bytes 
+                       && assoc->verification_tag1==vtag1 && assoc->verification_tag2==vtag2)
+                       {
+                               selected_stream=assoc;
+                               break;
+                       }
+                       list=g_list_next(list);
+               }
+               gtk_widget_set_sensitive(bt_afilter,FALSE);
+               prevent_update=TRUE;
+               filter_applied = TRUE;
        }
 }
 
@@ -246,28 +289,31 @@ sctp_stat_on_filter (GtkButton *button _U_, gpointer user_data _U_)
        {
                if (selected_stream->check_address==FALSE)
                {
-                       f_string = g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
-                                                  "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) || "
-                                                  "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || sctp.shutdown_complete_t_bit==1)))) ||"
-                                                  "(sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
-                                                  "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
-                                                  "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || sctp.shutdown_complete_t_bit==1)))))",
+                       f_string = g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && "
+                               "((sctp.verification_tag==0x%x && sctp.verification_tag!=0x0) || "
+                               "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) || "
+                               "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 || "
+                               "sctp.shutdown_complete_t_bit==1)))) ||"
+                               "(sctp.srcport==%u && sctp.dstport==%u && ((sctp.verification_tag==0x%x "
+                               "&& sctp.verification_tag!=0x0) || "
+                               "(sctp.verification_tag==0x0 && sctp.initiate_tag==0x%x) ||"
+                               "(sctp.verification_tag==0x%x && (sctp.abort_t_bit==1 ||"
+                               " sctp.shutdown_complete_t_bit==1)))))",
                        selected_stream->port1,
                        selected_stream->port2,
                        selected_stream->verification_tag1,
-                       /*selected_stream->verification_tag2,*/
                        selected_stream->initiate_tag,
                        selected_stream->verification_tag2,
                        selected_stream->port2,
                        selected_stream->port1,
                        selected_stream->verification_tag2,
-                       /*selected_stream->verification_tag1,*/
                        selected_stream->initiate_tag,
                        selected_stream->verification_tag1);
                        filter_string = f_string;
                }
                else
                {
+
                        srclist = g_list_first(selected_stream->addr1);
                        infosrc=(struct sockaddr_in *) (srclist->data);
                        gstring = g_string_new(g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && (ip.src==%s",
@@ -281,7 +327,6 @@ sctp_stat_on_filter (GtkButton *button _U_, gpointer user_data _U_)
                                g_string_append(gstring, str);
                                srclist= g_list_next(srclist);
                        }
-
                        dstlist = g_list_first(selected_stream->addr2);
                        infodst=(struct sockaddr_in *) (dstlist->data);
                        str = g_strdup_printf(") && (ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
@@ -294,7 +339,6 @@ sctp_stat_on_filter (GtkButton *button _U_, gpointer user_data _U_)
                                g_string_append(gstring, str);
                                dstlist= g_list_next(dstlist);
                        }
-
                        srclist = g_list_first(selected_stream->addr1);
                        infosrc=(struct sockaddr_in *) (srclist->data);
                        str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
@@ -351,6 +395,9 @@ sctp_stat_on_filter (GtkButton *button _U_, gpointer user_data _U_)
                g_assert_not_reached();
        }
        gtk_widget_set_sensitive(bt_afilter,TRUE);
+       gtk_widget_set_sensitive(bt_filter,FALSE);
+       prevent_update = TRUE;
+       filter_applied = FALSE;
 }
 
 
@@ -359,6 +406,8 @@ sctp_stat_on_close (GtkButton *button _U_, gpointer user_data _U_)
 {
        gtk_grab_remove(sctp_stat_dlg);
        gtk_widget_destroy(sctp_stat_dlg);
+       prevent_update = FALSE;
+       filter_applied = FALSE;
 }
 
 static void
@@ -366,10 +415,12 @@ sctp_stat_on_analyse (GtkButton *button _U_, gpointer user_data _U_)
 {
        if (selected_stream==NULL)
                return;
-
-       if (selected_stream)
+       else
                assoc_analyse(selected_stream);
        gtk_widget_set_sensitive(bt_analyse,FALSE);
+       if (!filter_applied)
+               gtk_widget_set_sensitive(bt_filter,TRUE);
+       prevent_update = TRUE;
 }
 
 static gint
@@ -381,7 +432,7 @@ clist_sort_column(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2)
 
        GtkCListRow *row1 = (GtkCListRow *) ptr1;
        GtkCListRow *row2 = (GtkCListRow *) ptr2;
-
+       prevent_update = FALSE;
        text1 = GTK_CELL_TEXT (row1->cell[clist->sort_column])->text;
        text2 = GTK_CELL_TEXT (row2->cell[clist->sort_column])->text;
 
@@ -408,6 +459,8 @@ clist_click_column_cb(GtkCList *list, gint column, gpointer data)
 {
        column_arrows *col_arrows = (column_arrows *) data;
        int i;
+
+       prevent_update = FALSE;
        gtk_clist_freeze(list);
 
        for (i = 0; i < NUM_COLS; i++) {
@@ -442,7 +495,7 @@ gtk_sctpstat_dlg(void)
        GtkWidget *hbuttonbox2;
        GtkWidget *bt_close;
 
-       const gchar *titles[NUM_COLS] =  {"Port 1","Port 2", "No of Packets", "Checksum", "No of Errors", "Data Chunks", "Data Bytes"};
+       const gchar *titles[NUM_COLS] =  {"Port 1","Port 2","No of Packets", "Checksum", "No of Errors", "Data Chunks", "Data Bytes", "VTag 1","VTag 2"};
        column_arrows *col_arrows;
        GdkBitmap *ascend_bm, *descend_bm;
        GdkPixmap *ascend_pm, *descend_pm;
@@ -467,7 +520,7 @@ gtk_sctpstat_dlg(void)
        clist = gtk_clist_new (NUM_COLS);
        gtk_widget_show (clist);
        gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
-       WIDGET_SET_SIZE(clist, 700, 200);
+       WIDGET_SET_SIZE(clist, 650, 200);
 
        gtk_clist_set_column_width (GTK_CLIST (clist), 0, 50);
        gtk_clist_set_column_width (GTK_CLIST (clist), 1, 50);
@@ -476,6 +529,8 @@ gtk_sctpstat_dlg(void)
        gtk_clist_set_column_width (GTK_CLIST (clist), 4, 100);
        gtk_clist_set_column_width (GTK_CLIST (clist), 5, 100);
        gtk_clist_set_column_width (GTK_CLIST (clist), 6, 100);
+       gtk_clist_set_column_width (GTK_CLIST (clist), 7, 100);
+       gtk_clist_set_column_width (GTK_CLIST (clist), 8, 100);
 
        gtk_clist_set_column_justification(GTK_CLIST(clist), 0, GTK_JUSTIFY_CENTER);
        gtk_clist_set_column_justification(GTK_CLIST(clist), 1, GTK_JUSTIFY_CENTER);
@@ -484,6 +539,8 @@ gtk_sctpstat_dlg(void)
        gtk_clist_set_column_justification(GTK_CLIST(clist), 4, GTK_JUSTIFY_CENTER);
        gtk_clist_set_column_justification(GTK_CLIST(clist), 5, GTK_JUSTIFY_CENTER);
        gtk_clist_set_column_justification(GTK_CLIST(clist), 6, GTK_JUSTIFY_CENTER);
+       gtk_clist_set_column_justification(GTK_CLIST(clist), 7, GTK_JUSTIFY_CENTER);
+       gtk_clist_set_column_justification(GTK_CLIST(clist), 8, GTK_JUSTIFY_CENTER);
        gtk_clist_column_titles_show (GTK_CLIST (clist));
 
        gtk_clist_set_compare_func(GTK_CLIST(clist), clist_sort_column);
@@ -592,7 +649,8 @@ static void sctp_stat_dlg_show(void)
 
 static void sctp_stat_start(GtkWidget *w _U_, gpointer data _U_)
 {
-
+       prevent_update = FALSE;
+       filter_applied = FALSE;
        sctp_assocs = g_malloc(sizeof(sctp_allassocs_info_t));
        sctp_assocs = (sctp_allassocs_info_t*)sctp_stat_get_info();
        /* Register the tap listener */