diff options
author | ruengeler <ruengeler@wireshark.org> | 2015-10-05 15:55:40 +0200 |
---|---|---|
committer | Michael Tüxen <tuexen@wireshark.org> | 2015-10-05 17:38:08 +0000 |
commit | d52322efb3ab782871312950876803334ec018b9 (patch) | |
tree | a9049aa52e49c31f8d346ae2bcfe842694c2f776 /ui | |
parent | a24eeb931ea90b1fe63019c4e07065089e236351 (diff) | |
download | wireshark-d52322efb3ab782871312950876803334ec018b9.tar.gz |
SCTP I-DATA support
Change-Id: I459942b9e3287d500dda517568252d4cb56d3216
Reviewed-on: https://code.wireshark.org/review/10802
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Petri-Dish: Michael Tüxen <tuexen@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michael Tüxen <tuexen@wireshark.org>
Diffstat (limited to 'ui')
-rw-r--r-- | ui/gtk/sctp_chunk_stat.c | 12 | ||||
-rw-r--r-- | ui/gtk/sctp_chunk_stat_dlg.c | 26 | ||||
-rw-r--r-- | ui/gtk/sctp_graph_dlg.c | 4 | ||||
-rw-r--r-- | ui/qt/sctp_graph_arwnd_dialog.cpp | 4 | ||||
-rw-r--r-- | ui/qt/sctp_graph_byte_dialog.cpp | 6 | ||||
-rw-r--r-- | ui/qt/sctp_graph_dialog.cpp | 14 | ||||
-rw-r--r-- | ui/tap-sctp-analysis.c | 44 | ||||
-rw-r--r-- | ui/tap-sctp-analysis.h | 26 |
8 files changed, 107 insertions, 29 deletions
diff --git a/ui/gtk/sctp_chunk_stat.c b/ui/gtk/sctp_chunk_stat.c index e4266e0df2..8b85c90ed1 100644 --- a/ui/gtk/sctp_chunk_stat.c +++ b/ui/gtk/sctp_chunk_stat.c @@ -207,11 +207,12 @@ sctpstat_draw(void *phs) 12, tmp->chunk_count[SCTP_ABORT_CHUNK_ID], 13, tmp->chunk_count[SCTP_ERROR_CHUNK_ID], 14, tmp->chunk_count[SCTP_NR_SACK_CHUNK_ID], - 15, tmp->chunk_count[SCTP_ASCONF_ACK_CHUNK_ID], - 16, tmp->chunk_count[SCTP_PKTDROP_CHUNK_ID], - 17, tmp->chunk_count[SCTP_FORWARD_TSN_CHUNK_ID], - 18, tmp->chunk_count[SCTP_ASCONF_CHUNK_ID], - 19, tmp->chunk_count[OTHER_CHUNKS_INDEX], + 15, tmp->chunk_count[SCTP_I_DATA_CHUNK_ID], + 16, tmp->chunk_count[SCTP_ASCONF_ACK_CHUNK_ID], + 17, tmp->chunk_count[SCTP_PKTDROP_CHUNK_ID], + 18, tmp->chunk_count[SCTP_FORWARD_TSN_CHUNK_ID], + 19, tmp->chunk_count[SCTP_ASCONF_CHUNK_ID], + 20, tmp->chunk_count[OTHER_CHUNKS_INDEX], -1 ); wmem_free(NULL, src_addr); @@ -250,6 +251,7 @@ static const stat_column titles[]={ {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ABORT" }, {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ERROR" }, {G_TYPE_UINT, TAP_ALIGN_RIGHT, "NR-SACK" }, + {G_TYPE_UINT, TAP_ALIGN_RIGHT, "I-DATA" }, {G_TYPE_UINT, TAP_ALIGN_RIGHT, "ASCONF-ACK" }, {G_TYPE_UINT, TAP_ALIGN_RIGHT, "PKTDROP" }, {G_TYPE_UINT, TAP_ALIGN_RIGHT, "FORWARD-TSN" }, diff --git a/ui/gtk/sctp_chunk_stat_dlg.c b/ui/gtk/sctp_chunk_stat_dlg.c index 7308ee01bf..9cdbad045b 100644 --- a/ui/gtk/sctp_chunk_stat_dlg.c +++ b/ui/gtk/sctp_chunk_stat_dlg.c @@ -56,6 +56,7 @@ enum chunk_types { SHUT_COMPLETE = 14, AUTH = 15, NR_SACK = 16, + I_DATA = 0x40, ASCONF_ACK = 0x80, PKTDROP = 0x81, FORWARD_TSN = 0xC0, @@ -81,6 +82,7 @@ enum SHUT_COMPLETE_COLUMN, AUTH_COLUMN, NR_SACK_COLUMN, + I_DATA_COLUMN, ASCONF_ACK_COLUMN, PKTDROP_COLUMN, FORWARD_TSN_COLUMN, @@ -122,6 +124,7 @@ GtkWidget* create_list(void) G_TYPE_INT, /* SHUT_COMPLETE */ G_TYPE_INT, /* AUTH */ G_TYPE_INT, /* NR_SACK */ + G_TYPE_INT, /* I_DATA */ G_TYPE_INT, /* ASCONF_ACK */ G_TYPE_INT, /* PKTDROP */ G_TYPE_INT, /* FORWARD_TSN */ @@ -351,6 +354,17 @@ GtkWidget* create_list(void) /* 19:th column... */ renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes ("I-DATA", renderer, + "text", I_DATA_COLUMN, + NULL); + gtk_tree_view_column_set_sort_column_id(column, I_DATA_COLUMN); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_min_width(column, 100); + gtk_tree_view_append_column (list_view, column); + + /* 20:th column... */ + renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("ASCONF-ACK", renderer, "text", ASCONF_ACK_COLUMN, NULL); @@ -360,7 +374,7 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_min_width(column, 120); gtk_tree_view_append_column (list_view, column); - /* 20:th column... */ + /* 21:th column... */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("PKTDROP", renderer, "text", PKTDROP_COLUMN, @@ -371,7 +385,7 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_min_width(column, 100); gtk_tree_view_append_column (list_view, column); - /* 21:st column... */ + /* 22:st column... */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("FORWARD-TSN", renderer, "text", FORWARD_TSN_COLUMN, @@ -382,7 +396,7 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_min_width(column, 140); gtk_tree_view_append_column (list_view, column); - /* 22:nd column... */ + /* 23:nd column... */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("ASCONF", renderer, "text", ASCONF_COLUMN, @@ -393,7 +407,7 @@ GtkWidget* create_list(void) gtk_tree_view_column_set_min_width(column, 90); gtk_tree_view_append_column (list_view, column); - /* 23:rd column... */ + /* 24:rd column... */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Others", renderer, "text", OTHERS_COLUMN, @@ -440,6 +454,7 @@ chunk_name(int type) CASE(SHUT_COMPLETE); CASE(AUTH); CASE(NR_SACK); + CASE(I_DATA); CASE(ASCONF_ACK); CASE(PKTDROP); CASE(FORWARD_TSN); @@ -494,7 +509,7 @@ add_to_clist(sctp_addr_chunk* sac) } gtk_list_store_insert_with_values( list_store , &iter, G_MAXINT, - IP_ADDR_COLUMN, field[0], + IP_ADDR_COLUMN, field, DATA_COLUMN, sac->addr_count[SCTP_DATA_CHUNK_ID], INIT_COLUMN, sac->addr_count[SCTP_INIT_CHUNK_ID], INIT_ACK_COLUMN, sac->addr_count[SCTP_INIT_ACK_CHUNK_ID], @@ -512,6 +527,7 @@ add_to_clist(sctp_addr_chunk* sac) SHUT_COMPLETE_COLUMN, sac->addr_count[SCTP_SHUTDOWN_COMPLETE_CHUNK_ID], AUTH_COLUMN, sac->addr_count[SCTP_AUTH_CHUNK_ID], NR_SACK_COLUMN, sac->addr_count[SCTP_NR_SACK_CHUNK_ID], + I_DATA_COLUMN, sac->addr_count[SCTP_I_DATA_CHUNK_ID], ASCONF_ACK_COLUMN, sac->addr_count[SCTP_ASCONF_ACK_CHUNK_ID], PKTDROP_COLUMN, sac->addr_count[SCTP_PKTDROP_CHUNK_ID], FORWARD_TSN_COLUMN, sac->addr_count[SCTP_FORWARD_TSN_CHUNK_ID], diff --git a/ui/gtk/sctp_graph_dlg.c b/ui/gtk/sctp_graph_dlg.c index f702a68491..0811c3671c 100644 --- a/ui/gtk/sctp_graph_dlg.c +++ b/ui/gtk/sctp_graph_dlg.c @@ -569,7 +569,7 @@ draw_tsn_graph(struct sctp_udata *u_data) while (tlist) { type = ((struct chunk_header *)tlist->data)->type; - if (type == SCTP_DATA_CHUNK_ID || type == SCTP_FORWARD_TSN_CHUNK_ID) + if (type == SCTP_DATA_CHUNK_ID || type == SCTP_I_DATA_CHUNK_ID || type == SCTP_FORWARD_TSN_CHUNK_ID) tsnumber = g_ntohl(((struct data_chunk_header *)tlist->data)->tsn); if (tsnumber >= min_tsn && tsnumber <= max_tsn && tsn->secs >= min_secs) { @@ -589,7 +589,7 @@ draw_tsn_graph(struct sctp_udata *u_data) #else cr = gdk_cairo_create (u_data->io->pixmap); #endif - if (type == SCTP_DATA_CHUNK_ID) + if ((type == SCTP_DATA_CHUNK_ID) || (type == SCTP_I_DATA_CHUNK_ID)) gdk_cairo_set_source_rgba (cr, &black_color); else gdk_cairo_set_source_rgba (cr, &pink_color); diff --git a/ui/qt/sctp_graph_arwnd_dialog.cpp b/ui/qt/sctp_graph_arwnd_dialog.cpp index abaeb5832a..a36e5bdfbd 100644 --- a/ui/qt/sctp_graph_arwnd_dialog.cpp +++ b/ui/qt/sctp_graph_arwnd_dialog.cpp @@ -76,10 +76,10 @@ void SCTPGraphArwndDialog::drawArwndGraph() if (direction == 1) { listSACK = g_list_last(selected_assoc->sack1); - startArwnd = selected_assoc->arwnd1; + startArwnd = selected_assoc->arwnd2; } else { listSACK = g_list_last(selected_assoc->sack2); - startArwnd = selected_assoc->arwnd2; + startArwnd = selected_assoc->arwnd1; } while (listSACK) { tsn = (tsn_t*) (listSACK->data); diff --git a/ui/qt/sctp_graph_byte_dialog.cpp b/ui/qt/sctp_graph_byte_dialog.cpp index 2d24ba73d2..4af5a847e2 100644 --- a/ui/qt/sctp_graph_byte_dialog.cpp +++ b/ui/qt/sctp_graph_byte_dialog.cpp @@ -90,8 +90,12 @@ void SCTPGraphByteDialog::drawBytesGraph() while (tlist) { type = ((struct chunk_header *)tlist->data)->type; - if (type == SCTP_DATA_CHUNK_ID) { + if (type == SCTP_DATA_CHUNK_ID || type == SCTP_I_DATA_CHUNK_ID) { length = g_ntohs(((struct data_chunk_header *)tlist->data)->length); + if (type == SCTP_DATA_CHUNK_ID) + length -= DATA_CHUNK_HEADER_LENGTH; + else + length -= I_DATA_CHUNK_HEADER_LENGTH; sumBytes += length; yb.append(sumBytes); xb.append(tsn->secs + tsn->usecs/1000000.0); diff --git a/ui/qt/sctp_graph_dialog.cpp b/ui/qt/sctp_graph_dialog.cpp index 27cc4bb0c8..d0efcf5f57 100644 --- a/ui/qt/sctp_graph_dialog.cpp +++ b/ui/qt/sctp_graph_dialog.cpp @@ -86,8 +86,8 @@ void SCTPGraphDialog::drawNRSACKGraph() list = g_list_last(selected_assoc->sack1); min_tsn = selected_assoc->min_tsn1; } else { - list = g_list_last(selected_assoc->sack1); - min_tsn = selected_assoc->min_tsn1; + list = g_list_last(selected_assoc->sack2); + min_tsn = selected_assoc->min_tsn2; } while (list) { sack = (tsn_t*) (list->data); @@ -280,7 +280,7 @@ void SCTPGraphDialog::drawTSNGraph() while (tlist) { type = ((struct chunk_header *)tlist->data)->type; - if (type == SCTP_DATA_CHUNK_ID || type == SCTP_FORWARD_TSN_CHUNK_ID) { + if (type == SCTP_DATA_CHUNK_ID || type == SCTP_I_DATA_CHUNK_ID || type == SCTP_FORWARD_TSN_CHUNK_ID) { tsnumber = g_ntohl(((struct data_chunk_header *)tlist->data)->tsn); yt.append(tsnumber); xt.append(tsn->secs + tsn->usecs/1000000.0); @@ -314,6 +314,7 @@ void SCTPGraphDialog::drawTSNGraph() void SCTPGraphDialog::drawGraph(int which) { guint32 maxTSN, minTSN; + gint64 minBound; gIsSackChunkPresent = false; gIsNRSackChunkPresent = false; @@ -348,7 +349,12 @@ void SCTPGraphDialog::drawGraph(int which) connect(ui->sctpPlot, SIGNAL(plottableClick(QCPAbstractPlottable*,QMouseEvent*)), this, SLOT(graphClicked(QCPAbstractPlottable*, QMouseEvent*))); // set axes ranges, so we see all data: QCPRange myXRange(selected_assoc->min_secs, (selected_assoc->max_secs+1)); - QCPRange myYRange(minTSN, maxTSN); + if (maxTSN - minTSN < 5) { + minBound = 0; + } else { + minBound = minTSN; + } + QCPRange myYRange(minBound, maxTSN); ui->sctpPlot->xAxis->setRange(myXRange); ui->sctpPlot->yAxis->setRange(myYRange); ui->sctpPlot->replot(); diff --git a/ui/tap-sctp-analysis.c b/ui/tap-sctp-analysis.c index 6652fe705e..6e3db28f4c 100644 --- a/ui/tap-sctp-analysis.c +++ b/ui/tap-sctp-analysis.c @@ -478,6 +478,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi 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_I_DATA_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_NR_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_FORWARD_TSN_CHUNK_ID)) @@ -507,6 +508,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi sack->secs=tsn->secs = (guint32)pinfo->rel_ts.secs; sack->usecs=tsn->usecs = (guint32)pinfo->rel_ts.nsecs/1000; if (((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_DATA_CHUNK_ID) || + ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_I_DATA_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_NR_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_FORWARD_TSN_CHUNK_ID)) @@ -583,6 +585,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi 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_I_DATA_CHUNK_ID) && ((tvb_get_guint8(sctp_info->tvb[0],0)) != SCTP_SACK_CHUNK_ID) && ((tvb_get_guint8(sctp_info->tvb[0],0)) != SCTP_NR_SACK_CHUNK_ID) && ((tvb_get_guint8(sctp_info->tvb[0],0)) != SCTP_FORWARD_TSN_CHUNK_ID)) @@ -604,10 +607,15 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi info->ep1_chunk_count[idx]++; info = add_chunk_count(&tmp_info.src, info, 1, idx); - if ((tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_DATA_CHUNK_ID)) + if ((tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_DATA_CHUNK_ID) || + (tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_I_DATA_CHUNK_ID)) { datachunk = TRUE; - length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH; + 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) - DATA_CHUNK_HEADER_LENGTH; + } else { + length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET) - I_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; @@ -655,7 +663,11 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi tsn_s->offset = 0; tsn_s->framenumber = framenumber; if (datachunk) - tsn_s->length = length-DATA_CHUNK_HEADER_LENGTH; + if (tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_DATA_CHUNK_ID) { + tsn_s->length = length - DATA_CHUNK_HEADER_LENGTH; + } else { + tsn_s->length = length - I_DATA_CHUNK_HEADER_LENGTH; + } else tsn_s->length = length; if (tsn->secs < info->min_secs) @@ -781,6 +793,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi 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_I_DATA_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_NR_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_FORWARD_TSN_CHUNK_ID)) @@ -811,6 +824,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi sack->secs=tsn->secs = (guint32)pinfo->rel_ts.secs; sack->usecs=tsn->usecs = (guint32)pinfo->rel_ts.nsecs/1000; if (((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_DATA_CHUNK_ID) || + ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_I_DATA_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_NR_SACK_CHUNK_ID) || ((tvb_get_guint8(sctp_info->tvb[0],0)) == SCTP_FORWARD_TSN_CHUNK_ID)) @@ -932,6 +946,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi { 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_I_DATA_CHUNK_ID) && ((tvb_get_guint8(sctp_info->tvb[0],0)) != SCTP_SACK_CHUNK_ID) && ((tvb_get_guint8(sctp_info->tvb[0],0)) != SCTP_NR_SACK_CHUNK_ID) && ((tvb_get_guint8(sctp_info->tvb[0],0)) != SCTP_FORWARD_TSN_CHUNK_ID)) @@ -956,9 +971,10 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi info->ep2_chunk_count[idx]++; info = add_chunk_count(&tmp_info.src, info,info->direction, idx); - if (((tvb_get_guint8(sctp_info->tvb[chunk_number],0)) == SCTP_DATA_CHUNK_ID)) + if ((tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_DATA_CHUNK_ID) || + (tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_I_DATA_CHUNK_ID)) datachunk = TRUE; - if (((tvb_get_guint8(sctp_info->tvb[chunk_number],0)) == SCTP_FORWARD_TSN_CHUNK_ID)) + if (tvb_get_guint8(sctp_info->tvb[chunk_number],0) == SCTP_FORWARD_TSN_CHUNK_ID) forwardchunk = TRUE; if ((datachunk || forwardchunk) && tsn != NULL) { @@ -969,7 +985,11 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi { t_s_n = (guint8 *)g_malloc(16); tvb_memcpy(sctp_info->tvb[chunk_number], (guint8 *)(t_s_n),0, 16); - length=tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH; + 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)-DATA_CHUNK_HEADER_LENGTH; + } else { + length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET) - I_DATA_CHUNK_HEADER_LENGTH; + } info->n_data_chunks++; info->n_data_bytes+=length; } @@ -1056,7 +1076,11 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi { if (datachunk) { - length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH; + 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) - DATA_CHUNK_HEADER_LENGTH; + } else { + length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET) - I_DATA_CHUNK_HEADER_LENGTH; + } info->n_data_chunks_ep2++; info->n_data_bytes_ep2+=length; } @@ -1070,7 +1094,11 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi info->max_tsn2 = tsnumber; if (datachunk) { - length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET)-DATA_CHUNK_HEADER_LENGTH; + 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) - DATA_CHUNK_HEADER_LENGTH; + } else { + length = tvb_get_ntohs(sctp_info->tvb[chunk_number], CHUNK_LENGTH_OFFSET) - I_DATA_CHUNK_HEADER_LENGTH; + } info->n_data_chunks_ep2++; info->n_data_bytes_ep2+=length; } diff --git a/ui/tap-sctp-analysis.h b/ui/tap-sctp-analysis.h index b7fabd19db..18f0b86886 100644 --- a/ui/tap-sctp-analysis.h +++ b/ui/tap-sctp-analysis.h @@ -56,6 +56,7 @@ extern "C" { #define SCTP_SHUTDOWN_COMPLETE_CHUNK_ID 14 #define SCTP_AUTH_CHUNK_ID 15 #define SCTP_NR_SACK_CHUNK_ID 16 +#define SCTP_I_DATA_CHUNK_ID 0x40 #define SCTP_ASCONF_ACK_CHUNK_ID 0x80 #define SCTP_PKTDROP_CHUNK_ID 0x81 #define SCTP_RE_CONFIG_CHUNK_ID 0x82 @@ -65,7 +66,7 @@ extern "C" { #define SCTP_IETF_EXT 0xFF #define IS_SCTP_CHUNK_TYPE(t) \ - (((t) <= 16) || ((t) == 0xC0) || ((t) == 0xC1) || ((t) == 0x80) || ((t) == 0x81)) + (((t) <= 16) || ((t) == 0x40) || ((t) == 0xC0) || ((t) == 0xC1) || ((t) == 0x80) || ((t) == 0x81)) #define CHUNK_TYPE_LENGTH 1 #define CHUNK_FLAGS_LENGTH 1 @@ -99,11 +100,31 @@ extern "C" { #define DATA_CHUNK_STREAM_ID_LENGTH 2 #define DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH 2 #define DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH 4 +#define I_DATA_CHUNK_RESERVED_LENGTH 2 +#define I_DATA_CHUNK_MID_LENGTH 4 +#define I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH 4 +#define I_DATA_CHUNK_FSN_LENGTH 4 +#define I_DATA_CHUNK_RESERVED_OFFSET (DATA_CHUNK_STREAM_ID_OFFSET + \ + DATA_CHUNK_STREAM_ID_LENGTH) +#define I_DATA_CHUNK_MID_OFFSET (I_DATA_CHUNK_RESERVED_OFFSET + \ + I_DATA_CHUNK_RESERVED_LENGTH) +#define I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_OFFSET (I_DATA_CHUNK_MID_OFFSET + \ + I_DATA_CHUNK_MID_LENGTH) +#define I_DATA_CHUNK_FSN_OFFSET (I_DATA_CHUNK_MID_OFFSET + \ + I_DATA_CHUNK_MID_LENGTH) +#define I_DATA_CHUNK_PAYLOAD_OFFSET (I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_OFFSET + \ + I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH) #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) +#define I_DATA_CHUNK_HEADER_LENGTH (CHUNK_HEADER_LENGTH + \ + DATA_CHUNK_TSN_LENGTH + \ + DATA_CHUNK_STREAM_ID_LENGTH + \ + I_DATA_CHUNK_RESERVED_LENGTH + \ + I_DATA_CHUNK_MID_LENGTH +\ + I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH) #define MAX_ADDRESS_LEN 47 #define SCTP_ABORT_CHUNK_T_BIT 0x01 @@ -159,7 +180,8 @@ static const value_string chunk_type_values[] = { { SCTP_CWR_CHUNK_ID, "CWR" }, { SCTP_SHUTDOWN_COMPLETE_CHUNK_ID, "SHUTDOWN_COMPLETE" }, { SCTP_AUTH_CHUNK_ID, "AUTH" }, - { SCTP_NR_SACK_CHUNK_ID, "NR-SACK" }, + { SCTP_NR_SACK_CHUNK_ID, "NR_SACK" }, + { SCTP_I_DATA_CHUNK_ID, "I_DATA" }, { SCTP_ASCONF_ACK_CHUNK_ID, "ASCONF_ACK" }, { SCTP_PKTDROP_CHUNK_ID, "PKTDROP" }, { SCTP_RE_CONFIG_CHUNK_ID, "RE_CONFIG" }, |