aboutsummaryrefslogtreecommitdiff
path: root/lib/libc/include/generic-netbsd/netinet/sctp.h
blob: 4ea675fa90cf4f94320a28d528bb2485a673ed7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
/*	$KAME: sctp.h,v 1.18 2005/03/06 16:04:16 itojun Exp $	*/
/*	$NetBSD: sctp.h,v 1.5 2021/10/24 20:00:12 andvar Exp $ */

#ifndef _NETINET_SCTP_H_
#define _NETINET_SCTP_H_

/*
 * Copyright (c) 2001, 2002, 2003, 2004 Cisco Systems, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *      This product includes software developed by Cisco Systems, Inc.
 * 4. Neither the name of the project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY CISCO SYSTEMS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL CISCO SYSTEMS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */
#include <sys/types.h>

/*
 * SCTP protocol - RFC2960.
 */

struct sctphdr {
	u_int16_t src_port;		/* source port */
	u_int16_t dest_port;		/* destination port */
	u_int32_t v_tag;		/* verification tag of packet */
	u_int32_t checksum;		/* Adler32 C-Sum */
	/* chunks follow... */
} __packed;

/*
 * SCTP Chunks
 */
struct sctp_chunkhdr {
	u_int8_t  chunk_type;		/* chunk type */
	u_int8_t  chunk_flags;		/* chunk flags */
	u_int16_t chunk_length;		/* chunk length */
	/* optional params follow */
} __packed;

/*
 * SCTP chunk parameters
 */
struct sctp_paramhdr {
	u_int16_t param_type;		/* parameter type */
	u_int16_t param_length;		/* parameter length */
} __packed;

/*
 * user socket options
 */
/* read-write options */
#define SCTP_NODELAY			0x00000001
#define SCTP_MAXSEG			0x00000002
#define SCTP_ASSOCINFO			0x00000003

#define SCTP_INITMSG			0x00000004
#define SCTP_AUTOCLOSE			0x00000005
#define SCTP_SET_PEER_PRIMARY_ADDR	0x00000006
#define SCTP_PRIMARY_ADDR		0x00000007

/* read-only options */
#define SCTP_STATUS			0x00000008
#define SCTP_PCB_STATUS			0x00000009

/* ancillary data/notification interest options */
#define SCTP_EVENTS			0x0000000a
/* sctp_opt_info params */
#define SCTP_PEER_ADDR_PARAMS 		0x0000000b
#define SCTP_GET_PEER_ADDR_INFO		0x0000000c
/* Hidden socket option that gets the addresses */
#define SCTP_GET_PEER_ADDRESSES		0x0000000d
#define SCTP_GET_LOCAL_ADDRESSES	0x0000000e
/*
 * Blocking I/O is enabled on any TCP type socket by default.
 * For the UDP model if this is turned on then the socket buffer is
 * shared for send resources amongst all associations. The default
 * for the UDP model is that is SS_NBIO is set. Which means all associations
 * have a separate send limit BUT they will NOT ever BLOCK instead
 * you will get an error back EAGAIN if you try to send too much. If
 * you want the blocking symantics you set this option at the cost
 * of sharing one socket send buffer size amongst all associations.
 * Peeled off sockets turn this option off and block... but since both TCP and
 * peeled off sockets have only one assoc per socket this is fine.
 * It probably does NOT make sense to set this  on SS_NBIO on a TCP model OR
 * peeled off UDP model, but we do allow you to do so. You just use
 * the normal syscall to toggle SS_NBIO the way you want.
 */
/* Blocking I/O is controlled by the SS_NBIO flag on the
 * socket state so_state field.
 */
