diff --git a/epan/conversation_filter.c b/epan/conversation_filter.c index 314041b430..0eea70398e 100644 --- a/epan/conversation_filter.c +++ b/epan/conversation_filter.c @@ -17,10 +17,10 @@ #include "conversation_filter.h" -GList *conv_filter_list = NULL; +GList *packet_conv_filter_list = NULL; +GList *log_conv_filter_list = NULL; - -static void do_register_conversation_filter(const char *proto_name, const char *display_name, +static void do_register_conversation_filter(GList **conv_filter_list, const char *proto_name, const char *display_name, is_filter_valid_func is_filter_valid, build_filter_string_func build_filter_string) { conversation_filter_t *entry; @@ -31,12 +31,13 @@ static void do_register_conversation_filter(const char *proto_name, const char * entry->is_filter_valid = is_filter_valid; entry->build_filter_string = build_filter_string; - conv_filter_list = g_list_append(conv_filter_list, entry); + *conv_filter_list = g_list_append(*conv_filter_list, entry); } void register_conversation_filter(const char *proto_name, const char *display_name, is_filter_valid_func is_filter_valid, build_filter_string_func build_filter_string) { - do_register_conversation_filter(proto_name, + do_register_conversation_filter(&packet_conv_filter_list, + proto_name, display_name, is_filter_valid, build_filter_string); @@ -44,13 +45,14 @@ void register_conversation_filter(const char *proto_name, const char *display_na void register_log_conversation_filter(const char *proto_name, const char *display_name, is_filter_valid_func is_filter_valid, build_filter_string_func build_filter_string) { - do_register_conversation_filter(proto_name, + do_register_conversation_filter(&log_conv_filter_list, + proto_name, display_name, is_filter_valid, build_filter_string); } -struct conversation_filter_s* find_conversation_filter(const char *name) +static struct conversation_filter_s* find_conversation_filter(GList *conv_filter_list, const char *name) { GList *list_entry = conv_filter_list; conversation_filter_t* filter; @@ -73,11 +75,13 @@ static void conversation_filter_free(gpointer p, gpointer user_data _U_) void conversation_filters_cleanup(void) { - g_list_foreach(conv_filter_list, conversation_filter_free, NULL); - g_list_free(conv_filter_list); + g_list_foreach(packet_conv_filter_list, conversation_filter_free, NULL); + g_list_free(packet_conv_filter_list); + g_list_foreach(log_conv_filter_list, conversation_filter_free, NULL); + g_list_free(log_conv_filter_list); } -gchar *conversation_filter_from_packet(struct _packet_info *pinfo) +static gchar *conversation_filter_from_pinfo(GList *conv_filter_list, struct _packet_info *pinfo) { const char *layers[] = { "tcp", "udp", "ip", "ipv6", "eth" }; conversation_filter_t *conv_filter; @@ -85,7 +89,7 @@ gchar *conversation_filter_from_packet(struct _packet_info *pinfo) size_t i; for (i = 0; i < G_N_ELEMENTS(layers); i++) { - conv_filter = find_conversation_filter(layers[i]); + conv_filter = find_conversation_filter(conv_filter_list, layers[i]); if (conv_filter && conv_filter->is_filter_valid(pinfo)) { if ((filter = conv_filter->build_filter_string(pinfo)) != NULL) return filter; @@ -95,6 +99,16 @@ gchar *conversation_filter_from_packet(struct _packet_info *pinfo) return NULL; } +gchar *conversation_filter_from_packet(struct _packet_info *pinfo) +{ + return conversation_filter_from_pinfo(packet_conv_filter_list, pinfo); +} + +gchar *conversation_filter_from_log(struct _packet_info *pinfo) +{ + return conversation_filter_from_pinfo(log_conv_filter_list, pinfo); +} + /* * Editor modelines - https://www.wireshark.org/tools/modelines.html * diff --git a/epan/conversation_filter.h b/epan/conversation_filter.h index d63f97d03a..e0286cbd66 100644 --- a/epan/conversation_filter.h +++ b/epan/conversation_filter.h @@ -36,8 +36,6 @@ WS_DLL_PUBLIC void register_conversation_filter(const char *proto_name, const ch WS_DLL_PUBLIC void register_log_conversation_filter(const char *proto_name, const char *display_name, is_filter_valid_func is_filter_valid, build_filter_string_func build_filter_string); -WS_DLL_PUBLIC struct conversation_filter_s* find_conversation_filter(const char *proto_name); - /* Cleanup internal structures */ extern void conversation_filters_cleanup(void); @@ -46,10 +44,21 @@ extern void conversation_filters_cleanup(void); * packet. More specific matches are tried first (like TCP ports) followed by * less specific ones (IP addresses). NULL is returned when no filter is found. * - * The returned filter should be freed with g_free. + * @param pinfo Packet info + * @return A display filter for the conversation. Should be freed with g_free. */ WS_DLL_PUBLIC gchar *conversation_filter_from_packet(struct _packet_info *pinfo); +/** + * Tries to build a suitable display filter for the conversation in the current + * log entry. More specific matches are tried first (like TCP ports) followed by + * less specific ones (IP addresses). NULL is returned when no filter is found. + * + * @param pinfo Packet info + * @return A display filter for the conversation. Should be freed with g_free. + */ +WS_DLL_PUBLIC gchar *conversation_filter_from_log(struct _packet_info *pinfo); + /*** THE FOLLOWING SHOULD NOT BE USED BY ANY DISSECTORS!!! ***/ typedef struct conversation_filter_s { @@ -59,7 +68,8 @@ typedef struct conversation_filter_s { build_filter_string_func build_filter_string; } conversation_filter_t; -WS_DLL_PUBLIC GList *conv_filter_list; +WS_DLL_PUBLIC GList *packet_conv_filter_list; +WS_DLL_PUBLIC GList *log_conv_filter_list; #ifdef __cplusplus } diff --git a/packaging/debian/libwireshark0.symbols b/packaging/debian/libwireshark0.symbols index 38cad5d976..e9e7d3f3c7 100644 --- a/packaging/debian/libwireshark0.symbols +++ b/packaging/debian/libwireshark0.symbols @@ -671,7 +671,6 @@ libwireshark.so.0 libwireshark0 #MINVER# find_conversation@Base 1.9.1 find_conversation_by_id@Base 2.5.0 find_conversation_pinfo@Base 2.5.0 - find_conversation_filter@Base 2.0.0 find_depend_dissector_list@Base 2.1.0 find_dissector@Base 1.9.1 find_dissector_add_dependency@Base 2.1.0 diff --git a/ui/qt/wireshark_main_window.cpp b/ui/qt/wireshark_main_window.cpp index fe8d1977c8..1cbe452b9d 100644 --- a/ui/qt/wireshark_main_window.cpp +++ b/ui/qt/wireshark_main_window.cpp @@ -2258,7 +2258,7 @@ void WiresharkMainWindow::initConversationMenus() << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8 << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10; - for (GList *conv_filter_list_entry = conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = gxx_list_next(conv_filter_list_entry)) { + for (GList *conv_filter_list_entry = packet_conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = gxx_list_next(conv_filter_list_entry)) { // Main menu items conversation_filter_t* conv_filter = gxx_list_data(conversation_filter_t *, conv_filter_list_entry); ConversationAction *conv_action = new ConversationAction(main_ui_->menuConversationFilter, conv_filter); diff --git a/ui/qt_logwolf/logwolf_main_window.cpp b/ui/qt_logwolf/logwolf_main_window.cpp index 2dc05389fd..c25f48fd83 100644 --- a/ui/qt_logwolf/logwolf_main_window.cpp +++ b/ui/qt_logwolf/logwolf_main_window.cpp @@ -2237,7 +2237,7 @@ void LogwolfMainWindow::initConversationMenus() << main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8 << main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10; - for (GList *conv_filter_list_entry = conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = gxx_list_next(conv_filter_list_entry)) { + for (GList *conv_filter_list_entry = log_conv_filter_list; conv_filter_list_entry; conv_filter_list_entry = gxx_list_next(conv_filter_list_entry)) { // Main menu items conversation_filter_t* conv_filter = gxx_list_data(conversation_filter_t *, conv_filter_list_entry); ConversationAction *conv_action = new ConversationAction(main_ui_->menuConversationFilter, conv_filter); diff --git a/ui/qt_logwolf/logwolf_main_window_slots.cpp b/ui/qt_logwolf/logwolf_main_window_slots.cpp index e3438b3918..0cb33a50b3 100644 --- a/ui/qt_logwolf/logwolf_main_window_slots.cpp +++ b/ui/qt_logwolf/logwolf_main_window_slots.cpp @@ -3465,7 +3465,7 @@ void LogwolfMainWindow::goToConversationFrame(bool go_next) { /* Try to build a conversation * filter in the order TCP, UDP, IP, Ethernet and apply the * coloring */ - filter = conversation_filter_from_packet(pi); + filter = conversation_filter_from_log(pi); if (filter == NULL) { mainApp->pushStatus(WiresharkApplication::TemporaryStatus, tr("Unable to build conversation filter.")); g_free(filter);