18c2654abSrjs /* $KAME: sctp_uio.h,v 1.11 2005/03/06 16:04:18 itojun Exp $ */ 2*3917a6f0Srjs /* $NetBSD: sctp_uio.h,v 1.4 2018/07/31 13:36:31 rjs Exp $ */ 38c2654abSrjs 48c2654abSrjs #ifndef __SCTP_UIO_H__ 58c2654abSrjs #define __SCTP_UIO_H__ 68c2654abSrjs 78c2654abSrjs /* 88c2654abSrjs * Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc. 98c2654abSrjs * All rights reserved. 108c2654abSrjs * 118c2654abSrjs * Redistribution and use in source and binary forms, with or without 128c2654abSrjs * modification, are permitted provided that the following conditions 138c2654abSrjs * are met: 148c2654abSrjs * 1. Redistributions of source code must retain the above copyright 158c2654abSrjs * notice, this list of conditions and the following disclaimer. 168c2654abSrjs * 2. Redistributions in binary form must reproduce the above copyright 178c2654abSrjs * notice, this list of conditions and the following disclaimer in the 188c2654abSrjs * documentation and/or other materials provided with the distribution. 198c2654abSrjs * 3. All advertising materials mentioning features or use of this software 208c2654abSrjs * must display the following acknowledgement: 218c2654abSrjs * This product includes software developed by Cisco Systems, Inc. 228c2654abSrjs * 4. Neither the name of the project nor the names of its contributors 238c2654abSrjs * may be used to endorse or promote products derived from this software 248c2654abSrjs * without specific prior written permission. 258c2654abSrjs * 268c2654abSrjs * THIS SOFTWARE IS PROVIDED BY CISCO SYSTEMS AND CONTRIBUTORS ``AS IS'' AND 278c2654abSrjs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 288c2654abSrjs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 298c2654abSrjs * ARE DISCLAIMED. IN NO EVENT SHALL CISCO SYSTEMS OR CONTRIBUTORS BE LIABLE 308c2654abSrjs * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 318c2654abSrjs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 328c2654abSrjs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 338c2654abSrjs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 348c2654abSrjs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 358c2654abSrjs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 368c2654abSrjs * SUCH DAMAGE. 378c2654abSrjs */ 388c2654abSrjs 398c2654abSrjs #include <sys/types.h> 408c2654abSrjs #include <sys/socket.h> 418c2654abSrjs 428c2654abSrjs typedef u_int32_t sctp_assoc_t; 438c2654abSrjs 4420ba2d4fSrjs #define SCTP_FUTURE_ASSOC 0 4520ba2d4fSrjs #define SCTP_CURRENT_ASSOC 1 4620ba2d4fSrjs #define SCTP_ALL_ASSOC 2 4720ba2d4fSrjs 488c2654abSrjs /* On/Off setup for subscription to events */ 498c2654abSrjs struct sctp_event_subscribe { 508c2654abSrjs u_int8_t sctp_data_io_event; 518c2654abSrjs u_int8_t sctp_association_event; 528c2654abSrjs u_int8_t sctp_address_event; 538c2654abSrjs u_int8_t sctp_send_failure_event; 548c2654abSrjs u_int8_t sctp_peer_error_event; 558c2654abSrjs u_int8_t sctp_shutdown_event; 568c2654abSrjs u_int8_t sctp_partial_delivery_event; 578c2654abSrjs u_int8_t sctp_adaption_layer_event; 588c2654abSrjs u_int8_t sctp_stream_reset_events; 5907da4681Srjs } __packed; 608c2654abSrjs 618c2654abSrjs /* ancillary data types */ 628c2654abSrjs #define SCTP_INIT 0x0001 638c2654abSrjs #define SCTP_SNDRCV 0x0002 6420ba2d4fSrjs #define SCTP_EXTRCV 0x0003 6520ba2d4fSrjs #define SCTP_SNDINFO 0x0004 6620ba2d4fSrjs #define SCTP_RCVINFO 0x0005 6720ba2d4fSrjs #define SCTP_NXTINFO 0x0006 6820ba2d4fSrjs #define SCTP_PRINFO 0x0007 6920ba2d4fSrjs #define SCTP_AUTHINFO 0x0008 7020ba2d4fSrjs #define SCTP_DSTADDRV4 0x0009 7120ba2d4fSrjs #define SCTP_DSTADDRV6 0x000a 7220ba2d4fSrjs 7320ba2d4fSrjs struct sctp_event { 7420ba2d4fSrjs sctp_assoc_t se_assoc_id; 7520ba2d4fSrjs u_int16_t se_type; 7620ba2d4fSrjs u_int8_t se_on; 7720ba2d4fSrjs } __packed; 788c2654abSrjs 798c2654abSrjs /* 808c2654abSrjs * ancillary data structures 818c2654abSrjs */ 828c2654abSrjs struct sctp_initmsg { 838c2654abSrjs u_int32_t sinit_num_ostreams; 848c2654abSrjs u_int32_t sinit_max_instreams; 858c2654abSrjs u_int16_t sinit_max_attempts; 868c2654abSrjs u_int16_t sinit_max_init_timeo; 8707da4681Srjs } __packed; 888c2654abSrjs 898c2654abSrjs struct sctp_sndrcvinfo { 908c2654abSrjs u_int16_t sinfo_stream; 918c2654abSrjs u_int16_t sinfo_ssn; 928c2654abSrjs u_int16_t sinfo_flags; 938c2654abSrjs u_int32_t sinfo_ppid; 948c2654abSrjs u_int32_t sinfo_context; 958c2654abSrjs u_int32_t sinfo_timetolive; 968c2654abSrjs u_int32_t sinfo_tsn; 978c2654abSrjs u_int32_t sinfo_cumtsn; 988c2654abSrjs sctp_assoc_t sinfo_assoc_id; 9907da4681Srjs } __packed; 1008c2654abSrjs 10120ba2d4fSrjs struct sctp_sndinfo { 10220ba2d4fSrjs u_int16_t snd_sid; 10320ba2d4fSrjs u_int16_t snd_flags; 10420ba2d4fSrjs u_int32_t snd_ppid; 10520ba2d4fSrjs u_int32_t snd_context; 10620ba2d4fSrjs sctp_assoc_t snd_assoc_id; 10720ba2d4fSrjs } __packed; 10820ba2d4fSrjs 10920ba2d4fSrjs struct sctp_rcvinfo { 11020ba2d4fSrjs u_int16_t rcv_sid; 11120ba2d4fSrjs u_int16_t rcv_ssn; 11220ba2d4fSrjs u_int16_t rcv_flags; 11320ba2d4fSrjs u_int32_t rcv_ppid; 11420ba2d4fSrjs u_int32_t rcv_tsn; 11520ba2d4fSrjs u_int32_t rcv_cumtsn; 11620ba2d4fSrjs u_int32_t rcv_context; 11720ba2d4fSrjs sctp_assoc_t rcv_assoc_id; 11820ba2d4fSrjs }; 11920ba2d4fSrjs 12020ba2d4fSrjs struct sctp_nxtinfo { 12120ba2d4fSrjs u_int16_t nxt_sid; 12220ba2d4fSrjs u_int16_t nxt_flags; 12320ba2d4fSrjs u_int32_t nxt_ppid; 12420ba2d4fSrjs u_int32_t nxt_length; 12520ba2d4fSrjs sctp_assoc_t nxt_assoc_id; 12620ba2d4fSrjs } __packed; 12720ba2d4fSrjs 12820ba2d4fSrjs struct sctp_prinfo { 12920ba2d4fSrjs u_int16_t pr_policy; 13020ba2d4fSrjs u_int32_t pr_value; 13120ba2d4fSrjs }; 13220ba2d4fSrjs 13320ba2d4fSrjs struct sctp_authinfo { 13420ba2d4fSrjs u_int16_t auth_keynumber; 13520ba2d4fSrjs } __packed; 13620ba2d4fSrjs 1378c2654abSrjs struct sctp_snd_all_completes { 1388c2654abSrjs u_int16_t sall_stream; 1398c2654abSrjs u_int16_t sall_flags; 1408c2654abSrjs u_int32_t sall_ppid; 1418c2654abSrjs u_int32_t sall_context; 1428c2654abSrjs u_int32_t sall_num_sent; 1438c2654abSrjs u_int32_t sall_num_failed; 14407da4681Srjs } __packed; 1458c2654abSrjs 1468c2654abSrjs /* send/recv flags */ 14720ba2d4fSrjs #define SCTP_SENDALL 0x0200 14820ba2d4fSrjs #define SCTP_PR_SCTP_TTL 0x0400 /* Partial Reliable on this msg */ 14920ba2d4fSrjs #define SCTP_PR_SCTP_BUF 0x0800 /* Buffer based PR-SCTP */ 15020ba2d4fSrjs #define SCTP_EOF 0x1000 /* Start shutdown procedures */ 15120ba2d4fSrjs #define SCTP_UNORDERED 0x2000 /* Message is un-ordered */ 15220ba2d4fSrjs #define SCTP_ADDR_OVER 0x4000 /* Override the primary-address */ 15320ba2d4fSrjs #define SCTP_ABORT 0x8000 /* Send an ABORT to peer */ 1548c2654abSrjs 1558c2654abSrjs /* Stat's */ 1568c2654abSrjs struct sctp_pcbinfo { 1578c2654abSrjs u_int32_t ep_count; 1588c2654abSrjs u_int32_t asoc_count; 1598c2654abSrjs u_int32_t laddr_count; 1608c2654abSrjs u_int32_t raddr_count; 1618c2654abSrjs u_int32_t chk_count; 1628c2654abSrjs u_int32_t sockq_count; 1638c2654abSrjs u_int32_t mbuf_track; 16407da4681Srjs } __packed; 1658c2654abSrjs 1668c2654abSrjs struct sctp_sockstat { 1678c2654abSrjs sctp_assoc_t ss_assoc_id; 1688c2654abSrjs u_int32_t ss_total_sndbuf; 1698c2654abSrjs u_int32_t ss_total_mbuf_sndbuf; 1708c2654abSrjs u_int32_t ss_total_recv_buf; 17107da4681Srjs } __packed; 1728c2654abSrjs 1738c2654abSrjs /* 1748c2654abSrjs * notification event structures 1758c2654abSrjs */ 1768c2654abSrjs 1778c2654abSrjs 1788c2654abSrjs /* association change events */ 1798c2654abSrjs 1808c2654abSrjs struct sctp_assoc_change { 1818c2654abSrjs u_int16_t sac_type; 1828c2654abSrjs u_int16_t sac_flags; 1838c2654abSrjs u_int32_t sac_length; 1848c2654abSrjs u_int16_t sac_state; 1858c2654abSrjs u_int16_t sac_error; 1868c2654abSrjs u_int16_t sac_outbound_streams; 1878c2654abSrjs u_int16_t sac_inbound_streams; 1888c2654abSrjs sctp_assoc_t sac_assoc_id; 18920ba2d4fSrjs u_int8_t sac_info[0]; 19007da4681Srjs } __packed; 1918c2654abSrjs /* sac_state values */ 1928c2654abSrjs 1938c2654abSrjs #define SCTP_COMM_UP 0x0001 1948c2654abSrjs #define SCTP_COMM_LOST 0x0002 1958c2654abSrjs #define SCTP_RESTART 0x0003 1968c2654abSrjs #define SCTP_SHUTDOWN_COMP 0x0004 1978c2654abSrjs #define SCTP_CANT_STR_ASSOC 0x0005 1988c2654abSrjs 19920ba2d4fSrjs /* sac_info values */ 20020ba2d4fSrjs #define SCTP_ASSOC_SUPPORTS_PR 0x0001 20120ba2d4fSrjs #define SCTP_ASSOC_SUPPORTS_AUTH 0x0002 20220ba2d4fSrjs #define SCTP_ASSOC_SUPPORTS_ASCONF 0x0003 20320ba2d4fSrjs #define SCTP_ASSOC_SUPPORTS_MULTIBUF 0x0004 2048c2654abSrjs 2058c2654abSrjs /* Address events */ 2068c2654abSrjs struct sctp_paddr_change { 2078c2654abSrjs u_int16_t spc_type; 2088c2654abSrjs u_int16_t spc_flags; 2098c2654abSrjs u_int32_t spc_length; 2108c2654abSrjs struct sockaddr_storage spc_aaddr; 2118c2654abSrjs u_int32_t spc_state; 2128c2654abSrjs u_int32_t spc_error; 2138c2654abSrjs sctp_assoc_t spc_assoc_id; 21407da4681Srjs } __packed; 2158c2654abSrjs /* paddr state values */ 2168c2654abSrjs #define SCTP_ADDR_AVAILABLE 0x0001 2178c2654abSrjs #define SCTP_ADDR_UNREACHABLE 0x0002 2188c2654abSrjs #define SCTP_ADDR_REMOVED 0x0003 2198c2654abSrjs #define SCTP_ADDR_ADDED 0x0004 2208c2654abSrjs #define SCTP_ADDR_MADE_PRIM 0x0005 22120ba2d4fSrjs #define SCTP_ADDR_CONFIRMED 0x0006 /* XXX */ 2228c2654abSrjs 2238c2654abSrjs /* 2248c2654abSrjs * CAUTION: these are user exposed SCTP addr reachability states 2258c2654abSrjs * must be compatible with SCTP_ADDR states in sctp_constants.h 2268c2654abSrjs */ 2278c2654abSrjs #ifdef SCTP_ACTIVE 2288c2654abSrjs #undef SCTP_ACTIVE 2298c2654abSrjs #endif 2308c2654abSrjs #define SCTP_ACTIVE 0x0001 /* SCTP_ADDR_REACHABLE */ 2318c2654abSrjs 2328c2654abSrjs #ifdef SCTP_INACTIVE 2338c2654abSrjs #undef SCTP_INACTIVE 2348c2654abSrjs #endif 2358c2654abSrjs #define SCTP_INACTIVE 0x0002 /* SCTP_ADDR_NOT_REACHABLE */ 2368c2654abSrjs 2378c2654abSrjs 2388c2654abSrjs #ifdef SCTP_UNCONFIRMED 2398c2654abSrjs #undef SCTP_UNCONFIRMED 2408c2654abSrjs #endif 2418c2654abSrjs #define SCTP_UNCONFIRMED 0x0200 /* SCTP_ADDR_UNCONFIRMED */ 2428c2654abSrjs 2438c2654abSrjs #ifdef SCTP_NOHEARTBEAT 2448c2654abSrjs #undef SCTP_NOHEARTBEAT 2458c2654abSrjs #endif 2468c2654abSrjs #define SCTP_NOHEARTBEAT 0x0040 /* SCTP_ADDR_NOHB */ 2478c2654abSrjs 2488c2654abSrjs 2498c2654abSrjs /* remote error events */ 2508c2654abSrjs struct sctp_remote_error { 2518c2654abSrjs u_int16_t sre_type; 2528c2654abSrjs u_int16_t sre_flags; 2538c2654abSrjs u_int32_t sre_length; 2548c2654abSrjs u_int16_t sre_error; 2558c2654abSrjs sctp_assoc_t sre_assoc_id; 2568c2654abSrjs u_int8_t sre_data[4]; 25707da4681Srjs } __packed; 2588c2654abSrjs 2598c2654abSrjs /* data send failure event */ 2608c2654abSrjs struct sctp_send_failed { 2618c2654abSrjs u_int16_t ssf_type; 2628c2654abSrjs u_int16_t ssf_flags; 2638c2654abSrjs u_int32_t ssf_length; 2648c2654abSrjs u_int32_t ssf_error; 2658c2654abSrjs struct sctp_sndrcvinfo ssf_info; 2668c2654abSrjs sctp_assoc_t ssf_assoc_id; 2678c2654abSrjs u_int8_t ssf_data[4]; 26807da4681Srjs } __packed; 2698c2654abSrjs 2708c2654abSrjs /* flag that indicates state of data */ 2718c2654abSrjs #define SCTP_DATA_UNSENT 0x0001 /* inqueue never on wire */ 2728c2654abSrjs #define SCTP_DATA_SENT 0x0002 /* on wire at failure */ 2738c2654abSrjs 2748c2654abSrjs /* shutdown event */ 2758c2654abSrjs struct sctp_shutdown_event { 2768c2654abSrjs u_int16_t sse_type; 2778c2654abSrjs u_int16_t sse_flags; 2788c2654abSrjs u_int32_t sse_length; 2798c2654abSrjs sctp_assoc_t sse_assoc_id; 28007da4681Srjs } __packed; 2818c2654abSrjs 2828c2654abSrjs /* Adaption layer indication stuff */ 2838c2654abSrjs struct sctp_adaption_event { 2848c2654abSrjs u_int16_t sai_type; 2858c2654abSrjs u_int16_t sai_flags; 2868c2654abSrjs u_int32_t sai_length; 2878c2654abSrjs u_int32_t sai_adaption_ind; 2888c2654abSrjs sctp_assoc_t sai_assoc_id; 28907da4681Srjs } __packed; 2908c2654abSrjs 2918c2654abSrjs struct sctp_setadaption { 2928c2654abSrjs u_int32_t ssb_adaption_ind; 29307da4681Srjs } __packed; 2948c2654abSrjs 2958c2654abSrjs /* pdapi indications */ 2968c2654abSrjs struct sctp_pdapi_event { 2978c2654abSrjs u_int16_t pdapi_type; 2988c2654abSrjs u_int16_t pdapi_flags; 2998c2654abSrjs u_int32_t pdapi_length; 3008c2654abSrjs u_int32_t pdapi_indication; 30120ba2d4fSrjs u_int32_t pdapi_stream; 30220ba2d4fSrjs u_int32_t pdapi_seq; 3038c2654abSrjs sctp_assoc_t pdapi_assoc_id; 30407da4681Srjs } __packed; 3058c2654abSrjs 3068c2654abSrjs 3078c2654abSrjs #define SCTP_PARTIAL_DELIVERY_ABORTED 0x0001 3088c2654abSrjs 30920ba2d4fSrjs /* sender dry indications */ 31020ba2d4fSrjs struct sctp_sender_dry_event { 31120ba2d4fSrjs u_int16_t sender_dry_type; 31220ba2d4fSrjs u_int16_t sender_dry_flags; 31320ba2d4fSrjs u_int32_t sender_dry_length; 31420ba2d4fSrjs sctp_assoc_t sender_dry_assoc_id; 31520ba2d4fSrjs } __packed; 31620ba2d4fSrjs 3178c2654abSrjs /* stream reset stuff */ 3188c2654abSrjs 3198c2654abSrjs struct sctp_stream_reset_event { 3208c2654abSrjs u_int16_t strreset_type; 3218c2654abSrjs u_int16_t strreset_flags; 3228c2654abSrjs u_int32_t strreset_length; 3238c2654abSrjs sctp_assoc_t strreset_assoc_id; 3248c2654abSrjs u_int16_t strreset_list[0]; 32507da4681Srjs } __packed; 3268c2654abSrjs 3278c2654abSrjs /* flags in strreset_flags filed */ 3288c2654abSrjs #define SCTP_STRRESET_INBOUND_STR 0x0001 3298c2654abSrjs #define SCTP_STRRESET_OUTBOUND_STR 0x0002 3308c2654abSrjs #define SCTP_STRRESET_ALL_STREAMS 0x0004 3318c2654abSrjs #define SCTP_STRRESET_STREAM_LIST 0x0008 3328c2654abSrjs 3338c2654abSrjs #define MAX_ASOC_IDS_RET 255 3348c2654abSrjs 3358c2654abSrjs struct sctp_assoc_ids { 3368c2654abSrjs u_int16_t asls_assoc_start; /* array of index's start at 0 */ 3378c2654abSrjs u_int8_t asls_numb_present; 3388c2654abSrjs u_int8_t asls_more_to_get; 3398c2654abSrjs sctp_assoc_t asls_assoc_id[MAX_ASOC_IDS_RET]; 34007da4681Srjs } __packed; 3418c2654abSrjs 3428c2654abSrjs /* notification types */ 3438c2654abSrjs #define SCTP_ASSOC_CHANGE 0x0001 3448c2654abSrjs #define SCTP_PEER_ADDR_CHANGE 0x0002 3458c2654abSrjs #define SCTP_REMOTE_ERROR 0x0003 3468c2654abSrjs #define SCTP_SEND_FAILED 0x0004 3478c2654abSrjs #define SCTP_SHUTDOWN_EVENT 0x0005 3488c2654abSrjs #define SCTP_ADAPTION_INDICATION 0x0006 3498c2654abSrjs #define SCTP_PARTIAL_DELIVERY_EVENT 0x0007 35020ba2d4fSrjs #define SCTP_STREAM_RESET_EVENT 0x0008 /* XXX */ 35120ba2d4fSrjs #define SCTP_AUTHENTICATION_EVENT 0x0009 35220ba2d4fSrjs #define SCT_SENDER_DRY_EVENT 0x000a 3538c2654abSrjs 3548c2654abSrjs struct sctp_tlv { 3558c2654abSrjs u_int16_t sn_type; 3568c2654abSrjs u_int16_t sn_flags; 3578c2654abSrjs u_int32_t sn_length; 35807da4681Srjs } __packed; 3598c2654abSrjs 3608c2654abSrjs 3618c2654abSrjs /* notification event */ 3628c2654abSrjs union sctp_notification { 3638c2654abSrjs struct sctp_tlv sn_header; 3648c2654abSrjs struct sctp_assoc_change sn_assoc_change; 3658c2654abSrjs struct sctp_paddr_change sn_paddr_change; 3668c2654abSrjs struct sctp_remote_error sn_remote_error; 3678c2654abSrjs struct sctp_send_failed sn_send_failed; 3688c2654abSrjs struct sctp_shutdown_event sn_shutdown_event; 3698c2654abSrjs struct sctp_adaption_event sn_adaption_event; 3708c2654abSrjs struct sctp_pdapi_event sn_pdapi_event; 3718c2654abSrjs struct sctp_stream_reset_event sn_strreset_event; 37207da4681Srjs } __packed; 3738c2654abSrjs 3748c2654abSrjs /* 3758c2654abSrjs * socket option structs 3768c2654abSrjs */ 3778c2654abSrjs #define SCTP_ISSUE_HB 0xffffffff /* get a on-demand hb */ 3788c2654abSrjs #define SCTP_NO_HB 0x0 /* turn off hb's */ 3798c2654abSrjs 3808c2654abSrjs struct sctp_paddrparams { 3818c2654abSrjs sctp_assoc_t spp_assoc_id; 3828c2654abSrjs struct sockaddr_storage spp_address; 3838c2654abSrjs u_int32_t spp_hbinterval; 3848c2654abSrjs u_int16_t spp_pathmaxrxt; 38520ba2d4fSrjs u_int32_t spp_pathmtu; 38620ba2d4fSrjs u_int32_t spp_flags; 38720ba2d4fSrjs u_int32_t spp_ipv6_flowlabel; 38820ba2d4fSrjs u_int8_t spp_dscp; 38907da4681Srjs } __packed; 3908c2654abSrjs 39120ba2d4fSrjs #define SPP_HB_ENABLE 0x0001 39220ba2d4fSrjs #define SPP_HB_DISABLE 0x0002 39320ba2d4fSrjs #define SPP_HB_DEMAND 0x0004 39420ba2d4fSrjs #define SPP_HB_TIME_IS_ZERO 0x0008 39520ba2d4fSrjs #define SPP_PMTUD_ENABLE 0x0010 39620ba2d4fSrjs #define SPP_PMTUD_DISABLE 0x0020 39720ba2d4fSrjs #define SPP_IPV6_FLOWLABEL 0x0040 39820ba2d4fSrjs #define SPP_DSCP 0x0080 39920ba2d4fSrjs 4008c2654abSrjs struct sctp_paddrinfo { 4018c2654abSrjs sctp_assoc_t spinfo_assoc_id; 4028c2654abSrjs struct sockaddr_storage spinfo_address; 4038c2654abSrjs int32_t spinfo_state; 4048c2654abSrjs u_int32_t spinfo_cwnd; 4058c2654abSrjs u_int32_t spinfo_srtt; 4068c2654abSrjs u_int32_t spinfo_rto; 4078c2654abSrjs u_int32_t spinfo_mtu; 40807da4681Srjs } __packed; 4098c2654abSrjs 4108c2654abSrjs struct sctp_rtoinfo { 4118c2654abSrjs sctp_assoc_t srto_assoc_id; 4128c2654abSrjs u_int32_t srto_initial; 4138c2654abSrjs u_int32_t srto_max; 4148c2654abSrjs u_int32_t srto_min; 41507da4681Srjs } __packed; 4168c2654abSrjs 4178c2654abSrjs struct sctp_assocparams { 4188c2654abSrjs sctp_assoc_t sasoc_assoc_id; 4198c2654abSrjs u_int16_t sasoc_asocmaxrxt; 4208c2654abSrjs u_int16_t sasoc_number_peer_destinations; 4218c2654abSrjs u_int32_t sasoc_peer_rwnd; 4228c2654abSrjs u_int32_t sasoc_local_rwnd; 4238c2654abSrjs u_int32_t sasoc_cookie_life; 42407da4681Srjs } __packed; 4258c2654abSrjs 4268c2654abSrjs struct sctp_setprim { 4278c2654abSrjs sctp_assoc_t ssp_assoc_id; 4288c2654abSrjs struct sockaddr_storage ssp_addr; 42907da4681Srjs } __packed; 4308c2654abSrjs 4318c2654abSrjs struct sctp_setpeerprim { 4328c2654abSrjs sctp_assoc_t sspp_assoc_id; 4338c2654abSrjs struct sockaddr_storage sspp_addr; 43407da4681Srjs } __packed; 4358c2654abSrjs 4368c2654abSrjs struct sctp_getaddresses { 4378c2654abSrjs sctp_assoc_t sget_assoc_id; 4388c2654abSrjs /* addr is filled in for N * sockaddr_storage */ 4398c2654abSrjs struct sockaddr addr[1]; 44007da4681Srjs } __packed; 4418c2654abSrjs 4428c2654abSrjs struct sctp_setstrm_timeout { 4438c2654abSrjs sctp_assoc_t ssto_assoc_id; 4448c2654abSrjs u_int32_t ssto_timeout; 4458c2654abSrjs u_int32_t ssto_streamid_start; 4468c2654abSrjs u_int32_t ssto_streamid_end; 44707da4681Srjs } __packed; 4488c2654abSrjs 4498c2654abSrjs struct sctp_status { 4508c2654abSrjs sctp_assoc_t sstat_assoc_id; 4518c2654abSrjs int32_t sstat_state; 4528c2654abSrjs u_int32_t sstat_rwnd; 4538c2654abSrjs u_int16_t sstat_unackdata; 4548c2654abSrjs u_int16_t sstat_penddata; 4558c2654abSrjs u_int16_t sstat_instrms; 4568c2654abSrjs u_int16_t sstat_outstrms; 4578c2654abSrjs u_int32_t sstat_fragmentation_point; 4588c2654abSrjs struct sctp_paddrinfo sstat_primary; 45907da4681Srjs } __packed; 4608c2654abSrjs 4618c2654abSrjs struct sctp_cwnd_args { 4628c2654abSrjs struct sctp_nets *net; /* network to */ 4638c2654abSrjs u_int32_t cwnd_new_value; /* cwnd in k */ 4648c2654abSrjs u_int32_t inflight; /* flightsize in k */ 4658c2654abSrjs int cwnd_augment; /* increment to it */ 46607da4681Srjs } __packed; 4678c2654abSrjs 4688c2654abSrjs struct sctp_blk_args { 4698c2654abSrjs u_int32_t onmb; /* in 1k bytes */ 4708c2654abSrjs u_int32_t onsb; /* in 1k bytes */ 4718c2654abSrjs u_int16_t maxmb; /* in 1k bytes */ 4728c2654abSrjs u_int16_t maxsb; /* in 1k bytes */ 4738c2654abSrjs u_int16_t send_sent_qcnt; /* chnk cnt */ 4748c2654abSrjs u_int16_t stream_qcnt; /* chnk cnt */ 47507da4681Srjs } __packed; 4768c2654abSrjs 4778c2654abSrjs /* 4788c2654abSrjs * Max we can reset in one setting, note this is dictated not by the 4798c2654abSrjs * define but the size of a mbuf cluster so don't change this define 4808c2654abSrjs * and think you can specify more. You must do multiple resets if you 4818c2654abSrjs * want to reset more than SCTP_MAX_EXPLICIT_STR_RESET. 4828c2654abSrjs */ 4838c2654abSrjs #define SCTP_MAX_EXPLICT_STR_RESET 1000 4848c2654abSrjs 4858c2654abSrjs #define SCTP_RESET_LOCAL_RECV 0x0001 4868c2654abSrjs #define SCTP_RESET_LOCAL_SEND 0x0002 4878c2654abSrjs #define SCTP_RESET_BOTH 0x0003 4888c2654abSrjs 4898c2654abSrjs struct sctp_stream_reset { 4908c2654abSrjs sctp_assoc_t strrst_assoc_id; 4918c2654abSrjs u_int16_t strrst_flags; 4928c2654abSrjs u_int16_t strrst_num_streams; /* 0 == ALL */ 4938c2654abSrjs u_int16_t strrst_list[0]; /* list if strrst_num_streams is not 0*/ 49407da4681Srjs } __packed; 4958c2654abSrjs 4968c2654abSrjs 4978c2654abSrjs struct sctp_get_nonce_values { 4988c2654abSrjs sctp_assoc_t gn_assoc_id; 4998c2654abSrjs u_int32_t gn_peers_tag; 5008c2654abSrjs u_int32_t gn_local_tag; 50107da4681Srjs } __packed; 5028c2654abSrjs 5038c2654abSrjs /* Debugging logs */ 5048c2654abSrjs struct sctp_str_log{ 5058c2654abSrjs u_int32_t n_tsn; 5068c2654abSrjs u_int32_t e_tsn; 5078c2654abSrjs u_int16_t n_sseq; 5088c2654abSrjs u_int16_t e_sseq; 50907da4681Srjs } __packed; 5108c2654abSrjs 5118c2654abSrjs struct sctp_fr_log { 5128c2654abSrjs u_int32_t largest_tsn; 5138c2654abSrjs u_int32_t largest_new_tsn; 5148c2654abSrjs u_int32_t tsn; 51507da4681Srjs } __packed; 5168c2654abSrjs 5178c2654abSrjs struct sctp_fr_map { 5188c2654abSrjs u_int32_t base; 5198c2654abSrjs u_int32_t cum; 5208c2654abSrjs u_int32_t high; 52107da4681Srjs } __packed; 5228c2654abSrjs 5238c2654abSrjs struct sctp_rwnd_log { 5248c2654abSrjs u_int32_t rwnd; 5258c2654abSrjs u_int32_t send_size; 5268c2654abSrjs u_int32_t overhead; 5278c2654abSrjs u_int32_t new_rwnd; 52807da4681Srjs } __packed; 5298c2654abSrjs 5308c2654abSrjs struct sctp_mbcnt_log { 5318c2654abSrjs u_int32_t total_queue_size; 5328c2654abSrjs u_int32_t size_change; 5338c2654abSrjs u_int32_t total_queue_mb_size; 5348c2654abSrjs u_int32_t mbcnt_change; 53507da4681Srjs } __packed; 5368c2654abSrjs 5378c2654abSrjs struct sctp_cwnd_log { 5388c2654abSrjs union { 5398c2654abSrjs struct sctp_blk_args blk; 5408c2654abSrjs struct sctp_cwnd_args cwnd; 5418c2654abSrjs struct sctp_str_log strlog; 5428c2654abSrjs struct sctp_fr_log fr; 5438c2654abSrjs struct sctp_fr_map map; 5448c2654abSrjs struct sctp_rwnd_log rwnd; 5458c2654abSrjs struct sctp_mbcnt_log mbcnt; 5468c2654abSrjs }x; 5478c2654abSrjs u_int8_t from; 5488c2654abSrjs u_int8_t event_type; 5498c2654abSrjs 55007da4681Srjs } __packed; 5518c2654abSrjs 5528c2654abSrjs struct sctp_cwnd_log_req { 5538c2654abSrjs int num_in_log; /* Number in log */ 5548c2654abSrjs int num_ret; /* Number returned */ 5558c2654abSrjs int start_at; /* start at this one */ 5568c2654abSrjs int end_at; /* end at this one */ 5578c2654abSrjs struct sctp_cwnd_log log[0]; 55807da4681Srjs } __packed; 5598c2654abSrjs 56020ba2d4fSrjs struct sctp_sendv_spa { 56120ba2d4fSrjs u_int32_t sendv_flags; 56220ba2d4fSrjs struct sctp_sndinfo sendv_sndinfo; 56320ba2d4fSrjs struct sctp_prinfo sendv_prinfo; 56420ba2d4fSrjs struct sctp_authinfo sendv_authinfo; 56520ba2d4fSrjs } __packed; 56620ba2d4fSrjs 56720ba2d4fSrjs #define SCTP_SEND_SNDINFO_VALID 0x00000001 56820ba2d4fSrjs #define SCTP_SEND_PRINFO_VALID 0x00000002 56920ba2d4fSrjs #define SCTP_SEND_AUTHINFO_VALID 0x00000004 57020ba2d4fSrjs 57120ba2d4fSrjs #define SCTP_SENDV_NOINFO 0x0000 57220ba2d4fSrjs #define SCTP_SENDV_SNDINFO 0x0001 57320ba2d4fSrjs #define SCTP_SENDV_PRINFO 0x0002 57420ba2d4fSrjs #define SCTP_SENDV_AUTHINFO 0x0003 57520ba2d4fSrjs #define SCTP_SENDV_SPA 0x0004 57620ba2d4fSrjs 57720ba2d4fSrjs struct sctp_recvv_rn { 57820ba2d4fSrjs struct sctp_rcvinfo recvv_rcvinfo; 57920ba2d4fSrjs struct sctp_nxtinfo recvv_nxtinfo; 58020ba2d4fSrjs } __packed; 58120ba2d4fSrjs 58220ba2d4fSrjs #define SCTP_RECVV_NOINFO 0x0000 58320ba2d4fSrjs #define SCTP_RECVV_RCVINFO 0x0001 58420ba2d4fSrjs #define SCTP_RECVV_NXTINFO 0x0002 58520ba2d4fSrjs #define SCTP_RECVV_RN 0x0003 5868c2654abSrjs 587*3917a6f0Srjs struct sctp_connectx_addrs { 588*3917a6f0Srjs int cx_num; 589*3917a6f0Srjs int cx_len; 590*3917a6f0Srjs void *cx_addrs; 591*3917a6f0Srjs } __packed; 592*3917a6f0Srjs 593*3917a6f0Srjs #define SIOCCONNECTX _IOWR('s', 11, struct sctp_connectx_addrs) 594*3917a6f0Srjs #define SIOCCONNECTXDEL _IOWR('s', 12, struct sctp_connectx_addrs) 5958c2654abSrjs 5968c2654abSrjs /* 5978c2654abSrjs * API system calls 5988c2654abSrjs */ 5998c2654abSrjs #if !defined(_KERNEL) 6008c2654abSrjs 6018c2654abSrjs __BEGIN_DECLS 6028c2654abSrjs int sctp_peeloff(int, sctp_assoc_t); 6038c2654abSrjs int sctp_bindx(int, struct sockaddr *, int, int); 60420ba2d4fSrjs int sctp_connectx(int, struct sockaddr *, int, sctp_assoc_t *); 6058c2654abSrjs int sctp_getpaddrs(int, sctp_assoc_t, struct sockaddr **); 6068c2654abSrjs void sctp_freepaddrs(struct sockaddr *); 6078c2654abSrjs int sctp_getladdrs(int, sctp_assoc_t, struct sockaddr **); 6088c2654abSrjs void sctp_freeladdrs(struct sockaddr *); 6098c2654abSrjs int sctp_opt_info(int, sctp_assoc_t, int, void *, socklen_t *); 6108c2654abSrjs 6118c2654abSrjs ssize_t sctp_sendmsg(int, const void *, size_t, 6128c2654abSrjs const struct sockaddr *, 6138c2654abSrjs socklen_t, u_int32_t, u_int32_t, u_int16_t, u_int32_t, u_int32_t); 6148c2654abSrjs 61520ba2d4fSrjs ssize_t sctp_send(int, const void *, size_t, 61620ba2d4fSrjs const struct sctp_sndrcvinfo *, int); 6178c2654abSrjs 6188c2654abSrjs ssize_t 61920ba2d4fSrjs sctp_sendx(int, const void *, size_t, struct sockaddr *, int, 62020ba2d4fSrjs struct sctp_sndrcvinfo *, int); 6218c2654abSrjs ssize_t 6228c2654abSrjs sctp_sendmsgx(int sd, const void *, size_t, 6238c2654abSrjs struct sockaddr *, int, 6248c2654abSrjs u_int32_t, u_int32_t, u_int16_t, u_int32_t, u_int32_t); 62520ba2d4fSrjs ssize_t sctp_sendv(int, const struct iovec *, int, struct sockaddr *, int, 62620ba2d4fSrjs void *, socklen_t, unsigned int, int); 6278c2654abSrjs 6288c2654abSrjs sctp_assoc_t 6298c2654abSrjs sctp_getassocid(int sd, struct sockaddr *sa); 6308c2654abSrjs 6318c2654abSrjs ssize_t sctp_recvmsg(int, void *, size_t, struct sockaddr *, 6328c2654abSrjs socklen_t *, struct sctp_sndrcvinfo *, int *); 63320ba2d4fSrjs ssize_t sctp_recvv(int, const struct iovec *, int, struct sockaddr *, 63420ba2d4fSrjs socklen_t *, void *, socklen_t *, unsigned int *, 63520ba2d4fSrjs int *); 6368c2654abSrjs 6378c2654abSrjs __END_DECLS 6388c2654abSrjs 6398c2654abSrjs #endif /* !_KERNEL */ 6408c2654abSrjs #endif /* !__SCTP_UIO_H__ */ 641