#define SCTP_GET_SNDBUF_USE		0x0000000f
/* latter added read/write */
#define SCTP_ADAPTION_LAYER		0x00000010
#define SCTP_DISABLE_FRAGMENTS		0x00000011
/* sctp_bindx() flags as socket options */
#define SCTP_BINDX_ADD_ADDR		0x00000012
#define SCTP_BINDX_REM_ADDR		0x00000013
/* return the total count in bytes needed to hold all local addresses bound */
#define SCTP_GET_LOCAL_ADDR_SIZE	0x00000014
/* Without this applied we will give V4 and V6 addresses on a V6 socket */
#define SCTP_I_WANT_MAPPED_V4_ADDR	0x00000015
/* Return the total count in bytes needed to hold the remote address */
#define SCTP_GET_REMOTE_ADDR_SIZE	0x00000016
#define SCTP_GET_PEGS			0x00000017
#define SCTP_DEFAULT_SEND_PARAM		0x00000018
#define SCTP_SET_DEBUG_LEVEL		0x00000019
#define SCTP_RTOINFO			0x0000001a
#define SCTP_AUTO_ASCONF		0x0000001b
#define SCTP_MAXBURST			0x0000001c
#define SCTP_GET_STAT_LOG		0x0000001d
#define SCTP_CONNECT_X			0x0000001e	/* hidden opt for connectx */
#define SCTP_RESET_STREAMS		0x0000001f
#define SCTP_CONNECT_X_DELAYED		0x00000020	/* hidden opt for connectx_delayed
							 * part of sctp_sendx()
							 */
#define SCTP_CONNECT_X_COMPLETE         0x00000021
#define SCTP_GET_ASOC_ID_LIST           0x00000022

/* Other BSD items */
#define SCTP_GET_NONCE_VALUES           0x00000023
#define SCTP_DELAYED_ACK_TIME           0x00000024

/* Things for the AUTH draft possibly */
#define SCTP_PEER_PUBLIC_KEY            0x00000100 /* get the peers public key */
#define SCTP_MY_PUBLIC_KEY              0x00000101 /* get/set my endpoints public key */
#define SCTP_SET_AUTH_SECRET            0x00000102 /* get/set my shared secret */
#define SCTP_SET_AUTH_CHUNKS            0x00000103/* specify what chunks you want
						    * the system may have additional requirments
						     * as well. I.e. probably ASCONF/ASCONF-ACK no matter
						     * if you want it or not.
						     */
/* Debug things that need to be purged */
#define SCTP_SET_INITIAL_DBG_SEQ	0x00001f00
#define SCTP_RESET_PEGS                 0x00002000
#define SCTP_CLR_STAT_LOG               0x00002100

/*
 * user state values
 */
#define SCTP_CLOSED			0x0000
#define SCTP_BOUND			0x1000
#define SCTP_LISTEN			0x2000
#define SCTP_COOKIE_WAIT		0x0002
#define SCTP_COOKIE_ECHOED		0x0004
#define SCTP_ESTABLISHED		0x0008
#define SCTP_SHUTDOWN_SENT		0x0010
#define SCTP_SHUTDOWN_RECEIVED		0x0020
#define SCTP_SHUTDOWN_ACK_SENT		0x0040
#define SCTP_SHUTDOWN_PENDING		0x0080

/*
 * SCTP operational error codes (user visible)
 */
#define SCTP_ERROR_NO_ERROR		0x0000
#define SCTP_ERROR_INVALID_STREAM	0x0001
#define SCTP_ERROR_MISSING_PARAM	0x0002
#define SCTP_ERROR_STALE_COOKIE		0x0003
#define SCTP_ERROR_OUT_OF_RESOURCES	0x0004
#define SCTP_ERROR_UNRESOLVABLE_ADDR	0x0005
#define SCTP_ERROR_UNRECOG_CHUNK	0x0006
#define SCTP_ERROR_INVALID_PARAM	0x0007
#define SCTP_ERROR_UNRECOG_PARAM	0x0008
#define SCTP_ERROR_NO_USER_DATA		0x0009
#define SCTP_ERROR_COOKIE_IN_SHUTDOWN	0x000a
/* draft-ietf-tsvwg-sctpimpguide */
#define SCTP_ERROR_RESTART_NEWADDRS	0x000b
/* draft-ietf-tsvwg-addip-sctp */
#define SCTP_ERROR_DELETE_LAST_ADDR	0x0100
#define SCTP_ERROR_RESOURCE_SHORTAGE	0x0101
#define SCTP_ERROR_DELETE_SOURCE_ADDR	0x0102
#define SCTP_ERROR_ILLEGAL_ASCONF_ACK	0x0103

/*
 * error cause parameters (user visible)
 */
struct sctp_error_cause {
	u_int16_t code;
	u_int16_t length;
	/* optional cause-specific info may follow */
} __packed;

struct sctp_error_invalid_stream {
	struct sctp_error_cause cause;	/* code=SCTP_ERROR_INVALID_STREAM */
	u_int16_t stream_id;		/* stream id of the DATA in error */
	u_int16_t reserved;
} __packed;

