Update to versions compiling on and working on Windows and Unix.

svn path=/trunk/; revision=13295
This commit is contained in:
Michael Tüxen 2005-02-04 22:45:15 +00:00
parent 04a154ec0a
commit b608b5e406
6 changed files with 380 additions and 288 deletions

View File

@ -41,6 +41,17 @@
#include "sctp_stat.h"
struct v4addr {
address_type type;
int len;
guint32 addr;
};
struct v6addr {
address_type type;
int len;
guint8 addr[16];
};
void
decrease_childcount(struct sctp_analyse *parent)
@ -112,10 +123,10 @@ on_notebook_switch_page()
{
}
static void on_error_bt()
static void on_error_bt(GtkWidget *widget _U_, struct sctp_analyse* u_data)
{
sctp_error_dlg_show();
sctp_error_dlg_show(u_data->assoc);
}
static void on_close_dlg(GtkWidget *widget _U_, struct sctp_analyse* u_data)
@ -156,9 +167,9 @@ gchar *data[1];
gchar field[1][32];
gint added_row;
GList *list;
struct sockaddr_in *v4=NULL;
struct sockaddr_in6 *v6=NULL;
struct sockaddr_storage *store=NULL;
struct v4addr *v4=NULL;
struct v6addr *v6=NULL;
address *store=NULL;
if (u_data->assoc==NULL)
return;
@ -202,25 +213,25 @@ if (u_data->assoc==NULL)
if (u_data->assoc->addr1!=NULL)
{
list = g_list_first(u_data->assoc->addr1);
while (list)
{
data[0]=&field[0][0];
store = (struct sockaddr_storage *) (list->data);
if (store->ss_family==AF_INET)
list = g_list_first(u_data->assoc->addr1);
while (list)
{
v4 = (struct sockaddr_in *)(list->data);
g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)&(v4->sin_addr.s_addr)));
data[0]=&field[0][0];
store = (address *) (list->data);
if (store->type==AT_IPv4)
{
v4 = (struct v4addr *)(list->data);
g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)&(v4->addr)));
}
else if (store->type==AT_IPv6)
{
v6 = (struct v6addr *)(list->data);
g_snprintf(field[0], 30, "%s", ip6_to_str((const struct e_in6_addr *)&(v6->addr)));
}
added_row = gtk_clist_append(GTK_CLIST(u_data->analyse_nb->page2->clist), data);
gtk_clist_set_row_data(GTK_CLIST(u_data->analyse_nb->page2->clist), added_row, u_data->assoc);
list = g_list_next(list);
}
else if (store->ss_family==AF_INET6)
{
v6 = (struct sockaddr_in6 *)(list->data);
g_snprintf(field[0], 30, "%s", ip6_to_str((const struct e_in6_addr *)&(v6->sin6_addr.s6_addr)));
}
added_row = gtk_clist_append(GTK_CLIST(u_data->analyse_nb->page2->clist), data);
gtk_clist_set_row_data(GTK_CLIST(u_data->analyse_nb->page2->clist), added_row, u_data->assoc);
list = g_list_next(list);
}
}
else
{
@ -265,16 +276,17 @@ if (u_data->assoc==NULL)
while (list)
{
data[0]=&field[0][0];
store = (struct sockaddr_storage *) (list->data);
if (store->ss_family==AF_INET)
store = (address *) (list->data);
if (store->type==AT_IPv4)
{
v4 = (struct sockaddr_in *)(list->data);
g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)&(v4->sin_addr.s_addr)));
v4 = (struct v4addr *)(list->data);
g_snprintf(field[0], 30, "%s", ip_to_str((const guint8 *)&(v4->addr)));
}
else if (store->ss_family==AF_INET6)
else if (store->type==AT_IPv6)
{
v6 = (struct sockaddr_in6 *)(list->data);
g_snprintf(field[0], 30, "%s", ip6_to_str((const struct e_in6_addr *)&(v6->sin6_addr.s6_addr)));
v6 = (struct v6addr *)(list->data);
g_snprintf(field[0], 30, "%s", ip6_to_str((const struct e_in6_addr *)&(v6->addr)));
}
added_row = gtk_clist_append(GTK_CLIST(u_data->analyse_nb->page3->clist), data);
gtk_clist_set_row_data(GTK_CLIST(u_data->analyse_nb->page3->clist), added_row, u_data->assoc);
@ -402,7 +414,7 @@ void create_analyse_window(struct sctp_analyse* u_data)
error_bt = gtk_button_new_with_label ("Show Errors");
gtk_box_pack_start(GTK_BOX(hbox), error_bt, FALSE, FALSE, 0);
gtk_widget_show(error_bt);
SIGNAL_CONNECT(error_bt, "clicked", on_error_bt, NULL);
SIGNAL_CONNECT(error_bt, "clicked", on_error_bt, u_data);
close_bt = BUTTON_NEW_FROM_STOCK(GTK_STOCK_CLOSE);
@ -662,7 +674,7 @@ gboolean frame_matched;
frame_data *fdata;
gchar filter_text[256];
sctp_assoc_info_t* assoc=NULL;
struct sockaddr_in *src, *dst;
struct v4addr *src, *dst;
strcpy(filter_text,"sctp && ip");
if (!dfilter_compile(filter_text, &sfcode)) {
@ -711,18 +723,19 @@ struct sockaddr_in *src, *dst;
assoc = (sctp_assoc_info_t*)(list->data);
if (assoc->port1 == srcport && assoc->port2 == dstport)
{
{
srclist = g_list_first(assoc->addr1);
while(srclist)
{
src = (struct sockaddr_in *)(srclist->data);
if (src->sin_addr.s_addr == ip_src)
src = (struct v4addr *)(srclist->data);
if (src->addr == ip_src)
{
dstlist = g_list_first(assoc->addr2);
while(dstlist)
{
dst = (struct sockaddr_in *)(dstlist->data);
if (dst->sin_addr.s_addr == ip_dst)
dst = (struct v4addr *)(dstlist->data);
if (dst->addr == ip_dst)
{
u_data->assoc=assoc;
create_analyse_window(u_data);
@ -740,18 +753,18 @@ struct sockaddr_in *src, *dst;
return;
}
else if (assoc->port2 == srcport && assoc->port1 == dstport)
{
{
srclist = g_list_first(assoc->addr2);
while(srclist)
{
src = (struct sockaddr_in *)(srclist->data);
if (src->sin_addr.s_addr == ip_src)
src = (struct v4addr *)(srclist->data);
if (src->addr == ip_src)
{
dstlist = g_list_first(assoc->addr1);
while(dstlist)
{
dst = (struct sockaddr_in *)(dstlist->data);
if (dst->sin_addr.s_addr == ip_dst)
dst = (struct v4addr *)(dstlist->data);
if (dst->addr == ip_dst)
{
u_data->assoc=assoc;
create_analyse_window(u_data);
@ -781,18 +794,18 @@ struct sctp_analyse * u_data;
/* Register the tap listener */
if (sctp_stat_get_info()->is_registered==FALSE)
register_tap_listener_sctp_stat();
register_tap_listener_sctp_stat();
/* (redissect all packets) */
sctp_stat_scan();
sctp_stat_scan();
/* Show the dialog box with the list of streams */
u_data = g_malloc(sizeof(struct sctp_analyse));
u_data->assoc=NULL;
u_data->children=NULL;
u_data->analyse_nb=NULL;
u_data->window=NULL;
u_data->num_children=0;
retap_packets(&cfile);
sctp_analyse_cb(u_data);
}

View File

@ -354,7 +354,7 @@ gfloat dis;
gdk_draw_line(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,u_data->io->pixmap_width-RIGHT_BORDER+u_data->io->offset, u_data->io->pixmap_height-BOTTOM_BORDER, u_data->io->pixmap_width-RIGHT_BORDER+u_data->io->offset-5, u_data->io->pixmap_height-BOTTOM_BORDER+5);
u_data->io->axis_width=u_data->io->pixmap_width-LEFT_BORDER-RIGHT_BORDER-u_data->io->offset;
u_data->io->x_interval = (u_data->io->axis_width*1.0)/u_data->io->tmp_width;
u_data->io->x_interval = (float)((u_data->io->axis_width*1.0)/u_data->io->tmp_width);
e=0;
if (u_data->io->x_interval<1)
@ -530,7 +530,7 @@ gfloat dis;
gdk_draw_line(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,LEFT_BORDER,TOP_BORDER-u_data->io->offset, LEFT_BORDER-5, TOP_BORDER-u_data->io->offset+5);
gdk_draw_line(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,LEFT_BORDER,TOP_BORDER-u_data->io->offset, LEFT_BORDER+5, TOP_BORDER-u_data->io->offset+5);
u_data->io->y_interval = ((u_data->io->pixmap_height-TOP_BORDER-BOTTOM_BORDER)*1.0)/(u_data->io->max_y-u_data->io->min_y);
u_data->io->y_interval = (float)(((u_data->io->pixmap_height-TOP_BORDER-BOTTOM_BORDER)*1.0)/(u_data->io->max_y-u_data->io->min_y));
e=0;
if (u_data->io->y_interval<1)
@ -581,9 +581,9 @@ gfloat dis;
(guint32)(u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset-(i-u_data->io->min_y)*u_data->io->y_interval));
}
}
}
else
simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
}
else
simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
}
@ -682,6 +682,7 @@ configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, struct sctp_uda
0, 0,
widget->allocation.width,
widget->allocation.height);
sctp_graph_redraw(u_data);
return TRUE;
}
@ -801,10 +802,10 @@ sctp_graph_t *ios;
{
gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->white_gc,
FALSE,
(gint)MINI(u_data->io->x_old,u_data->io->x_new),
(gint)MINI(u_data->io->y_old,u_data->io->y_new),
(gint)abs(u_data->io->x_new-u_data->io->x_old),
(gint)abs(u_data->io->y_new-u_data->io->y_old));
(gint)floor(MINI(u_data->io->x_old,u_data->io->x_new)),
(gint)floor(MINI(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");
if(!ios){
@ -816,8 +817,8 @@ sctp_graph_t *ios;
ios->pixmap,
0,0,
0, 0,
(gint)abs(u_data->io->x_new-u_data->io->x_old),
(gint)abs(u_data->io->y_new-u_data->io->y_old));
(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)));
sctp_graph_redraw(u_data);
}
@ -846,13 +847,13 @@ if (event->y>u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset)
if (event->x < LEFT_BORDER+u_data->io->offset)
event->x = LEFT_BORDER+u_data->io->offset;
if (abs(event->x-u_data->io->x_old)>10 || abs(event->y-u_data->io->y_old)>10)
if (abs((long)(event->x-u_data->io->x_old))>10 || abs((long)(event->y-u_data->io->y_old))>10)
{
gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,
FALSE,
(gint)MINI(u_data->io->x_old,event->x), (gint)MINI(u_data->io->y_old,event->y),
(gint)abs(event->x-u_data->io->x_old),
(gint)abs(event->y-u_data->io->y_old));
(gint)floor(MINI(u_data->io->x_old,event->x)), (gint)floor(MINI(u_data->io->y_old,event->y)),
(gint)abs((long)(event->x-u_data->io->x_old)),
(gint)abs((long)(event->y-u_data->io->y_old)));
ios=(sctp_graph_t *)OBJECT_GET_DATA(u_data->io->draw_area, "sctp_graph_t");
if(!ios){
@ -867,8 +868,8 @@ if (event->x < LEFT_BORDER+u_data->io->offset)
u_data->io->draw_area->allocation.width,
u_data->io->draw_area->allocation.height);
x1_tmp=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=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=(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));
helpx=MINI(x1_tmp, x2_tmp);
if (helpx==x2_tmp)
{
@ -1084,7 +1085,7 @@ void set_arw_offsets(struct sctp_udata *u_data)
GArray *s_array=NULL, *t_array=NULL;
guint32 i, j=0;
if (u_data->assoc->n_sack_chunks_ep1>0)
if (u_data->dir==1 && u_data->assoc->n_sack_chunks_ep1>0)
{
s_array=u_data->assoc->sort_sack1;
t_array=u_data->assoc->sort_tsn1;
@ -1097,13 +1098,13 @@ guint32 i, j=0;
j++;
}
g_array_index(s_array, struct tsn_sort, i).offset=g_array_index(t_array, struct tsn_sort, j).offset
+g_array_index(t_array, struct tsn_sort, j).length;
+g_array_index(t_array, struct tsn_sort, j).length;
}
u_data->assoc->sort_sack1=s_array;
}
if (u_data->assoc->n_sack_chunks_ep2>0)
if (u_data->dir==2 && u_data->assoc->n_sack_chunks_ep2>0)
{
s_array=u_data->assoc->sort_sack2;
t_array=u_data->assoc->sort_tsn2;
@ -1130,7 +1131,7 @@ guint32 i;
guint32 sum=0;
guint32 tsntmp=0;
if (u_data->assoc->n_array_tsn1>0)
if (u_data->dir==1 && u_data->assoc->n_array_tsn1>0)
{
array=u_data->assoc->sort_tsn1;
insertion(array,u_data->assoc->n_array_tsn1);
@ -1138,7 +1139,8 @@ guint32 tsntmp=0;
for (i=0; i<u_data->assoc->n_array_tsn1; i++)
{
g_array_index(array, struct tsn_sort, i).offset=sum;
if (g_array_index(array, struct tsn_sort, i).tsnumber>tsntmp)
t_sort.tsnumber=g_array_index(array, struct tsn_sort, i).tsnumber;
if (t_sort.tsnumber>tsntmp)
sum+=g_array_index(array, struct tsn_sort, i).length;
tsntmp=t_sort.tsnumber;
}
@ -1146,7 +1148,7 @@ guint32 tsntmp=0;
sort=g_array_index(array, struct tsn_sort,i-1);
u_data->assoc->sort_tsn1=array;
}
if (u_data->assoc->n_array_tsn2>0)
if (u_data->dir==2 && u_data->assoc->n_array_tsn2>0)
{
sum=0;
array=u_data->assoc->sort_tsn2;
@ -1155,7 +1157,8 @@ guint32 tsntmp=0;
for (i=0; i<u_data->assoc->n_array_tsn2; i++)
{
g_array_index(array, struct tsn_sort, i).offset=sum;
if (g_array_index(array, struct tsn_sort, i).tsnumber>tsntmp)
t_sort.tsnumber=g_array_index(array, struct tsn_sort, i).tsnumber;
if (t_sort.tsnumber>tsntmp)
sum+=g_array_index(array, struct tsn_sort, i).length;
tsntmp=t_sort.tsnumber;
}
@ -1175,11 +1178,16 @@ struct sctp_udata *u_data;
u_data->io=NULL;
u_data->dir = dir;
u_data->parent = userdata;
set_child(u_data, u_data->parent);
increase_childcount(u_data->parent);
compute_offsets(u_data);
set_arw_offsets(u_data);
gtk_sctpgraph_init(u_data);
if ((u_data->dir==1 && (u_data->assoc->n_array_tsn1==0 || u_data->assoc->n_sack_chunks_ep1==0))|| (u_data->dir==2 && (u_data->assoc->n_array_tsn2==0 || u_data->assoc->n_sack_chunks_ep2==0)))
simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
else
{
set_child(u_data, u_data->parent);
increase_childcount(u_data->parent);
compute_offsets(u_data);
set_arw_offsets(u_data);
gtk_sctpgraph_init(u_data);
}
}

View File

@ -30,7 +30,7 @@
#include "globals.h"
#include "epan/filesystem.h"
#include "simple_dialog.h"
#include "tap_menu.h"
#include "dlg_utils.h"
#include "ui_util.h"
@ -259,10 +259,11 @@ void sctp_error_dlg_show(sctp_assoc_info_t* assoc)
{
GList *list;
printf("dlg_show\n");
/* selected_assoc=(sctp_assoc_info_t*)get_selected_assoc(); */
list =assoc->error_info_list;
if (list != NULL)
{
if (sctp_error_dlg != NULL) {
/* There's already a dialog box; reactivate it. */
reactivate_window(sctp_error_dlg);
@ -272,11 +273,14 @@ printf("dlg_show\n");
}
}
else {
printf("else\n");
/* Create and show the dialog box */
gtk_sctperror_dlg();
sctp_error_dlg_update(list);
}
}
else
simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
"No errors found!");
}

