From 686282083420f26a4e4584053fadbba568ef534f Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Sun, 9 Oct 2016 10:20:57 -0400 Subject: [PATCH] TCAP: Use a real dissector table to store dissector handles. Also cleanup ANSI TCAP dissector that had a commented out attempt at what was just cleaned up with TCAP. Change-Id: I347f11e21a493d8d444c2dc528bb7713a227381a Reviewed-on: https://code.wireshark.org/review/18129 Petri-Dish: Michael Mann Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann --- .../ansi_tcap/packet-ansi_tcap-template.c | 22 --------------- .../asn1/tcap/packet-tcap-template.c | 24 ++++++++-------- epan/dissectors/packet-ansi_tcap.c | 28 ++----------------- epan/dissectors/packet-tcap.c | 24 ++++++++-------- 4 files changed, 27 insertions(+), 71 deletions(-) diff --git a/epan/dissectors/asn1/ansi_tcap/packet-ansi_tcap-template.c b/epan/dissectors/asn1/ansi_tcap/packet-ansi_tcap-template.c index b66295974e..7721b91305 100644 --- a/epan/dissectors/asn1/ansi_tcap/packet-ansi_tcap-template.c +++ b/epan/dissectors/asn1/ansi_tcap/packet-ansi_tcap-template.c @@ -134,28 +134,6 @@ static const value_string ansi_tcap_national_op_code_family_vals[] = { { 0, NULL } }; -/* -static dissector_handle_t tcap_handle = NULL; -static dissector_table_t sccp_ssn_table; - -static GHashTable* ansi_sub_dissectors = NULL; -static GHashTable* itu_sub_dissectors = NULL; - - extern void add_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { - g_hash_table_insert(ansi_sub_dissectors,GUINT_TO_POINTER(ssn),dissector); - dissector_add_uint("sccp.ssn",ssn,tcap_handle); -} - -extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) { - g_hash_table_remove(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); - dissector_delete_uint("sccp.ssn",ssn,tcap_handle); -} - -dissector_handle_t get_ansi_tcap_subdissector(guint32 ssn) { - return g_hash_table_lookup(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); -} -*/ - /* Transaction tracking */ /* Transaction table */ struct ansi_tcap_invokedata_t { diff --git a/epan/dissectors/asn1/tcap/packet-tcap-template.c b/epan/dissectors/asn1/tcap/packet-tcap-template.c index 91cfd5a825..e64e57de8e 100644 --- a/epan/dissectors/asn1/tcap/packet-tcap-template.c +++ b/epan/dissectors/asn1/tcap/packet-tcap-template.c @@ -121,36 +121,36 @@ static void raz_tcap_private(struct tcap_private_t * p_tcap_private); static int dissect_tcap_param(asn1_ctx_t *actx, proto_tree *tree, tvbuff_t *tvb, int offset); static int dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_); -static GHashTable* ansi_sub_dissectors = NULL; -static GHashTable* itu_sub_dissectors = NULL; +static dissector_table_t ansi_sub_dissectors = NULL; +static dissector_table_t itu_sub_dissectors = NULL; extern void add_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { - g_hash_table_insert(ansi_sub_dissectors,GUINT_TO_POINTER(ssn),dissector); + dissector_add_uint("ansi_tcap.ssn",ssn,dissector); dissector_add_uint("sccp.ssn",ssn,tcap_handle); } extern void add_itu_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { - g_hash_table_insert(itu_sub_dissectors,GUINT_TO_POINTER(ssn),dissector); + dissector_add_uint("itu_tcap.ssn",ssn,dissector); dissector_add_uint("sccp.ssn",ssn,tcap_handle); } -extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) { - g_hash_table_remove(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); +extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { + dissector_delete_uint("ansi_tcap.ssn",ssn,dissector); if (!get_itu_tcap_subdissector(ssn)) dissector_delete_uint("sccp.ssn",ssn,tcap_handle); } extern void delete_itu_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) { - g_hash_table_remove(itu_sub_dissectors,GUINT_TO_POINTER(ssn)); + dissector_delete_uint("itu_tcap.ssn",ssn,dissector); if (!get_ansi_tcap_subdissector(ssn)) dissector_delete_uint("sccp.ssn", ssn,tcap_handle); } dissector_handle_t get_ansi_tcap_subdissector(guint32 ssn) { - return (dissector_handle_t)g_hash_table_lookup(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); + return dissector_get_uint_handle(ansi_sub_dissectors, ssn); } dissector_handle_t get_itu_tcap_subdissector(guint32 ssn) { - return (dissector_handle_t)g_hash_table_lookup(itu_sub_dissectors,GUINT_TO_POINTER(ssn)); + return dissector_get_uint_handle(itu_sub_dissectors, ssn); } #include "packet-tcap-fn.c" @@ -2079,6 +2079,9 @@ proto_register_tcap(void) proto_register_field_array(proto_tcap, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); + ansi_sub_dissectors = register_dissector_table("ansi_tcap.ssn", "ANSI SSN", proto_tcap, FT_UINT8, BASE_DEC); + itu_sub_dissectors = register_dissector_table("itu_tcap.ssn", "ITU SSN", proto_tcap, FT_UINT8, BASE_DEC); + tcap_module = prefs_register_protocol(proto_tcap, NULL); #if 0 @@ -2124,9 +2127,6 @@ proto_register_tcap(void) "Maximal delay for message lost", 10, >cap_LostTimeout); - ansi_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal); - itu_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal); - /* 'globally' register dissector */ register_dissector("tcap", dissect_tcap, proto_tcap); diff --git a/epan/dissectors/packet-ansi_tcap.c b/epan/dissectors/packet-ansi_tcap.c index 54f04fcaad..4a79793ee8 100644 --- a/epan/dissectors/packet-ansi_tcap.c +++ b/epan/dissectors/packet-ansi_tcap.c @@ -225,28 +225,6 @@ static const value_string ansi_tcap_national_op_code_family_vals[] = { { 0, NULL } }; -/* -static dissector_handle_t tcap_handle = NULL; -static dissector_table_t sccp_ssn_table; - -static GHashTable* ansi_sub_dissectors = NULL; -static GHashTable* itu_sub_dissectors = NULL; - - extern void add_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { - g_hash_table_insert(ansi_sub_dissectors,GUINT_TO_POINTER(ssn),dissector); - dissector_add_uint("sccp.ssn",ssn,tcap_handle); -} - -extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) { - g_hash_table_remove(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); - dissector_delete_uint("sccp.ssn",ssn,tcap_handle); -} - -dissector_handle_t get_ansi_tcap_subdissector(guint32 ssn) { - return g_hash_table_lookup(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); -} -*/ - /* Transaction tracking */ /* Transaction table */ struct ansi_tcap_invokedata_t { @@ -1410,7 +1388,7 @@ dissect_ansi_tcap_PackageType(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int /*--- End of included file: packet-ansi_tcap-fn.c ---*/ -#line 353 "./asn1/ansi_tcap/packet-ansi_tcap-template.c" +#line 331 "./asn1/ansi_tcap/packet-ansi_tcap-template.c" @@ -1754,7 +1732,7 @@ proto_register_ansi_tcap(void) NULL, HFILL }}, /*--- End of included file: packet-ansi_tcap-hfarr.c ---*/ -#line 488 "./asn1/ansi_tcap/packet-ansi_tcap-template.c" +#line 466 "./asn1/ansi_tcap/packet-ansi_tcap-template.c" }; /* Setup protocol subtree array */ @@ -1792,7 +1770,7 @@ proto_register_ansi_tcap(void) &ett_ansi_tcap_T_paramSet, /*--- End of included file: packet-ansi_tcap-ettarr.c ---*/ -#line 499 "./asn1/ansi_tcap/packet-ansi_tcap-template.c" +#line 477 "./asn1/ansi_tcap/packet-ansi_tcap-template.c" }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-tcap.c b/epan/dissectors/packet-tcap.c index 0730f4e68e..fb7c30c72e 100644 --- a/epan/dissectors/packet-tcap.c +++ b/epan/dissectors/packet-tcap.c @@ -239,36 +239,36 @@ static void raz_tcap_private(struct tcap_private_t * p_tcap_private); static int dissect_tcap_param(asn1_ctx_t *actx, proto_tree *tree, tvbuff_t *tvb, int offset); static int dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_); -static GHashTable* ansi_sub_dissectors = NULL; -static GHashTable* itu_sub_dissectors = NULL; +static dissector_table_t ansi_sub_dissectors = NULL; +static dissector_table_t itu_sub_dissectors = NULL; extern void add_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { - g_hash_table_insert(ansi_sub_dissectors,GUINT_TO_POINTER(ssn),dissector); + dissector_add_uint("ansi_tcap.ssn",ssn,dissector); dissector_add_uint("sccp.ssn",ssn,tcap_handle); } extern void add_itu_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { - g_hash_table_insert(itu_sub_dissectors,GUINT_TO_POINTER(ssn),dissector); + dissector_add_uint("itu_tcap.ssn",ssn,dissector); dissector_add_uint("sccp.ssn",ssn,tcap_handle); } -extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) { - g_hash_table_remove(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); +extern void delete_ansi_tcap_subdissector(guint32 ssn, dissector_handle_t dissector) { + dissector_delete_uint("ansi_tcap.ssn",ssn,dissector); if (!get_itu_tcap_subdissector(ssn)) dissector_delete_uint("sccp.ssn",ssn,tcap_handle); } extern void delete_itu_tcap_subdissector(guint32 ssn, dissector_handle_t dissector _U_) { - g_hash_table_remove(itu_sub_dissectors,GUINT_TO_POINTER(ssn)); + dissector_delete_uint("itu_tcap.ssn",ssn,dissector); if (!get_ansi_tcap_subdissector(ssn)) dissector_delete_uint("sccp.ssn", ssn,tcap_handle); } dissector_handle_t get_ansi_tcap_subdissector(guint32 ssn) { - return (dissector_handle_t)g_hash_table_lookup(ansi_sub_dissectors,GUINT_TO_POINTER(ssn)); + return dissector_get_uint_handle(ansi_sub_dissectors, ssn); } dissector_handle_t get_itu_tcap_subdissector(guint32 ssn) { - return (dissector_handle_t)g_hash_table_lookup(itu_sub_dissectors,GUINT_TO_POINTER(ssn)); + return dissector_get_uint_handle(itu_sub_dissectors, ssn); } @@ -3664,6 +3664,9 @@ proto_register_tcap(void) proto_register_field_array(proto_tcap, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); + ansi_sub_dissectors = register_dissector_table("ansi_tcap.ssn", "ANSI SSN", proto_tcap, FT_UINT8, BASE_DEC); + itu_sub_dissectors = register_dissector_table("itu_tcap.ssn", "ITU SSN", proto_tcap, FT_UINT8, BASE_DEC); + tcap_module = prefs_register_protocol(proto_tcap, NULL); #if 0 @@ -3709,9 +3712,6 @@ proto_register_tcap(void) "Maximal delay for message lost", 10, >cap_LostTimeout); - ansi_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal); - itu_sub_dissectors = g_hash_table_new(g_direct_hash,g_direct_equal); - /* 'globally' register dissector */ register_dissector("tcap", dissect_tcap, proto_tcap);