pytest.ini: declare minimum version requirement
[metze/wireshark/wip.git] / epan / follow.h
index b1e02dbcad85724712c6244a0517204533bd5046..a8412738250b477e122ccbe87a02163bcddfefb9 100644 (file)
@@ -1,6 +1,4 @@
 /* follow.h
- *
- * $Id$
  *
  * Copyright 1998 Mike Hall <mlh@io.com>
  *
@@ -8,19 +6,7 @@
  * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * SPDX-License-Identifier: GPL-2.0-or-later
  *
  */
 
 extern "C" {
 #endif /* __cplusplus */
 
+#include <epan/epan.h>
 #include <epan/packet.h>
+#include <epan/ipv6.h>
+#include <epan/tap.h>
+#include <epan/wmem/wmem.h>
 #include "ws_symbol_export.h"
 
-#define MAX_IPADDR_LEN 16
+typedef enum {
+  TCP_STREAM = 0,
+  UDP_STREAM,
+  MAX_STREAM
+} stream_type;
+
+typedef enum {
+    FRS_OK,
+    FRS_OPEN_ERROR,
+    FRS_READ_ERROR,
+    FRS_PRINT_ERROR
+} frs_return_t;
+
+/* Type of follow we are doing */
+typedef enum {
+    FOLLOW_TCP,
+    FOLLOW_TLS,
+    FOLLOW_UDP,
+    FOLLOW_HTTP
+} follow_type_t;
+
+/* Show Type */
+typedef enum {
+    SHOW_ASCII,
+    SHOW_EBCDIC,
+    SHOW_HEXDUMP,
+    SHOW_CARRAY,
+    SHOW_RAW,
+    SHOW_YAML,
+    SHOW_UTF8,
+    SHOW_UTF16
+} show_type_t;
+
+
+/* Show Stream */
+typedef enum {
+    FROM_CLIENT,
+    FROM_SERVER,
+    BOTH_HOSTS
+} show_stream_t;
+
+typedef union _stream_addr {
+  guint32 ipv4;
+  ws_in6_addr ipv6;
+} stream_addr;
+
+struct _follow_info;
+
+typedef gboolean (*follow_print_line_func)(char *, size_t, gboolean, void *);
+typedef frs_return_t (*follow_read_stream_func)(struct _follow_info *follow_info, follow_print_line_func follow_print, void *arg);
 
-/* With MSVC and a libwireshark.dll, we need a special declaration. */
-WS_DLL_PUBLIC gboolean empty_tcp_stream;
-WS_DLL_PUBLIC gboolean incomplete_tcp_stream;
+typedef struct {
+    gboolean is_server;
+    guint32 packet_num;
+    guint32 seq; /* TCP only */
+    GByteArray *data;
+} follow_record_t;
+
+typedef struct _follow_info {
+    show_stream_t   show_stream;
+    char            *filter_out_filter;
+    GList           *payload;   /* "follow_record_t" entries, in reverse order. */
+    guint           bytes_written[2]; /* Index with FROM_CLIENT or FROM_SERVER for readability. */
+    guint32         seq[2]; /* TCP only */
+    GList           *fragments[2]; /* TCP only */
+    guint           client_port;
+    guint           server_port;
+    address         client_ip;
+    address         server_ip;
+    void*           gui_data;
+} follow_info_t;
+
+struct register_follow;
+typedef struct register_follow register_follow_t;
+
+typedef gchar* (*follow_conv_filter_func)(packet_info* pinfo, int* stream);
+typedef gchar* (*follow_index_filter_func)(int stream);
+typedef gchar* (*follow_address_filter_func)(address* src_addr, address* dst_addr, int src_port, int dst_port);
+typedef gchar* (*follow_port_to_display_func)(wmem_allocator_t *allocator, guint port);
 
-typedef struct _tcp_stream_chunk {
-  guint8      src_addr[MAX_IPADDR_LEN];
-  guint16     src_port;
-  guint32     dlen;
-} tcp_stream_chunk;
+WS_DLL_PUBLIC
+void register_follow_stream(const int proto_id, const char* tap_listener,
+                            follow_conv_filter_func conv_filter, follow_index_filter_func index_filter, follow_address_filter_func address_filter,
+                            follow_port_to_display_func port_to_display, tap_packet_cb tap_handler);
 
-/** Build a follow filter based on the current packet's conversation.
+/** Get protocol ID from registered follower
  *
- * @param packet_info[in] The current packet.
- * @return A filter that specifies the conversation. Must be g_free()d
- * the caller.
+ * @param follower Registered follower
+ * @return protocol id of follower
  */
-WS_DLL_PUBLIC
-gchar* build_follow_conv_filter( packet_info * );
+WS_DLL_PUBLIC int get_follow_proto_id(register_follow_t* follower);
 
-/** Build a follow filter based on the current TCP stream index.
- * follow_tcp_index() must be called prior to calling this.
+/** Get tap name string from registered follower (used for register_tap_listener)
  *
- * @return A filter that specifies the current stream. Must be g_free()d
- * the caller.
+ * @param follower Registered follower
+ * @return tap name string of follower
  */
-WS_DLL_PUBLIC
-gchar* build_follow_index_filter(void);
+WS_DLL_PUBLIC const char* get_follow_tap_string(register_follow_t* follower);
 
-WS_DLL_PUBLIC
-gboolean follow_tcp_addr( const address *, guint, const address *, guint );
+/** Get a registered follower by protocol short name
+ *
+ * @param proto_short_name Protocol short name
+ * @return tap registered follower if match, otherwise NULL
+ */
+WS_DLL_PUBLIC register_follow_t* get_follow_by_name(const char* proto_short_name);
 
-/** Select a TCP stream to follow via its index.
+/** Provide function that builds a follow filter based on the current packet's conversation.
  *
- * @param addr[in] The stream index to follow.
- * @return TRUE on success, FALSE on failure.
+ * @param follower [in] Registered follower
+ * @return A filter function handler
  */
-WS_DLL_PUBLIC
-gboolean follow_tcp_index( guint32 );
+WS_DLL_PUBLIC follow_conv_filter_func get_follow_conv_func(register_follow_t* follower);
 
-/** Get the current TCP index being followed.
+/** Provide function that builds a follow filter based on stream.
  *
- * @return The current TCP index. The behavior is undefined
- * if no TCP stream is being followed.
+ * @param follower [in] Registered follower
+ * @return A filter function handler
  */
-WS_DLL_PUBLIC
-guint32 get_follow_tcp_index(void);
+WS_DLL_PUBLIC follow_index_filter_func get_follow_index_func(register_follow_t* follower);
 
-void reassemble_tcp( guint32, guint32, guint32, guint32, const char*, guint32,
-                     int, address *, address *, guint, guint );
-WS_DLL_PUBLIC
-void  reset_tcp_reassembly( void );
+/** Provide function that builds a follow filter based on address/port pairs.
+ *
+ * @param follower [in] Registered follower
+ * @return A filter function handler
+ */
+WS_DLL_PUBLIC follow_address_filter_func get_follow_address_func(register_follow_t* follower);
 
-typedef struct {
-       guint8          ip_address[2][MAX_IPADDR_LEN];
-       guint32         port[2];
-       unsigned int    bytes_written[2];
-       gboolean        is_ipv6;
-} follow_stats_t;
+/** Provide function that resolves port number to name based on follower.
+ *
+ * @param follower [in] Registered follower
+ * @return A port resolver function handler
+ */
+WS_DLL_PUBLIC follow_port_to_display_func get_follow_port_to_display(register_follow_t* follower);
 
-WS_DLL_PUBLIC
-void follow_stats(follow_stats_t* stats);
+/** Provide function that handles tap data (tap_packet_cb parameter of register_tap_listener)
+ *
+ * @param follower [in] Registered follower
+ * @return A tap packet handler
+ */
+WS_DLL_PUBLIC tap_packet_cb get_follow_tap_handler(register_follow_t* follower);
+
+
+/** Tap function handler when dissector's tap provides follow data as a tvb.
+ * Used by TCP, UDP and HTTP followers
+ */
+WS_DLL_PUBLIC tap_packet_status
+follow_tvb_tap_listener(void *tapdata, packet_info *pinfo, epan_dissect_t *edt _U_, const void *data);
+
+/** Interator to walk all registered followers and execute func
+ *
+ * @param func action to be performed on all converation tables
+ * @param user_data any data needed to help perform function
+ */
+WS_DLL_PUBLIC void follow_iterate_followers(wmem_foreach_func func, gpointer user_data);
+
+/** Generate -z stat (tap) name for a follower
+ * Currently used only by TShark
+ *
+ * @param follower [in] Registered follower
+ * @return A tap data handler
+ */
+WS_DLL_PUBLIC gchar* follow_get_stat_tap_string(register_follow_t* follower);
+
+/** Clear counters, addresses and ports of follow_info_t
+ *
+ * @param info [in] follower info
+ */
+WS_DLL_PUBLIC void follow_reset_stream(follow_info_t* info);
+
+/** Free follow_info_t structure
+ * Free everything except the GUI element
+ *
+ * @param follow_info [in] follower info
+ */
+WS_DLL_PUBLIC void follow_info_free(follow_info_t* follow_info);
 
 #ifdef __cplusplus
 }