aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2018-09-14 12:58:35 -0700
committerPeter Wu <peter@lekensteyn.nl>2018-09-15 08:54:14 +0000
commit5dbc202063e75f543611f6389c71429c28e1bcc9 (patch)
treee7e9e91bfe50df3acffe8e9744ed1b9ce5e8d7b0
parent0dafb2bf8866ed4e6da7da6bbf7fdcf65257c75a (diff)
Add support for aliases to dissector tables.
Add register_dissector_table_alias, similar proto_register_alias. Add aliases for ssl.port, and ssl.handshake.extensions_alpn_str, and dtls.handshake.extensions_alpn_str. Change-Id: I87c3215e2872883ed0f581557e08c84f2dba12a0 Reviewed-on: https://code.wireshark.org/review/29652 Reviewed-by: Gerald Combs <gerald@wireshark.org> Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu <peter@lekensteyn.nl>
-rw-r--r--debian/libwireshark0.symbols1
-rw-r--r--epan/dissectors/packet-dtls.c2
-rw-r--r--epan/dissectors/packet-http.c2
-rw-r--r--epan/dissectors/packet-http2.c2
-rw-r--r--epan/dissectors/packet-ssl-utils.c2
-rw-r--r--epan/dissectors/packet-ssl.c3
-rw-r--r--epan/dissectors/packet-stun.c4
-rw-r--r--epan/dissectors/packet-turnchannel.c4
-rw-r--r--epan/packet.c53
-rw-r--r--epan/packet.h8
10 files changed, 71 insertions, 10 deletions
diff --git a/debian/libwireshark0.symbols b/debian/libwireshark0.symbols
index 75e93c0..b781343 100644
--- a/debian/libwireshark0.symbols
+++ b/debian/libwireshark0.symbols
@@ -1314,6 +1314,7 @@ libwireshark.so.0 libwireshark0 #MINVER#
register_depend_dissector@Base 2.1.0
register_dissector@Base 2.1.0
register_dissector_table@Base 1.9.1
+ register_dissector_table_alias@Base 2.9.0
register_dissector_with_data@Base 2.5.0
register_export_object@Base 2.3.0
register_export_pdu_tap@Base 1.99.0
diff --git a/epan/dissectors/packet-dtls.c b/epan/dissectors/packet-dtls.c
index c53ab64..9a9f08f 100644
--- a/epan/dissectors/packet-dtls.c
+++ b/epan/dissectors/packet-dtls.c
@@ -1936,7 +1936,7 @@ proto_register_dtls(void)
dtls_associations = register_dissector_table("dtls.port", "DTLS Port", proto_dtls, FT_UINT16, BASE_DEC);
- ssl_common_register_dtls_alpn_dissector_table("dtls.handshake.extensions_alpn_str",
+ ssl_common_register_dtls_alpn_dissector_table("dtls.alpn",
"DTLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs",
proto_dtls);
diff --git a/epan/dissectors/packet-http.c b/epan/dissectors/packet-http.c
index c61488b..0f7fccd 100644
--- a/epan/dissectors/packet-http.c
+++ b/epan/dissectors/packet-http.c
@@ -4148,7 +4148,7 @@ proto_reg_handoff_http(void)
* SSL/TLS Application-Layer Protocol Negotiation (ALPN) protocol
* ID.
*/
- dissector_add_string("tls.handshake.extensions_alpn_str", "http/1.1", http_tls_handle);
+ dissector_add_string("tls.alpn", "http/1.1", http_tls_handle);
ntlmssp_handle = find_dissector_add_dependency("ntlmssp", proto_http);
gssapi_handle = find_dissector_add_dependency("gssapi", proto_http);
diff --git a/epan/dissectors/packet-http2.c b/epan/dissectors/packet-http2.c
index 30ca095..2713060 100644
--- a/epan/dissectors/packet-http2.c
+++ b/epan/dissectors/packet-http2.c
@@ -3349,7 +3349,7 @@ proto_reg_handoff_http2(void)
/*
* SSL/TLS Application-Layer Protocol Negotiation (ALPN) protocol ID.
*/
- dissector_add_string("tls.handshake.extensions_alpn_str", "h2", http2_handle);
+ dissector_add_string("tls.alpn", "h2", http2_handle);
dissector_add_string("http.upgrade", "h2", http2_handle);
dissector_add_string("http.upgrade", "h2c", http2_handle);
diff --git a/epan/dissectors/packet-ssl-utils.c b/epan/dissectors/packet-ssl-utils.c
index 870c760..bbf85c4 100644
--- a/epan/dissectors/packet-ssl-utils.c
+++ b/epan/dissectors/packet-ssl-utils.c
@@ -8767,6 +8767,7 @@ ssl_common_register_ssl_alpn_dissector_table(const char *name,
{
ssl_alpn_dissector_table = register_dissector_table(name, ui_name,
proto, FT_STRING, FALSE);
+ register_dissector_table_alias(ssl_alpn_dissector_table, "ssl.handshake.extensions_alpn_str");
}
void
@@ -8775,6 +8776,7 @@ ssl_common_register_dtls_alpn_dissector_table(const char *name,
{
dtls_alpn_dissector_table = register_dissector_table(name, ui_name,
proto, FT_STRING, FALSE);
+ register_dissector_table_alias(ssl_alpn_dissector_table, "dtls.handshake.extensions_alpn_str");
}
void
diff --git a/epan/dissectors/packet-ssl.c b/epan/dissectors/packet-ssl.c
index 9c58c0f..8bbd9d3 100644
--- a/epan/dissectors/packet-ssl.c
+++ b/epan/dissectors/packet-ssl.c
@@ -4572,6 +4572,7 @@ proto_register_tls(void)
"TLS", "tls");
ssl_associations = register_dissector_table("tls.port", "TLS Port", proto_tls, FT_UINT16, BASE_DEC);
+ register_dissector_table_alias(ssl_associations, "ssl.port");
/* Required function calls to register the header fields and
* subtrees used */
@@ -4647,7 +4648,7 @@ proto_register_tls(void)
/* heuristic dissectors for any premable e.g. CredSSP before RDP */
ssl_heur_subdissector_list = register_heur_dissector_list("tls", proto_tls);
- ssl_common_register_ssl_alpn_dissector_table("tls.handshake.extensions_alpn_str",
+ ssl_common_register_ssl_alpn_dissector_table("tls.alpn",
"SSL/TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs",
proto_tls);
diff --git a/epan/dissectors/packet-stun.c b/epan/dissectors/packet-stun.c
index 49a5b0d..a688f30 100644
--- a/epan/dissectors/packet-stun.c
+++ b/epan/dissectors/packet-stun.c
@@ -1735,8 +1735,8 @@ proto_reg_handoff_stun(void)
* SSL/TLS and DTLS Application-Layer Protocol Negotiation (ALPN)
* protocol ID.
*/
- dissector_add_string("tls.handshake.extensions_alpn_str", "stun.nat-discovery", stun_tcp_handle);
- dissector_add_string("dtls.handshake.extensions_alpn_str", "stun.nat-discovery", stun_udp_handle);
+ dissector_add_string("tls.alpn", "stun.nat-discovery", stun_tcp_handle);
+ dissector_add_string("dtls.alpn", "stun.nat-discovery", stun_udp_handle);
heur_dissector_add("udp", dissect_stun_heur, "STUN over UDP", "stun_udp", proto_stun, HEURISTIC_ENABLE);
diff --git a/epan/dissectors/packet-turnchannel.c b/epan/dissectors/packet-turnchannel.c
index 313b4f3..d757cfc 100644
--- a/epan/dissectors/packet-turnchannel.c
+++ b/epan/dissectors/packet-turnchannel.c
@@ -206,8 +206,8 @@ proto_reg_handoff_turnchannel(void)
* SSL/TLS and DTLS Application-Layer Protocol Negotiation (ALPN)
* protocol ID.
*/
- dissector_add_string("tls.handshake.extensions_alpn_str", "stun.turn", turnchannel_tcp_handle);
- dissector_add_string("dtls.handshake.extensions_alpn_str", "stun.turn", turnchannel_udp_handle);
+ dissector_add_string("tls.alpn", "stun.turn", turnchannel_tcp_handle);
+ dissector_add_string("dtls.alpn", "stun.turn", turnchannel_udp_handle);
/* TURN negotiation is handled through STUN2 dissector (packet-stun.c),
so only it should be able to determine if a packet is a TURN packet */
diff --git a/epan/packet.c b/epan/packet.c
index a63cbf6..538b93e 100644
--- a/epan/packet.c
+++ b/epan/packet.c
@@ -91,9 +91,17 @@ struct dissector_table {
gboolean supports_decode_as;
};
+/*
+ * Dissector tables. const char * -> dissector_table *
+ */
static GHashTable *dissector_tables = NULL;
/*
+ * Dissector table aliases. const char * -> const char *
+ */
+static GHashTable *dissector_table_aliases = NULL;
+
+/*
* List of registered dissectors.
*/
static GHashTable *registered_dissectors = NULL;
@@ -191,6 +199,9 @@ packet_init(void)
dissector_tables = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, destroy_dissector_table);
+ dissector_table_aliases = g_hash_table_new_full(g_str_hash, g_str_equal,
+ NULL, NULL);
+
registered_dissectors = g_hash_table_new_full(g_str_hash, g_str_equal,
NULL, NULL);
@@ -243,6 +254,7 @@ packet_cleanup(void)
g_slist_free(cleanup_routines);
g_slist_free(postseq_cleanup_routines);
g_hash_table_destroy(dissector_tables);
+ g_hash_table_destroy(dissector_table_aliases);
g_hash_table_destroy(registered_dissectors);
g_hash_table_destroy(depend_dissector_lists);
g_hash_table_destroy(heur_dissector_lists);
@@ -914,7 +926,17 @@ struct dtbl_entry {
dissector_table_t
find_dissector_table(const char *name)
{
- return (dissector_table_t)g_hash_table_lookup(dissector_tables, name);
+ dissector_table_t dissector_table = (dissector_table_t) g_hash_table_lookup(dissector_tables, name);
+ if (! dissector_table) {
+ const char *new_name = (const char *) g_hash_table_lookup(dissector_table_aliases, name);
+ if (new_name) {
+ dissector_table = (dissector_table_t) g_hash_table_lookup(dissector_tables, new_name);
+ }
+ if (dissector_table) {
+ g_warning("%s is now %s", name, new_name);
+ }
+ }
+ return dissector_table;
}
/* Find an entry in a uint dissector table. */
@@ -2468,12 +2490,39 @@ dissector_table_t register_custom_dissector_table(const char *name,
}
void
+register_dissector_table_alias(dissector_table_t dissector_table, const char *alias_name) {
+ if (!dissector_table || !alias_name) return;
+
+ const char *name = NULL;
+ GList *list = g_hash_table_get_keys(dissector_tables);
+ for (GList *cur = list; cur; cur = cur->next) {
+ if (g_hash_table_lookup(dissector_tables, cur->data) == dissector_table) {
+ name = (const char *) cur->data;
+ break;
+ }
+ }
+ g_list_free(list);
+ if (!name) return;
+
+ g_hash_table_insert(dissector_table_aliases, (gpointer) alias_name, (gpointer) name);
+}
+
+void
deregister_dissector_table(const char *name)
{
- dissector_table_t sub_dissectors = find_dissector_table(name);
+ dissector_table_t sub_dissectors = (dissector_table_t) g_hash_table_lookup(dissector_tables, name);
if (!sub_dissectors) return;
g_hash_table_remove(dissector_tables, name);
+
+ GList *list = g_hash_table_get_keys(dissector_table_aliases);
+ for (GList *cur = list; cur; cur = cur->next) {
+ gpointer alias_name = cur->data;
+ if (g_hash_table_lookup(dissector_table_aliases, alias_name) == name) {
+ g_hash_table_remove(dissector_table_aliases, alias_name);
+ }
+ }
+ g_list_free(list);
}
const char *
diff --git a/epan/packet.h b/epan/packet.h
index 6f78640..e2f9e32 100644
--- a/epan/packet.h
+++ b/epan/packet.h
@@ -179,6 +179,14 @@ WS_DLL_PUBLIC dissector_table_t register_dissector_table(const char *name,
WS_DLL_PUBLIC dissector_table_t register_custom_dissector_table(const char *name,
const char *ui_name, const int proto, GHashFunc hash_func, GEqualFunc key_equal_func);
+/** Register a dissector table alias.
+ * This is for dissectors whose original name has changed, e.g. SSL to TLS.
+ * @param dissector_table_t dissector table returned by register_dissector_table.
+ * @param alias_name alias for the dissector table name.
+ */
+WS_DLL_PUBLIC void register_dissector_table_alias(dissector_table_t dissector_table,
+ const char *alias_name);
+
/** Deregister the dissector table by table name. */
void deregister_dissector_table(const char *name);