View File

@ -376,7 +376,7 @@ gfloat dis;
gdk_draw_line(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,u_data->io->pixmap_width-RIGHT_BORDER+u_data->io->offset, u_data->io->pixmap_height-BOTTOM_BORDER, u_data->io->pixmap_width-RIGHT_BORDER+u_data->io->offset-5, u_data->io->pixmap_height-BOTTOM_BORDER+5);
u_data->io->axis_width=u_data->io->pixmap_width-LEFT_BORDER-RIGHT_BORDER-u_data->io->offset;
u_data->io->x_interval = (u_data->io->axis_width*1.0)/u_data->io->tmp_width;
u_data->io->x_interval = (float)((u_data->io->axis_width*1.0)/u_data->io->tmp_width);
e=0;
if (u_data->io->x_interval<1)
@ -418,6 +418,7 @@ gfloat dis;
if (u_data->io->offset!=0)
{
g_snprintf(label_string, 15, "%u", u_data->io->x1_tmp_sec);
#if GTK_MAJOR_VERSION < 2
lwidth=gdk_string_width(font, label_string);
gdk_draw_string(u_data->io->pixmap,font,u_data->io->draw_area->style->black_gc,
@ -468,7 +469,6 @@ gfloat dis;
{
length=5;
g_snprintf(label_string, 15, "%d", i%1000000);
if (j%w==0)
{
length=10;
@ -553,7 +553,7 @@ gfloat dis;
gdk_draw_line(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,LEFT_BORDER,TOP_BORDER-u_data->io->offset, LEFT_BORDER-5, TOP_BORDER-u_data->io->offset+5);
gdk_draw_line(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,LEFT_BORDER,TOP_BORDER-u_data->io->offset, LEFT_BORDER+5, TOP_BORDER-u_data->io->offset+5);
u_data->io->y_interval = ((u_data->io->pixmap_height-TOP_BORDER-BOTTOM_BORDER)*1.0)/(u_data->io->max_y-u_data->io->min_y);
u_data->io->y_interval = (float)(((u_data->io->pixmap_height-TOP_BORDER-BOTTOM_BORDER)*1.0)/(u_data->io->max_y-u_data->io->min_y));
e=0;
if (u_data->io->y_interval<1)
@ -577,7 +577,6 @@ gfloat dis;
{
length=5;
g_snprintf(label_string, 15, "%d", i);
if (i%distance==0 || (distance<=5 && u_data->io->y_interval>10))
{
length=10;
@ -605,7 +604,7 @@ gfloat dis;
}
}
}
else
else if ((u_data->dir==1 && u_data->assoc->n_array_tsn1==0) || (u_data->dir==2 && u_data->assoc->n_array_tsn2==0))
simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
}
@ -708,7 +707,7 @@ configure_event(GtkWidget *widget, GdkEventConfigure *event _U_, struct sctp_uda
0, 0,
widget->allocation.width,
widget->allocation.height);
sctp_graph_redraw(u_data);
return TRUE;
}
@ -828,10 +827,10 @@ sctp_graph_t *ios;
{
gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->white_gc,
FALSE,
(gint)MINI(u_data->io->x_old,u_data->io->x_new),
(gint)MINI(u_data->io->y_old,u_data->io->y_new),
(gint)abs(u_data->io->x_new-u_data->io->x_old),
(gint)abs(u_data->io->y_new-u_data->io->y_old));
(gint)floor(MINI(u_data->io->x_old,u_data->io->x_new)),
(gint)floor(MINI(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))));
ios=(sctp_graph_t *)OBJECT_GET_DATA(u_data->io->draw_area, "sctp_graph_t");
if(!ios){
@ -843,8 +842,8 @@ sctp_graph_t *ios;
ios->pixmap,
0,0,
0, 0,
(gint)abs(u_data->io->x_new-u_data->io->x_old),
(gint)abs(u_data->io->y_new-u_data->io->y_old));
(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))));
sctp_graph_redraw(u_data);
}
@ -872,13 +871,13 @@ if (event->y>u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset)
event->y = u_data->io->pixmap_height-BOTTOM_BORDER-u_data->io->offset;
if (event->x < LEFT_BORDER+u_data->io->offset)
event->x = LEFT_BORDER+u_data->io->offset;
if (abs(event->x-u_data->io->x_old)>10 || abs(event->y-u_data->io->y_old)>10)
if (abs((long)(event->x-u_data->io->x_old))>10 || abs((long)(event->y-u_data->io->y_old))>10)
{
gdk_draw_rectangle(u_data->io->pixmap,u_data->io->draw_area->style->black_gc,
FALSE,
(gint)MINI(u_data->io->x_old,event->x), (gint)MINI(u_data->io->y_old,event->y),
(gint)abs(event->x-u_data->io->x_old),
(gint)abs(event->y-u_data->io->y_old));
(gint)floor(MINI(u_data->io->x_old,event->x)), (gint)floor(MINI(u_data->io->y_old,event->y)),
(gint)abs((long)(event->x-u_data->io->x_old)),
(gint)abs((long)(event->y-u_data->io->y_old)));
ios=(sctp_graph_t *)OBJECT_GET_DATA(u_data->io->draw_area, "sctp_graph_t");
if(!ios){
@ -893,8 +892,8 @@ if (event->x < LEFT_BORDER+u_data->io->offset)
u_data->io->draw_area->allocation.width,
u_data->io->draw_area->allocation.height);
x1_tmp=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=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=(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));
helpx=MINI(x1_tmp, x2_tmp);
if (helpx==x2_tmp)
{
@ -1100,9 +1099,13 @@ struct sctp_udata *u_data;
u_data->io=NULL;
u_data->dir = dir;
u_data->parent = userdata;
if ((u_data->dir==1 && u_data->assoc->n_array_tsn1==0)|| (u_data->dir==2 && u_data->assoc->n_array_tsn2==0))
simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK, "No Data Chunks sent");
else
{
set_child(u_data, u_data->parent);
increase_childcount(u_data->parent);
gtk_sctpgraph_init(u_data);
}
}

