Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
sctp_packet.h 12.02 KiB
/*
 * Copyright 2015 Michael Tuexen
 *
 * 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.
 */
/*
 * Author: tuexen@fh-muenster.de (Michael Tuexen)
 *
 * Interface for module for formatting SCTP packets.
 */

#ifndef __SCTP_PACKET_H__
#define __SCTP_PACKET_H__

#include "types.h"
#include "packet.h"
#include "sctp.h"

struct sctp_byte_list_item {
	struct sctp_byte_list_item *next;
	u8 byte;
};

struct sctp_byte_list {
	struct sctp_byte_list_item *first;
	struct sctp_byte_list_item *last;
	u16 nr_entries;
};

struct sctp_byte_list *
sctp_byte_list_new(void);

void
sctp_byte_list_append(struct sctp_byte_list *list,
                      struct sctp_byte_list_item *item);

void
sctp_byte_list_free(struct sctp_byte_list *list);

struct sctp_byte_list_item *
sctp_byte_list_item_new(u8 byte);

struct sctp_sack_block_list_item {
	struct sctp_sack_block_list_item *next;
	union sctp_sack_block block;
};

struct sctp_sack_block_list {
	struct sctp_sack_block_list_item *first;
	struct sctp_sack_block_list_item *last;
	u16 nr_entries;
};

struct sctp_sack_block_list *
sctp_sack_block_list_new(void);

void
sctp_sack_block_list_append(struct sctp_sack_block_list *list,
			    struct sctp_sack_block_list_item *item);

void
sctp_sack_block_list_free(struct sctp_sack_block_list *list);

struct sctp_sack_block_list_item *
sctp_sack_block_list_item_gap_new(u16 start, u16 end);

struct sctp_sack_block_list_item *
sctp_sack_block_list_item_dup_new(u32 tsn);

struct sctp_address_type_list_item {
	struct sctp_address_type_list_item *next;
	u16 address_type;
};

struct sctp_address_type_list {
	struct sctp_address_type_list_item *first;
	struct sctp_address_type_list_item *last;
	u16 nr_entries;
};

struct sctp_address_type_list *
sctp_address_type_list_new(void);

void
sctp_address_type_list_append(struct sctp_address_type_list *list,
			      struct sctp_address_type_list_item *item);

void
sctp_address_type_list_free(struct sctp_address_type_list *list);

struct sctp_address_type_list_item *
sctp_address_type_list_item_new(u16 address_type);

struct sctp_parameter_type_list_item {
	struct sctp_parameter_type_list_item *next;
	u16 parameter_type;
};

struct sctp_parameter_type_list {
	struct sctp_parameter_type_list_item *first;
	struct sctp_parameter_type_list_item *last;
	u16 nr_entries;
};

struct sctp_parameter_type_list *
sctp_parameter_type_list_new(void);

void
sctp_parameter_type_list_append(struct sctp_parameter_type_list *list,
			        struct sctp_parameter_type_list_item *item);

void
sctp_parameter_type_list_free(struct sctp_parameter_type_list *list);

struct sctp_parameter_type_list_item *
sctp_parameter_type_list_item_new(u16 parameter_type);

struct sctp_parameter_list_item {
	struct sctp_parameter_list_item *next;
	struct sctp_parameter *parameter;
	/* total length in bytes */
	u32 length;
	/* metadata */
	u32 flags;
};

struct sctp_parameter_list {
	struct sctp_parameter_list_item *first;
	struct sctp_parameter_list_item *last;
	/* length in bytes excluding the padding of the last parameter*/
	u32 length;
};

struct sctp_cause_list_item {
	struct sctp_cause_list_item *next;
	struct sctp_cause *cause;
	/* total length in bytes */
	u32 length;
	/* metadata */
	u32 flags;
};

struct sctp_cause_list {
	struct sctp_cause_list_item *first;
	struct sctp_cause_list_item *last;
	/* length in bytes excluding the padding of the last cause*/
	u32 length;
};

struct sctp_chunk_list_item {
	struct sctp_chunk_list_item *next;
	struct sctp_chunk *chunk;
	struct sctp_parameter_list *parameter_list;
	struct sctp_cause_list *cause_list;
	/* total length in bytes */
	u32 length;
	/* metadata */
	u32 flags;
};

struct sctp_chunk_list {
	struct sctp_chunk_list_item *first;
	struct sctp_chunk_list_item *last;
	/* length in bytes */
	u32 length;
};

struct sctp_chunk_list_item *
sctp_chunk_list_item_new(struct sctp_chunk *chunk, u32 length, u32 flags,
                         struct sctp_parameter_list *parameter_list,
                         struct sctp_cause_list *cause_list);

#define FLAG_CHUNK_TYPE_NOCHECK                 0x00000001
#define FLAG_CHUNK_FLAGS_NOCHECK                0x00000002
#define FLAG_CHUNK_LENGTH_NOCHECK               0x00000004
#define FLAG_CHUNK_VALUE_NOCHECK                0x00000008

