aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/qsig
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2010-02-04 07:18:50 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2010-02-04 07:18:50 +0000
commit895c25125db348242b0f4370c78b57b1da21068e (patch)
treef337bfaf35f0a31ae364566d9a87e0d6a57fd842 /asn1/qsig
parent8c07e341236075470b55cd2adcff90c4c43e0a41 (diff)
Support QSIG using global opcode 1.3.12.9.op instead of local one (some old QSIG implementations)
svn path=/trunk/; revision=31783
Diffstat (limited to 'asn1/qsig')
-rw-r--r--asn1/qsig/packet-qsig-template.c48
1 files changed, 45 insertions, 3 deletions
diff --git a/asn1/qsig/packet-qsig-template.c b/asn1/qsig/packet-qsig-template.c
index d940868ae6..e3082231dd 100644
--- a/asn1/qsig/packet-qsig-template.c
+++ b/asn1/qsig/packet-qsig-template.c
@@ -312,6 +312,8 @@ static gint ett_qsig_unknown_extension = -1;
/* Global variables */
static const char *extension_oid = NULL;
+static GHashTable *qsig_opcode2oid_hashtable = NULL;
+static GHashTable *qsig_oid2op_hashtable = NULL;
/* Dissector tables */
static dissector_table_t extension_dissector_table;
@@ -379,10 +381,15 @@ dissect_qsig_arg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
DISSECTOR_ASSERT(rctx);
if (rctx->d.pdu != 1) /* invoke */
return offset;
- if (rctx->d.code != 0) /* local */
+ if (rctx->d.code == 0) { /* local */
+ opcode = rctx->d.code_local;
+ op_ptr = get_op(opcode);
+ } else if (rctx->d.code == 1) { /* global */
+ op_ptr = g_hash_table_lookup(qsig_oid2op_hashtable, rctx->d.code_global);
+ if (op_ptr) opcode = op_ptr->opcode;
+ } else {
return offset;
- opcode = rctx->d.code_local;
- op_ptr = get_op(opcode);
+ }
if (!op_ptr)
return offset;
service = get_service(opcode);
@@ -576,6 +583,31 @@ dissect_qsig_ie_cs5(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
dissect_qsig_ie(tvb, pinfo, tree, 5);
}
+/*--- qsig_init_tables ---------------------------------------------------------*/
+static void qsig_init_tables(void) {
+ gint i, opcode, *key;
+ gchar *oid;
+
+ if (qsig_opcode2oid_hashtable)
+ g_hash_table_destroy(qsig_opcode2oid_hashtable);
+ qsig_opcode2oid_hashtable = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
+
+ if (qsig_oid2op_hashtable)
+ g_hash_table_destroy(qsig_oid2op_hashtable);
+ qsig_oid2op_hashtable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+
+ /* fill-in global OIDs */
+ for (i=0; i<array_length(qsig_op_tab); i++) {
+ opcode = qsig_op_tab[i].opcode;
+ oid = g_strdup_printf("1.3.12.9.%d", opcode);
+ key = g_malloc(sizeof(gint));
+ *key = opcode;
+ g_hash_table_insert(qsig_opcode2oid_hashtable, key, oid);
+ g_hash_table_insert(qsig_oid2op_hashtable, g_strdup(oid), (gpointer)&qsig_op_tab[i]);
+ }
+
+}
+
/*--- proto_register_qsig ---------------------------------------------------*/
void proto_register_qsig(void) {
@@ -631,12 +663,16 @@ void proto_register_qsig(void) {
/* Register dissector tables */
extension_dissector_table = register_dissector_table("qsig.ext", "QSIG Extension", FT_STRING, BASE_NONE);
+
+ qsig_init_tables();
}
/*--- proto_reg_handoff_qsig ------------------------------------------------*/
void proto_reg_handoff_qsig(void) {
int i;
+ gint key;
+ const gchar *oid;
dissector_handle_t q931_handle;
dissector_handle_t qsig_arg_handle;
dissector_handle_t qsig_res_handle;
@@ -650,6 +686,12 @@ void proto_reg_handoff_qsig(void) {
for (i=0; i<(int)array_length(qsig_op_tab); i++) {
dissector_add("q932.ros.local.arg", qsig_op_tab[i].opcode, qsig_arg_handle);
dissector_add("q932.ros.local.res", qsig_op_tab[i].opcode, qsig_res_handle);
+ key = qsig_op_tab[i].opcode;
+ oid = g_hash_table_lookup(qsig_opcode2oid_hashtable, &key);
+ if (oid) {
+ dissector_add_string("q932.ros.global.arg", oid, qsig_arg_handle);
+ dissector_add_string("q932.ros.global.res", oid, qsig_res_handle);
+ }
}
qsig_err_handle = new_create_dissector_handle(dissect_qsig_err, proto_qsig);
for (i=0; i<(int)array_length(qsig_err_tab); i++) {