summaryrefslogtreecommitdiffstats
path: root/epan/stats_tree.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/stats_tree.h
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/stats_tree.h')
-rw-r--r--epan/stats_tree.h266
1 files changed, 266 insertions, 0 deletions
diff --git a/epan/stats_tree.h b/epan/stats_tree.h
new file mode 100644
index 0000000..8ae31b2
--- /dev/null
+++ b/epan/stats_tree.h
@@ -0,0 +1,266 @@
+/** @file
+ * A counter tree API for Wireshark dissectors
+ * 2005, Luis E. G. Ontanon
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#ifndef __STATS_TREE_H
+#define __STATS_TREE_H
+
+#include <glib.h>
+#include <epan/epan.h>
+#include <epan/packet_info.h>
+#include <epan/tap.h>
+#include <epan/stat_groups.h>
+#include "ws_symbol_export.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define STAT_TREE_ROOT "root"
+
+#define ST_FLG_AVERAGE 0x10000000 /* Calculate averages for nodes, rather than totals */
+#define ST_FLG_ROOTCHILD 0x20000000 /* This node is a direct child of the root node */
+#define ST_FLG_DEF_NOEXPAND 0x01000000 /* This node should not be expanded by default */
+#define ST_FLG_SORT_DESC 0x00800000 /* When sorting, sort ascending instead of decending */
+#define ST_FLG_SORT_TOP 0x00400000 /* When sorting always keep these lines on of list */
+#define ST_FLG_SRTCOL_MASK 0x000F0000 /* Mask for sort column ID */
+#define ST_FLG_SRTCOL_SHIFT 16 /* Number of bits to shift masked result */
+
+#define ST_FLG_MASK (ST_FLG_AVERAGE|ST_FLG_ROOTCHILD|ST_FLG_DEF_NOEXPAND| \
+ ST_FLG_SORT_TOP|ST_FLG_SORT_DESC|ST_FLG_SRTCOL_MASK)
+
+#define ST_SORT_COL_NAME 1 /* Sort nodes by node names */
+#define ST_SORT_COL_COUNT 2 /* Sort nodes by node count */
+#define ST_SORT_COL_AVG 3 /* Sort nodes by node average */
+#define ST_SORT_COL_MIN 4 /* Sort nodes by minimum node value */
+#define ST_SORT_COL_MAX 5 /* Sort nodes by maximum node value */
+#define ST_SORT_COL_BURSTRATE 6 /* Sort nodes by burst rate */
+
+/* obscure information regarding the stats_tree */
+typedef struct _stats_tree stats_tree;
+
+/* tap packet callback for stats_tree */
+typedef tap_packet_status (*stat_tree_packet_cb)(stats_tree*,
+ packet_info *,
+ epan_dissect_t *,
+ const void *,
+ tap_flags_t flags);
+
+/* stats_tree initialization callback */
+typedef void (*stat_tree_init_cb)(stats_tree *);
+
+/* stats_tree cleanup callback */
+typedef void (*stat_tree_cleanup_cb)(stats_tree *);
+
+typedef enum _stat_node_datatype {
+ STAT_DT_INT,
+ STAT_DT_FLOAT
+} stat_node_datatype;
+
+/* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED
+ * abbr: tree abbr (used for tshark -z option)
+ * name: tree display name in GUI menu and window (use "/" for sub menus)
+ * flags: tap listener flags for per-packet callback
+ * packet: per packet callback
+ * init: tree initialization callback
+ * cleanup: cleanup callback
+ */
+WS_DLL_PUBLIC void stats_tree_register(const gchar *tapname,
+ const gchar *abbr,
+ const gchar *name,
+ guint flags,
+ stat_tree_packet_cb packet,
+ stat_tree_init_cb init,
+ stat_tree_cleanup_cb cleanup);
+
+/* registers a new stats tree with default group REGISTER_STAT_GROUP_UNSORTED from a plugin
+ * abbr: tree abbr (used for tshark -z option)
+ * name: tree display name in GUI menu and window (use "/" for sub menus)
+ * flags: tap listener flags for per-packet callback
+ * packet: per packet callback
+ * init: tree initialization callback
+ * cleanup: cleanup callback
+ */
+WS_DLL_PUBLIC void stats_tree_register_plugin(const gchar *tapname,
+ const gchar *abbr,
+ const gchar *name,
+ guint flags,
+ stat_tree_packet_cb packet,
+ stat_tree_init_cb init,
+ stat_tree_cleanup_cb cleanup);
+
+/* registers a new stats tree
+ * abbr: tree abbr (used for tshark -z option)
+ * name: tree display name in GUI menu and window (use "/" for sub menus)
+ * flags: tap listener flags for per-packet callback
+ * packet: per packet callback
+ * init: tree initialization callback
+ * cleanup: cleanup callback
+ * stat_group: the group this stat belongs to
+ */
+WS_DLL_PUBLIC void stats_tree_register_with_group(const gchar *tapname,
+ const gchar *abbr,
+ const gchar *name,
+ guint flags,
+ stat_tree_packet_cb packet,
+ stat_tree_init_cb init,
+ stat_tree_cleanup_cb cleanup,
+ register_stat_group_t stat_group);
+
+WS_DLL_PUBLIC int stats_tree_parent_id_by_name(stats_tree *st, const gchar *parent_name);
+
+/* Creates a node in the tree (to be used in the in init_cb)
+ * st: the stats_tree in which to create it
+ * name: the name of the new node
+ * parent_name: the name of the parent_node (NULL for root)
+ * datatype: datatype used for the value of the node
+ * with_children: TRUE if this node will have "dynamically created" children
+ */
+WS_DLL_PUBLIC int stats_tree_create_node(stats_tree *st,
+ const gchar *name,
+ int parent_id,
+ stat_node_datatype datatype,
+ gboolean with_children);
+
+/* creates a node using its parent's tree name */
+WS_DLL_PUBLIC int stats_tree_create_node_by_pname(stats_tree *st,
+ const gchar *name,
+ const gchar *parent_name,
+ stat_node_datatype datatype,
+ gboolean with_children);
+
+/* creates a node in the tree, that will contain a ranges list.
+ example:
+ stats_tree_create_range_node(st,name,parent,
+ "-99","100-199","200-299","300-399","400-", NULL);
+*/
+WS_DLL_PUBLIC int stats_tree_create_range_node(stats_tree *st,
+ const gchar *name,
+ int parent_id,
+ ...);
+
+WS_DLL_PUBLIC int stats_tree_create_range_node_string(stats_tree *st,
+ const gchar *name,
+ int parent_id,
+ int num_str_ranges,
+ gchar** str_ranges);
+
+WS_DLL_PUBLIC int stats_tree_range_node_with_pname(stats_tree *st,
+ const gchar *name,
+ const gchar *parent_name,
+ ...);
+
+/* increases by one the ranged node and the sub node to whose range the value belongs */
+WS_DLL_PUBLIC int stats_tree_tick_range(stats_tree *st,
+ const gchar *name,
+ int parent_id,
+ int value_in_range);
+
+#define stats_tree_tick_range_by_pname(st,name,parent_name,value_in_range) \
+ stats_tree_tick_range((st),(name),stats_tree_parent_id_by_name((st),(parent_name),(value_in_range)))
+
+/* */
+WS_DLL_PUBLIC int stats_tree_create_pivot(stats_tree *st,
+ const gchar *name,
+ int parent_id);
+
+WS_DLL_PUBLIC int stats_tree_create_pivot_by_pname(stats_tree *st,
+ const gchar *name,
+ const gchar *parent_name);
+
+WS_DLL_PUBLIC int stats_tree_tick_pivot(stats_tree *st,
+ int pivot_id,
+ const gchar *pivot_value);
+
+extern void stats_tree_cleanup(void);
+
+
+/*
+ * manipulates the value of the node whose name is given
+ * if the node does not exist yet it's created (with counter=1)
+ * using parent_name as parent node (NULL for root).
+ * with_children=TRUE to indicate that the created node will be a parent
+ */
+typedef enum _manip_node_mode {
+ MN_INCREASE,
+ MN_SET,
+ MN_AVERAGE,
+ MN_AVERAGE_NOTICK,
+ MN_SET_FLAGS,
+ MN_CLEAR_FLAGS
+} manip_node_mode;
+WS_DLL_PUBLIC int stats_tree_manip_node_int(manip_node_mode mode,
+ stats_tree *st,
+ const gchar *name,
+ int parent_id,
+ gboolean with_children,
+ gint value);
+
+WS_DLL_PUBLIC int stats_tree_manip_node_float(manip_node_mode mode,
+ stats_tree *st,
+ const gchar *name,
+ int parent_id,
+ gboolean with_children,
+ gfloat value);
+
+#define increase_stat_node(st,name,parent_id,with_children,value) \
+ (stats_tree_manip_node_int(MN_INCREASE,(st),(name),(parent_id),(with_children),(value)))
+
+#define tick_stat_node(st,name,parent_id,with_children) \
+ (stats_tree_manip_node_int(MN_INCREASE,(st),(name),(parent_id),(with_children),1))
+
+#define set_stat_node(st,name,parent_id,with_children,value) \
+ (stats_tree_manip_node_int(MN_SET,(st),(name),(parent_id),(with_children),value))
+
+#define zero_stat_node(st,name,parent_id,with_children) \
+ (stats_tree_manip_node_int(MN_SET,(st),(name),(parent_id),(with_children),0))
+
+/*
+ * Add value to average calculation WITHOUT ticking node. Node MUST be ticked separately!
+ *
+ * Intention is to allow code to separately tick node (backward compatibility for plugin)
+ * and set value to use for averages. Older versions without average support will then at
+ * least show a count instead of 0.
+ */
+#define avg_stat_node_add_value_notick(st,name,parent_id,with_children,value) \
+ (stats_tree_manip_node_int(MN_AVERAGE_NOTICK,(st),(name),(parent_id),(with_children),value))
+
+/* Tick node and add a new value to the average calculation for this stats node. */
+#define avg_stat_node_add_value_int(st,name,parent_id,with_children,value) \
+ (stats_tree_manip_node_int(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
+
+#define avg_stat_node_add_value_float(st,name,parent_id,with_children,value) \
+ (stats_tree_manip_node_float(MN_AVERAGE,(st),(name),(parent_id),(with_children),value))
+
+/* Set flags for this node. Node created if it does not yet exist. */
+#define stat_node_set_flags(st,name,parent_id,with_children,flags) \
+ (stats_tree_manip_node_int(MN_SET_FLAGS,(st),(name),(parent_id),(with_children),flags))
+
+/* Clear flags for this node. Node created if it does not yet exist. */
+#define stat_node_clear_flags(st,name,parent_id,with_children,flags) \
+ (stats_tree_manip_node_int(MN_CLEAR_FLAGS,(st),(name),(parent_id),(with_children),flags))
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __STATS_TREE_H */
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */