1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_NETINET_SCTP_H
27#define	_NETINET_SCTP_H
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33#include <sys/types.h>
34
35/*
36 * This file contains the structure defintions and function prototypes
37 * described in the IETF SCTP socket API document.
38 */
39
40/* SCTP association ID type. */
41typedef int	sctp_assoc_t;
42typedef int32_t	sctp_assoc32_t;
43
44/*
45 * SCTP socket options
46 */
47#define	SCTP_RTOINFO			1
48#define	SCTP_ASSOCINFO			2
49#define	SCTP_INITMSG			3
50#define	SCTP_NODELAY			4
51#define	SCTP_AUTOCLOSE			5
52#define	SCTP_SET_PEER_PRIMARY_ADDR	6
53#define	SCTP_PRIMARY_ADDR		7
54#define	SCTP_ADAPTATION_LAYER		8
55#define	SCTP_DISABLE_FRAGMENTS		9
56#define	SCTP_PEER_ADDR_PARAMS		10
57#define	SCTP_DEFAULT_SEND_PARAM		11
58#define	SCTP_EVENTS			12
59#define	SCTP_I_WANT_MAPPED_V4_ADDR	13
60#define	SCTP_MAXSEG			14
61#define	SCTP_STATUS			15
62#define	SCTP_GET_PEER_ADDR_INFO		16
63
64/*
65 * Private socket options
66 */
67#define	SCTP_GET_NLADDRS		17
68#define	SCTP_GET_LADDRS			18
69#define	SCTP_GET_NPADDRS		19
70#define	SCTP_GET_PADDRS			20
71#define	SCTP_ADD_ADDR			21
72#define	SCTP_REM_ADDR			22
73
74/*
75 * Additional SCTP socket options. This socket option is used to enable or
76 * disable PR-SCTP support prior to establishing an association. By default,
77 * PR-SCTP support is disabled.
78 */
79#define	SCTP_PRSCTP			23
80
81/*
82 * SCTP socket option used to read per endpoint association statistics.
83 */
84#define	SCTP_GET_ASSOC_STATS		24
85
86/*
87 * Ancillary data identifiers
88 */
89#define	SCTP_SNDRCV		0x100
90#define	SCTP_INIT		0x101
91
92/*
93 * Notification types
94 */
95#define	SCTP_ASSOC_CHANGE		1
96#define	SCTP_PEER_ADDR_CHANGE		2
97#define	SCTP_REMOTE_ERROR		3
98#define	SCTP_SEND_FAILED		4
99#define	SCTP_SHUTDOWN_EVENT		5
100#define	SCTP_ADAPTATION_INDICATION	6
101#define	SCTP_PARTIAL_DELIVERY_EVENT	7
102
103/*
104 * SCTP Ancillary Data Definitions
105 */
106
107/*
108 * sctp_initmsg structure provides information for initializing new SCTP
109 * associations with sendmsg().  The SCTP_INITMSG socket option uses
110 * this same data structure.
111 */
112struct sctp_initmsg {
113	uint16_t	sinit_num_ostreams;
114	uint16_t	sinit_max_instreams;
115	uint16_t	sinit_max_attempts;
116	uint16_t	sinit_max_init_timeo;
117};
118
119/*
120 * sctp_sndrcvinfo structure specifies SCTP options for sendmsg() and
121 * describes SCTP header information about a received message through
122 * recvmsg().
123 */
124struct sctp_sndrcvinfo {
125	uint16_t	sinfo_stream;
126	uint16_t	sinfo_ssn;
127	uint16_t	sinfo_flags;
128	uint32_t	sinfo_ppid;
129	uint32_t	sinfo_context;
130	uint32_t	sinfo_timetolive;
131	uint32_t	sinfo_tsn;
132	uint32_t	sinfo_cumtsn;
133	sctp_assoc_t	sinfo_assoc_id;
134};
135
136/* sinfo_flags */
137#define	MSG_UNORDERED	0x01		/* Unordered data */
138#define	MSG_ABORT	0x02		/* Abort the connection */
139#define	MSG_EOF		0x04		/* Shutdown the connection */
140
141/*
142 * Use destination addr passed as parameter, not the association primary one.
143 */
144#define	MSG_ADDR_OVER	0x08
145/*
146 * This flag when set in sinfo_flags is used alongwith sinfo_timetolive to
147 * implement the "timed reliability" service discussed in RFC 3758.
148 */
149#define	MSG_PR_SCTP	0x10
150/*
151 * SCTP notification definitions
152 */
153
154/*
155 * To receive any ancillary data or notifications, the application can
156 * register it's interest by calling the SCTP_EVENTS setsockopt() with
157 * the sctp_event_subscribe structure.
158 */
159struct sctp_event_subscribe {
160	uint8_t	sctp_data_io_event;
161	uint8_t sctp_association_event;
162	uint8_t sctp_address_event;
163	uint8_t sctp_send_failure_event;
164	uint8_t sctp_peer_error_event;
165	uint8_t sctp_shutdown_event;
166	uint8_t sctp_partial_delivery_event;
167	uint8_t sctp_adaptation_layer_event;
168};
169
170/* Association events used in sctp_assoc_change structure */
171#define	SCTP_COMM_UP		0
172#define	SCTP_COMM_LOST		1
173#define	SCTP_RESTART		2
174#define	SCTP_SHUTDOWN_COMP	3
175#define	SCTP_CANT_STR_ASSOC	4
176
177/*
178 * Association flags. This flags is filled in the sac_flags for a SCTP_COMM_UP
179 * event if the association supports PR-SCTP.
180 */
181#define	SCTP_PRSCTP_CAPABLE	0x01
182
183/*
184 * sctp_assoc_change notification informs the socket that an SCTP association
185 * has either begun or ended.  The identifier for a new association is
186 * provided by this notification.
187 */
188struct sctp_assoc_change {
189	uint16_t	sac_type;
190	uint16_t	sac_flags;
191	uint32_t	sac_length;
192	uint16_t	sac_state;
193	uint16_t	sac_error;
194	uint16_t	sac_outbound_streams;
195	uint16_t	sac_inbound_streams;
196	sctp_assoc_t	sac_assoc_id;
197	/*
198	 * The assoc ID can be followed by the ABORT chunk if available.
199	 */
200};
201
202/*
203 * A remote peer may send an Operational Error message to its peer. This
204 * message indicates a variety of error conditions on an association.
205 * The entire ERROR chunk as it appears on the wire is included in a
206 * SCTP_REMOTE_ERROR event.  Refer to the SCTP specification RFC2960
207 * and any extensions for a list of possible error formats.
208 */
209struct sctp_remote_error {
210	uint16_t	sre_type;
211	uint16_t	sre_flags;
212	uint32_t	sre_length;
213	uint16_t	sre_error;
214	sctp_assoc_t	sre_assoc_id;
215	/*
216	 * The assoc ID is followed by the actual error chunk.
217	 */
218};
219
220/*
221 * Note:
222 *
223 * In order to keep the offsets and size of the structure having a
224 * struct sockaddr_storage field the same between a 32-bit application
225 * and a 64-bit amd64 kernel, we use a #pragma pack(4) for those
226 * structures.
227 */
228#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
229#pragma pack(4)
230#endif
231
232/* Address change event state */
233#define	SCTP_ADDR_AVAILABLE	0
234#define	SCTP_ADDR_UNREACHABLE	1
235#define	SCTP_ADDR_REMOVED	2
236#define	SCTP_ADDR_ADDED		3
237#define	SCTP_ADDR_MADE_PRIM	4
238
239/*
240 * When a destination address on a multi-homed peer encounters a change,
241 * an interface details event, sctp_paddr_change, is sent to the socket.
242 */
243struct sctp_paddr_change {
244	uint16_t	spc_type;
245	uint16_t	spc_flags;
246	uint32_t	spc_length;
247	struct sockaddr_storage spc_aaddr;
248	int		spc_state;
249	int		spc_error;
250	sctp_assoc_t	spc_assoc_id;
251};
252
253#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
254#pragma pack()
255#endif
256
257/* flags used in sctp_send_failed notification. */
258#define	SCTP_DATA_UNSENT	1
259#define	SCTP_DATA_SENT		2
260
261/*
262 * If SCTP cannot deliver a message it may return the message as a
263 * notification using the following structure.
264 */
265struct sctp_send_failed {
266	uint16_t	ssf_type;
267	uint16_t	ssf_flags;
268	uint32_t	ssf_length;
269	uint32_t	ssf_error;
270	struct sctp_sndrcvinfo ssf_info;
271	sctp_assoc_t	ssf_assoc_id;
272	/*
273	 * The assoc ID is followed by the failed message.
274	 */
275};
276
277/*
278 * When a peer sends a SHUTDOWN, SCTP delivers the sctp_shutdown_event
279 * notification to inform the socket user that it should cease sending data.
280 */
281struct sctp_shutdown_event {
282	uint16_t	sse_type;
283	uint16_t	sse_flags;
284	uint16_t	sse_length;
285	sctp_assoc_t	sse_assoc_id;
286};
287
288/*
289 * When a peer sends an Adaptation Layer Indication parameter, SCTP
290 * delivers the sctp_adaptation_event notification to inform the socket
291 * user the peer's requested adaptation layer.
292 */
293struct sctp_adaptation_event {
294	uint16_t	sai_type;
295	uint16_t	sai_flags;
296	uint32_t	sai_length;
297	uint32_t	sai_adaptation_ind;
298	sctp_assoc_t	sai_assoc_id;
299};
300
301/* Possible values in pdapi_indication for sctp_pdapi_event notification. */
302#define	SCTP_PARTIAL_DELIVERY_ABORTED	1
303
304/*
305 * When a receiver is engaged in a partial delivery of a message the
306 * sctp_pdapi_event notification is used to indicate various events.
307 */
308struct sctp_pdapi_event {
309	uint16_t	pdapi_type;
310	uint16_t	pdapi_flags;
311	uint32_t	pdapi_length;
312	uint32_t	pdapi_indication;
313	sctp_assoc_t	pdapi_assoc_id;
314};
315
316/*
317 * The sctp_notification structure is defined as the union of all
318 * notification types defined above.
319 */
320union sctp_notification {
321	struct {
322		uint16_t		sn_type; /* Notification type. */
323		uint16_t		sn_flags;
324		uint32_t		sn_length;
325	} sn_header;
326	struct sctp_assoc_change	sn_assoc_change;
327	struct sctp_paddr_change	sn_paddr_change;
328	struct sctp_remote_error	sn_remote_error;
329	struct sctp_send_failed		sn_send_failed;
330	struct sctp_shutdown_event	sn_shutdown_event;
331	struct sctp_adaptation_event	sn_adaptation_event;
332	struct sctp_pdapi_event		sn_pdapi_event;
333};
334
335/*
336 * sctp_opt_info() option definitions
337 */
338
339/*
340 * The protocol parameters used to initialize and bound retransmission
341 * timeout (RTO) are tunable.  See RFC2960 for more information on
342 * how these parameters are used in RTO calculation.
343 *
344 * The sctp_rtoinfo structure is used to access and modify these
345 * parameters.
346 */
347struct sctp_rtoinfo {
348	sctp_assoc_t	srto_assoc_id;
349	uint32_t	srto_initial;
350	uint32_t	srto_max;
351	uint32_t	srto_min;
352};
353
354/*
355 * The sctp_assocparams option is used to both examine and set various
356 * association and endpoint parameters.  See RFC2960 for more information
357 * on how this parameter is used.  The peer address parameter is ignored
358 * for one-to-one style socket.
359 */
360struct sctp_assocparams {
361	sctp_assoc_t	sasoc_assoc_id;
362	uint16_t	sasoc_asocmaxrxt;
363	uint16_t	sasoc_number_peer_destinations;
364	uint32_t	sasoc_peer_rwnd;
365	uint32_t	sasoc_local_rwnd;
366	uint32_t	sasoc_cookie_life;
367};
368
369#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
370#pragma pack(4)
371#endif
372
373/* sctp_paddrinfo reachability state. */
374#define	SCTP_INACTIVE	1
375#define	SCTP_ACTIVE	2
376
377/*
378 * Applications can retrieve information about a specific peer address
379 * of an association, including its reachability state, congestion
380 * window, and retransmission timer values.  This information is
381 * read-only. The sctp_paddrinfo structure is used to access this
382 * information:
383 */
384struct sctp_paddrinfo {
385	sctp_assoc_t	spinfo_assoc_id;
386	struct sockaddr_storage spinfo_address;
387	int32_t		spinfo_state;
388	uint32_t	spinfo_cwnd;
389	uint32_t	spinfo_srtt;
390	uint32_t	spinfo_rto;
391	uint32_t	spinfo_mtu;
392};
393
394/*
395 * Applications can enable or disable heartbeats for any peer address of
396 * an association, modify an address's heartbeat interval, force a
397 * heartbeat to be sent immediately, and adjust the address's maximum
398 * number of retransmissions sent before an address is considered
399 * unreachable.  The sctp_paddrparams structure is used to access and modify
400 * an address' parameters.
401 */
402struct sctp_paddrparams {
403	sctp_assoc_t		spp_assoc_id;
404	struct sockaddr_storage	spp_address;
405	uint32_t		spp_hbinterval;
406	uint16_t		spp_pathmaxrxt;
407};
408
409/*
410 * A socket user can request that the peer mark the enclosed address as the
411 * association's primary.  The enclosed address must be one of the
412 * association's locally bound addresses. The sctp_setpeerprim structure is
413 * used to make such request.
414 */
415struct sctp_setpeerprim {
416	sctp_assoc_t		sspp_assoc_id;
417	struct sockaddr_storage	sspp_addr;
418};
419
420/*
421 * A socket user can request that the local SCTP stack use the enclosed peer
422 * address as the association primary.  The enclosed address must be one of
423 * the association peer's addresses.  The sctp_setprim structure is used to
424 * make such request.
425 */
426struct sctp_setprim {
427	sctp_assoc_t		ssp_assoc_id;
428	struct sockaddr_storage	ssp_addr;
429};
430
431#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
432#pragma pack()
433#endif
434
435/* SCTP association states */
436#define	SCTPS_IDLE		-5	/* idle (opened, but not bound) */
437#define	SCTPS_BOUND		-4	/* bound, ready to connect or accept */
438#define	SCTPS_LISTEN		-3	/* listening for connection */
439#define	SCTPS_COOKIE_WAIT	-2
440#define	SCTPS_COOKIE_ECHOED	-1
441/* states < SCTPS_ESTABLISHED are those where connections not established */
442#define	SCTPS_ESTABLISHED	0	/* established */
443#define	SCTPS_SHUTDOWN_PENDING	1
444#define	SCTPS_SHUTDOWN_SENT	2
445#define	SCTPS_SHUTDOWN_RECEIVED	3
446#define	SCTPS_SHUTDOWN_ACK_SENT	4
447
448/*
449 * Applications can retrieve current status information about an
450 * association, including association state, peer receiver window size,
451 * number of unacked data chunks, and number of data chunks pending
452 * receipt.  This information is read-only.  The sctp_status structure is
453 * used to access this information:
454 */
455struct sctp_status {
456	sctp_assoc_t		sstat_assoc_id;
457	int32_t			sstat_state;
458	uint32_t		sstat_rwnd;
459	uint16_t		sstat_unackdata;
460	uint16_t		sstat_penddata;
461	uint16_t		sstat_instrms;
462	uint16_t		sstat_outstrms;
463	uint32_t		sstat_fragmentation_point;
464	struct sctp_paddrinfo	sstat_primary;
465};
466
467/* Possible values for sstat_state */
468#define	SCTP_CLOSED		SCTPS_IDLE
469#define	SCTP_BOUND		SCTPS_BOUND
470#define	SCTP_LISTEN		SCTPS_LISTEN
471#define	SCTP_COOKIE_WAIT	SCTPS_COOKIE_WAIT
472#define	SCTP_COOKIE_ECHOED	SCTPS_COOKIE_ECHOED
473#define	SCTP_ESTABLISHED	SCTPS_ESTABLISHED
474#define	SCTP_SHUTDOWN_PENDING	SCTPS_SHUTDOWN_PENDING
475#define	SCTP_SHUTDOWN_SENT	SCTPS_SHUTDOWN_SENT
476#define	SCTP_SHUTDOWN_RECEIVED	SCTPS_SHUTDOWN_RECEIVED
477#define	SCTP_SHUTDOWN_ACK_SENT	SCTPS_SHUTDOWN_ACK_SENT
478
479/*
480 * A socket user can request that the local endpoint set the specified
481 * Adaptation Layer Indication parameter for all future INIT and INIT-ACK
482 * exchanges.  The sctp_setadaptation structure is used to make such request.
483 */
484struct sctp_setadaptation {
485	uint32_t   ssb_adaptation_ind;
486};
487
488/*
489 * A socket user request reads local per endpoint association stats.
490 * All stats are counts except sas_maxrto, which is the max value
491 * since the last user request for stats on this endpoint.
492 */
493typedef struct sctp_assoc_stats {
494	uint64_t	sas_rtxchunks; /* Retransmitted Chunks */
495	uint64_t	sas_gapcnt; /* Gap Acknowledgements Received */
496	uint64_t	sas_maxrto; /* Maximum Observed RTO this period */
497	uint64_t	sas_outseqtsns; /* TSN received > next expected */
498	uint64_t	sas_osacks; /* SACKs sent */
499	uint64_t	sas_isacks; /* SACKs received */
500	uint64_t	sas_octrlchunks; /* Control chunks sent - no dups */
501	uint64_t	sas_ictrlchunks; /* Control chunks received - no dups */
502	uint64_t	sas_oodchunks; /* Ordered data chunks sent */
503	uint64_t	sas_iodchunks; /* Ordered data chunks received */
504	uint64_t	sas_ouodchunks; /* Unordered data chunks sent */
505	uint64_t	sas_iuodchunks; /* Unordered data chunks received */
506	uint64_t	sas_idupchunks; /* Dups received (ordered+unordered) */
507} sctp_assoc_stats_t;
508
509/*
510 * Private ioctl option structure
511 */
512struct sctpopt {
513	sctp_assoc_t	sopt_aid;
514	int		sopt_name;
515	uint_t		sopt_len;
516	caddr_t		sopt_val;
517};
518
519#if defined(_SYSCALL32)
520struct sctpopt32 {
521	sctp_assoc32_t	sopt_aid;
522	int32_t		sopt_name;
523	uint32_t	sopt_len;
524	caddr32_t	sopt_val;
525};
526#endif	/* _SYSCALL32 */
527
528/* Forward Cumulative TSN chunk entry. */
529typedef struct ftsn_entry_s {
530	uint16_t	ftsn_sid;
531	uint16_t	ftsn_ssn;
532} ftsn_entry_t;
533
534/*
535 * New socket functions for SCTP
536 */
537
538/* sctp_bindx() operations. */
539#define	SCTP_BINDX_ADD_ADDR	1
540#define	SCTP_BINDX_REM_ADDR	2
541
542#if !defined(_KERNEL) || defined(_BOOT)
543#ifdef	__STDC__
544extern int sctp_bindx(int, void *, int, int);
545extern void sctp_freeladdrs(void *);
546extern void sctp_freepaddrs(void *);
547extern int sctp_getladdrs(int, sctp_assoc_t, void **);
548extern int sctp_getpaddrs(int, sctp_assoc_t, void **);
549extern int sctp_opt_info(int, sctp_assoc_t, int, void *, socklen_t *);
550extern int sctp_peeloff(int, sctp_assoc_t);
551extern ssize_t sctp_recvmsg(int, void *, size_t, struct sockaddr *,
552    socklen_t *, struct sctp_sndrcvinfo *, int *msg_flags);
553extern ssize_t sctp_send(int, const void *, size_t,
554    const struct sctp_sndrcvinfo *, int);
555extern ssize_t sctp_sendmsg(int, const void *, size_t, const struct sockaddr *,
556    socklen_t, uint32_t, uint32_t, uint16_t, uint32_t, uint32_t);
557#else	/* __STDC__ */
558extern int sctp_bindx();
559extern void sctp_freeladdrs();
560extern void sctp_freepaddrs();
561extern int sctp_getladdrs();
562extern int sctp_getpaddrs();
563extern int sctp_opt_info();
564extern int sctp_peeloff();
565extern ssize_t sctp_recvmsg();
566extern ssize_t sctp_send();
567extern ssize_t sctp_sendmsg();
568#endif	/* __STDC__ */
569#endif	/* !defined(_KERNEL) || defined(_BOOT) */
570
571
572/*
573 * SCTP protocol related elements.
574 */
575
576/* All SCTP chunks and parameters are 32-bit aligned */
577#define	SCTP_ALIGN	4
578
579/*
580 * SCTP association optional parameter handling. The top two bits
581 * of the parameter type define how this and further parameters in
582 * the received chunk should be handled.
583 */
584#define	SCTP_UNREC_PARAM_MASK	0xc000
585/* Continue processing parameters after an unrecognized optional param? */
586#define	SCTP_CONT_PROC_PARAMS	0x8000
587/* Report this unreconized optional parameter or silently ignore it? */
588#define	SCTP_REPORT_THIS_PARAM	0x4000
589
590/*
591 * Data chunk bit manipulations
592 */
593#define	SCTP_DATA_EBIT	0x01
594#define	SCTP_TBIT	0x01
595#define	SCTP_DATA_BBIT	0x02
596#define	SCTP_DATA_UBIT	0x04
597
598#define	SCTP_DATA_GET_BBIT(sdc)	((sdc)->sdh_flags & SCTP_DATA_BBIT)
599#define	SCTP_GET_TBIT(cp)	((cp)->sch_flags & SCTP_TBIT)
600#define	SCTP_DATA_GET_EBIT(sdc)	((sdc)->sdh_flags & SCTP_DATA_EBIT)
601#define	SCTP_DATA_GET_UBIT(sdc)	((sdc)->sdh_flags & SCTP_DATA_UBIT)
602
603#define	SCTP_DATA_SET_BBIT(sdc)	((sdc)->sdh_flags |= SCTP_DATA_BBIT)
604#define	SCTP_SET_TBIT(cp)	((cp)->sch_flags |= SCTP_TBIT)
605#define	SCTP_DATA_SET_EBIT(sdc)	((sdc)->sdh_flags |= SCTP_DATA_EBIT)
606#define	SCTP_DATA_SET_UBIT(sdc)	((sdc)->sdh_flags |=  SCTP_DATA_UBIT)
607
608/* SCTP common header */
609typedef struct sctp_hdr {
610	uint16_t	sh_sport;
611	uint16_t	sh_dport;
612	uint32_t	sh_verf;
613	uint32_t	sh_chksum;
614} sctp_hdr_t;
615
616/* Chunk IDs */
617typedef enum {
618	CHUNK_DATA,
619	CHUNK_INIT,
620	CHUNK_INIT_ACK,
621	CHUNK_SACK,
622	CHUNK_HEARTBEAT,
623	CHUNK_HEARTBEAT_ACK,
624	CHUNK_ABORT,
625	CHUNK_SHUTDOWN,
626	CHUNK_SHUTDOWN_ACK,
627	CHUNK_ERROR,
628	CHUNK_COOKIE,
629	CHUNK_COOKIE_ACK,
630	CHUNK_ECNE,
631	CHUNK_CWR,
632	CHUNK_SHUTDOWN_COMPLETE,
633	CHUNK_ASCONF_ACK = 128,
634	CHUNK_FORWARD_TSN = 192,
635	CHUNK_ASCONF = 193
636} sctp_chunk_id_t;
637
638/* Common chunk header */
639typedef struct sctp_chunk_hdr {
640	uint8_t		sch_id;
641	uint8_t		sch_flags;
642	uint16_t	sch_len;
643} sctp_chunk_hdr_t;
644
645/* INIT chunk data definition */
646typedef struct sctp_init_chunk {
647	uint32_t	sic_inittag;
648	uint32_t	sic_a_rwnd;
649	uint16_t	sic_outstr;
650	uint16_t	sic_instr;
651	uint32_t	sic_inittsn;
652} sctp_init_chunk_t;
653
654/* SCTP DATA chunk */
655typedef struct sctp_data_chunk {
656	uint32_t	sdc_tsn;
657	uint16_t	sdc_sid;
658	uint16_t	sdc_ssn;
659	uint32_t	sdc_payload_id;
660} sctp_data_chunk_t;
661
662/* sctp_data_hdr includes the SCTP chunk hdr and the DATA chunk */
663typedef struct sctp_data_hdr {
664	sctp_chunk_hdr_t	sdh_chdr;
665	sctp_data_chunk_t	sdh_data;
666#define	sdh_id		sdh_chdr.sch_id
667#define	sdh_flags	sdh_chdr.sch_flags
668#define	sdh_len		sdh_chdr.sch_len
669#define	sdh_tsn		sdh_data.sdc_tsn
670#define	sdh_sid		sdh_data.sdc_sid
671#define	sdh_ssn		sdh_data.sdc_ssn
672#define	sdh_payload_id	sdh_data.sdc_payload_id
673} sctp_data_hdr_t;
674
675typedef struct sctp_sack_chunk {
676	uint32_t	ssc_cumtsn;
677	uint32_t	ssc_a_rwnd;
678	uint16_t	ssc_numfrags;
679	uint16_t	ssc_numdups;
680} sctp_sack_chunk_t;
681
682typedef struct sctp_sack_frag {
683	uint16_t	ssf_start;
684	uint16_t	ssf_end;
685} sctp_sack_frag_t;
686
687/* Parameter types */
688#define	PARM_UNKNOWN		0
689#define	PARM_HBINFO		1
690#define	PARM_ADDR4		5
691#define	PARM_ADDR6		6
692#define	PARM_COOKIE		7
693#define	PARM_UNRECOGNIZED	8
694#define	PARM_COOKIE_PRESERVE	9
695#define	PARM_ADDR_HOST_NAME	11
696#define	PARM_SUPP_ADDRS		12
697#define	PARM_ECN		0x8000
698#define	PARM_ECN_CAPABLE	PARM_ECN
699#define	PARM_FORWARD_TSN	0xc000
700#define	PARM_ADD_IP		0xc001
701#define	PARM_DEL_IP		0xc002
702#define	PARM_ERROR_IND		0xc003
703#define	PARM_ASCONF_ERROR	PARM_ERROR_IND
704#define	PARM_SET_PRIMARY	0xc004
705#define	PARM_PRIMARY_ADDR	PARM_SET_PRIMARY
706#define	PARM_SUCCESS		0xc005
707#define	PARM_ASCONF_SUCCESS	PARM_SUCCESS
708#define	PARM_ADAPT_LAYER_IND	0xc006
709
710
711/* Lengths from SCTP spec */
712#define	PARM_ADDR4_LEN		8
713#define	PARM_ADDR6_LEN		20
714
715/* Parameter header */
716typedef struct sctp_parm_hdr {
717	uint16_t	sph_type;
718	uint16_t	sph_len;
719} sctp_parm_hdr_t;
720
721/*
722 * The following extend sctp_parm_hdr_t
723 * with cause-specfic content used to fill
724 * CAUSE blocks in ABORT or ERROR chunks.
725 * The overall size of the CAUSE block will
726 * be sizeof (sctp_parm_hdr_t) plus the size
727 * of the extended cause structure,
728 */
729
730/*
731 * Invalid stream-identifier extended cause.
732 * SCTP_ERR_BAD_SID
733 */
734typedef struct sctp_bsc {
735	uint16_t	bsc_sid;
736	uint16_t	bsc_pad; /* RESV = 0 */
737} sctp_bsc_t;
738
739/*
740 * Missing parameter extended cause, currently
741 * only one missing parameter is supported.
742 * SCTP_ERR_MISSING_PARM
743 */
744typedef struct sctp_mpc {
745	uint32_t	mpc_num;
746	uint16_t	mpc_param;
747	uint16_t	mpc_pad;
748} sctp_mpc_t;
749
750/* Error causes */
751#define	SCTP_ERR_UNKNOWN		0
752#define	SCTP_ERR_BAD_SID		1
753#define	SCTP_ERR_MISSING_PARM		2
754#define	SCTP_ERR_STALE_COOKIE		3
755#define	SCTP_ERR_NO_RESOURCES		4
756#define	SCTP_ERR_BAD_ADDR		5
757#define	SCTP_ERR_UNREC_CHUNK		6
758#define	SCTP_ERR_BAD_MANDPARM		7
759#define	SCTP_ERR_UNREC_PARM		8
760#define	SCTP_ERR_NO_USR_DATA		9
761#define	SCTP_ERR_COOKIE_SHUT		10
762#define	SCTP_ERR_RESTART_NEW_ADDRS	11
763#define	SCTP_ERR_USER_ABORT		12
764#define	SCTP_ERR_DELETE_LASTADDR	256
765#define	SCTP_ERR_RESOURCE_SHORTAGE	257
766#define	SCTP_ERR_DELETE_SRCADDR		258
767#define	SCTP_ERR_AUTH_ERR		260
768
769/*
770 * Extensions
771 */
772
773/* Extended Chunk Types */
774#define	CHUNK_ASCONF		0xc1
775#define	CHUNK_ASCONF_ACK	0x80
776
777/* Extension Error Causes */
778#define	SCTP_ERR_DEL_LAST_ADDR	0x0100
779#define	SCTP_ERR_RES_SHORTAGE	0x0101
780#define	SCTP_ERR_DEL_SRC_ADDR	0x0102
781#define	SCTP_ERR_ILLEGAL_ACK	0x0103
782#define	SCTP_ERR_UNAUTHORIZED	0x0104
783
784typedef struct sctp_addip4 {
785	sctp_parm_hdr_t		sad4_addip_ph;
786	uint32_t		asconf_req_cid;
787	sctp_parm_hdr_t		sad4_addr4_ph;
788	ipaddr_t		sad4_addr;
789} sctp_addip4_t;
790
791typedef struct sctp_addip6 {
792	sctp_parm_hdr_t		sad6_addip_ph;
793	uint32_t		asconf_req_cid;
794	sctp_parm_hdr_t		sad6_addr6_ph;
795	in6_addr_t		sad6_addr;
796} sctp_addip6_t;
797
798#ifdef __cplusplus
799}
800#endif
801
802#endif	/* _NETINET_SCTP_H */
803