merge_all_tap_menus() has been moved to menus.c.
[obnox/wireshark/wip.git] / gtk / sctp_stat.h
index 400a31bba0c44799a02fcc42017331b4c51bc504..8bbf64281df7b37d830ab0c1cdd1fb5ded170ffc 100644 (file)
@@ -3,8 +3,8 @@
  *
  * $Id$
  *
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
  *
  * This program is free software; you can redistribute it and/or
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  */
+
+#ifndef __SCTP_STAT_H__ 
+#define __SCTP_STAT_H__ 
+
 #include <epan/dissectors/packet-sctp.h>
 #include <epan/address.h>
-#ifndef WIN32
+#ifndef _WIN32
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#else
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
 #endif
 
 #define SCTP_DATA_CHUNK_ID               0
 #define SCTP_INIT_CHUNK_ID               1
 #define SCTP_INIT_ACK_CHUNK_ID           2
 #define SCTP_SACK_CHUNK_ID               3
+#define SCTP_HEARTBEAT_CHUNK_ID          4
+#define SCTP_HEARTBEAT_ACK_CHUNK_ID      5
+#define SCTP_ABORT_CHUNK_ID              6
+#define SCTP_SHUTDOWN_CHUNK_ID           7
+#define SCTP_SHUTDOWN_ACK_CHUNK_ID       8
+#define SCTP_ERROR_CHUNK_ID              9
+#define SCTP_COOKIE_ECHO_CHUNK_ID       10
+#define SCTP_COOKIE_ACK_CHUNK_ID        11
+#define SCTP_ECNE_CHUNK_ID              12
+#define SCTP_CWR_CHUNK_ID               13
+#define SCTP_SHUTDOWN_COMPLETE_CHUNK_ID 14
+#define SCTP_AUTH_CHUNK_ID              15 
+#define SCTP_NR_SACK_CHUNK_ID           16
+#define SCTP_FORWARD_TSN_CHUNK_ID     0xc0
+#define SCTP_ASCONF_ACK_CHUNK_ID      0x80
+#define SCTP_PKTDROP_CHUNK_ID         0x81
+#define SCTP_ASCONF_CHUNK_ID          0xc1
+#define SCTP_IETF_EXT                  255
+
+#define IS_SCTP_CHUNK_TYPE(t) \
+        (((t) <= 16) || ((t) == 0xC0) || ((t) == 0xC1) || ((t) == 0x80) || ((t) == 0x81))
 
 #define CHUNK_TYPE_LENGTH             1
 #define CHUNK_FLAGS_LENGTH            1
                                        DATA_CHUNK_STREAM_ID_LENGTH + \
                                        DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH + \
                                        DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH)
+#define MAX_ADDRESS_LEN                47
 
+/* The below value is 256 */
+#define NUM_CHUNKS     0xff
 
