summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-media.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-media.c')
-rw-r--r--epan/dissectors/packet-media.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/epan/dissectors/packet-media.c b/epan/dissectors/packet-media.c
index e4c3154c..6a06ad83 100644
--- a/epan/dissectors/packet-media.c
+++ b/epan/dissectors/packet-media.c
@@ -24,19 +24,40 @@
void proto_register_media(void);
-static int proto_media = -1;
-static gint hf_media_type = -1;
-static gint ett_media = -1;
+static int proto_media;
+static int hf_media_type;
+static int ett_media;
static heur_dissector_list_t heur_subdissector_list;
+static dissector_table_t media_type_suffix_table;
static int
-dissect_media(tvbuff_t *tvb, packet_info *pinfo , proto_tree *tree, void* data)
+dissect_media(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
{
int bytes;
proto_item *ti;
proto_tree *media_tree = 0;
media_content_info_t *content_info = (media_content_info_t *)data;
heur_dtbl_entry_t *hdtbl_entry;
+ char* suffix;
+
+ /* XXX - Should we move the other media_type table here, and have
+ * dissectors always call this dissector instead of invoking the table,
+ * similar to the Ethertype dissector?
+ * It would make Decode As with Media Types easier.
+ */
+
+ /*
+ * RFC 6838 4.2 Naming Requirements
+ * "Characters after last plus always specify a structured syntax suffix"
+ */
+ if (pinfo->match_string &&
+ (suffix = strrchr(pinfo->match_string, '+'))) {
+
+ if ((bytes = dissector_try_string_new(media_type_suffix_table,
+ suffix + 1, tvb, pinfo, tree, true, data)) > 0) {
+ return bytes;
+ }
+ }
if (dissector_try_heuristic(heur_subdissector_list, tvb, pinfo, tree, &hdtbl_entry, data)) {
return tvb_reported_length(tvb);
@@ -80,7 +101,7 @@ proto_register_media(void)
FT_BYTES, BASE_NONE, NULL, 0,
NULL, HFILL }},
};
- static gint *ett[] = {
+ static int *ett[] = {
&ett_media
};
@@ -90,7 +111,7 @@ proto_register_media(void)
"media" /* abbrev */
);
register_dissector("media", dissect_media, proto_media);
- heur_subdissector_list = register_heur_dissector_list("media", proto_media);
+ heur_subdissector_list = register_heur_dissector_list_with_description("media", "Media type", proto_media);
proto_register_field_array(proto_media, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
@@ -99,6 +120,15 @@ proto_register_media(void)
* is disabled, so it cannot itself be disabled.
*/
proto_set_cant_toggle(proto_media);
+
+ /*
+ * https://www.iana.org/assignments/media-type-structured-suffix/media-type-structured-suffix.xhtml
+ * Structured Suffixes ("zzz" in "xxx/yyy+zzz") can be used as fallback
+ * when the exact media type is not registered.
+ */
+ media_type_suffix_table = register_dissector_table("media_type.suffix",
+ "Internet media type structured suffix",
+ proto_media, FT_STRING, STRING_CASE_INSENSITIVE);
}
/*