Merge branch 'sctp-remove-typedefs-from-structures-part-1'
Xin Long says: ==================== sctp: remove typedefs from structures part 1 As we know, typedef is suggested not to use in kernel, even checkpatch.pl also gives warnings about it. Now sctp is using it for many structures. All this kind of typedef's using should be removed. As the 1st part, this patchset is to remove it for 11 basic structures in linux/sctp.h. It is also to fix some indents. No any code's logic is changed in these patches, only cleaning up. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
7e5988df26
|
@ -57,12 +57,12 @@
|
||||||
#include <uapi/linux/sctp.h>
|
#include <uapi/linux/sctp.h>
|
||||||
|
|
||||||
/* Section 3.1. SCTP Common Header Format */
|
/* Section 3.1. SCTP Common Header Format */
|
||||||
typedef struct sctphdr {
|
struct sctphdr {
|
||||||
__be16 source;
|
__be16 source;
|
||||||
__be16 dest;
|
__be16 dest;
|
||||||
__be32 vtag;
|
__be32 vtag;
|
||||||
__le32 checksum;
|
__le32 checksum;
|
||||||
} sctp_sctphdr_t;
|
};
|
||||||
|
|
||||||
static inline struct sctphdr *sctp_hdr(const struct sk_buff *skb)
|
static inline struct sctphdr *sctp_hdr(const struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
@ -70,11 +70,11 @@ static inline struct sctphdr *sctp_hdr(const struct sk_buff *skb)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Section 3.2. Chunk Field Descriptions. */
|
/* Section 3.2. Chunk Field Descriptions. */
|
||||||
typedef struct sctp_chunkhdr {
|
struct sctp_chunkhdr {
|
||||||
__u8 type;
|
__u8 type;
|
||||||
__u8 flags;
|
__u8 flags;
|
||||||
__be16 length;
|
__be16 length;
|
||||||
} sctp_chunkhdr_t;
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Section 3.2. Chunk Type Values.
|
/* Section 3.2. Chunk Type Values.
|
||||||
|
@ -82,7 +82,7 @@ typedef struct sctp_chunkhdr {
|
||||||
* Value field. It takes a value from 0 to 254. The value of 255 is
|
* Value field. It takes a value from 0 to 254. The value of 255 is
|
||||||
* reserved for future use as an extension field.
|
* reserved for future use as an extension field.
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
enum sctp_cid {
|
||||||
SCTP_CID_DATA = 0,
|
SCTP_CID_DATA = 0,
|
||||||
SCTP_CID_INIT = 1,
|
SCTP_CID_INIT = 1,
|
||||||
SCTP_CID_INIT_ACK = 2,
|
SCTP_CID_INIT_ACK = 2,
|
||||||
|
@ -109,7 +109,7 @@ typedef enum {
|
||||||
SCTP_CID_ASCONF = 0xC1,
|
SCTP_CID_ASCONF = 0xC1,
|
||||||
SCTP_CID_ASCONF_ACK = 0x80,
|
SCTP_CID_ASCONF_ACK = 0x80,
|
||||||
SCTP_CID_RECONF = 0x82,
|
SCTP_CID_RECONF = 0x82,
|
||||||
} sctp_cid_t; /* enum */
|
}; /* enum */
|
||||||
|
|
||||||
|
|
||||||
/* Section 3.2
|
/* Section 3.2
|
||||||
|
@ -117,12 +117,12 @@ typedef enum {
|
||||||
* the action that must be taken if the processing endpoint does not
|
* the action that must be taken if the processing endpoint does not
|
||||||
* recognize the Chunk Type.
|
* recognize the Chunk Type.
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
enum {
|
||||||
SCTP_CID_ACTION_DISCARD = 0x00,
|
SCTP_CID_ACTION_DISCARD = 0x00,
|
||||||
SCTP_CID_ACTION_DISCARD_ERR = 0x40,
|
SCTP_CID_ACTION_DISCARD_ERR = 0x40,
|
||||||
SCTP_CID_ACTION_SKIP = 0x80,
|
SCTP_CID_ACTION_SKIP = 0x80,
|
||||||
SCTP_CID_ACTION_SKIP_ERR = 0xc0,
|
SCTP_CID_ACTION_SKIP_ERR = 0xc0,
|
||||||
} sctp_cid_action_t;
|
};
|
||||||
|
|
||||||
enum { SCTP_CID_ACTION_MASK = 0xc0, };
|
enum { SCTP_CID_ACTION_MASK = 0xc0, };
|
||||||
|
|
||||||
|
@ -162,12 +162,12 @@ enum { SCTP_CHUNK_FLAG_T = 0x01 };
|
||||||
* Section 3.2.1 Optional/Variable-length Parmaeter Format.
|
* Section 3.2.1 Optional/Variable-length Parmaeter Format.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct sctp_paramhdr {
|
struct sctp_paramhdr {
|
||||||
__be16 type;
|
__be16 type;
|
||||||
__be16 length;
|
__be16 length;
|
||||||
} sctp_paramhdr_t;
|
};
|
||||||
|
|
||||||
typedef enum {
|
enum sctp_param {
|
||||||
|
|
||||||
/* RFC 2960 Section 3.3.5 */
|
/* RFC 2960 Section 3.3.5 */
|
||||||
SCTP_PARAM_HEARTBEAT_INFO = cpu_to_be16(1),
|
SCTP_PARAM_HEARTBEAT_INFO = cpu_to_be16(1),
|
||||||
|
@ -207,7 +207,7 @@ typedef enum {
|
||||||
SCTP_PARAM_RESET_RESPONSE = cpu_to_be16(0x0010),
|
SCTP_PARAM_RESET_RESPONSE = cpu_to_be16(0x0010),
|
||||||
SCTP_PARAM_RESET_ADD_OUT_STREAMS = cpu_to_be16(0x0011),
|
SCTP_PARAM_RESET_ADD_OUT_STREAMS = cpu_to_be16(0x0011),
|
||||||
SCTP_PARAM_RESET_ADD_IN_STREAMS = cpu_to_be16(0x0012),
|
SCTP_PARAM_RESET_ADD_IN_STREAMS = cpu_to_be16(0x0012),
|
||||||
} sctp_param_t; /* enum */
|
}; /* enum */
|
||||||
|
|
||||||
|
|
||||||
/* RFC 2960 Section 3.2.1
|
/* RFC 2960 Section 3.2.1
|
||||||
|
@ -216,29 +216,29 @@ typedef enum {
|
||||||
* not recognize the Parameter Type.
|
* not recognize the Parameter Type.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
enum {
|
||||||
SCTP_PARAM_ACTION_DISCARD = cpu_to_be16(0x0000),
|
SCTP_PARAM_ACTION_DISCARD = cpu_to_be16(0x0000),
|
||||||
SCTP_PARAM_ACTION_DISCARD_ERR = cpu_to_be16(0x4000),
|
SCTP_PARAM_ACTION_DISCARD_ERR = cpu_to_be16(0x4000),
|
||||||
SCTP_PARAM_ACTION_SKIP = cpu_to_be16(0x8000),
|
SCTP_PARAM_ACTION_SKIP = cpu_to_be16(0x8000),
|
||||||
SCTP_PARAM_ACTION_SKIP_ERR = cpu_to_be16(0xc000),
|
SCTP_PARAM_ACTION_SKIP_ERR = cpu_to_be16(0xc000),
|
||||||
} sctp_param_action_t;
|
};
|
||||||
|
|
||||||
enum { SCTP_PARAM_ACTION_MASK = cpu_to_be16(0xc000), };
|
enum { SCTP_PARAM_ACTION_MASK = cpu_to_be16(0xc000), };
|
||||||
|
|
||||||
/* RFC 2960 Section 3.3.1 Payload Data (DATA) (0) */
|
/* RFC 2960 Section 3.3.1 Payload Data (DATA) (0) */
|
||||||
|
|
||||||
typedef struct sctp_datahdr {
|
struct sctp_datahdr {
|
||||||
__be32 tsn;
|
__be32 tsn;
|
||||||
__be16 stream;
|
__be16 stream;
|
||||||
__be16 ssn;
|
__be16 ssn;
|
||||||
__be32 ppid;
|
__be32 ppid;
|
||||||
__u8 payload[0];
|
__u8 payload[0];
|
||||||
} sctp_datahdr_t;
|
};
|
||||||
|
|
||||||
typedef struct sctp_data_chunk {
|
struct sctp_data_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_datahdr_t data_hdr;
|
struct sctp_datahdr data_hdr;
|
||||||
} sctp_data_chunk_t;
|
};
|
||||||
|
|
||||||
/* DATA Chuck Specific Flags */
|
/* DATA Chuck Specific Flags */
|
||||||
enum {
|
enum {
|
||||||
|
@ -257,54 +257,54 @@ enum { SCTP_DATA_FRAG_MASK = 0x03, };
|
||||||
* This chunk is used to initiate a SCTP association between two
|
* This chunk is used to initiate a SCTP association between two
|
||||||
* endpoints.
|
* endpoints.
|
||||||
*/
|
*/
|
||||||
typedef struct sctp_inithdr {
|
struct sctp_inithdr {
|
||||||
__be32 init_tag;
|
__be32 init_tag;
|
||||||
__be32 a_rwnd;
|
__be32 a_rwnd;
|
||||||
__be16 num_outbound_streams;
|
__be16 num_outbound_streams;
|
||||||
__be16 num_inbound_streams;
|
__be16 num_inbound_streams;
|
||||||
__be32 initial_tsn;
|
__be32 initial_tsn;
|
||||||
__u8 params[0];
|
__u8 params[0];
|
||||||
} sctp_inithdr_t;
|
};
|
||||||
|
|
||||||
typedef struct sctp_init_chunk {
|
struct sctp_init_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_inithdr_t init_hdr;
|
struct sctp_inithdr init_hdr;
|
||||||
} sctp_init_chunk_t;
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Section 3.3.2.1. IPv4 Address Parameter (5) */
|
/* Section 3.3.2.1. IPv4 Address Parameter (5) */
|
||||||
typedef struct sctp_ipv4addr_param {
|
typedef struct sctp_ipv4addr_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
} sctp_ipv4addr_param_t;
|
} sctp_ipv4addr_param_t;
|
||||||
|
|
||||||
/* Section 3.3.2.1. IPv6 Address Parameter (6) */
|
/* Section 3.3.2.1. IPv6 Address Parameter (6) */
|
||||||
typedef struct sctp_ipv6addr_param {
|
typedef struct sctp_ipv6addr_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
struct in6_addr addr;
|
struct in6_addr addr;
|
||||||
} sctp_ipv6addr_param_t;
|
} sctp_ipv6addr_param_t;
|
||||||
|
|
||||||
/* Section 3.3.2.1 Cookie Preservative (9) */
|
/* Section 3.3.2.1 Cookie Preservative (9) */
|
||||||
typedef struct sctp_cookie_preserve_param {
|
typedef struct sctp_cookie_preserve_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__be32 lifespan_increment;
|
__be32 lifespan_increment;
|
||||||
} sctp_cookie_preserve_param_t;
|
} sctp_cookie_preserve_param_t;
|
||||||
|
|
||||||
/* Section 3.3.2.1 Host Name Address (11) */
|
/* Section 3.3.2.1 Host Name Address (11) */
|
||||||
typedef struct sctp_hostname_param {
|
typedef struct sctp_hostname_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
uint8_t hostname[0];
|
uint8_t hostname[0];
|
||||||
} sctp_hostname_param_t;
|
} sctp_hostname_param_t;
|
||||||
|
|
||||||
/* Section 3.3.2.1 Supported Address Types (12) */
|
/* Section 3.3.2.1 Supported Address Types (12) */
|
||||||
typedef struct sctp_supported_addrs_param {
|
typedef struct sctp_supported_addrs_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__be16 types[0];
|
__be16 types[0];
|
||||||
} sctp_supported_addrs_param_t;
|
} sctp_supported_addrs_param_t;
|
||||||
|
|
||||||
/* Appendix A. ECN Capable (32768) */
|
/* Appendix A. ECN Capable (32768) */
|
||||||
typedef struct sctp_ecn_capable_param {
|
typedef struct sctp_ecn_capable_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
} sctp_ecn_capable_param_t;
|
} sctp_ecn_capable_param_t;
|
||||||
|
|
||||||
/* ADDIP Section 3.2.6 Adaptation Layer Indication */
|
/* ADDIP Section 3.2.6 Adaptation Layer Indication */
|
||||||
|
@ -321,19 +321,19 @@ typedef struct sctp_supported_ext_param {
|
||||||
|
|
||||||
/* AUTH Section 3.1 Random */
|
/* AUTH Section 3.1 Random */
|
||||||
typedef struct sctp_random_param {
|
typedef struct sctp_random_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u8 random_val[0];
|
__u8 random_val[0];
|
||||||
} sctp_random_param_t;
|
} sctp_random_param_t;
|
||||||
|
|
||||||
/* AUTH Section 3.2 Chunk List */
|
/* AUTH Section 3.2 Chunk List */
|
||||||
typedef struct sctp_chunks_param {
|
typedef struct sctp_chunks_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u8 chunks[0];
|
__u8 chunks[0];
|
||||||
} sctp_chunks_param_t;
|
} sctp_chunks_param_t;
|
||||||
|
|
||||||
/* AUTH Section 3.3 HMAC Algorithm */
|
/* AUTH Section 3.3 HMAC Algorithm */
|
||||||
typedef struct sctp_hmac_algo_param {
|
typedef struct sctp_hmac_algo_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__be16 hmac_ids[0];
|
__be16 hmac_ids[0];
|
||||||
} sctp_hmac_algo_param_t;
|
} sctp_hmac_algo_param_t;
|
||||||
|
|
||||||
|
@ -341,18 +341,18 @@ typedef struct sctp_hmac_algo_param {
|
||||||
* The INIT ACK chunk is used to acknowledge the initiation of an SCTP
|
* The INIT ACK chunk is used to acknowledge the initiation of an SCTP
|
||||||
* association.
|
* association.
|
||||||
*/
|
*/
|
||||||
typedef sctp_init_chunk_t sctp_initack_chunk_t;
|
typedef struct sctp_init_chunk sctp_initack_chunk_t;
|
||||||
|
|
||||||
/* Section 3.3.3.1 State Cookie (7) */
|
/* Section 3.3.3.1 State Cookie (7) */
|
||||||
typedef struct sctp_cookie_param {
|
typedef struct sctp_cookie_param {
|
||||||
sctp_paramhdr_t p;
|
struct sctp_paramhdr p;
|
||||||
__u8 body[0];
|
__u8 body[0];
|
||||||
} sctp_cookie_param_t;
|
} sctp_cookie_param_t;
|
||||||
|
|
||||||
/* Section 3.3.3.1 Unrecognized Parameters (8) */
|
/* Section 3.3.3.1 Unrecognized Parameters (8) */
|
||||||
typedef struct sctp_unrecognized_param {
|
typedef struct sctp_unrecognized_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
sctp_paramhdr_t unrecognized;
|
struct sctp_paramhdr unrecognized;
|
||||||
} sctp_unrecognized_param_t;
|
} sctp_unrecognized_param_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -386,7 +386,7 @@ typedef struct sctp_sackhdr {
|
||||||
} sctp_sackhdr_t;
|
} sctp_sackhdr_t;
|
||||||
|
|
||||||
typedef struct sctp_sack_chunk {
|
typedef struct sctp_sack_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_sackhdr_t sack_hdr;
|
sctp_sackhdr_t sack_hdr;
|
||||||
} sctp_sack_chunk_t;
|
} sctp_sack_chunk_t;
|
||||||
|
|
||||||
|
@ -399,11 +399,11 @@ typedef struct sctp_sack_chunk {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct sctp_heartbeathdr {
|
typedef struct sctp_heartbeathdr {
|
||||||
sctp_paramhdr_t info;
|
struct sctp_paramhdr info;
|
||||||
} sctp_heartbeathdr_t;
|
} sctp_heartbeathdr_t;
|
||||||
|
|
||||||
typedef struct sctp_heartbeat_chunk {
|
typedef struct sctp_heartbeat_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_heartbeathdr_t hb_hdr;
|
sctp_heartbeathdr_t hb_hdr;
|
||||||
} sctp_heartbeat_chunk_t;
|
} sctp_heartbeat_chunk_t;
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ typedef struct sctp_heartbeat_chunk {
|
||||||
* chunk descriptor.
|
* chunk descriptor.
|
||||||
*/
|
*/
|
||||||
typedef struct sctp_abort_chunk {
|
typedef struct sctp_abort_chunk {
|
||||||
sctp_chunkhdr_t uh;
|
struct sctp_chunkhdr uh;
|
||||||
} sctp_abort_chunk_t;
|
} sctp_abort_chunk_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -425,7 +425,7 @@ typedef struct sctp_shutdownhdr {
|
||||||
} sctp_shutdownhdr_t;
|
} sctp_shutdownhdr_t;
|
||||||
|
|
||||||
struct sctp_shutdown_chunk_t {
|
struct sctp_shutdown_chunk_t {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_shutdownhdr_t shutdown_hdr;
|
sctp_shutdownhdr_t shutdown_hdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -438,7 +438,7 @@ typedef struct sctp_errhdr {
|
||||||
} sctp_errhdr_t;
|
} sctp_errhdr_t;
|
||||||
|
|
||||||
typedef struct sctp_operr_chunk {
|
typedef struct sctp_operr_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_errhdr_t err_hdr;
|
sctp_errhdr_t err_hdr;
|
||||||
} sctp_operr_chunk_t;
|
} sctp_operr_chunk_t;
|
||||||
|
|
||||||
|
@ -528,7 +528,7 @@ typedef struct sctp_ecnehdr {
|
||||||
} sctp_ecnehdr_t;
|
} sctp_ecnehdr_t;
|
||||||
|
|
||||||
typedef struct sctp_ecne_chunk {
|
typedef struct sctp_ecne_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_ecnehdr_t ence_hdr;
|
sctp_ecnehdr_t ence_hdr;
|
||||||
} sctp_ecne_chunk_t;
|
} sctp_ecne_chunk_t;
|
||||||
|
|
||||||
|
@ -540,7 +540,7 @@ typedef struct sctp_cwrhdr {
|
||||||
} sctp_cwrhdr_t;
|
} sctp_cwrhdr_t;
|
||||||
|
|
||||||
typedef struct sctp_cwr_chunk {
|
typedef struct sctp_cwr_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_cwrhdr_t cwr_hdr;
|
sctp_cwrhdr_t cwr_hdr;
|
||||||
} sctp_cwr_chunk_t;
|
} sctp_cwr_chunk_t;
|
||||||
|
|
||||||
|
@ -639,7 +639,7 @@ struct sctp_fwdtsn_chunk {
|
||||||
* report status of ASCONF processing.
|
* report status of ASCONF processing.
|
||||||
*/
|
*/
|
||||||
typedef struct sctp_addip_param {
|
typedef struct sctp_addip_param {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__be32 crr_id;
|
__be32 crr_id;
|
||||||
} sctp_addip_param_t;
|
} sctp_addip_param_t;
|
||||||
|
|
||||||
|
@ -649,7 +649,7 @@ typedef struct sctp_addiphdr {
|
||||||
} sctp_addiphdr_t;
|
} sctp_addiphdr_t;
|
||||||
|
|
||||||
typedef struct sctp_addip_chunk {
|
typedef struct sctp_addip_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_addiphdr_t addip_hdr;
|
sctp_addiphdr_t addip_hdr;
|
||||||
} sctp_addip_chunk_t;
|
} sctp_addip_chunk_t;
|
||||||
|
|
||||||
|
@ -709,7 +709,7 @@ typedef struct sctp_authhdr {
|
||||||
} sctp_authhdr_t;
|
} sctp_authhdr_t;
|
||||||
|
|
||||||
typedef struct sctp_auth_chunk {
|
typedef struct sctp_auth_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
sctp_authhdr_t auth_hdr;
|
sctp_authhdr_t auth_hdr;
|
||||||
} sctp_auth_chunk_t;
|
} sctp_auth_chunk_t;
|
||||||
|
|
||||||
|
@ -719,12 +719,12 @@ struct sctp_infox {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_reconf_chunk {
|
struct sctp_reconf_chunk {
|
||||||
sctp_chunkhdr_t chunk_hdr;
|
struct sctp_chunkhdr chunk_hdr;
|
||||||
__u8 params[0];
|
__u8 params[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_strreset_outreq {
|
struct sctp_strreset_outreq {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u32 request_seq;
|
__u32 request_seq;
|
||||||
__u32 response_seq;
|
__u32 response_seq;
|
||||||
__u32 send_reset_at_tsn;
|
__u32 send_reset_at_tsn;
|
||||||
|
@ -732,18 +732,18 @@ struct sctp_strreset_outreq {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_strreset_inreq {
|
struct sctp_strreset_inreq {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u32 request_seq;
|
__u32 request_seq;
|
||||||
__u16 list_of_streams[0];
|
__u16 list_of_streams[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_strreset_tsnreq {
|
struct sctp_strreset_tsnreq {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u32 request_seq;
|
__u32 request_seq;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_strreset_addstrm {
|
struct sctp_strreset_addstrm {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u32 request_seq;
|
__u32 request_seq;
|
||||||
__u16 number_of_streams;
|
__u16 number_of_streams;
|
||||||
__u16 reserved;
|
__u16 reserved;
|
||||||
|
@ -760,13 +760,13 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_strreset_resp {
|
struct sctp_strreset_resp {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u32 response_seq;
|
__u32 response_seq;
|
||||||
__u32 result;
|
__u32 result;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sctp_strreset_resptsn {
|
struct sctp_strreset_resptsn {
|
||||||
sctp_paramhdr_t param_hdr;
|
struct sctp_paramhdr param_hdr;
|
||||||
__u32 response_seq;
|
__u32 response_seq;
|
||||||
__u32 result;
|
__u32 result;
|
||||||
__u32 senders_next_tsn;
|
__u32 senders_next_tsn;
|
||||||
|
|
|
@ -97,8 +97,10 @@ void sctp_auth_asoc_set_default_hmac(struct sctp_association *asoc,
|
||||||
struct sctp_hmac_algo_param *hmacs);
|
struct sctp_hmac_algo_param *hmacs);
|
||||||
int sctp_auth_asoc_verify_hmac_id(const struct sctp_association *asoc,
|
int sctp_auth_asoc_verify_hmac_id(const struct sctp_association *asoc,
|
||||||
__be16 hmac_id);
|
__be16 hmac_id);
|
||||||
int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc);
|
int sctp_auth_send_cid(enum sctp_cid chunk,
|
||||||
int sctp_auth_recv_cid(sctp_cid_t chunk, const struct sctp_association *asoc);
|
const struct sctp_association *asoc);
|
||||||
|
int sctp_auth_recv_cid(enum sctp_cid chunk,
|
||||||
|
const struct sctp_association *asoc);
|
||||||
void sctp_auth_calculate_hmac(const struct sctp_association *asoc,
|
void sctp_auth_calculate_hmac(const struct sctp_association *asoc,
|
||||||
struct sk_buff *skb,
|
struct sk_buff *skb,
|
||||||
struct sctp_auth_chunk *auth, gfp_t gfp);
|
struct sctp_auth_chunk *auth, gfp_t gfp);
|
||||||
|
|
|
@ -132,7 +132,7 @@ typedef union {
|
||||||
struct sctp_association *asoc;
|
struct sctp_association *asoc;
|
||||||
struct sctp_transport *transport;
|
struct sctp_transport *transport;
|
||||||
struct sctp_bind_addr *bp;
|
struct sctp_bind_addr *bp;
|
||||||
sctp_init_chunk_t *init;
|
struct sctp_init_chunk *init;
|
||||||
struct sctp_ulpevent *ulpevent;
|
struct sctp_ulpevent *ulpevent;
|
||||||
struct sctp_packet *packet;
|
struct sctp_packet *packet;
|
||||||
sctp_sackhdr_t *sackh;
|
sctp_sackhdr_t *sackh;
|
||||||
|
@ -173,7 +173,7 @@ SCTP_ARG_CONSTRUCTOR(CHUNK, struct sctp_chunk *, chunk)
|
||||||
SCTP_ARG_CONSTRUCTOR(ASOC, struct sctp_association *, asoc)
|
SCTP_ARG_CONSTRUCTOR(ASOC, struct sctp_association *, asoc)
|
||||||
SCTP_ARG_CONSTRUCTOR(TRANSPORT, struct sctp_transport *, transport)
|
SCTP_ARG_CONSTRUCTOR(TRANSPORT, struct sctp_transport *, transport)
|
||||||
SCTP_ARG_CONSTRUCTOR(BA, struct sctp_bind_addr *, bp)
|
SCTP_ARG_CONSTRUCTOR(BA, struct sctp_bind_addr *, bp)
|
||||||
SCTP_ARG_CONSTRUCTOR(PEER_INIT, sctp_init_chunk_t *, init)
|
SCTP_ARG_CONSTRUCTOR(PEER_INIT, struct sctp_init_chunk *, init)
|
||||||
SCTP_ARG_CONSTRUCTOR(ULPEVENT, struct sctp_ulpevent *, ulpevent)
|
SCTP_ARG_CONSTRUCTOR(ULPEVENT, struct sctp_ulpevent *, ulpevent)
|
||||||
SCTP_ARG_CONSTRUCTOR(PACKET, struct sctp_packet *, packet)
|
SCTP_ARG_CONSTRUCTOR(PACKET, struct sctp_packet *, packet)
|
||||||
SCTP_ARG_CONSTRUCTOR(SACKH, sctp_sackhdr_t *, sackh)
|
SCTP_ARG_CONSTRUCTOR(SACKH, sctp_sackhdr_t *, sackh)
|
||||||
|
|
|
@ -130,7 +130,7 @@ typedef enum {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
sctp_cid_t chunk;
|
enum sctp_cid chunk;
|
||||||
sctp_event_timeout_t timeout;
|
sctp_event_timeout_t timeout;
|
||||||
sctp_event_other_t other;
|
sctp_event_other_t other;
|
||||||
sctp_event_primitive_t primitive;
|
sctp_event_primitive_t primitive;
|
||||||
|
@ -141,7 +141,7 @@ static inline sctp_subtype_t \
|
||||||
SCTP_ST_## _name (_type _arg) \
|
SCTP_ST_## _name (_type _arg) \
|
||||||
{ sctp_subtype_t _retval; _retval._elt = _arg; return _retval; }
|
{ sctp_subtype_t _retval; _retval._elt = _arg; return _retval; }
|
||||||
|
|
||||||
SCTP_SUBTYPE_CONSTRUCTOR(CHUNK, sctp_cid_t, chunk)
|
SCTP_SUBTYPE_CONSTRUCTOR(CHUNK, enum sctp_cid, chunk)
|
||||||
SCTP_SUBTYPE_CONSTRUCTOR(TIMEOUT, sctp_event_timeout_t, timeout)
|
SCTP_SUBTYPE_CONSTRUCTOR(TIMEOUT, sctp_event_timeout_t, timeout)
|
||||||
SCTP_SUBTYPE_CONSTRUCTOR(OTHER, sctp_event_other_t, other)
|
SCTP_SUBTYPE_CONSTRUCTOR(OTHER, sctp_event_other_t, other)
|
||||||
SCTP_SUBTYPE_CONSTRUCTOR(PRIMITIVE, sctp_event_primitive_t, primitive)
|
SCTP_SUBTYPE_CONSTRUCTOR(PRIMITIVE, sctp_event_primitive_t, primitive)
|
||||||
|
@ -152,7 +152,7 @@ SCTP_SUBTYPE_CONSTRUCTOR(PRIMITIVE, sctp_event_primitive_t, primitive)
|
||||||
/* Calculate the actual data size in a data chunk */
|
/* Calculate the actual data size in a data chunk */
|
||||||
#define SCTP_DATA_SNDSIZE(c) ((int)((unsigned long)(c->chunk_end)\
|
#define SCTP_DATA_SNDSIZE(c) ((int)((unsigned long)(c->chunk_end)\
|
||||||
- (unsigned long)(c->chunk_hdr)\
|
- (unsigned long)(c->chunk_hdr)\
|
||||||
- sizeof(sctp_data_chunk_t)))
|
- sizeof(struct sctp_data_chunk)))
|
||||||
|
|
||||||
/* Internal error codes */
|
/* Internal error codes */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -470,7 +470,7 @@ _sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member)
|
||||||
#define _sctp_walk_params(pos, chunk, end, member)\
|
#define _sctp_walk_params(pos, chunk, end, member)\
|
||||||
for (pos.v = chunk->member;\
|
for (pos.v = chunk->member;\
|
||||||
pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
|
pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
|
||||||
ntohs(pos.p->length) >= sizeof(sctp_paramhdr_t);\
|
ntohs(pos.p->length) >= sizeof(struct sctp_paramhdr);\
|
||||||
pos.v += SCTP_PAD4(ntohs(pos.p->length)))
|
pos.v += SCTP_PAD4(ntohs(pos.p->length)))
|
||||||
|
|
||||||
#define sctp_walk_errors(err, chunk_hdr)\
|
#define sctp_walk_errors(err, chunk_hdr)\
|
||||||
|
@ -478,7 +478,7 @@ _sctp_walk_errors((err), (chunk_hdr), ntohs((chunk_hdr)->length))
|
||||||
|
|
||||||
#define _sctp_walk_errors(err, chunk_hdr, end)\
|
#define _sctp_walk_errors(err, chunk_hdr, end)\
|
||||||
for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \
|
for (err = (sctp_errhdr_t *)((void *)chunk_hdr + \
|
||||||
sizeof(sctp_chunkhdr_t));\
|
sizeof(struct sctp_chunkhdr));\
|
||||||
(void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\
|
(void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\
|
||||||
ntohs(err->length) >= sizeof(sctp_errhdr_t); \
|
ntohs(err->length) >= sizeof(sctp_errhdr_t); \
|
||||||
err = (sctp_errhdr_t *)((void *)err + SCTP_PAD4(ntohs(err->length))))
|
err = (sctp_errhdr_t *)((void *)err + SCTP_PAD4(ntohs(err->length))))
|
||||||
|
|
|
@ -325,19 +325,17 @@ void sctp_generate_heartbeat_event(unsigned long peer);
|
||||||
void sctp_generate_reconf_event(unsigned long peer);
|
void sctp_generate_reconf_event(unsigned long peer);
|
||||||
void sctp_generate_proto_unreach_event(unsigned long peer);
|
void sctp_generate_proto_unreach_event(unsigned long peer);
|
||||||
|
|
||||||
void sctp_ootb_pkt_free(struct sctp_packet *);
|
void sctp_ootb_pkt_free(struct sctp_packet *packet);
|
||||||
|
|
||||||
struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *,
|
struct sctp_association *sctp_unpack_cookie(const struct sctp_endpoint *ep,
|
||||||
const struct sctp_association *,
|
const struct sctp_association *asoc,
|
||||||
struct sctp_chunk *,
|
struct sctp_chunk *chunk,
|
||||||
gfp_t gfp, int *err,
|
gfp_t gfp, int *err,
|
||||||
struct sctp_chunk **err_chk_p);
|
struct sctp_chunk **err_chk_p);
|
||||||
int sctp_addip_addr_config(struct sctp_association *, sctp_param_t,
|
|
||||||
struct sockaddr_storage*, int);
|
|
||||||
|
|
||||||
/* 3rd level prototypes */
|
/* 3rd level prototypes */
|
||||||
__u32 sctp_generate_tag(const struct sctp_endpoint *);
|
__u32 sctp_generate_tag(const struct sctp_endpoint *ep);
|
||||||
__u32 sctp_generate_tsn(const struct sctp_endpoint *);
|
__u32 sctp_generate_tsn(const struct sctp_endpoint *ep);
|
||||||
|
|
||||||
/* Extern declarations for major data structures. */
|
/* Extern declarations for major data structures. */
|
||||||
extern sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES];
|
extern sctp_timer_event_t *sctp_timer_events[SCTP_NUM_TIMEOUT_TYPES];
|
||||||
|
@ -349,7 +347,7 @@ static inline __u16 sctp_data_size(struct sctp_chunk *chunk)
|
||||||
__u16 size;
|
__u16 size;
|
||||||
|
|
||||||
size = ntohs(chunk->chunk_hdr->length);
|
size = ntohs(chunk->chunk_hdr->length);
|
||||||
size -= sizeof(sctp_data_chunk_t);
|
size -= sizeof(struct sctp_data_chunk);
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,9 +310,10 @@ struct sctp_cookie {
|
||||||
|
|
||||||
__u32 adaptation_ind;
|
__u32 adaptation_ind;
|
||||||
|
|
||||||
__u8 auth_random[sizeof(sctp_paramhdr_t) + SCTP_AUTH_RANDOM_LENGTH];
|
__u8 auth_random[sizeof(struct sctp_paramhdr) +
|
||||||
|
SCTP_AUTH_RANDOM_LENGTH];
|
||||||
__u8 auth_hmacs[SCTP_AUTH_NUM_HMACS * sizeof(__u16) + 2];
|
__u8 auth_hmacs[SCTP_AUTH_NUM_HMACS * sizeof(__u16) + 2];
|
||||||
__u8 auth_chunks[sizeof(sctp_paramhdr_t) + SCTP_AUTH_MAX_CHUNKS];
|
__u8 auth_chunks[sizeof(struct sctp_paramhdr) + SCTP_AUTH_MAX_CHUNKS];
|
||||||
|
|
||||||
/* This is a shim for my peer's INIT packet, followed by
|
/* This is a shim for my peer's INIT packet, followed by
|
||||||
* a copy of the raw address list of the association.
|
* a copy of the raw address list of the association.
|
||||||
|
@ -1297,11 +1298,11 @@ int sctp_has_association(struct net *net, const union sctp_addr *laddr,
|
||||||
|
|
||||||
int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
|
int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
|
||||||
const struct sctp_association *asoc,
|
const struct sctp_association *asoc,
|
||||||
sctp_cid_t, sctp_init_chunk_t *peer_init,
|
enum sctp_cid cid, struct sctp_init_chunk *peer_init,
|
||||||
struct sctp_chunk *chunk, struct sctp_chunk **err_chunk);
|
struct sctp_chunk *chunk, struct sctp_chunk **err_chunk);
|
||||||
int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk,
|
int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk,
|
||||||
const union sctp_addr *peer,
|
const union sctp_addr *peer,
|
||||||
sctp_init_chunk_t *init, gfp_t gfp);
|
struct sctp_init_chunk *init, gfp_t gfp);
|
||||||
__u32 sctp_generate_tag(const struct sctp_endpoint *);
|
__u32 sctp_generate_tag(const struct sctp_endpoint *);
|
||||||
__u32 sctp_generate_tsn(const struct sctp_endpoint *);
|
__u32 sctp_generate_tsn(const struct sctp_endpoint *);
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,8 @@ get_port(const struct sk_buff *skb, int protocol, unsigned int protooff,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IPPROTO_SCTP: {
|
case IPPROTO_SCTP: {
|
||||||
sctp_sctphdr_t _sh;
|
struct sctphdr _sh;
|
||||||
const sctp_sctphdr_t *sh;
|
const struct sctphdr *sh;
|
||||||
|
|
||||||
sh = skb_header_pointer(skb, protooff, sizeof(_sh), &_sh);
|
sh = skb_header_pointer(skb, protooff, sizeof(_sh), &_sh);
|
||||||
if (!sh)
|
if (!sh)
|
||||||
|
|
|
@ -1037,8 +1037,8 @@ static int ip_vs_out_icmp_v6(struct netns_ipvs *ipvs, struct sk_buff *skb,
|
||||||
*/
|
*/
|
||||||
static inline int is_sctp_abort(const struct sk_buff *skb, int nh_len)
|
static inline int is_sctp_abort(const struct sk_buff *skb, int nh_len)
|
||||||
{
|
{
|
||||||
sctp_chunkhdr_t *sch, schunk;
|
struct sctp_chunkhdr *sch, schunk;
|
||||||
sch = skb_header_pointer(skb, nh_len + sizeof(sctp_sctphdr_t),
|
sch = skb_header_pointer(skb, nh_len + sizeof(struct sctphdr),
|
||||||
sizeof(schunk), &schunk);
|
sizeof(schunk), &schunk);
|
||||||
if (sch == NULL)
|
if (sch == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1070,9 +1070,9 @@ static inline bool is_new_conn(const struct sk_buff *skb,
|
||||||
return th->syn;
|
return th->syn;
|
||||||
}
|
}
|
||||||
case IPPROTO_SCTP: {
|
case IPPROTO_SCTP: {
|
||||||
sctp_chunkhdr_t *sch, schunk;
|
struct sctp_chunkhdr *sch, schunk;
|
||||||
|
|
||||||
sch = skb_header_pointer(skb, iph->len + sizeof(sctp_sctphdr_t),
|
sch = skb_header_pointer(skb, iph->len + sizeof(struct sctphdr),
|
||||||
sizeof(schunk), &schunk);
|
sizeof(schunk), &schunk);
|
||||||
if (sch == NULL)
|
if (sch == NULL)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -15,15 +15,14 @@ sctp_conn_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
|
||||||
struct ip_vs_iphdr *iph)
|
struct ip_vs_iphdr *iph)
|
||||||
{
|
{
|
||||||
struct ip_vs_service *svc;
|
struct ip_vs_service *svc;
|
||||||
sctp_chunkhdr_t _schunkh, *sch;
|
struct sctp_chunkhdr _schunkh, *sch;
|
||||||
sctp_sctphdr_t *sh, _sctph;
|
struct sctphdr *sh, _sctph;
|
||||||
__be16 _ports[2], *ports = NULL;
|
__be16 _ports[2], *ports = NULL;
|
||||||
|
|
||||||
if (likely(!ip_vs_iph_icmp(iph))) {
|
if (likely(!ip_vs_iph_icmp(iph))) {
|
||||||
sh = skb_header_pointer(skb, iph->len, sizeof(_sctph), &_sctph);
|
sh = skb_header_pointer(skb, iph->len, sizeof(_sctph), &_sctph);
|
||||||
if (sh) {
|
if (sh) {
|
||||||
sch = skb_header_pointer(
|
sch = skb_header_pointer(skb, iph->len + sizeof(_sctph),
|
||||||
skb, iph->len + sizeof(sctp_sctphdr_t),
|
|
||||||
sizeof(_schunkh), &_schunkh);
|
sizeof(_schunkh), &_schunkh);
|
||||||
if (sch && (sch->type == SCTP_CID_INIT ||
|
if (sch && (sch->type == SCTP_CID_INIT ||
|
||||||
sysctl_sloppy_sctp(ipvs)))
|
sysctl_sloppy_sctp(ipvs)))
|
||||||
|
@ -77,7 +76,7 @@ sctp_conn_schedule(struct netns_ipvs *ipvs, int af, struct sk_buff *skb,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph,
|
static void sctp_nat_csum(struct sk_buff *skb, struct sctphdr *sctph,
|
||||||
unsigned int sctphoff)
|
unsigned int sctphoff)
|
||||||
{
|
{
|
||||||
sctph->checksum = sctp_compute_cksum(skb, sctphoff);
|
sctph->checksum = sctp_compute_cksum(skb, sctphoff);
|
||||||
|
@ -88,7 +87,7 @@ static int
|
||||||
sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||||
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
|
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
|
||||||
{
|
{
|
||||||
sctp_sctphdr_t *sctph;
|
struct sctphdr *sctph;
|
||||||
unsigned int sctphoff = iph->len;
|
unsigned int sctphoff = iph->len;
|
||||||
bool payload_csum = false;
|
bool payload_csum = false;
|
||||||
|
|
||||||
|
@ -135,7 +134,7 @@ static int
|
||||||
sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||||
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
|
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
|
||||||
{
|
{
|
||||||
sctp_sctphdr_t *sctph;
|
struct sctphdr *sctph;
|
||||||
unsigned int sctphoff = iph->len;
|
unsigned int sctphoff = iph->len;
|
||||||
bool payload_csum = false;
|
bool payload_csum = false;
|
||||||
|
|
||||||
|
@ -378,7 +377,7 @@ static inline void
|
||||||
set_sctp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
|
set_sctp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
|
||||||
int direction, const struct sk_buff *skb)
|
int direction, const struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
sctp_chunkhdr_t _sctpch, *sch;
|
struct sctp_chunkhdr _sctpch, *sch;
|
||||||
unsigned char chunk_type;
|
unsigned char chunk_type;
|
||||||
int event, next_state;
|
int event, next_state;
|
||||||
int ihl, cofs;
|
int ihl, cofs;
|
||||||
|
@ -389,7 +388,7 @@ set_sctp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
|
||||||
ihl = ip_hdrlen(skb);
|
ihl = ip_hdrlen(skb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cofs = ihl + sizeof(sctp_sctphdr_t);
|
cofs = ihl + sizeof(struct sctphdr);
|
||||||
sch = skb_header_pointer(skb, cofs, sizeof(_sctpch), &_sctpch);
|
sch = skb_header_pointer(skb, cofs, sizeof(_sctpch), &_sctpch);
|
||||||
if (sch == NULL)
|
if (sch == NULL)
|
||||||
return;
|
return;
|
||||||
|
@ -410,7 +409,7 @@ set_sctp_state(struct ip_vs_proto_data *pd, struct ip_vs_conn *cp,
|
||||||
(sch->type == SCTP_CID_COOKIE_ACK)) {
|
(sch->type == SCTP_CID_COOKIE_ACK)) {
|
||||||
int clen = ntohs(sch->length);
|
int clen = ntohs(sch->length);
|
||||||
|
|
||||||
if (clen >= sizeof(sctp_chunkhdr_t)) {
|
if (clen >= sizeof(_sctpch)) {
|
||||||
sch = skb_header_pointer(skb, cofs + ALIGN(clen, 4),
|
sch = skb_header_pointer(skb, cofs + ALIGN(clen, 4),
|
||||||
sizeof(_sctpch), &_sctpch);
|
sizeof(_sctpch), &_sctpch);
|
||||||
if (sch && sch->type == SCTP_CID_ABORT)
|
if (sch && sch->type == SCTP_CID_ABORT)
|
||||||
|
|
|
@ -190,7 +190,7 @@ static void sctp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define for_each_sctp_chunk(skb, sch, _sch, offset, dataoff, count) \
|
#define for_each_sctp_chunk(skb, sch, _sch, offset, dataoff, count) \
|
||||||
for ((offset) = (dataoff) + sizeof(sctp_sctphdr_t), (count) = 0; \
|
for ((offset) = (dataoff) + sizeof(struct sctphdr), (count) = 0; \
|
||||||
(offset) < (skb)->len && \
|
(offset) < (skb)->len && \
|
||||||
((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch))); \
|
((sch) = skb_header_pointer((skb), (offset), sizeof(_sch), &(_sch))); \
|
||||||
(offset) += (ntohs((sch)->length) + 3) & ~3, (count)++)
|
(offset) += (ntohs((sch)->length) + 3) & ~3, (count)++)
|
||||||
|
@ -202,7 +202,7 @@ static int do_basic_checks(struct nf_conn *ct,
|
||||||
unsigned long *map)
|
unsigned long *map)
|
||||||
{
|
{
|
||||||
u_int32_t offset, count;
|
u_int32_t offset, count;
|
||||||
sctp_chunkhdr_t _sch, *sch;
|
struct sctp_chunkhdr _sch, *sch;
|
||||||
int flag;
|
int flag;
|
||||||
|
|
||||||
flag = 0;
|
flag = 0;
|
||||||
|
@ -395,9 +395,9 @@ static int sctp_packet(struct nf_conn *ct,
|
||||||
/* If it is an INIT or an INIT ACK note down the vtag */
|
/* If it is an INIT or an INIT ACK note down the vtag */
|
||||||
if (sch->type == SCTP_CID_INIT ||
|
if (sch->type == SCTP_CID_INIT ||
|
||||||
sch->type == SCTP_CID_INIT_ACK) {
|
sch->type == SCTP_CID_INIT_ACK) {
|
||||||
sctp_inithdr_t _inithdr, *ih;
|
struct sctp_inithdr _inithdr, *ih;
|
||||||
|
|
||||||
ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
|
ih = skb_header_pointer(skb, offset + sizeof(_sch),
|
||||||
sizeof(_inithdr), &_inithdr);
|
sizeof(_inithdr), &_inithdr);
|
||||||
if (ih == NULL)
|
if (ih == NULL)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
@ -471,23 +471,20 @@ static bool sctp_new(struct nf_conn *ct, const struct sk_buff *skb,
|
||||||
|
|
||||||
/* Copy the vtag into the state info */
|
/* Copy the vtag into the state info */
|
||||||
if (sch->type == SCTP_CID_INIT) {
|
if (sch->type == SCTP_CID_INIT) {
|
||||||
if (sh->vtag == 0) {
|
struct sctp_inithdr _inithdr, *ih;
|
||||||
sctp_inithdr_t _inithdr, *ih;
|
/* Sec 8.5.1 (A) */
|
||||||
|
if (sh->vtag)
|
||||||
|
return false;
|
||||||
|
|
||||||
ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
|
ih = skb_header_pointer(skb, offset + sizeof(_sch),
|
||||||
sizeof(_inithdr), &_inithdr);
|
sizeof(_inithdr), &_inithdr);
|
||||||
if (ih == NULL)
|
if (!ih)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
pr_debug("Setting vtag %x for new conn\n",
|
pr_debug("Setting vtag %x for new conn\n",
|
||||||
ih->init_tag);
|
ih->init_tag);
|
||||||
|
|
||||||
ct->proto.sctp.vtag[IP_CT_DIR_REPLY] =
|
ct->proto.sctp.vtag[IP_CT_DIR_REPLY] = ih->init_tag;
|
||||||
ih->init_tag;
|
|
||||||
} else {
|
|
||||||
/* Sec 8.5.1 (A) */
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (sch->type == SCTP_CID_HEARTBEAT) {
|
} else if (sch->type == SCTP_CID_HEARTBEAT) {
|
||||||
pr_debug("Setting vtag %x for secondary conntrack\n",
|
pr_debug("Setting vtag %x for secondary conntrack\n",
|
||||||
sh->vtag);
|
sh->vtag);
|
||||||
|
|
|
@ -32,7 +32,7 @@ sctp_manip_pkt(struct sk_buff *skb,
|
||||||
const struct nf_conntrack_tuple *tuple,
|
const struct nf_conntrack_tuple *tuple,
|
||||||
enum nf_nat_manip_type maniptype)
|
enum nf_nat_manip_type maniptype)
|
||||||
{
|
{
|
||||||
sctp_sctphdr_t *hdr;
|
struct sctphdr *hdr;
|
||||||
int hdrsize = 8;
|
int hdrsize = 8;
|
||||||
|
|
||||||
/* This could be an inner header returned in imcp packet; in such
|
/* This could be an inner header returned in imcp packet; in such
|
||||||
|
|
|
@ -42,8 +42,8 @@ match_packet(const struct sk_buff *skb,
|
||||||
bool *hotdrop)
|
bool *hotdrop)
|
||||||
{
|
{
|
||||||
u_int32_t chunkmapcopy[256 / sizeof (u_int32_t)];
|
u_int32_t chunkmapcopy[256 / sizeof (u_int32_t)];
|
||||||
const sctp_chunkhdr_t *sch;
|
const struct sctp_chunkhdr *sch;
|
||||||
sctp_chunkhdr_t _sch;
|
struct sctp_chunkhdr _sch;
|
||||||
int chunk_match_type = info->chunk_match_type;
|
int chunk_match_type = info->chunk_match_type;
|
||||||
const struct xt_sctp_flag_info *flag_info = info->flag_info;
|
const struct xt_sctp_flag_info *flag_info = info->flag_info;
|
||||||
int flag_count = info->flag_count;
|
int flag_count = info->flag_count;
|
||||||
|
@ -118,8 +118,8 @@ static bool
|
||||||
sctp_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
sctp_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||||
{
|
{
|
||||||
const struct xt_sctp_info *info = par->matchinfo;
|
const struct xt_sctp_info *info = par->matchinfo;
|
||||||
const sctp_sctphdr_t *sh;
|
const struct sctphdr *sh;
|
||||||
sctp_sctphdr_t _sh;
|
struct sctphdr _sh;
|
||||||
|
|
||||||
if (par->fragoff != 0) {
|
if (par->fragoff != 0) {
|
||||||
pr_debug("Dropping non-first fragment.. FIXME\n");
|
pr_debug("Dropping non-first fragment.. FIXME\n");
|
||||||
|
@ -136,11 +136,11 @@ sctp_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
||||||
|
|
||||||
return SCCHECK(ntohs(sh->source) >= info->spts[0]
|
return SCCHECK(ntohs(sh->source) >= info->spts[0]
|
||||||
&& ntohs(sh->source) <= info->spts[1],
|
&& ntohs(sh->source) <= info->spts[1],
|
||||||
XT_SCTP_SRC_PORTS, info->flags, info->invflags)
|
XT_SCTP_SRC_PORTS, info->flags, info->invflags) &&
|
||||||
&& SCCHECK(ntohs(sh->dest) >= info->dpts[0]
|
SCCHECK(ntohs(sh->dest) >= info->dpts[0]
|
||||||
&& ntohs(sh->dest) <= info->dpts[1],
|
&& ntohs(sh->dest) <= info->dpts[1],
|
||||||
XT_SCTP_DEST_PORTS, info->flags, info->invflags)
|
XT_SCTP_DEST_PORTS, info->flags, info->invflags) &&
|
||||||
&& SCCHECK(match_packet(skb, par->thoff + sizeof(sctp_sctphdr_t),
|
SCCHECK(match_packet(skb, par->thoff + sizeof(_sh),
|
||||||
info, &par->hotdrop),
|
info, &par->hotdrop),
|
||||||
XT_SCTP_CHUNK_TYPES, info->flags, info->invflags);
|
XT_SCTP_CHUNK_TYPES, info->flags, info->invflags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,7 +71,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
|
||||||
{
|
{
|
||||||
struct net *net = sock_net(sk);
|
struct net *net = sock_net(sk);
|
||||||
struct sctp_sock *sp;
|
struct sctp_sock *sp;
|
||||||
sctp_paramhdr_t *p;
|
struct sctp_paramhdr *p;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Retrieve the SCTP per socket area. */
|
/* Retrieve the SCTP per socket area. */
|
||||||
|
@ -284,9 +284,9 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
|
||||||
ntohs(ep->auth_chunk_list->param_hdr.length));
|
ntohs(ep->auth_chunk_list->param_hdr.length));
|
||||||
|
|
||||||
/* Get the AUTH random number for this association */
|
/* Get the AUTH random number for this association */
|
||||||
p = (sctp_paramhdr_t *)asoc->c.auth_random;
|
p = (struct sctp_paramhdr *)asoc->c.auth_random;
|
||||||
p->type = SCTP_PARAM_RANDOM;
|
p->type = SCTP_PARAM_RANDOM;
|
||||||
p->length = htons(sizeof(sctp_paramhdr_t) + SCTP_AUTH_RANDOM_LENGTH);
|
p->length = htons(sizeof(*p) + SCTP_AUTH_RANDOM_LENGTH);
|
||||||
get_random_bytes(p+1, SCTP_AUTH_RANDOM_LENGTH);
|
get_random_bytes(p+1, SCTP_AUTH_RANDOM_LENGTH);
|
||||||
|
|
||||||
return asoc;
|
return asoc;
|
||||||
|
|
|
@ -538,7 +538,8 @@ struct sctp_hmac *sctp_auth_asoc_get_hmac(const struct sctp_association *asoc)
|
||||||
if (!hmacs)
|
if (!hmacs)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
n_elt = (ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t)) >> 1;
|
n_elt = (ntohs(hmacs->param_hdr.length) -
|
||||||
|
sizeof(struct sctp_paramhdr)) >> 1;
|
||||||
for (i = 0; i < n_elt; i++) {
|
for (i = 0; i < n_elt; i++) {
|
||||||
id = ntohs(hmacs->hmac_ids[i]);
|
id = ntohs(hmacs->hmac_ids[i]);
|
||||||
|
|
||||||
|
@ -589,7 +590,8 @@ int sctp_auth_asoc_verify_hmac_id(const struct sctp_association *asoc,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
hmacs = (struct sctp_hmac_algo_param *)asoc->c.auth_hmacs;
|
hmacs = (struct sctp_hmac_algo_param *)asoc->c.auth_hmacs;
|
||||||
n_elt = (ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t)) >> 1;
|
n_elt = (ntohs(hmacs->param_hdr.length) -
|
||||||
|
sizeof(struct sctp_paramhdr)) >> 1;
|
||||||
|
|
||||||
return __sctp_auth_find_hmacid(hmacs->hmac_ids, n_elt, hmac_id);
|
return __sctp_auth_find_hmacid(hmacs->hmac_ids, n_elt, hmac_id);
|
||||||
}
|
}
|
||||||
|
@ -612,8 +614,8 @@ void sctp_auth_asoc_set_default_hmac(struct sctp_association *asoc,
|
||||||
if (asoc->default_hmac_id)
|
if (asoc->default_hmac_id)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
n_params = (ntohs(hmacs->param_hdr.length)
|
n_params = (ntohs(hmacs->param_hdr.length) -
|
||||||
- sizeof(sctp_paramhdr_t)) >> 1;
|
sizeof(struct sctp_paramhdr)) >> 1;
|
||||||
ep = asoc->ep;
|
ep = asoc->ep;
|
||||||
for (i = 0; i < n_params; i++) {
|
for (i = 0; i < n_params; i++) {
|
||||||
id = ntohs(hmacs->hmac_ids[i]);
|
id = ntohs(hmacs->hmac_ids[i]);
|
||||||
|
@ -632,7 +634,7 @@ void sctp_auth_asoc_set_default_hmac(struct sctp_association *asoc,
|
||||||
|
|
||||||
|
|
||||||
/* Check to see if the given chunk is supposed to be authenticated */
|
/* Check to see if the given chunk is supposed to be authenticated */
|
||||||
static int __sctp_auth_cid(sctp_cid_t chunk, struct sctp_chunks_param *param)
|
static int __sctp_auth_cid(enum sctp_cid chunk, struct sctp_chunks_param *param)
|
||||||
{
|
{
|
||||||
unsigned short len;
|
unsigned short len;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
@ -641,7 +643,7 @@ static int __sctp_auth_cid(sctp_cid_t chunk, struct sctp_chunks_param *param)
|
||||||
if (!param || param->param_hdr.length == 0)
|
if (!param || param->param_hdr.length == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
len = ntohs(param->param_hdr.length) - sizeof(sctp_paramhdr_t);
|
len = ntohs(param->param_hdr.length) - sizeof(struct sctp_paramhdr);
|
||||||
|
|
||||||
/* SCTP-AUTH, Section 3.2
|
/* SCTP-AUTH, Section 3.2
|
||||||
* The chunk types for INIT, INIT-ACK, SHUTDOWN-COMPLETE and AUTH
|
* The chunk types for INIT, INIT-ACK, SHUTDOWN-COMPLETE and AUTH
|
||||||
|
@ -668,7 +670,7 @@ static int __sctp_auth_cid(sctp_cid_t chunk, struct sctp_chunks_param *param)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if peer requested that this chunk is authenticated */
|
/* Check if peer requested that this chunk is authenticated */
|
||||||
int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc)
|
int sctp_auth_send_cid(enum sctp_cid chunk, const struct sctp_association *asoc)
|
||||||
{
|
{
|
||||||
if (!asoc)
|
if (!asoc)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -680,7 +682,7 @@ int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if we requested that peer authenticate this chunk. */
|
/* Check if we requested that peer authenticate this chunk. */
|
||||||
int sctp_auth_recv_cid(sctp_cid_t chunk, const struct sctp_association *asoc)
|
int sctp_auth_recv_cid(enum sctp_cid chunk, const struct sctp_association *asoc)
|
||||||
{
|
{
|
||||||
if (!asoc)
|
if (!asoc)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -775,7 +777,7 @@ int sctp_auth_ep_add_chunkid(struct sctp_endpoint *ep, __u8 chunk_id)
|
||||||
|
|
||||||
/* Check if we can add this chunk to the array */
|
/* Check if we can add this chunk to the array */
|
||||||
param_len = ntohs(p->param_hdr.length);
|
param_len = ntohs(p->param_hdr.length);
|
||||||
nchunks = param_len - sizeof(sctp_paramhdr_t);
|
nchunks = param_len - sizeof(struct sctp_paramhdr);
|
||||||
if (nchunks == SCTP_NUM_CHUNK_TYPES)
|
if (nchunks == SCTP_NUM_CHUNK_TYPES)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -812,8 +814,10 @@ int sctp_auth_ep_set_hmacs(struct sctp_endpoint *ep,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
for (i = 0; i < hmacs->shmac_num_idents; i++)
|
for (i = 0; i < hmacs->shmac_num_idents; i++)
|
||||||
ep->auth_hmacs_list->hmac_ids[i] = htons(hmacs->shmac_idents[i]);
|
ep->auth_hmacs_list->hmac_ids[i] =
|
||||||
ep->auth_hmacs_list->param_hdr.length = htons(sizeof(sctp_paramhdr_t) +
|
htons(hmacs->shmac_idents[i]);
|
||||||
|
ep->auth_hmacs_list->param_hdr.length =
|
||||||
|
htons(sizeof(struct sctp_paramhdr) +
|
||||||
hmacs->shmac_num_idents * sizeof(__u16));
|
hmacs->shmac_num_idents * sizeof(__u16));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,12 +90,13 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
|
||||||
*/
|
*/
|
||||||
auth_hmacs->param_hdr.type = SCTP_PARAM_HMAC_ALGO;
|
auth_hmacs->param_hdr.type = SCTP_PARAM_HMAC_ALGO;
|
||||||
auth_hmacs->param_hdr.length =
|
auth_hmacs->param_hdr.length =
|
||||||
htons(sizeof(sctp_paramhdr_t) + 2);
|
htons(sizeof(struct sctp_paramhdr) + 2);
|
||||||
auth_hmacs->hmac_ids[0] = htons(SCTP_AUTH_HMAC_ID_SHA1);
|
auth_hmacs->hmac_ids[0] = htons(SCTP_AUTH_HMAC_ID_SHA1);
|
||||||
|
|
||||||
/* Initialize the CHUNKS parameter */
|
/* Initialize the CHUNKS parameter */
|
||||||
auth_chunks->param_hdr.type = SCTP_PARAM_CHUNKS;
|
auth_chunks->param_hdr.type = SCTP_PARAM_CHUNKS;
|
||||||
auth_chunks->param_hdr.length = htons(sizeof(sctp_paramhdr_t));
|
auth_chunks->param_hdr.length =
|
||||||
|
htons(sizeof(struct sctp_paramhdr));
|
||||||
|
|
||||||
/* If the Add-IP functionality is enabled, we must
|
/* If the Add-IP functionality is enabled, we must
|
||||||
* authenticate, ASCONF and ASCONF-ACK chunks
|
* authenticate, ASCONF and ASCONF-ACK chunks
|
||||||
|
@ -104,7 +105,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
|
||||||
auth_chunks->chunks[0] = SCTP_CID_ASCONF;
|
auth_chunks->chunks[0] = SCTP_CID_ASCONF;
|
||||||
auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
|
auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
|
||||||
auth_chunks->param_hdr.length =
|
auth_chunks->param_hdr.length =
|
||||||
htons(sizeof(sctp_paramhdr_t) + 2);
|
htons(sizeof(struct sctp_paramhdr) + 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -663,19 +663,19 @@ out_unlock:
|
||||||
*/
|
*/
|
||||||
static int sctp_rcv_ootb(struct sk_buff *skb)
|
static int sctp_rcv_ootb(struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
sctp_chunkhdr_t *ch, _ch;
|
struct sctp_chunkhdr *ch, _ch;
|
||||||
int ch_end, offset = 0;
|
int ch_end, offset = 0;
|
||||||
|
|
||||||
/* Scan through all the chunks in the packet. */
|
/* Scan through all the chunks in the packet. */
|
||||||
do {
|
do {
|
||||||
/* Make sure we have at least the header there */
|
/* Make sure we have at least the header there */
|
||||||
if (offset + sizeof(sctp_chunkhdr_t) > skb->len)
|
if (offset + sizeof(_ch) > skb->len)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ch = skb_header_pointer(skb, offset, sizeof(*ch), &_ch);
|
ch = skb_header_pointer(skb, offset, sizeof(*ch), &_ch);
|
||||||
|
|
||||||
/* Break out if chunk length is less then minimal. */
|
/* Break out if chunk length is less then minimal. */
|
||||||
if (ntohs(ch->length) < sizeof(sctp_chunkhdr_t))
|
if (ntohs(ch->length) < sizeof(_ch))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ch_end = offset + SCTP_PAD4(ntohs(ch->length));
|
ch_end = offset + SCTP_PAD4(ntohs(ch->length));
|
||||||
|
@ -1051,7 +1051,7 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
|
||||||
union sctp_addr *paddr = &addr;
|
union sctp_addr *paddr = &addr;
|
||||||
struct sctphdr *sh = sctp_hdr(skb);
|
struct sctphdr *sh = sctp_hdr(skb);
|
||||||
union sctp_params params;
|
union sctp_params params;
|
||||||
sctp_init_chunk_t *init;
|
struct sctp_init_chunk *init;
|
||||||
struct sctp_af *af;
|
struct sctp_af *af;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1070,7 +1070,7 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
|
||||||
/* Find the start of the TLVs and the end of the chunk. This is
|
/* Find the start of the TLVs and the end of the chunk. This is
|
||||||
* the region we search for address parameters.
|
* the region we search for address parameters.
|
||||||
*/
|
*/
|
||||||
init = (sctp_init_chunk_t *)skb->data;
|
init = (struct sctp_init_chunk *)skb->data;
|
||||||
|
|
||||||
/* Walk the parameters looking for embedded addresses. */
|
/* Walk the parameters looking for embedded addresses. */
|
||||||
sctp_walk_params(params, init, init_hdr.params) {
|
sctp_walk_params(params, init, init_hdr.params) {
|
||||||
|
@ -1106,7 +1106,7 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
|
||||||
*/
|
*/
|
||||||
static struct sctp_association *__sctp_rcv_asconf_lookup(
|
static struct sctp_association *__sctp_rcv_asconf_lookup(
|
||||||
struct net *net,
|
struct net *net,
|
||||||
sctp_chunkhdr_t *ch,
|
struct sctp_chunkhdr *ch,
|
||||||
const union sctp_addr *laddr,
|
const union sctp_addr *laddr,
|
||||||
__be16 peer_port,
|
__be16 peer_port,
|
||||||
struct sctp_transport **transportp)
|
struct sctp_transport **transportp)
|
||||||
|
@ -1144,7 +1144,7 @@ static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net,
|
||||||
struct sctp_transport **transportp)
|
struct sctp_transport **transportp)
|
||||||
{
|
{
|
||||||
struct sctp_association *asoc = NULL;
|
struct sctp_association *asoc = NULL;
|
||||||
sctp_chunkhdr_t *ch;
|
struct sctp_chunkhdr *ch;
|
||||||
int have_auth = 0;
|
int have_auth = 0;
|
||||||
unsigned int chunk_num = 1;
|
unsigned int chunk_num = 1;
|
||||||
__u8 *ch_end;
|
__u8 *ch_end;
|
||||||
|
@ -1152,10 +1152,10 @@ static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net,
|
||||||
/* Walk through the chunks looking for AUTH or ASCONF chunks
|
/* Walk through the chunks looking for AUTH or ASCONF chunks
|
||||||
* to help us find the association.
|
* to help us find the association.
|
||||||
*/
|
*/
|
||||||
ch = (sctp_chunkhdr_t *) skb->data;
|
ch = (struct sctp_chunkhdr *)skb->data;
|
||||||
do {
|
do {
|
||||||
/* Break out if chunk length is less then minimal. */
|
/* Break out if chunk length is less then minimal. */
|
||||||
if (ntohs(ch->length) < sizeof(sctp_chunkhdr_t))
|
if (ntohs(ch->length) < sizeof(*ch))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
ch_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
||||||
|
@ -1192,7 +1192,7 @@ static struct sctp_association *__sctp_rcv_walk_lookup(struct net *net,
|
||||||
if (asoc)
|
if (asoc)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ch = (sctp_chunkhdr_t *) ch_end;
|
ch = (struct sctp_chunkhdr *)ch_end;
|
||||||
chunk_num++;
|
chunk_num++;
|
||||||
} while (ch_end < skb_tail_pointer(skb));
|
} while (ch_end < skb_tail_pointer(skb));
|
||||||
|
|
||||||
|
@ -1210,7 +1210,7 @@ static struct sctp_association *__sctp_rcv_lookup_harder(struct net *net,
|
||||||
const union sctp_addr *laddr,
|
const union sctp_addr *laddr,
|
||||||
struct sctp_transport **transportp)
|
struct sctp_transport **transportp)
|
||||||
{
|
{
|
||||||
sctp_chunkhdr_t *ch;
|
struct sctp_chunkhdr *ch;
|
||||||
|
|
||||||
/* We do not allow GSO frames here as we need to linearize and
|
/* We do not allow GSO frames here as we need to linearize and
|
||||||
* then cannot guarantee frame boundaries. This shouldn't be an
|
* then cannot guarantee frame boundaries. This shouldn't be an
|
||||||
|
@ -1220,7 +1220,7 @@ static struct sctp_association *__sctp_rcv_lookup_harder(struct net *net,
|
||||||
if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP)
|
if ((skb_shinfo(skb)->gso_type & SKB_GSO_SCTP) == SKB_GSO_SCTP)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ch = (sctp_chunkhdr_t *) skb->data;
|
ch = (struct sctp_chunkhdr *)skb->data;
|
||||||
|
|
||||||
/* The code below will attempt to walk the chunk and extract
|
/* The code below will attempt to walk the chunk and extract
|
||||||
* parameter information. Before we do that, we need to verify
|
* parameter information. Before we do that, we need to verify
|
||||||
|
|
|
@ -99,7 +99,7 @@ void sctp_inq_push(struct sctp_inq *q, struct sctp_chunk *chunk)
|
||||||
struct sctp_chunkhdr *sctp_inq_peek(struct sctp_inq *queue)
|
struct sctp_chunkhdr *sctp_inq_peek(struct sctp_inq *queue)
|
||||||
{
|
{
|
||||||
struct sctp_chunk *chunk;
|
struct sctp_chunk *chunk;
|
||||||
sctp_chunkhdr_t *ch = NULL;
|
struct sctp_chunkhdr *ch = NULL;
|
||||||
|
|
||||||
chunk = queue->in_progress;
|
chunk = queue->in_progress;
|
||||||
/* If there is no more chunks in this packet, say so */
|
/* If there is no more chunks in this packet, say so */
|
||||||
|
@ -108,7 +108,7 @@ struct sctp_chunkhdr *sctp_inq_peek(struct sctp_inq *queue)
|
||||||
chunk->pdiscard)
|
chunk->pdiscard)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ch = (sctp_chunkhdr_t *)chunk->chunk_end;
|
ch = (struct sctp_chunkhdr *)chunk->chunk_end;
|
||||||
|
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ struct sctp_chunkhdr *sctp_inq_peek(struct sctp_inq *queue)
|
||||||
struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
|
struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
|
||||||
{
|
{
|
||||||
struct sctp_chunk *chunk;
|
struct sctp_chunk *chunk;
|
||||||
sctp_chunkhdr_t *ch = NULL;
|
struct sctp_chunkhdr *ch = NULL;
|
||||||
|
|
||||||
/* The assumption is that we are safe to process the chunks
|
/* The assumption is that we are safe to process the chunks
|
||||||
* at this time.
|
* at this time.
|
||||||
|
@ -151,7 +151,7 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
|
||||||
chunk = queue->in_progress = NULL;
|
chunk = queue->in_progress = NULL;
|
||||||
} else {
|
} else {
|
||||||
/* Nothing to do. Next chunk in the packet, please. */
|
/* Nothing to do. Next chunk in the packet, please. */
|
||||||
ch = (sctp_chunkhdr_t *) chunk->chunk_end;
|
ch = (struct sctp_chunkhdr *)chunk->chunk_end;
|
||||||
/* Force chunk->skb->data to chunk->chunk_end. */
|
/* Force chunk->skb->data to chunk->chunk_end. */
|
||||||
skb_pull(chunk->skb, chunk->chunk_end - chunk->skb->data);
|
skb_pull(chunk->skb, chunk->chunk_end - chunk->skb->data);
|
||||||
/* We are guaranteed to pull a SCTP header. */
|
/* We are guaranteed to pull a SCTP header. */
|
||||||
|
@ -195,7 +195,7 @@ next_chunk:
|
||||||
|
|
||||||
new_skb:
|
new_skb:
|
||||||
/* This is the first chunk in the packet. */
|
/* This is the first chunk in the packet. */
|
||||||
ch = (sctp_chunkhdr_t *) chunk->skb->data;
|
ch = (struct sctp_chunkhdr *)chunk->skb->data;
|
||||||
chunk->singleton = 1;
|
chunk->singleton = 1;
|
||||||
chunk->data_accepted = 0;
|
chunk->data_accepted = 0;
|
||||||
chunk->pdiscard = 0;
|
chunk->pdiscard = 0;
|
||||||
|
@ -214,11 +214,10 @@ new_skb:
|
||||||
|
|
||||||
chunk->chunk_hdr = ch;
|
chunk->chunk_hdr = ch;
|
||||||
chunk->chunk_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
chunk->chunk_end = ((__u8 *)ch) + SCTP_PAD4(ntohs(ch->length));
|
||||||
skb_pull(chunk->skb, sizeof(sctp_chunkhdr_t));
|
skb_pull(chunk->skb, sizeof(*ch));
|
||||||
chunk->subh.v = NULL; /* Subheader is no longer valid. */
|
chunk->subh.v = NULL; /* Subheader is no longer valid. */
|
||||||
|
|
||||||
if (chunk->chunk_end + sizeof(sctp_chunkhdr_t) <
|
if (chunk->chunk_end + sizeof(*ch) < skb_tail_pointer(chunk->skb)) {
|
||||||
skb_tail_pointer(chunk->skb)) {
|
|
||||||
/* This is not a singleton */
|
/* This is not a singleton */
|
||||||
chunk->singleton = 0;
|
chunk->singleton = 0;
|
||||||
} else if (chunk->chunk_end > skb_tail_pointer(chunk->skb)) {
|
} else if (chunk->chunk_end > skb_tail_pointer(chunk->skb)) {
|
||||||
|
|
|
@ -723,8 +723,8 @@ static sctp_xmit_t sctp_packet_can_append_data(struct sctp_packet *packet,
|
||||||
/* Check whether this chunk and all the rest of pending data will fit
|
/* Check whether this chunk and all the rest of pending data will fit
|
||||||
* or delay in hopes of bundling a full sized packet.
|
* or delay in hopes of bundling a full sized packet.
|
||||||
*/
|
*/
|
||||||
if (chunk->skb->len + q->out_qlen >
|
if (chunk->skb->len + q->out_qlen > transport->pathmtu -
|
||||||
transport->pathmtu - packet->overhead - sizeof(sctp_data_chunk_t) - 4)
|
packet->overhead - sizeof(struct sctp_data_chunk) - 4)
|
||||||
/* Enough data queued to fill a packet */
|
/* Enough data queued to fill a packet */
|
||||||
return SCTP_XMIT_OK;
|
return SCTP_XMIT_OK;
|
||||||
|
|
||||||
|
|
|
@ -217,7 +217,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
|
||||||
{
|
{
|
||||||
struct net *net = sock_net(asoc->base.sk);
|
struct net *net = sock_net(asoc->base.sk);
|
||||||
struct sctp_endpoint *ep = asoc->ep;
|
struct sctp_endpoint *ep = asoc->ep;
|
||||||
sctp_inithdr_t init;
|
struct sctp_inithdr init;
|
||||||
union sctp_params addrs;
|
union sctp_params addrs;
|
||||||
size_t chunksize;
|
size_t chunksize;
|
||||||
struct sctp_chunk *retval = NULL;
|
struct sctp_chunk *retval = NULL;
|
||||||
|
@ -229,7 +229,7 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
|
||||||
sctp_supported_ext_param_t ext_param;
|
sctp_supported_ext_param_t ext_param;
|
||||||
int num_ext = 0;
|
int num_ext = 0;
|
||||||
__u8 extensions[3];
|
__u8 extensions[3];
|
||||||
sctp_paramhdr_t *auth_chunks = NULL,
|
struct sctp_paramhdr *auth_chunks = NULL,
|
||||||
*auth_hmacs = NULL;
|
*auth_hmacs = NULL;
|
||||||
|
|
||||||
/* RFC 2960 3.3.2 Initiation (INIT) (1)
|
/* RFC 2960 3.3.2 Initiation (INIT) (1)
|
||||||
|
@ -286,14 +286,14 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc,
|
||||||
chunksize += sizeof(asoc->c.auth_random);
|
chunksize += sizeof(asoc->c.auth_random);
|
||||||
|
|
||||||
/* Add HMACS parameter length if any were defined */
|
/* Add HMACS parameter length if any were defined */
|
||||||
auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs;
|
auth_hmacs = (struct sctp_paramhdr *)asoc->c.auth_hmacs;
|
||||||
if (auth_hmacs->length)
|
if (auth_hmacs->length)
|
||||||
chunksize += SCTP_PAD4(ntohs(auth_hmacs->length));
|
chunksize += SCTP_PAD4(ntohs(auth_hmacs->length));
|
||||||
else
|
else
|
||||||
auth_hmacs = NULL;
|
auth_hmacs = NULL;
|
||||||
|
|
||||||
/* Add CHUNKS parameter length */
|
/* Add CHUNKS parameter length */
|
||||||
auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks;
|
auth_chunks = (struct sctp_paramhdr *)asoc->c.auth_chunks;
|
||||||
if (auth_chunks->length)
|
if (auth_chunks->length)
|
||||||
chunksize += SCTP_PAD4(ntohs(auth_chunks->length));
|
chunksize += SCTP_PAD4(ntohs(auth_chunks->length));
|
||||||
else
|
else
|
||||||
|
@ -385,7 +385,7 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
|
||||||
const struct sctp_chunk *chunk,
|
const struct sctp_chunk *chunk,
|
||||||
gfp_t gfp, int unkparam_len)
|
gfp_t gfp, int unkparam_len)
|
||||||
{
|
{
|
||||||
sctp_inithdr_t initack;
|
struct sctp_inithdr initack;
|
||||||
struct sctp_chunk *retval;
|
struct sctp_chunk *retval;
|
||||||
union sctp_params addrs;
|
union sctp_params addrs;
|
||||||
struct sctp_sock *sp;
|
struct sctp_sock *sp;
|
||||||
|
@ -397,7 +397,7 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
|
||||||
sctp_supported_ext_param_t ext_param;
|
sctp_supported_ext_param_t ext_param;
|
||||||
int num_ext = 0;
|
int num_ext = 0;
|
||||||
__u8 extensions[3];
|
__u8 extensions[3];
|
||||||
sctp_paramhdr_t *auth_chunks = NULL,
|
struct sctp_paramhdr *auth_chunks = NULL,
|
||||||
*auth_hmacs = NULL,
|
*auth_hmacs = NULL,
|
||||||
*auth_random = NULL;
|
*auth_random = NULL;
|
||||||
|
|
||||||
|
@ -448,16 +448,16 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
|
||||||
chunksize += sizeof(aiparam);
|
chunksize += sizeof(aiparam);
|
||||||
|
|
||||||
if (asoc->peer.auth_capable) {
|
if (asoc->peer.auth_capable) {
|
||||||
auth_random = (sctp_paramhdr_t *)asoc->c.auth_random;
|
auth_random = (struct sctp_paramhdr *)asoc->c.auth_random;
|
||||||
chunksize += ntohs(auth_random->length);
|
chunksize += ntohs(auth_random->length);
|
||||||
|
|
||||||
auth_hmacs = (sctp_paramhdr_t *)asoc->c.auth_hmacs;
|
auth_hmacs = (struct sctp_paramhdr *)asoc->c.auth_hmacs;
|
||||||
if (auth_hmacs->length)
|
if (auth_hmacs->length)
|
||||||
chunksize += SCTP_PAD4(ntohs(auth_hmacs->length));
|
chunksize += SCTP_PAD4(ntohs(auth_hmacs->length));
|
||||||
else
|
else
|
||||||
auth_hmacs = NULL;
|
auth_hmacs = NULL;
|
||||||
|
|
||||||
auth_chunks = (sctp_paramhdr_t *)asoc->c.auth_chunks;
|
auth_chunks = (struct sctp_paramhdr *)asoc->c.auth_chunks;
|
||||||
if (auth_chunks->length)
|
if (auth_chunks->length)
|
||||||
chunksize += SCTP_PAD4(ntohs(auth_chunks->length));
|
chunksize += SCTP_PAD4(ntohs(auth_chunks->length));
|
||||||
else
|
else
|
||||||
|
@ -1085,18 +1085,18 @@ struct sctp_chunk *sctp_make_abort_violation(
|
||||||
struct sctp_chunk *retval;
|
struct sctp_chunk *retval;
|
||||||
struct sctp_paramhdr phdr;
|
struct sctp_paramhdr phdr;
|
||||||
|
|
||||||
retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t) + paylen
|
retval = sctp_make_abort(asoc, chunk, sizeof(sctp_errhdr_t) + paylen +
|
||||||
+ sizeof(sctp_paramhdr_t));
|
sizeof(phdr));
|
||||||
if (!retval)
|
if (!retval)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, paylen
|
sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, paylen +
|
||||||
+ sizeof(sctp_paramhdr_t));
|
sizeof(phdr));
|
||||||
|
|
||||||
phdr.type = htons(chunk->chunk_hdr->type);
|
phdr.type = htons(chunk->chunk_hdr->type);
|
||||||
phdr.length = chunk->chunk_hdr->length;
|
phdr.length = chunk->chunk_hdr->length;
|
||||||
sctp_addto_chunk(retval, paylen, payload);
|
sctp_addto_chunk(retval, paylen, payload);
|
||||||
sctp_addto_param(retval, sizeof(sctp_paramhdr_t), &phdr);
|
sctp_addto_param(retval, sizeof(phdr), &phdr);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -1110,16 +1110,16 @@ struct sctp_chunk *sctp_make_violation_paramlen(
|
||||||
struct sctp_chunk *retval;
|
struct sctp_chunk *retval;
|
||||||
static const char error[] = "The following parameter had invalid length:";
|
static const char error[] = "The following parameter had invalid length:";
|
||||||
size_t payload_len = sizeof(error) + sizeof(sctp_errhdr_t) +
|
size_t payload_len = sizeof(error) + sizeof(sctp_errhdr_t) +
|
||||||
sizeof(sctp_paramhdr_t);
|
sizeof(*param);
|
||||||
|
|
||||||
retval = sctp_make_abort(asoc, chunk, payload_len);
|
retval = sctp_make_abort(asoc, chunk, payload_len);
|
||||||
if (!retval)
|
if (!retval)
|
||||||
goto nodata;
|
goto nodata;
|
||||||
|
|
||||||
sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION,
|
sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION,
|
||||||
sizeof(error) + sizeof(sctp_paramhdr_t));
|
sizeof(error) + sizeof(*param));
|
||||||
sctp_addto_chunk(retval, sizeof(error), error);
|
sctp_addto_chunk(retval, sizeof(error), error);
|
||||||
sctp_addto_param(retval, sizeof(sctp_paramhdr_t), param);
|
sctp_addto_param(retval, sizeof(*param), param);
|
||||||
|
|
||||||
nodata:
|
nodata:
|
||||||
return retval;
|
return retval;
|
||||||
|
@ -1379,20 +1379,20 @@ static struct sctp_chunk *_sctp_make_chunk(const struct sctp_association *asoc,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct sctp_chunk *retval;
|
struct sctp_chunk *retval;
|
||||||
sctp_chunkhdr_t *chunk_hdr;
|
struct sctp_chunkhdr *chunk_hdr;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
struct sock *sk;
|
struct sock *sk;
|
||||||
|
|
||||||
/* No need to allocate LL here, as this is only a chunk. */
|
/* No need to allocate LL here, as this is only a chunk. */
|
||||||
skb = alloc_skb(SCTP_PAD4(sizeof(sctp_chunkhdr_t) + paylen), gfp);
|
skb = alloc_skb(SCTP_PAD4(sizeof(*chunk_hdr) + paylen), gfp);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
goto nodata;
|
goto nodata;
|
||||||
|
|
||||||
/* Make room for the chunk header. */
|
/* Make room for the chunk header. */
|
||||||
chunk_hdr = skb_put(skb, sizeof(sctp_chunkhdr_t));
|
chunk_hdr = (struct sctp_chunkhdr *)skb_put(skb, sizeof(*chunk_hdr));
|
||||||
chunk_hdr->type = type;
|
chunk_hdr->type = type;
|
||||||
chunk_hdr->flags = flags;
|
chunk_hdr->flags = flags;
|
||||||
chunk_hdr->length = htons(sizeof(sctp_chunkhdr_t));
|
chunk_hdr->length = htons(sizeof(*chunk_hdr));
|
||||||
|
|
||||||
sk = asoc ? asoc->base.sk : NULL;
|
sk = asoc ? asoc->base.sk : NULL;
|
||||||
retval = sctp_chunkify(skb, asoc, sk, gfp);
|
retval = sctp_chunkify(skb, asoc, sk, gfp);
|
||||||
|
@ -1402,7 +1402,7 @@ static struct sctp_chunk *_sctp_make_chunk(const struct sctp_association *asoc,
|
||||||
}
|
}
|
||||||
|
|
||||||
retval->chunk_hdr = chunk_hdr;
|
retval->chunk_hdr = chunk_hdr;
|
||||||
retval->chunk_end = ((__u8 *)chunk_hdr) + sizeof(struct sctp_chunkhdr);
|
retval->chunk_end = ((__u8 *)chunk_hdr) + sizeof(*chunk_hdr);
|
||||||
|
|
||||||
/* Determine if the chunk needs to be authenticated */
|
/* Determine if the chunk needs to be authenticated */
|
||||||
if (sctp_auth_send_cid(type, asoc))
|
if (sctp_auth_send_cid(type, asoc))
|
||||||
|
@ -1614,7 +1614,7 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
|
||||||
/* Header size is static data prior to the actual cookie, including
|
/* Header size is static data prior to the actual cookie, including
|
||||||
* any padding.
|
* any padding.
|
||||||
*/
|
*/
|
||||||
headersize = sizeof(sctp_paramhdr_t) +
|
headersize = sizeof(struct sctp_paramhdr) +
|
||||||
(sizeof(struct sctp_signed_cookie) -
|
(sizeof(struct sctp_signed_cookie) -
|
||||||
sizeof(struct sctp_cookie));
|
sizeof(struct sctp_cookie));
|
||||||
bodysize = sizeof(struct sctp_cookie)
|
bodysize = sizeof(struct sctp_cookie)
|
||||||
|
@ -1710,7 +1710,7 @@ struct sctp_association *sctp_unpack_cookie(
|
||||||
/* Header size is static data prior to the actual cookie, including
|
/* Header size is static data prior to the actual cookie, including
|
||||||
* any padding.
|
* any padding.
|
||||||
*/
|
*/
|
||||||
headersize = sizeof(sctp_chunkhdr_t) +
|
headersize = sizeof(struct sctp_chunkhdr) +
|
||||||
(sizeof(struct sctp_signed_cookie) -
|
(sizeof(struct sctp_signed_cookie) -
|
||||||
sizeof(struct sctp_cookie));
|
sizeof(struct sctp_cookie));
|
||||||
bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
|
bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
|
||||||
|
@ -1882,7 +1882,7 @@ struct __sctp_missing {
|
||||||
* Report a missing mandatory parameter.
|
* Report a missing mandatory parameter.
|
||||||
*/
|
*/
|
||||||
static int sctp_process_missing_param(const struct sctp_association *asoc,
|
static int sctp_process_missing_param(const struct sctp_association *asoc,
|
||||||
sctp_param_t paramtype,
|
enum sctp_param paramtype,
|
||||||
struct sctp_chunk *chunk,
|
struct sctp_chunk *chunk,
|
||||||
struct sctp_chunk **errp)
|
struct sctp_chunk **errp)
|
||||||
{
|
{
|
||||||
|
@ -1975,7 +1975,7 @@ static int sctp_process_hn_param(const struct sctp_association *asoc,
|
||||||
|
|
||||||
static int sctp_verify_ext_param(struct net *net, union sctp_params param)
|
static int sctp_verify_ext_param(struct net *net, union sctp_params param)
|
||||||
{
|
{
|
||||||
__u16 num_ext = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
|
__u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
|
||||||
int have_auth = 0;
|
int have_auth = 0;
|
||||||
int have_asconf = 0;
|
int have_asconf = 0;
|
||||||
int i;
|
int i;
|
||||||
|
@ -2010,7 +2010,7 @@ static void sctp_process_ext_param(struct sctp_association *asoc,
|
||||||
union sctp_params param)
|
union sctp_params param)
|
||||||
{
|
{
|
||||||
struct net *net = sock_net(asoc->base.sk);
|
struct net *net = sock_net(asoc->base.sk);
|
||||||
__u16 num_ext = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
|
__u16 num_ext = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < num_ext; i++) {
|
for (i = 0; i < num_ext; i++) {
|
||||||
|
@ -2123,7 +2123,7 @@ static sctp_ierror_t sctp_verify_param(struct net *net,
|
||||||
const struct sctp_endpoint *ep,
|
const struct sctp_endpoint *ep,
|
||||||
const struct sctp_association *asoc,
|
const struct sctp_association *asoc,
|
||||||
union sctp_params param,
|
union sctp_params param,
|
||||||
sctp_cid_t cid,
|
enum sctp_cid cid,
|
||||||
struct sctp_chunk *chunk,
|
struct sctp_chunk *chunk,
|
||||||
struct sctp_chunk **err_chunk)
|
struct sctp_chunk **err_chunk)
|
||||||
{
|
{
|
||||||
|
@ -2180,7 +2180,7 @@ static sctp_ierror_t sctp_verify_param(struct net *net,
|
||||||
* cause 'Protocol Violation'.
|
* cause 'Protocol Violation'.
|
||||||
*/
|
*/
|
||||||
if (SCTP_AUTH_RANDOM_LENGTH !=
|
if (SCTP_AUTH_RANDOM_LENGTH !=
|
||||||
ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) {
|
ntohs(param.p->length) - sizeof(struct sctp_paramhdr)) {
|
||||||
sctp_process_inv_paramlength(asoc, param.p,
|
sctp_process_inv_paramlength(asoc, param.p,
|
||||||
chunk, err_chunk);
|
chunk, err_chunk);
|
||||||
retval = SCTP_IERROR_ABORT;
|
retval = SCTP_IERROR_ABORT;
|
||||||
|
@ -2208,7 +2208,8 @@ static sctp_ierror_t sctp_verify_param(struct net *net,
|
||||||
goto fallthrough;
|
goto fallthrough;
|
||||||
|
|
||||||
hmacs = (struct sctp_hmac_algo_param *)param.p;
|
hmacs = (struct sctp_hmac_algo_param *)param.p;
|
||||||
n_elt = (ntohs(param.p->length) - sizeof(sctp_paramhdr_t)) >> 1;
|
n_elt = (ntohs(param.p->length) -
|
||||||
|
sizeof(struct sctp_paramhdr)) >> 1;
|
||||||
|
|
||||||
/* SCTP-AUTH: Section 6.1
|
/* SCTP-AUTH: Section 6.1
|
||||||
* The HMAC algorithm based on SHA-1 MUST be supported and
|
* The HMAC algorithm based on SHA-1 MUST be supported and
|
||||||
|
@ -2240,9 +2241,9 @@ fallthrough:
|
||||||
|
|
||||||
/* Verify the INIT packet before we process it. */
|
/* Verify the INIT packet before we process it. */
|
||||||
int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
|
int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
|
||||||
const struct sctp_association *asoc, sctp_cid_t cid,
|
const struct sctp_association *asoc, enum sctp_cid cid,
|
||||||
sctp_init_chunk_t *peer_init, struct sctp_chunk *chunk,
|
struct sctp_init_chunk *peer_init,
|
||||||
struct sctp_chunk **errp)
|
struct sctp_chunk *chunk, struct sctp_chunk **errp)
|
||||||
{
|
{
|
||||||
union sctp_params param;
|
union sctp_params param;
|
||||||
bool has_cookie = false;
|
bool has_cookie = false;
|
||||||
|
@ -2306,7 +2307,7 @@ int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
|
||||||
*/
|
*/
|
||||||
int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
|
int sctp_process_init(struct sctp_association *asoc, struct sctp_chunk *chunk,
|
||||||
const union sctp_addr *peer_addr,
|
const union sctp_addr *peer_addr,
|
||||||
sctp_init_chunk_t *peer_init, gfp_t gfp)
|
struct sctp_init_chunk *peer_init, gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct net *net = sock_net(asoc->base.sk);
|
struct net *net = sock_net(asoc->base.sk);
|
||||||
union sctp_params param;
|
union sctp_params param;
|
||||||
|
@ -2565,7 +2566,7 @@ do_addr_param:
|
||||||
asoc->peer.ipv4_address = 1;
|
asoc->peer.ipv4_address = 1;
|
||||||
|
|
||||||
/* Cycle through address types; avoid divide by 0. */
|
/* Cycle through address types; avoid divide by 0. */
|
||||||
sat = ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
|
sat = ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
|
||||||
if (sat)
|
if (sat)
|
||||||
sat /= sizeof(__u16);
|
sat /= sizeof(__u16);
|
||||||
|
|
||||||
|
@ -2592,7 +2593,7 @@ do_addr_param:
|
||||||
|
|
||||||
case SCTP_PARAM_STATE_COOKIE:
|
case SCTP_PARAM_STATE_COOKIE:
|
||||||
asoc->peer.cookie_len =
|
asoc->peer.cookie_len =
|
||||||
ntohs(param.p->length) - sizeof(sctp_paramhdr_t);
|
ntohs(param.p->length) - sizeof(struct sctp_paramhdr);
|
||||||
asoc->peer.cookie = param.cookie->body;
|
asoc->peer.cookie = param.cookie->body;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -3176,7 +3177,7 @@ bool sctp_verify_asconf(const struct sctp_association *asoc,
|
||||||
return false;
|
return false;
|
||||||
length = ntohs(param.addip->param_hdr.length);
|
length = ntohs(param.addip->param_hdr.length);
|
||||||
if (length < sizeof(sctp_addip_param_t) +
|
if (length < sizeof(sctp_addip_param_t) +
|
||||||
sizeof(sctp_paramhdr_t))
|
sizeof(**errp))
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case SCTP_PARAM_SUCCESS_REPORT:
|
case SCTP_PARAM_SUCCESS_REPORT:
|
||||||
|
@ -3218,7 +3219,8 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
|
||||||
int chunk_len;
|
int chunk_len;
|
||||||
__u32 serial;
|
__u32 serial;
|
||||||
|
|
||||||
chunk_len = ntohs(asconf->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
|
chunk_len = ntohs(asconf->chunk_hdr->length) -
|
||||||
|
sizeof(struct sctp_chunkhdr);
|
||||||
hdr = (sctp_addiphdr_t *)asconf->skb->data;
|
hdr = (sctp_addiphdr_t *)asconf->skb->data;
|
||||||
serial = ntohl(hdr->serial);
|
serial = ntohl(hdr->serial);
|
||||||
|
|
||||||
|
@ -3364,7 +3366,7 @@ static __be16 sctp_get_asconf_response(struct sctp_chunk *asconf_ack,
|
||||||
err_code = SCTP_ERROR_REQ_REFUSED;
|
err_code = SCTP_ERROR_REQ_REFUSED;
|
||||||
|
|
||||||
asconf_ack_len = ntohs(asconf_ack->chunk_hdr->length) -
|
asconf_ack_len = ntohs(asconf_ack->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t);
|
sizeof(struct sctp_chunkhdr);
|
||||||
|
|
||||||
/* Skip the addiphdr from the asconf_ack chunk and store a pointer to
|
/* Skip the addiphdr from the asconf_ack chunk and store a pointer to
|
||||||
* the first asconf_ack parameter.
|
* the first asconf_ack parameter.
|
||||||
|
|
|
@ -647,7 +647,7 @@ static void sctp_cmd_assoc_failed(sctp_cmd_seq_t *commands,
|
||||||
static int sctp_cmd_process_init(sctp_cmd_seq_t *commands,
|
static int sctp_cmd_process_init(sctp_cmd_seq_t *commands,
|
||||||
struct sctp_association *asoc,
|
struct sctp_association *asoc,
|
||||||
struct sctp_chunk *chunk,
|
struct sctp_chunk *chunk,
|
||||||
sctp_init_chunk_t *peer_init,
|
struct sctp_init_chunk *peer_init,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
@ -955,9 +955,10 @@ static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds,
|
||||||
switch (err_hdr->cause) {
|
switch (err_hdr->cause) {
|
||||||
case SCTP_ERROR_UNKNOWN_CHUNK:
|
case SCTP_ERROR_UNKNOWN_CHUNK:
|
||||||
{
|
{
|
||||||
sctp_chunkhdr_t *unk_chunk_hdr;
|
struct sctp_chunkhdr *unk_chunk_hdr;
|
||||||
|
|
||||||
unk_chunk_hdr = (sctp_chunkhdr_t *)err_hdr->variable;
|
unk_chunk_hdr = (struct sctp_chunkhdr *)
|
||||||
|
err_hdr->variable;
|
||||||
switch (unk_chunk_hdr->type) {
|
switch (unk_chunk_hdr->type) {
|
||||||
/* ADDIP 4.1 A9) If the peer responds to an ASCONF with
|
/* ADDIP 4.1 A9) If the peer responds to an ASCONF with
|
||||||
* an ERROR chunk reporting that it did not recognized
|
* an ERROR chunk reporting that it did not recognized
|
||||||
|
|
|
@ -235,7 +235,7 @@ sctp_disposition_t sctp_sf_do_4_C(struct net *net,
|
||||||
return sctp_sf_violation_chunk(net, ep, asoc, type, arg, commands);
|
return sctp_sf_violation_chunk(net, ep, asoc, type, arg, commands);
|
||||||
|
|
||||||
/* Make sure that the SHUTDOWN_COMPLETE chunk has a valid length. */
|
/* Make sure that the SHUTDOWN_COMPLETE chunk has a valid length. */
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -345,7 +345,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
* error, but since we don't have an association, we'll
|
* error, but since we don't have an association, we'll
|
||||||
* just discard the packet.
|
* just discard the packet.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_init_chunk_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_init_chunk)))
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
|
|
||||||
/* If the INIT is coming toward a closing socket, we'll send back
|
/* If the INIT is coming toward a closing socket, we'll send back
|
||||||
|
@ -360,7 +360,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
/* Verify the INIT chunk before processing it. */
|
/* Verify the INIT chunk before processing it. */
|
||||||
err_chunk = NULL;
|
err_chunk = NULL;
|
||||||
if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
|
if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
|
||||||
(sctp_init_chunk_t *)chunk->chunk_hdr, chunk,
|
(struct sctp_init_chunk *)chunk->chunk_hdr, chunk,
|
||||||
&err_chunk)) {
|
&err_chunk)) {
|
||||||
/* This chunk contains fatal error. It is to be discarded.
|
/* This chunk contains fatal error. It is to be discarded.
|
||||||
* Send an ABORT, with causes if there is any.
|
* Send an ABORT, with causes if there is any.
|
||||||
|
@ -368,9 +368,9 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
if (err_chunk) {
|
if (err_chunk) {
|
||||||
packet = sctp_abort_pkt_new(net, ep, asoc, arg,
|
packet = sctp_abort_pkt_new(net, ep, asoc, arg,
|
||||||
(__u8 *)(err_chunk->chunk_hdr) +
|
(__u8 *)(err_chunk->chunk_hdr) +
|
||||||
sizeof(sctp_chunkhdr_t),
|
sizeof(struct sctp_chunkhdr),
|
||||||
ntohs(err_chunk->chunk_hdr->length) -
|
ntohs(err_chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
|
|
||||||
sctp_chunk_free(err_chunk);
|
sctp_chunk_free(err_chunk);
|
||||||
|
|
||||||
|
@ -389,10 +389,10 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Grab the INIT header. */
|
/* Grab the INIT header. */
|
||||||
chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data;
|
chunk->subh.init_hdr = (struct sctp_inithdr *)chunk->skb->data;
|
||||||
|
|
||||||
/* Tag the variable length parameters. */
|
/* Tag the variable length parameters. */
|
||||||
chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(sctp_inithdr_t));
|
chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(struct sctp_inithdr));
|
||||||
|
|
||||||
new_asoc = sctp_make_temp_asoc(ep, chunk, GFP_ATOMIC);
|
new_asoc = sctp_make_temp_asoc(ep, chunk, GFP_ATOMIC);
|
||||||
if (!new_asoc)
|
if (!new_asoc)
|
||||||
|
@ -405,7 +405,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
|
|
||||||
/* The call, sctp_process_init(), can fail on memory allocation. */
|
/* The call, sctp_process_init(), can fail on memory allocation. */
|
||||||
if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk),
|
if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk),
|
||||||
(sctp_init_chunk_t *)chunk->chunk_hdr,
|
(struct sctp_init_chunk *)chunk->chunk_hdr,
|
||||||
GFP_ATOMIC))
|
GFP_ATOMIC))
|
||||||
goto nomem_init;
|
goto nomem_init;
|
||||||
|
|
||||||
|
@ -417,7 +417,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
len = 0;
|
len = 0;
|
||||||
if (err_chunk)
|
if (err_chunk)
|
||||||
len = ntohs(err_chunk->chunk_hdr->length) -
|
len = ntohs(err_chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t);
|
sizeof(struct sctp_chunkhdr);
|
||||||
|
|
||||||
repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len);
|
repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len);
|
||||||
if (!repl)
|
if (!repl)
|
||||||
|
@ -437,7 +437,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(struct net *net,
|
||||||
*/
|
*/
|
||||||
unk_param = (sctp_unrecognized_param_t *)
|
unk_param = (sctp_unrecognized_param_t *)
|
||||||
((__u8 *)(err_chunk->chunk_hdr) +
|
((__u8 *)(err_chunk->chunk_hdr) +
|
||||||
sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
/* Replace the cause code with the "Unrecognized parameter"
|
/* Replace the cause code with the "Unrecognized parameter"
|
||||||
* parameter type.
|
* parameter type.
|
||||||
*/
|
*/
|
||||||
|
@ -503,7 +503,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(struct net *net,
|
||||||
sctp_cmd_seq_t *commands)
|
sctp_cmd_seq_t *commands)
|
||||||
{
|
{
|
||||||
struct sctp_chunk *chunk = arg;
|
struct sctp_chunk *chunk = arg;
|
||||||
sctp_init_chunk_t *initchunk;
|
struct sctp_init_chunk *initchunk;
|
||||||
struct sctp_chunk *err_chunk;
|
struct sctp_chunk *err_chunk;
|
||||||
struct sctp_packet *packet;
|
struct sctp_packet *packet;
|
||||||
|
|
||||||
|
@ -522,12 +522,12 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(struct net *net,
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
/* Grab the INIT header. */
|
/* Grab the INIT header. */
|
||||||
chunk->subh.init_hdr = (sctp_inithdr_t *) chunk->skb->data;
|
chunk->subh.init_hdr = (struct sctp_inithdr *)chunk->skb->data;
|
||||||
|
|
||||||
/* Verify the INIT chunk before processing it. */
|
/* Verify the INIT chunk before processing it. */
|
||||||
err_chunk = NULL;
|
err_chunk = NULL;
|
||||||
if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
|
if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
|
||||||
(sctp_init_chunk_t *)chunk->chunk_hdr, chunk,
|
(struct sctp_init_chunk *)chunk->chunk_hdr, chunk,
|
||||||
&err_chunk)) {
|
&err_chunk)) {
|
||||||
|
|
||||||
sctp_error_t error = SCTP_ERROR_NO_RESOURCE;
|
sctp_error_t error = SCTP_ERROR_NO_RESOURCE;
|
||||||
|
@ -540,9 +540,9 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(struct net *net,
|
||||||
if (err_chunk) {
|
if (err_chunk) {
|
||||||
packet = sctp_abort_pkt_new(net, ep, asoc, arg,
|
packet = sctp_abort_pkt_new(net, ep, asoc, arg,
|
||||||
(__u8 *)(err_chunk->chunk_hdr) +
|
(__u8 *)(err_chunk->chunk_hdr) +
|
||||||
sizeof(sctp_chunkhdr_t),
|
sizeof(struct sctp_chunkhdr),
|
||||||
ntohs(err_chunk->chunk_hdr->length) -
|
ntohs(err_chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
|
|
||||||
sctp_chunk_free(err_chunk);
|
sctp_chunk_free(err_chunk);
|
||||||
|
|
||||||
|
@ -576,9 +576,9 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(struct net *net,
|
||||||
/* Tag the variable length parameters. Note that we never
|
/* Tag the variable length parameters. Note that we never
|
||||||
* convert the parameters in an INIT chunk.
|
* convert the parameters in an INIT chunk.
|
||||||
*/
|
*/
|
||||||
chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(sctp_inithdr_t));
|
chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(struct sctp_inithdr));
|
||||||
|
|
||||||
initchunk = (sctp_init_chunk_t *) chunk->chunk_hdr;
|
initchunk = (struct sctp_init_chunk *)chunk->chunk_hdr;
|
||||||
|
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_PEER_INIT,
|
sctp_add_cmd_sf(commands, SCTP_CMD_PEER_INIT,
|
||||||
SCTP_PEER_INIT(initchunk));
|
SCTP_PEER_INIT(initchunk));
|
||||||
|
@ -653,7 +653,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
|
||||||
{
|
{
|
||||||
struct sctp_chunk *chunk = arg;
|
struct sctp_chunk *chunk = arg;
|
||||||
struct sctp_association *new_asoc;
|
struct sctp_association *new_asoc;
|
||||||
sctp_init_chunk_t *peer_init;
|
struct sctp_init_chunk *peer_init;
|
||||||
struct sctp_chunk *repl;
|
struct sctp_chunk *repl;
|
||||||
struct sctp_ulpevent *ev, *ai_ev = NULL;
|
struct sctp_ulpevent *ev, *ai_ev = NULL;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
@ -673,7 +673,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
|
||||||
* chunk header. More detailed verification is done
|
* chunk header. More detailed verification is done
|
||||||
* in sctp_unpack_cookie().
|
* in sctp_unpack_cookie().
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
|
|
||||||
/* If the endpoint is not listening or if the number of associations
|
/* If the endpoint is not listening or if the number of associations
|
||||||
|
@ -691,7 +691,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
|
||||||
chunk->subh.cookie_hdr =
|
chunk->subh.cookie_hdr =
|
||||||
(struct sctp_signed_cookie *)chunk->skb->data;
|
(struct sctp_signed_cookie *)chunk->skb->data;
|
||||||
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t)))
|
sizeof(struct sctp_chunkhdr)))
|
||||||
goto nomem;
|
goto nomem;
|
||||||
|
|
||||||
/* 5.1 D) Upon reception of the COOKIE ECHO chunk, Endpoint
|
/* 5.1 D) Upon reception of the COOKIE ECHO chunk, Endpoint
|
||||||
|
@ -770,9 +770,10 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net,
|
||||||
auth.skb = chunk->auth_chunk;
|
auth.skb = chunk->auth_chunk;
|
||||||
auth.asoc = chunk->asoc;
|
auth.asoc = chunk->asoc;
|
||||||
auth.sctp_hdr = chunk->sctp_hdr;
|
auth.sctp_hdr = chunk->sctp_hdr;
|
||||||
auth.chunk_hdr = skb_push(chunk->auth_chunk,
|
auth.chunk_hdr = (struct sctp_chunkhdr *)
|
||||||
sizeof(sctp_chunkhdr_t));
|
skb_push(chunk->auth_chunk,
|
||||||
skb_pull(chunk->auth_chunk, sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
|
skb_pull(chunk->auth_chunk, sizeof(struct sctp_chunkhdr));
|
||||||
auth.transport = chunk->transport;
|
auth.transport = chunk->transport;
|
||||||
|
|
||||||
ret = sctp_sf_authenticate(net, ep, new_asoc, type, &auth);
|
ret = sctp_sf_authenticate(net, ep, new_asoc, type, &auth);
|
||||||
|
@ -886,7 +887,7 @@ sctp_disposition_t sctp_sf_do_5_1E_ca(struct net *net,
|
||||||
/* Verify that the chunk length for the COOKIE-ACK is OK.
|
/* Verify that the chunk length for the COOKIE-ACK is OK.
|
||||||
* If we don't do this, any bundled chunks may be junked.
|
* If we don't do this, any bundled chunks may be junked.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -1080,7 +1081,7 @@ sctp_disposition_t sctp_sf_beat_8_3(struct net *net,
|
||||||
void *arg,
|
void *arg,
|
||||||
sctp_cmd_seq_t *commands)
|
sctp_cmd_seq_t *commands)
|
||||||
{
|
{
|
||||||
sctp_paramhdr_t *param_hdr;
|
struct sctp_paramhdr *param_hdr;
|
||||||
struct sctp_chunk *chunk = arg;
|
struct sctp_chunk *chunk = arg;
|
||||||
struct sctp_chunk *reply;
|
struct sctp_chunk *reply;
|
||||||
size_t paylen = 0;
|
size_t paylen = 0;
|
||||||
|
@ -1097,9 +1098,9 @@ sctp_disposition_t sctp_sf_beat_8_3(struct net *net,
|
||||||
* respond with a HEARTBEAT ACK that contains the Heartbeat
|
* respond with a HEARTBEAT ACK that contains the Heartbeat
|
||||||
* Information field copied from the received HEARTBEAT chunk.
|
* Information field copied from the received HEARTBEAT chunk.
|
||||||
*/
|
*/
|
||||||
chunk->subh.hb_hdr = (sctp_heartbeathdr_t *) chunk->skb->data;
|
chunk->subh.hb_hdr = (sctp_heartbeathdr_t *)chunk->skb->data;
|
||||||
param_hdr = (sctp_paramhdr_t *) chunk->subh.hb_hdr;
|
param_hdr = (struct sctp_paramhdr *)chunk->subh.hb_hdr;
|
||||||
paylen = ntohs(chunk->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
|
paylen = ntohs(chunk->chunk_hdr->length) - sizeof(struct sctp_chunkhdr);
|
||||||
|
|
||||||
if (ntohs(param_hdr->length) > paylen)
|
if (ntohs(param_hdr->length) > paylen)
|
||||||
return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
|
||||||
|
@ -1164,7 +1165,7 @@ sctp_disposition_t sctp_sf_backbeat_8_3(struct net *net,
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
|
|
||||||
/* Make sure that the HEARTBEAT-ACK chunk has a valid length. */
|
/* Make sure that the HEARTBEAT-ACK chunk has a valid length. */
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t) +
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr) +
|
||||||
sizeof(sctp_sender_hb_info_t)))
|
sizeof(sctp_sender_hb_info_t)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
@ -1449,19 +1450,19 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
|
||||||
* In this case, we generate a protocol violation since we have
|
* In this case, we generate a protocol violation since we have
|
||||||
* an association established.
|
* an association established.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_init_chunk_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_init_chunk)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
/* Grab the INIT header. */
|
/* Grab the INIT header. */
|
||||||
chunk->subh.init_hdr = (sctp_inithdr_t *) chunk->skb->data;
|
chunk->subh.init_hdr = (struct sctp_inithdr *)chunk->skb->data;
|
||||||
|
|
||||||
/* Tag the variable length parameters. */
|
/* Tag the variable length parameters. */
|
||||||
chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(sctp_inithdr_t));
|
chunk->param_hdr.v = skb_pull(chunk->skb, sizeof(struct sctp_inithdr));
|
||||||
|
|
||||||
/* Verify the INIT chunk before processing it. */
|
/* Verify the INIT chunk before processing it. */
|
||||||
err_chunk = NULL;
|
err_chunk = NULL;
|
||||||
if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
|
if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
|
||||||
(sctp_init_chunk_t *)chunk->chunk_hdr, chunk,
|
(struct sctp_init_chunk *)chunk->chunk_hdr, chunk,
|
||||||
&err_chunk)) {
|
&err_chunk)) {
|
||||||
/* This chunk contains fatal error. It is to be discarded.
|
/* This chunk contains fatal error. It is to be discarded.
|
||||||
* Send an ABORT, with causes if there is any.
|
* Send an ABORT, with causes if there is any.
|
||||||
|
@ -1469,9 +1470,9 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
|
||||||
if (err_chunk) {
|
if (err_chunk) {
|
||||||
packet = sctp_abort_pkt_new(net, ep, asoc, arg,
|
packet = sctp_abort_pkt_new(net, ep, asoc, arg,
|
||||||
(__u8 *)(err_chunk->chunk_hdr) +
|
(__u8 *)(err_chunk->chunk_hdr) +
|
||||||
sizeof(sctp_chunkhdr_t),
|
sizeof(struct sctp_chunkhdr),
|
||||||
ntohs(err_chunk->chunk_hdr->length) -
|
ntohs(err_chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
|
|
||||||
if (packet) {
|
if (packet) {
|
||||||
sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
|
sctp_add_cmd_sf(commands, SCTP_CMD_SEND_PKT,
|
||||||
|
@ -1508,7 +1509,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
|
||||||
* place (local tie-tag and per tie-tag) within the state cookie.
|
* place (local tie-tag and per tie-tag) within the state cookie.
|
||||||
*/
|
*/
|
||||||
if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk),
|
if (!sctp_process_init(new_asoc, chunk, sctp_source(chunk),
|
||||||
(sctp_init_chunk_t *)chunk->chunk_hdr,
|
(struct sctp_init_chunk *)chunk->chunk_hdr,
|
||||||
GFP_ATOMIC))
|
GFP_ATOMIC))
|
||||||
goto nomem;
|
goto nomem;
|
||||||
|
|
||||||
|
@ -1535,7 +1536,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
|
||||||
len = 0;
|
len = 0;
|
||||||
if (err_chunk) {
|
if (err_chunk) {
|
||||||
len = ntohs(err_chunk->chunk_hdr->length) -
|
len = ntohs(err_chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t);
|
sizeof(struct sctp_chunkhdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len);
|
repl = sctp_make_init_ack(new_asoc, chunk, GFP_ATOMIC, len);
|
||||||
|
@ -1556,7 +1557,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
|
||||||
*/
|
*/
|
||||||
unk_param = (sctp_unrecognized_param_t *)
|
unk_param = (sctp_unrecognized_param_t *)
|
||||||
((__u8 *)(err_chunk->chunk_hdr) +
|
((__u8 *)(err_chunk->chunk_hdr) +
|
||||||
sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
/* Replace the cause code with the "Unrecognized parameter"
|
/* Replace the cause code with the "Unrecognized parameter"
|
||||||
* parameter type.
|
* parameter type.
|
||||||
*/
|
*/
|
||||||
|
@ -1729,7 +1730,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(struct net *net,
|
||||||
sctp_cmd_seq_t *commands,
|
sctp_cmd_seq_t *commands,
|
||||||
struct sctp_association *new_asoc)
|
struct sctp_association *new_asoc)
|
||||||
{
|
{
|
||||||
sctp_init_chunk_t *peer_init;
|
struct sctp_init_chunk *peer_init;
|
||||||
struct sctp_ulpevent *ev;
|
struct sctp_ulpevent *ev;
|
||||||
struct sctp_chunk *repl;
|
struct sctp_chunk *repl;
|
||||||
struct sctp_chunk *err;
|
struct sctp_chunk *err;
|
||||||
|
@ -1844,7 +1845,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_b(struct net *net,
|
||||||
sctp_cmd_seq_t *commands,
|
sctp_cmd_seq_t *commands,
|
||||||
struct sctp_association *new_asoc)
|
struct sctp_association *new_asoc)
|
||||||
{
|
{
|
||||||
sctp_init_chunk_t *peer_init;
|
struct sctp_init_chunk *peer_init;
|
||||||
struct sctp_chunk *repl;
|
struct sctp_chunk *repl;
|
||||||
|
|
||||||
/* new_asoc is a brand-new association, so these are not yet
|
/* new_asoc is a brand-new association, so these are not yet
|
||||||
|
@ -2044,7 +2045,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net,
|
||||||
* enough for the chunk header. Cookie length verification is
|
* enough for the chunk header. Cookie length verification is
|
||||||
* done later.
|
* done later.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -2053,7 +2054,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(struct net *net,
|
||||||
*/
|
*/
|
||||||
chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
|
chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
|
||||||
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t)))
|
sizeof(struct sctp_chunkhdr)))
|
||||||
goto nomem;
|
goto nomem;
|
||||||
|
|
||||||
/* In RFC 2960 5.2.4 3, if both Verification Tags in the State Cookie
|
/* In RFC 2960 5.2.4 3, if both Verification Tags in the State Cookie
|
||||||
|
@ -2806,7 +2807,7 @@ sctp_disposition_t sctp_sf_do_9_2_reshutack(struct net *net,
|
||||||
struct sctp_chunk *reply;
|
struct sctp_chunk *reply;
|
||||||
|
|
||||||
/* Make sure that the chunk has a valid length */
|
/* Make sure that the chunk has a valid length */
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -2989,7 +2990,7 @@ sctp_disposition_t sctp_sf_eat_data_6_2(struct net *net,
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_data_chunk)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -3009,7 +3010,8 @@ sctp_disposition_t sctp_sf_eat_data_6_2(struct net *net,
|
||||||
return SCTP_DISPOSITION_ABORT;
|
return SCTP_DISPOSITION_ABORT;
|
||||||
case SCTP_IERROR_PROTO_VIOLATION:
|
case SCTP_IERROR_PROTO_VIOLATION:
|
||||||
return sctp_sf_abort_violation(net, ep, asoc, chunk, commands,
|
return sctp_sf_abort_violation(net, ep, asoc, chunk, commands,
|
||||||
(u8 *)chunk->subh.data_hdr, sizeof(sctp_datahdr_t));
|
(u8 *)chunk->subh.data_hdr,
|
||||||
|
sizeof(struct sctp_datahdr));
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
@ -3107,7 +3109,7 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(struct net *net,
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_data_chunk)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -3123,7 +3125,8 @@ sctp_disposition_t sctp_sf_eat_data_fast_4_4(struct net *net,
|
||||||
return SCTP_DISPOSITION_ABORT;
|
return SCTP_DISPOSITION_ABORT;
|
||||||
case SCTP_IERROR_PROTO_VIOLATION:
|
case SCTP_IERROR_PROTO_VIOLATION:
|
||||||
return sctp_sf_abort_violation(net, ep, asoc, chunk, commands,
|
return sctp_sf_abort_violation(net, ep, asoc, chunk, commands,
|
||||||
(u8 *)chunk->subh.data_hdr, sizeof(sctp_datahdr_t));
|
(u8 *)chunk->subh.data_hdr,
|
||||||
|
sizeof(struct sctp_datahdr));
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
@ -3358,7 +3361,7 @@ sctp_disposition_t sctp_sf_do_9_2_final(struct net *net,
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
|
|
||||||
/* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
|
/* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
/* 10.2 H) SHUTDOWN COMPLETE notification
|
/* 10.2 H) SHUTDOWN COMPLETE notification
|
||||||
|
@ -3435,7 +3438,7 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
||||||
{
|
{
|
||||||
struct sctp_chunk *chunk = arg;
|
struct sctp_chunk *chunk = arg;
|
||||||
struct sk_buff *skb = chunk->skb;
|
struct sk_buff *skb = chunk->skb;
|
||||||
sctp_chunkhdr_t *ch;
|
struct sctp_chunkhdr *ch;
|
||||||
sctp_errhdr_t *err;
|
sctp_errhdr_t *err;
|
||||||
__u8 *ch_end;
|
__u8 *ch_end;
|
||||||
int ootb_shut_ack = 0;
|
int ootb_shut_ack = 0;
|
||||||
|
@ -3443,10 +3446,10 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
||||||
|
|
||||||
SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
|
SCTP_INC_STATS(net, SCTP_MIB_OUTOFBLUES);
|
||||||
|
|
||||||
ch = (sctp_chunkhdr_t *) chunk->chunk_hdr;
|
ch = (struct sctp_chunkhdr *)chunk->chunk_hdr;
|
||||||
do {
|
do {
|
||||||
/* Report violation if the chunk is less then minimal */
|
/* Report violation if the chunk is less then minimal */
|
||||||
if (ntohs(ch->length) < sizeof(sctp_chunkhdr_t))
|
if (ntohs(ch->length) < sizeof(*ch))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -3487,7 +3490,7 @@ sctp_disposition_t sctp_sf_ootb(struct net *net,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ch = (sctp_chunkhdr_t *) ch_end;
|
ch = (struct sctp_chunkhdr *)ch_end;
|
||||||
} while (ch_end < skb_tail_pointer(skb));
|
} while (ch_end < skb_tail_pointer(skb));
|
||||||
|
|
||||||
if (ootb_shut_ack)
|
if (ootb_shut_ack)
|
||||||
|
@ -3560,7 +3563,7 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(struct net *net,
|
||||||
/* If the chunk length is invalid, we don't want to process
|
/* If the chunk length is invalid, we don't want to process
|
||||||
* the reset of the packet.
|
* the reset of the packet.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
|
||||||
|
|
||||||
/* We need to discard the rest of the packet to prevent
|
/* We need to discard the rest of the packet to prevent
|
||||||
|
@ -3591,7 +3594,7 @@ sctp_disposition_t sctp_sf_do_8_5_1_E_sa(struct net *net,
|
||||||
struct sctp_chunk *chunk = arg;
|
struct sctp_chunk *chunk = arg;
|
||||||
|
|
||||||
/* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
|
/* Make sure that the SHUTDOWN_ACK chunk has a valid length. */
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -4256,7 +4259,7 @@ sctp_disposition_t sctp_sf_unk_chunk(struct net *net,
|
||||||
{
|
{
|
||||||
struct sctp_chunk *unk_chunk = arg;
|
struct sctp_chunk *unk_chunk = arg;
|
||||||
struct sctp_chunk *err_chunk;
|
struct sctp_chunk *err_chunk;
|
||||||
sctp_chunkhdr_t *hdr;
|
struct sctp_chunkhdr *hdr;
|
||||||
|
|
||||||
pr_debug("%s: processing unknown chunk id:%d\n", __func__, type.chunk);
|
pr_debug("%s: processing unknown chunk id:%d\n", __func__, type.chunk);
|
||||||
|
|
||||||
|
@ -4267,7 +4270,7 @@ sctp_disposition_t sctp_sf_unk_chunk(struct net *net,
|
||||||
* Since we don't know the chunk type, we use a general
|
* Since we don't know the chunk type, we use a general
|
||||||
* chunkhdr structure to make a comparison.
|
* chunkhdr structure to make a comparison.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(unk_chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(unk_chunk, sizeof(*hdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -4340,7 +4343,7 @@ sctp_disposition_t sctp_sf_discard_chunk(struct net *net,
|
||||||
* Since we don't know the chunk type, we use a general
|
* Since we don't know the chunk type, we use a general
|
||||||
* chunkhdr structure to make a comparison.
|
* chunkhdr structure to make a comparison.
|
||||||
*/
|
*/
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -4405,7 +4408,7 @@ sctp_disposition_t sctp_sf_violation(struct net *net,
|
||||||
struct sctp_chunk *chunk = arg;
|
struct sctp_chunk *chunk = arg;
|
||||||
|
|
||||||
/* Make sure that the chunk has a valid length. */
|
/* Make sure that the chunk has a valid length. */
|
||||||
if (!sctp_chunk_length_valid(chunk, sizeof(sctp_chunkhdr_t)))
|
if (!sctp_chunk_length_valid(chunk, sizeof(struct sctp_chunkhdr)))
|
||||||
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
return sctp_sf_violation_chunklen(net, ep, asoc, type, arg,
|
||||||
commands);
|
commands);
|
||||||
|
|
||||||
|
@ -6121,9 +6124,9 @@ static struct sctp_packet *sctp_ootb_pkt_new(struct net *net,
|
||||||
switch (chunk->chunk_hdr->type) {
|
switch (chunk->chunk_hdr->type) {
|
||||||
case SCTP_CID_INIT:
|
case SCTP_CID_INIT:
|
||||||
{
|
{
|
||||||
sctp_init_chunk_t *init;
|
struct sctp_init_chunk *init;
|
||||||
|
|
||||||
init = (sctp_init_chunk_t *)chunk->chunk_hdr;
|
init = (struct sctp_init_chunk *)chunk->chunk_hdr;
|
||||||
vtag = ntohl(init->init_hdr.init_tag);
|
vtag = ntohl(init->init_hdr.init_tag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -6196,7 +6199,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
|
||||||
struct sctp_chunk *chunk,
|
struct sctp_chunk *chunk,
|
||||||
sctp_cmd_seq_t *commands)
|
sctp_cmd_seq_t *commands)
|
||||||
{
|
{
|
||||||
sctp_datahdr_t *data_hdr;
|
struct sctp_datahdr *data_hdr;
|
||||||
struct sctp_chunk *err;
|
struct sctp_chunk *err;
|
||||||
size_t datalen;
|
size_t datalen;
|
||||||
sctp_verb_t deliver;
|
sctp_verb_t deliver;
|
||||||
|
@ -6209,8 +6212,9 @@ static int sctp_eat_data(const struct sctp_association *asoc,
|
||||||
u16 sid;
|
u16 sid;
|
||||||
u8 ordered = 0;
|
u8 ordered = 0;
|
||||||
|
|
||||||
data_hdr = chunk->subh.data_hdr = (sctp_datahdr_t *)chunk->skb->data;
|
data_hdr = (struct sctp_datahdr *)chunk->skb->data;
|
||||||
skb_pull(chunk->skb, sizeof(sctp_datahdr_t));
|
chunk->subh.data_hdr = data_hdr;
|
||||||
|
skb_pull(chunk->skb, sizeof(*data_hdr));
|
||||||
|
|
||||||
tsn = ntohl(data_hdr->tsn);
|
tsn = ntohl(data_hdr->tsn);
|
||||||
pr_debug("%s: TSN 0x%x\n", __func__, tsn);
|
pr_debug("%s: TSN 0x%x\n", __func__, tsn);
|
||||||
|
@ -6258,7 +6262,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
|
||||||
* Actually, allow a little bit of overflow (up to a MTU).
|
* Actually, allow a little bit of overflow (up to a MTU).
|
||||||
*/
|
*/
|
||||||
datalen = ntohs(chunk->chunk_hdr->length);
|
datalen = ntohs(chunk->chunk_hdr->length);
|
||||||
datalen -= sizeof(sctp_data_chunk_t);
|
datalen -= sizeof(struct sctp_data_chunk);
|
||||||
|
|
||||||
deliver = SCTP_CMD_CHUNK_ULP;
|
deliver = SCTP_CMD_CHUNK_ULP;
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ static const sctp_sm_table_entry_t
|
||||||
timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];
|
timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][SCTP_STATE_NUM_STATES];
|
||||||
|
|
||||||
static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
|
static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
|
||||||
sctp_cid_t cid,
|
enum sctp_cid cid,
|
||||||
sctp_state_t state);
|
sctp_state_t state);
|
||||||
|
|
||||||
|
|
||||||
|
@ -968,7 +968,7 @@ static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][S
|
||||||
};
|
};
|
||||||
|
|
||||||
static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
|
static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(struct net *net,
|
||||||
sctp_cid_t cid,
|
enum sctp_cid cid,
|
||||||
sctp_state_t state)
|
sctp_state_t state)
|
||||||
{
|
{
|
||||||
if (state > SCTP_STATE_MAX)
|
if (state > SCTP_STATE_MAX)
|
||||||
|
|
|
@ -6033,7 +6033,8 @@ static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
|
||||||
return -EACCES;
|
return -EACCES;
|
||||||
|
|
||||||
hmacs = ep->auth_hmacs_list;
|
hmacs = ep->auth_hmacs_list;
|
||||||
data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t);
|
data_len = ntohs(hmacs->param_hdr.length) -
|
||||||
|
sizeof(struct sctp_paramhdr);
|
||||||
|
|
||||||
if (len < sizeof(struct sctp_hmacalgo) + data_len)
|
if (len < sizeof(struct sctp_hmacalgo) + data_len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -6117,7 +6118,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
|
||||||
goto num;
|
goto num;
|
||||||
|
|
||||||
/* See if the user provided enough room for all the data */
|
/* See if the user provided enough room for all the data */
|
||||||
num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
|
num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
|
||||||
if (len < num_chunks)
|
if (len < num_chunks)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -6165,7 +6166,7 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
|
||||||
if (!ch)
|
if (!ch)
|
||||||
goto num;
|
goto num;
|
||||||
|
|
||||||
num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t);
|
num_chunks = ntohs(ch->param_hdr.length) - sizeof(struct sctp_paramhdr);
|
||||||
if (len < sizeof(struct sctp_authchunks) + num_chunks)
|
if (len < sizeof(struct sctp_authchunks) + num_chunks)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
|
@ -304,7 +304,7 @@ out:
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static sctp_paramhdr_t *sctp_chunk_lookup_strreset_param(
|
static struct sctp_paramhdr *sctp_chunk_lookup_strreset_param(
|
||||||
struct sctp_association *asoc, __u32 resp_seq,
|
struct sctp_association *asoc, __u32 resp_seq,
|
||||||
__be16 type)
|
__be16 type)
|
||||||
{
|
{
|
||||||
|
@ -749,7 +749,7 @@ struct sctp_chunk *sctp_process_strreset_resp(
|
||||||
struct sctp_strreset_resp *resp = param.v;
|
struct sctp_strreset_resp *resp = param.v;
|
||||||
struct sctp_transport *t;
|
struct sctp_transport *t;
|
||||||
__u16 i, nums, flags = 0;
|
__u16 i, nums, flags = 0;
|
||||||
sctp_paramhdr_t *req;
|
struct sctp_paramhdr *req;
|
||||||
__u32 result;
|
__u32 result;
|
||||||
|
|
||||||
req = sctp_chunk_lookup_strreset_param(asoc, resp->response_seq, 0);
|
req = sctp_chunk_lookup_strreset_param(asoc, resp->response_seq, 0);
|
||||||
|
|
|
@ -158,7 +158,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_assoc_change(
|
||||||
/* Trim the buffer to the right length. */
|
/* Trim the buffer to the right length. */
|
||||||
skb_trim(skb, sizeof(struct sctp_assoc_change) +
|
skb_trim(skb, sizeof(struct sctp_assoc_change) +
|
||||||
ntohs(chunk->chunk_hdr->length) -
|
ntohs(chunk->chunk_hdr->length) -
|
||||||
sizeof(sctp_chunkhdr_t));
|
sizeof(struct sctp_chunkhdr));
|
||||||
} else {
|
} else {
|
||||||
event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change),
|
event = sctp_ulpevent_new(sizeof(struct sctp_assoc_change),
|
||||||
MSG_NOTIFICATION, gfp);
|
MSG_NOTIFICATION, gfp);
|
||||||
|
|
|
@ -1090,7 +1090,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
|
||||||
|
|
||||||
if (chunk) {
|
if (chunk) {
|
||||||
needed = ntohs(chunk->chunk_hdr->length);
|
needed = ntohs(chunk->chunk_hdr->length);
|
||||||
needed -= sizeof(sctp_data_chunk_t);
|
needed -= sizeof(struct sctp_data_chunk);
|
||||||
} else
|
} else
|
||||||
needed = SCTP_DEFAULT_MAXWINDOW;
|
needed = SCTP_DEFAULT_MAXWINDOW;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue