#include <epan/packet.h>
#include <epan/sctpppids.h>
#include <epan/asn1.h>
+#include <epan/prefs.h>
#include "packet-per.h"
#define PNAME "UTRAN Iuh interface RUA signalling"
#define PSNAME "RUA"
#define PFNAME "rua"
+/* Dissector to use SCTP PPID 19 or a configured SCTP port. IANA assigned port = 29169*/
+#define SCTP_PORT_RUA 29169;
#include "packet-rua-val.h"
/* initialise sub-dissector handles */
static dissector_handle_t ranap_handle = NULL;
+static dissector_handle_t rua_ranap_handle = NULL;
#include "packet-rua-ett.c"
/* Global variables */
static guint32 ProcedureCode;
static guint32 ProtocolIE_ID;
+static guint global_sctp_port = SCTP_PORT_RUA;
/* Dissector tables */
static dissector_table_t rua_ies_dissector_table;
static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+void proto_reg_handoff_rua(void);
+
#include "packet-rua-fn.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/*--- proto_register_rua -------------------------------------------*/
void proto_register_rua(void) {
+module_t *rua_module;
/* List of fields */
rua_proc_imsg_dissector_table = register_dissector_table("rua.proc.imsg", "RUA-ELEMENTARY-PROCEDURE InitiatingMessage", FT_UINT32, BASE_DEC);
rua_proc_sout_dissector_table = register_dissector_table("rua.proc.sout", "RUA-ELEMENTARY-PROCEDURE SuccessfulOutcome", FT_UINT32, BASE_DEC);
rua_proc_uout_dissector_table = register_dissector_table("rua.proc.uout", "RUA-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", FT_UINT32, BASE_DEC);
+
+ rua_module = prefs_register_protocol(proto_rua, proto_reg_handoff_rua);
+ prefs_register_uint_preference(rua_module, "port", "RUA SCTP Port", "Set the port for RUA messages (Default of 29169)", 10, &global_sctp_port);
}
void
proto_reg_handoff_rua(void)
{
- dissector_handle_t rua_handle;
-
- rua_handle = find_dissector("rua");
- ranap_handle = find_dissector("ranap");
- dissector_add("sctp.ppi", RUA_PAYLOAD_PROTOCOL_ID, rua_handle);
- dissector_add_handle("sctp.port", rua_handle); /* for "decode-as" */
-
+ static gboolean initialized = FALSE;
+ static dissector_handle_t rua_handle;
+ static guint sctp_port;
+
+ if (!initialized) {
+ rua_handle = find_dissector("rua");
+ rua_ranap_handle = find_dissector("ranap");
+ dissector_add("sctp.ppi", RUA_PAYLOAD_PROTOCOL_ID, rua_handle);
+ initialized = TRUE;
#include "packet-rua-dis-tab.c"
+
+ } else {
+ dissector_delete("sctp.port", sctp_port, rua_handle);
+ }
+ /* Set our port number for future use */
+ sctp_port = global_sctp_port;
+ dissector_add("sctp.port", sctp_port, rua_handle);
}
#.OMIT_ASSIGNMENT
Presence
ProtocolIE-ContainerList
-ProtocolIE-Single-Container
#.END
#.FN_PARS ProtocolIE-ID VAL_PTR = &ProtocolIE_ID
#.FN_PARS ProcedureCode VAL_PTR = &ProcedureCode
#.FN_FTR ProcedureCode
- col_add_fstr(actx->pinfo->cinfo, COL_INFO, "%s ",
- val_to_str(ProcedureCode, rua_ProcedureCode_vals,
- "unknown message"));
-#.END
+ col_add_fstr(actx->pinfo->cinfo, COL_INFO, "%s ",
+ val_to_str(ProcedureCode, rua_ProcedureCode_vals,
+ "Unknown Message"));
+ col_set_fence(actx->pinfo->cinfo, COL_INFO); /* Protect the Procedure Code COL_INFO from subdissector overwrites */
#.FN_PARS InitiatingMessage/value FN_VARIANT=_pdu_new TYPE_REF_FN=dissect_InitiatingMessageValue
#.FN_PARS UnsuccessfulOutcome/value FN_VARIANT=_pdu_new TYPE_REF_FN=dissect_UnsuccessfulOutcomeValue
-#.FN_BODY RANAP-Message VAL_PTR = &ranap_message_tvb
- tvbuff_t *ranap_message_tvb=NULL;
+#.FN_BODY Connect /* Set COL_INFO to Connect */
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "CONNECT" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
+%(DEFAULT_BODY)s
+
+#.FN_BODY DirectTransfer /* Set COL_INFO to DirectTransfer */
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "DIRECT_TRANSFER" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
+%(DEFAULT_BODY)s
+
+#.FN_BODY Disconnect /* Set COL_INFO to Disconnect */
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "DISCONNECT" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
+%(DEFAULT_BODY)s
+
+#.FN_BODY ConnectionlessTransfer /* Set COL_INFO to ConnectionlessTransfer */
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "CONNECTIONLESS_TRANSFER" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
%(DEFAULT_BODY)s
- if (ranap_message_tvb)
- call_dissector(ranap_handle,ranap_message_tvb,%(ACTX)s->pinfo, proto_tree_get_root(tree));
+#.FN_BODY ErrorIndication /* Set COL_INFO to Error Indication and protect it */
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "ERROR_INDICATION" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+ col_set_fence(actx->pinfo->cinfo, COL_INFO);
+%(DEFAULT_BODY)s
+
+#.FN_BODY PrivateMessage /* Set COL_INFO to Private Message */
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "PRIVATE_MESSAGE" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
+%(DEFAULT_BODY)s
+
+#.FN_BODY RANAP-Message VAL_PTR = &ranap_message_tvb
+ tvbuff_t *ranap_message_tvb=NULL;
+%(DEFAULT_BODY)s
+ if ((tvb_length(ranap_message_tvb)>0)&&(rua_ranap_handle)) { /* RUA has a RANAP-PDU, let RANAP append to COL_PROTOCOL i.e. RUA/RANAP */
+ if (check_col(actx->pinfo->cinfo, COL_PROTOCOL)) {
+ /* Protect RUA entries in the protocol and info columns from subdissector overwrites*/
+ col_append_str(actx->pinfo->cinfo, COL_PROTOCOL, "/");
+ col_set_fence(actx->pinfo->cinfo, COL_PROTOCOL);
+ }
+ call_dissector(rua_ranap_handle,ranap_message_tvb,%(ACTX)s->pinfo, tree);
+ } else { /* RUA does not have a RANAP-PDU so protect existing RUA Elementary Procedure as COL_INFO */
+ col_set_fence(actx->pinfo->cinfo, COL_INFO);
+ }
#.END
+#.ASSIGN_VALUE_TO_TYPE # RUA ASN.1 does not have constants assigned to types,
+# ProcedureCode
+id-Connect ProcedureCode
+id-DirectTransfer ProcedureCode
+id-Disconnect ProcedureCode
+id-ConnectionlessTransfer ProcedureCode
+id-ErrorIndication ProcedureCode
+id-privateMessage ProcedureCode
+
+# ProtocolIE-ID
+id-Cause ProtocolIE-ID
+id-CriticalityDiagnostics ProtocolIE-ID
+id-Context-ID ProtocolIE-ID
+id-RANAP-Message ProtocolIE-ID
+id-IntraDomainNasNodeSelector ProtocolIE-ID
+id-Establishment-Cause ProtocolIE-ID
+id-CN-DomainIndicator ProtocolIE-ID
+#.END
+
#.REGISTER_NEW
#RUA-PROTOCOL-IES
-Cause N rua.ies id-Cause
-CriticalityDiagnostics N rua.ies id-CriticalityDiagnostics
-Context-ID N rua.ies id-Context-ID
-RANAP-Message N rua.ies id-RANAP-Message
-IntraDomainNasNodeSelector N rua.ies id-IntraDomainNasNodeSelector
-Establishment-Cause N rua.ies id-Establishment-Cause
-CN-DomainIndicator N rua.ies id-CN-DomainIndicator
+Cause N rua.ies id-Cause
+CriticalityDiagnostics N rua.ies id-CriticalityDiagnostics
+Context-ID N rua.ies id-Context-ID
+RANAP-Message N rua.ies id-RANAP-Message
+IntraDomainNasNodeSelector N rua.ies id-IntraDomainNasNodeSelector
+Establishment-Cause N rua.ies id-Establishment-Cause
+CN-DomainIndicator N rua.ies id-CN-DomainIndicator
#RUA-PROTOCOL-EXTENSION
-CSGMembershipStatus N rua.extension id-CSGMembershipStatus
+CSGMembershipStatus N rua.extension id-CSGMembershipStatus
#RUA-ELEMENTARY-PROCEDURE
-Connect N rua.proc.imsg id-Connect
-DirectTransfer N rua.proc.imsg id-DirectTransfer
-Disconnect N rua.proc.imsg id-Disconnect
-ConnectionlessTransfer N rua.proc.imsg id-ConnectionlessTransfer
-ErrorIndication N rua.proc.imsg id-ErrorIndication
-PrivateMessage N rua.proc.imsg id-privateMessage
-
+Connect N rua.proc.imsg id-Connect
+DirectTransfer N rua.proc.imsg id-DirectTransfer
+Disconnect N rua.proc.imsg id-Disconnect
+ConnectionlessTransfer N rua.proc.imsg id-ConnectionlessTransfer
+ErrorIndication N rua.proc.imsg id-ErrorIndication
+PrivateMessage N rua.proc.imsg id-privateMessage
#.END
#include <epan/packet.h>
#include <epan/sctpppids.h>
#include <epan/asn1.h>
+#include <epan/prefs.h>
#include "packet-per.h"
#define PNAME "UTRAN Iuh interface RUA signalling"
#define PSNAME "RUA"
#define PFNAME "rua"
+/* Dissector to use SCTP PPID 19 or a configured SCTP port. IANA assigned port = 29169*/
+#define SCTP_PORT_RUA 29169;
/*--- Included file: packet-rua-val.h ---*/
} ProtocolIE_ID_enum;
/*--- End of included file: packet-rua-val.h ---*/
-#line 52 "packet-rua-template.c"
+#line 55 "packet-rua-template.c"
/* Initialize the protocol and registered fields */
static int proto_rua = -1;
static int hf_rua_unsuccessfulOutcome_value = -1; /* UnsuccessfulOutcome_value */
/*--- End of included file: packet-rua-hf.c ---*/
-#line 57 "packet-rua-template.c"
+#line 60 "packet-rua-template.c"
/* Initialize the subtree pointers */
static int ett_rua = -1;
/* initialise sub-dissector handles */
static dissector_handle_t ranap_handle = NULL;
+static dissector_handle_t rua_ranap_handle = NULL;
/*--- Included file: packet-rua-ett.c ---*/
static gint ett_rua_UnsuccessfulOutcome = -1;
/*--- End of included file: packet-rua-ett.c ---*/
-#line 65 "packet-rua-template.c"
+#line 69 "packet-rua-template.c"
/* Global variables */
static guint32 ProcedureCode;
static guint32 ProtocolIE_ID;
+static guint global_sctp_port = SCTP_PORT_RUA;
/* Dissector tables */
static dissector_table_t rua_ies_dissector_table;
static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
+void proto_reg_handoff_rua(void);
+
/*--- Included file: packet-rua-fn.c ---*/
#line 1 "packet-rua-fn.c"
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, 255U, &ProcedureCode, FALSE);
-#line 53 "rua.cnf"
- col_add_fstr(actx->pinfo->cinfo, COL_INFO, "%s ",
- val_to_str(ProcedureCode, rua_ProcedureCode_vals,
- "unknown message"));
+#line 52 "rua.cnf"
+ col_add_fstr(actx->pinfo->cinfo, COL_INFO, "%s ",
+ val_to_str(ProcedureCode, rua_ProcedureCode_vals,
+ "Unknown Message"));
+ col_set_fence(actx->pinfo->cinfo, COL_INFO); /* Protect the Procedure Code COL_INFO from subdissector overwrites */
+
return offset;
}
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, maxProtocolIEs, &ProtocolIE_ID, FALSE);
-#line 42 "rua.cnf"
+#line 41 "rua.cnf"
if (tree) {
proto_item_append_text(proto_item_get_parent_nth(actx->created_item, 2), ": %s", val_to_str(ProtocolIE_ID, VALS(rua_ProtocolIE_ID_vals), "unknown (%d)"));
}
+static int
+dissect_rua_ProtocolIE_Single_Container(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+ offset = dissect_rua_ProtocolIE_Field(tvb, offset, actx, tree, hf_index);
+
+ return offset;
+}
+
+
+
static int
dissect_rua_T_extensionValue(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_ProtocolExtensionFieldExtensionValue);
static int
dissect_rua_RANAP_Message(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 65 "rua.cnf"
+#line 101 "rua.cnf"
tvbuff_t *ranap_message_tvb=NULL;
-
offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
NO_BOUND, NO_BOUND, FALSE, &ranap_message_tvb);
-
- if (ranap_message_tvb)
- call_dissector(ranap_handle,ranap_message_tvb,actx->pinfo, proto_tree_get_root(tree));
-
+ if ((tvb_length(ranap_message_tvb)>0)&&(rua_ranap_handle)) { /* RUA has a RANAP-PDU, let RANAP append to COL_PROTOCOL i.e. RUA/RANAP */
+ if (check_col(actx->pinfo->cinfo, COL_PROTOCOL)) {
+ /* Protect RUA entries in the protocol and info columns from subdissector overwrites*/
+ col_append_str(actx->pinfo->cinfo, COL_PROTOCOL, "/");
+ col_set_fence(actx->pinfo->cinfo, COL_PROTOCOL);
+ }
+ call_dissector(rua_ranap_handle,ranap_message_tvb,actx->pinfo, tree);
+ } else { /* RUA does not have a RANAP-PDU so protect existing RUA Elementary Procedure as COL_INFO */
+ col_set_fence(actx->pinfo->cinfo, COL_INFO);
+ }
return offset;
static int
dissect_rua_Connect(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 64 "rua.cnf"
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "CONNECT" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_rua_Connect, Connect_sequence);
+
+
+
return offset;
}
static int
dissect_rua_DirectTransfer(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 70 "rua.cnf"
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "DIRECT_TRANSFER" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_rua_DirectTransfer, DirectTransfer_sequence);
+
+
+
return offset;
}
static int
dissect_rua_Disconnect(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 76 "rua.cnf"
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "DISCONNECT" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_rua_Disconnect, Disconnect_sequence);
+
+
+
return offset;
}
static int
dissect_rua_ConnectionlessTransfer(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 82 "rua.cnf"
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "CONNECTIONLESS_TRANSFER" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_rua_ConnectionlessTransfer, ConnectionlessTransfer_sequence);
+
+
+
return offset;
}
static int
dissect_rua_ErrorIndication(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 88 "rua.cnf"
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "ERROR_INDICATION" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+ col_set_fence(actx->pinfo->cinfo, COL_INFO);
+
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_rua_ErrorIndication, ErrorIndication_sequence);
+
+
+
return offset;
}
static int
dissect_rua_PrivateMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 95 "rua.cnf"
+ col_append_str(actx->pinfo->cinfo, COL_INFO, "PRIVATE_MESSAGE" );
+ col_append_fstr(actx->pinfo->cinfo, COL_INFO, " ");
+
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
ett_rua_PrivateMessage, PrivateMessage_sequence);
+
+
+
return offset;
}
/*--- End of included file: packet-rua-fn.c ---*/
-#line 84 "packet-rua-template.c"
+#line 91 "packet-rua-template.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
/*--- proto_register_rua -------------------------------------------*/
void proto_register_rua(void) {
+module_t *rua_module;
/* List of fields */
"rua.UnsuccessfulOutcome_value", HFILL }},
/*--- End of included file: packet-rua-hfarr.c ---*/
-#line 134 "packet-rua-template.c"
+#line 142 "packet-rua-template.c"
};
/* List of subtrees */
&ett_rua_UnsuccessfulOutcome,
/*--- End of included file: packet-rua-ettarr.c ---*/
-#line 140 "packet-rua-template.c"
+#line 148 "packet-rua-template.c"
};
rua_proc_imsg_dissector_table = register_dissector_table("rua.proc.imsg", "RUA-ELEMENTARY-PROCEDURE InitiatingMessage", FT_UINT32, BASE_DEC);
rua_proc_sout_dissector_table = register_dissector_table("rua.proc.sout", "RUA-ELEMENTARY-PROCEDURE SuccessfulOutcome", FT_UINT32, BASE_DEC);
rua_proc_uout_dissector_table = register_dissector_table("rua.proc.uout", "RUA-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", FT_UINT32, BASE_DEC);
+
+ rua_module = prefs_register_protocol(proto_rua, proto_reg_handoff_rua);
+ prefs_register_uint_preference(rua_module, "port", "RUA SCTP Port", "Set the port for RUA messages (Default of 29169)", 10, &global_sctp_port);
}
void
proto_reg_handoff_rua(void)
{
- dissector_handle_t rua_handle;
-
- rua_handle = find_dissector("rua");
- ranap_handle = find_dissector("ranap");
- dissector_add("sctp.ppi", RUA_PAYLOAD_PROTOCOL_ID, rua_handle);
- dissector_add_handle("sctp.port", rua_handle); /* for "decode-as" */
+ static gboolean initialized = FALSE;
+ static dissector_handle_t rua_handle;
+ static guint sctp_port;
+ if (!initialized) {
+ rua_handle = find_dissector("rua");
+ rua_ranap_handle = find_dissector("ranap");
+ dissector_add("sctp.ppi", RUA_PAYLOAD_PROTOCOL_ID, rua_handle);
+ initialized = TRUE;
/*--- Included file: packet-rua-dis-tab.c ---*/
#line 1 "packet-rua-dis-tab.c"
/*--- End of included file: packet-rua-dis-tab.c ---*/
-#line 174 "packet-rua-template.c"
+#line 187 "packet-rua-template.c"
+
+ } else {
+ dissector_delete("sctp.port", sctp_port, rua_handle);
+ }
+ /* Set our port number for future use */
+ sctp_port = global_sctp_port;
+ dissector_add("sctp.port", sctp_port, rua_handle);
}