opa: Add dissectors for Intel’s Omni-Path Architecture (OPA)
[metze/wireshark/wip.git] / wiretap / wtap_opttypes.h
1 /* wtap_opttypes.h
2  *
3  * Wireshark - Network traffic analyzer
4  * By Gerald Combs <gerald@wireshark.org>
5  * Copyright 2001 Gerald Combs
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef WTAP_OPT_TYPES_H
23 #define WTAP_OPT_TYPES_H
24
25 #include "ws_symbol_export.h"
26
27 struct wtap_optionblock;
28 typedef struct wtap_optionblock *wtap_optionblock_t;
29
30 /* Currently supported option blocks */
31 typedef enum {
32     WTAP_OPTION_BLOCK_IF_DESCR = 0,
33     WTAP_OPTION_BLOCK_IF_STATS,
34     WTAP_OPTION_BLOCK_NG_SECTION,
35     WTAP_OPTION_BLOCK_NG_NRB,
36     WTAP_OPTION_BLOCK_MAX_TYPE
37 } wtap_optionblock_type_t;
38
39 /* Currently supported option types */
40 typedef enum {
41     WTAP_OPTTYPE_UINT8,
42     WTAP_OPTTYPE_UINT64,
43     WTAP_OPTTYPE_STRING,
44     WTAP_OPTTYPE_CUSTOM
45 } wtap_opttype_e;
46
47 typedef enum {
48     WTAP_OPTTYPE_SUCCESS = 0,
49     WTAP_OPTTYPE_NOT_FOUND = -1,
50     WTAP_OPTTYPE_TYPE_MISMATCH = -2,
51     WTAP_OPTTYPE_ALREADY_EXISTS = -3
52 } wtap_opttype_return_val;
53
54 typedef void (*wtap_opttype_free_custom_func)(void* data);
55
56 struct wtap_opttype_custom
57 {
58     void* data;
59     guint size;
60     wtap_opttype_free_custom_func free_func;
61 };
62
63 typedef union {
64     guint8 uint8val;
65     guint64 uint64val;
66     char *stringval;
67     struct wtap_opttype_custom customval;
68 } wtap_option_type;
69
70 struct wtap_dumper;
71
72 typedef guint32 (*wtap_opttype_option_write_size)(wtap_option_type* data); /**< does the option have data worth writing (Ex string option != NULL */
73 typedef gboolean (*wtap_opttype_option_write)(struct wtap_dumper* wdh, wtap_option_type* data, int *err); /**< does the option have data worth writing (Ex string option != NULL */
74
75 typedef struct wtap_optblock_reg {
76     const char *name;                /**< name of option */
77     const char *description;         /**< human-readable description of option */
78     wtap_opttype_e type;             /**< type of that option */
79     wtap_opttype_option_write_size write_size_func; /**< Size of option in file (0 to not write option) */
80     wtap_opttype_option_write write_func; /**< write option data to dumper */
81     wtap_option_type option;         /**< pointer to variable storing the value */
82     wtap_option_type default_val;    /**< the default value of the option */
83 } wtap_optblock_reg_t;
84
85 /** Initialize option block types.
86  *
87  * This is currently just a placeholder as nothing needs to be
88  * initialized yet.  Should handle "registration" when code is
89  * refactored to do so.
90  */
91 void wtap_opttypes_initialize(void);
92
93 /** Create an option block by type
94  *
95  * Return a newly allocated option block with default options provided
96  *
97  * @param[in] block_type Option block type to be created
98  * @return Newly allocated option block
99  */
100 WS_DLL_PUBLIC wtap_optionblock_t wtap_optionblock_create(wtap_optionblock_type_t block_type);
101
102 /** Free an option block
103  *
104  * Needs to be called to clean up any allocated option block
105  *
106  * @param[in] block Block to be freed
107  */
108 WS_DLL_PUBLIC void wtap_optionblock_free(wtap_optionblock_t block);
109
110 /** Provide mandatory data of an option block
111  *
112  * @param[in] block Block to retrieve mandatory data
113  * @return Option block mandatory data.  Structure varies based on option block type
114  */
115 WS_DLL_PUBLIC void* wtap_optionblock_get_mandatory_data(wtap_optionblock_t block);
116
117 /** Add an option to the option block
118  *
119  * @param[in] block Block to add option
120  * @param[in] option_id Identifier value for option
121  * @param[in] option structure explaining it
122  * @return 0 if successful
123  */
124 int wtap_optionblock_add_option(wtap_optionblock_t block, guint option_id, wtap_optblock_reg_t* option);
125
126 /** Set string option value to an option block
127  *
128  * @param[in] block Block to add option
129  * @param[in] option_id Identifier value for option
130  * @param[in] value New value of option
131  * @return 0 if successful
132  */
133 WS_DLL_PUBLIC int wtap_optionblock_set_option_string(wtap_optionblock_t block, guint option_id, char* value);
134
135 /** Get string option value from an option block
136  *
137  * @param[in] block Block to add option
138  * @param[in] option_id Identifier value for option
139  * @param[out] value Returned value of option
140  * @return 0 if successful
141  */
142 WS_DLL_PUBLIC int wtap_optionblock_get_option_string(wtap_optionblock_t block, guint option_id, char** value);
143
144 /** Set UINT64 option value to an option block
145  *
146  * @param[in] block Block to add option
147  * @param[in] option_id Identifier value for option
148  * @param[in] value New value of option
149  * @return 0 if successful
150  */
151 WS_DLL_PUBLIC int wtap_optionblock_set_option_uint64(wtap_optionblock_t block, guint option_id, guint64 value);
152
153 /** Get UINT64 option value from an option block
154  *
155  * @param[in] block Block to add option
156  * @param[in] option_id Identifier value for option
157  * @param[out] value Returned value of option
158  * @return 0 if successful
159  */
160 WS_DLL_PUBLIC int wtap_optionblock_get_option_uint64(wtap_optionblock_t block, guint option_id, guint64* value);
161
162 /** Set UINT8 option value to an option block
163  *
164  * @param[in] block Block to add option
165  * @param[in] option_id Identifier value for option
166  * @param[in] value New value of option
167  * @return 0 if successful
168  */
169 WS_DLL_PUBLIC int wtap_optionblock_set_option_uint8(wtap_optionblock_t block, guint option_id, guint8 value);
170
171 /** Get UINT8 option value from an option block
172  *
173  * @param[in] block Block to add option
174  * @param[in] option_id Identifier value for option
175  * @param[out] value Returned value of option
176  * @return 0 if successful
177  */
178 WS_DLL_PUBLIC int wtap_optionblock_get_option_uint8(wtap_optionblock_t block, guint option_id, guint8* value);
179
180 /** Set a "custom" option value to an option block
181  *
182  * @param[in] block Block to add option
183  * @param[in] option_id Identifier value for option
184  * @param[in] value New value of option
185  * @return 0 if successful
186  */
187 WS_DLL_PUBLIC int wtap_optionblock_set_option_custom(wtap_optionblock_t block, guint option_id, void* value);
188
189 /** Get a "custom" option value from an option block
190  *
191  * @param[in] block Block to add option
192  * @param[in] option_id Identifier value for option
193  * @param[out] value Returned value of option
194  * @return 0 if successful
195  */
196 WS_DLL_PUBLIC int wtap_optionblock_get_option_custom(wtap_optionblock_t block, guint option_id, void** value);
197
198 /** Copy an option block to another.
199  *
200  * Any options that are in the destination but not the source are not removed.
201  * Options that are just in source will be added to destination
202  *
203  * @param[in] dest_block Block to be copied to
204  * @param[in] src_block Block to be copied from
205  */
206 void wtap_optionblock_copy_options(wtap_optionblock_t dest_block, wtap_optionblock_t src_block);
207
208 /** Write an option block
209  *
210  * Will write all mandatory data as well as "valid" options
211  *
212  * @param[in] wdh writing assistant
213  * @param[in] block Block to be written
214  * @param[in] err Any errors that occurred
215  * @return TRUE if successful, FALSE will populate err
216  */
217 gboolean wtap_optionblock_write(struct wtap_dumper *wdh, wtap_optionblock_t block, int *err);
218
219 /* Some utility functions for option types */
220
221 guint32 wtap_opttype_write_size_string(wtap_option_type* data);
222 gboolean wtap_opttype_write_data_string(struct wtap_dumper* wdh, wtap_option_type* data, int *err);
223
224 /* if option value = 0, write size = 0, otherwise 4 */
225 guint32 wtap_opttype_write_uint8_not0(wtap_option_type* data);
226 gboolean wtap_opttype_write_data_uint8(struct wtap_dumper* wdh, wtap_option_type* data, int *err);
227
228 /* if option value = 0, write size = 0, otherwise 8 */
229 guint32 wtap_opttype_write_uint64_not0(wtap_option_type* data);
230 /* if option value = -1 (0xFFFFFFFFFFFFFFFF), write size = 0, otherwise 8 */
231 guint32 wtap_opttype_write_uint64_not_minus1(wtap_option_type* data);
232 gboolean wtap_opttype_write_data_uint64(struct wtap_dumper* wdh, wtap_option_type* data, int *err);
233
234 #endif /* WTAP_OPT_TYPES_H */
235