View File

@ -39,6 +39,7 @@
#include <string.h>
#include "sctp_stat.h"
#include <math.h>
#include "epan/address.h"
#define SCTP_HEARTBEAT_CHUNK_ID 4
@ -82,7 +83,19 @@
#define SACK_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH 4
#define SACK_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET (SACK_CHUNK_CUMULATIVE_TSN_ACK_OFFSET + \
SACK_CHUNK_CUMULATIVE_TSN_ACK_LENGTH)
#define INIT_CHUNK_INITIAL_TSN_LENGTH 4
#define INIT_CHUNK_FIXED_PARAMTERS_LENGTH (INIT_CHUNK_INITIATE_TAG_LENGTH + \
INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH + \
INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_LENGTH + \
INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_LENGTH + \
INIT_CHUNK_INITIAL_TSN_LENGTH)
#define CHUNK_HEADER_LENGTH (CHUNK_TYPE_LENGTH + \
CHUNK_FLAGS_LENGTH + \
CHUNK_LENGTH_LENGTH)
#define INIT_CHUNK_VARIABLE_LENGTH_PARAMETER_OFFSET (INIT_CHUNK_INITIAL_TSN_OFFSET + \
INIT_CHUNK_INITIAL_TSN_LENGTH )
static const value_string chunk_type_values[] = {
@ -121,7 +134,18 @@ static const value_string chunk_type_values[] = {
#define ADDRESS_BACKWARD_ADD_BACKWARD_VTAG 9
#define ASSOC_NOT_FOUND 10
struct v4addr {
address_type type;
int len;
guint32 addr;
};
struct v6addr {
address_type type;
int len;
guint8 addr[16];
};
static sctp_allassocs_info_t sctp_tapinfo_struct = {0, NULL, FALSE, NULL};
@ -335,70 +359,70 @@ gint sctp_assoc_vtag_cmp(gconstpointer aa, gconstpointer bb)
gint sctp_assoc_address_cmp(gconstpointer aa, gconstpointer bb)
{
GList *srclist, *dstlist;
const struct _sctp_tmp_info* a = aa; /* tmp_info */
const struct _sctp_assoc_info* b = bb; /* info */
struct sockaddr_storage *store=NULL;
struct sockaddr_storage *srcstore=NULL;
struct sockaddr_storage *dststore=NULL;
struct sockaddr_in *src=NULL;
struct sockaddr_in6 *src6=NULL;
struct sockaddr_in *infosrc=NULL;
struct sockaddr_in *infodst=NULL;
struct sockaddr_in6 *infosrc6=NULL;
struct sockaddr_in *dst=NULL;
struct sockaddr_in6 *dst6=NULL;
struct sockaddr_in6 *infodst6=NULL;
const struct _sctp_tmp_info* a = aa;
const struct _sctp_assoc_info* b = bb;
address *store=NULL;
address *srcstore=NULL;
address *dststore=NULL;
struct v4addr *src=NULL;
struct v6addr *src6=NULL;
struct v4addr *infosrc=NULL;
struct v4addr *infodst=NULL;
struct v6addr *infosrc6=NULL;
struct v4addr *dst=NULL;
struct v6addr *dst6=NULL;
struct v6addr *infodst6=NULL;
gboolean src_v4=FALSE;
gboolean src_v6=FALSE;
gboolean dst_v4=FALSE;
gboolean dst_v6=FALSE;
store = g_malloc(sizeof(struct sockaddr_storage));
g_memmove(store, &(a->src),sizeof(struct sockaddr_storage));
if (store->ss_family==AF_INET)
store = g_malloc(sizeof(address));
g_memmove(store, &(a->src),sizeof(address));
if (store->type==AT_IPv4)
{
src = g_malloc(sizeof(struct sockaddr_in));
g_memmove(src, &(a->src),sizeof(struct sockaddr_in));
src = g_malloc(sizeof(struct v4addr));
g_memmove(src, &(a->src),sizeof(struct v4addr));
src_v4=TRUE;
}
else if (store->ss_family==AF_INET6)
else if (store->type==AT_IPv6)
{
src6 = g_malloc(sizeof(struct sockaddr_in6));
g_memmove(src6, &(a->src),sizeof(struct sockaddr_in6));
src6 = g_malloc(sizeof(struct v6addr));
g_memmove(src6, &(a->src),sizeof(struct v6addr));
src_v6=TRUE;
}
g_memmove(store, &(a->dst),sizeof(struct sockaddr_storage));
if (store->ss_family==AF_INET)
g_memmove(store, &(a->dst),sizeof(address));
if (store->type==AT_IPv4)
{
dst = g_malloc(sizeof(struct sockaddr_in));
g_memmove(dst, &(a->dst),sizeof(struct sockaddr_in));
dst = g_malloc(sizeof(struct v4addr));
g_memmove(dst, &(a->dst),sizeof(struct v4addr));
dst_v4=TRUE;
}
else if (store->ss_family==AF_INET6)
else if (store->type==AT_IPv6)
{
dst6 = g_malloc(sizeof(struct sockaddr_in6));
g_memmove(dst6, &(a->dst),sizeof(struct sockaddr_in6));
dst6 = g_malloc(sizeof(struct v6addr));
g_memmove(dst6, &(a->dst),sizeof(struct v6addr));
dst_v6=TRUE;
}
srclist = g_list_first(b->addr1);
while (srclist)
{
srcstore = (struct sockaddr_storage *) (srclist->data);
if (srcstore->ss_family==AF_INET && src_v4==TRUE)
srcstore = (address *) (srclist->data);
if (srcstore->type==AT_IPv4 && src_v4==TRUE)
{
infosrc=(struct sockaddr_in *) (srclist->data);
if (src->sin_addr.s_addr==infosrc->sin_addr.s_addr && a->port1 == b->port1)
infosrc=(struct v4addr *) (srclist->data);
if (src->addr==infosrc->addr && a->port1 == b->port1)
{
dstlist = g_list_first(b->addr2);
while (dstlist)
{
dststore = (struct sockaddr_storage *) (dstlist->data);
if (dststore->ss_family==AF_INET && dst_v4==TRUE)
dststore = (address *) (dstlist->data);
if (dststore->type==AT_IPv4 && dst_v4==TRUE)
{
infodst=(struct sockaddr_in *) (dstlist->data);
if (dst->sin_addr.s_addr==infodst->sin_addr.s_addr && a->port2 == b->port2)
infodst=(struct v4addr *) (dstlist->data);
if (dst->addr==infodst->addr && a->port2 == b->port2)
{
if ((a->verification_tag1 !=0)&& (b->verification_tag1 == 0)&& (b->verification_tag2 !=0))
return ADDRESS_FORWARD_ADD_FORWARD_VTAG;
@ -408,10 +432,10 @@ gboolean dst_v6=FALSE;
else
dstlist=g_list_next(dstlist);
}
else if (dststore->ss_family==AF_INET6 && dst_v6==TRUE)
else if (dststore->type==AT_IPv6 && dst_v6==TRUE)
{
infodst6=(struct sockaddr_in6 *) (dstlist->data);
if (dst6->sin6_addr.s6_addr==infodst6->sin6_addr.s6_addr && a->port2 == b->port2)
infodst6=(struct v6addr *) (dstlist->data);
if (dst6->addr==infodst6->addr && a->port2 == b->port2)
{
if ((a->verification_tag1 !=0)&& (b->verification_tag1 == 0)&& (b->verification_tag2 !=0))
return ADDRESS_FORWARD_ADD_FORWARD_VTAG;
@ -429,19 +453,19 @@ gboolean dst_v6=FALSE;
else
srclist=g_list_next(srclist);
}
else if (srcstore->ss_family==AF_INET6 && src_v6==TRUE)
else if (srcstore->type==AT_IPv6 && src_v6==TRUE)
{
infosrc6=(struct sockaddr_in6 *) (srclist->data);
if (src6->sin6_addr.s6_addr==infosrc6->sin6_addr.s6_addr && a->port1 == b->port1)
infosrc6=(struct v6addr *) (srclist->data);
if (src6->addr==infosrc6->addr && a->port1 == b->port1)
{
dstlist = g_list_first(b->addr2);
while (dstlist)
{
dststore = (struct sockaddr_storage *) (dstlist->data);
if (dststore->ss_family==AF_INET && dst_v4==TRUE)
dststore = (address *) (dstlist->data);
if (dststore->type==AT_IPv4 && dst_v4==TRUE)
{
infodst=(struct sockaddr_in *) (dstlist->data);
if (dst->sin_addr.s_addr==infodst->sin_addr.s_addr && a->port2 == b->port2)
infodst=(struct v4addr *) (dstlist->data);
if (dst->addr==infodst->addr && a->port2 == b->port2)
{
if ((a->verification_tag1 !=0)&& (b->verification_tag1 == 0)&& (b->verification_tag2 !=0))
return ADDRESS_FORWARD_ADD_FORWARD_VTAG;
@ -451,10 +475,10 @@ gboolean dst_v6=FALSE;
else
dstlist=g_list_next(dstlist);
}
else if (dststore->ss_family==AF_INET6 && dst_v6==TRUE)
else if (dststore->type==AT_IPv6 && dst_v6==TRUE)
{
infodst6=(struct sockaddr_in6 *) (dstlist->data);
if (dst6->sin6_addr.s6_addr==infodst6->sin6_addr.s6_addr && a->port2 == b->port2)
infodst6=(struct v6addr *) (dstlist->data);
if (dst6->addr==infodst6->addr && a->port2 == b->port2)
{
if ((a->verification_tag1 !=0)&& (b->verification_tag1 == 0)&& (b->verification_tag2 !=0))
return ADDRESS_FORWARD_ADD_FORWARD_VTAG;
@ -482,52 +506,52 @@ gboolean dst_v6=FALSE;
g_free(dst6);
g_free(store);
store = g_malloc(sizeof(struct sockaddr_storage));
g_memmove(store, &(a->dst),sizeof(struct sockaddr_storage));
if (store->ss_family==AF_INET)
store = g_malloc(sizeof(address));
g_memmove(store, &(a->dst),sizeof(address));
if (store->type==AT_IPv4)
{
src = g_malloc(sizeof(struct sockaddr_in));
g_memmove(src, &(a->dst),sizeof(struct sockaddr_in));
src = g_malloc(sizeof(struct v4addr));
g_memmove(src, &(a->dst),sizeof(struct v4addr));
src_v4=TRUE;
}
else if (store->ss_family==AF_INET6)
else if (store->type==AT_IPv6)
{
src6 = g_malloc(sizeof(struct sockaddr_in6));
g_memmove(src6, &(a->dst),sizeof(struct sockaddr_in6));
src6 = g_malloc(sizeof(struct v6addr));
g_memmove(src6, &(a->dst),sizeof(struct v6addr));
src_v6=TRUE;
}
g_memmove(store, &(a->src),sizeof(struct sockaddr_storage));
if (store->ss_family==AF_INET)
g_memmove(store, &(a->src),sizeof(address));
if (store->type==AT_IPv4)
{
dst = g_malloc(sizeof(struct sockaddr_in));
g_memmove(dst, &(a->src),sizeof(struct sockaddr_in));
dst = g_malloc(sizeof(struct v4addr));
g_memmove(dst, &(a->src),sizeof(struct v4addr));
dst_v4=TRUE;
}
else if (store->ss_family==AF_INET6)
else if (store->type==AT_IPv6)
{
dst6 = g_malloc(sizeof(struct sockaddr_in6));
g_memmove(dst6, &(a->src),sizeof(struct sockaddr_in6));
dst6 = g_malloc(sizeof(struct v6addr));
g_memmove(dst6, &(a->src),sizeof(struct v6addr));
dst_v6=TRUE;
}
srclist = g_list_first(b->addr1);
while (srclist)
{
srcstore = (struct sockaddr_storage *) (srclist->data);
if (srcstore->ss_family==AF_INET && src_v4==TRUE)
srcstore = (address *) (srclist->data);
if (srcstore->type==AT_IPv4 && src_v4==TRUE)
{
infosrc=(struct sockaddr_in *) (srclist->data);
if (src->sin_addr.s_addr==infosrc->sin_addr.s_addr && a->port2 == b->port1)
infosrc=(struct v4addr *) (srclist->data);
if (src->addr==infosrc->addr && a->port2 == b->port1)
{
dstlist = g_list_first(b->addr2);
while (dstlist)
{
dststore = (struct sockaddr_storage *) (dstlist->data);
if (dststore->ss_family==AF_INET && src_v4==TRUE)
dststore = (address *) (dstlist->data);
if (dststore->type==AT_IPv4 && src_v4==TRUE)
{
infodst=(struct sockaddr_in *) (dstlist->data);
if (dst->sin_addr.s_addr==infodst->sin_addr.s_addr && a->port1 == b->port2)
infodst=(struct v4addr *) (dstlist->data);
if (dst->addr==infodst->addr && a->port1 == b->port2)
{
if ((a->verification_tag1 ==b->verification_tag2)&& (b->verification_tag1 == 0))
return ADDRESS_BACKWARD_ADD_FORWARD_VTAG;
@ -539,10 +563,10 @@ gboolean dst_v6=FALSE;
else
dstlist=g_list_next(dstlist);
}
else if (dststore->ss_family==AF_INET6 && src_v6==TRUE)
else if (dststore->type==AT_IPv6 && src_v6==TRUE)
{
infodst6=(struct sockaddr_in6 *) (dstlist->data);
if (dst6->sin6_addr.s6_addr==infodst6->sin6_addr.s6_addr && a->port1 == b->port2)
infodst6=(struct v6addr *) (dstlist->data);
if (dst6->addr==infodst6->addr && a->port1 == b->port2)
{
if ((a->verification_tag1 ==b->verification_tag2)&& (b->verification_tag1 == 0))
@ -563,19 +587,19 @@ gboolean dst_v6=FALSE;
else
srclist=g_list_next(srclist);
}
else if (srcstore->ss_family==AF_INET6 && src_v6==TRUE)
else if (srcstore->type==AT_IPv6 && src_v6==TRUE)
{
infosrc6=(struct sockaddr_in6 *) (srclist->data);
if (src6->sin6_addr.s6_addr==infosrc6->sin6_addr.s6_addr && a->port2 == b->port1)
infosrc6=(struct v6addr *) (srclist->data);
if (src6->addr==infosrc6->addr && a->port2 == b->port1)
{
dstlist = g_list_first(b->addr2);
while (dstlist)
{
dststore = (struct sockaddr_storage *) (dstlist->data);
if (dststore->ss_family==AF_INET && src_v4==TRUE)
dststore = (address *) (dstlist->data);
if (dststore->type==AT_IPv4 && src_v4==TRUE)
{
infodst=(struct sockaddr_in *) (dstlist->data);
if (dst->sin_addr.s_addr==infodst->sin_addr.s_addr && a->port1 == b->port2)
infodst=(struct v4addr *) (dstlist->data);
if (dst->addr==infodst->addr && a->port1 == b->port2)
{
if ((a->verification_tag1 ==b->verification_tag2)&& (b->verification_tag1 == 0))
return ADDRESS_BACKWARD_ADD_FORWARD_VTAG;
@ -587,10 +611,10 @@ gboolean dst_v6=FALSE;
else
dstlist=g_list_next(dstlist);
}
else if (dststore->ss_family==AF_INET6 && src_v6==TRUE)
else if (dststore->type==AT_IPv6 && src_v6==TRUE)
{
infodst6=(struct sockaddr_in6 *) (dstlist->data);
if (dst6->sin6_addr.s6_addr==infodst6->sin6_addr.s6_addr && a->port1 == b->port2)
infodst6=(struct v6addr *) (dstlist->data);
if (dst6->addr==infodst6->addr && a->port1 == b->port2)
{
if ((a->verification_tag1 ==b->verification_tag2)&& (b->verification_tag1 == 0))
return ADDRESS_BACKWARD_ADD_FORWARD_VTAG;
@ -706,13 +730,12 @@ guint8 cmp;
return NULL;
}
sctp_assoc_info_t * add_address(struct sockaddr_storage * vadd, sctp_assoc_info_t *info, guint8 direction)
sctp_assoc_info_t * add_address(address * vadd, sctp_assoc_info_t *info, guint8 direction)
{
GList *list;
struct sockaddr_in *v4, *v4add=NULL;
struct sockaddr_in6 *v6, *v6add=NULL;
struct sockaddr_storage *v;
struct v4addr *v4=NULL, *v4add=NULL;
struct v6addr *v6=NULL, *v6add=NULL;
address *v=NULL;
if (direction == 1)
list = g_list_first(info->addr1);
else
@ -720,33 +743,42 @@ struct sockaddr_storage *v;
while (list)
{
v = (struct sockaddr_storage *) (list->data);
if (v->ss_family == AF_INET && vadd->ss_family == AF_INET)
v = (address *) (list->data);
if (v->type == AT_IPv4 && vadd->type == AT_IPv4)
{
v4 = (struct sockaddr_in *)(list->data);
v4add = (struct sockaddr_in *) vadd;
if (v4add->sin_addr.s_addr!=v4->sin_addr.s_addr)
v4 = (struct v4addr *)(list->data);
v4add = (struct v4addr *) vadd;
if (v4add->addr!=v4->addr)
{
list = g_list_next(list);
}
else
{
g_free(v4add);
g_free(vadd);
return info;
}
}
else if (v->ss_family == AF_INET6 && vadd->ss_family == AF_INET6)
else if (v->type == AT_IPv6 && vadd->type == AT_IPv6)
{
v6 = (struct sockaddr_in6 *)(list->data);
v6add = (struct sockaddr_in6 *) vadd;
if (v6add->sin6_addr.s6_addr!=v6->sin6_addr.s6_addr)
v6 = (struct v6addr *)(list->data);
v6add = (struct v6addr *) vadd;
if (v6add->addr!=v6->addr)
{
list = g_list_next(list);
}
else
{
g_free(v6add);
g_free(vadd);
return info;
}
}
else
{
list= g_list_next(list);
}
}
if (direction == 1)
@ -767,9 +799,9 @@ sctp_assoc_info_t *info = NULL;
sctp_error_info_t *error = NULL;
char str[200];
guint16 type, length;
struct sockaddr_in v4n;
struct sockaddr_in6 v6n;
struct sockaddr_storage *store=NULL;
struct v4addr v4n;
struct v6addr v6n;
address *store=NULL;
tsn_t *tsn=NULL;
tsn_t *sack=NULL;
guint8 *t_s_n=NULL;
@ -778,6 +810,7 @@ gboolean datachunk=FALSE;
guint32 max;
struct tsn_sort tsn_s;
sctp_allassocs_info_t *assoc_info=NULL;
assoc_info = &sctp_tapinfo_struct;
@ -785,35 +818,36 @@ struct tsn_sort tsn_s;
max =0xFFFFFFFF;
type = pinfo->src.type;
if (type == AT_IPv4)
{
v4n.sin_family = AF_INET;
v4n.sin_port = 0;
g_memmove(&(v4n.sin_addr.s_addr), pinfo->src.data, 4);
g_memmove(&(tmp_info.src), &v4n, sizeof(struct sockaddr_in));
v4n.type = AT_IPv4;
v4n.len = 4;
g_memmove(&(v4n.addr), pinfo->src.data, 4);
g_memmove(&(tmp_info.src), &v4n, sizeof(struct v4addr));
}
else if (type == AT_IPv6)
{
v6n.sin6_family=AF_INET6;
v6n.sin6_port = 0;
g_memmove(&(v6n.sin6_addr.s6_addr), pinfo->src.data, 16);
g_memmove(&(tmp_info.src), &v6n, sizeof(struct sockaddr_in6));
v6n.type=AT_IPv6;
v6n.len = 16;
g_memmove(&(v6n.addr), pinfo->src.data, 16);
g_memmove(&(tmp_info.src), &v6n, sizeof(struct v6addr));
}
type = pinfo->dst.type;
if (type == AT_IPv4)
{
v4n.sin_family=AF_INET;
v4n.sin_port = 0;
g_memmove(&(v4n.sin_addr.s_addr), pinfo->dst.data, 4);
g_memmove(&(tmp_info.dst), &v4n, sizeof(struct sockaddr_in));
v4n.type=AT_IPv4;
v4n.len = 4;
g_memmove(&(v4n.addr), pinfo->dst.data, 4);
g_memmove(&(tmp_info.dst), &v4n, sizeof(struct v4addr));
}
else if (type == AT_IPv6)
{
v6n.sin6_family=AF_INET6;
v6n.sin6_port = 0;
g_memmove(&(v6n.sin6_addr.s6_addr), pinfo->dst.data, 16);
g_memmove(&(tmp_info.dst), &v6n, sizeof(struct sockaddr_in6));
v6n.type=AT_IPv6;
v6n.len = 16;
g_memmove(&(v6n.addr), pinfo->dst.data, 16);
g_memmove(&(tmp_info.dst), &v6n, sizeof(struct v6addr));
}
tmp_info.port1 = pinfo->srcport;
@ -878,6 +912,7 @@ struct tsn_sort tsn_s;
tsn = g_malloc(sizeof(tsn_t));
sack = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
sack->tsns = NULL;
tsn->src = tmp_info.src;
tsn->dst = tmp_info.dst;
tsn->secs = (guint32)pinfo->fd->rel_secs;
@ -914,28 +949,29 @@ struct tsn_sort tsn_s;
info->outstream1=tvb_get_ntohs(sctp_info->tvb[0],INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_OFFSET);
for (chunk_number = 1; chunk_number < sctp_info->number_of_tvbs; chunk_number++)
{
type = tvb_get_ntohs(sctp_info->tvb[chunk_number],0);
type = tvb_get_ntohs(sctp_info->tvb[chunk_number],0);
if (type == IPV4ADDRESS_PARAMETER_ID)
{
v4n.sin_family=AF_INET;
v4n.sin_port = 0;
ip=tvb_get_ntohl(sctp_info->tvb[chunk_number],4);
{
v4n.type=AT_IPv4;
v4n.len = 4;
ip=tvb_get_ntohl(sctp_info->tvb[chunk_number],IPV4_ADDRESS_OFFSET);
ip=htonl(ip);
v4n.sin_addr.s_addr=ip;
store = g_malloc(sizeof(struct sockaddr_storage));
g_memmove(store,&v4n, sizeof(struct sockaddr_in));
v4n.addr=ip;
store = g_malloc(24);
g_memmove(store,&v4n, sizeof(struct v4addr));
info = add_address(store, info, 1);
}
else if (type == IPV6ADDRESS_PARAMETER_ID)
{
v6n.sin6_family=AF_INET6;
v6n.sin6_port = 0;
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)&(v6n.sin6_addr.s6_addr),IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH);
store = g_malloc(sizeof(struct sockaddr_storage));
g_memmove(store, &v6n, sizeof(struct sockaddr_in6));
v6n.type=AT_IPv6;
v6n.len = 0;
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)&(v6n.addr),IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH);
store = g_malloc(24);
g_memmove(store, &v6n, sizeof(struct v6addr));
info = add_address(store, info, 1);
}
}
}
if (tvb_get_guint8(sctp_info->tvb[0],0)==SCTP_INIT_CHUNK_ID)
{
info->init=TRUE;
@ -947,11 +983,22 @@ struct tsn_sort tsn_s;
}
}
else
{
if (((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_INIT_CHUNK_ID) &&
((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_INIT_ACK_CHUNK_ID) &&
((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_DATA_CHUNK_ID) &&
((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_SACK_CHUNK_ID))
{
tsn = g_malloc(sizeof(tsn_t));
sack = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
sack->tsns = NULL;
}
for (chunk_number = 0; chunk_number < sctp_info->number_of_tvbs; chunk_number++)
{
if (tvb_get_guint8(sctp_info->tvb[chunk_number],0)==SCTP_DATA_CHUNK_ID)
{
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks++;
info->n_data_bytes+=length;
info->outstream1=tvb_get_ntohs((sctp_info->tvb)[chunk_number], DATA_CHUNK_STREAM_ID_OFFSET)+1;
@ -960,7 +1007,7 @@ struct tsn_sort tsn_s;
info->min_tsn1=tsnumber;
if (tsnumber>info->max_tsn1)
{
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks_ep1++;
info->n_data_bytes_ep1+=length;
info->max_tsn1=tsnumber;
@ -974,7 +1021,7 @@ struct tsn_sort tsn_s;
tsn_s.secs=tsn->secs;
tsn_s.usecs=tsn->usecs;
tsn_s.offset=0;
tsn_s.length=length-16;
tsn_s.length=length-DATA_CHUNK_HEADER_LENGTH;
info->sort_tsn1=g_array_append_val(info->sort_tsn1, tsn_s);
info->n_array_tsn1++;
}
@ -1003,13 +1050,14 @@ struct tsn_sort tsn_s;
}
}
}
if (info->verification_tag1!=0 || info->verification_tag2!=0)
{
store = g_malloc(sizeof (struct sockaddr_storage));
g_memmove(store,&(tmp_info.src),sizeof(struct sockaddr_storage));
store = g_malloc(sizeof (address));
g_memmove(store,&(tmp_info.src),sizeof(address));
info = add_address(store, info, 1);
store = g_malloc(sizeof (struct sockaddr_storage));
g_memmove(store,&(tmp_info.dst),sizeof(struct sockaddr_storage));
store = g_malloc(sizeof (address));
g_memmove(store,&(tmp_info.dst),sizeof(address));
info = add_address(store, info, 2);
info->frame_numbers=g_list_prepend(info->frame_numbers,&(pinfo->fd->num));
if (datachunk==TRUE)
@ -1044,6 +1092,7 @@ struct tsn_sort tsn_s;
tsn = g_malloc(sizeof(tsn_t));
sack = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
sack->tsns = NULL;
tsn->src = tmp_info.src;
tsn->dst = tmp_info.dst;
tsn->secs = (guint32)pinfo->fd->rel_secs;
@ -1074,24 +1123,24 @@ struct tsn_sort tsn_s;
if (info->direction==1)
{
store = g_malloc(sizeof (struct sockaddr_storage));
g_memmove(store,&(tmp_info.src),sizeof(struct sockaddr_storage));
store = g_malloc(sizeof (address));
g_memmove(store,&(tmp_info.src),sizeof(address));
info = add_address(store, info, 1);
store = g_malloc(sizeof (struct sockaddr_storage));
g_memmove(store,&(tmp_info.dst),sizeof(struct sockaddr_storage));
store = g_malloc(sizeof (address));
g_memmove(store,&(tmp_info.dst),sizeof(address));
info = add_address(store, info, 2);
}
else if (info->direction==2)
{
store = g_malloc(sizeof (struct sockaddr_storage));
g_memmove(store,&(tmp_info.src),sizeof(struct sockaddr_storage));
store = g_malloc(sizeof (address));
g_memmove(store,&(tmp_info.src),sizeof(address));
info = add_address(store, info, 2);
store = g_malloc(sizeof (struct sockaddr_storage));
g_memmove(store,&(tmp_info.dst),sizeof(struct sockaddr_storage));
store = g_malloc(sizeof (address));
g_memmove(store,&(tmp_info.dst),sizeof(address));
info = add_address(store, info, 1);
}
if ((tvb_get_guint8(sctp_info->tvb[0],0))==SCTP_INIT_ACK_CHUNK_ID)
{
{
tsnumber = tvb_get_ntohl((sctp_info->tvb)[chunk_number], INIT_CHUNK_INITIAL_TSN_OFFSET);
if (info->direction==2)
@ -1117,66 +1166,75 @@ struct tsn_sort tsn_s;
info->tsn1 = g_list_prepend(info->tsn1, tsn);
}
for (chunk_number = 1; chunk_number < sctp_info->number_of_tvbs; chunk_number++)
{
{
type = tvb_get_ntohs(sctp_info->tvb[chunk_number],0);
if (type == IPV4ADDRESS_PARAMETER_ID)
{
v4n.sin_family=AF_INET;
v4n.sin_port = 0;
ip=tvb_get_ntohl(sctp_info->tvb[chunk_number],4);
if (type == IPV4ADDRESS_PARAMETER_ID)
{
v4n.type=AT_IPv4;
v4n.len = 4;
ip=tvb_get_ntohl(sctp_info->tvb[chunk_number],IPV4_ADDRESS_OFFSET);
ip=htonl(ip);
v4n.sin_addr.s_addr=ip;
store = g_malloc(sizeof(struct sockaddr_storage));
g_memmove(store, &v4n, sizeof(struct sockaddr_in));
v4n.addr=ip;
store = g_malloc(24);
g_memmove(store,&v4n, sizeof(struct v4addr));
info = add_address(store, info, info->direction);
}
else if (type == IPV6ADDRESS_PARAMETER_ID)
{
v6n.sin6_family=AF_INET6;
v6n.sin6_port = 0;
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)&(v6n.sin6_addr.s6_addr),IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH);
store = g_malloc(sizeof(struct sockaddr_storage));
g_memmove(store, &v6n, sizeof(struct sockaddr_in6));
v6n.type=AT_IPv6;
v6n.len = 0;
tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)&(v6n.addr),IPV6_ADDRESS_OFFSET, IPV6_ADDRESS_LENGTH);
store = g_malloc(24);
g_memmove(store, &v6n, sizeof(struct v6addr));
info = add_address(store, info, info->direction);
}
}
}
}
info->initack=TRUE;
}
else
{
if (((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_INIT_ACK_CHUNK_ID) &&
((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_DATA_CHUNK_ID) &&
((tvb_get_guint8(sctp_info->tvb[0],0))!=SCTP_SACK_CHUNK_ID))
{
sack = g_malloc(sizeof(tsn_t));
sack->tsns = NULL;
tsn = g_malloc(sizeof(tsn_t));
tsn->tsns = NULL;
}
for (chunk_number = 0; chunk_number < sctp_info->number_of_tvbs; chunk_number++)
{
if ((tvb_get_guint8(sctp_info->tvb[0],0))==SCTP_DATA_CHUNK_ID)
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);
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);
datachunk = TRUE;
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks++;
info->n_data_bytes+=length;
tsn_s.tsnumber=tsnumber;
tsn_s.secs=tsn->secs;
tsn_s.usecs=tsn->usecs;
tsn_s.offset=0;
tsn_s.length=length-16;
tsn_s.length=length;
if (info->direction == 1)
{
if(tsnumber<info->min_tsn1)
info->min_tsn1 = tsnumber;
if ((info->init==TRUE || (info->initack==TRUE && info->initack_dir==1))&& tsnumber==info->min_tsn1 && tsnumber<=info->max_tsn1)
if ((info->init==TRUE || (info->initack==TRUE && info->initack_dir==1))&& tsnumber>=info->min_tsn1 && tsnumber<=info->max_tsn1)
{
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks_ep1++;
info->n_data_bytes_ep1+=length;
}
if(tsnumber>info->max_tsn1)
{
info->max_tsn1 = tsnumber;
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks_ep1++;
info->n_data_bytes_ep1+=length;
}
@ -1194,16 +1252,16 @@ struct tsn_sort tsn_s;
if(tsnumber<info->min_tsn2)
info->min_tsn2 = tsnumber;
if ((info->initack==TRUE && info->initack_dir==2)&& tsnumber==info->min_tsn2 && tsnumber<=info->max_tsn2)
if ((info->initack==TRUE && info->initack_dir==2)&& tsnumber>=info->min_tsn2 && tsnumber<=info->max_tsn2)
{
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks_ep2++;
info->n_data_bytes_ep2+=length;
}
if(tsnumber>info->max_tsn2)
{
info->max_tsn2 = tsnumber;
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET);
length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH;
info->n_data_chunks_ep2++;
info->n_data_bytes_ep2+=length;
}

View File

@ -23,6 +23,12 @@
*/
#include <epan/dissectors/packet-sctp.h>
#include <epan/address.h>
#ifndef WIN32
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#endif
#define SCTP_DATA_CHUNK_ID 0
#define SCTP_INIT_CHUNK_ID 1
@ -58,26 +64,29 @@
#define DATA_CHUNK_TSN_LENGTH 4
#define DATA_CHUNK_TSN_OFFSET (CHUNK_VALUE_OFFSET + 0)
#define DATA_CHUNK_STREAM_ID_OFFSET (DATA_CHUNK_TSN_OFFSET + DATA_CHUNK_TSN_LENGTH)
#define DATA_CHUNK_STREAM_ID_LENGTH 2
#define DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH 2
#define DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH 4
#define DATA_CHUNK_HEADER_LENGTH (CHUNK_HEADER_LENGTH + \
DATA_CHUNK_TSN_LENGTH + \
DATA_CHUNK_STREAM_ID_LENGTH + \
DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH + \
DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH)
typedef struct _v4address {
address_type type;
int len;
guint32 data;
} v4address;
typedef struct _tsn {
guint32 frame_number;
guint32 secs; /* Absolute seconds */
guint32 usecs;
struct sockaddr_storage src;
struct sockaddr_storage dst;
address src;
address dst;
GList *tsns;
} tsn_t;
typedef struct _sctp_tmp_info {
struct sockaddr_storage src;
struct sockaddr_storage dst;
address src;
address dst;
guint16 port1;
guint16 port2;
guint32 verification_tag1;
@ -107,9 +116,8 @@ struct tsn_sort{
typedef struct _sctp_assoc_info {
/* guint16 assoc_id; */
struct sockaddr_storage src;
struct sockaddr_storage dst;
address src;
address dst;
guint16 port1;
guint16 port2;
guint32 verification_tag1;
@ -187,7 +195,6 @@ GList* children;
} sctp_allassocs_info_t;
/* Data structures for sctp_assoc_analyse */
struct notes {
GtkWidget *checktype;
@ -224,7 +231,6 @@ struct sctp_analyse {
guint16 num_children;
};
/* Data Structures for sctp_graph_dlg */
typedef struct _sctp_graph_t {
gboolean needs_redraw;