2013-10-30 00:43:46 +00:00
|
|
|
/*
|
2013-10-31 07:54:06 +00:00
|
|
|
* Copyright 2004-2013, Irene Ruengeler <i.ruengeler [AT] fh-muenster.de>
|
2004-09-07 07:54:50 +00:00
|
|
|
*
|
2006-05-21 05:12:17 +00:00
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
2004-09-07 07:54:50 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
2018-02-07 11:26:45 +00:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
2004-09-07 07:54:50 +00:00
|
|
|
*/
|
2010-06-15 21:18:31 +00:00
|
|
|
|
2013-10-30 00:43:46 +00:00
|
|
|
#ifndef __TAP_SCTP_ANALYSIS_H__
|
|
|
|
#define __TAP_SCTP_ANALYSIS_H__
|
2010-06-15 21:18:31 +00:00
|
|
|
|
2013-12-13 07:25:30 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
2014-02-25 20:42:35 +00:00
|
|
|
#endif /* __cplusplus */
|
2013-12-13 07:25:30 +00:00
|
|
|
|
2004-09-07 18:51:56 +00:00
|
|
|
#include <epan/dissectors/packet-sctp.h>
|
2005-02-04 22:45:15 +00:00
|
|
|
#include <epan/address.h>
|
2007-06-03 16:07:07 +00:00
|
|
|
#ifndef _WIN32
|
2005-02-04 22:45:15 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <netinet/in.h>
|
2008-10-24 00:42:09 +00:00
|
|
|
#else
|
|
|
|
#include <winsock2.h>
|
|
|
|
#endif
|
2004-09-07 07:54:50 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define CHUNK_TYPE_LENGTH 1
|
|
|
|
#define CHUNK_FLAGS_LENGTH 1
|
|
|
|
#define CHUNK_LENGTH_LENGTH 2
|
2004-09-07 07:54:50 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#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)
|
2004-09-07 07:54:50 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define INIT_CHUNK_INITIATE_TAG_LENGTH 4
|
|
|
|
#define INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH 4
|
2004-09-07 07:54:50 +00:00
|
|
|
#define INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_LENGTH 2
|
|
|
|
#define INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_LENGTH 2
|
|
|
|
|
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#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 )
|
2004-09-07 07:54:50 +00:00
|
|
|
#define INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_OFFSET (INIT_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET + \
|
2014-10-12 18:56:12 +00:00
|
|
|
INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH )
|
2004-09-07 07:54:50 +00:00
|
|
|
#define INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_OFFSET (INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_OFFSET + \
|
2014-10-12 18:56:12 +00:00
|
|
|
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 )
|
2004-09-07 07:54:50 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define DATA_CHUNK_TSN_LENGTH 4
|
|
|
|
#define DATA_CHUNK_TSN_OFFSET (CHUNK_VALUE_OFFSET + 0)
|
2004-09-07 07:54:50 +00:00
|
|
|
#define DATA_CHUNK_STREAM_ID_OFFSET (DATA_CHUNK_TSN_OFFSET + DATA_CHUNK_TSN_LENGTH)
|
2005-02-04 22:45:15 +00:00
|
|
|
#define DATA_CHUNK_STREAM_ID_LENGTH 2
|
|
|
|
#define DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH 2
|
|
|
|
#define DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH 4
|
2015-10-05 13:55:40 +00:00
|
|
|
#define I_DATA_CHUNK_RESERVED_LENGTH 2
|
|
|
|
#define I_DATA_CHUNK_MID_LENGTH 4
|
|
|
|
#define I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH 4
|
|
|
|
#define I_DATA_CHUNK_FSN_LENGTH 4
|
|
|
|
#define I_DATA_CHUNK_RESERVED_OFFSET (DATA_CHUNK_STREAM_ID_OFFSET + \
|
|
|
|
DATA_CHUNK_STREAM_ID_LENGTH)
|
|
|
|
#define I_DATA_CHUNK_MID_OFFSET (I_DATA_CHUNK_RESERVED_OFFSET + \
|
|
|
|
I_DATA_CHUNK_RESERVED_LENGTH)
|
|
|
|
#define I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_OFFSET (I_DATA_CHUNK_MID_OFFSET + \
|
|
|
|
I_DATA_CHUNK_MID_LENGTH)
|
|
|
|
#define I_DATA_CHUNK_FSN_OFFSET (I_DATA_CHUNK_MID_OFFSET + \
|
|
|
|
I_DATA_CHUNK_MID_LENGTH)
|
|
|
|
#define I_DATA_CHUNK_PAYLOAD_OFFSET (I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_OFFSET + \
|
|
|
|
I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH)
|
2005-02-04 22:45:15 +00:00
|
|
|
#define DATA_CHUNK_HEADER_LENGTH (CHUNK_HEADER_LENGTH + \
|
2014-10-12 18:56:12 +00:00
|
|
|
DATA_CHUNK_TSN_LENGTH + \
|
|
|
|
DATA_CHUNK_STREAM_ID_LENGTH + \
|
|
|
|
DATA_CHUNK_STREAM_SEQ_NUMBER_LENGTH + \
|
|
|
|
DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH)
|
2015-10-05 13:55:40 +00:00
|
|
|
#define I_DATA_CHUNK_HEADER_LENGTH (CHUNK_HEADER_LENGTH + \
|
|
|
|
DATA_CHUNK_TSN_LENGTH + \
|
|
|
|
DATA_CHUNK_STREAM_ID_LENGTH + \
|
|
|
|
I_DATA_CHUNK_RESERVED_LENGTH + \
|
|
|
|
I_DATA_CHUNK_MID_LENGTH +\
|
|
|
|
I_DATA_CHUNK_PAYLOAD_PROTOCOL_ID_LENGTH)
|
2014-10-12 18:56:12 +00:00
|
|
|
#define MAX_ADDRESS_LEN 47
|
2009-06-05 13:33:18 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define SCTP_ABORT_CHUNK_T_BIT 0x01
|
2013-10-29 12:11:23 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define PARAMETER_TYPE_LENGTH 2
|
|
|
|
#define PARAMETER_LENGTH_LENGTH 2
|
|
|
|
#define PARAMETER_HEADER_LENGTH (PARAMETER_TYPE_LENGTH + PARAMETER_LENGTH_LENGTH)
|
2013-10-29 12:11:23 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define PARAMETER_HEADER_OFFSET 0
|
|
|
|
#define PARAMETER_TYPE_OFFSET PARAMETER_HEADER_OFFSET
|
|
|
|
#define PARAMETER_LENGTH_OFFSET (PARAMETER_TYPE_OFFSET + PARAMETER_TYPE_LENGTH)
|
|
|
|
#define PARAMETER_VALUE_OFFSET (PARAMETER_LENGTH_OFFSET + PARAMETER_LENGTH_LENGTH)
|
2013-10-29 12:11:23 +00:00
|
|
|
|
|
|
|
#define IPV6_ADDRESS_LENGTH 16
|
|
|
|
#define IPV6_ADDRESS_OFFSET PARAMETER_VALUE_OFFSET
|
|
|
|
#define IPV4_ADDRESS_LENGTH 4
|
|
|
|
#define IPV4_ADDRESS_OFFSET PARAMETER_VALUE_OFFSET
|
2014-10-12 18:56:12 +00:00
|
|
|
#define IPV4ADDRESS_PARAMETER_ID 0x0005
|
|
|
|
#define IPV6ADDRESS_PARAMETER_ID 0x0006
|
2013-10-29 12:11:23 +00:00
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
#define SACK_CHUNK_CUMULATIVE_TSN_ACK_LENGTH 4
|
2013-10-29 12:11:23 +00:00
|
|
|
#define SACK_CHUNK_CUMULATIVE_TSN_ACK_OFFSET (CHUNK_VALUE_OFFSET + 0)
|
|
|
|
#define SACK_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH 4
|
|
|
|
#define SACK_CHUNK_ADV_REC_WINDOW_CREDIT_OFFSET (SACK_CHUNK_CUMULATIVE_TSN_ACK_OFFSET + \
|
2014-10-12 18:56:12 +00:00
|
|
|
SACK_CHUNK_CUMULATIVE_TSN_ACK_LENGTH)
|
|
|
|
|
|
|
|
#define INIT_CHUNK_INITIAL_TSN_LENGTH 4
|
2016-10-19 15:10:53 +00:00
|
|
|
#define INIT_CHUNK_FIXED_PARAMETERS_LENGTH (INIT_CHUNK_INITIATE_TAG_LENGTH + \
|
2014-10-12 18:56:12 +00:00
|
|
|
INIT_CHUNK_ADV_REC_WINDOW_CREDIT_LENGTH + \
|
|
|
|
INIT_CHUNK_NUMBER_OF_OUTBOUND_STREAMS_LENGTH + \
|
|
|
|
INIT_CHUNK_NUMBER_OF_INBOUND_STREAMS_LENGTH + \
|
|
|
|
INIT_CHUNK_INITIAL_TSN_LENGTH)
|
|
|
|
#define CHUNK_HEADER_LENGTH (CHUNK_TYPE_LENGTH + \
|
|
|
|
CHUNK_FLAGS_LENGTH + \
|
|
|
|
CHUNK_LENGTH_LENGTH)
|
2013-10-29 12:11:23 +00:00
|
|
|
#define INIT_CHUNK_VARIABLE_LENGTH_PARAMETER_OFFSET (INIT_CHUNK_INITIAL_TSN_OFFSET + \
|
2014-10-12 18:56:12 +00:00
|
|
|
INIT_CHUNK_INITIAL_TSN_LENGTH )
|
2013-10-29 12:11:23 +00:00
|
|
|
|
2013-12-13 07:25:30 +00:00
|
|
|
/* The below value is 255 */
|
|
|
|
#define NUM_CHUNKS 0x100
|
2009-06-05 13:33:18 +00:00
|
|
|
|
|
|
|
/* 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
|
|
|
|
*/
|
2010-06-23 07:47:15 +00:00
|
|
|
#define OTHER_CHUNKS_INDEX 0xfe
|
2009-06-05 13:33:18 +00:00
|
|
|
|
|
|
|
/* VNB */
|
|
|
|
/* This variable stores the maximum chunk type value
|
|
|
|
* that can be associated with a sctp chunk.
|
|
|
|
*/
|
|
|
|
#define MAX_SCTP_CHUNK_TYPE 256
|
2004-09-07 07:54:50 +00:00
|
|
|
|
|
|
|
typedef struct _tsn {
|
2014-10-12 18:56:12 +00:00
|
|
|
guint32 frame_number;
|
|
|
|
guint32 secs; /* Absolute seconds */
|
|
|
|
guint32 usecs;
|
|
|
|
address src;
|
|
|
|
address dst;
|
|
|
|
guint32 first_tsn;
|
|
|
|
GList *tsns;
|
2004-09-07 07:54:50 +00:00
|
|
|
} tsn_t;
|
|
|
|
|
|
|
|
typedef struct _sctp_tmp_info {
|
2013-12-13 07:25:30 +00:00
|
|
|
guint16 assoc_id;
|
|
|
|
guint16 direction;
|
2005-03-22 10:25:07 +00:00
|
|
|
address src;
|
|
|
|
address dst;
|
2004-09-07 07:54:50 +00:00
|
|
|
guint16 port1;
|
|
|
|
guint16 port2;
|
|
|
|
guint32 verification_tag1;
|
|
|
|
guint32 verification_tag2;
|
2007-01-29 20:44:59 +00:00
|
|
|
guint32 initiate_tag;
|
2004-09-07 07:54:50 +00:00
|
|
|
guint32 n_tvbs;
|
2005-03-22 10:25:07 +00:00
|
|
|
} sctp_tmp_info_t;
|
2004-09-07 07:54:50 +00:00
|
|
|
|
|
|
|
typedef struct _sctp_min_max {
|
2005-03-22 10:25:07 +00:00
|
|
|
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;
|
2014-10-12 18:56:12 +00:00
|
|
|
gint tmp_secs;
|
2004-09-07 07:54:50 +00:00
|
|
|
} sctp_min_max_t;
|
|
|
|
|
|
|
|
struct tsn_sort{
|
|
|
|
guint32 tsnumber;
|
|
|
|
guint32 secs;
|
|
|
|
guint32 usecs;
|
|
|
|
guint32 offset;
|
|
|
|
guint32 length;
|
2007-05-22 21:16:30 +00:00
|
|
|
guint32 framenumber;
|
2004-09-07 07:54:50 +00:00
|
|
|
};
|
|
|
|
|
2005-03-22 10:25:07 +00:00
|
|
|
typedef struct _sctp_addr_chunk {
|
2014-10-12 18:56:12 +00:00
|
|
|
guint32 direction;
|
|
|
|
address *addr;
|
2009-06-05 13:33:18 +00:00
|
|
|
/* The array is initialized to MAX_SCTP_CHUNK_TYPE
|
|
|
|
* so that there is no memory overwrite
|
|
|
|
* when accessed using sctp chunk type as index.
|
|
|
|
*/
|
2014-10-12 18:56:12 +00:00
|
|
|
guint32 addr_count[MAX_SCTP_CHUNK_TYPE];
|
2005-03-22 10:25:07 +00:00
|
|
|
} sctp_addr_chunk;
|
2004-09-07 07:54:50 +00:00
|
|
|
|
|
|
|
typedef struct _sctp_assoc_info {
|
2014-10-12 18:56:12 +00:00
|
|
|
guint16 assoc_id;
|
|
|
|
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;
|
|
|
|
guint32 arwnd1;
|
|
|
|
guint32 arwnd2;
|
|
|
|
gboolean init;
|
|
|
|
gboolean initack;
|
|
|
|
guint16 initack_dir;
|
|
|
|
guint16 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;
|
2005-03-22 10:25:07 +00:00
|
|
|
GPtrArray *sort_tsn1;
|
|
|
|
GPtrArray *sort_sack1;
|
2014-10-12 18:56:12 +00:00
|
|
|
GList *sack1;
|
|
|
|
GList *tsn2;
|
2005-03-22 10:25:07 +00:00
|
|
|
GPtrArray *sort_tsn2;
|
|
|
|
GPtrArray *sort_sack2;
|
2014-10-12 18:56:12 +00:00
|
|
|
GList *sack2;
|
|
|
|
gboolean check_address;
|
|
|
|
GList* error_info_list;
|
2009-06-05 13:33:18 +00:00
|
|
|
/* The array is initialized to MAX_SCTP_CHUNK_TYPE
|
|
|
|
* so that there is no memory overwrite
|
|
|
|
* when accessed using sctp chunk type as index.
|
|
|
|
*/
|
2014-10-12 18:56:12 +00:00
|
|
|
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;
|
2004-09-07 07:54:50 +00:00
|
|
|
} sctp_assoc_info_t;
|
|
|
|
|
|
|
|
typedef struct _sctp_error_info {
|
2014-10-12 18:56:12 +00:00
|
|
|
guint32 frame_number;
|
|
|
|
gchar chunk_info[200];
|
|
|
|
const gchar *info_text;
|
2005-03-22 10:25:07 +00:00
|
|
|
} sctp_error_info_t;
|
2004-09-07 07:54:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
typedef struct _sctp_allassocs_info {
|
2014-10-12 18:56:12 +00:00
|
|
|
guint32 sum_tvbs;
|
|
|
|
GList *assoc_info_list;
|
|
|
|
gboolean is_registered;
|
|
|
|
GList *children;
|
2004-09-07 07:54:50 +00:00
|
|
|
} sctp_allassocs_info_t;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
const sctp_assoc_info_t* get_selected_assoc(void);
|
|
|
|
|
2013-12-13 07:25:30 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif /* __cplusplus */
|
2006-06-26 13:18:37 +00:00
|
|
|
|
2014-10-14 19:58:21 +00:00
|
|
|
#endif /* __TAP_SCTP_ANALYSIS_H__ */
|
|
|
|
|
2014-10-12 18:56:12 +00:00
|
|
|
/*
|
2017-11-29 00:03:11 +00:00
|
|
|
* Editor modelines - https://www.wireshark.org/tools/modelines.html
|
2014-10-12 18:56:12 +00:00
|
|
|
*
|
2017-11-29 00:03:11 +00:00
|
|
|
* Local Variables:
|
|
|
|
* c-basic-offset: 4
|
2014-10-12 18:56:12 +00:00
|
|
|
* tab-width: 8
|
2017-11-29 00:03:11 +00:00
|
|
|
* indent-tabs-mode: nil
|
2014-10-12 18:56:12 +00:00
|
|
|
* End:
|
|
|
|
*
|
2017-11-29 00:03:11 +00:00
|
|
|
* ex: set shiftwidth=4 tabstop=8 expandtab:
|
|
|
|
* :indentSize=4:tabSize=8:noTabs=true:
|
2014-10-12 18:56:12 +00:00
|
|
|
*/
|