+/* This variable is used as an index into arrays
+ * which store the cumulative information corresponding
+ * all chunks with Chunk Type greater > 16
+ * The value for the below variable is 17
+ */
+#define OTHER_CHUNKS_INDEX     0xfe
+
+/* VNB */
+/* This variable stores the maximum chunk type value
+ * that can be associated with a sctp chunk.
+ */
+#define MAX_SCTP_CHUNK_TYPE 256
 
 typedef struct _tsn {
-       guint32 frame_number;
-       guint32      secs;    /* Absolute seconds */
-       guint32      usecs;
-       address src;
-       address dst;
-       GList           *tsns;
+       guint32 frame_number;
+       guint32 secs;    /* Absolute seconds */
+       guint32 usecs;
+       address src;
+       address dst;
+       guint32 first_tsn;
+       GList   *tsns;
 } tsn_t;
 
 typedef struct _sctp_tmp_info {
-       address src;
-       address dst;
+       address src;
+       address dst;
        guint16 port1;
        guint16 port2;
        guint32 verification_tag1;
        guint32 verification_tag2;
+       guint32 initiate_tag;
        guint32 n_tvbs;
-}sctp_tmp_info_t;
+} sctp_tmp_info_t;
 
 typedef struct _sctp_min_max {
-       guint32 tmp_min_secs;
-       guint32         tmp_min_usecs;
-       guint32         tmp_max_secs;
-       guint32 tmp_max_usecs;
-       guint32 tmp_min_tsn1;
-       guint32 tmp_min_tsn2;
-       guint32 tmp_max_tsn1;
-       guint32 tmp_max_tsn2;
-       gint    tmp_secs;
+       guint32 tmp_min_secs;
+       guint32 tmp_min_usecs;
+       guint32 tmp_max_secs;
+       guint32 tmp_max_usecs;
+       guint32 tmp_min_tsn1;
+       guint32 tmp_min_tsn2;
+       guint32 tmp_max_tsn1;
+       guint32 tmp_max_tsn2;
+       gint    tmp_secs;
 } sctp_min_max_t;
 
 struct tsn_sort{
@@ -112,101 +157,120 @@ struct tsn_sort{
        guint32 usecs;
        guint32 offset;
        guint32 length;
+       guint32 framenumber;
 };
 
+typedef struct _sctp_addr_chunk {
+       guint32  direction;
+       address* addr;
+       /* The array is initialized to MAX_SCTP_CHUNK_TYPE
+        * so that there is no memory overwrite
+        * when accessed using sctp chunk type as index.
+        */
+       guint32  addr_count[MAX_SCTP_CHUNK_TYPE];
+} sctp_addr_chunk;
 
 typedef struct _sctp_assoc_info {
-       address src;
-       address dst;
-       guint16 port1;
-       guint16 port2;
-       guint32 verification_tag1;
-       guint32 verification_tag2;
-       guint32 n_tvbs;
-       GList   *addr1;
-       GList   *addr2;
-       guint16 instream1;
-       guint16 outstream1;
-       guint16 instream2;
-       guint16 outstream2;
-       guint32 n_adler32_calculated;
-       guint32 n_adler32_correct;
-       guint32 n_crc32c_calculated;
-       guint32 n_crc32c_correct;
-       char checksum_type[8];
-       guint32 n_checksum_errors;
-       guint32 n_bundling_errors;
-       guint32 n_padding_errors;
-       guint32 n_length_errors;
-       guint32 n_value_errors;
-       guint32 n_data_chunks;
-       guint32 n_data_bytes;
-       guint32 n_packets;
-       guint32 n_data_chunks_ep1;
-       guint32 n_data_bytes_ep1;
-       guint32 n_data_chunks_ep2;
-       guint32 n_data_bytes_ep2;
-       guint32 n_sack_chunks_ep1;
-       guint32 n_sack_chunks_ep2;
-       guint32 n_array_tsn1;
-       guint32 n_array_tsn2;
-       guint32 max_window1;
-       guint32 max_window2;
-       gboolean init;
-       gboolean initack;
-       guint8 initack_dir;
-       guint8 direction;
-       guint32 min_secs;
-       guint32         min_usecs;
-       guint32         max_secs;
-       guint32 max_usecs;
-       guint32 min_tsn1;
-       guint32 min_tsn2;
-       guint32 max_tsn1;
-       guint32 max_tsn2;
-       guint32 max_bytes1;
-       guint32 max_bytes2;
-       GSList *min_max;
-       GList *frame_numbers;
-       GList *tsn1;
-       GArray *sort_tsn1;
-       GArray *sort_sack1;
-       GList *sack1;
-       GList *tsn2;
-       GArray *sort_tsn2;
-       GArray *sort_sack2;
-       GList *sack2;
-       gboolean check_address;
-       GList*  error_info_list;
+       address   src;
+       address   dst;
+       guint16   port1;
+       guint16   port2;
+       guint32   verification_tag1;
+       guint32   verification_tag2;
+       guint32   initiate_tag;
+       guint32   n_tvbs;
+       GList     *addr1;
+       GList     *addr2;
+       guint16   instream1;
+       guint16   outstream1;
+       guint16   instream2;
+       guint16   outstream2;
+       guint32   n_adler32_calculated;
+       guint32   n_adler32_correct;
+       guint32   n_crc32c_calculated;
+       guint32   n_crc32c_correct;
+       gchar     checksum_type[8];
+       guint32   n_checksum_errors;
+       guint32   n_bundling_errors;
+       guint32   n_padding_errors;
+       guint32   n_length_errors;
+       guint32   n_value_errors;
+       guint32   n_data_chunks;
+       guint32   n_data_bytes;
+       guint32   n_packets;
+       guint32   n_data_chunks_ep1;
+       guint32   n_data_bytes_ep1;
+       guint32   n_data_chunks_ep2;
+       guint32   n_data_bytes_ep2;
+       guint32   n_sack_chunks_ep1;
+       guint32   n_sack_chunks_ep2;
+       guint32   n_array_tsn1;
+       guint32   n_array_tsn2;
+       guint32   max_window1;
+       guint32   max_window2;
+       gboolean  init;
+       gboolean  initack;
+       guint8    initack_dir;
+       guint8    direction;
+       guint32   min_secs;
+       guint32   min_usecs;
+       guint32   max_secs;
+       guint32   max_usecs;
+       guint32   min_tsn1;
+       guint32   min_tsn2;
+       guint32   max_tsn1;
+       guint32   max_tsn2;
+       guint32   max_bytes1;
+       guint32   max_bytes2;
+       GSList    *min_max;
+       GList     *frame_numbers;
+       GList     *tsn1;
+       GPtrArray *sort_tsn1;
+       GPtrArray *sort_sack1;
+       GList     *sack1;
+       GList     *tsn2;
+       GPtrArray *sort_tsn2;
+       GPtrArray *sort_sack2;
+       GList     *sack2;
+       gboolean  check_address;
+       GList*    error_info_list;
+       /* The array is initialized to MAX_SCTP_CHUNK_TYPE
+        * so that there is no memory overwrite
+        * when accessed using sctp chunk type as index.
+        */
+       guint32   chunk_count[MAX_SCTP_CHUNK_TYPE];
+       guint32   ep1_chunk_count[MAX_SCTP_CHUNK_TYPE];
+       guint32   ep2_chunk_count[MAX_SCTP_CHUNK_TYPE];
+       GList*    addr_chunk_count;
 } sctp_assoc_info_t;
 
 typedef struct _sctp_error_info {
-       guint32 frame_number;
-       char    chunk_info[200];
-       char    *info_text;
-}      sctp_error_info_t;
+       guint32 frame_number;
+       gchar   chunk_info[200];
+       const gchar  *info_text;
+} sctp_error_info_t;
 
 
 typedef struct _sctp_allassocs_info {
-       guint32 sum_tvbs;
-       GList*  assoc_info_list;
+       guint32  sum_tvbs;
+       GList*   assoc_info_list;
        gboolean is_registered;
-       GList*  children;
+       GList*   children;
 } sctp_allassocs_info_t;
 
 
 
 struct notes {
-       GtkWidget *checktype;
-       GtkWidget *checksum;
-       GtkWidget *bundling;
-       GtkWidget *padding;
-       GtkWidget *length;
-       GtkWidget *value;
-       GtkWidget *chunks_ep1;
-       GtkWidget *bytes_ep1;
-       GtkWidget *chunks_ep2;
-       GtkWidget *bytes_ep2;
+       GtkWidget   *checktype;
+       GtkWidget   *checksum;
+       GtkWidget   *bundling;
+       GtkWidget   *padding;
+       GtkWidget   *length;
+       GtkWidget   *value;
+       GtkWidget   *chunks_ep1;
+       GtkWidget   *bytes_ep1;
+       GtkWidget   *chunks_ep2;
+       GtkWidget   *bytes_ep2;
        struct page *page2;
        struct page *page3;
 };