struct sctp_chunk_list_item *
sctp_generic_chunk_new(s64 type, s64 flgs, s64 len,
                       struct sctp_byte_list *bytes);

#define FLAG_DATA_CHUNK_TSN_NOCHECK             0x00000100
#define FLAG_DATA_CHUNK_SID_NOCHECK             0x00000200
#define FLAG_DATA_CHUNK_SSN_NOCHECK             0x00000400
#define FLAG_DATA_CHUNK_PPID_NOCHECK            0x00000800

struct sctp_chunk_list_item *
sctp_data_chunk_new(s64 flgs, s64 len, s64 tsn, s64 sid, s64 ssn, s64 ppid);

#define FLAG_INIT_CHUNK_TAG_NOCHECK             0x00000100
#define FLAG_INIT_CHUNK_A_RWND_NOCHECK          0x00000200
#define FLAG_INIT_CHUNK_OS_NOCHECK              0x00000400
#define FLAG_INIT_CHUNK_IS_NOCHECK              0x00000800
#define FLAG_INIT_CHUNK_TSN_NOCHECK             0x00001000
#define FLAG_INIT_CHUNK_OPT_PARAM_NOCHECK       0x00002000

struct sctp_chunk_list_item *
sctp_init_chunk_new(s64 flgs, s64 tag, s64 a_rwnd, s64 os, s64 is, s64 tsn,
                    struct sctp_parameter_list *parameters);

#define FLAG_INIT_ACK_CHUNK_TAG_NOCHECK         0x00000100
#define FLAG_INIT_ACK_CHUNK_A_RWND_NOCHECK      0x00000200
#define FLAG_INIT_ACK_CHUNK_OS_NOCHECK          0x00000400
#define FLAG_INIT_ACK_CHUNK_IS_NOCHECK          0x00000800
#define FLAG_INIT_ACK_CHUNK_TSN_NOCHECK         0x00001000
#define FLAG_INIT_ACK_CHUNK_OPT_PARAM_NOCHECK   0x00002000

struct sctp_chunk_list_item *
sctp_init_ack_chunk_new(s64 flgs, s64 tag, s64 a_rwnd, s64 os, s64 is, s64 tsn,
                        struct sctp_parameter_list *parameters);

#define FLAG_SACK_CHUNK_CUM_TSN_NOCHECK         0x00000100
#define FLAG_SACK_CHUNK_A_RWND_NOCHECK          0x00000200
#define FLAG_SACK_CHUNK_GAP_BLOCKS_NOCHECK      0x00000400
#define FLAG_SACK_CHUNK_DUP_TSNS_NOCHECK        0x00000800

struct sctp_chunk_list_item *
sctp_sack_chunk_new(s64 flgs, s64 cum_tsn, s64 a_rwnd,
                    struct sctp_sack_block_list *gaps,
                    struct sctp_sack_block_list *dups);

struct sctp_chunk_list_item *
sctp_heartbeat_chunk_new(s64 flgs, struct sctp_parameter_list_item *info);

struct sctp_chunk_list_item *
sctp_heartbeat_ack_chunk_new(s64 flgs, struct sctp_parameter_list_item *info);

#define FLAG_ABORT_CHUNK_OPT_CAUSES_NOCHECK     0x00000100

struct sctp_chunk_list_item *
sctp_abort_chunk_new(s64 flgs, struct sctp_cause_list *causes);

#define FLAG_SHUTDOWN_CHUNK_CUM_TSN_NOCHECK     0x00000100

struct sctp_chunk_list_item *
sctp_shutdown_chunk_new(s64 flgs, s64 cum_tsn);

struct sctp_chunk_list_item *
sctp_shutdown_ack_chunk_new(s64 flgs);

#define FLAG_ERROR_CHUNK_OPT_CAUSES_NOCHECK     0x00000100

struct sctp_chunk_list_item *
sctp_error_chunk_new(s64 flgs, struct sctp_cause_list *causes);

struct sctp_chunk_list_item *
sctp_cookie_echo_chunk_new(s64 flgs, s64 len, struct sctp_byte_list *cookie);

struct sctp_chunk_list_item *
sctp_cookie_ack_chunk_new(s64 flgs);

#define FLAG_ECNE_CHUNK_LOWEST_TSN_NOCHECK      0x00000100

struct sctp_chunk_list_item *
sctp_ecne_chunk_new(s64 flgs, s64 lowest_tsn);

#define FLAG_CWR_CHUNK_LOWEST_TSN_NOCHECK       0x00000100

struct sctp_chunk_list_item *
sctp_cwr_chunk_new(s64 flgs, s64 lowest_tsn);

struct sctp_chunk_list_item *
sctp_shutdown_complete_chunk_new(s64 flgs);

