aboutsummaryrefslogtreecommitdiffstats
path: root/epan/column-info.h
blob: ea05ee2bf5367a1ab27f9729cef0794ef1e130b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* column-info.h
 * Definitions for internal column structures and routines
 *
 * For internal Wireshark use only. Don't include this header in dissectors!
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef __COLUMN_INFO_H__
#define __COLUMN_INFO_H__

#include <glib.h>
#include <epan/column-utils.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/** @file
 * Column info.
 */

typedef struct _proto_node proto_tree;

#define COLUMN_FIELD_FILTER  "_ws.col."

/** Column expression */
typedef struct {
  const gchar **col_expr;     /**< Filter expression */
  gchar      **col_expr_val;  /**< Value for filter expression */
} col_expr_t;

/** Custom column filter expression information used in the GSList below.
 * One for each expression in a multifield column.
 */
typedef struct {
  char                *dftext;         /**< Filter expression */
  struct epan_dfilter *dfilter;        /**< Compiled filter expression */
  int                  field_id;       /**< ID for a single field expression, or 0 */
} col_custom_t;

/** Individual column info */
typedef struct {
  gint                col_fmt;              /**< Format of column */
  gboolean           *fmt_matx;             /**< Specifies which formats apply to a column */
  gchar              *col_title;            /**< Column titles */
  gchar              *col_custom_fields;    /**< Custom column fields */
  gint                col_custom_occurrence;/**< Custom column field occurrence */
  GSList             *col_custom_fields_ids;/**< Custom column fields id */
  struct epan_dfilter *col_custom_dfilter;  /**< Compiled custom column field */
  const gchar        *col_data;             /**< Column data */
  gchar              *col_buf;              /**< Buffer into which to copy data for column */
  int                 col_fence;            /**< Stuff in column buffer before this index is immutable */
  gboolean            writable;             /**< writable or not */
  int                 hf_id;
} col_item_t;

/** Column info */
struct epan_column_info {
  const struct epan_session *epan;
  gint                num_cols;             /**< Number of columns */
  col_item_t         *columns;              /**< All column data */
  gint               *col_first;            /**< First column number with a given format */
  gint               *col_last;             /**< Last column number with a given format */
  col_expr_t          col_expr;             /**< Column expressions and values */
  gboolean            writable;             /**< writable or not @todo Are we still writing to the columns? */
  GRegex             *prime_regex;          /**< Used to prime custom columns */
};

/** Allocate all the data structures for constructing column data, given
 * the number of columns.
 */
WS_DLL_PUBLIC void col_setup(column_info *cinfo, const gint num_cols);

/** Cleanup all the data structures for constructing column data;
 * undoes the alocations that col_setup() does.
 */
WS_DLL_PUBLIC void col_cleanup(column_info *cinfo);

/** Initialize the data structures for constructing column data.
 */
extern void col_init(column_info *cinfo, const struct epan_session *epan);

/** Fill in all columns of the given packet which are based on values from frame_data.
 */
WS_DLL_PUBLIC void col_fill_in_frame_data(const frame_data *fd, column_info *cinfo, const gint col, gboolean const fill_col_exprs);

/** Fill in all (non-custom) columns of the given packet.
 */
WS_DLL_PUBLIC void col_fill_in(packet_info *pinfo, const gboolean fill_col_exprs, const gboolean fill_fd_colums);

/** Fill in columns if we got an error reading the packet.
 * We set most columns to "???", and set the Info column to an error
 * message.
 */
WS_DLL_PUBLIC void col_fill_in_error(column_info *cinfo, frame_data *fdata, const gboolean fill_col_exprs, const gboolean fill_fd_colums);

/** Check to see if our column data has changed, e.g. we have new request/response info.
 */
WS_DLL_PUBLIC gboolean  col_data_changed(void);

void col_custom_set_edt(struct epan_dissect *edt, column_info *cinfo);

WS_DLL_PUBLIC
void col_custom_prime_edt(struct epan_dissect *edt, column_info *cinfo);

/** Get a filter expression for a custom column. This string must be g_free'd.
 */
WS_DLL_PUBLIC
char* col_custom_get_filter(struct epan_dissect *edt, column_info *cinfo, const gint col);

WS_DLL_PUBLIC
gboolean have_custom_cols(column_info *cinfo);

WS_DLL_PUBLIC
gboolean have_field_extractors(void);

WS_DLL_PUBLIC
gboolean col_has_time_fmt(column_info *cinfo, const gint col);

WS_DLL_PUBLIC
gboolean col_based_on_frame_data(column_info *cinfo, const gint col);

void
col_register_protocol(void);

extern
void col_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __COLUMN_INFO_H__ */