Qt+epan: Get log conversation filters working.

In conversation_filter.h, add a separate log_conv_filter_list. Use it in
register_log_conversation_filter and add conversation_filter_from_log.
It looks like we no longer use find_conversation_filter externally, so
remove it from the API.
This commit is contained in:
Gerald Combs 2022-04-07 14:32:20 -07:00
parent 58e31a2e77
commit 4b556d6bc6
6 changed files with 42 additions and 19 deletions

View File

@ -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
*

View File

@ -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
}

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);