diff options
Diffstat (limited to 'ui/gtk/sctp_stat.h')
-rw-r--r-- | ui/gtk/sctp_stat.h | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/ui/gtk/sctp_stat.h b/ui/gtk/sctp_stat.h new file mode 100644 index 0000000000..d91e76ce50 --- /dev/null +++ b/ui/gtk/sctp_stat.h @@ -0,0 +1,411 @@ +/* + * Copyright 2004, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de> + * + * $Id$ + * + * 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 + * 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. + */ + +#ifndef __SCTP_STAT_H__ +#define __SCTP_STAT_H__ + +#include <epan/dissectors/packet-sctp.h> +#include <epan/address.h> +#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 +#define CHUNK_LENGTH_LENGTH 2 + +#define CHUNK_HEADER_OFFSET 0 +#define CHUNK_TYPE_OFFSET CHUNK_HEADER_OFFSET +#define CHUNK_FLAGS_OFFSET (CHUNK_TYPE_OFFSET + CHUNK_TYPE_LENGTH) +#define CHUNK_LENGTH_OFFSET (CHUNK_FLAGS_OFFSET + CHUNK_FLAGS_LENGTH) +#define CHUNK_VALUE_OFFSET (CHUNK_LENGTH_OFFSET + CHUNK_LENGTH_LENGTH) + +#define INIT_CHUNK_INITIATE_TAG_LENGTH 4 +#define INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH 4 +#define INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_LENGTH 2 +#define INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_LENGTH 2 + + +#define INIT_CHUNK_INITIATE_TAG_OFFSET CHUNK_VALUE_OFFSET +#define INIT_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET (INIT_CHUNK_INITIATE_TAG_OFFSET + \ + INIT_CHUNK_INITIATE_TAG_LENGTH ) +#define INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_OFFSET (INIT_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET + \ + INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH ) +#define INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_OFFSET (INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_OFFSET + \ + INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_LENGTH ) +#define INIT_CHUNK_INITIAL_TSN_OFFSET (INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_OFFSET + \ + INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_LENGTH ) + +#define DATA_CHUNK_TSN_LENGTH 4 +#define DATA_CHUNK_TSN_OFFSET (CHUNK_VALUE_OFFSET + 0) +#define DATA_CHUNK_STREAM_ID_OFFSET (DATA_CHUNK_TSN_OFFSET + DATA_CHUNK_TSN_LENGTH) +#define DATA_CHUNK_STREAM_ID_LENGTH 2 +#define DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH 2 +#define DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH 4 +#define DATA_CHUNK_HEADER_LENGTH (CHUNK_HEADER_LENGTH + \ + DATA_CHUNK_TSN_LENGTH + \ + 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; + guint32 first_tsn; + GList *tsns; +} tsn_t; + +typedef struct _sctp_tmp_info { + address src; + address dst; + guint16 port1; + guint16 port2; + guint32 verification_tag1; + guint32 verification_tag2; + guint32 initiate_tag; + guint32 n_tvbs; +} 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; +} sctp_min_max_t; + +struct tsn_sort{ + guint32 tsnumber; + guint32 secs; + 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 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_forward_chunks; + guint32 n_forward_chunks_ep1; + guint32 n_forward_chunks_ep2; + 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; + gchar chunk_info[200]; + const gchar *info_text; +} sctp_error_info_t; + + +typedef struct _sctp_allassocs_info { + guint32 sum_tvbs; + GList* assoc_info_list; + gboolean is_registered; + 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; + struct page *page2; + struct page *page3; +}; + +struct page { + GtkWidget *addr_frame; + GtkWidget *scrolled_window; + GtkWidget *clist; + GtkWidget *port; + GtkWidget *veritag; + GtkWidget *max_in; + GtkWidget *min_in; + GtkWidget *max_out; + GtkWidget *min_out; +}; + +struct sctp_analyse { + 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; + GtkWidget *window; + GtkWidget *draw_area; +#if GTK_CHECK_VERSION(2,22,0) + cairo_surface_t *surface; +#else + GdkPixmap *pixmap; +#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_analyse *parent; + guint16 dir; +}; + + +void register_tap_listener_sctp_stat(void); + +const sctp_allassocs_info_t* sctp_stat_get_info(void); + +void sctp_stat_scan(void); + +void remove_tap_listener_sctp_stat(void); + +void assoc_analyse(sctp_assoc_info_t* assoc); + +const sctp_assoc_info_t* get_selected_assoc(void); + +void create_graph(guint16 dir, struct sctp_analyse* u_data); + +void create_byte_graph(guint16 dir, struct sctp_analyse* u_data); + +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); + +void increase_childcount(struct sctp_analyse *parent); + +void decrease_childcount(struct sctp_analyse *parent); + +void set_child(struct sctp_udata *child, struct sctp_analyse *parent); + +void remove_child(struct sctp_udata *child, struct sctp_analyse *parent); + +void decrease_analyse_childcount(void); + +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__ */ |