struct sctp_chunk_list_item *
sctp_pad_chunk_new(s64 flgs, s64 len, u8* padding);
struct sctp_chunk_list *
sctp_chunk_list_new(void);

void
sctp_chunk_list_append(struct sctp_chunk_list *list,
                       struct sctp_chunk_list_item *item);

void
sctp_chunk_list_free(struct sctp_chunk_list *list);

#define FLAG_PARAMETER_TYPE_NOCHECK				0x00000001
#define FLAG_PARAMETER_LENGTH_NOCHECK				0x00000002
#define FLAG_PARAMETER_VALUE_NOCHECK				0x00000004

struct sctp_parameter_list_item *
sctp_parameter_list_item_new(struct sctp_parameter *parameter,
                             u32 length, u32 flags);

struct sctp_parameter_list_item *
sctp_generic_parameter_new(s64 type, s64 len, struct sctp_byte_list *bytes);

struct sctp_parameter_list_item *
sctp_heartbeat_information_parameter_new(s64 len, struct sctp_byte_list *bytes);

struct sctp_parameter_list_item *
sctp_ipv4_address_parameter_new(struct in_addr *addr);

struct sctp_parameter_list_item *
sctp_ipv6_address_parameter_new(struct in6_addr *addr);

struct sctp_parameter_list_item *
sctp_state_cookie_parameter_new(s64 len, u8 *cookie);

struct sctp_parameter_list_item *
sctp_unrecognized_parameters_parameter_new(struct sctp_parameter_list *list);

struct sctp_parameter_list_item *
sctp_cookie_preservative_parameter_new(s64 increment);

struct sctp_parameter_list_item *
sctp_hostname_address_parameter_new(char *hostname);

struct sctp_parameter_list_item *
sctp_supported_address_types_parameter_new(struct sctp_address_type_list *list);

struct sctp_parameter_list_item *
sctp_ecn_capable_parameter_new(void);

struct sctp_parameter_list_item *
sctp_pad_parameter_new(s64 len, u8 *padding);

struct sctp_parameter_list *
sctp_parameter_list_new(void);

void
sctp_parameter_list_append(struct sctp_parameter_list *list,
                           struct sctp_parameter_list_item *item);

void
sctp_parameter_list_free(struct sctp_parameter_list *list);

struct sctp_cause_list_item *
sctp_cause_list_item_new(struct sctp_cause *cause,
                         u32 length, u32 flags);

#define FLAG_CAUSE_CODE_NOCHECK					0x00000001
#define FLAG_CAUSE_LENGTH_NOCHECK				0x00000002
#define FLAG_CAUSE_INFORMATION_NOCHECK				0x00000004

struct sctp_cause_list_item *
sctp_generic_cause_new(s64 code, s64 len, struct sctp_byte_list *bytes);

struct sctp_cause_list_item *
sctp_invalid_stream_identifier_cause_new(s64 sid);

struct sctp_cause_list_item *
sctp_missing_mandatory_parameter_cause_new(struct sctp_parameter_type_list *list);

struct sctp_cause_list_item *
sctp_stale_cookie_error_cause_new(s64 staleness);

struct sctp_cause_list_item *
sctp_out_of_resources_cause_new(void);

struct sctp_cause_list_item *
sctp_unresolvable_address_cause_new(struct sctp_parameter_list_item *item);

struct sctp_cause_list_item *
sctp_unrecognized_chunk_type_cause_new(struct sctp_chunk_list_item *item);

struct sctp_cause_list_item *
sctp_invalid_mandatory_parameter_cause_new(void);

struct sctp_cause_list_item *
sctp_unrecognized_parameters_cause_new(struct sctp_parameter_list *list);

struct sctp_cause_list_item *
sctp_no_user_data_cause_new(s64 tsn);

struct sctp_cause_list_item *
sctp_cookie_received_while_shutdown_cause_new(void);

struct sctp_cause_list_item *
sctp_restart_with_new_addresses_cause_new(struct sctp_parameter_list *list);

struct sctp_cause_list_item *
sctp_user_initiated_abort_cause_new(char *info);

struct sctp_cause_list_item *
sctp_protocol_violation_cause_new(char *info);

struct sctp_cause_list *
sctp_cause_list_new(void);

void
sctp_cause_list_append(struct sctp_cause_list *list,
                       struct sctp_cause_list_item *item);

void
sctp_cause_list_free(struct sctp_cause_list *list);

/* Create and initialize a new struct packet containing a SCTP packet.
 * On success, returns a newly-allocated packet. On failure, returns NULL
 * and fills in *error with an error message.
 */
extern struct packet *new_sctp_packet(int address_family,
				      enum direction_t direction,
				      enum ip_ecn_t ecn,
				      struct sctp_chunk_list *chunk_list,
				      char **error);
#endif /* __SCTP_PACKET_H__ */