aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorruengeler <ruengeler@wireshark.org>2016-10-19 17:10:53 +0200
committerAlexis La Goutte <alexis.lagoutte@gmail.com>2016-10-25 16:24:51 +0000
commitc63f89515985a8db0aa8a500b1832474619090aa (patch)
tree7072673a37c2c5f5a44ac88138ff3ffd84fbe1d7
parentae88dbcc2a990218549e06e143908eed1223ad8a (diff)
SCTP: find right assoc id
Change-Id: I107b7f4c585ef5e080d6473a37b3db9a97f12365 Reviewed-on: https://code.wireshark.org/review/18325 Reviewed-by: Jaap Keuter <jaap.keuter@xs4all.nl> Petri-Dish: Jaap Keuter <jaap.keuter@xs4all.nl> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com>
-rw-r--r--epan/dissectors/packet-sctp.c93
-rw-r--r--ui/tap-sctp-analysis.c13
-rw-r--r--ui/tap-sctp-analysis.h2
3 files changed, 67 insertions, 41 deletions
diff --git a/epan/dissectors/packet-sctp.c b/epan/dissectors/packet-sctp.c
index dbc5af532b..22af4ca75b 100644
--- a/epan/dissectors/packet-sctp.c
+++ b/epan/dissectors/packet-sctp.c
@@ -660,55 +660,78 @@ static gint sctp_assoc_vtag_cmp(const assoc_info_t *a, const assoc_info_t *b)
#undef RETURN_DIRECTION
static infodata_t
-find_assoc_index(assoc_info_t* tmpinfo)
+find_assoc_index(assoc_info_t* tmpinfo, gboolean visited)
{
assoc_info_t *info = NULL;
wmem_list_frame_t *elem;
gboolean cmp = FALSE;
infodata_t inf;
+ inf.assoc_index = -1;
+ inf.direction = 1;
if (assoc_info_list == NULL) {
assoc_info_list = wmem_list_new(wmem_file_scope());
}
- elem = wmem_list_head(assoc_info_list);
-
- while (elem) {
+ for (elem = wmem_list_head(assoc_info_list); elem; elem = wmem_list_frame_next(elem))
+ {
info = (assoc_info_t*) wmem_list_frame_data(elem);
- cmp = sctp_assoc_vtag_cmp(tmpinfo, info);
- if (cmp < ASSOC_NOT_FOUND) {
- switch (cmp)
- {
- case FORWARD_ADD_FORWARD_VTAG:
- case BACKWARD_ADD_FORWARD_VTAG:
- info->verification_tag1 = tmpinfo->verification_tag1;
- break;
- case BACKWARD_ADD_BACKWARD_VTAG:
- info->verification_tag2 = tmpinfo->verification_tag1;
- break;
+
+ if (!visited) {
+ cmp = sctp_assoc_vtag_cmp(tmpinfo, info);
+ if (cmp < ASSOC_NOT_FOUND) {
+ switch (cmp)
+ {
+ case FORWARD_ADD_FORWARD_VTAG:
+ case BACKWARD_ADD_FORWARD_VTAG:
+ info->verification_tag1 = tmpinfo->verification_tag1;
+ break;
+ case BACKWARD_ADD_BACKWARD_VTAG:
+ info->verification_tag2 = tmpinfo->verification_tag1;
+ break;
+ }
+ if (cmp == FORWARD_STREAM || cmp == FORWARD_ADD_FORWARD_VTAG) {
+ info->direction = 1;
+ } else {
+ info->direction = 2;
+ }
+ inf.assoc_index = info->assoc_index;
+ inf.direction = info->direction;
+ return inf;
}
- if (cmp == FORWARD_STREAM || cmp == FORWARD_ADD_FORWARD_VTAG) {
- info->direction = 1;
- } else {
- info->direction = 2;
+ } else {
+ if ((tmpinfo->initiate_tag != 0 && tmpinfo->initiate_tag == info->initiate_tag) ||
+ (tmpinfo->verification_tag1 != 0 && tmpinfo->verification_tag1 == info->verification_tag1) ||
+ (tmpinfo->verification_tag2 != 0 && tmpinfo->verification_tag2 == info->verification_tag2)) {
+ inf.assoc_index = info->assoc_index;
+ inf.direction = info->direction;
+ return inf;
+ } else if ((tmpinfo->verification_tag1 != 0 && tmpinfo->verification_tag1 == info->verification_tag2) ||
+ (tmpinfo->verification_tag2 != 0 && tmpinfo->verification_tag2 == info->verification_tag1)) {
+ inf.assoc_index = info->assoc_index;
+ if (info->direction == 1)
+ inf.direction = 2;
+ else
+ inf.direction = 1;
+ return inf;
}
- inf.assoc_index = info->assoc_index;
- inf.direction = info->direction;
- return inf;
}
- elem = wmem_list_frame_next(elem);
}
- info = wmem_new0(wmem_file_scope(), assoc_info_t);
- info->assoc_index = num_assocs;
- info->sport = tmpinfo->sport;
- info->dport = tmpinfo->dport;
- info->verification_tag1 = tmpinfo->verification_tag1;
- info->verification_tag2 = tmpinfo->verification_tag2;
- info->initiate_tag = tmpinfo->initiate_tag;
- num_assocs++;
- wmem_list_prepend(assoc_info_list, info);
- inf.assoc_index = info->assoc_index;
- inf.direction = 1;
+
+ if (!elem && !visited) {
+ info = wmem_new0(wmem_file_scope(), assoc_info_t);
+ info->assoc_index = num_assocs;
+ info->sport = tmpinfo->sport;
+ info->dport = tmpinfo->dport;
+ info->verification_tag1 = tmpinfo->verification_tag1;
+ info->verification_tag2 = tmpinfo->verification_tag2;
+ info->initiate_tag = tmpinfo->initiate_tag;
+ num_assocs++;
+ wmem_list_prepend(assoc_info_list, info);
+ inf.assoc_index = info->assoc_index;
+ inf.direction = 1;
+ }
+
return inf;
}
@@ -4542,7 +4565,7 @@ dissect_sctp_chunks(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_i
tmpinfo.initiate_tag = 0;
}
- id_dir = find_assoc_index(&tmpinfo);
+ id_dir = find_assoc_index(&tmpinfo, PINFO_FD_VISITED(pinfo));
sctp_info.assoc_index = id_dir.assoc_index;
sctp_info.direction = id_dir.direction;
diff --git a/ui/tap-sctp-analysis.c b/ui/tap-sctp-analysis.c
index d5e6faf179..d58b03e985 100644
--- a/ui/tap-sctp-analysis.c
+++ b/ui/tap-sctp-analysis.c
@@ -442,7 +442,7 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi
info->init = FALSE;
info->initack = FALSE;
info->check_address = FALSE;
- info->direction = 0;
+ info->direction = sctp_info->direction;
info = calc_checksum(sctp_info, info);
info->n_packets = 1;
info->error_info_list = NULL;
@@ -554,13 +554,13 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi
{
store = (address *)g_malloc(sizeof (address));
alloc_address_tvb(NULL, store, AT_IPv4, 4, sctp_info->tvb[chunk_number], IPV4_ADDRESS_OFFSET);
- info = add_address(store, info, 1);
+ info = add_address(store, info, info->direction);
}
else if (type == IPV6ADDRESS_PARAMETER_ID)
{
store = (address *)g_malloc(sizeof (address));
alloc_address_tvb(NULL, store, AT_IPv6, 16, sctp_info->tvb[chunk_number], IPV6_ADDRESS_OFFSET);
- info = add_address(store, info, 1);
+ info = add_address(store, info, info->direction);
}
}
@@ -743,14 +743,17 @@ packet(void *tapdata _U_, packet_info *pinfo, epan_dissect_t *edt _U_, const voi
addr = (guint8 *)g_malloc(tmp_info.src.len);
memcpy(addr,(tmp_info.src.data),tmp_info.src.len);
store->data = addr;
- info = add_address(store, info, 1);
+ info = add_address(store, info, info->direction);
store = (address *)g_malloc(sizeof (address));
store->type = tmp_info.dst.type;
store->len = tmp_info.dst.len;
addr = (guint8 *)g_malloc(tmp_info.dst.len);
memcpy(addr,(tmp_info.dst.data),tmp_info.dst.len);
store->data = addr;
- info = add_address(store, info, 2);
+ if (info->direction == 1)
+ info = add_address(store, info, 2);
+ else
+ info = add_address(store, info, 1);
number = (guint32 *)g_malloc(sizeof(guint32));
*number = pinfo->num;
info->frame_numbers=g_list_prepend(info->frame_numbers,number);
diff --git a/ui/tap-sctp-analysis.h b/ui/tap-sctp-analysis.h
index a330d0fee0..7e007db4a0 100644
--- a/ui/tap-sctp-analysis.h
+++ b/ui/tap-sctp-analysis.h
@@ -123,7 +123,7 @@ extern "C" {
SACK_CHUNK_CUMULATIVE_TSN_ACK_LENGTH)
#define INIT_CHUNK_INITIAL_TSN_LENGTH 4
-#define INIT_CHUNK_FIXED_PARAMTERS_LENGTH (INIT_CHUNK_INITIATE_TAG_LENGTH + \
+#define INIT_CHUNK_FIXED_PARAMETERS_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 + \