checkAPIs.pl: support for new-style dissectors in check_hf_entries
[metze/wireshark/wip.git] / epan / sequence_analysis.h
1 /* sequence-analysis.h
2  * Flow sequence analysis
3  *
4  * Copied from gtk/graph_analysis.h
5  *
6  * Copyright 2004, Verso Technologies Inc.
7  * By Alejandro Vaquero <alejandrovaquero@yahoo.com>
8  *
9  * based on rtp_analysis.c and io_stat
10  *
11  *
12  * Wireshark - Network traffic analyzer
13  * By Gerald Combs <gerald@wireshark.org>
14  * Copyright 1998 Gerald Combs
15  *
16  * SPDX-License-Identifier: GPL-2.0-or-later
17  */
18
19 #ifndef __EPAN_SEQUENCE_ANALYSIS_H__
20 #define __EPAN_SEQUENCE_ANALYSIS_H__
21
22 #include "ws_symbol_export.h"
23
24 #include <glib.h>
25
26 #include "packet_info.h"
27 #include "tap.h"
28 #include "address.h"
29 #include "wsutil/file_util.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif /* __cplusplus */
34
35 #define MAX_NUM_NODES 40
36
37 /** defines an entry for the graph analysis */
38 typedef struct _seq_analysis_item {
39     guint32 frame_number;
40     address src_addr;
41     guint16 port_src;
42     address dst_addr;
43     guint16 port_dst;
44     gchar *frame_label;                 /**< the label on top of the arrow */
45     gchar *time_str;                    /**< timestamp */
46     gchar *comment;                     /**< a comment that appears at the right of the graph */
47     guint16 conv_num;                   /**< The conversation number. Used for coloring VoIP calls. */
48     unsigned fg_color;                  /**< Foreground color, 0xRRGGBB. Qt only. */
49     unsigned bg_color;                  /**< Background color, 0xRRGGBB. Qt only. */
50     gboolean has_color_filter;          /**< Set if packet has color filter. Qt only. */
51     gboolean display;                   /**< indicate if the packet is displayed or not in the graph */
52     guint src_node;                     /**< this is used by graph_analysis.c to identify the node */
53     guint dst_node;                     /**< a node is an IP address that will be displayed in columns */
54     guint16 line_style;                 /**< the arrow line width in pixels*/
55 } seq_analysis_item_t;
56
57 /** defines the graph analysis structure */
58 typedef struct _seq_analysis_info {
59     const char* name;  /**< Name of sequence analysis */
60     gboolean    any_addr;    /**< any addr (DL+net) vs net-only */
61     int         nconv;       /**< number of conversations in the list */
62     GQueue*     items;       /**< list of seq_analysis_info_t */
63     GHashTable *ht;          /**< hash table of seq_analysis_info_t */
64     address nodes[MAX_NUM_NODES]; /**< horizontal node list */
65     guint32 num_nodes;       /**< actual number of nodes */
66 } seq_analysis_info_t;
67
68 /** Structure for information about a registered sequence analysis function */
69 typedef struct register_analysis register_analysis_t;
70
71 #if 0
72 #define SEQ_ANALYSIS_DEBUG(...) { \
73     char *SEQ_ANALYSIS_DEBUG_MSG = g_strdup_printf(__VA_ARGS__); \
74     g_warning("sequence analysis: %s:%d %s", G_STRFUNC, __LINE__, SEQ_ANALYSIS_DEBUG_MSG); \
75     g_free(SEQ_ANALYSIS_DEBUG_MSG); \
76 }
77 #else
78 #define SEQ_ANALYSIS_DEBUG()
79 #endif
80
81 WS_DLL_PUBLIC void register_seq_analysis(const char* name, const char* ui_name, const int proto_id, const char* tap_listener, guint tap_flags, tap_packet_cb tap_func);
82
83 /** Helper function to get sequence analysis name
84  *
85  * @param analysis Registered sequence analysis
86  * @return sequence analysis name string
87  */
88 WS_DLL_PUBLIC const char* sequence_analysis_get_name(register_analysis_t* analysis);
89
90 /** Helper function to get tap listener name
91  *
92  * @param analysis Registered sequence analysis
93  * @return sequence analysis tap listener string
94  */
95 WS_DLL_PUBLIC const char* sequence_analysis_get_tap_listener_name(register_analysis_t* analysis);
96
97 /** Helper function to get UI name
98  *
99  * @param analysis Registered sequence analysis
100  * @return sequence analysis UI string
101  */
102 WS_DLL_PUBLIC const char* sequence_analysis_get_ui_name(register_analysis_t* analysis);
103
104 /** Get tap function handler from sequence analysis
105  *
106  * @param analysis Registered sequence analysis
107  * @return tap function handler of sequence analysis
108  */
109 WS_DLL_PUBLIC tap_packet_cb sequence_analysis_get_packet_func(register_analysis_t* analysis);
110
111 /** Helper function to get tap flags
112  *
113  * @param analysis Registered sequence analysis
114  * @return sequence analysis tap flags
115  */
116 WS_DLL_PUBLIC guint sequence_analysis_get_tap_flags(register_analysis_t* analysis);
117
118 /** Helper function to create a sequence analysis item with address fields populated
119  * Allocate a seq_analysis_item_t to return and populate the time_str and src_addr and dst_addr
120  * members based on seq_analysis_info_t any_addr member
121  *
122  * @param pinfo packet info
123  * @param sainfo info determining address type
124  * @return sequence analysis tap flags
125  */
126 WS_DLL_PUBLIC seq_analysis_item_t* sequence_analysis_create_sai_with_addresses(packet_info *pinfo, seq_analysis_info_t *sainfo);
127
128 /** Helper function to set colors for analysis the same as Wireshark display
129  *
130  * @param pinfo packet info
131  * @param sai item to set color
132  */
133 WS_DLL_PUBLIC void sequence_analysis_use_color_filter(packet_info *pinfo, seq_analysis_item_t *sai);
134
135 /** Helper function to set frame label and comments to use protocol and info column data
136  *
137  * @param pinfo packet info
138  * @param sai item to set label and comments
139  */
140 WS_DLL_PUBLIC void sequence_analysis_use_col_info_as_label_comment(packet_info *pinfo, seq_analysis_item_t *sai);
141
142 /** Find a registered sequence analysis "protocol" by name
143  *
144  * @param name Registered sequence analysis to find
145  * @return registered sequence analysis, NULL if not found
146  */
147 WS_DLL_PUBLIC register_analysis_t* sequence_analysis_find_by_name(const char* name);
148
149 /** Interator to walk sequence_analysis tables and execute func
150  *
151  * @param func action to be performed on all sequence_analysis tables
152  * @param user_data any data needed to help perform function
153  */
154 WS_DLL_PUBLIC void sequence_analysis_table_iterate_tables(wmem_foreach_func func, gpointer user_data);
155
156 /** Create and initialize a seq_analysis_info_t struct
157  * @return A pointer to a newly allocated seq_analysis_info_t struct.
158  */
159 WS_DLL_PUBLIC seq_analysis_info_t *sequence_analysis_info_new(void);
160
161 /** Free a seq_analysis_info_t struct.
162  * @param sainfo A pointer to the seq_analysis_info_t struct to be freed.
163  */
164 WS_DLL_PUBLIC void sequence_analysis_info_free(seq_analysis_info_t * sainfo);
165
166 /** Sort a seq_analysis_info_t struct.
167  * @param sainfo A pointer to the seq_analysis_info_t struct to be sorted
168  */
169 WS_DLL_PUBLIC void sequence_analysis_list_sort(seq_analysis_info_t *sainfo);
170
171 /** Free the segment list
172  *
173  * @param sainfo Sequence analysis information.
174  */
175 WS_DLL_PUBLIC void sequence_analysis_list_free(seq_analysis_info_t *sainfo);
176
177 /** Fill in the node address list
178  *
179  * @param sainfo Sequence analysis information.
180  * @return The number of transaction items (not nodes) processed.
181  */
182 WS_DLL_PUBLIC int sequence_analysis_get_nodes(seq_analysis_info_t *sainfo);
183
184 /** Free the node address list
185  *
186  * @param sainfo Sequence analysis information.
187  */
188 WS_DLL_PUBLIC void sequence_analysis_free_nodes(seq_analysis_info_t *sainfo);
189
190
191 /** Write an ASCII version of the sequence diagram to a file.
192  *
193  * @param of File to write.
194  * @param sainfo Sequence analysis information.
195  * @param first_node Start drawing at this node.
196  */
197 WS_DLL_PUBLIC void sequence_analysis_dump_to_file(FILE *of, seq_analysis_info_t *sainfo, unsigned int first_node);
198
199 #ifdef __cplusplus
200 }
201 #endif /* __cplusplus */
202
203 #endif /* __EPAN_SEQUENCE_ANALYSIS_H__ */
204
205 /*
206  * Editor modelines
207  *
208  * Local Variables:
209  * c-basic-offset: 4
210  * tab-width: 8
211  * indent-tabs-mode: nil
212  * End:
213  *
214  * ex: set shiftwidth=4 tabstop=8 expandtab:
215  * :indentSize=4:tabSize=8:noTabs=true:
216  */