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