summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2006-03-15 06:16:12 +0000
committerAnders Broman <anders.broman@ericsson.com>2006-03-15 06:16:12 +0000
commitc6a21a1d1473b31d288f80ba35010f7f80196df4 (patch)
treee73e365e9212858f8a52c0c295da26fbacbe51ec
parentc39b3330725220342d47d75514cc7c07355da4f1 (diff)
downloadwireshark-c6a21a1d1473b31d288f80ba35010f7f80196df4.tar.gz
From Martin Mathieson
>>>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. svn path=/trunk/; revision=17628
-rw-r--r--epan/dissectors/packet-diameter.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index 3f9054a249..09408383ae 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -246,6 +246,7 @@ static gboolean allow_zero_as_app_id = TRUE;
/* 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 @@ dictionaryAddApplication(char *name, guint32 id)
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 */
@@ -836,10 +837,12 @@ loadXMLDictionary(void)
XmlStub.xmlSubstituteEntitiesDefault(1); /* Substitute entities automagically */
doc = xmlParseFilePush(gbl_diameterDictionary, 1); /* Parse the XML (do validity checks)*/
- /* Check for invalid xml */
+ /* Check for invalid xml.
+ Note that xmlParseFilePush reports details of problems found,
+ and it should be obvious from the default filename that the error relates
+ to Diameter.
+ */
if (doc == NULL) {
- report_failure("Diameter: Unable to parse xmldictionary %s",
- gbl_diameterDictionary);
return -1;
}
@@ -918,9 +921,9 @@ initializeDictionaryDefaults(void)
} /* 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 +933,17 @@ initializeDictionary(void)
* 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 */
@@ -1207,6 +1215,8 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/*
* Only parse in dictionary if there are diameter packets to
* dissect.
+ * TODO: should keep track of preference settings and free/reinitialize the
+ * dictionary when appropriate.
*/
if (!initialized) {
/* Read in our dictionary, if it exists. */
@@ -2224,7 +2234,7 @@ proto_register_diameter(void)
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 +2268,16 @@ proto_register_diameter(void)
*/
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 "
+ "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",