/* ipsctp.h - IPNET SCTP header file */ /* * Copyright (c) 2007, 2018 Wind River Systems, Inc. * * The right to copy, distribute or otherwise make use of this software * may be licensed only pursuant to the terms of an applicable Wind River * license agreement. No license to Wind River intellectual property rights * is granted herein. All rights not licensed by Wind River are reserved * by Wind River. */ /* modification history -------------------- 01b,21nov18,lan modify the msec_expires of Iptcp_timer structure to 64bit (VXW6-86996) 01a,17nov07,kch Created. */ #ifndef IPSCTP_H #define IPSCTP_H /* **************************************************************************** * 1 DESCRIPTION **************************************************************************** * This header file contains definitions and declarations used for IPSCTP. */ /* **************************************************************************** * 2 CONFIGURATION **************************************************************************** */ #include "ipsctp_config.h" /* **************************************************************************** * 3 INCLUDE FILES **************************************************************************** */ #ifdef IPNET #include #include #endif /* IPNET */ #ifdef IPLITE #include #endif #include #include #ifdef __cplusplus extern "C" { #endif /* **************************************************************************** * 4 DEFINES **************************************************************************** */ #ifndef NULL #define NULL IP_NULL #endif /* * The following HAVE_XXX SCTP defines are not used by IPSCTP implementation. * These defines are for compatibility with Section 9 of the socket draft-15 * only! Refer to the configuration header file for more * information about the supported IPSCTP_USE_XXX preprocessor constants. */ #ifdef IPSCTP_USE_SOCKET #define HAVE_KERNEL_SCTP #endif /* IPSCTP_USE_SOCKET */ #ifdef IPSCTP_USE_PRSCTP #define HAVE_SCTP_PRSCTP #endif /* IPSCTP_USE_PRSCTP */ #ifdef IPSCTP_USE_ADDIP #define HAVE_SCTP_ADDIP #endif /* IPSCTP_USE_ADDIP */ #ifdef IPSCTP_USE_CANSET_PRIMARY #define HAVE_SCTP_CANSET_PRIMARY #endif /* IPSCTP_USE_CANSET_PRIMARY */ #ifdef IPSCTP_USE_MULTIBUF #define HAVE_SCTP_MULTIBUF 1 #else #define HAVE_SCTP_MULTIBUF 0 #endif /* IPSCTP_USE_MULTIBUF */ #ifdef IPSCTP_USE_NOCONNECT #define HAVE_SCTP_NOCONNECT #endif /* IPSCTP_USE_NOCONNECT */ #ifdef IPSCTP_USE_EXT_RCVINFO #define HAVE_SCTP_EXT_RCVINFO #endif /* IPSCTP_USE_EXT_RCVINFO */ /* Stack specific types */ #ifdef IPNET #define Ipsctp_socket Ipnet_socket #define Ipsctp_netif Ipnet_netif #define Ipsctp_timeout Ipnet_timeout #define Ipsctp_timeout_handler Ipnet_timeout_handler #define IPSCTP_STACK_CONST(x) IPNET_ ## x #elif defined(IPLITE) #define Ipsctp_socket Iplite_socket #define Ipsctp_netif Iplite_netif #define Ipsctp_timeout Iplite_timeout #define Ipsctp_timeout_handler Iplite_timeout_handler #define IPSCTP_STACK_CONST(x) IPLITE_ ## x #else #error "IPNET or IPLITE must be defined" #endif /* Default/minimum SCTP header is 12(SCTP Common Header) octets long */ #define IPSCTP_SIZE_SCTP_HDR (sizeof(Ipsctp_sctp_hdr)) /* Secret information for secret_key */ #define IPSCTP_SECRETS_NUM (2) /* How many secrets I keep */ #define IPSCTP_SECRET_SIZE (32) /* number of octets in a 256 bits */ #define IPSCTP_NUMBER_OF_SECRETS (8) /* or 8 * 4 = 32 octets */ #define IPSCTP_SIZE_INST (sizeof(Ipsctp_instance)) #define IPSCTP_SIZE_SOCK_DATA (IPSCTP_SIZE_INST) /* Possible socket events */ #define IPSCTP_NOTIFY_EVENT_PATH_MTU 1 /* The path MTU has changed */ #define IPSCTP_NOTIFY_EVENT_KICKSTART 2 /* Try 'kickstart' this particular socket */ /* inst_flags in Ipsctp_instance */ #define IPSCTP_SOCKET_TCP (1u << 1) #define IPSCTP_SOCKET_UDP (1u << 2) #define IPSCTP_SOCKET_CLOSED (1u << 3) #define IPSCTP_SOCKET_ACCEPTING (1u << 4) #define IPSCTP_SOCKET_LISTENING (1u << 5) #define IPSCTP_SOCKET_CONNECTED (1u << 6) #define IPSCTP_SOCKET_BOUNDALL (1u << 7) #define IPSCTP_SOCKET_BOUND_V6 (1u << 8) #define IPSCTP_SOCKET_BOUND_V4 (1u << 9) #define IPSCTP_SOCKET_CONNABORTED (1u << 10) #define IPSCTP_SOCKET_KCLOSE_PENDING (1u << 11) #define IPSCTP_SOCKET_FLAG_USER_REF (1u << 12) #define IPSCTP_SOCKET_FLAG_LINGER (1u << 13) /* linger timer is running */ #define IPSCTP_SOCKET_KCLOSED (1u << 14) #define IPSCTP_SOCKET_FLAG_AUTOCLOSE (1u << 15) /* auto-close timer is running */ #define IPSCTP_SOCKET_FLAG_SENDALL (1u << 16) /* send-all timer is running */ #define IPSCTP_SOCKET_FLAG_PEELOFF (1u << 17) /* peel-off socket * NOTE : NOW not used, used if peeloff socket * create with IP_SOCK_SEQPACKET */ #define ipsctp_style(sock, style) \ IP_BIT_ISSET(sock->sctp_inst->inst_flags, IPSCTP_SOCKET_##style) /* **************************************************************************** * 5 TYPES **************************************************************************** */ /* Timeout type */ typedef enum Ipsctp_timo_enum { IPSCTP_TIMO_NONE = 0, /* Placeholder that means: do not add a timer */ IPSCTP_TIMO_T1 = 1, /* init timer */ IPSCTP_TIMO_T2 = 2, /* shutdown timer */ IPSCTP_TIMO_T3 = 3, /* retransmission timer */ IPSCTP_TIMO_T5 = 4, /* shutdown guard timer */ IPSCTP_TIMO_DACK = 5, /* delay ack timer */ #ifdef IPSCTP_FAST_RETRANSMITE IPSCTP_TIMO_FR = 6, /* fr timer */ #endif IPSCTP_TIMO_COOKIE = 7, /* cookie timer */ IPSCTP_TIMO_HB = 8, /* heartbeat timer */ IPSCTP_TIMO_SECRET = 9, /* secret change timer */ IPSCTP_TIMO_LINGER = 10, /* linger timer */ IPSCTP_TIMO_AUTOCLOSE = 11, /* autoclose timer */ IPSCTP_TIMO_SENDALL = 12, /* send all timer */ IPSCTP_TIMO_MAX /* invalid value */ } Ipsctp_timo; struct Ipsctp_instance; struct Ipsctp_tcb_lookup_key_struct; struct Ipsctp_tcb_struct; struct Ipsctp_transport_struct; typedef struct Ipsctp_timer_struct { /* * Required so the timer can be part of the 'timers' list in the * TCB structure. */ Ipcom_list list; /* * Absolute time when this timer expires. */ Ip_u64 msec_expires; /* * Handler to run if/when the timer expires. */ void (*action)(IP_CONST void *); struct Ipsctp_instance_struct *inst; struct Ipsctp_tcb_struct *tcb; struct Ipsctp_transport_struct *tp; struct Ipsctp_vtag_timewait_struct *timewait; Ipsctp_timo type; } Ipsctp_timer; typedef struct Ipsctp_netstat_tcbinfo { union Ip_sockaddr_union *raddr; Ip_u32 raddr_count; int state; } Ipsctp_netstat_tcbinfo; typedef struct Ipsctp_netstatinfo_struct { Ipsctp_netstat_tcbinfo *tcb; Ip_u32 tcb_count; union Ip_sockaddr_union *laddr; Ip_u32 laddr_count; } Ipsctp_netstatinfo; typedef struct Ipsctp_sendall_pkt_struct { Ipcom_list next; struct Ipsctp_sndrcvinfo sndrcvinfo; Ipcom_pkt *pkt; } Ipsctp_sendall_pkt; /* *=========================================================================== * IPSCTP instance parameters *=========================================================================== * The members of this structure are defined per recommendation in Section * 13.1 of RFC4960. The members represent IPSCTP instance parameters, which * are commonly used by all associations of the instance. */ typedef struct Ipsctp_instance_struct { /* Common information */ Ipsctp_socket *sock; /* Points to the socket this instance is bound to */ Ipcom_list assoc_list; /* list of current associations; list contains mappings to data consumers per association. */ #ifndef IPCOM_FORWARDER_NAE Ipcom_list active; /* List of active Instance:s */ #endif Ipcom_spinlock tcb_lock; /* protect all TCBs' pmtu, mss */ Ip_u16 lport; /* locally bound IPSCTP port number, in network order */ Ipcom_list laddr_list; /* list of addresses bound by this * instance. Passed to peer(s) in INIT * and/or INIT ACK chunks. * NOTE : address count be include in list */ Ip_u32 inst_flags; Ipcom_atomic_t wait_readable; Ip_u32 recv_lowat; /* The low water mark for receiving */ Ip_u32 send_lowat; /* The low water mark for sending */ Ip_u32 linger_time; /* Time this socket will linger after close */ Ipsctp_timer linger_timer; /* linger timer */ Ip_u32 shut_guard_time; /* time of shutdown guard timer */ Ip_u32 secret_time; /* time of secret timer */ /* Secret information */ Ip_u32 secret_key[IPSCTP_SECRETS_NUM][IPSCTP_NUMBER_OF_SECRETS]; /* secret key used by this endpoint to compute the MAC. */ Ip_u8 current_secret_number; /* current using secret number */ Ip_u8 last_secret_number; /* last used secret number */ struct Ip_timeval secret_change_time; /* secret change time */ Ipsctp_timer secret_timer; /* secret timer */ Ipsctp_timer sendall_timer; /* sendall timer, here we use per instance, not a global, because each has it own send buffer, we do not want one block other instance. */ Ipcom_list sendall_pkt; /* sendall timer packet list */ Ip_u32 congestion_control_module; /* Default congestion control module */ Ip_u32 autoclose_time; /* autoclose time, im MSEC */ Ip_u32 max_burst; /* maximum burst of packets * that can be emitted by this association */ Ip_u32 frag_point; /* size to do fragments */ Ip_u32 pd_point; /* partial delivery point, Get or Set by * option SCTP_PARTIAL_DELIVERY_POINT */ Ip_u32 context; /* Set or get by SCTP_CONTEXT */ Ipsctp_sctp_sack_info sack_info; /*to control the sack */ /* Socket Options when using ipcom_setsockopt(ipnet2\src\ipnet_sockopt.c) */ struct Ipsctp_initmsg initmsg; /* Initiation Message option (sctp_initmsg) */ Ipsctp_sctp_rtoinfo rtoinfo; /* Retransmission Timeout Parameters option(sctp_rtoinfo) */ Ipsctp_sctp_paddrparams paddrparam; /* Peer Address Parameters option (sctp_paddrparams) */ Ip_u32 feature_flags; /* Notification Interest Options (sctp_event_subscribe) */ Ipsctp_sctp_assocparams assocparams; /* Association Parameters option (sctp_assocparams) */ Ipsctp_sctp_sndrcvinfo sndrcvinfo; /* Header Information option (sctp_sndrcvinfo) */ Ipcom_list recv_list; /* All chunks to be read by socket */ /* Socket backlog information */ Ipsctp_socket *parent; /* The listen socket that was used to create this socket */ Ip_u16 backlog_len; /* Maximum number of entries in the backlog */ Ip_u16 backlog_used; /* Number of used entries (pending + done) in the backlog */ int *backlog_pending; /* Connections that are doing the four-way handshake */ int *backlog_done; /* Connections that have finished the four-way handshake */ #ifndef IPSCTP_USE_MULTIBUF Ip_u32 size_on_in_queue; /* chunk bytes in input stream's chunk queue, haven't been delivered to socket receive buffer.*/ Ip_u32 cnt_on_in_queue; /* chunk count in input stream's chunk queue, haven't been delivered to socket receive buffer.*/ Ip_u32 recv_chunks_cnt; /* chunks count in receive buffer */ Ip_u32 send_chunks_cnt; /* chunks count in send buffer */ #endif Ip_u32 sws_sender; Ip_u32 sws_receiver; int (*get_tcb_info)(Ipsctp_socket *sock, IP_CONST struct Ip_msghdr *msg, struct Ipsctp_sndrcvinfo *sndrcv, Ip_u32 *pmtu, Ip_u32 *mss, void **tcb_ret); Ipcom_list timers; } Ipsctp_instance; #ifdef IPSCTP_MIB typedef struct Ipsctp_mib_stats_struct { /* Begin: mib in RFC3873 */ Ip_u32 sctp_Curr_Estab; /* Gauge32 */ Ip_u32 sctp_Active_Estabs; Ip_u32 sctp_Passive_Estabs; Ip_u32 sctp_Aborteds; Ip_u32 sctp_Shutdowns; Ip_u32 sctp_OutOfBlues; Ip_u32 sctp_Checksum_Errors; Ip_u64 sctp_Out_Ctrl_Chunks; Ip_u64 sctp_Out_Order_Chunks; Ip_u64 sctp_Out_Unorder_Chunks; Ip_u64 sctp_In_Ctrl_Chunks; Ip_u64 sctp_In_Order_Chunks; Ip_u64 sctp_In_Unorder_Chunks; Ip_u64 sctp_Frag_UsrMsgs; Ip_u64 sctp_Reasm_UsrMsgs; Ip_u64 sctp_Out_SCTP_Packs; Ip_u64 sctp_In_SCTP_Packs; Ip_u32 sctp_Discontinuity_Time; /* End: mib in RFC3873 */ } Ipsctp_mib_stats; typedef struct Ipsctp_params_sturct { Ip_s32 sctpRtoAlgorithm; Ip_u32 sctpRtoMin; Ip_u32 sctpRtoMax; Ip_u32 sctpRtoInitial; Ip_s32 sctpMaxAssocs; Ip_u32 sctpValCookieLife; Ip_u32 sctpMaxInitRetr; }Ipsctp_params; typedef struct Ipsctp_assoc_entry_struct { Ip_u32 sctpAssocId; Ip_u8 sctpAssocRemHostName[256]; Ip_u32 sctpAssocLocalPort; Ip_u32 sctpAssocRemPort; Ip_s32 sctpAssocRemPrimAddrType; Ip_u8 sctpAssocRemPrimAddr[16]; Ip_u32 sctpAssocHeartBeatInterval; Ip_s32 sctpAssocState; Ip_u32 sctpAssocInStreams; Ip_u32 sctpAssocOutStreams; Ip_u32 sctpAssocMaxRetr; Ip_u32 sctpAssocPrimProcess; Ip_u32 sctpAssocT1expireds; Ip_u32 sctpAssocT2expireds; Ip_u32 sctpAssocRtxChunks; Ip_u32 sctpAssocStartTime; Ip_u32 sctpAssocDiscontinuityTime; }Ipsctp_assoc_entry; typedef struct Ipsctp_assoc_local_addr_entry_struct { Ip_s32 sctpAssocLocalAddrType; Ip_u8 sctpAssocLocalAddr[16]; Ip_u32 sctpAssocLocalAddrStartTime; Ip_u32 sctpAssocId; }Ipsctp_assoc_local_addr_entry; typedef struct Ipsctp_assoc_rem_addr_entry_struct { Ip_s32 sctpAssocRemAddrType; Ip_u8 sctpAssocRemAddr[16]; Ip_s32 sctpAssocRemAddrActive; Ip_s32 sctpAssocRemAddrHBActive; Ip_u32 sctpAssocRemAddrRTO; Ip_u32 sctpAssocRemAddrMaxPathRtx; Ip_u32 sctpAssocRemAddrRtx; Ip_u32 sctpAssocRemAddrStartTime; Ip_u32 sctpAssocId; }Ipsctp_assoc_rem_addr_entry; #endif /* * Forward declarations */ struct Ipnet_dst_cache_struct; /* **************************************************************************** * 6 PUBLIC FUNCTIONS **************************************************************************** */ IP_PUBLIC int ipnet_sock_sctp_register(void); IP_GLOBAL void ipsctp_input(struct Ipnet_dst_cache_struct *dst, Ipcom_pkt *pkt); #ifdef IPCOM_USE_INET IP_PUBLIC void ipsctp_icmp4_cb(IP_CONST Ipcom_pkt *pkt); #endif #ifdef IPCOM_USE_INET6 IP_PUBLIC void ipsctp_icmp6_cb(Ipcom_pkt *pkt, Ipnet_pkt_icmp6 *icmp6, Ipnet_pkt_ip6 *failed_ip6_hdr); #endif IP_PUBLIC void ipsctp_window_update(struct Ipnet_sig_sctp_wu *sig); IP_PUBLIC int ipsctp_usr_recv(Ipsctp_socket *sock, struct Ip_msghdr *msg, int flags); IP_PUBLIC void ipsctp_pkt_drain(void); IP_PUBLIC int ipsctp_usr_sock_get_tcb_info_tcp(Ipnet_socket *sock, IP_CONST struct Ip_msghdr *msg, struct Ipsctp_sndrcvinfo *sndrcv, Ip_u32 *pmtu, Ip_u32 *mss, void **tcb_ret); IP_PUBLIC int ipsctp_usr_sock_get_tcb_info_udp(Ipnet_socket *sock, IP_CONST struct Ip_msghdr *msg, struct Ipsctp_sndrcvinfo *sndrcv, Ip_u32 *pmtu, Ip_u32 *mss, void **tcb_ret); IP_PUBLIC int ipsctp_usr_sock_sendbuf_add_and_return(Ipnet_socket *sock, void *tcb_locked, int bytes); IP_PUBLIC void ipsctp_usr_sock_sendbuf_sub(Ipnet_socket *sock, void *tcb_locked, int bytes); IP_PUBLIC int ipsctp_output(Ipsctp_socket *sock, IP_CONST struct Ip_msghdr *msg, Ipcom_pkt *pkt); IP_PUBLIC void ipsctp_set_state(struct Ipnet_sig_sctp_set_state *sig); IP_PUBLIC Ip_err ipsctp_create(void); IP_PUBLIC const char *ipsctp_version(void); IP_PUBLIC int ipsctp_fls(Ip_u32 mask); IP_PUBLIC Ip_err ipsctp_start(void); IP_PUBLIC int ipsctp_accept(Ipsctp_socket *listen_sock, struct Ip_sockaddr *addr, Ip_socklen_t *addrlen); IP_PUBLIC int ipsctp_close(Ipsctp_socket *sock); IP_PUBLIC int ipsctp_listen(Ipsctp_socket *sock, int backlog); IP_PUBLIC void ipsctp_shutdown(Ipsctp_socket *sock, int how); IP_PUBLIC int ipsctp_getsockopt(Ipsctp_socket *sock, int level, int optname, void *optval, Ip_socklen_t *optlen); IP_PUBLIC int ipsctp_setsockopt(Ipsctp_socket *sock, int level, int optname, IP_CONST void *optval, Ip_socklen_t optlen); IP_PUBLIC int ipsctp_ioctl(Ipsctp_socket *sock, unsigned long request, void *argp); IP_PUBLIC int ipsctp_getname(Ipsctp_socket *sock, struct Ip_sockaddr *name, Ip_socklen_t *namelen, Ip_bool local); IP_PUBLIC int ipsctp_sock_init(Ipsctp_socket *sock); IP_PUBLIC void ipsctp_sock_free(Ipsctp_socket *sock); IP_PUBLIC int ipsctp_bind(Ipsctp_socket *sock, IP_CONST struct Ip_sockaddr *name, Ip_socklen_t namelen); IP_PUBLIC int ipsctp_connect(Ipsctp_socket *sock, IP_CONST struct Ip_sockaddr *to); IP_PUBLIC Ipsctp_socket * ipsctp_sock_lookup_sa(Ip_u16 vr, int sa_family, IP_CONST void *local_addr, Ip_u16 local_port); IP_PUBLIC void * ipsctp_get_netstat_info(Ipsctp_socket *sock); IP_PUBLIC void ipsctp_sys_send_init(Ip_fd fd, Ip_u32 vtag); #ifdef IPSCTP_MIB IP_PUBLIC int ipsctp_mib_stats_lookup(Ipsctp_mib_stats **stats); IP_PUBLIC void ipsctp_mib_stats_get(Ipsctp_mib_stats **stats); IP_PUBLIC int ipsctp_mib_params_lookup(Ipsctp_params **params); IP_PUBLIC Ipsctp_assoc_entry * ipsctp_mib_assoc_entry_lookup(Ip_u32 vtag, int getnext); IP_PUBLIC void ipsctp_mib_set_assoc_state(Ipsctp_assoc_entry *assoc_entry, Ip_s32 state); IP_PUBLIC Ipsctp_assoc_local_addr_entry * ipsctp_mib_assoc_local_addr_entry_lookup(Ip_u32 vtag, Ip_s32 addrType, Ip_u8 *addr, int get_next); IP_PUBLIC Ipsctp_assoc_rem_addr_entry * ipsctp_mib_assoc_rem_addr_entry_lookup(Ip_u32 vtag, Ip_s32 addrType, Ip_u8 *addr, int get_next); #endif #ifdef __cplusplus } #endif #endif /* IPSCTP_H */