aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/q932
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2013-02-17 19:28:59 +0000
committerAnders Broman <anders.broman@ericsson.com>2013-02-17 19:28:59 +0000
commit9341c04a12dbcde4f356757275fcc61d61d6fd29 (patch)
tree3dbfa213863399e81c667f1f332a577efa9350dd /asn1/q932
parenta26d951d8a5ac228073b9b87c59dfb1a6ad1b0d1 (diff)
Add a preferense to the Q.932 dissector wether facility messages should be dissected as QSIG or ETSI.
Add the ISUP Supplementary services dissector. svn path=/trunk/; revision=47713
Diffstat (limited to 'asn1/q932')
-rw-r--r--asn1/q932/packet-q932-template.c64
1 files changed, 55 insertions, 9 deletions
diff --git a/asn1/q932/packet-q932-template.c b/asn1/q932/packet-q932-template.c
index cd36ff1d8d..a16a08cdb5 100644
--- a/asn1/q932/packet-q932-template.c
+++ b/asn1/q932/packet-q932-template.c
@@ -28,6 +28,7 @@
#include <epan/packet.h>
#include <epan/strutil.h>
#include <epan/asn1.h>
+#include <epan/prefs.h>
#include "packet-ber.h"
#include "packet-q932.h"
@@ -55,6 +56,17 @@ static gint ett_q932_ie = -1;
/* ROSE context */
static rose_ctx_t q932_rose_ctx;
+dissector_table_t qsig_arg_local_dissector_table;
+dissector_table_t qsig_res_local_dissector_table;
+dissector_table_t qsig_err_local_dissector_table;
+
+dissector_table_t etsi_arg_local_dissector_table;
+dissector_table_t etsi_res_local_dissector_table;
+dissector_table_t etsi_err_local_dissector_table;
+
+static gint g_facility_encoding = 0; /* Default to QSIG */
+
+void proto_reg_handoff_q932(void);
/* Subdissectors */
static dissector_handle_t q932_ros_handle;
@@ -297,6 +309,14 @@ void proto_register_q932(void) {
#include "packet-q932-ettarr.c"
};
+ module_t *q932_module;
+
+ static const enum_val_t facility_encoding[] = {
+ {"Facility as QSIG", "Dissect facility as QSIG", 0},
+ {"Facility as ETSI", "Dissect facility as ETSI", 1},
+ {NULL, NULL, -1}
+ };
+
/* Register protocol and dissector */
proto_q932 = proto_register_protocol(PNAME, PSNAME, PFNAME);
register_dissector("q932.apdu", dissect_q932_apdu, proto_q932);
@@ -310,23 +330,49 @@ void proto_register_q932(void) {
/* Register dissector tables */
q932_rose_ctx.arg_global_dissector_table = register_dissector_table("q932.ros.global.arg", "Q.932 Operation Argument (global opcode)", FT_STRING, BASE_NONE);
q932_rose_ctx.res_global_dissector_table = register_dissector_table("q932.ros.global.res", "Q.932 Operation Result (global opcode)", FT_STRING, BASE_NONE);
- q932_rose_ctx.arg_local_dissector_table = register_dissector_table("q932.ros.local.arg", "Q.932 Operation Argument (local opcode)", FT_UINT32, BASE_HEX);
- q932_rose_ctx.res_local_dissector_table = register_dissector_table("q932.ros.local.res", "Q.932 Operation Result (local opcode)", FT_UINT32, BASE_HEX);
q932_rose_ctx.err_global_dissector_table = register_dissector_table("q932.ros.global.err", "Q.932 Error (global opcode)", FT_STRING, BASE_NONE);
- q932_rose_ctx.err_local_dissector_table = register_dissector_table("q932.ros.local.err", "Q.932 Error (local opcode)", FT_UINT32, BASE_HEX);
+
+ qsig_arg_local_dissector_table = register_dissector_table("q932.ros.local.arg", "Q.932 Operation Argument (local opcode)", FT_UINT32, BASE_HEX);
+ qsig_res_local_dissector_table = register_dissector_table("q932.ros.local.res", "Q.932 Operation Result (local opcode)", FT_UINT32, BASE_HEX);
+ qsig_err_local_dissector_table = register_dissector_table("q932.ros.local.err", "Q.932 Error (local opcode)", FT_UINT32, BASE_HEX);
+
+ etsi_arg_local_dissector_table = register_dissector_table("q932.ros.etsi.local.arg", "Q.932 ETSI Operation Argument (local opcode)", FT_UINT32, BASE_HEX);
+ etsi_res_local_dissector_table = register_dissector_table("q932.ros.etsi.local.res", "Q.932 ETSI Operation Result (local opcode)", FT_UINT32, BASE_HEX);
+ etsi_err_local_dissector_table = register_dissector_table("q932.ros.etsi.local.err", "Q.932 ETSI Error (local opcode)", FT_UINT32, BASE_HEX);
+
+ q932_module = prefs_register_protocol(proto_q932, proto_reg_handoff_q932);
+
+ prefs_register_enum_preference(q932_module, "facility_encoding",
+ "Type of Facility encoding",
+ "Type of Facility encoding",
+ &g_facility_encoding, facility_encoding, FALSE);
}
/*--- proto_reg_handoff_q932 ------------------------------------------------*/
void proto_reg_handoff_q932(void) {
dissector_handle_t q932_ie_handle;
- q932_ie_handle = create_dissector_handle(dissect_q932_ie, proto_q932);
- /* Facility */
- dissector_add_uint("q931.ie", (0x00 << 8) | Q932_IE_FACILITY, q932_ie_handle);
- /* Notification indicator */
- dissector_add_uint("q931.ie", (0x00 << 8) | Q932_IE_NOTIFICATION_INDICATOR, q932_ie_handle);
+ static gboolean q931_prefs_initialized = FALSE;
- q932_ros_handle = find_dissector("q932.ros");
+ if (!q931_prefs_initialized) {
+ q932_ie_handle = create_dissector_handle(dissect_q932_ie, proto_q932);
+ /* Facility */
+ dissector_add_uint("q931.ie", (0x00 << 8) | Q932_IE_FACILITY, q932_ie_handle);
+ /* Notification indicator */
+ dissector_add_uint("q931.ie", (0x00 << 8) | Q932_IE_NOTIFICATION_INDICATOR, q932_ie_handle);
+ q932_ros_handle = find_dissector("q932.ros");
+ }
+
+ if(g_facility_encoding == 0){
+ q932_rose_ctx.arg_local_dissector_table = qsig_arg_local_dissector_table;
+ q932_rose_ctx.res_local_dissector_table = qsig_res_local_dissector_table;
+ q932_rose_ctx.err_local_dissector_table = qsig_err_local_dissector_table;
+ }else{
+ q932_rose_ctx.arg_local_dissector_table = etsi_arg_local_dissector_table;
+ q932_rose_ctx.res_local_dissector_table = etsi_res_local_dissector_table;
+ q932_rose_ctx.err_local_dissector_table = etsi_err_local_dissector_table;
+ }
+
}
/*---------------------------------------------------------------------------*/