summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-udp.h
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-udp.h')
-rw-r--r--epan/dissectors/packet-udp.h146
1 files changed, 146 insertions, 0 deletions
diff --git a/epan/dissectors/packet-udp.h b/epan/dissectors/packet-udp.h
new file mode 100644
index 00000000..7d548843
--- /dev/null
+++ b/epan/dissectors/packet-udp.h
@@ -0,0 +1,146 @@
+/* packet-udp.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#ifndef __PACKET_UDP_H__
+#define __PACKET_UDP_H__
+
+#include "ws_symbol_export.h"
+
+#include <epan/conversation.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* UDP structs and definitions */
+typedef struct _e_udphdr {
+ guint16 uh_sport;
+ guint16 uh_dport;
+ guint32 uh_ulen;
+ guint32 uh_sum_cov;
+ guint16 uh_sum;
+ guint32 uh_stream; /* this stream index field is included to help differentiate when address/port pairs are reused */
+ address ip_src;
+ address ip_dst;
+} e_udphdr;
+
+/* Conversation and process structures originally copied from packet-tcp.c */
+typedef struct _udp_flow_t {
+ /* Process info, currently discovered via IPFIX */
+ guint32 process_uid; /* UID of local process */
+ guint32 process_pid; /* PID of local process */
+ gchar *username; /* Username of the local process */
+ gchar *command; /* Local process name + path + args */
+} udp_flow_t;
+
+struct udp_analysis {
+ /* These two structs are managed based on comparing the source
+ * and destination addresses and, if they're equal, comparing
+ * the source and destination ports.
+ *
+ * If the source is greater than the destination, then stuff
+ * sent from src is in ual1.
+ *
+ * If the source is less than the destination, then stuff
+ * sent from src is in ual2.
+ *
+ * XXX - if the addresses and ports are equal, we don't guarantee
+ * the behavior.
+ */
+ udp_flow_t flow1;
+ udp_flow_t flow2;
+
+ /* These pointers are set by get_udp_conversation_data()
+ * fwd point in the same direction as the current packet
+ * and rev in the reverse direction
+ */
+ udp_flow_t *fwd;
+ udp_flow_t *rev;
+
+ /* Keep track of udp stream numbers instead of using the conversation
+ * index (as how it was done before). This prevents gaps in the
+ * stream index numbering
+ */
+ guint32 stream;
+
+ /* Remember the timestamp of the first frame seen in this udp
+ * conversation to be able to calculate a relative time compared
+ * to the start of this conversation
+ */
+ nstime_t ts_first;
+
+ /* Remember the timestamp of the frame that was last seen in this
+ * udp conversation to be able to calculate a delta time compared
+ * to previous frame in this conversation
+ */
+ nstime_t ts_prev;
+};
+
+/** Associate process information with a given flow
+ *
+ * @param frame_num The frame number
+ * @param local_addr The local IPv4 or IPv6 address of the process
+ * @param remote_addr The remote IPv4 or IPv6 address of the process
+ * @param local_port The local TCP port of the process
+ * @param remote_port The remote TCP port of the process
+ * @param uid The numeric user ID of the process
+ * @param pid The numeric PID of the process
+ * @param username Ephemeral string containing the full or partial process name
+ * @param command Ephemeral string containing the full or partial process name
+ */
+extern void
+add_udp_process_info(guint32 frame_num, address *local_addr, address *remote_addr,
+ guint16 local_port, guint16 remote_port,
+ guint32 uid, guint32 pid,
+ gchar *username, gchar *command);
+
+/** Get the current number of UDP streams
+ *
+ * @return The number of UDP streams
+ */
+WS_DLL_PUBLIC guint32
+get_udp_stream_count(void);
+
+WS_DLL_PUBLIC void
+decode_udp_ports(tvbuff_t *, int, packet_info *, proto_tree *, int, int, int);
+
+WS_DLL_PUBLIC struct udp_analysis *
+get_udp_conversation_data(conversation_t *, packet_info *);
+
+/*
+ * Loop for dissecting PDUs within a UDP packet; Similar to tcp_dissect_pdus,
+ * but doesn't have stream support. Assumes that a PDU consists of a
+ * fixed-length chunk of data that contains enough information
+ * to determine the length of the PDU, followed by rest of the PDU.
+ *
+ * @param tvb the tvbuff with the (remaining) packet data passed to dissector
+ * @param pinfo the packet info of this packet (additional info) passed to dissector
+ * @param tree the protocol tree to be build or NULL passed to dissector
+ * @param fixed_len is the length of the fixed-length part of the PDU.
+ * @param heuristic_check is the optional routine called to see if dissection
+ * should be done; it's passed "pinfo", "tvb", "offset" and "dissector_data".
+ * @param get_pdu_len is a routine called to get the length of the PDU from
+ * the fixed-length part of the PDU; it's passed "pinfo", "tvb", "offset" and
+ * "dissector_data".
+ * @param dissect_pdu the sub-dissector to be called
+ * @param dissector_data parameter to pass to subdissector
+ */
+WS_DLL_PUBLIC int
+udp_dissect_pdus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ guint fixed_len,
+ gboolean (*heuristic_check)(packet_info *, tvbuff_t *, int, void*),
+ guint (*get_pdu_len)(packet_info *, tvbuff_t *, int, void*),
+ dissector_t dissect_pdu, void* dissector_data);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif