aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-diameter.c
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss.ws@gmail.com>2016-04-12 23:01:18 -0400
committerAnders Broman <a.broman58@gmail.com>2016-04-24 06:47:07 +0000
commit43df65a29c3901b6a9f2757deda0c8a8c2d69e89 (patch)
tree8b64e98efa3a7aa0314de44a8704a342e582f27f /epan/dissectors/packet-diameter.c
parentdc3aa26dd3acbe76d4dd91910d03927776db8eb1 (diff)
Delay registration of Diameter fields until they're needed.
... Like the RADIUS and wimaxasncp dissectors do. Change-Id: Ifab019a0040d3938e52918a282a3beba9dfcfc70 Reviewed-on: https://code.wireshark.org/review/14900 Petri-Dish: Jeff Morriss <jeff.morriss.ws@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-diameter.c')
-rw-r--r--epan/dissectors/packet-diameter.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index 012e21fa02..e47a8730f5 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -1194,6 +1194,8 @@ static const int *diameter_flags_fields[] = {
NULL
};
+static void register_diameter_fields(const char *);
+
static int
dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
@@ -1217,6 +1219,9 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
nstime_t ns;
diam_sub_dis_t *diam_sub_dis_inf = wmem_new0(wmem_packet_scope(), diam_sub_dis_t);
+ /* Load header fields if not already done */
+ if (hf_diameter_code == -1)
+ register_diameter_fields("");
diam_sub_dis_inf->application_id = tvb_get_ntohl(tvb,8);
@@ -2111,13 +2116,12 @@ dictionary_load(void)
}
/*
- * This does most of the registration work; see proto_register_diameter()
+ * This does most of the registration work; see register_diameter_fields()
* for the reason why we split it off.
*/
static void
-real_proto_register_diameter(void)
+real_register_diameter_fields(void)
{
- module_t *diameter_module;
expert_module_t* expert_diameter;
guint i, ett_length;
@@ -2271,8 +2275,6 @@ real_proto_register_diameter(void)
g_ptr_array_add(build_dict.ett, ett_base[i]);
}
- proto_diameter = proto_register_protocol ("Diameter Protocol", "DIAMETER", "diameter");
-
proto_register_field_array(proto_diameter, (hf_register_info *)wmem_array_get_raw(build_dict.hf), wmem_array_get_count(build_dict.hf));
proto_register_subtree_array((gint **)build_dict.ett->pdata, build_dict.ett->len);
expert_diameter = expert_register_protocol(proto_diameter);
@@ -2280,9 +2282,37 @@ real_proto_register_diameter(void)
g_ptr_array_free(build_dict.ett,TRUE);
+}
+
+static void
+register_diameter_fields(const char *unused _U_)
+{
+ /*
+ * The hf_base[] array for Diameter refers to a variable
+ * that is set by dictionary_load(), so we need to call
+ * dictionary_load() before hf_base[] is initialized.
+ *
+ * To ensure that, we call dictionary_load() and then
+ * call a routine that defines hf_base[] and does all
+ * the registration work.
+ */
+ dictionary_load();
+ real_register_diameter_fields();
+}
+
+void
+proto_register_diameter(void)
+{
+ module_t *diameter_module;
+
+ proto_diameter = proto_register_protocol ("Diameter Protocol", "DIAMETER", "diameter");
+
/* Allow dissector to find be found by name. */
register_dissector("diameter", dissect_diameter, proto_diameter);
+ /* Delay registration of Diameter fields */
+ proto_register_prefix("diameter", register_diameter_fields);
+
/* Register dissector table(s) to do sub dissection of AVPs (OctetStrings) */
diameter_dissector_table = register_dissector_table("diameter.base", "DIAMETER_BASE_AVPS", proto_diameter, FT_UINT32, BASE_DEC, DISSECTOR_TABLE_ALLOW_DUPLICATE);
diameter_3gpp_avp_dissector_table = register_dissector_table("diameter.3gpp", "DIAMETER_3GPP_AVPS", proto_diameter, FT_UINT32, BASE_DEC, DISSECTOR_TABLE_ALLOW_DUPLICATE);
@@ -2338,22 +2368,7 @@ real_proto_register_diameter(void)
diameter_tap = register_tap("diameter");
register_srt_table(proto_diameter, NULL, 1, diameterstat_packet, diameterstat_init, NULL);
-}
-void
-proto_register_diameter(void)
-{
- /*
- * The hf_base[] array for Diameter refers to a variable
- * that is set by dictionary_load(), so we need to call
- * dictionary_load() before hf_base[] is initialized.
- *
- * To ensure that, we call dictionary_load() and then
- * call a routine that defines hf_base[] and does all
- * the registration work.
- */
- dictionary_load();
- real_proto_register_diameter();
} /* proto_register_diameter */
void