xref: /netbsd-src/sys/netinet/sctp_uio.h (revision 3917a6f0d9469ab6b0602b5df1fe01b0df23b973)
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