Wireshark 4.7.0
The Wireshark network protocol analyzer
Loading...
Searching...
No Matches
ftypes.h
Go to the documentation of this file.
1
12#ifndef __FTYPES_H__
13#define __FTYPES_H__
14
15#include <wireshark.h>
16
17#include <wsutil/regex.h>
18#include <epan/wmem_scopes.h>
19
20#ifdef __cplusplus
21extern "C" {
22#endif /* __cplusplus */
23
24#define ASSERT_FTYPE_NOT_REACHED(ft) \
25 ws_error("Invalid field type '%s'.", ftype_name(ft))
26
27/* field types */
28enum ftenum {
29 FT_NONE, /* used for text labels with no value */
30 FT_PROTOCOL,
31 FT_BOOLEAN, /* true and false come from <glib.h> */
32 FT_CHAR, /* 1-octet character as 0-255 */
33 FT_UINT8,
34 FT_UINT16,
35 FT_UINT24, /* really a UINT32, but displayed as 6 hex-digits if FD_HEX*/
36 FT_UINT32,
37 FT_UINT40, /* really a UINT64, but displayed as 10 hex-digits if FD_HEX*/
38 FT_UINT48, /* really a UINT64, but displayed as 12 hex-digits if FD_HEX*/
39 FT_UINT56, /* really a UINT64, but displayed as 14 hex-digits if FD_HEX*/
40 FT_UINT64,
41 FT_INT8,
42 FT_INT16,
43 FT_INT24, /* same as for UINT24 */
44 FT_INT32,
45 FT_INT40, /* same as for UINT40 */
46 FT_INT48, /* same as for UINT48 */
47 FT_INT56, /* same as for UINT56 */
48 FT_INT64,
49 FT_IEEE_11073_SFLOAT,
50 FT_IEEE_11073_FLOAT,
51 FT_FLOAT,
52 FT_DOUBLE,
53 FT_ABSOLUTE_TIME,
54 FT_RELATIVE_TIME,
55 FT_STRING, /* counted string, with no null terminator */
56 FT_STRINGZ, /* null-terminated string */
57 FT_UINT_STRING, /* counted string, with count being the first part of the value */
58 FT_ETHER,
59 FT_BYTES,
60 FT_UINT_BYTES,
61 FT_IPv4,
62 FT_IPv6,
63 FT_IPXNET,
64 FT_FRAMENUM, /* a UINT32, but if selected lets you go to frame with that number */
65 FT_GUID, /* GUID, UUID */
66 FT_OID, /* OBJECT IDENTIFIER */
67 FT_EUI64,
68 FT_AX25,
69 FT_VINES,
70 FT_REL_OID, /* RELATIVE-OID */
71 FT_SYSTEM_ID,
72 FT_STRINGZPAD, /* null-padded string */
73 FT_FCWWN,
74 FT_STRINGZTRUNC, /* null-truncated string */
75 FT_NUM_TYPES, /* last item number plus one */
76 FT_SCALAR, /* Pseudo-type used only internally for certain
77 * arithmetic operations. */
78 FT_ENUM_SIZE = FT_SCALAR /* Must be equal to last enumeration */
79};
80
81#define FT_IS_INT32(ft) \
82 ((ft) == FT_INT8 || \
83 (ft) == FT_INT16 || \
84 (ft) == FT_INT24 || \
85 (ft) == FT_INT32)
86
87#define FT_IS_INT64(ft) \
88 ((ft) == FT_INT40 || \
89 (ft) == FT_INT48 || \
90 (ft) == FT_INT56 || \
91 (ft) == FT_INT64)
92
93#define FT_IS_INT(ft) (FT_IS_INT32(ft) || FT_IS_INT64(ft))
94
95#define FT_IS_UINT32(ft) \
96 ((ft) == FT_CHAR || \
97 (ft) == FT_UINT8 || \
98 (ft) == FT_UINT16 || \
99 (ft) == FT_UINT24 || \
100 (ft) == FT_UINT32 || \
101 (ft) == FT_FRAMENUM)
102
103#define FT_IS_UINT64(ft) \
104 ((ft) == FT_UINT40 || \
105 (ft) == FT_UINT48 || \
106 (ft) == FT_UINT56 || \
107 (ft) == FT_UINT64)
108
109#define FT_IS_UINT(ft) (FT_IS_UINT32(ft) || FT_IS_UINT64(ft))
110
111#define FT_IS_INTEGER(ft) (FT_IS_INT(ft) || FT_IS_UINT(ft))
112
113#define FT_IS_FLOATING(ft) ((ft) == FT_FLOAT || (ft) == FT_DOUBLE)
114
115#define FT_IS_TIME(ft) \
116 ((ft) == FT_ABSOLUTE_TIME || (ft) == FT_RELATIVE_TIME)
117
118#define FT_IS_STRING(ft) \
119 ((ft) == FT_STRING || (ft) == FT_STRINGZ || (ft) == FT_STRINGZPAD || \
120 (ft) == FT_STRINGZTRUNC || (ft) == FT_UINT_STRING || (ft) == FT_AX25)
121
122#define FT_IS_SCALAR(ft) ((ft) == FT_INT64 || (ft) == FT_DOUBLE)
123
124/* field types lengths */
125#define FT_ETHER_LEN 6
126#define FT_GUID_LEN 16
127#define FT_IPv4_LEN 4
128#define FT_IPv6_LEN 16
129#define FT_IPXNET_LEN 4
130#define FT_EUI64_LEN 8
131#define FT_AX25_ADDR_LEN 7
132#define FT_VINES_ADDR_LEN 6
133#define FT_FCWWN_LEN 8
134#define FT_VARINT_MAX_LEN 10 /* Because 64 / 7 = 9 and 64 % 7 = 1, get an uint64 varint need reads up to 10 bytes. */
135
136typedef enum ftenum ftenum_t;
137
138enum ft_framenum_type {
139 FT_FRAMENUM_NONE,
140 FT_FRAMENUM_REQUEST,
141 FT_FRAMENUM_RESPONSE,
142 FT_FRAMENUM_ACK,
143 FT_FRAMENUM_DUP_ACK,
144 FT_FRAMENUM_RETRANS_PREV,
145 FT_FRAMENUM_RETRANS_NEXT,
146 FT_FRAMENUM_NUM_TYPES /* last item number plus one */
147};
148
149typedef enum ft_framenum_type ft_framenum_type_t;
150
151struct _ftype_t;
152typedef struct _ftype_t ftype_t;
153
154enum ft_result {
155 FT_OK = 0,
156 FT_OVERFLOW,
157 FT_UNDERFLOW,
158 FT_BADARG,
159 FT_ERROR, /* Generic. */
160};
161
162/*
163 * True, false or error if negative.
164 * Note that
165 * ft_bool == FT_FALSE
166 * and
167 * ft_bool != FT_TRUE
168 * are different results (three-state logic).
169 */
170typedef int ft_bool_t;
171#define FT_TRUE 1
172#define FT_FALSE 0
173
174/* String representation types. */
175enum ftrepr {
176 FTREPR_DISPLAY,
177 FTREPR_DFILTER,
178 FTREPR_JSON,
179 FTREPR_RAW,
180 FTREPR_EK, /* ElasticSearch/OpenSearch JSON */
181};
182
183typedef enum ftrepr ftrepr_t;
184
185/* Initialize the ftypes subsystem. Called once. */
186void
187ftypes_initialize(void);
188
189void
190ftypes_register_pseudofields(void);
191
192/* ---------------- FTYPE ----------------- */
193
194/* given two types, are they similar - for example can two
195 * duplicate fields be registered of these two types. */
196bool
197ftype_similar_types(const enum ftenum ftype_a, const enum ftenum ftype_b);
198
199/* Return a string representing the name of the type */
200WS_DLL_PUBLIC
201const char*
202ftype_name(ftenum_t ftype);
203
204/* Return a string presenting a "pretty" representation of the
205 * name of the type. The pretty name means more to the user than
206 * that "FT_*" name. */
207WS_DLL_PUBLIC
208const char*
209ftype_pretty_name(ftenum_t ftype);
210
211/* Returns length of field in packet, or 0 if not determinable/defined. */
212int
213ftype_wire_size(ftenum_t ftype);
214
215WS_DLL_PUBLIC
216bool
217ftype_can_length(enum ftenum ftype);
218
219WS_DLL_PUBLIC
220bool
221ftype_can_slice(enum ftenum ftype);
222
223WS_DLL_PUBLIC
224bool
225ftype_can_eq(enum ftenum ftype);
226
227WS_DLL_PUBLIC
228bool
229ftype_can_cmp(enum ftenum ftype);
230
231WS_DLL_PUBLIC
232bool
233ftype_can_bitwise_and(enum ftenum ftype);
234
235WS_DLL_PUBLIC
236bool
237ftype_can_unary_minus(enum ftenum ftype);
238
239WS_DLL_PUBLIC
240bool
241ftype_can_add(enum ftenum ftype);
242
243WS_DLL_PUBLIC
244bool
245ftype_can_subtract(enum ftenum ftype);
246
247WS_DLL_PUBLIC
248bool
249ftype_can_multiply(enum ftenum ftype);
250
251WS_DLL_PUBLIC
252bool
253ftype_can_divide(enum ftenum ftype);
254
255WS_DLL_PUBLIC
256bool
257ftype_can_modulo(enum ftenum ftype);
258
259WS_DLL_PUBLIC
260bool
261ftype_can_contains(enum ftenum ftype);
262
263WS_DLL_PUBLIC
264bool
265ftype_can_matches(enum ftenum ftype);
266
267WS_DLL_PUBLIC
268bool
269ftype_can_is_zero(enum ftenum ftype);
270
271WS_DLL_PUBLIC
272bool
273ftype_can_is_negative(enum ftenum ftype);
274
275WS_DLL_PUBLIC
276bool
277ftype_can_is_nan(enum ftenum ftype);
278
279WS_DLL_PUBLIC
280bool
281ftype_can_val_to_sinteger(enum ftenum ftype);
282
283WS_DLL_PUBLIC
284bool
285ftype_can_val_to_uinteger(enum ftenum ftype);
286
287WS_DLL_PUBLIC
288bool
289ftype_can_val_to_sinteger64(enum ftenum ftype);
290
291WS_DLL_PUBLIC
292bool
293ftype_can_val_to_uinteger64(enum ftenum ftype);
294
295WS_DLL_PUBLIC
296bool
297ftype_can_val_to_double(enum ftenum ftype);
298
299/* ---------------- FVALUE ----------------- */
300
301#include <wsutil/inet_cidr.h>
302#include <epan/guid-utils.h>
303
304#include <epan/tvbuff.h>
305#include <wsutil/nstime.h>
306#include <epan/dfilter/drange.h>
307
308typedef struct _protocol_value_t
309{
310 tvbuff_t *tvb;
311 int length;
312 char *proto_string;
313 bool tvb_is_private;
315
316typedef struct _fvalue_t fvalue_t;
317
318WS_DLL_PUBLIC
320fvalue_new(ftenum_t ftype);
321
322WS_DLL_PUBLIC
324fvalue_dup(const fvalue_t *fv);
325
326WS_DLL_PUBLIC
327void
328fvalue_init(fvalue_t *fv, ftenum_t ftype);
329
330WS_DLL_PUBLIC
331void
332fvalue_cleanup(fvalue_t *fv);
333
334WS_DLL_PUBLIC
335void
336fvalue_free(fvalue_t *fv);
337
338WS_DLL_PUBLIC
340fvalue_from_literal(ftenum_t ftype, const char *s, bool allow_partial_value, char **err_msg);
341
342/* String *MUST* be null-terminated. Length is optional (pass zero) and does not include the null terminator. */
344fvalue_from_string(ftenum_t ftype, const char *s, size_t len, char **err_msg);
345
347fvalue_from_charconst(ftenum_t ftype, unsigned long number, char **err_msg);
348
350fvalue_from_sinteger64(ftenum_t ftype, const char *s, int64_t number, char **err_msg);
351
353fvalue_from_uinteger64(ftenum_t ftype, const char *s, uint64_t number, char **err_msg);
354
356fvalue_from_floating(ftenum_t ftype, const char *s, double number, char **err_msg);
357
358/* Creates the string representation of the field value.
359 * Memory for the buffer is allocated based on wmem allocator
360 * provided.
361 *
362 * field_display parameter should be a BASE_ value (enum field_display_e)
363 * BASE_NONE should be used if field information isn't available.
364 *
365 * Returns NULL if the string cannot be represented in the given rtype.*/
366WS_DLL_PUBLIC char *
367fvalue_to_string_repr(wmem_allocator_t *scope, const fvalue_t *fv, ftrepr_t rtype, int field_display);
368
369#define fvalue_to_debug_repr(scope, fv) \
370 fvalue_to_string_repr(scope, fv, FTREPR_DFILTER, 0)
371
372WS_DLL_PUBLIC enum ft_result
373fvalue_to_uinteger(const fvalue_t *fv, uint32_t *repr);
374
375WS_DLL_PUBLIC enum ft_result
376fvalue_to_sinteger(const fvalue_t *fv, int32_t *repr);
377
378WS_DLL_PUBLIC enum ft_result
379fvalue_to_uinteger64(const fvalue_t *fv, uint64_t *repr);
380
381WS_DLL_PUBLIC enum ft_result
382fvalue_to_sinteger64(const fvalue_t *fv, int64_t *repr);
383
384WS_DLL_PUBLIC enum ft_result
385fvalue_to_double(const fvalue_t *fv, double *repr);
386
387WS_DLL_PUBLIC ftenum_t
388fvalue_type_ftenum(const fvalue_t *fv);
389
390WS_DLL_PUBLIC
391const char*
392fvalue_type_name(const fvalue_t *fv);
393
394/* GBytes reference count is automatically incremented. */
395WS_DLL_PUBLIC
396void
397fvalue_set_bytes(fvalue_t *fv, GBytes *value);
398
399WS_DLL_PUBLIC
400void
401fvalue_set_byte_array(fvalue_t *fv, GByteArray *value);
402
403WS_DLL_PUBLIC
404void
405fvalue_set_bytes_data(fvalue_t *fv, const void *data, size_t size);
406
407WS_DLL_PUBLIC
408void
409fvalue_set_fcwwn(fvalue_t *fv, const uint8_t *value);
410
411WS_DLL_PUBLIC
412void
413fvalue_set_ax25(fvalue_t *fv, const uint8_t *value);
414
415WS_DLL_PUBLIC
416void
417fvalue_set_vines(fvalue_t *fv, const uint8_t *value);
418
419WS_DLL_PUBLIC
420void
421fvalue_set_ether(fvalue_t *fv, const uint8_t *value);
422
423WS_DLL_PUBLIC
424void
425fvalue_set_guid(fvalue_t *fv, const e_guid_t *value);
426
427WS_DLL_PUBLIC
428void
429fvalue_set_time(fvalue_t *fv, const nstime_t *value);
430
431WS_DLL_PUBLIC
432void
433fvalue_set_string(fvalue_t *fv, const char *value);
434
435WS_DLL_PUBLIC
436void
437fvalue_set_strbuf(fvalue_t *fv, wmem_strbuf_t *value);
438
439WS_DLL_PUBLIC
440void
441fvalue_set_protocol(fvalue_t *fv, tvbuff_t *value, const char *name, int length);
442
443WS_DLL_PUBLIC
444void
445fvalue_set_protocol_length(fvalue_t *fv, int length);
446
447WS_DLL_PUBLIC
448void
449fvalue_set_uinteger(fvalue_t *fv, uint32_t value);
450
451WS_DLL_PUBLIC
452void
453fvalue_set_sinteger(fvalue_t *fv, int32_t value);
454
455WS_DLL_PUBLIC
456void
457fvalue_set_uinteger64(fvalue_t *fv, uint64_t value);
458
459WS_DLL_PUBLIC
460void
461fvalue_set_sinteger64(fvalue_t *fv, int64_t value);
462
463WS_DLL_PUBLIC
464void
465fvalue_set_floating(fvalue_t *fv, double value);
466
467WS_DLL_PUBLIC
468void
469fvalue_set_ipv4(fvalue_t *fv, const ipv4_addr_and_mask *value);
470
471WS_DLL_PUBLIC
472void
473fvalue_set_ipv6(fvalue_t *fv, const ipv6_addr_and_prefix *value);
474
475/* GBytes reference count is automatically incremented. */
476WS_DLL_PUBLIC
477GBytes *
478fvalue_get_bytes(fvalue_t *fv);
479
480WS_DLL_PUBLIC
481size_t
482fvalue_get_bytes_size(fvalue_t *fv);
483
484/* Same as fvalue_length() */
485WS_DLL_PUBLIC
486const void *
487fvalue_get_bytes_data(fvalue_t *fv);
488
489WS_DLL_PUBLIC
490const e_guid_t *
491fvalue_get_guid(fvalue_t *fv);
492
493WS_DLL_PUBLIC
494const nstime_t *
495fvalue_get_time(fvalue_t *fv);
496
497WS_DLL_PUBLIC
498const char *
499fvalue_get_string(fvalue_t *fv);
500
501WS_DLL_PUBLIC
502const wmem_strbuf_t *
503fvalue_get_strbuf(fvalue_t *fv);
504
505WS_DLL_PUBLIC
506tvbuff_t *
507fvalue_get_protocol(fvalue_t *fv);
508
509WS_DLL_PUBLIC
510uint32_t
511fvalue_get_uinteger(fvalue_t *fv);
512
513WS_DLL_PUBLIC
514int32_t
515fvalue_get_sinteger(fvalue_t *fv);
516
517WS_DLL_PUBLIC
518uint64_t
519fvalue_get_uinteger64(fvalue_t *fv);
520
521WS_DLL_PUBLIC
522int64_t
523fvalue_get_sinteger64(fvalue_t *fv);
524
525WS_DLL_PUBLIC
526double
527fvalue_get_floating(fvalue_t *fv);
528
529WS_DLL_PUBLIC
530const ipv4_addr_and_mask *
531fvalue_get_ipv4(fvalue_t *fv);
532
533WS_DLL_PUBLIC
535fvalue_get_ipv6(fvalue_t *fv);
536
537WS_DLL_PUBLIC
538ft_bool_t
539fvalue_eq(const fvalue_t *a, const fvalue_t *b);
540
541WS_DLL_PUBLIC
542ft_bool_t
543fvalue_ne(const fvalue_t *a, const fvalue_t *b);
544
545WS_DLL_PUBLIC
546ft_bool_t
547fvalue_gt(const fvalue_t *a, const fvalue_t *b);
548
549WS_DLL_PUBLIC
550ft_bool_t
551fvalue_ge(const fvalue_t *a, const fvalue_t *b);
552
553WS_DLL_PUBLIC
554ft_bool_t
555fvalue_lt(const fvalue_t *a, const fvalue_t *b);
556
557WS_DLL_PUBLIC
558ft_bool_t
559fvalue_le(const fvalue_t *a, const fvalue_t *b);
560
561WS_DLL_PUBLIC
562ft_bool_t
563fvalue_contains(const fvalue_t *a, const fvalue_t *b);
564
565WS_DLL_PUBLIC
566ft_bool_t
567fvalue_matches(const fvalue_t *a, const ws_regex_t *re);
568
569WS_DLL_PUBLIC
570bool
571fvalue_is_zero(const fvalue_t *a);
572
573WS_DLL_PUBLIC
574bool
575fvalue_is_negative(const fvalue_t *a);
576
577WS_DLL_PUBLIC
578bool
579fvalue_is_nan(const fvalue_t *a);
580
581WS_DLL_PUBLIC
582size_t
583fvalue_length2(fvalue_t *fv);
584
585WS_DLL_PUBLIC
587fvalue_slice(fvalue_t *fv, drange_t *dr);
588
589WS_DLL_PUBLIC
591fvalue_bitwise_and(const fvalue_t *a, const fvalue_t *b, char **err_msg);
592
593WS_DLL_PUBLIC
595fvalue_unary_minus(const fvalue_t *fv, char **err_msg);
596
597WS_DLL_PUBLIC
599fvalue_add(const fvalue_t *a, const fvalue_t *b, char **err_msg);
600
601WS_DLL_PUBLIC
603fvalue_subtract(const fvalue_t *a, const fvalue_t *b, char **err_msg);
604
605WS_DLL_PUBLIC
607fvalue_multiply(const fvalue_t *a, const fvalue_t *b, char **err_msg);
608
609WS_DLL_PUBLIC
611fvalue_divide(const fvalue_t *a, const fvalue_t *b, char **err_msg);
612
613WS_DLL_PUBLIC
615fvalue_modulo(const fvalue_t *a, const fvalue_t *b, char **err_msg);
616
617WS_DLL_PUBLIC
618unsigned
619fvalue_hash(const fvalue_t *fv);
620
621WS_DLL_PUBLIC
622bool
623fvalue_equal(const fvalue_t *a, const fvalue_t *b);
624
625#ifdef __cplusplus
626}
627#endif /* __cplusplus */
628
629#endif /* __FTYPES_H__ */
630
631/*
632 * Editor modelines - https://www.wireshark.org/tools/modelines.html
633 *
634 * Local variables:
635 * c-basic-offset: 8
636 * tab-width: 8
637 * indent-tabs-mode: t
638 * End:
639 *
640 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
641 * :indentSize=8:tabSize=8:noTabs=false:
642 */
Definition drange.h:40
Definition guid-utils.h:23
Definition ftypes-int.h:98
Definition ftypes-int.h:17
Definition ftypes.h:309
Definition wmem_allocator.h:27
Definition wmem_strbuf.h:39
Definition regex.c:17
Definition inet_cidr.h:22
Definition inet_cidr.h:27
Definition nstime.h:26
Definition tvbuff-int.h:35