diff options
author | kukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7> | 2010-02-04 07:18:50 +0000 |
---|---|---|
committer | kukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7> | 2010-02-04 07:18:50 +0000 |
commit | c6944ef66602e6ffc4051705f4b5cd2af3ac27f5 (patch) | |
tree | f337bfaf35f0a31ae364566d9a87e0d6a57fd842 /epan/dissectors/packet-qsig.c | |
parent | e1f1c1047587956e4f240ff972c2ba6aa4f4b7e0 (diff) |
Support QSIG using global opcode 1.3.12.9.op instead of local one (some old QSIG implementations)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@31783 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-qsig.c')
-rw-r--r-- | epan/dissectors/packet-qsig.c | 58 |
1 files changed, 50 insertions, 8 deletions
diff --git a/epan/dissectors/packet-qsig.c b/epan/dissectors/packet-qsig.c index f036295ace..3f280d315b 100644 --- a/epan/dissectors/packet-qsig.c +++ b/epan/dissectors/packet-qsig.c @@ -2023,6 +2023,8 @@ static gint ett_qsig_mid_SEQUENCE_OF_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; @@ -11894,7 +11896,7 @@ static int dissect_qsig_mid_Extension_PDU(tvbuff_t *tvb _U_, packet_info *pinfo /*--- End of included file: packet-qsig-fn.c ---*/ -#line 320 "packet-qsig-template.c" +#line 322 "packet-qsig-template.c" typedef struct _qsig_op_t { gint32 opcode; @@ -12112,7 +12114,7 @@ static const qsig_op_t qsig_op_tab[] = { /* mIDMailboxID */ { 120, dissect_qsig_mid_MIDMailboxIDArg_PDU, dissect_qsig_mid_MIDDummyRes_PDU }, /*--- End of included file: packet-qsig-table11.c ---*/ -#line 329 "packet-qsig-template.c" +#line 331 "packet-qsig-template.c" }; typedef struct _qsig_err_t { @@ -12293,7 +12295,7 @@ static const qsig_err_t qsig_err_tab[] = { /* unspecified */ { 1008, dissect_qsig_mid_Extension_PDU }, /*--- End of included file: packet-qsig-table21.c ---*/ -#line 338 "packet-qsig-template.c" +#line 340 "packet-qsig-template.c" }; static const qsig_op_t *get_op(gint32 opcode) { @@ -12338,10 +12340,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); @@ -12535,6 +12542,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) { @@ -15808,7 +15840,7 @@ void proto_register_qsig(void) { "qsig.Extension", HFILL }}, /*--- End of included file: packet-qsig-hfarr.c ---*/ -#line 615 "packet-qsig-template.c" +#line 647 "packet-qsig-template.c" }; /* List of subtrees */ @@ -16259,7 +16291,7 @@ void proto_register_qsig(void) { &ett_qsig_mid_SEQUENCE_OF_Extension, /*--- End of included file: packet-qsig-ettarr.c ---*/ -#line 623 "packet-qsig-template.c" +#line 655 "packet-qsig-template.c" }; /* Register protocol and dissector */ @@ -16271,12 +16303,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; @@ -16290,6 +16326,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++) { |