@@ -224,57 +288,70 @@ struct page {
 };
 
 struct sctp_analyse {
-       sctp_assoc_info_tassoc;
-       GtkWidget* window;
-       struct notes *analyse_nb;
-       GList *children;
-       guint16 num_children;
+       sctp_assoc_info_t *assoc;
+       GtkWidget*        window;
+       struct notes      *analyse_nb;
+       GList             *children;
+       guint16           num_children;
 };
 
-
 typedef struct _sctp_graph_t {
-       gboolean needs_redraw;
-       gfloat x_interval;
-       gfloat y_interval;
+       gboolean  needs_redraw;
+       gfloat    x_interval;
+       gfloat    y_interval;
        GtkWidget *window;
        GtkWidget *draw_area;
+#if GTK_CHECK_VERSION(2,22,0)
+       cairo_surface_t *surface;
+#else
        GdkPixmap *pixmap;
-       int pixmap_width;
-       int pixmap_height;
-       int graph_type;
-       gdouble x_old;
-       gdouble y_old;
-       gdouble x_new;
-       gdouble y_new;
-       guint16 offset;
-       guint16 length;
-       gboolean tmp;
-       gboolean rectangle;
-       guint32 x1_tmp_sec;
-       guint32 x2_tmp_sec;
-       guint32 x1_tmp_usec;
-       guint32 x2_tmp_usec;
-       guint32 tmp_width;
-       guint32 axis_width;
-       guint32 y1_tmp;
-       guint32 y2_tmp;
-       guint32 tmp_min_tsn1;
-       guint32 tmp_max_tsn1;
-       guint32 tmp_min_tsn2;
-       guint32 tmp_max_tsn2;
-       guint32 min_x;
-       guint32 max_x;
-       guint32 min_y;
-       guint32 max_y;
+#endif
+       gint      surface_width;
+       gint      surface_height;
+       gint      graph_type;
+       gdouble   x_old;
+       gdouble   y_old;
+       gdouble   x_new;
+       gdouble   y_new;
+       guint16   offset;
+       guint16   length;
+       gboolean  tmp;
+       gboolean  rectangle;
+       gboolean  rectangle_present;
+       guint32   rect_x_min;
+       guint32   rect_x_max;
+       guint32   rect_y_min;
+       guint32   rect_y_max;
+       guint32   x1_tmp_sec;
+       guint32   x2_tmp_sec;
+       guint32   x1_tmp_usec;
+       guint32   x2_tmp_usec;
+       guint32   x1_akt_sec;
+       guint32   x2_akt_sec;
+       guint32   x1_akt_usec;
+       guint32   x2_akt_usec;
+       guint32   tmp_width;
+       guint32   axis_width;
+       guint32   y1_tmp;
+       guint32   y2_tmp;
+       guint32   tmp_min_tsn1;
+       guint32   tmp_max_tsn1;
+       guint32   tmp_min_tsn2;
+       guint32   tmp_max_tsn2;
+       guint32   min_x;
+       guint32   max_x;
+       guint32   min_y;
+       guint32   max_y;
+       gboolean  uoff;
 } sctp_graph_t;
 
 
 
 struct sctp_udata {
-       sctp_assoc_info_t assoc;
-       sctp_graph_t *io;
-       struct sctp_analyseparent;
-       guint16 dir;
+       sctp_assoc_info_t   *assoc;
+       sctp_graph_t        *io;
+       struct sctp_analyse *parent;
+       guint16             dir;
 };
 
 
@@ -298,12 +375,22 @@ void sctp_error_dlg_show(sctp_assoc_info_t* assoc);
 
 void sctp_stat_dlg_update(void);
 
+void sctp_chunk_stat_dlg_update(struct sctp_udata* udata, unsigned int direction);
+
+void sctp_chunk_dlg_show(struct sctp_analyse* userdata);
+
+void sctp_chunk_stat_dlg_show(unsigned int direction, struct sctp_analyse* userdata);
+
 GtkWidget *get_stat_dlg(void);
 
+GtkWidget *get_chunk_stat_dlg(void);
+
 void update_analyse_dlg(struct sctp_analyse* u_data);
 
+#ifdef MAIN_MENU_USE_UIMANAGER
+#else
 void sctp_analyse_start(GtkWidget *w _U_, gpointer data _U_);
-
+#endif
 void increase_childcount(struct sctp_analyse *parent);
 
 void decrease_childcount(struct sctp_analyse *parent);
@@ -319,3 +406,7 @@ void increase_analyse_childcount(void);
 void set_analyse_child(struct sctp_analyse *child);
 
 void remove_analyse_child(struct sctp_analyse *child);
+
+void sctp_set_assoc_filter(void);
+#endif /* __SCTP_STAT_H__ */