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