summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorruengeler <ruengeler@wireshark.org>2015-10-05 15:55:40 +0200
committerMichael Tüxen <tuexen@wireshark.org>2015-10-05 17:38:08 +0000
commitd52322efb3ab782871312950876803334ec018b9 (patch)
treea9049aa52e49c31f8d346ae2bcfe842694c2f776 /ui
parenta24eeb931ea90b1fe63019c4e07065089e236351 (diff)
downloadwireshark-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.c12
-rw-r--r--ui/gtk/sctp_chunk_stat_dlg.c26
-rw-r--r--ui/gtk/sctp_graph_dlg.c4
-rw-r--r--ui/qt/sctp_graph_arwnd_dialog.cpp4
-rw-r--r--ui/qt/sctp_graph_byte_dialog.cpp6
-rw-r--r--ui/qt/sctp_graph_dialog.cpp14
-rw-r--r--ui/tap-sctp-analysis.c44
-rw-r--r--ui/tap-sctp-analysis.h26
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" },