aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorMichael Tüxen <tuexen@fh-muenster.de>2007-05-22 21:16:30 +0000
committerMichael Tüxen <tuexen@fh-muenster.de>2007-05-22 21:16:30 +0000
commitab125d0d436088dee173e3e6b3fb106924713deb (patch)
treea8323c8b6b51c0f7768fe31448e212434dd63060 /gtk
parentddb6768db2d173f973016040079680e8632f7338 (diff)
From Irene Ruengeler: Fix TSN handling in graphs.
svn path=/trunk/; revision=21894
Diffstat (limited to 'gtk')
-rw-r--r--gtk/sctp_assoc_analyse.c151
-rw-r--r--gtk/sctp_byte_graph_dlg.c2
-rw-r--r--gtk/sctp_graph_dlg.c145
-rw-r--r--gtk/sctp_stat.c26
-rw-r--r--gtk/sctp_stat.h3
-rw-r--r--gtk/sctp_stat_dlg.c155
6 files changed, 206 insertions, 276 deletions
diff --git a/gtk/sctp_assoc_analyse.c b/gtk/sctp_assoc_analyse.c
index ee1f136d7a..fb151d2513 100644
--- a/gtk/sctp_assoc_analyse.c
+++ b/gtk/sctp_assoc_analyse.c
@@ -349,8 +349,7 @@ void
sctp_set_filter (GtkButton *button _U_, struct sctp_analyse* u_data)
{
gchar *f_string = NULL;
- guint32 framenumber=0;
- GList *list, *srclist, *dstlist;
+ GList *srclist, *dstlist;
gchar *str=NULL;
GString *gstring=NULL;
struct sockaddr_in *infosrc=NULL;
@@ -358,107 +357,87 @@ sctp_set_filter (GtkButton *button _U_, struct sctp_analyse* u_data)
sctp_assoc_info_t *selected_stream;
gchar *filter_string = NULL;
selected_stream=u_data->assoc;
+
+ 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)))))",
+ 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",
+ selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr))));
+ srclist= g_list_next(srclist);
- if (selected_stream->n_packets > 8)
- {
- if (selected_stream->check_address==FALSE)
+ while (srclist)
{
- 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",
- selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr))));
+ str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
+ g_string_append(gstring, str);
srclist= g_list_next(srclist);
+ }
- while (srclist)
- {
- infosrc=(struct sockaddr_in *) (srclist->data);
- str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
- g_string_append(gstring, str);
- srclist= g_list_next(srclist);
- }
-
- dstlist = g_list_first(selected_stream->addr2);
+ 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)));
+ g_string_append(gstring, str);
+ dstlist= g_list_next(dstlist);
+ while (dstlist)
+ {
infodst=(struct sockaddr_in *) (dstlist->data);
- str = g_strdup_printf(") && (ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
+ str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
g_string_append(gstring, str);
dstlist= g_list_next(dstlist);
- while (dstlist)
- {
- infodst=(struct sockaddr_in *) (dstlist->data);
- str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
- 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",
+ selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
+ g_string_append(gstring, str);
+ srclist= g_list_next(srclist);
- srclist = g_list_first(selected_stream->addr1);
+ while (srclist)
+ {
infosrc=(struct sockaddr_in *) (srclist->data);
- str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
- selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
+ str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
g_string_append(gstring, str);
srclist= g_list_next(srclist);
+ }
- while (srclist)
- {
- infosrc=(struct sockaddr_in *) (srclist->data);
- str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
- g_string_append(gstring, str);
- srclist= g_list_next(srclist);
- }
-
- dstlist = g_list_first(selected_stream->addr2);
+ dstlist = g_list_first(selected_stream->addr2);
+ infodst=(struct sockaddr_in *) (dstlist->data);
+ str = g_strdup_printf(") && (ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
+ g_string_append(gstring, str);
+ dstlist= g_list_next(dstlist);
+ while (dstlist)
+ {
infodst=(struct sockaddr_in *) (dstlist->data);
- str = g_strdup_printf(") && (ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
+ str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
g_string_append(gstring, str);
dstlist= g_list_next(dstlist);
- while (dstlist)
- {
- infodst=(struct sockaddr_in *) (dstlist->data);
- str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
- g_string_append(gstring, str);
- dstlist= g_list_next(dstlist);
- }
- str = g_strdup_printf(")))");
- g_string_append(gstring, str);
- filter_string = gstring->str;
- g_string_free(gstring,FALSE);
- }
- }
- else
- {
- printf("else\n");
- list = g_list_first(selected_stream->frame_numbers);
- framenumber = *((guint32 *)(list->data));
- gstring = g_string_new(g_strdup_printf("frame.number==%u",framenumber));
- list = g_list_next(list);
- while (list)
- {
- framenumber = *((guint32 *)(list->data));
- str =g_strdup_printf(" || frame.number==%u",framenumber);
- g_string_append(gstring, str);
- list = g_list_next(list);
}
+ str = g_strdup_printf(")))");
+ g_string_append(gstring, str);
filter_string = gstring->str;
g_string_free(gstring,FALSE);
}
diff --git a/gtk/sctp_byte_graph_dlg.c b/gtk/sctp_byte_graph_dlg.c
index 6d12e52ff8..8abdf91f6d 100644
--- a/gtk/sctp_byte_graph_dlg.c
+++ b/gtk/sctp_byte_graph_dlg.c
@@ -1061,7 +1061,7 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
}
else
{
- 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;
+ 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-RIGHT_BORDER-u_data->io->offset))+u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0;
y_value = (guint32) 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;
diff --git a/gtk/sctp_graph_dlg.c b/gtk/sctp_graph_dlg.c
index 137df2e378..7446e85227 100644
--- a/gtk/sctp_graph_dlg.c
+++ b/gtk/sctp_graph_dlg.c
@@ -363,8 +363,8 @@ static void sctp_graph_draw(struct sctp_udata *u_data)
}
else
{
- u_data->io->min_x=((guint32)(u_data->io->x1_tmp_sec*1000000.0))+u_data->io->x1_tmp_usec;
- u_data->io->max_x=((guint32)(u_data->io->x2_tmp_sec*1000000.0))+u_data->io->x2_tmp_usec;
+ u_data->io->min_x=u_data->io->x1_tmp_sec*1000000.0+u_data->io->x1_tmp_usec;
+ u_data->io->max_x=u_data->io->x2_tmp_sec*1000000.0+u_data->io->x2_tmp_usec;
u_data->io->uoff = FALSE;
}
@@ -981,16 +981,15 @@ static gint
on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_udata *u_data)
{
sctp_graph_t *ios;
- guint32 helpx, helpy, x1_tmp, x2_tmp, y_value, frame, tmpnum=0, count=0, tsnumber=0;
+ guint32 helpx, helpy, x1_tmp, x2_tmp, y_value, t_size=0, s_size=0, i, y_tolerance;
gint label_width, label_height;
- gdouble x_value, position, tfirst, s_diff, t_diff;
+ gdouble x_value, position, s_diff=0, t_diff=0, x_tolerance=0.0001;
gint lwidth;
char label_string[30];
GdkGC *text_color;
- GList *tsnlist=NULL, *tlist=NULL, *sacklist=NULL;
- tsn_t *tsn, *tmptsn, *tmpsack, *sack;
- guint8 type;
- gboolean sack_type = FALSE;
+ GPtrArray *tsnlist = NULL, *sacklist=NULL;
+ struct tsn_sort *tsn, *sack=NULL;
+ gboolean sack_found = FALSE;
#if GTK_MAJOR_VERSION < 2
GdkFont *font;
@@ -1105,119 +1104,71 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
}
else
{
- 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 = (gint)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;
+ 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-RIGHT_BORDER-u_data->io->offset))+u_data->io->x1_tmp_sec+u_data->io->x1_tmp_usec/1000000.0;
+ y_value = (gint)rint((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;
if (u_data->dir == 1)
{
- tsnlist = g_list_last(u_data->assoc->tsn1);
- sacklist = g_list_last(u_data->assoc->sack1);
+ tsnlist = u_data->assoc->sort_tsn1;
+ t_size = u_data->assoc->n_data_chunks_ep1;
+ sacklist = u_data->assoc->sort_sack1;
+ s_size = u_data->assoc->n_sack_chunks_ep1;
}
else
{
- tsnlist = g_list_last(u_data->assoc->tsn2);
- sacklist = g_list_last(u_data->assoc->sack2);
+ tsnlist = u_data->assoc->sort_tsn2;
+ t_size = u_data->assoc->n_data_chunks_ep2;
+ sacklist = u_data->assoc->sort_sack2;
+ s_size = u_data->assoc->n_sack_chunks_ep2;
}
-
- tsn = (tsn_t*) (tsnlist->data);
- tmptsn =(tsn_t*)(tsnlist->data);
- tfirst = tsn->secs + tsn->usecs/1000000.0;
- frame = tsn->frame_number;
-
- while (tsnlist)
+ x_tolerance = (gdouble)((u_data->io->tmp_width / u_data->io->axis_width*1.0))*5/1000000.0;
+ y_tolerance = (guint32)(((u_data->io->max_y - u_data->io->min_y) / (u_data->io->pixmap_height-TOP_BORDER-BOTTOM_BORDER-u_data->io->offset)) * 2.0);
+ if (y_tolerance==0)
+ y_tolerance = 2;
+ else if (y_tolerance > 5)
+ y_tolerance = 5;
+
+ for (i=0; i<s_size; i++)
{
- tsnlist = g_list_previous(tsnlist);
- tsn = (tsn_t*) (tsnlist->data);
- if (tsn->secs+tsn->usecs/1000000.0<x_value)
- {
- tfirst = tsn->secs+tsn->usecs/1000000.0;
- tmptsn =tsn;
- }
- else
+ sack = (struct tsn_sort*)(g_ptr_array_index(sacklist, i));
+ if (abs(sack->tsnumber - y_value)<y_tolerance)
{
- if ((tfirst+tsn->secs+tsn->usecs/1000000.0)/2.0<x_value)
- {
- t_diff = tsn->secs+tsn->usecs/1000000.0 - x_value;
- tmptsn = tsn;
- }
- else
- t_diff = x_value - tmptsn->secs+tmptsn->usecs/1000000.0;
- break;
- }
- }
- sack = (tsn_t*) (sacklist->data);
- tmpsack =(tsn_t*)(sacklist->data);
- tfirst = sack->secs + sack->usecs/1000000.0;
-
- while (sacklist)
- {
- sacklist = g_list_previous(sacklist);
- sack = (tsn_t*) (sacklist->data);
- if (sack->secs+sack->usecs/1000000.0<x_value)
- {
- tfirst = sack->secs+sack->usecs/1000000.0;
- tmpsack =sack;
- }
- else
- {
- if ((tfirst+sack->secs+sack->usecs/1000000.0)/2.0<x_value)
- {
- s_diff = sack->secs+sack->usecs/1000000.0 - x_value;
- tmpsack = sack;
- }
- else
- s_diff = x_value - tmpsack->secs+tmpsack->usecs/1000000.0;
+ s_diff = fabs((sack->secs+sack->usecs/1000000.0)- x_value);
+ if (s_diff < x_tolerance)
+ sack_found = TRUE;
break;
}
}
- if (s_diff < t_diff)
- {
- cf_goto_frame(&cfile, tmpsack->frame_number);
- x_value = tmpsack->secs+tmpsack->usecs/1000000.0;
- tlist = g_list_first(tmpsack->tsns);
- sack_type = TRUE;
- }
- else
- {
- cf_goto_frame(&cfile, tmptsn->frame_number);
- x_value = tmptsn->secs+tmptsn->usecs/1000000.0;
- tlist = g_list_first(tmptsn->tsns);
- sack_type = FALSE;
- }
- count++;
- while (tlist)
+
+ for (i=0; i<t_size; i++)
{
- type = ((struct chunk_header *)tlist->data)->type;
- if (type == SCTP_DATA_CHUNK_ID && !sack_type)
- tsnumber = g_ntohl(((struct data_chunk_header *)tlist->data)->tsn);
- else if (type == SCTP_SACK_CHUNK_ID && sack_type)
- tsnumber = g_ntohl(((struct sack_chunk_header *)tlist->data)->cum_tsn_ack);
- if (tsnumber < y_value && g_list_length(tlist)-count>0)
+ tsn = (struct tsn_sort*)(g_ptr_array_index(tsnlist, i));
+ if (abs(tsn->tsnumber - y_value)<y_tolerance)
{
- tmpnum = tsnumber;
- }
- else
- {
- if ((tmpnum+tsnumber)/2 < y_value)
+ t_diff = fabs((tsn->secs+tsn->usecs/1000000.0)- x_value);
+ if (sack_found && s_diff < t_diff)
{
- y_value = tsnumber;
- tmpnum = tsnumber;
+ cf_goto_frame(&cfile, sack->framenumber);
+ x_value = sack->secs+sack->usecs/1000000.0;
+ y_value = sack->tsnumber;
}
- else
+ else if (t_diff < x_tolerance)
{
- y_value = tmpnum;
+ cf_goto_frame(&cfile, tsn->framenumber);
+ x_value = tsn->secs+tsn->usecs/1000000.0;
+ y_value = tsn->tsnumber;
}
break;
}
- tlist = g_list_next(tlist);
- count++;
}
+
g_snprintf(label_string, 30, "(%.6lf, %u)", x_value, y_value);
+
label_set = TRUE;
- gdk_draw_line(u_data->io->pixmap,text_color, (gint)(event->x-2), (gint)(event->y), (gint)(event->x+2), (gint)(event->y));
- gdk_draw_line(u_data->io->pixmap,text_color, (gint)(event->x), (gint)(event->y-2), (gint)(event->x), (gint)(event->y+2));
+ gdk_draw_line(u_data->io->pixmap,text_color, event->x-2, event->y, event->x+2, event->y);
+ gdk_draw_line(u_data->io->pixmap,text_color, event->x, event->y-2, event->x, event->y+2);
if (event->x+150>=u_data->io->pixmap_width)
position = event->x - 150;
else
@@ -1241,8 +1192,6 @@ on_button_release (GtkWidget *widget _U_, GdkEventButton *event, struct sctp_uda
layout);
#endif
-
-
ios=(sctp_graph_t *)OBJECT_GET_DATA(u_data->io->draw_area, "sctp_graph_t");
if(!ios){
diff --git a/gtk/sctp_stat.c b/gtk/sctp_stat.c
index 81052c0ec4..fa66f65fff 100644
--- a/gtk/sctp_stat.c
+++ b/gtk/sctp_stat.c
@@ -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);
+ return(ASSOC_NOT_FOUND); /* two INITs that belong to different assocs */
/* assoc known*/
if ((a->port1 == b->port1) &&
@@ -524,7 +524,7 @@ static int
packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const void *data)
{
struct _sctp_info *sctp_info;
- guint32 chunk_number = 0, tsnumber;
+ guint32 chunk_number = 0, tsnumber,framenumber;
sctp_tmp_info_t tmp_info;
sctp_assoc_info_t *info = NULL;
sctp_error_info_t *error = NULL;
@@ -547,6 +547,8 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
sctp_info = (struct _sctp_info *) data;
max =0xFFFFFFFF;
+ framenumber=pinfo->fd->num;
+
type = sctp_info->ip_src.type;
if (type == AT_IPv4)
@@ -680,7 +682,9 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
tsn = g_malloc(sizeof(tsn_t));
sack = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
+ tsn->first_tsn = 0;
sack->tsns = NULL;
+ sack->first_tsn = 0;
sack->src.type=tsn->src.type = tmp_info.src.type;
sack->src.len=tsn->src.len = tmp_info.src.len;
addr = g_malloc(tmp_info.src.len);
@@ -774,6 +778,8 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
sack = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
sack->tsns = NULL;
+ tsn->first_tsn = 0;
+ sack->first_tsn = 0;
}
for (chunk_number = 0; chunk_number < sctp_info->number_of_tvbs; chunk_number++)
{
@@ -805,6 +811,8 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
info->n_data_bytes_ep1+=length;
info->max_tsn1 = tsnumber;
}
+ if (tsn->first_tsn == 0)
+ tsn->first_tsn = tsnumber;
t_s_n = g_malloc(16);
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)(t_s_n),0, 16);
tsn->tsns = g_list_append(tsn->tsns, t_s_n);
@@ -814,6 +822,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
tsn_s->secs = tsn->secs;
tsn_s->usecs = tsn->usecs;
tsn_s->offset = 0;
+ tsn_s->framenumber = framenumber;
tsn_s->length = length-DATA_CHUNK_HEADER_LENGTH;
g_ptr_array_add(info->sort_tsn1, tsn_s);
info->n_array_tsn1++;
@@ -827,6 +836,8 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
info->max_tsn2 = tsnumber;
info->n_sack_chunks_ep2++;
length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
+ if (sack->first_tsn == 0)
+ sack->first_tsn = tsnumber;
t_s_n = g_malloc(length);
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)(t_s_n),0, length);
sack->tsns = g_list_append(sack->tsns, t_s_n);
@@ -836,6 +847,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
tsn_s->secs = tsn->secs;
tsn_s->usecs = tsn->usecs;
tsn_s->offset = 0;
+ tsn_s->framenumber = framenumber;
tsn_s->length = tvb_get_ntohl(sctp_info->tvb[chunk_number], SACK_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET);
if (tsn_s->length > info->max_window1)
info->max_window1 = tsn_s->length;
@@ -894,7 +906,9 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
tsn = g_malloc(sizeof(tsn_t));
sack = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
+ tsn->first_tsn = 0;
sack->tsns = NULL;
+ sack->first_tsn = 0;
sack->src.type = tsn->src.type = tmp_info.src.type;
sack->src.len = tsn->src.len = tmp_info.src.len;
addr = g_malloc(tmp_info.src.len);
@@ -1034,8 +1048,10 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
{
sack = g_malloc(sizeof(tsn_t));
sack->tsns = NULL;
+ sack->first_tsn = 0;
tsn = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
+ tsn->first_tsn = 0;
}
for (chunk_number = 0; chunk_number < sctp_info->number_of_tvbs; chunk_number++)
{
@@ -1060,6 +1076,8 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
if ((tvb_get_guint8(sctp_info->tvb[chunk_number],0)) == SCTP_DATA_CHUNK_ID)
{
tsnumber = tvb_get_ntohl((sctp_info->tvb)[chunk_number], DATA_CHUNK_TSN_OFFSET);
+ if (tsn->first_tsn == 0)
+ tsn->first_tsn = tsnumber;
t_s_n = g_malloc(16);
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)(t_s_n),0, 16);
tsn->tsns = g_list_append(tsn->tsns, t_s_n);
@@ -1072,6 +1090,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
tsn_s->secs = tsn->secs;
tsn_s->usecs = tsn->usecs;
tsn_s->offset = 0;
+ tsn_s->framenumber = framenumber;
tsn_s->length = length;
if (info->direction == 1)
@@ -1131,6 +1150,8 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
{
tsnumber = tvb_get_ntohl((sctp_info->tvb)[chunk_number], SACK_CHUNK_CUMULATIVE_TSN_ACK_OFFSET);
length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
+ if (sack->first_tsn == 0)
+ sack->first_tsn = tsnumber;
t_s_n = g_malloc(length);
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)(t_s_n),0, length);
sack->tsns = g_list_append(sack->tsns, t_s_n);
@@ -1140,6 +1161,7 @@ packet(void *tapdata _U_, packet_info *pinfo , epan_dissect_t *edt _U_ , const v
tsn_s->secs = tsn->secs;
tsn_s->usecs = tsn->usecs;
tsn_s->offset = 0;
+ tsn_s->framenumber = framenumber;
tsn_s->length = tvb_get_ntohl(sctp_info->tvb[chunk_number], SACK_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET);
diff --git a/gtk/sctp_stat.h b/gtk/sctp_stat.h
index 8ab7cf641a..78a15c0e3a 100644
--- a/gtk/sctp_stat.h
+++ b/gtk/sctp_stat.h
@@ -83,13 +83,13 @@
#define MAX_ADDRESS_LEN 47
#define NUM_CHUNKS 13
-
typedef struct _tsn {
guint32 frame_number;
guint32 secs; /* Absolute seconds */
guint32 usecs;
address src;
address dst;
+ guint32 first_tsn;
GList *tsns;
} tsn_t;
@@ -122,6 +122,7 @@ struct tsn_sort{
guint32 usecs;
guint32 offset;
guint32 length;
+ guint32 framenumber;
};
typedef struct _sctp_addr_chunk {
diff --git a/gtk/sctp_stat_dlg.c b/gtk/sctp_stat_dlg.c
index c11407c929..b93c6f3472 100644
--- a/gtk/sctp_stat_dlg.c
+++ b/gtk/sctp_stat_dlg.c
@@ -57,7 +57,6 @@ static GtkWidget *bt_afilter = NULL, *bt_unselect=NULL, *bt_analyse=NULL, *bt_fi
static gboolean prevent_update = FALSE, filter_applied = FALSE;
#define NUM_COLS 9
-#define FRAME_LIMIT 8
typedef struct column_arrows {
GtkWidget *table;
@@ -273,8 +272,7 @@ static void
sctp_stat_on_filter (GtkButton *button _U_, gpointer user_data _U_)
{
gchar *f_string = NULL;
- guint32 framenumber=0;
- GList *list, *srclist, *dstlist;
+ GList *srclist, *dstlist;
gchar *str=NULL;
GString *gstring=NULL;
struct sockaddr_in *infosrc=NULL;
@@ -285,106 +283,87 @@ sctp_stat_on_filter (GtkButton *button _U_, gpointer user_data _U_)
return;
}
- if (selected_stream->n_packets>FRAME_LIMIT)
+ if (selected_stream->check_address==FALSE)
{
- 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)))))",
- selected_stream->port1,
- selected_stream->port2,
- selected_stream->verification_tag1,
- selected_stream->initiate_tag,
- selected_stream->verification_tag2,
- selected_stream->port2,
- selected_stream->port1,
- selected_stream->verification_tag2,
- selected_stream->initiate_tag,
- selected_stream->verification_tag1);
- filter_string = f_string;
- }
- else
- {
+ 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->initiate_tag,
+ selected_stream->verification_tag2,
+ selected_stream->port2,
+ selected_stream->port1,
+ selected_stream->verification_tag2,
+ 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",
+ selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr))));
+ srclist= g_list_next(srclist);
- srclist = g_list_first(selected_stream->addr1);
+ while (srclist)
+ {
infosrc=(struct sockaddr_in *) (srclist->data);
- gstring = g_string_new(g_strdup_printf("((sctp.srcport==%u && sctp.dstport==%u && (ip.src==%s",
- selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr))));
+ str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
+ g_string_append(gstring, str);
srclist= g_list_next(srclist);
-
- while (srclist)
- {
- infosrc=(struct sockaddr_in *) (srclist->data);
- str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
- g_string_append(gstring, str);
- srclist= g_list_next(srclist);
- }
- dstlist = g_list_first(selected_stream->addr2);
+ }
+ 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)));
+ g_string_append(gstring, str);
+ dstlist= g_list_next(dstlist);
+ while (dstlist)
+ {
infodst=(struct sockaddr_in *) (dstlist->data);
- str = g_strdup_printf(") && (ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
+ str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
g_string_append(gstring, str);
dstlist= g_list_next(dstlist);
- while (dstlist)
- {
- infodst=(struct sockaddr_in *) (dstlist->data);
- str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
- g_string_append(gstring, str);
- dstlist= g_list_next(dstlist);
- }
- srclist = g_list_first(selected_stream->addr1);
+ }
+ 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",
+ selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
+ g_string_append(gstring, str);
+ srclist= g_list_next(srclist);
+
+ while (srclist)
+ {
infosrc=(struct sockaddr_in *) (srclist->data);
- str = g_strdup_printf(")) || (sctp.dstport==%u && sctp.srcport==%u && (ip.dst==%s",
- selected_stream->port1, selected_stream->port2, ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
+ str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
g_string_append(gstring, str);
srclist= g_list_next(srclist);
+ }
- while (srclist)
- {
- infosrc=(struct sockaddr_in *) (srclist->data);
- str =g_strdup_printf("|| ip.dst==%s",ip_to_str((const guint8 *)&(infosrc->sin_addr.s_addr)));
- g_string_append(gstring, str);
- srclist= g_list_next(srclist);
- }
-
- dstlist = g_list_first(selected_stream->addr2);
+ dstlist = g_list_first(selected_stream->addr2);
+ infodst=(struct sockaddr_in *) (dstlist->data);
+ str = g_strdup_printf(") && (ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
+ g_string_append(gstring, str);
+ dstlist= g_list_next(dstlist);
+ while (dstlist)
+ {
infodst=(struct sockaddr_in *) (dstlist->data);
- str = g_strdup_printf(") && (ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
+ str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
g_string_append(gstring, str);
dstlist= g_list_next(dstlist);
- while (dstlist)
- {
- infodst=(struct sockaddr_in *) (dstlist->data);
- str =g_strdup_printf("|| ip.src==%s",ip_to_str((const guint8 *)&(infodst->sin_addr.s_addr)));
- g_string_append(gstring, str);
- dstlist= g_list_next(dstlist);
- }
- str = g_strdup_printf(")))");
- g_string_append(gstring, str);
- filter_string = gstring->str;
- g_string_free(gstring,FALSE);
- }
- }
- else
- {
- list = g_list_first(selected_stream->frame_numbers);
- framenumber = *((guint32 *)(list->data));
- gstring = g_string_new(g_strdup_printf("frame.number==%u",framenumber));
- list = g_list_next(list);
- while (list)
- {
- framenumber = *((guint32 *)(list->data));
- str =g_strdup_printf(" || frame.number==%u",framenumber);
- g_string_append(gstring, str);
- list = g_list_next(list);
}
+ str = g_strdup_printf(")))");
+ g_string_append(gstring, str);
filter_string = gstring->str;
g_string_free(gstring,FALSE);
}