Wireshark 4.7.0
The Wireshark network protocol analyzer
Loading...
Searching...
No Matches
protobuf-helper.h
Go to the documentation of this file.
1
13/* The packet-protobuf dissector needs get information from *.proto files for dissecting
14 * protobuf packet correctly. The information includes:
15 * - The names of MESSAGE, ENUM, FIELD, ENUM_VALUE;
16 * - The data type of FIELD which assuring the value of protobuf field of packet can be dissected correctly.
17 *
18 * At present, we use C Protocol Buffers Language Parser which generated by protobuf_lang_parser.lemon and protobuf_lang_scanner.l.
19 * Because wireshark is mainly implemented in plain ANSI C but the official protobuf library is implemented in C++ language.
20 *
21 * One day, if C++ library is allowed, we can create a protobuf-helper.cpp file, that invoking official protobuf C++ library directly,
22 * to replace protobuf-helper.c. The packet-protobuf.c can keep unchanged.
23 */
24#pragma once
25#include <wsutil/value_string.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif /* __cplusplus */
30
31/* Protobuf field type. Must be kept in sync with FieldType of protobuf wire_format_lite.h */
32#define protobuf_field_type_VALUE_STRING_LIST(XXX) \
33 XXX(PROTOBUF_TYPE_NONE, 0, "") \
34 XXX(PROTOBUF_TYPE_DOUBLE, 1, "double") \
35 XXX(PROTOBUF_TYPE_FLOAT, 2, "float") \
36 XXX(PROTOBUF_TYPE_INT64, 3, "int64") \
37 XXX(PROTOBUF_TYPE_UINT64, 4, "uint64") \
38 XXX(PROTOBUF_TYPE_INT32, 5, "int32") \
39 XXX(PROTOBUF_TYPE_FIXED64, 6, "fixed64") \
40 XXX(PROTOBUF_TYPE_FIXED32, 7, "fixed32") \
41 XXX(PROTOBUF_TYPE_BOOL, 8, "bool") \
42 XXX(PROTOBUF_TYPE_STRING, 9, "string") \
43 XXX(PROTOBUF_TYPE_GROUP, 10, "group") \
44 XXX(PROTOBUF_TYPE_MESSAGE, 11, "message") \
45 XXX(PROTOBUF_TYPE_BYTES, 12, "bytes") \
46 XXX(PROTOBUF_TYPE_UINT32, 13, "uint32") \
47 XXX(PROTOBUF_TYPE_ENUM, 14, "enum") \
48 XXX(PROTOBUF_TYPE_SFIXED32, 15, "sfixed32") \
49 XXX(PROTOBUF_TYPE_SFIXED64, 16, "sfixed64") \
50 XXX(PROTOBUF_TYPE_SINT32, 17, "sint32") \
51 XXX(PROTOBUF_TYPE_SINT64, 18, "sint64")
52
53#define PROTOBUF_MAX_FIELD_TYPE 18
54
55VALUE_STRING_ENUM(protobuf_field_type);
56VALUE_STRING_ARRAY_GLOBAL_DCL(protobuf_field_type);
57
58/* like google::protobuf::DescriptorPool of protobuf cpp library */
59typedef struct PbwDescriptorPool PbwDescriptorPool;
60/* like google::protobuf::MethodDescriptor of protobuf cpp library */
61typedef struct PbwMethodDescriptor PbwMethodDescriptor;
62/* like google::protobuf::Descriptor of protobuf cpp library */
63typedef struct PbwDescriptor PbwDescriptor;
64/* like google::protobuf::FieldDescriptor of protobuf cpp library */
65typedef struct PbwFieldDescriptor PbwFieldDescriptor;
66/* like google::protobuf::EnumDescriptor of protobuf cpp library */
67typedef struct PbwEnumDescriptor PbwEnumDescriptor;
68/* like google::protobuf::EnumValueDescriptor of protobuf cpp library */
69typedef struct PbwEnumValueDescriptor PbwEnumValueDescriptor;
70
71typedef void(*pbw_report_error_cb_t)(const char *msg_format, ...);
72
78void
79pbw_reinit_DescriptorPool(PbwDescriptorPool** pool, const char** directories, pbw_report_error_cb_t error_cb);
80
81/* load a proto file, return 0 if success */
89int
90pbw_load_proto_file(PbwDescriptorPool* pool, const char* filename);
91
92/* like DescriptorPool::FindMethodByName */
100const PbwMethodDescriptor*
101pbw_DescriptorPool_FindMethodByName(const PbwDescriptorPool* pool, const char* name);
102
103/* like MethodDescriptor::name() */
110const char*
111pbw_MethodDescriptor_name(const PbwMethodDescriptor* method);
112
113/* like MethodDescriptor::full_name() */
120const char*
121pbw_MethodDescriptor_full_name(const PbwMethodDescriptor* method);
122
123/* like MethodDescriptor::input_type() */
130const PbwDescriptor*
131pbw_MethodDescriptor_input_type(const PbwMethodDescriptor* method);
132
133/* like MethodDescriptor::output_type() */
140const PbwDescriptor*
141pbw_MethodDescriptor_output_type(const PbwMethodDescriptor* method);
142
143/* like DescriptorPool::FindMessageTypeByName() */
151const PbwDescriptor*
152pbw_DescriptorPool_FindMessageTypeByName(const PbwDescriptorPool* pool, const char* name);
153
154/* like Descriptor::name() */
161const char*
162pbw_Descriptor_name(const PbwDescriptor* message);
163
164/* like Descriptor::full_name() */
171const char*
172pbw_Descriptor_full_name(const PbwDescriptor* message);
173
174/* like Descriptor::field_count() */
181int
182pbw_Descriptor_field_count(const PbwDescriptor* message);
183
184/* like Descriptor::field() */
192const PbwFieldDescriptor*
193pbw_Descriptor_field(const PbwDescriptor* message, int field_index);
194
195/* like Descriptor::FindFieldByNumber() */
203const PbwFieldDescriptor*
204pbw_Descriptor_FindFieldByNumber(const PbwDescriptor* message, int number);
205
206/* like Descriptor::FindFieldByName() */
214const PbwFieldDescriptor*
215pbw_Descriptor_FindFieldByName(const PbwDescriptor* message, const char* name);
216
217/* like FieldDescriptor::full_name() */
224const char*
225pbw_FieldDescriptor_full_name(const PbwFieldDescriptor* field);
226
227/* like FieldDescriptor::name() */
234const char*
235pbw_FieldDescriptor_name(const PbwFieldDescriptor* field);
236
237/* like FieldDescriptor::number() */
244int
245pbw_FieldDescriptor_number(const PbwFieldDescriptor* field);
246
247/* like FieldDescriptor::type() */
254int
255pbw_FieldDescriptor_type(const PbwFieldDescriptor* field);
256
257/* like FieldDescriptor::is_repeated() */
264int
265pbw_FieldDescriptor_is_repeated(const PbwFieldDescriptor* field);
266
267/* like FieldDescriptor::is_packed() */
274int
275pbw_FieldDescriptor_is_packed(const PbwFieldDescriptor* field);
276
277/* like FieldDescriptor::typeName() */
285const char*
286pbw_FieldDescriptor_typeName(wmem_allocator_t* scope, int field_type);
287
288/* like FieldDescriptor::message_type() */
295const PbwDescriptor*
296pbw_FieldDescriptor_message_type(const PbwFieldDescriptor* field);
297
298/* like FieldDescriptor::enum_type() */
305const PbwEnumDescriptor*
306pbw_FieldDescriptor_enum_type(const PbwFieldDescriptor* field);
307
308/* like FieldDescriptor::is_required() */
315bool
316pbw_FieldDescriptor_is_required(const PbwFieldDescriptor* field);
317
318/* like FieldDescriptor::has_default_value().
319 * Does this field have an explicitly-declared default value? */
326bool
327pbw_FieldDescriptor_has_default_value(const PbwFieldDescriptor* field);
328
329/* like FieldDescriptor::default_value_int32() */
336int32_t
337pbw_FieldDescriptor_default_value_int32(const PbwFieldDescriptor* field);
338
339/* like FieldDescriptor::default_value_int64() */
346int64_t
347pbw_FieldDescriptor_default_value_int64(const PbwFieldDescriptor* field);
348
349/* like FieldDescriptor::default_value_uint32() */
356uint32_t
357pbw_FieldDescriptor_default_value_uint32(const PbwFieldDescriptor* field);
358
359/* like FieldDescriptor::default_value_uint64() */
366uint64_t
367pbw_FieldDescriptor_default_value_uint64(const PbwFieldDescriptor* field);
368
369/* like FieldDescriptor::default_value_float() */
376float
377pbw_FieldDescriptor_default_value_float(const PbwFieldDescriptor* field);
378
379/* like FieldDescriptor::default_value_double() */
386double
387pbw_FieldDescriptor_default_value_double(const PbwFieldDescriptor* field);
388
389/* like FieldDescriptor::default_value_bool() */
396bool
397pbw_FieldDescriptor_default_value_bool(const PbwFieldDescriptor* field);
398
399/* like FieldDescriptor::default_value_string() */
407const char*
408pbw_FieldDescriptor_default_value_string(const PbwFieldDescriptor* field, int* size);
409
410/* like FieldDescriptor::default_value_enum() */
417const PbwEnumValueDescriptor*
418pbw_FieldDescriptor_default_value_enum(const PbwFieldDescriptor* field);
419
420/* like EnumDescriptor::name() */
427const char*
428pbw_EnumDescriptor_name(const PbwEnumDescriptor* anEnum);
429
430/* like EnumDescriptor::full_name() */
437const char*
438pbw_EnumDescriptor_full_name(const PbwEnumDescriptor* anEnum);
439
440/* like EnumDescriptor::value_count() */
447int
448pbw_EnumDescriptor_value_count(const PbwEnumDescriptor* anEnum);
449
450/* like EnumDescriptor::value() */
458const PbwEnumValueDescriptor*
459pbw_EnumDescriptor_value(const PbwEnumDescriptor* anEnum, int value_index);
460
461/* like EnumDescriptor::FindValueByNumber() */
469const PbwEnumValueDescriptor*
470pbw_EnumDescriptor_FindValueByNumber(const PbwEnumDescriptor* anEnum, int number);
471
472/* like EnumDescriptor::FindValueByName() */
480const PbwEnumValueDescriptor*
481pbw_EnumDescriptor_FindValueByName(const PbwEnumDescriptor* anEnum, const char* name);
482
483/* like EnumValueDescriptor::name() */
490const char*
491pbw_EnumValueDescriptor_name(const PbwEnumValueDescriptor* enumValue);
492
493/* like EnumValueDescriptor::full_name() */
500const char*
501pbw_EnumValueDescriptor_full_name(const PbwEnumValueDescriptor* enumValue);
502
503/* like EnumValueDescriptor::number() */
510int
511pbw_EnumValueDescriptor_number(const PbwEnumValueDescriptor* enumValue);
512
513/* visit all messages of this pool */
521void
522pbw_foreach_message(const PbwDescriptorPool* pool, void (*cb)(const PbwDescriptor* message, void* userdata), void* userdata);
523
524#ifdef __cplusplus
525}
526#endif /* __cplusplus */
527
528/*
529 * Editor modelines - https://www.wireshark.org/tools/modelines.html
530 *
531 * Local variables:
532 * c-basic-offset: 4
533 * tab-width: 8
534 * indent-tabs-mode: nil
535 * End:
536 *
537 * vi: set shiftwidth=4 tabstop=8 expandtab:
538 * :indentSize=4:tabSize=8:noTabs=true:
539 */
const char * pbw_EnumValueDescriptor_full_name(const PbwEnumValueDescriptor *enumValue)
Get the full name of an enum value descriptor.
Definition protobuf-helper.c:284
int pbw_FieldDescriptor_number(const PbwFieldDescriptor *field)
Retrieves the number associated with a Protocol Buffers field descriptor.
Definition protobuf-helper.c:134
int pbw_Descriptor_field_count(const PbwDescriptor *message)
Get the count of fields in a Protocol Buffers descriptor.
Definition protobuf-helper.c:98
const char * pbw_EnumDescriptor_name(const PbwEnumDescriptor *anEnum)
Get the name of an enum descriptor.
Definition protobuf-helper.c:242
const PbwMethodDescriptor * pbw_DescriptorPool_FindMethodByName(const PbwDescriptorPool *pool, const char *name)
Finds a method descriptor by name in a descriptor pool.
Definition protobuf-helper.c:50
const char * pbw_FieldDescriptor_full_name(const PbwFieldDescriptor *field)
Get the full name of a field descriptor.
Definition protobuf-helper.c:122
bool pbw_FieldDescriptor_default_value_bool(const PbwFieldDescriptor *field)
Get the default value of a boolean field descriptor.
Definition protobuf-helper.c:224
double pbw_FieldDescriptor_default_value_double(const PbwFieldDescriptor *field)
Retrieves the default value of a double field descriptor.
Definition protobuf-helper.c:218
const char * pbw_EnumDescriptor_full_name(const PbwEnumDescriptor *anEnum)
Get the full name of an enum descriptor.
Definition protobuf-helper.c:248
const char * pbw_EnumValueDescriptor_name(const PbwEnumValueDescriptor *enumValue)
Get the name of an EnumValueDescriptor.
Definition protobuf-helper.c:278
const PbwFieldDescriptor * pbw_Descriptor_FindFieldByNumber(const PbwDescriptor *message, int number)
Finds a field descriptor by its number in a message descriptor.
Definition protobuf-helper.c:110
const PbwDescriptor * pbw_MethodDescriptor_input_type(const PbwMethodDescriptor *method)
Retrieves the input type descriptor for a method.
Definition protobuf-helper.c:68
const char * pbw_Descriptor_name(const PbwDescriptor *message)
Retrieves the name of a Protocol Buffers descriptor.
Definition protobuf-helper.c:92
bool pbw_FieldDescriptor_has_default_value(const PbwFieldDescriptor *field)
Check if a field descriptor has a default value.
Definition protobuf-helper.c:182
const char * pbw_FieldDescriptor_default_value_string(const PbwFieldDescriptor *field, int *size)
Get the default value string of a protobuf field descriptor.
Definition protobuf-helper.c:230
int32_t pbw_FieldDescriptor_default_value_int32(const PbwFieldDescriptor *field)
Retrieves the default value for an int32 field descriptor.
Definition protobuf-helper.c:188
const char * pbw_MethodDescriptor_name(const PbwMethodDescriptor *method)
Get the name of a Protocol Buffers method descriptor.
Definition protobuf-helper.c:56
const PbwEnumValueDescriptor * pbw_EnumDescriptor_FindValueByNumber(const PbwEnumDescriptor *anEnum, int number)
Finds an enum value descriptor by its number.
Definition protobuf-helper.c:266
int pbw_FieldDescriptor_is_repeated(const PbwFieldDescriptor *field)
Check if a field descriptor is repeated.
Definition protobuf-helper.c:146
bool pbw_FieldDescriptor_is_required(const PbwFieldDescriptor *field)
Check if a field descriptor is required.
Definition protobuf-helper.c:176
const PbwDescriptor * pbw_MethodDescriptor_output_type(const PbwMethodDescriptor *method)
Retrieves the output type of a method descriptor.
Definition protobuf-helper.c:74
int64_t pbw_FieldDescriptor_default_value_int64(const PbwFieldDescriptor *field)
Retrieves the default value for a field descriptor as an int64.
Definition protobuf-helper.c:194
float pbw_FieldDescriptor_default_value_float(const PbwFieldDescriptor *field)
Retrieves the default value of a float field descriptor.
Definition protobuf-helper.c:212
void pbw_foreach_message(const PbwDescriptorPool *pool, void(*cb)(const PbwDescriptor *message, void *userdata), void *userdata)
Iterates over all messages in a descriptor pool and applies a callback function to each.
Definition protobuf-helper.c:296
const char * pbw_FieldDescriptor_name(const PbwFieldDescriptor *field)
Retrieves the name of a Protocol Buffers field descriptor.
Definition protobuf-helper.c:128
int pbw_FieldDescriptor_type(const PbwFieldDescriptor *field)
Get the type of a Protocol Buffers field descriptor.
Definition protobuf-helper.c:140
int pbw_load_proto_file(PbwDescriptorPool *pool, const char *filename)
Loads a Protocol Buffers file into the descriptor pool.
Definition protobuf-helper.c:40
int pbw_EnumDescriptor_value_count(const PbwEnumDescriptor *anEnum)
Get the count of values in an enum descriptor.
Definition protobuf-helper.c:254
uint64_t pbw_FieldDescriptor_default_value_uint64(const PbwFieldDescriptor *field)
Get the default value for a uint64 field descriptor.
Definition protobuf-helper.c:206
const PbwEnumValueDescriptor * pbw_EnumDescriptor_value(const PbwEnumDescriptor *anEnum, int value_index)
Retrieves a PbwEnumValueDescriptor by its index.
Definition protobuf-helper.c:260
const char * pbw_Descriptor_full_name(const PbwDescriptor *message)
Get the full name of a Protocol Buffers descriptor.
Definition protobuf-helper.c:86
const char * pbw_MethodDescriptor_full_name(const PbwMethodDescriptor *method)
Get the full name of a method descriptor.
Definition protobuf-helper.c:62
const PbwFieldDescriptor * pbw_Descriptor_field(const PbwDescriptor *message, int field_index)
Retrieves a field descriptor by index from a message descriptor.
Definition protobuf-helper.c:104
uint32_t pbw_FieldDescriptor_default_value_uint32(const PbwFieldDescriptor *field)
Retrieves the default value for a uint32 field descriptor.
Definition protobuf-helper.c:200
const PbwEnumValueDescriptor * pbw_FieldDescriptor_default_value_enum(const PbwFieldDescriptor *field)
Get the default value of an enum field descriptor.
Definition protobuf-helper.c:236
int pbw_FieldDescriptor_is_packed(const PbwFieldDescriptor *field)
Checks if the given field descriptor is packed.
Definition protobuf-helper.c:152
const PbwDescriptor * pbw_FieldDescriptor_message_type(const PbwFieldDescriptor *field)
Retrieves the message type associated with a Protocol Buffers field descriptor.
Definition protobuf-helper.c:164
int pbw_EnumValueDescriptor_number(const PbwEnumValueDescriptor *enumValue)
Get the number associated with a Protocol Buffers enum value descriptor.
Definition protobuf-helper.c:290
const char * pbw_FieldDescriptor_typeName(wmem_allocator_t *scope, int field_type)
Retrieves the type name for a given field type.
Definition protobuf-helper.c:158
void pbw_reinit_DescriptorPool(PbwDescriptorPool **pool, const char **directories, pbw_report_error_cb_t error_cb)
Definition protobuf-helper.c:33
const PbwDescriptor * pbw_DescriptorPool_FindMessageTypeByName(const PbwDescriptorPool *pool, const char *name)
Finds a message type by its name in a descriptor pool.
Definition protobuf-helper.c:80
const PbwFieldDescriptor * pbw_Descriptor_FindFieldByName(const PbwDescriptor *message, const char *name)
Finds a field descriptor by name in a message descriptor.
Definition protobuf-helper.c:116
const PbwEnumDescriptor * pbw_FieldDescriptor_enum_type(const PbwFieldDescriptor *field)
Get the enum type of a field descriptor.
Definition protobuf-helper.c:170
const PbwEnumValueDescriptor * pbw_EnumDescriptor_FindValueByName(const PbwEnumDescriptor *anEnum, const char *name)
Finds a value descriptor by name in an enum descriptor.
Definition protobuf-helper.c:272
Internal memory allocator interface used by the wmem subsystem.
Definition wmem_allocator.h:34