aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-sua.c
diff options
context:
space:
mode:
authorlego <lego@f5534014-38df-0310-8fa8-9805f1628bb7>2007-03-22 22:59:20 +0000
committerlego <lego@f5534014-38df-0310-8fa8-9805f1628bb7>2007-03-22 22:59:20 +0000
commit6f9caaf2f1b60d90db4e301cf1711978b523a563 (patch)
tree6986d6abf9e4fe13b040327b909b3e9ffa7bc795 /epan/dissectors/packet-sua.c
parent2ab6d815f34239d8ed259e3cdade15dac9f1139e (diff)
Mine:
* add SUA to the "VoIP Calls" tap. * propagate changes to packet-sccp.h to other dissectors From Neil Piercy: * add SLR, DLR and CAUSE to COL_INFO git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@21126 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-sua.c')
-rw-r--r--epan/dissectors/packet-sua.c47
1 files changed, 43 insertions, 4 deletions
diff --git a/epan/dissectors/packet-sua.c b/epan/dissectors/packet-sua.c
index 6c43f0cff6..29e3b29a0c 100644
--- a/epan/dissectors/packet-sua.c
+++ b/epan/dissectors/packet-sua.c
@@ -2,7 +2,7 @@
* Routines for SS7 SCCP-User Adaptation Layer (SUA) dissection
* It is hopefully (needs testing) compilant to
* http://www.ietf.org/internet-drafts/draft-ietf-sigtran-sua-08.txt
- * http://www.ietf.org/rfc/rfc3838.txt
+ * http://www.ietf.org/rfc/rfc3868.txt
*
* Copyright 2002, 2003, 2004 Michael Tuexen <tuexen [AT] fh-muenster.de>
*
@@ -36,7 +36,9 @@
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/sctpppids.h>
-#include <packet-mtp3.h>
+#include <epan/tap.h>
+#include "packet-mtp3.h"
+#include "packet-sccp.h"
#define NETWORK_BYTE_ORDER FALSE
#define ADD_PADDING(x) ((((x) + 3) >> 2) << 2)
@@ -214,6 +216,21 @@ static const value_string message_class_type_acro_values[] = {
{ MESSAGE_CLASS_RKM_MESSAGE * 256 + MESSAGE_TYPE_DEREG_RSP , "DEREG_RSP" },
{ 0, NULL } };
+const value_string sua_co_class_type_acro_values[] = {
+ { MESSAGE_TYPE_CORE , "CORE" },
+ { MESSAGE_TYPE_COAK , "COAK" },
+ { MESSAGE_TYPE_COREF , "COREF" },
+ { MESSAGE_TYPE_RELRE , "RELRE" },
+ { MESSAGE_TYPE_RELCO , "RELCO" },
+ { MESSAGE_TYPE_RESCO , "RESCO" },
+ { MESSAGE_TYPE_RESRE , "RESRE" },
+ { MESSAGE_TYPE_CODT , "CODT" },
+ { MESSAGE_TYPE_CODA , "CODA" },
+ { MESSAGE_TYPE_COERR , "COERR" },
+ { MESSAGE_TYPE_COIT , "COIT" },
+ { 0, NULL }
+};
+
/* Initialize the protocol and registered fields */
static int proto_sua = -1;
static int hf_version = -1;
@@ -327,10 +344,14 @@ static gint ett_sua_receive_sequence_number_number = -1;
static gint ett_sua_return_on_error_bit_and_protocol_class = -1;
static gint ett_sua_protcol_classes = -1;
+static int sua_tap = -1;
+
static dissector_handle_t data_handle;
static dissector_table_t sccp_ssn_dissector_table;
static heur_dissector_list_t heur_subdissector_list;
+static guint32 message_class, message_type, drn, srn;
+
/* stuff for supporting multiple versions */
typedef enum {
SUA_V08,
@@ -345,7 +366,6 @@ dissect_parameters(tvbuff_t *tlv_tvb, proto_tree *tree, tvbuff_t **data_tvb, gui
static void
dissect_common_header(tvbuff_t *common_header_tvb, packet_info *pinfo, proto_tree *sua_tree)
{
- guint8 message_class, message_type;
message_class = tvb_get_guint8(common_header_tvb, MESSAGE_CLASS_OFFSET);
message_type = tvb_get_guint8(common_header_tvb, MESSAGE_TYPE_OFFSET);
@@ -746,7 +766,8 @@ dissect_destination_address_parameter(tvbuff_t *parameter_tvb, proto_tree *param
static void
dissect_source_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
- proto_tree_add_item(parameter_tree, hf_source_reference_number, parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET, SOURCE_REFERENCE_NUMBER_LENGTH, NETWORK_BYTE_ORDER);
+ srn = tvb_get_ntohl(parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET);
+ proto_tree_add_item(parameter_tree, hf_source_reference_number, parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET, SOURCE_REFERENCE_NUMBER_LENGTH, NETWORK_BYTE_ORDER);
proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, SOURCE_REFERENCE_NUMBER_OFFSET));
}
@@ -756,6 +777,7 @@ dissect_source_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *p
static void
dissect_destination_reference_number_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item)
{
+ drn = tvb_get_ntohl(parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET);
proto_tree_add_item(parameter_tree, hf_destination_reference_number, parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET, DESTINATION_REFERENCE_NUMBER_LENGTH, NETWORK_BYTE_ORDER);
proto_item_append_text(parameter_item, " (%u)", tvb_get_ntohl(parameter_tvb, DESTINATION_REFERENCE_NUMBER_OFFSET));
}
@@ -1815,12 +1837,27 @@ dissect_sua_message(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *sua_t
guint8 source_ssn = INVALID_SSN;
guint8 dest_ssn = INVALID_SSN;
+ message_class = 0;
+ message_type = 0;
+ drn = 0;
+ srn = 0;
+
common_header_tvb = tvb_new_subset(message_tvb, COMMON_HEADER_OFFSET, COMMON_HEADER_LENGTH, COMMON_HEADER_LENGTH);
dissect_common_header(common_header_tvb, pinfo, sua_tree);
parameters_tvb = tvb_new_subset(message_tvb, COMMON_HEADER_LENGTH, -1, -1);
dissect_parameters(parameters_tvb, sua_tree, &data_tvb, &source_ssn, &dest_ssn);
+ if ( message_class == MESSAGE_CLASS_CO_MESSAGE) {
+ /* XXX: this might fail with multihomed SCTP (on a path failure during a call) */
+ sccp_assoc_info_t* assoc = get_sccp_assoc(pinfo, offset_from_real_beginning(message_tvb,0), srn, drn, message_type);
+
+ if (assoc && assoc->curr_msg) {
+ pinfo->sccp_info = assoc->curr_msg;
+ tap_queue_packet(sua_tap,pinfo,assoc->curr_msg);
+ }
+ }
+
/* If there was SUA data it could be dissected */
if(data_tvb)
{
@@ -1873,6 +1910,7 @@ dissect_sua(tvbuff_t *message_tvb, packet_info *pinfo, proto_tree *tree)
/* dissect the message */
dissect_sua_message(message_tvb, pinfo, sua_tree, tree);
+
}
/* Register the protocol with Wireshark */
@@ -2017,6 +2055,7 @@ proto_register_sua(void)
prefs_register_enum_preference(sua_module, "version", "SUA Version", "Version used by Wireshark", &version, options, FALSE);
register_heur_dissector_list("sua", &heur_subdissector_list);
+ sua_tap = register_tap("sua");
}