/* ipsctp_pkt.h - IPNet SCTP packet header file */ /* * Copyright (c) 2007 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. No license to Wind River intellectual property rights * is granted herein. All rights not licensed by Wind River are reserved * by Wind River. */ /* modification history -------------------- 01a,27oct07,tkf Created. */ #ifndef IPSCTP_PKT_H #define IPSCTP_PKT_H /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** * * This file defines types and structures related to IPSCTP frame format. It * also defines macros used to access the strurctures. */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ipsctp_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #include #ifdef __cplusplus extern "C" { #endif /* **************************************************************************** * 4 DEFINES **************************************************************************** */ #define IPSCTP_MAX_MTU_SIZE 1500 #define IPSCTP_GET_CHUNK_TYPE(chkhdr) ((IP_GET_16HI8((chkhdr)->type_flags) & 0xF0) >> 4) #define IPSCTP_SET_CHUNK_TYPE(chkhdr,type) IP_SET_16HI8((chkhdr)->type_flags, ((type & 0x3C) << 4)) /* * =========================================================================== * IPSCTP Chunk Type defines *=========================================================================== */ #define IPSCTP_CHUNK_TYPE_DATA 0x00 #define IPSCTP_CHUNK_TYPE_INIT 0x01 #define IPSCTP_CHUNK_TYPE_ACK 0x02 #define IPSCTP_CHUNK_TYPE_SACK 0x03 #define IPSCTP_CHUNK_TYPE_HBEAT 0x04 #define IPSCTP_CHUNK_TYPE_HBEATACK 0x05 #define IPSCTP_CHUNK_TYPE_ABORT 0x06 #define IPSCTP_CHUNK_TYPE_SHUT 0x07 #define IPSCTP_CHUNK_TYPE_SHUTACK 0x08 #define IPSCTP_CHUNK_TYPE_ERROR 0x09 #define IPSCTP_CHUNK_TYPE_COOKIE_ECHO 0x0A #define IPSCTP_CHUNK_TYPE_COOKIE_ACK 0x0B #define IPSCTP_CHUNK_TYPE_ECN 0x0C #define IPSCTP_CHUNK_TYPE_CWR 0x0D #define IPSCTP_CHUNK_TYPE_SHUTCOMPL 0x0E /* * =========================================================================== * IPSCTP Chunk header access defines *=========================================================================== */ #define IPSCTP_CHUNK_LEN(chunk) (ip_ntohs((chunk)->length)) #define IPSCTP_CHUNK_TYPE(chunk) (ip_ntohs((chunk)->type)) #define IPSCTP_CHUNK_FLAGS(chunk) (ip_ntohs((chunk)->flags)) /* *=========================================================================== * IPSCTP defines of types of optional, variable length parameters *=========================================================================== */ #define IPSCTP_PARAM_HB_INFO 0x0001 /* How about the holes: 2, 3, 4 ??? */ #define IPSCTP_PARAM_IPV4_ADDR 0x0005 #define IPSCTP_PARAM_IPV6_ADDR 0x0006 #define IPSCTP_PARAM_COOKIE 0x0007 #define IPSCTP_PARAM_UNRECOGNIZED 0x0008 #define IPSCTP_PARAM_COOKIE_PRESERV 0x0009 /* How about the hole: 10 ??? */ #define IPSCTP_PARAM_HOSTNAME 0x000B #define IPSCTP_PARAM_SUPPORTED_ADDR_TYPES 0x000C #define IPSCTP_PARAM_ECN_CAPABLE 0x8000 #define IPSCTP_PARAM_PRSCTP 0xC000 #define IPSCTP_PARAM_ADDIP 0xC001 #define IPSCTP_PARAM_DELIP 0xC002 #define IPSCTP_PARAM_ERROR_CAUSE_INDICATION 0xC003 #define IPSCTP_PARAM_SET_PRIMARY 0xC004 #define IPSCTP_PARAM_SUCCESS_REPORT 0xC005 #define IPSCTP_PARAM_ADAPTATION_LAYER_IND 0xC006 #define IPSCTP_PARAM_SUPPORTED_CHUNK_EXT 0x8008 #define IPSCTP_PARAM_SUPPORTED_ECN_NONCE 0x8001 #define IPSCTP_PARAM_RANDOM 0x8002 #define IPSCTP_PARAM_CHUNK_LIST 0x8003 #define IPSCTP_PARAM_HMAC_LIST 0x8004 /* *=========================================================================== * IPSCTP Error Cause defines *=========================================================================== */ #define IPSCTP_ECAUSE_INVALID_STREAM_ID 1 #define IPSCTP_ECAUSE_MISSING_MANDATORY_PARAM 2 #define IPSCTP_ECAUSE_STALE_COOKIE_ERROR 3 #define IPSCTP_ECAUSE_OUT_OF_RESOURCE_ERROR 4 #define IPSCTP_ECAUSE_UNRESOLVABLE_ADDRESS 5 #define IPSCTP_ECAUSE_UNRECOGNIZED_CHUNKTYPE 6 #define IPSCTP_ECAUSE_INVALID_MANDATORY_PARAM 7 #define IPSCTP_ECAUSE_UNRECOGNIZED_PARAMS 8 #define IPSCTP_ECAUSE_NO_USER_DATA 9 #define IPSCTP_ECAUSE_COOKIE_RECEIVED_DURING_SHUTDWN 10 #define IPSCTP_ECAUSE_RESTART_WITH_NEW_ADDRESSES 11 #define IPSCTP_ECAUSE_USER_INITIATED_ABORT 12 #define IPSCTP_ECAUSE_PROTOCOL_VIOLATION 13 /* SCTP error codes */ #define IPSCTP_ECAUSE_CODE_FAILED_THRESHOLD 14 #define IPSCTP_ECAUSE_ICMP_ERROR 15 #define IPSCTP_FROM_SOCK 0x10000000 #define IPSCTP_FROM_IPSCTP 0x20000000 #define SCTP_LOC_01 0x00000001 #define SCTP_LOC_02 0x00000002 #define SCTP_LOC_03 0x00000003 #define SCTP_LOC_04 0x00000004 #define SCTP_LOC_05 0x00000005 #define SCTP_LOC_06 0x00000006 #define SCTP_LOC_07 0x00000007 /* *=========================================================================== * IPSCTP Chunk type processing rule macros. * * Chunk Types are encoded such that the highest-order 2 bits specify the * action that must be taken if the processing endpoint does not recognize * the Chunk Type. *=========================================================================== */ #define IPSCTP_DROP_PKT_SILENT(type) (((Ip_u8)type & 0xC0)==0x00) #define IPSCTP_DROP_PKT_REPORT(type) (((Ip_u8)type & 0xC0)==0x40) #define IPSCTP_SKIP_CHNK_SILENT(type) (((Ip_u8)type & 0xC0)==0x80) #define IPSCTP_SKIP_CHNK_REPORT(type) (((Ip_u8)type & 0xC0)==0xC0) #define IPSCTP_UNKNOWN_CHUNK_DROP_FLAG(type) (((Ip_u8)(type) & 0x80) == 0) #define IPSCTP_UNKNOWN_CHUNK_REPORT_FLAG(type) ((Ip_u8)(type) & 0x40) /* *=========================================================================== * IPSCTP Parameter type processing rule macros. * * Parameter Types are encoded such that the highest-order 2 bits specify the * action that must be taken if the processing endpoint does not recognize * the Chunk Type. *=========================================================================== */ #define IPSCTP_DROP_CHNK_SILENT(type) (((Ip_u16)type & 0xC000)==0x0000) #define IPSCTP_DROP_CHNK_REPORT(type) (((Ip_u16)type & 0xC000)==0x4000) #define IPSCTP_SKIP_PARAM_SILENT(type) (((Ip_u16)type & 0xC000)==0x8000) #define IPSCTP_SKIP_PARAM_REPORT(type) (((Ip_u16)type & 0xC000)==0xC000) /* chunk flags */ #define IPSCTP_HAD_NO_TCB 0x01 /* data chunk flag */ #define IPSCTP_FLAG_DATA_MIDDLE_FRAG 0x00 #define IPSCTP_FLAG_DATA_LAST_FRAG 0x01 #define IPSCTP_FLAG_DATA_FIRST_FRAG 0x02 #define IPSCTP_FLAG_DATA_NOT_FRAG 0x03 #define IPSCTP_FLAG_DATA_FRAG_MASK 0x03 #define IPSCTP_FLAG_DATA_UNORDERED 0x04 #define IPSCTP_MIN_PARA_NUM 1 #define IPSCTP_MAX_IP_ADDR_LEN 24 /* how it for IPV6? */ /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* *=========================================================================== * Ipsctp_sctp_hdr * * SCTP Common Header Format * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Source Port | Destination Port | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Veirifcation Tag | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | CRC-32c Checksum | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Chunk 1 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | ... | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Chunk 2 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * *=========================================================================== */ typedef struct Ipsctp_sctp_hdr_struct { Ip_u16 sport; /* source port */ Ip_u16 dport; /* destination port */ Ip_u32 vtag; /* packet verification tag */ Ip_u32 crc; /* CRC-32c Checksum */ /* one or more chunks */ } Ipsctp_sctp_hdr; /* *=========================================================================== * Ipsctp_chunk_hdr * * SCTP Chunk Header Format * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Chunk type | Chunk flags | Chunk length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Chunk data | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_chunk_hdr_struct { Ip_u8 type; /* chunk type */ Ip_u8 flags; /* chunk flags */ Ip_u16 length; /* chunk length */ /* optional params follow */ } Ipsctp_chunk_hdr; /* *=========================================================================== * Ipsctp_state_cookie_struct * * State Cookie. * * This structure is used for genreating the State Cookie parameter that is * included in an INIT-ACK chunk to be sent in response to a received INIT * chunk. The members of the structure are selected such that they can be * regenerated without a saved TCB. * * Each field, except the MAC field (mac) is used in the computation of the * MAC value. When receving a Cookie Echo chunk, the computed MAC is compared * against the one saved in the received Cookie. Moreover the following check * is done during validation: * * - The port fields (my_port and peer_port) and the verification tag * (vtag) are compared to those contained in the SCTP common header * containing the Cookie Echo chunk when validating the Cookie Echo chunk. * * - The creation time (creation_time) is compared to current local time. * The elapsed time should be shorter than or equal to the lifespan * (lifetime). * * This structure is not used to generate the State Cookie when sending Cookie * Echo chunk. We simply set the type of the received cookie parameter to * Cookie Echo (10) and clear any flags and resend the chunk. * *=========================================================================== */ typedef struct Ipsctp_state_cookie_struct { Ip_u32 ltie_tag; /* My previous verification tag; non-zero if re-starting */ Ip_u32 ptie_tag; /* Peer's previous verification tag; non-zero if re-starting */ Ip_u16 lport; /* My local port (used in INIT) */ Ip_u16 pport; /* Peer port (used in INIT) */ struct Ip_timeval creation_time; /* the cookie creation time */ Ip_u32 lifetime; /* time the cookie can live (milliseconds)*/ union { #ifdef IPCOM_USE_INET struct Ip_in_addr addr4; #endif #ifdef IPCOM_USE_INET6 struct Ip_in6_addr addr6; #endif }addr; /* destination addr of the cookie */ /*init chunk*/ /*init ack chunk*/ /*Ip_u8 hmac[IPSCTP_SIGNATURE_SIZE];*/ } Ipsctp_state_cookie; /* *=========================================================================== * Ipsctp_data_chunk_hdr * * SCTP DATA Chunk Format. * Chunk type is 0. * *=========================================================================== * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type = 0 | Reserved|U|B|E| Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | TSN | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Stream Identifier S | Stream Sequence Number n | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Payload Protocol Identifier | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_data_chunk_hdr_struct { Ipsctp_chunk_hdr hdr; Ip_u32 tsn; /* transport sequence number */ Ip_u16 sid; /* Stream Identifier */ Ip_u16 ssn; /* Stream Sequence Number */ Ip_u32 ppid; /* Payload Protocol Identifier */ } Ipsctp_data_chunk_hdr; /* *=========================================================================== * Ipsctp_init_fixed_params * * Fixed portion of the parameters of the INIT/INIT-ACK chunks. *=========================================================================== */ typedef struct Ipsctp_init_fixed_params_struct { Ip_u32 init_tag; /* Initiate Tag */ Ip_u32 a_rwnd; /* Advertised Receiver Window Credit */ Ip_u16 nos; /* Number of Outbound Streams */ Ip_u16 nis; /* Number of Inbound Streams */ Ip_u32 init_tsn; /* Initial TSN */ } Ipsctp_init_fixed_params; /* *=========================================================================== * Ipsctp_init_chunk_hdr * * SCTP INIT or INIT-ACK Chunk Format. * Chunk type is 1 (for INIT) or 2 (for INIT-ACK) * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 1/2 |Chunk Flags | Chunk Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Initiate Tag | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Advertised Receiver Window Credit (a_rwnd) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of Outbound Streams | Number of Inbound Streams | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Initial TSN | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_init_chunk_hdr_struct { Ipsctp_chunk_hdr hdr; Ipsctp_init_fixed_params fixed_params; } Ipsctp_init_chunk_hdr; /* *=========================================================================== * Ipsctp_sack_chunk_hdr * * SCTP Selective Acknowledgement (SACK) Chunk Format. * Chunk type is 3. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 3 |Chunk Flags | Chunk Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cumulative TSN Ack | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Advertised Receiver Window Credit (a_rwnd) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of Gap Ack Blocks = N | Number of Duplicate TSNs = X | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_sack_chunk_hdr_struct { Ipsctp_chunk_hdr hdr; Ip_u32 cum_tsn_ack; /* Cumulative TSN Ack */ Ip_u32 a_rwnd; /* Advertised Receiver Window Credit */ Ip_u16 ngaps; /* Number of Gap Ack Blocks */ Ip_u16 ndups; /* Number of Duplicate TSNs */ } Ipsctp_sack_chunk_hdr; /* gap entry in SACK */ typedef struct Ipsctp_sack_gap_struct{ Ip_u16 start; Ip_u16 end; } Ipsctp_sack_gap; /* *=========================================================================== * Ipsctp_param_hdr * * This structure is used commonly by all types of parameter. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Parameter Type | Parameter Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_param_hdr_struct { Ip_u16 type; Ip_u16 len; } Ipsctp_param_hdr; /* *=========================================================================== * Heartbeat Info Parameter. * Parameter type is 1. * * No fixed fields for the Heartbeat Info Parameter. *=========================================================================== */ /* *=========================================================================== * Ipsctp_heartbeat_chunk_hdr * * Heartbeat Request (HEARTBEAT) or Heartbeat Acknowledgement (HEARTBEAT ACK) * Chunk Formats. * Chunk type is 4 (for HEARTBEAT) or 5 (for HEARTBEAT ACK). * * When using this structure with HEARTBEAT ACK, the user simply changes the * chunk type field to that of HEARTBEAT ACK (5). * * This structure describes the HEARTBEAT chunk header plus the Heartbeat * Info parameter that is specific to IPSCTP. * * When the HEARTBEAT chunk is used for Path Verification, the MAC value * also to be appended to this structure. The structure definition does * not include the MAC field. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 4/5 |Chunk Flags | Chunk Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Heartbeat Info Type | Heartbeat Info Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Heartbeat Send Time | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Destination Address | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_hb_infor_hdr_struct { Ipsctp_param_hdr param_hdr; /* parameter header */ struct Ip_timeval sendtime; /* chunk send time */ Ip_u32 random_v1; /* random value */ Ip_u32 random_v2; /* random value */ Ip_u8 addr_family; /* destination address family */ Ip_u8 addr_len; /* destination address length */ Ip_u16 reserved; /* 4-byte alignment */ Ip_u8 dstaddr [IPSCTP_MAX_IP_ADDR_LEN]; /* destination address */ } Ipsctp_hb_infor_hdr; typedef struct Ipsctp_hb_chunk_hdr_struct { Ipsctp_chunk_hdr chdr; /* Chunk header */ Ipsctp_hb_infor_hdr hb_infor; /* parameter header */ } Ipsctp_hb_chunk_hdr; /* *=========================================================================== * 3.3.7. Abort Association (ABORT) (6) * * The ABORT chunk is sent to the peer of an association to close the * association. The ABORT chunk may contain Cause Parameters to inform * the receiver about the reason of the abort. DATA chunks MUST NOT be * bundled with ABORT. Control chunks (except for INIT, INIT ACK, and * SHUTDOWN COMPLETE) MAY be bundled with an ABORT, but they MUST be * placed before the ABORT in the SCTP packet or they will be ignored by * the receiver. * * If an endpoint receives an ABORT with a format error or no TCB is * found, it MUST silently discard it. Moreover, under any * circumstances, an endpoint that receives an ABORT MUST NOT respond to * that ABORT by sending an ABORT of its own. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type = 6 |Reserved |T| Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * \ \ * / zero or more Error Causes / * \ \ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ /* *=========================================================================== * Ipsctp_shtdown_chunk * * Shutdown Association (SHUTDOWN) Chunk format. * Chunk Type is 7. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 7 | Chunk Flags | Length = 8 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cumulative TSN Ack | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * *=========================================================================== */ typedef struct Ipsctp_shtdown_chunk_struct { Ipsctp_chunk_hdr hdr; Ip_u32 ctsn; /* Cumulative TSN Ack */ } Ipsctp_shtdown_chunk; /* *=========================================================================== * * Shutdown Acknowledgment (SHUTDOWN ACK) Chunk format. * Chunk Type is 8. * * No fixed parameters for SHUTDOWN ACK. Nor does this chunk have any variable * length parameters. The chunk length field is always set to 4. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 8 |Chunk Flags | Chunk Length = 4 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ /* *=========================================================================== * Operation Error (ERROR) Chunk error cause header. * * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cause Code | Cause Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * / Cause-Specific Information / * \ \ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * *=========================================================================== */ typedef struct Ipsctp_error_cause_hdr_struct { Ip_u16 cause_code; Ip_u16 cause_len; /*Cause-Specific Information*/ } Ipsctp_error_cause_hdr; /* *=========================================================================== * Operation Error (ERROR) Chunk format. * Chunk Type is 9. * * There are no fixed ERROR chunk specific fields. The variable length * value of this chunk is made up of 0 or more ERROR cause parameters. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 9 |Chunk Flags | Chunk Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_error_chunk_struct { Ipsctp_chunk_hdr hdr; Ipsctp_error_cause_hdr err_cause_hdr; /*Cause-Specific Information*/ } Ipsctp_error_chunk; /* *=========================================================================== * error cause 1:Invalid Stream Identifier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cause Code=1 | Cause Length=8 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Stream Identifier | (Reserved) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_error_invalid_stream_id_struct{ Ip_u16 stream_id; Ip_u16 reserved; } Ipsctp_error_invalid_stream_id; /* *=========================================================================== * error cause 2:Missing Mandatory Parameter * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cause Code=2 | Cause Length=8+N*2 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of missing params=N | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Missing Param Type #1 | Missing Param Type #2 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Missing Param Type #N-1 | Missing Param Type #N | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_error_miss_param_struct{ Ip_u32 miss_num; Ip_u16 miss_type; /*miss type followed if more than 1*/ } Ipsctp_error_miss_param; /* *=========================================================================== * error cause 3:Stale Cookie Error * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cause Code=3 | Cause Length=8 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Measure of Staleness (usec.) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_error_stale_cookie_struct{ Ip_u32 stale_time; /*Measure of Staleness (usec.)*/ } Ipsctp_error_stale_cookie; /*error cause 5:Unresolvable Address*/ typedef Ipsctp_param_hdr Ipsctp_error_unres_addr; /*error cause 6:Unrecognized Chunk Type*/ typedef Ipsctp_chunk_hdr Ipsctp_error_unreg_chunk; /*error cause 8:Unrecognized Parameters*/ typedef Ipsctp_param_hdr Ipsctp_error_unrec_param; /* *=========================================================================== * error cause 9:No User Data * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cause Code=9 | Cause Length=8 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * / TSN value / * \ \ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_error_no_user_data_struct{ Ip_u32 tsn; } Ipsctp_error_no_user_data; /* *=========================================================================== * error cause 11:Restart of an Association with New Addresses * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Cause Code=11 | Cause Length=Variable | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * / New Address TLVs / * \ \ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef Ipsctp_param_hdr Ipsctp_error_restart_new_param; /* User-Initiated Abort (12) undefined */ /* Protocol Violation (13) undefined */ /* *=========================================================================== * Cookie Echo (COOKIE ECHO) Chunk format. * Chunk Type is 10. * * There are no fixed COOKIE ECHO chunk specific fields. The variable length * value of this chunk is made up of the State Cookie parameter. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 10 |Chunk Flags | Chunk Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_cookie_echo_chunk_struct{ Ipsctp_chunk_hdr hdr; Ipsctp_state_cookie state_cookie; } Ipsctp_cookie_echo_chunk; /* *=========================================================================== * * Cookie Acknowledgement (COOKIE ACK) Chunk format. * Chunk Type is 11. * * No fixed parameters for SHUTDOWN ACK. Nor does this chunk have any * variable length parameters. The chunk length field is always set to 4. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 11 |Chunk Flags | Chunk Length = 4 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef Ipsctp_chunk_hdr Ipsctp_cookie_ack_chunk; /* *=========================================================================== * * Shutdown Complete (SHUTDOWN COMPLETE) Chunk format. * Chunk Type is 14. * * No fixed parameters for SHUTDOWN COMPLETE. Nor does this chunk have any * variable length parameters. The chunk length field is always set to 4. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ipsctp_chunk_hdr | * | Type = 14 |Chunk Flags | Chunk Length = 4 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ #ifdef IPCOM_USE_INET /* *=========================================================================== * Ipsctp_param_ip4 * * IPv4 Address Parameter. * Parameter type is 5. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Parameter Type | Parameter Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_param_ip4_struct { Ipsctp_param_hdr hdr; struct Ip_in_addr addr; } Ipsctp_param_ip4; #endif #ifdef IPCOM_USE_INET6 /* *=========================================================================== * Ipsctp_param_ip6 * * IPv6 Address Parameter. * Parameter type is 6. * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Parameter Type | Parameter Length | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_param_ip6_struct { Ipsctp_param_hdr hdr; struct Ip_in6_addr addr; /* IPV6 address */ } Ipsctp_param_ip6; #endif /* *=========================================================================== * Ipsctp_param_state_cookie_struct * * State Cookie Parameter. * Parameter type is 7. * * This structure is used for genreating the State Cookie parameter that is * included in an INIT-ACK chunk to be sent in response to a received INIT * chunk. The members of the structure are selected such that they can be * regenerated without a saved TCB. * * Each field, except the MAC field (mac) is used in the computation of the * MAC value. When receving a Cookie Echo chunk, the computed MAC is compared * against the one saved in the received Cookie. Moreover the following check * is done during validation: * * - The port fields (my_port and peer_port) and the verification tag * (vtag) are compared to those contained in the SCTP common header * containing the Cookie Echo chunk when validating the Cookie Echo chunk. * * - The creation time (creation_time) is compared to current local time. * The elapsed time should be shorter than or equal to the lifespan * (lifetime). * * This structure is not used to generate the State Cookie when sending Cookie * Echo chunk. We simply set the type of the received cookie parameter to * Cookie Echo (10) and clear any flags and resend the chunk. * *=========================================================================== */ typedef struct Ipsctp_param_state_cookie_struct { Ipsctp_param_hdr hdr; Ipsctp_state_cookie state_cookie; } Ipsctp_param_state_cookie; /* *=========================================================================== * Unrecognized Parameter Parameter. * Parameter type is 8. * * No fixed fields for the Unrecognized Parameter Parameter. It lists all * unrecognized parameters in the received INIT chunk. The parameters are * complete with type, length, and value. *=========================================================================== */ /* *=========================================================================== * Ipsctp_param_cookie_preserve * * Cookie Preservative Parameter. * Parameter Type is 9. * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type = 9 | Length = 8 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Suggested Cookie Life-Span Increment (msec.) | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ *=========================================================================== */ typedef struct Ipsctp_param_cookie_preserve_struct { Ipsctp_param_hdr hdr; Ip_u32 cookie_lifetime_inc; } Ipsctp_param_cookie_preserve; /* *=========================================================================== * Host Name Address Parameter. * Parameter type is 11. * * No fixed fields for the Host Name Address Parameter. *=========================================================================== */ /* *=========================================================================== * Ipsctp_param_supp_addr_types * * Supported Address Types Parameter. * Parameter type is 12. * * Address types can be IPv4 = 5, * IPv6 = 6, * Host name = 11 *=========================================================================== */ typedef Ipsctp_param_hdr Ipsctp_param_supp_addr_types; #if 0 #define SCTP_GET_NEXT_CHUNK(chunk,inputbuf,remain_len) do\ {\ chunk = (Ipsctp_chunk_hdr *)inputbuf;\ if(remain_len < sizeof(Ipsctp_chunk_hdr) || \ remain_len < chunk->length)\ {\ chunk = NULL;\ }\ else\ {\ inputbuf += IP_ROUNDUP(chunk->length);\ if (remain_len>=IP_ROUNDUP(chunk->length))\ { remain_len -= IP_ROUNDUP(chunk->length);}\ else\ {remain_len = 0;}\ }\ }\ while(0) #endif /* **************************************************************************** * 6 PUBLIC FUNCTIONS **************************************************************************** */ #ifdef __cplusplus } #endif #endif /* IPSCTP_PKT_H */