diff options
author | Tomas Kukosa <tomas.kukosa@siemens.com> | 2010-02-04 07:18:50 +0000 |
---|---|---|
committer | Tomas Kukosa <tomas.kukosa@siemens.com> | 2010-02-04 07:18:50 +0000 |
commit | 895c25125db348242b0f4370c78b57b1da21068e (patch) | |
tree | f337bfaf35f0a31ae364566d9a87e0d6a57fd842 /asn1/qsig | |
parent | 8c07e341236075470b55cd2adcff90c4c43e0a41 (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.c | 48 |
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++) { |