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