summaryrefslogtreecommitdiffstats
path: root/epan/proto_data.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/proto_data.c
parentInitial commit. (diff)
downloadwireshark-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/proto_data.c')
-rw-r--r--epan/proto_data.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/epan/proto_data.c b/epan/proto_data.c
new file mode 100644
index 0000000..eff897a
--- /dev/null
+++ b/epan/proto_data.c
@@ -0,0 +1,191 @@
+/* proto_data.c
+ * Protocol-specific data
+ *
+ * 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/wmem_scopes.h>
+#include <epan/packet_info.h>
+#include <epan/proto_data.h>
+#include <epan/proto.h>
+
+/* Protocol-specific data attached to a frame_data structure - protocol
+ index, key for multiple items with the same protocol index,
+ and opaque pointer. */
+typedef struct _proto_data {
+ int proto;
+ guint32 key;
+ void *proto_data;
+} proto_data_t;
+
+static gint
+p_compare(gconstpointer a, gconstpointer b)
+{
+ const proto_data_t *ap = (const proto_data_t *)a;
+ const proto_data_t *bp = (const proto_data_t *)b;
+
+ if (ap -> proto > bp -> proto) {
+ return 1;
+ } else if (ap -> proto == bp -> proto) {
+ if (ap->key > bp->key){
+ return 1;
+ } else if (ap -> key == bp -> key) {
+ return 0;
+ }
+ return -1;
+ } else {
+ return -1;
+ }
+}
+
+void
+p_add_proto_data(wmem_allocator_t *tmp_scope, struct _packet_info* pinfo, int proto, guint32 key, void *proto_data)
+{
+ proto_data_t *p1;
+ GSList **proto_list;
+ wmem_allocator_t *scope;
+
+ if (tmp_scope == pinfo->pool) {
+ scope = tmp_scope;
+ proto_list = &pinfo->proto_data;
+ } else if (tmp_scope == wmem_file_scope()) {
+ scope = wmem_file_scope();
+ proto_list = &pinfo->fd->pfd;
+ } else {
+ DISSECTOR_ASSERT(!"invalid wmem scope");
+ }
+
+ p1 = wmem_new(scope, proto_data_t);
+
+ p1->proto = proto;
+ p1->key = key;
+ p1->proto_data = proto_data;
+
+ /* Add it to the GSLIST */
+ *proto_list = g_slist_prepend(*proto_list, p1);
+}
+
+void
+p_set_proto_data(wmem_allocator_t *scope, struct _packet_info* pinfo, int proto, guint32 key, void *proto_data)
+{
+ proto_data_t temp;
+ GSList *item;
+
+ temp.proto = proto;
+ temp.key = key;
+ temp.proto_data = NULL;
+
+ if (scope == pinfo->pool) {
+ item = g_slist_find_custom(pinfo->proto_data, &temp, p_compare);
+ } else if (scope == wmem_file_scope()) {
+ item = g_slist_find_custom(pinfo->fd->pfd, &temp, p_compare);
+ } else {
+ DISSECTOR_ASSERT(!"invalid wmem scope");
+ }
+
+ if (item) {
+ proto_data_t *pd = (proto_data_t *)item->data;
+ pd->proto_data = proto_data;
+ return;
+ }
+
+ p_add_proto_data(scope, pinfo, proto, key, proto_data);
+}
+
+void *
+p_get_proto_data(wmem_allocator_t *scope, struct _packet_info* pinfo, int proto, guint32 key)
+{
+ proto_data_t temp, *p1;
+ GSList *item;
+
+ temp.proto = proto;
+ temp.key = key;
+ temp.proto_data = NULL;
+
+ if (scope == pinfo->pool) {
+ item = g_slist_find_custom(pinfo->proto_data, &temp, p_compare);
+ } else if (scope == wmem_file_scope()) {
+ item = g_slist_find_custom(pinfo->fd->pfd, &temp, p_compare);
+ } else {
+ DISSECTOR_ASSERT(!"invalid wmem scope");
+ }
+
+ if (item) {
+ p1 = (proto_data_t *)item->data;
+ return p1->proto_data;
+ }
+
+ return NULL;
+}
+
+void
+p_remove_proto_data(wmem_allocator_t *scope, struct _packet_info* pinfo, int proto, guint32 key)
+{
+ proto_data_t temp;
+ GSList *item;
+ GSList **proto_list;
+
+ temp.proto = proto;
+ temp.key = key;
+ temp.proto_data = NULL;
+
+ if (scope == pinfo->pool) {
+ item = g_slist_find_custom(pinfo->proto_data, &temp, p_compare);
+ proto_list = &pinfo->proto_data;
+ } else if (scope == wmem_file_scope()) {
+ item = g_slist_find_custom(pinfo->fd->pfd, &temp, p_compare);
+ proto_list = &pinfo->fd->pfd;
+ } else {
+ DISSECTOR_ASSERT(!"invalid wmem scope");
+ }
+
+ if (item) {
+ *proto_list = g_slist_remove(*proto_list, item->data);
+ }
+}
+
+gchar *
+p_get_proto_name_and_key(wmem_allocator_t *scope, struct _packet_info* pinfo, guint pfd_index){
+ proto_data_t *temp;
+
+ if (scope == pinfo->pool) {
+ temp = (proto_data_t *)g_slist_nth_data(pinfo->proto_data, pfd_index);
+ } else if (scope == wmem_file_scope()) {
+ temp = (proto_data_t *)g_slist_nth_data(pinfo->fd->pfd, pfd_index);
+ } else {
+ DISSECTOR_ASSERT(!"invalid wmem scope");
+ }
+
+ return wmem_strdup_printf(pinfo->pool, "[%s, key %u]",proto_get_protocol_name(temp->proto), temp->key);
+}
+
+#define PROTO_DEPTH_KEY 0x3c233fb5 // printf "0x%02x%02x\n" ${RANDOM} ${RANDOM}
+
+void p_set_proto_depth(struct _packet_info *pinfo, int proto, unsigned depth) {
+ p_set_proto_data(pinfo->pool, pinfo, proto, PROTO_DEPTH_KEY, GUINT_TO_POINTER(depth));
+}
+
+unsigned p_get_proto_depth(struct _packet_info *pinfo, int proto) {
+ return GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto, PROTO_DEPTH_KEY));
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 2
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=2 tabstop=8 expandtab:
+ * :indentSize=2:tabSize=8:noTabs=true:
+ */