2 * A counter tree API for Wireshark dissectors
3 * 2005, Luis E. G. Ontanon
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
9 * SPDX-License-Identifier: GPL-2.0-or-later
11 #ifndef __STATS_TREE_H
12 #define __STATS_TREE_H
15 #include <epan/epan.h>
16 #include <epan/packet_info.h>
18 #include <epan/stat_groups.h>
19 #include "ws_symbol_export.h"
23 #endif /* __cplusplus */
25 #define STAT_TREE_ROOT "root"
27 #define ST_FLG_AVERAGE 0x10000000 /* Calculate averages for nodes, rather than totals */
28 #define ST_FLG_ROOTCHILD 0x20000000 /* This node is a direct child of the root node */
29 #define ST_FLG_DEF_NOEXPAND 0x01000000 /* This node should not be expanded by default */
30 #define ST_FLG_SORT_DESC 0x00800000 /* When sorting, sort ascending instead of decending */
31 #define ST_FLG_SORT_TOP 0x00400000 /* When sorting always keep these lines on of list */
32 #define ST_FLG_SRTCOL_MASK 0x000F0000 /* Mask for sort column ID */
33 #define ST_FLG_SRTCOL_SHIFT 16 /* Number of bits to shift masked result */
35 #define ST_FLG_MASK (ST_FLG_AVERAGE|ST_FLG_ROOTCHILD|ST_FLG_DEF_NOEXPAND| \
36 ST_FLG_SORT_TOP|ST_FLG_SORT_DESC|ST_FLG_SRTCOL_MASK)
38 #define ST_SORT_COL_NAME 1 /* Sort nodes by node names */
39 #define ST_SORT_COL_COUNT 2 /* Sort nodes by node count */
40 #define ST_SORT_COL_AVG 3 /* Sort nodes by node average */
41 #define ST_SORT_COL_MIN 4 /* Sort nodes by minimum node value */
42 #define ST_SORT_COL_MAX 5 /* Sort nodes by maximum node value */
43 #define ST_SORT_COL_BURSTRATE 6 /* Sort nodes by burst rate */
45 /* obscure information regarding the stats_tree */
46 typedef struct _stats_tree stats_tree
;
48 /* tap packet callback for stats_tree */
49 typedef tap_packet_status (*stat_tree_packet_cb
)(stats_tree
*,
54 /* stats_tree initialization callback */
55 typedef void (*stat_tree_init_cb
)(stats_tree
*);
57 /* stats_tree cleanup callback */
58 typedef void (*stat_tree_cleanup_cb
)(stats_tree
*);
60 typedef enum _stat_node_datatype
{
65 /* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED
67 * name: protocol display name
68 * flags: tap listener flags for per-packet callback
69 * packet: per packet callback
70 * init: tree initialization callback
71 * cleanup: cleanup callback
73 WS_DLL_PUBLIC
void stats_tree_register(const gchar
*tapname
,
77 stat_tree_packet_cb packet
,
78 stat_tree_init_cb init
,
79 stat_tree_cleanup_cb cleanup
);
81 /* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin
83 * name: protocol display name
84 * flags: tap listener flags for per-packet callback
85 * packet: per packet callback
86 * init: tree initialization callback
87 * cleanup: cleanup callback
89 WS_DLL_PUBLIC
void stats_tree_register_plugin(const gchar
*tapname
,
93 stat_tree_packet_cb packet
,
94 stat_tree_init_cb init
,
95 stat_tree_cleanup_cb cleanup
);
97 /* registers a new stats tree
99 * name: protocol display name
100 * flags: tap listener flags for per-packet callback
101 * packet: per packet callback
102 * init: tree initialization callback
103 * cleanup: cleanup callback
104 * stat_group: the group this stat belongs to
106 WS_DLL_PUBLIC
void stats_tree_register_with_group(const gchar
*tapname
,
110 stat_tree_packet_cb packet
,
111 stat_tree_init_cb init
,
112 stat_tree_cleanup_cb cleanup
,
113 register_stat_group_t stat_group
);
115 WS_DLL_PUBLIC
int stats_tree_parent_id_by_name(stats_tree
*st
, const gchar
*parent_name
);
117 /* Creates a node in the tree (to be used in the in init_cb)
118 * st: the stats_tree in which to create it
119 * name: the name of the new node
120 * parent_name: the name of the parent_node (NULL for root)
121 * datatype: datatype used for the value of the node
122 * with_children: TRUE if this node will have "dynamically created" children
124 WS_DLL_PUBLIC
int stats_tree_create_node(stats_tree
*st
,
127 stat_node_datatype datatype
,
128 gboolean with_children
);
130 /* creates a node using its parent's tree name */
131 WS_DLL_PUBLIC
int stats_tree_create_node_by_pname(stats_tree
*st
,
133 const gchar
*parent_name
,
134 stat_node_datatype datatype
,
135 gboolean with_children
);
137 /* creates a node in the tree, that will contain a ranges list.
139 stats_tree_create_range_node(st,name,parent,
140 "-99","100-199","200-299","300-399","400-", NULL);
142 WS_DLL_PUBLIC
int stats_tree_create_range_node(stats_tree
*st
,
147 WS_DLL_PUBLIC
int stats_tree_create_range_node_string(stats_tree
*st
,
153 WS_DLL_PUBLIC
int stats_tree_range_node_with_pname(stats_tree
*st
,
155 const gchar
*parent_name
,
158 /* increases by one the ranged node and the sub node to whose range the value belongs */
159 WS_DLL_PUBLIC
int stats_tree_tick_range(stats_tree
*st
,
164 #define stats_tree_tick_range_by_pname(st,name,parent_name,value_in_range) \
165 stats_tree_tick_range((st),(name),stats_tree_parent_id_by_name((st),(parent_name),(value_in_range)))
168 WS_DLL_PUBLIC
int stats_tree_create_pivot(stats_tree
*st
,
172 WS_DLL_PUBLIC
int stats_tree_create_pivot_by_pname(stats_tree
*st
,
174 const gchar
*parent_name
);
176 WS_DLL_PUBLIC
int stats_tree_tick_pivot(stats_tree
*st
,
178 const gchar
*pivot_value
);
180 extern void stats_tree_cleanup(void);
184 * manipulates the value of the node whose name is given
185 * if the node does not exist yet it's created (with counter=1)
186 * using parent_name as parent node (NULL for root).
187 * with_children=TRUE to indicate that the created node will be a parent
189 typedef enum _manip_node_mode
{
197 WS_DLL_PUBLIC
int stats_tree_manip_node_int(manip_node_mode mode
,
201 gboolean with_children
,
204 WS_DLL_PUBLIC
int stats_tree_manip_node_float(manip_node_mode mode
,
208 gboolean with_children
,
211 #define increase_stat_node(st,name,parent_id,with_children,value) \
212 (stats_tree_manip_node_int(MN_INCREASE,(st),(name),(parent_id),(with_children),(value)))
214 #define tick_stat_node(st,name,parent_id,with_children) \
215 (stats_tree_manip_node_int(MN_INCREASE,(st),(name),(parent_id),(with_children),1))
217 #define set_stat_node(st,name,parent_id,with_children,value) \
218 (stats_tree_manip_node_int(MN_SET,(st),(name),(parent_id),(with_children),value))
220 #define zero_stat_node(st,name,parent_id,with_children) \
221 (stats_tree_manip_node_int(MN_SET,(st),(name),(parent_id),(with_children),0))
224 * Add value to average calculation WITHOUT ticking node. Node MUST be ticked separately!
226 * Intention is to allow code to separately tick node (backward compatibility for plugin)
227 * and set value to use for averages. Older versions without average support will then at
228 * least show a count instead of 0.
230 #define avg_stat_node_add_value_notick(st,name,parent_id,with_children,value) \
231 (stats_tree_manip_node_int(MN_AVERAGE_NOTICK,(st),(name),(parent_id),(with_children),value))
233 /* Tick node and add a new value to the average calculation for this stats node. */
234 #define avg_stat_node_add_value_int(st,name,parent_id,with_children,value) \
235 (stats_tree_manip_node_int(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
237 #define avg_stat_node_add_value_float(st,name,parent_id,with_children,value) \
238 (stats_tree_manip_node_float(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
240 /* Set flags for this node. Node created if it does not yet exist. */
241 #define stat_node_set_flags(st,name,parent_id,with_children,flags) \
242 (stats_tree_manip_node_int(MN_SET_FLAGS,(st),(name),(parent_id),(with_children),flags))
244 /* Clear flags for this node. Node created if it does not yet exist. */
245 #define stat_node_clear_flags(st,name,parent_id,with_children,flags) \
246 (stats_tree_manip_node_int(MN_CLEAR_FLAGS,(st),(name),(parent_id),(with_children),flags))
250 #endif /* __cplusplus */
252 #endif /* __STATS_TREE_H */
255 * Editor modelines - https://www.wireshark.org/tools/modelines.html
260 * indent-tabs-mode: nil
263 * vi: set shiftwidth=4 tabstop=8 expandtab:
264 * :indentSize=4:tabSize=8:noTabs=true: