#ifndef _NETINET_SCTP_H
#define _NETINET_SCTP_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
typedef int sctp_assoc_t;
typedef int32_t sctp_assoc32_t;
#define SCTP_RTOINFO 1
#define SCTP_ASSOCINFO 2
#define SCTP_INITMSG 3
#define SCTP_NODELAY 4
#define SCTP_AUTOCLOSE 5
#define SCTP_SET_PEER_PRIMARY_ADDR 6
#define SCTP_PRIMARY_ADDR 7
#define SCTP_ADAPTATION_LAYER 8
#define SCTP_DISABLE_FRAGMENTS 9
#define SCTP_PEER_ADDR_PARAMS 10
#define SCTP_DEFAULT_SEND_PARAM 11
#define SCTP_EVENTS 12
#define SCTP_I_WANT_MAPPED_V4_ADDR 13
#define SCTP_MAXSEG 14
#define SCTP_STATUS 15
#define SCTP_GET_PEER_ADDR_INFO 16
#define SCTP_GET_NLADDRS 17
#define SCTP_GET_LADDRS 18
#define SCTP_GET_NPADDRS 19
#define SCTP_GET_PADDRS 20
#define SCTP_ADD_ADDR 21
#define SCTP_REM_ADDR 22
#define SCTP_PRSCTP 23
#define SCTP_GET_ASSOC_STATS 24
#define SCTP_SNDRCV 0x100
#define SCTP_INIT 0x101
#define SCTP_ASSOC_CHANGE 1
#define SCTP_PEER_ADDR_CHANGE 2
#define SCTP_REMOTE_ERROR 3
#define SCTP_SEND_FAILED 4
#define SCTP_SHUTDOWN_EVENT 5
#define SCTP_ADAPTATION_INDICATION 6
#define SCTP_PARTIAL_DELIVERY_EVENT 7
struct sctp_initmsg {
uint16_t sinit_num_ostreams;
uint16_t sinit_max_instreams;
uint16_t sinit_max_attempts;
uint16_t sinit_max_init_timeo;
};
struct sctp_sndrcvinfo {
uint16_t sinfo_stream;
uint16_t sinfo_ssn;
uint16_t sinfo_flags;
uint32_t sinfo_ppid;
uint32_t sinfo_context;
uint32_t sinfo_timetolive;
uint32_t sinfo_tsn;
uint32_t sinfo_cumtsn;
sctp_assoc_t sinfo_assoc_id;
};
#define MSG_UNORDERED 0x01
#define MSG_ABORT 0x02
#define MSG_EOF 0x04
#define MSG_ADDR_OVER 0x08
#define MSG_PR_SCTP 0x10
struct sctp_event_subscribe {
uint8_t sctp_data_io_event;
uint8_t sctp_association_event;
uint8_t sctp_address_event;
uint8_t sctp_send_failure_event;
uint8_t sctp_peer_error_event;
uint8_t sctp_shutdown_event;
uint8_t sctp_partial_delivery_event;
uint8_t sctp_adaptation_layer_event;
};
#define SCTP_COMM_UP 0
#define SCTP_COMM_LOST 1
#define SCTP_RESTART 2
#define SCTP_SHUTDOWN_COMP 3
#define SCTP_CANT_STR_ASSOC 4
#define SCTP_PRSCTP_CAPABLE 0x01
struct sctp_assoc_change {
uint16_t sac_type;
uint16_t sac_flags;
uint32_t sac_length;
uint16_t sac_state;
uint16_t sac_error;
uint16_t sac_outbound_streams;
uint16_t sac_inbound_streams;
sctp_assoc_t sac_assoc_id;
};
struct sctp_remote_error {
uint16_t sre_type;
uint16_t sre_flags;
uint32_t sre_length;
uint16_t sre_error;
sctp_assoc_t sre_assoc_id;
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
#define SCTP_ADDR_AVAILABLE 0
#define SCTP_ADDR_UNREACHABLE 1
#define SCTP_ADDR_REMOVED 2
#define SCTP_ADDR_ADDED 3
#define SCTP_ADDR_MADE_PRIM 4
struct sctp_paddr_change {
uint16_t spc_type;
uint16_t spc_flags;
uint32_t spc_length;
struct sockaddr_storage spc_aaddr;
int spc_state;
int spc_error;
sctp_assoc_t spc_assoc_id;
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#define SCTP_DATA_UNSENT 1
#define SCTP_DATA_SENT 2
struct sctp_send_failed {
uint16_t ssf_type;
uint16_t ssf_flags;
uint32_t ssf_length;
uint32_t ssf_error;
struct sctp_sndrcvinfo ssf_info;
sctp_assoc_t ssf_assoc_id;
};
struct sctp_shutdown_event {
uint16_t sse_type;
uint16_t sse_flags;
uint16_t sse_length;
sctp_assoc_t sse_assoc_id;
};
struct sctp_adaptation_event {
uint16_t sai_type;
uint16_t sai_flags;
uint32_t sai_length;
uint32_t sai_adaptation_ind;
sctp_assoc_t sai_assoc_id;
};
#define SCTP_PARTIAL_DELIVERY_ABORTED 1
struct sctp_pdapi_event {
uint16_t pdapi_type;
uint16_t pdapi_flags;
uint32_t pdapi_length;
uint32_t pdapi_indication;
sctp_assoc_t pdapi_assoc_id;
};
union sctp_notification {
struct {
uint16_t sn_type;
uint16_t sn_flags;
uint32_t sn_length;
} sn_header;
struct sctp_assoc_change sn_assoc_change;
struct sctp_paddr_change sn_paddr_change;
struct sctp_remote_error sn_remote_error;
struct sctp_send_failed sn_send_failed;
struct sctp_shutdown_event sn_shutdown_event;
struct sctp_adaptation_event sn_adaptation_event;
struct sctp_pdapi_event sn_pdapi_event;
};
struct sctp_rtoinfo {
sctp_assoc_t srto_assoc_id;
uint32_t srto_initial;
uint32_t srto_max;
uint32_t srto_min;
};
struct sctp_assocparams {
sctp_assoc_t sasoc_assoc_id;
uint16_t sasoc_asocmaxrxt;
uint16_t sasoc_number_peer_destinations;
uint32_t sasoc_peer_rwnd;
uint32_t sasoc_local_rwnd;
uint32_t sasoc_cookie_life;
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
#define SCTP_INACTIVE 1
#define SCTP_ACTIVE 2
struct sctp_paddrinfo {
sctp_assoc_t spinfo_assoc_id;
struct sockaddr_storage spinfo_address;
int32_t spinfo_state;
uint32_t spinfo_cwnd;
uint32_t spinfo_srtt;
uint32_t spinfo_rto;
uint32_t spinfo_mtu;
};
struct sctp_paddrparams {
sctp_assoc_t spp_assoc_id;
struct sockaddr_storage spp_address;
uint32_t spp_hbinterval;
uint16_t spp_pathmaxrxt;
};
struct sctp_setpeerprim {
sctp_assoc_t sspp_assoc_id;
struct sockaddr_storage sspp_addr;
};
struct sctp_setprim {
sctp_assoc_t ssp_assoc_id;
struct sockaddr_storage ssp_addr;
};
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#define SCTPS_IDLE -5
#define SCTPS_BOUND -4
#define SCTPS_LISTEN -3
#define SCTPS_COOKIE_WAIT -2
#define SCTPS_COOKIE_ECHOED -1
#define SCTPS_ESTABLISHED 0
#define SCTPS_SHUTDOWN_PENDING 1
#define SCTPS_SHUTDOWN_SENT 2
#define SCTPS_SHUTDOWN_RECEIVED 3
#define SCTPS_SHUTDOWN_ACK_SENT 4
struct sctp_status {
sctp_assoc_t sstat_assoc_id;
int32_t sstat_state;
uint32_t sstat_rwnd;
uint16_t sstat_unackdata;
uint16_t sstat_penddata;
uint16_t sstat_instrms;
uint16_t sstat_outstrms;
uint32_t sstat_fragmentation_point;
struct sctp_paddrinfo sstat_primary;
};
#define SCTP_CLOSED SCTPS_IDLE
#define SCTP_BOUND SCTPS_BOUND
#define SCTP_LISTEN SCTPS_LISTEN
#define SCTP_COOKIE_WAIT SCTPS_COOKIE_WAIT
#define SCTP_COOKIE_ECHOED SCTPS_COOKIE_ECHOED
#define SCTP_ESTABLISHED SCTPS_ESTABLISHED
#define SCTP_SHUTDOWN_PENDING SCTPS_SHUTDOWN_PENDING
#define SCTP_SHUTDOWN_SENT SCTPS_SHUTDOWN_SENT
#define SCTP_SHUTDOWN_RECEIVED SCTPS_SHUTDOWN_RECEIVED
#define SCTP_SHUTDOWN_ACK_SENT SCTPS_SHUTDOWN_ACK_SENT
struct sctp_setadaptation {
uint32_t ssb_adaptation_ind;
};
typedef struct sctp_assoc_stats {
uint64_t sas_rtxchunks;
uint64_t sas_gapcnt;
uint64_t sas_maxrto;
uint64_t sas_outseqtsns;
uint64_t sas_osacks;
uint64_t sas_isacks;
uint64_t sas_octrlchunks;
uint64_t sas_ictrlchunks;
uint64_t sas_oodchunks;
uint64_t sas_iodchunks;
uint64_t sas_ouodchunks;
uint64_t sas_iuodchunks;
uint64_t sas_idupchunks;
} sctp_assoc_stats_t;
struct sctpopt {
sctp_assoc_t sopt_aid;
int sopt_name;
uint_t sopt_len;
caddr_t sopt_val;
};
#if defined(_SYSCALL32)
struct sctpopt32 {
sctp_assoc32_t sopt_aid;
int32_t sopt_name;
uint32_t sopt_len;
caddr32_t sopt_val;
};
#endif
typedef struct ftsn_entry_s {
uint16_t ftsn_sid;
uint16_t ftsn_ssn;
} ftsn_entry_t;
#define SCTP_BINDX_ADD_ADDR 1
#define SCTP_BINDX_REM_ADDR 2
#if !defined(_KERNEL) || defined(_BOOT)
#ifdef __STDC__
extern int sctp_bindx(int, void *, int, int);
extern void sctp_freeladdrs(void *);
extern void sctp_freepaddrs(void *);
extern int sctp_getladdrs(int, sctp_assoc_t, void **);
extern int sctp_getpaddrs(int, sctp_assoc_t, void **);
extern int sctp_opt_info(int, sctp_assoc_t, int, void *, socklen_t *);
extern int sctp_peeloff(int, sctp_assoc_t);
extern ssize_t sctp_recvmsg(int, void *, size_t, struct sockaddr *,
socklen_t *, struct sctp_sndrcvinfo *, int *msg_flags);
extern ssize_t sctp_send(int, const void *, size_t,
const struct sctp_sndrcvinfo *, int);
extern ssize_t sctp_sendmsg(int, const void *, size_t, const struct sockaddr *,
socklen_t, uint32_t, uint32_t, uint16_t, uint32_t, uint32_t);
#else
extern int sctp_bindx();
extern void sctp_freeladdrs();
extern void sctp_freepaddrs();
extern int sctp_getladdrs();
extern int sctp_getpaddrs();
extern int sctp_opt_info();
extern int sctp_peeloff();
extern ssize_t sctp_recvmsg();
extern ssize_t sctp_send();
extern ssize_t sctp_sendmsg();
#endif
#endif
#define SCTP_ALIGN 4
#define SCTP_UNREC_PARAM_MASK 0xc000
#define SCTP_CONT_PROC_PARAMS 0x8000
#define SCTP_REPORT_THIS_PARAM 0x4000
#define SCTP_DATA_EBIT 0x01
#define SCTP_TBIT 0x01
#define SCTP_DATA_BBIT 0x02
#define SCTP_DATA_UBIT 0x04
#define SCTP_DATA_GET_BBIT(sdc) ((sdc)->sdh_flags & SCTP_DATA_BBIT)
#define SCTP_GET_TBIT(cp) ((cp)->sch_flags & SCTP_TBIT)
#define SCTP_DATA_GET_EBIT(sdc) ((sdc)->sdh_flags & SCTP_DATA_EBIT)
#define SCTP_DATA_GET_UBIT(sdc) ((sdc)->sdh_flags & SCTP_DATA_UBIT)
#define SCTP_DATA_SET_BBIT(sdc) ((sdc)->sdh_flags |= SCTP_DATA_BBIT)
#define SCTP_SET_TBIT(cp) ((cp)->sch_flags |= SCTP_TBIT)
#define SCTP_DATA_SET_EBIT(sdc) ((sdc)->sdh_flags |= SCTP_DATA_EBIT)
#define SCTP_DATA_SET_UBIT(sdc) ((sdc)->sdh_flags |= SCTP_DATA_UBIT)
typedef struct sctp_hdr {
uint16_t sh_sport;
uint16_t sh_dport;
uint32_t sh_verf;
uint32_t sh_chksum;
} sctp_hdr_t;
typedef enum {
CHUNK_DATA,
CHUNK_INIT,
CHUNK_INIT_ACK,
CHUNK_SACK,
CHUNK_HEARTBEAT,
CHUNK_HEARTBEAT_ACK,
CHUNK_ABORT,
CHUNK_SHUTDOWN,
CHUNK_SHUTDOWN_ACK,
CHUNK_ERROR,
CHUNK_COOKIE,
CHUNK_COOKIE_ACK,
CHUNK_ECNE,
CHUNK_CWR,
CHUNK_SHUTDOWN_COMPLETE,
CHUNK_ASCONF_ACK = 128,
CHUNK_FORWARD_TSN = 192,
CHUNK_ASCONF = 193
} sctp_chunk_id_t;
typedef struct sctp_chunk_hdr {
uint8_t sch_id;
uint8_t sch_flags;
uint16_t sch_len;
} sctp_chunk_hdr_t;
typedef struct sctp_init_chunk {
uint32_t sic_inittag;
uint32_t sic_a_rwnd;
uint16_t sic_outstr;
uint16_t sic_instr;
uint32_t sic_inittsn;
} sctp_init_chunk_t;
typedef struct sctp_data_chunk {
uint32_t sdc_tsn;
uint16_t sdc_sid;
uint16_t sdc_ssn;
uint32_t sdc_payload_id;
} sctp_data_chunk_t;
typedef struct sctp_data_hdr {
sctp_chunk_hdr_t sdh_chdr;
sctp_data_chunk_t sdh_data;
#define sdh_id sdh_chdr.sch_id
#define sdh_flags sdh_chdr.sch_flags
#define sdh_len sdh_chdr.sch_len
#define sdh_tsn sdh_data.sdc_tsn
#define sdh_sid sdh_data.sdc_sid
#define sdh_ssn sdh_data.sdc_ssn
#define sdh_payload_id sdh_data.sdc_payload_id
} sctp_data_hdr_t;
typedef struct sctp_sack_chunk {
uint32_t ssc_cumtsn;
uint32_t ssc_a_rwnd;
uint16_t ssc_numfrags;
uint16_t ssc_numdups;
} sctp_sack_chunk_t;
typedef struct sctp_sack_frag {
uint16_t ssf_start;
uint16_t ssf_end;
} sctp_sack_frag_t;
#define PARM_UNKNOWN 0
#define PARM_HBINFO 1
#define PARM_ADDR4 5
#define PARM_ADDR6 6
#define PARM_COOKIE 7
#define PARM_UNRECOGNIZED 8
#define PARM_COOKIE_PRESERVE 9
#define PARM_ADDR_HOST_NAME 11
#define PARM_SUPP_ADDRS 12
#define PARM_ECN 0x8000
#define PARM_ECN_CAPABLE PARM_ECN
#define PARM_FORWARD_TSN 0xc000
#define PARM_ADD_IP 0xc001
#define PARM_DEL_IP 0xc002
#define PARM_ERROR_IND 0xc003
#define PARM_ASCONF_ERROR PARM_ERROR_IND
#define PARM_SET_PRIMARY 0xc004
#define PARM_PRIMARY_ADDR PARM_SET_PRIMARY
#define PARM_SUCCESS 0xc005
#define PARM_ASCONF_SUCCESS PARM_SUCCESS
#define PARM_ADAPT_LAYER_IND 0xc006
#define PARM_ADDR4_LEN 8
#define PARM_ADDR6_LEN 20
typedef struct sctp_parm_hdr {
uint16_t sph_type;
uint16_t sph_len;
} sctp_parm_hdr_t;
typedef struct sctp_bsc {
uint16_t bsc_sid;
uint16_t bsc_pad;
} sctp_bsc_t;
typedef struct sctp_mpc {
uint32_t mpc_num;
uint16_t mpc_param;
uint16_t mpc_pad;
} sctp_mpc_t;
#define SCTP_ERR_UNKNOWN 0
#define SCTP_ERR_BAD_SID 1
#define SCTP_ERR_MISSING_PARM 2
#define SCTP_ERR_STALE_COOKIE 3
#define SCTP_ERR_NO_RESOURCES 4
#define SCTP_ERR_BAD_ADDR 5
#define SCTP_ERR_UNREC_CHUNK 6
#define SCTP_ERR_BAD_MANDPARM 7
#define SCTP_ERR_UNREC_PARM 8
#define SCTP_ERR_NO_USR_DATA 9
#define SCTP_ERR_COOKIE_SHUT 10
#define SCTP_ERR_RESTART_NEW_ADDRS 11
#define SCTP_ERR_USER_ABORT 12
#define SCTP_ERR_DELETE_LASTADDR 256
#define SCTP_ERR_RESOURCE_SHORTAGE 257
#define SCTP_ERR_DELETE_SRCADDR 258
#define SCTP_ERR_AUTH_ERR 260
#define CHUNK_ASCONF 0xc1
#define CHUNK_ASCONF_ACK 0x80
#define SCTP_ERR_DEL_LAST_ADDR 0x0100
#define SCTP_ERR_RES_SHORTAGE 0x0101
#define SCTP_ERR_DEL_SRC_ADDR 0x0102
#define SCTP_ERR_ILLEGAL_ACK 0x0103
#define SCTP_ERR_UNAUTHORIZED 0x0104
typedef struct sctp_addip4 {
sctp_parm_hdr_t sad4_addip_ph;
uint32_t asconf_req_cid;
sctp_parm_hdr_t sad4_addr4_ph;
ipaddr_t sad4_addr;
} sctp_addip4_t;
typedef struct sctp_addip6 {
sctp_parm_hdr_t sad6_addip_ph;
uint32_t asconf_req_cid;
sctp_parm_hdr_t sad6_addr6_ph;
in6_addr_t sad6_addr;
} sctp_addip6_t;
#ifdef __cplusplus
}
#endif
#endif