aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-qsig.c
diff options
context:
space:
mode:
authorkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>2010-02-04 07:18:50 +0000
committerkukosa <kukosa@f5534014-38df-0310-8fa8-9805f1628bb7>2010-02-04 07:18:50 +0000
commitc6944ef66602e6ffc4051705f4b5cd2af3ac27f5 (patch)
treef337bfaf35f0a31ae364566d9a87e0d6a57fd842 /epan/dissectors/packet-qsig.c
parente1f1c1047587956e4f240ff972c2ba6aa4f4b7e0 (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.c58
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++) {