diff options
author | Anders Broman <anders.broman@ericsson.com> | 2013-02-17 19:28:59 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2013-02-17 19:28:59 +0000 |
commit | 9341c04a12dbcde4f356757275fcc61d61d6fd29 (patch) | |
tree | 3dbfa213863399e81c667f1f332a577efa9350dd /asn1/q932 | |
parent | a26d951d8a5ac228073b9b87c59dfb1a6ad1b0d1 (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.c | 64 |
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; + } + } /*---------------------------------------------------------------------------*/ |