xref: /illumos-gate/usr/src/uts/common/netinet/sctp.h (revision 9f13099e)
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
30 extern "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. */
41 typedef int	sctp_assoc_t;
42 typedef 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  */
112 struct 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  */
124 struct 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  */
159 struct 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  */
188 struct 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  */
209 struct 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  */
243 struct 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  */
265 struct 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  */
281 struct 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  */
293 struct 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  */
308 struct 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  */
320 union 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  */
347 struct 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  */
360 struct 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  */
384 struct 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  */
402 struct 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  */
415 struct 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  */
426 struct 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  */
455 struct 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  */
484 struct 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  */
493 typedef 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  */
512 struct 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)
520 struct 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. */
529 typedef 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__
544 extern int sctp_bindx(int, void *, int, int);
545 extern void sctp_freeladdrs(void *);
546 extern void sctp_freepaddrs(void *);
547 extern int sctp_getladdrs(int, sctp_assoc_t, void **);
548 extern int sctp_getpaddrs(int, sctp_assoc_t, void **);
549 extern int sctp_opt_info(int, sctp_assoc_t, int, void *, socklen_t *);
550 extern int sctp_peeloff(int, sctp_assoc_t);
551 extern ssize_t sctp_recvmsg(int, void *, size_t, struct sockaddr *,
552     socklen_t *, struct sctp_sndrcvinfo *, int *msg_flags);
553 extern ssize_t sctp_send(int, const void *, size_t,
554     const struct sctp_sndrcvinfo *, int);
555 extern 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__ */
558 extern int sctp_bindx();
559 extern void sctp_freeladdrs();
560 extern void sctp_freepaddrs();
561 extern int sctp_getladdrs();
562 extern int sctp_getpaddrs();
563 extern int sctp_opt_info();
564 extern int sctp_peeloff();
565 extern ssize_t sctp_recvmsg();
566 extern ssize_t sctp_send();
567 extern 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 */
609 typedef 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 */
617 typedef 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 */
639 typedef 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 */
646 typedef 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 */
655 typedef 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 */
663 typedef 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 
675 typedef 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 
682 typedef 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 */
716 typedef 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  */
734 typedef 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  */
744 typedef 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 
784 typedef 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 
791 typedef 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