struct sctp_error_missing_param {
	struct sctp_error_cause cause;	/* code=SCTP_ERROR_MISSING_PARAM */
	u_int32_t num_missing_params;	/* number of missing parameters */
	/* u_int16_t param_type's follow */
} __packed;

struct sctp_error_stale_cookie {
	struct sctp_error_cause cause;	/* code=SCTP_ERROR_STALE_COOKIE */
	u_int32_t stale_time;		/* time in usec of staleness */
} __packed;

struct sctp_error_out_of_resource {
	struct sctp_error_cause cause;	/* code=SCTP_ERROR_OUT_OF_RESOURCES */
} __packed;

struct sctp_error_unresolv_addr {
	struct sctp_error_cause cause;	/* code=SCTP_ERROR_UNRESOLVABLE_ADDR */

} __packed;

struct sctp_error_unrecognized_chunk {
	struct sctp_error_cause cause;	/* code=SCTP_ERROR_UNRECOG_CHUNK */
	struct sctp_chunkhdr ch;	/* header from chunk in error */
} __packed;

#define HAVE_SCTP			1
#define HAVE_KERNEL_SCTP		1
#define HAVE_SCTP_PRSCTP		1
#define HAVE_SCTP_ADDIP			1
#define HAVE_SCTP_CANSET_PRIMARY	1
#define HAVE_SCTP_SAT_NETWORK_CAPABILITY1
#define HAVE_SCTP_MULTIBUF              1
#define HAVE_SCTP_NOCONNECT             0
#define HAVE_SCTP_ECN_NONCE             1  /* ECN Nonce option */

/* Main SCTP chunk types, we place
 * these here since that way natd and f/w's
 * in user land can find them.
 */
#define SCTP_DATA		0x00
#define SCTP_INITIATION		0x01
#define SCTP_INITIATION_ACK	0x02
#define SCTP_SELECTIVE_ACK	0x03
#define SCTP_HEARTBEAT_REQUEST	0x04
#define SCTP_HEARTBEAT_ACK	0x05
#define SCTP_ABORT_ASSOCIATION	0x06
#define SCTP_SHUTDOWN		0x07
#define SCTP_SHUTDOWN_ACK	0x08
#define SCTP_OPERATION_ERROR	0x09
#define SCTP_COOKIE_ECHO	0x0a
#define SCTP_COOKIE_ACK		0x0b
#define SCTP_ECN_ECHO		0x0c
#define SCTP_ECN_CWR		0x0d
#define SCTP_SHUTDOWN_COMPLETE	0x0e

/* draft-ietf-tsvwg-addip-sctp */
#define SCTP_ASCONF		0xc1
#define	SCTP_ASCONF_ACK		0x80

/* draft-ietf-stewart-prsctp */
#define SCTP_FORWARD_CUM_TSN	0xc0

/* draft-ietf-stewart-pktdrpsctp */
#define SCTP_PACKET_DROPPED	0x81

/* draft-ietf-stewart-strreset-xxx */
#define SCTP_STREAM_RESET       0x82

/* ABORT and SHUTDOWN COMPLETE FLAG */
#define SCTP_HAD_NO_TCB		0x01

/* Packet dropped flags */
#define SCTP_FROM_MIDDLE_BOX	SCTP_HAD_NO_TCB
#define SCTP_BADCRC		0x02
#define SCTP_PACKET_TRUNCATED	0x04

#define SCTP_SAT_NETWORK_MIN	     400	/* min ms for RTT to set satellite time */
#define SCTP_SAT_NETWORK_BURST_INCR  2		/* how many times to multiply maxburst in sat */
/* Data Chuck Specific Flags */
#define SCTP_DATA_FRAG_MASK	0x03
#define SCTP_DATA_MIDDLE_FRAG	0x00
#define SCTP_DATA_LAST_FRAG	0x01
#define SCTP_DATA_FIRST_FRAG	0x02
#define SCTP_DATA_NOT_FRAG	0x03
#define SCTP_DATA_UNORDERED	0x04

/* ECN Nonce: SACK Chunk Specific Flags */
#define SCTP_SACK_NONCE_SUM     0x01

#include <netinet/sctp_uio.h>

#endif /* !_NETINET_SCTP_H_ */