Merge commit '720b16875295d57e0e6a4e0ec32db4d47412f896'
[unleashed.git] / usr / src / uts / common / netinet / sctp.h
blob352466ca80d5b744cba0487a328b6b0f2cb2325b
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _NETINET_SCTP_H
27 #define _NETINET_SCTP_H
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
33 #include <sys/types.h>
36 * This file contains the structure defintions and function prototypes
37 * described in the IETF SCTP socket API document.
40 /* SCTP association ID type. */
41 typedef int sctp_assoc_t;
42 typedef int32_t sctp_assoc32_t;
45 * SCTP socket options
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
65 * Private socket options
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
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.
79 #define SCTP_PRSCTP 23
82 * SCTP socket option used to read per endpoint association statistics.
84 #define SCTP_GET_ASSOC_STATS 24
87 * Ancillary data identifiers
89 #define SCTP_SNDRCV 0x100
90 #define SCTP_INIT 0x101
93 * Notification types
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
104 * SCTP Ancillary Data Definitions
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.
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;
120 * sctp_sndrcvinfo structure specifies SCTP options for sendmsg() and
121 * describes SCTP header information about a received message through
122 * recvmsg().
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;
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 */
142 * Use destination addr passed as parameter, not the association primary one.
144 #define MSG_ADDR_OVER 0x08
146 * This flag when set in sinfo_flags is used alongwith sinfo_timetolive to
147 * implement the "timed reliability" service discussed in RFC 3758.
149 #define MSG_PR_SCTP 0x10
151 * SCTP notification definitions
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.
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;
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
178 * Association flags. This flags is filled in the sac_flags for a SCTP_COMM_UP
179 * event if the association supports PR-SCTP.
181 #define SCTP_PRSCTP_CAPABLE 0x01
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.
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;
198 * The assoc ID can be followed by the ABORT chunk if available.
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.
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;
216 * The assoc ID is followed by the actual error chunk.
221 * Note:
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.
228 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
229 #pragma pack(4)
230 #endif
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
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.
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;
253 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
254 #pragma pack()
255 #endif
257 /* flags used in sctp_send_failed notification. */
258 #define SCTP_DATA_UNSENT 1
259 #define SCTP_DATA_SENT 2
262 * If SCTP cannot deliver a message it may return the message as a
263 * notification using the following structure.
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;
273 * The assoc ID is followed by the failed message.
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.
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;
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.
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;
301 /* Possible values in pdapi_indication for sctp_pdapi_event notification. */
302 #define SCTP_PARTIAL_DELIVERY_ABORTED 1
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.
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;
317 * The sctp_notification structure is defined as the union of all
318 * notification types defined above.
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;
336 * sctp_opt_info() option definitions
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.
344 * The sctp_rtoinfo structure is used to access and modify these
345 * parameters.
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;
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.
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;
369 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
370 #pragma pack(4)
371 #endif
373 /* sctp_paddrinfo reachability state. */
374 #define SCTP_INACTIVE 1
375 #define SCTP_ACTIVE 2
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:
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;
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.
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;
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.
415 struct sctp_setpeerprim {
416 sctp_assoc_t sspp_assoc_id;
417 struct sockaddr_storage sspp_addr;
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.
426 struct sctp_setprim {
427 sctp_assoc_t ssp_assoc_id;
428 struct sockaddr_storage ssp_addr;
431 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
432 #pragma pack()
433 #endif
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
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:
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;
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
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.
484 struct sctp_setadaptation {
485 uint32_t ssb_adaptation_ind;
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.
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;
510 * Private ioctl option structure
512 struct sctpopt {
513 sctp_assoc_t sopt_aid;
514 int sopt_name;
515 uint_t sopt_len;
516 caddr_t sopt_val;
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;
526 #endif /* _SYSCALL32 */
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;
535 * New socket functions for SCTP
538 /* sctp_bindx() operations. */
539 #define SCTP_BINDX_ADD_ADDR 1
540 #define SCTP_BINDX_REM_ADDR 2
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) */
573 * SCTP protocol related elements.
576 /* All SCTP chunks and parameters are 32-bit aligned */
577 #define SCTP_ALIGN 4
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.
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
591 * Data chunk bit manipulations
593 #define SCTP_DATA_EBIT 0x01
594 #define SCTP_TBIT 0x01
595 #define SCTP_DATA_BBIT 0x02
596 #define SCTP_DATA_UBIT 0x04
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)
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)
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;
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;
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;
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;
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;
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;
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;
682 typedef struct sctp_sack_frag {
683 uint16_t ssf_start;
684 uint16_t ssf_end;
685 } sctp_sack_frag_t;
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
711 /* Lengths from SCTP spec */
712 #define PARM_ADDR4_LEN 8
713 #define PARM_ADDR6_LEN 20
715 /* Parameter header */
716 typedef struct sctp_parm_hdr {
717 uint16_t sph_type;
718 uint16_t sph_len;
719 } sctp_parm_hdr_t;
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,
731 * Invalid stream-identifier extended cause.
732 * SCTP_ERR_BAD_SID
734 typedef struct sctp_bsc {
735 uint16_t bsc_sid;
736 uint16_t bsc_pad; /* RESV = 0 */
737 } sctp_bsc_t;
740 * Missing parameter extended cause, currently
741 * only one missing parameter is supported.
742 * SCTP_ERR_MISSING_PARM
744 typedef struct sctp_mpc {
745 uint32_t mpc_num;
746 uint16_t mpc_param;
747 uint16_t mpc_pad;
748 } sctp_mpc_t;
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
770 * Extensions
773 /* Extended Chunk Types */
774 #define CHUNK_ASCONF 0xc1
775 #define CHUNK_ASCONF_ACK 0x80
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
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;
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;
798 #ifdef __cplusplus
800 #endif
802 #endif /* _NETINET_SCTP_H */