diff options
author | Michael Tüxen <tuexen@fh-muenster.de> | 2007-05-22 21:16:30 +0000 |
---|---|---|
committer | Michael Tüxen <tuexen@fh-muenster.de> | 2007-05-22 21:16:30 +0000 |
commit | ab125d0d436088dee173e3e6b3fb106924713deb (patch) | |
tree | a8323c8b6b51c0f7768fe31448e212434dd63060 /gtk | |
parent | ddb6768db2d173f973016040079680e8632f7338 (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.c | 151 | ||||
-rw-r--r-- | gtk/sctp_byte_graph_dlg.c | 2 | ||||
-rw-r--r-- | gtk/sctp_graph_dlg.c | 145 | ||||
-rw-r--r-- | gtk/sctp_stat.c | 26 | ||||
-rw-r--r-- | gtk/sctp_stat.h | 3 | ||||
-rw-r--r-- | gtk/sctp_stat_dlg.c | 155 |
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); } |