diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 20:34:10 +0000 |
commit | e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch) | |
tree | 68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/next_tvb.c | |
parent | Initial commit. (diff) | |
download | wireshark-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/next_tvb.c')
-rw-r--r-- | epan/next_tvb.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/epan/next_tvb.c b/epan/next_tvb.c new file mode 100644 index 00000000..d0f24ab3 --- /dev/null +++ b/epan/next_tvb.c @@ -0,0 +1,124 @@ +/* next_tvb.c + * Routines for "next tvb" list + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include <glib.h> + +#include <epan/packet.h> + +#include "next_tvb.h" + +next_tvb_list_t* next_tvb_list_new(wmem_allocator_t *pool) { + next_tvb_list_t *list = wmem_new0(pool, next_tvb_list_t); + list->pool = pool; + return list; +} + +void next_tvb_add_handle(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_handle_t handle) { + next_tvb_item_t *item; + + item = wmem_new(list->pool, next_tvb_item_t); + + item->type = NTVB_HANDLE; + item->handle = handle; + item->tvb = tvb; + item->tree = tree; + + if (list->last) { + list->last->next = item; + } else { + list->first = item; + } + item->next = NULL; + item->previous = list->last; + list->last = item; + list->count++; +} + +void next_tvb_add_uint(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_table_t table, guint32 uint_val) { + next_tvb_item_t *item; + + item = wmem_new(list->pool, next_tvb_item_t); + + item->type = NTVB_UINT; + item->table = table; + item->uint_val = uint_val; + item->tvb = tvb; + item->tree = tree; + + if (list->last) { + list->last->next = item; + } else { + list->first = item; + } + item->next = NULL; + item->previous = list->last; + list->last = item; + list->count++; +} + +void next_tvb_add_string(next_tvb_list_t *list, tvbuff_t *tvb, proto_tree *tree, dissector_table_t table, const gchar *string) { + next_tvb_item_t *item; + + item = wmem_new(list->pool, next_tvb_item_t); + + item->type = NTVB_STRING; + item->table = table; + item->string = string; + item->tvb = tvb; + item->tree = tree; + + if (list->last) { + list->last->next = item; + } else { + list->first = item; + } + item->next = NULL; + item->previous = list->last; + list->last = item; + list->count++; +} + +void next_tvb_call(next_tvb_list_t *list, packet_info *pinfo, proto_tree *tree, dissector_handle_t handle, dissector_handle_t data_handle) { + next_tvb_item_t *item; + + item = list->first; + while (item) { + if (item->tvb && tvb_captured_length(item->tvb)) { + switch (item->type) { + case NTVB_HANDLE: + call_dissector((item->handle) ? item->handle : ((handle) ? handle : data_handle), item->tvb, pinfo, (item->tree) ? item->tree : tree); + break; + case NTVB_UINT: + dissector_try_uint(item->table, item->uint_val, item->tvb, pinfo, (item->tree) ? item->tree : tree); + break; + case NTVB_STRING: + dissector_try_string(item->table, item->string, item->tvb, pinfo, (item->tree) ? item->tree : tree, NULL); + break; + } + } + item = item->next; + } +} + + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local Variables: + * c-basic-offset: 2 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=2 tabstop=8 expandtab: + * :indentSize=2:tabSize=8:noTabs=true: + */ |