Ethereal-dev: [Ethereal-dev] [Patch] to packet-diameter.c

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Martin Mathieson <martin.mathieson@xxxxxxxxxxxx>
Date: Tue, 14 Mar 2006 14:03:03 +0000
Hi,

This patch:
- makes it possible to turn off use of the XML AVP dictionary (which relies upon the XML lib being installed). A failed load results in 3 annoying dialogs popping up the first time a diameter packet is read. Default is previous behaviour. - fixes an error % specifier to show the (Application Identifier) string properly

Regards,
Martin Mathieson

Index: epan/dissectors/packet-diameter.c
===================================================================
--- epan/dissectors/packet-diameter.c	(revision 17626)
+++ epan/dissectors/packet-diameter.c	(working copy)
@@ -246,6 +246,7 @@
 /* Suppress console output at unknown AVP:s,Flags etc */
 static gboolean suppress_console_output = TRUE;
 
+static gboolean gbl_use_xml_dictionary = TRUE;
 #define DICT_FN  "diameter/dictionary.xml"
 static const gchar *gbl_diameterDictionary;
 
@@ -665,7 +666,7 @@
   ApplicationId *entry;
 
   if (!name || (id == 0 && !allow_zero_as_app_id)) {
-	report_failure( "Diameter Error: Invalid application (name=%p, id=%d)",
+	report_failure( "Diameter Error: Invalid application (name=%s, id=%d)",
 			   name, id);
 	return (-1);
   } /* Sanity Checks */
@@ -918,9 +919,9 @@
 } /* initializeDictionaryDefaults */
 
 /*
- * This routine will attempt to load the XML dictionary, and on
- * failure, will call initializeDictionaryDefaults to load in
- * our static dictionary.
+ * This routine will attempt to load the XML dictionary if configured to.
+ * Otherwise, or if load fails, it will call initializeDictionaryDefaults
+ * to load in our static dictionary instead.
  */
 static void
 initializeDictionary(void)
@@ -930,12 +931,17 @@
    * loadXMLDictionary will be called.  This is one of the few times when
    * I think this is prettier than the nested if alternative.
    */
-  if (loadLibXML() ||
-	  (loadXMLDictionary() != 0)) {
-	/* Something failed.  Use the static dictionary */
-	report_failure("Diameter: Using static dictionary! (Unable to use XML)");
-	initializeDictionaryDefaults();
-  }
+   if (gbl_use_xml_dictionary) {
+      if (loadLibXML() || (loadXMLDictionary() != 0)) {
+	     /* Something failed.  Use the static dictionary */
+	     report_failure("Diameter: Using static dictionary! (Unable to use XML)");
+	     initializeDictionaryDefaults();
+      }
+   }
+   else {
+      initializeDictionaryDefaults();
+   }
+
 } /* initializeDictionary */
 
 
@@ -2224,7 +2230,7 @@
 	diameter_module = prefs_register_protocol(proto_diameter,
 											  proto_reg_handoff_diameter);
 	/* Register a configuration option for Diameter version */
-  prefs_register_enum_preference(diameter_module, "version", "Diameter version", "Standard version used for decoding", (gint *)&gbl_version, options, FALSE);
+	prefs_register_enum_preference(diameter_module, "version", "Diameter version", "Standard version used for decoding", (gint *)&gbl_version, options, FALSE);
 
 	prefs_register_uint_preference(diameter_module, "tcp.port",
 								   "Diameter TCP Port",
@@ -2258,6 +2264,16 @@
 	 */
 	g_free(default_diameterDictionary);
 
+	/*
+	 * Make use of the dictionary optional.  Avoids error popups if xml library
+	 * or dictionary file aren't available.
+	 */
+	prefs_register_bool_preference(diameter_module, "dictionary.use",
+	                               "Attempt to load/use Diameter XML Dictionary",
+	                               "Only attempt to load and use the Diameter XML\n"
+	                               "Dictionary when this option is selected",
+	                               &gbl_use_xml_dictionary);
+
 	/* Desegmentation */
 	prefs_register_bool_preference(diameter_module, "desegment",
                                    "Reassemble Diameter messages\nspanning multiple TCP segments",