summaryrefslogtreecommitdiffstats
path: root/ui/qt/models/atap_data_model.h
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/models/atap_data_model.h')
-rw-r--r--ui/qt/models/atap_data_model.h329
1 files changed, 329 insertions, 0 deletions
diff --git a/ui/qt/models/atap_data_model.h b/ui/qt/models/atap_data_model.h
new file mode 100644
index 0000000..38bdbd2
--- /dev/null
+++ b/ui/qt/models/atap_data_model.h
@@ -0,0 +1,329 @@
+/** @file
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef ATAP_DATA_MODEL_H
+#define ATAP_DATA_MODEL_H
+
+#include "config.h"
+
+#include "glib.h"
+
+#include <epan/tap.h>
+#include <epan/conversation.h>
+#include <epan/conversation_table.h>
+
+#include <QAbstractListModel>
+
+/**
+ * @brief DataModel for tap user data
+ *
+ * This datamodel provides the management for all tap data for the conversation
+ * and endpoint dialogs. It predominantly is implemented to work with conversation
+ * tap data. The management of displaying and correctly presenting the information
+ * is done in the corresponding type classes
+ *
+ * @see EndpointDataModel
+ * @see ConversationDataModel
+ */
+class ATapDataModel : public QAbstractListModel
+{
+ Q_OBJECT
+public:
+
+ enum {
+ DISPLAY_FILTER = Qt::UserRole,
+ UNFORMATTED_DISPLAYDATA,
+#ifdef HAVE_MAXMINDDB
+ GEODATA_AVAILABLE,
+ GEODATA_LOOKUPTABLE,
+ GEODATA_ADDRESS,
+#endif
+ TIMELINE_DATA,
+ ENDPOINT_DATATYPE,
+ PROTO_ID,
+ CONVERSATION_ID,
+ ROW_IS_FILTERED,
+ DATA_ADDRESS_TYPE,
+ DATA_IPV4_INTEGER,
+ DATA_IPV6_LIST,
+ };
+
+ typedef enum {
+ DATAMODEL_ENDPOINT,
+ DATAMODEL_CONVERSATION,
+ DATAMODEL_UNKNOWN
+ } dataModelType;
+
+ /**
+ * @brief Construct a new ATapDataModel object
+ *
+ * The tap will not be created automatically, but must be enabled by calling enableTap
+ *
+ * @param type an element of dataModelType. Either DATAMODEL_ENDPOINT or DATAMODEL_CONVERSATION are supported
+ * at this time
+ * @param protoId the protocol id for which the tap is created
+ * @param filter a potential filter to be used for the tap
+ * @param parent the parent for the class
+ *
+ * @see enableTap
+ */
+ explicit ATapDataModel(dataModelType type, int protoId, QString filter, QObject *parent = nullptr);
+ virtual ~ATapDataModel();
+
+ /**
+ * @brief Number of rows under the given parent in this model, which
+ * is the total number of rows for the empty QModelIndex, and 0 for
+ * any valid parent index (as no row has children; this is a flat table.)
+ *
+ * @param parent index of parent, QModelIndex() for the root
+ * @return int the number of rows under the parent
+ */
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+
+ virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
+ virtual QVariant headerData(int section, Qt::Orientation orientation = Qt::Horizontal, int role = Qt::DisplayRole) const = 0;
+ virtual QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const = 0;
+
+ /**
+ * @brief Returns the name for the tap being used
+ *
+ * @return QString the tap name, normally identical with the protocol name
+ */
+ QString tap() const;
+
+ /**
+ * @brief The protocol id for the tap
+ *
+ * @return int the id given in the constructor
+ */
+ int protoId() const;
+
+ /**
+ * @brief Set the filter string.
+ *
+ * A set filter can be reset by providing an empty string
+ *
+ * @param filter the filter for the tap
+ */
+ void setFilter(QString filter);
+
+ /**
+ * @brief Return a filter set for the model
+ *
+ * @return QString the filter string for the model
+ */
+ QString filter() const;
+
+ /**
+ * @brief Is the model set to resolve names in address and ports columns
+ *
+ * @return true yes, names will be resolved
+ * @return false no they won't
+ */
+ bool resolveNames() const;
+
+ /**
+ * @brief Enable or disable if names should be resolved
+ *
+ * @param resolve true if names should be resolved
+ */
+ void setResolveNames(bool resolve);
+
+ /**
+ * @brief Does the model allow names to be resolved
+ *
+ * @return true yes, names may be resolved (set via setResolveNames)
+ * @return false no, they won't be resolved
+ *
+ * @see setResolveNames
+ * @see resolveNames
+ */
+ bool allowsNameResolution() const;
+
+ /**
+ * @brief Use absolute time for any column supporting it
+ *
+ * @param absolute true to use absolute time values
+ */
+ void useAbsoluteTime(bool absolute);
+
+ /**
+ * @brief Use nanosecond timestamps if requested
+ *
+ * @param nanoseconds use nanosecond timestamps if required and requested
+ */
+ void useNanosecondTimestamps(bool nanoseconds);
+
+ /**
+ * @brief Are ports hidden for this model
+ *
+ * @return true the ports are hidden
+ * @return false the ports are not hidden
+ */
+ bool portsAreHidden() const;
+
+ /**
+ * @brief A total column is filled
+ *
+ * @return true if the column is filled
+ * @return false the column is empty
+ */
+ bool showTotalColumn() const;
+
+ /**
+ * @brief Enable tapping in this model.
+ *
+ * This will register the tap listener with the corresponding packet function.
+ * @note if the tap has not been disabled, this method will do nothing
+ *
+ * @return true the tap has been enabled
+ * @return false the tap has not been enabled
+ */
+ bool enableTap();
+
+ /**
+ * @brief Disable the tapping for this model
+ */
+ void disableTap();
+
+ /**
+ * @brief Return the model type
+ *
+ * @return dataModelType
+ */
+ dataModelType modelType() const;
+
+#ifdef HAVE_MAXMINDDB
+ /**
+ * @brief Does this model have geoip data available
+ *
+ * @return true it has
+ * @return false it has not
+ */
+ bool hasGeoIPData();
+#endif
+
+signals:
+ void tapListenerChanged(bool enable);
+
+protected:
+
+ static void tapReset(void *tapdata);
+ static void tapDraw(void *tap_data);
+
+ virtual tap_packet_cb conversationPacketHandler();
+
+ conv_hash_t * hash();
+
+ void resetData();
+ void updateData(GArray * data);
+
+ dataModelType _type;
+ GArray * storage_;
+ QString _filter;
+
+ bool _absoluteTime;
+ bool _nanoseconds;
+ bool _resolveNames;
+ bool _disableTap;
+
+ double _minRelStartTime;
+ double _maxRelStopTime;
+
+ register_ct_t* registerTable() const;
+
+private:
+ int _protoId;
+
+ conv_hash_t hash_;
+};
+
+class EndpointDataModel : public ATapDataModel
+{
+ Q_OBJECT
+public:
+
+ typedef enum
+ {
+ ENDP_COLUMN_ADDR,
+ ENDP_COLUMN_PORT,
+ ENDP_COLUMN_PACKETS,
+ ENDP_COLUMN_BYTES,
+ ENDP_COLUMN_PACKETS_TOTAL,
+ ENDP_COLUMN_BYTES_TOTAL,
+ ENDP_COLUMN_PKT_AB,
+ ENDP_COLUMN_BYTES_AB,
+ ENDP_COLUMN_PKT_BA,
+ ENDP_COLUMN_BYTES_BA,
+ ENDP_NUM_COLUMNS,
+ ENDP_COLUMN_GEO_COUNTRY = ENDP_NUM_COLUMNS,
+ ENDP_COLUMN_GEO_CITY,
+ ENDP_COLUMN_GEO_LATITUDE,
+ ENDP_COLUMN_GEO_LONGITUDE,
+ ENDP_COLUMN_GEO_AS_NUM,
+ ENDP_COLUMN_GEO_AS_ORG,
+ ENDP_NUM_GEO_COLUMNS
+ } endpoint_column_type_e;
+
+ explicit EndpointDataModel(int protoId, QString filter, QObject *parent = nullptr);
+
+ int columnCount(const QModelIndex &parent = QModelIndex()) const;
+ QVariant headerData(int section, Qt::Orientation orientation = Qt::Horizontal, int role = Qt::DisplayRole) const;
+ QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const;
+
+};
+
+class ConversationDataModel : public ATapDataModel
+{
+ Q_OBJECT
+public:
+
+ typedef enum {
+ CONV_COLUMN_SRC_ADDR,
+ CONV_COLUMN_SRC_PORT,
+ CONV_COLUMN_DST_ADDR,
+ CONV_COLUMN_DST_PORT,
+ CONV_COLUMN_PACKETS,
+ CONV_COLUMN_BYTES,
+ CONV_COLUMN_CONV_ID,
+ CONV_COLUMN_PACKETS_TOTAL,
+ CONV_COLUMN_BYTES_TOTAL,
+ CONV_COLUMN_PKT_AB,
+ CONV_COLUMN_BYTES_AB,
+ CONV_COLUMN_PKT_BA,
+ CONV_COLUMN_BYTES_BA,
+ CONV_COLUMN_START,
+ CONV_COLUMN_DURATION,
+ CONV_COLUMN_BPS_AB,
+ CONV_COLUMN_BPS_BA,
+ CONV_NUM_COLUMNS,
+ CONV_INDEX_COLUMN = CONV_NUM_COLUMNS
+ } conversation_column_type_e;
+
+ explicit ConversationDataModel(int protoId, QString filter, QObject *parent = nullptr);
+
+ int columnCount(const QModelIndex &parent = QModelIndex()) const;
+ QVariant headerData(int section, Qt::Orientation orientation = Qt::Horizontal, int role = Qt::DisplayRole) const;
+ QVariant data(const QModelIndex &idx, int role = Qt::DisplayRole) const;
+
+ void doDataUpdate();
+
+ conv_item_t * itemForRow(int row);
+
+ /**
+ * @brief Show the conversation id if available
+ *
+ * @return true a conversation id exists
+ * @return false none available
+ */
+ bool showConversationId(int row = 0) const;
+
+};
+
+#endif // ATAP_DATA_MODEL_H