forked from osmocom/wireshark
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:
parent
58e31a2e77
commit
4b556d6bc6
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue