sctp_uio.h revision 163996
1/*- 2 * Copyright (c) 2001-2006, Cisco Systems, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * 7 * a) Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * 10 * b) Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the distribution. 13 * 14 * c) Neither the name of Cisco Systems, Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 20 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 28 * THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31/* $KAME: sctp_uio.h,v 1.11 2005/03/06 16:04:18 itojun Exp $ */ 32#include <sys/cdefs.h> 33__FBSDID("$FreeBSD: head/sys/netinet/sctp_uio.h 163996 2006-11-05 13:25:18Z rrs $"); 34 35#ifndef __sctp_uio_h__ 36#define __sctp_uio_h__ 37 38 39 40 41#if ! defined(_KERNEL) 42#include <stdint.h> 43#endif 44#include <sys/types.h> 45#include <sys/socket.h> 46 47typedef uint32_t sctp_assoc_t; 48 49/* On/Off setup for subscription to events */ 50struct sctp_event_subscribe { 51 uint8_t sctp_data_io_event; 52 uint8_t sctp_association_event; 53 uint8_t sctp_address_event; 54 uint8_t sctp_send_failure_event; 55 uint8_t sctp_peer_error_event; 56 uint8_t sctp_shutdown_event; 57 uint8_t sctp_partial_delivery_event; 58 uint8_t sctp_adaptation_layer_event; 59 uint8_t sctp_authentication_event; 60 uint8_t sctp_stream_reset_events; 61}; 62 63/* ancillary data types */ 64#define SCTP_INIT 0x0001 65#define SCTP_SNDRCV 0x0002 66#define SCTP_EXTRCV 0x0003 67/* 68 * ancillary data structures 69 */ 70struct sctp_initmsg { 71 uint32_t sinit_num_ostreams; 72 uint32_t sinit_max_instreams; 73 uint16_t sinit_max_attempts; 74 uint16_t sinit_max_init_timeo; 75}; 76 77/* We add 96 bytes to the size of sctp_sndrcvinfo. 78 * This makes the current structure 128 bytes long 79 * which is nicely 64 bit aligned but also has room 80 * for us to add more and keep ABI compatability. 81 * For example, already we have the sctp_extrcvinfo 82 * when enabled which is 48 bytes. 83 */ 84 85#define SCTP_ALIGN_RESV_PAD 96 86 87struct sctp_sndrcvinfo { 88 uint16_t sinfo_stream; 89 uint16_t sinfo_ssn; 90 uint16_t sinfo_flags; 91 uint32_t sinfo_ppid; 92 uint32_t sinfo_context; 93 uint32_t sinfo_timetolive; 94 uint32_t sinfo_tsn; 95 uint32_t sinfo_cumtsn; 96 sctp_assoc_t sinfo_assoc_id; 97 uint8_t __reserve_pad[SCTP_ALIGN_RESV_PAD]; 98}; 99 100struct sctp_extrcvinfo { 101 uint16_t sinfo_stream; 102 uint16_t sinfo_ssn; 103 uint16_t sinfo_flags; 104 uint32_t sinfo_ppid; 105 uint32_t sinfo_context; 106 uint32_t sinfo_timetolive; 107 uint32_t sinfo_tsn; 108 uint32_t sinfo_cumtsn; 109 sctp_assoc_t sinfo_assoc_id; 110 uint16_t next_flags; 111 uint16_t next_stream; 112 uint32_t next_asocid; 113 uint32_t next_length; 114 uint32_t next_ppid; 115}; 116 117#define SCTP_NO_NEXT_MSG 0x0000 118#define SCTP_NEXT_MSG_AVAIL 0x0001 119#define SCTP_NEXT_MSG_ISCOMPLETE 0x0002 120#define SCTP_NEXT_MSG_IS_UNORDERED 0x0004 121 122struct sctp_snd_all_completes { 123 uint16_t sall_stream; 124 uint16_t sall_flags; 125 uint32_t sall_ppid; 126 uint32_t sall_context; 127 uint32_t sall_num_sent; 128 uint32_t sall_num_failed; 129}; 130 131/* Flags that go into the sinfo->sinfo_flags field */ 132#define SCTP_EOF 0x0100/* Start shutdown procedures */ 133#define SCTP_ABORT 0x0200/* Send an ABORT to peer */ 134#define SCTP_UNORDERED 0x0400/* Message is un-ordered */ 135#define SCTP_ADDR_OVER 0x0800/* Override the primary-address */ 136#define SCTP_SENDALL 0x1000/* Send this on all associations */ 137#define SCTP_EOR 0x2000/* end of message signal */ 138/* for the endpoint */ 139 140/* The lower byte is an enumeration of PR-SCTP policies */ 141#define SCTP_PR_SCTP_TTL 0x0001/* Time based PR-SCTP */ 142#define SCTP_PR_SCTP_BUF 0x0002/* Buffer based PR-SCTP */ 143#define SCTP_PR_SCTP_RTX 0x0003/* Number of retransmissions based PR-SCTP */ 144 145#define PR_SCTP_POLICY(x) ((x) & 0xff) 146#define PR_SCTP_ENABLED(x) (PR_SCTP_POLICY(x) != 0) 147#define PR_SCTP_TTL_ENABLED(x) (PR_SCTP_POLICY(x) == SCTP_PR_SCTP_TTL) 148#define PR_SCTP_BUF_ENABLED(x) (PR_SCTP_POLICY(x) == SCTP_PR_SCTP_BUF) 149#define PR_SCTP_RTX_ENABLED(x) (PR_SCTP_POLICY(x) == SCTP_PR_SCTP_RTX) 150 151/* Stat's */ 152struct sctp_pcbinfo { 153 uint32_t ep_count; 154 uint32_t asoc_count; 155 uint32_t laddr_count; 156 uint32_t raddr_count; 157 uint32_t chk_count; 158 uint32_t readq_count; 159 uint32_t free_chunks; 160 uint32_t stream_oque; 161}; 162 163struct sctp_sockstat { 164 sctp_assoc_t ss_assoc_id; 165 uint32_t ss_total_sndbuf; 166 uint32_t ss_total_recv_buf; 167}; 168 169/* 170 * notification event structures 171 */ 172 173/* 174 * association change event 175 */ 176struct sctp_assoc_change { 177 uint16_t sac_type; 178 uint16_t sac_flags; 179 uint32_t sac_length; 180 uint16_t sac_state; 181 uint16_t sac_error; 182 uint16_t sac_outbound_streams; 183 uint16_t sac_inbound_streams; 184 sctp_assoc_t sac_assoc_id; 185}; 186 187/* sac_state values */ 188#define SCTP_COMM_UP 0x0001 189#define SCTP_COMM_LOST 0x0002 190#define SCTP_RESTART 0x0003 191#define SCTP_SHUTDOWN_COMP 0x0004 192#define SCTP_CANT_STR_ASSOC 0x0005 193 194 195/* 196 * Address event 197 */ 198struct sctp_paddr_change { 199 uint16_t spc_type; 200 uint16_t spc_flags; 201 uint32_t spc_length; 202 struct sockaddr_storage spc_aaddr; 203 uint32_t spc_state; 204 uint32_t spc_error; 205 sctp_assoc_t spc_assoc_id; 206}; 207 208/* paddr state values */ 209#define SCTP_ADDR_AVAILABLE 0x0001 210#define SCTP_ADDR_UNREACHABLE 0x0002 211#define SCTP_ADDR_REMOVED 0x0003 212#define SCTP_ADDR_ADDED 0x0004 213#define SCTP_ADDR_MADE_PRIM 0x0005 214#define SCTP_ADDR_CONFIRMED 0x0006 215 216/* 217 * CAUTION: these are user exposed SCTP addr reachability states must be 218 * compatible with SCTP_ADDR states in sctp_constants.h 219 */ 220#ifdef SCTP_ACTIVE 221#undef SCTP_ACTIVE 222#endif 223#define SCTP_ACTIVE 0x0001 /* SCTP_ADDR_REACHABLE */ 224 225#ifdef SCTP_INACTIVE 226#undef SCTP_INACTIVE 227#endif 228#define SCTP_INACTIVE 0x0002 /* SCTP_ADDR_NOT_REACHABLE */ 229 230#ifdef SCTP_UNCONFIRMED 231#undef SCTP_UNCONFIRMED 232#endif 233#define SCTP_UNCONFIRMED 0x0200 /* SCTP_ADDR_UNCONFIRMED */ 234 235#ifdef SCTP_NOHEARTBEAT 236#undef SCTP_NOHEARTBEAT 237#endif 238#define SCTP_NOHEARTBEAT 0x0040 /* SCTP_ADDR_NOHB */ 239 240 241/* remote error events */ 242struct sctp_remote_error { 243 uint16_t sre_type; 244 uint16_t sre_flags; 245 uint32_t sre_length; 246 uint16_t sre_error; 247 sctp_assoc_t sre_assoc_id; 248 uint8_t sre_data[4]; 249}; 250 251/* data send failure event */ 252struct sctp_send_failed { 253 uint16_t ssf_type; 254 uint16_t ssf_flags; 255 uint32_t ssf_length; 256 uint32_t ssf_error; 257 struct sctp_sndrcvinfo ssf_info; 258 sctp_assoc_t ssf_assoc_id; 259 uint8_t ssf_data[4]; 260}; 261 262/* flag that indicates state of data */ 263#define SCTP_DATA_UNSENT 0x0001 /* inqueue never on wire */ 264#define SCTP_DATA_SENT 0x0002 /* on wire at failure */ 265 266/* shutdown event */ 267struct sctp_shutdown_event { 268 uint16_t sse_type; 269 uint16_t sse_flags; 270 uint32_t sse_length; 271 sctp_assoc_t sse_assoc_id; 272}; 273 274/* Adaptation layer indication stuff */ 275struct sctp_adaptation_event { 276 uint16_t sai_type; 277 uint16_t sai_flags; 278 uint32_t sai_length; 279 uint32_t sai_adaptation_ind; 280 sctp_assoc_t sai_assoc_id; 281}; 282 283struct sctp_setadaptation { 284 uint32_t ssb_adaptation_ind; 285}; 286 287/* compatable old spelling */ 288struct sctp_adaption_event { 289 uint16_t sai_type; 290 uint16_t sai_flags; 291 uint32_t sai_length; 292 uint32_t sai_adaption_ind; 293 sctp_assoc_t sai_assoc_id; 294}; 295 296struct sctp_setadaption { 297 uint32_t ssb_adaption_ind; 298}; 299 300 301/* 302 * Partial Delivery API event 303 */ 304struct sctp_pdapi_event { 305 uint16_t pdapi_type; 306 uint16_t pdapi_flags; 307 uint32_t pdapi_length; 308 uint32_t pdapi_indication; 309 sctp_assoc_t pdapi_assoc_id; 310}; 311 312/* indication values */ 313#define SCTP_PARTIAL_DELIVERY_ABORTED 0x0001 314 315 316/* 317 * authentication key event 318 */ 319struct sctp_authkey_event { 320 uint16_t auth_type; 321 uint16_t auth_flags; 322 uint32_t auth_length; 323 uint16_t auth_keynumber; 324 uint16_t auth_altkeynumber; 325 uint32_t auth_indication; 326 sctp_assoc_t auth_assoc_id; 327}; 328 329/* indication values */ 330#define SCTP_AUTH_NEWKEY 0x0001 331 332 333/* 334 * stream reset event 335 */ 336struct sctp_stream_reset_event { 337 uint16_t strreset_type; 338 uint16_t strreset_flags; 339 uint32_t strreset_length; 340 sctp_assoc_t strreset_assoc_id; 341 uint16_t strreset_list[0]; 342}; 343 344/* flags in strreset_flags field */ 345#define SCTP_STRRESET_INBOUND_STR 0x0001 346#define SCTP_STRRESET_OUTBOUND_STR 0x0002 347#define SCTP_STRRESET_ALL_STREAMS 0x0004 348#define SCTP_STRRESET_STREAM_LIST 0x0008 349#define SCTP_STRRESET_FAILED 0x0010 350 351 352/* SCTP notification event */ 353struct sctp_tlv { 354 uint16_t sn_type; 355 uint16_t sn_flags; 356 uint32_t sn_length; 357}; 358 359union sctp_notification { 360 struct sctp_tlv sn_header; 361 struct sctp_assoc_change sn_assoc_change; 362 struct sctp_paddr_change sn_paddr_change; 363 struct sctp_remote_error sn_remote_error; 364 struct sctp_send_failed sn_send_failed; 365 struct sctp_shutdown_event sn_shutdown_event; 366 struct sctp_adaptation_event sn_adaptation_event; 367 /* compatability same as above */ 368 struct sctp_adaption_event sn_adaption_event; 369 struct sctp_pdapi_event sn_pdapi_event; 370 struct sctp_authkey_event sn_auth_event; 371 struct sctp_stream_reset_event sn_strreset_event; 372}; 373 374/* notification types */ 375#define SCTP_ASSOC_CHANGE 0x0001 376#define SCTP_PEER_ADDR_CHANGE 0x0002 377#define SCTP_REMOTE_ERROR 0x0003 378#define SCTP_SEND_FAILED 0x0004 379#define SCTP_SHUTDOWN_EVENT 0x0005 380#define SCTP_ADAPTATION_INDICATION 0x0006 381/* same as above */ 382#define SCTP_ADAPTION_INDICATION 0x0006 383#define SCTP_PARTIAL_DELIVERY_EVENT 0x0007 384#define SCTP_AUTHENTICATION_EVENT 0x0008 385#define SCTP_STREAM_RESET_EVENT 0x0009 386 387 388/* 389 * socket option structs 390 */ 391 392struct sctp_paddrparams { 393 sctp_assoc_t spp_assoc_id; 394 struct sockaddr_storage spp_address; 395 uint32_t spp_hbinterval; 396 uint16_t spp_pathmaxrxt; 397 uint32_t spp_pathmtu; 398 uint32_t spp_sackdelay; 399 uint32_t spp_flags; 400 uint32_t spp_ipv6_flowlabel; 401 uint8_t spp_ipv4_tos; 402 403}; 404 405#define SPP_HB_ENABLE 0x00000001 406#define SPP_HB_DISABLE 0x00000002 407#define SPP_HB_DEMAND 0x00000004 408#define SPP_PMTUD_ENABLE 0x00000008 409#define SPP_PMTUD_DISABLE 0x00000010 410#define SPP_SACKDELAY_ENABLE 0x00000020 411#define SPP_SACKDELAY_DISABLE 0x00000040 412#define SPP_HB_TIME_IS_ZERO 0x00000080 413#define SPP_IPV6_FLOWLABEL 0x00000100 414#define SPP_IPV4_TOS 0x00000200 415 416struct sctp_paddrinfo { 417 sctp_assoc_t spinfo_assoc_id; 418 struct sockaddr_storage spinfo_address; 419 int32_t spinfo_state; 420 uint32_t spinfo_cwnd; 421 uint32_t spinfo_srtt; 422 uint32_t spinfo_rto; 423 uint32_t spinfo_mtu; 424}; 425 426struct sctp_rtoinfo { 427 sctp_assoc_t srto_assoc_id; 428 uint32_t srto_initial; 429 uint32_t srto_max; 430 uint32_t srto_min; 431}; 432 433struct sctp_assocparams { 434 sctp_assoc_t sasoc_assoc_id; 435 uint16_t sasoc_asocmaxrxt; 436 uint16_t sasoc_number_peer_destinations; 437 uint32_t sasoc_peer_rwnd; 438 uint32_t sasoc_local_rwnd; 439 uint32_t sasoc_cookie_life; 440}; 441 442struct sctp_setprim { 443 sctp_assoc_t ssp_assoc_id; 444 struct sockaddr_storage ssp_addr; 445}; 446 447struct sctp_setpeerprim { 448 sctp_assoc_t sspp_assoc_id; 449 struct sockaddr_storage sspp_addr; 450}; 451 452struct sctp_getaddresses { 453 sctp_assoc_t sget_assoc_id; 454 /* addr is filled in for N * sockaddr_storage */ 455 struct sockaddr addr[1]; 456}; 457 458struct sctp_setstrm_timeout { 459 sctp_assoc_t ssto_assoc_id; 460 uint32_t ssto_timeout; 461 uint32_t ssto_streamid_start; 462 uint32_t ssto_streamid_end; 463}; 464 465struct sctp_status { 466 sctp_assoc_t sstat_assoc_id; 467 int32_t sstat_state; 468 uint32_t sstat_rwnd; 469 uint16_t sstat_unackdata; 470 uint16_t sstat_penddata; 471 uint16_t sstat_instrms; 472 uint16_t sstat_outstrms; 473 uint32_t sstat_fragmentation_point; 474 struct sctp_paddrinfo sstat_primary; 475}; 476 477/* 478 * AUTHENTICATION support 479 */ 480/* SCTP_AUTH_CHUNK */ 481struct sctp_authchunk { 482 uint8_t sauth_chunk; 483}; 484 485/* SCTP_AUTH_KEY */ 486struct sctp_authkey { 487 sctp_assoc_t sca_assoc_id; 488 uint16_t sca_keynumber; 489 uint8_t sca_key[0]; 490}; 491 492/* SCTP_HMAC_IDENT */ 493struct sctp_hmacalgo { 494 uint16_t shmac_idents[0]; 495}; 496 497/* AUTH hmac_id */ 498#define SCTP_AUTH_HMAC_ID_RSVD 0x0000 499#define SCTP_AUTH_HMAC_ID_SHA1 0x0001 /* default, mandatory */ 500#define SCTP_AUTH_HMAC_ID_MD5 0x0002 /* deprecated */ 501#define SCTP_AUTH_HMAC_ID_SHA256 0x0003 502#define SCTP_AUTH_HMAC_ID_SHA224 0x8001 503#define SCTP_AUTH_HMAC_ID_SHA384 0x8002 504#define SCTP_AUTH_HMAC_ID_SHA512 0x8003 505 506 507/* SCTP_AUTH_ACTIVE_KEY / SCTP_AUTH_DELETE_KEY */ 508struct sctp_authkeyid { 509 sctp_assoc_t scact_assoc_id; 510 uint16_t scact_keynumber; 511}; 512 513/* SCTP_PEER_AUTH_CHUNKS / SCTP_LOCAL_AUTH_CHUNKS */ 514struct sctp_authchunks { 515 sctp_assoc_t gauth_assoc_id; 516 uint8_t gauth_chunks[0]; 517}; 518 519struct sctp_assoc_value { 520 sctp_assoc_t assoc_id; 521 uint32_t assoc_value; 522}; 523 524#define MAX_ASOC_IDS_RET 255 525struct sctp_assoc_ids { 526 uint16_t asls_assoc_start; /* array of index's start at 0 */ 527 uint8_t asls_numb_present; 528 uint8_t asls_more_to_get; 529 sctp_assoc_t asls_assoc_id[MAX_ASOC_IDS_RET]; 530}; 531 532struct sctp_cwnd_args { 533 struct sctp_nets *net; /* network to */ 534 uint32_t cwnd_new_value;/* cwnd in k */ 535 uint32_t inflight; /* flightsize in k */ 536 uint32_t pseudo_cumack; 537 int cwnd_augment; /* increment to it */ 538 uint8_t meets_pseudo_cumack; 539 uint8_t need_new_pseudo_cumack; 540 uint8_t cnt_in_send; 541 uint8_t cnt_in_str; 542}; 543 544struct sctp_blk_args { 545 uint32_t onsb; /* in 1k bytes */ 546 uint32_t sndlen; /* len of send being attempted */ 547 uint32_t peer_rwnd; /* rwnd of peer */ 548 uint16_t send_sent_qcnt;/* chnk cnt */ 549 uint16_t stream_qcnt; /* chnk cnt */ 550 uint16_t chunks_on_oque;/* chunks out */ 551 uint16_t flight_size; /* flight size in k */ 552}; 553 554/* 555 * Max we can reset in one setting, note this is dictated not by the define 556 * but the size of a mbuf cluster so don't change this define and think you 557 * can specify more. You must do multiple resets if you want to reset more 558 * than SCTP_MAX_EXPLICIT_STR_RESET. 559 */ 560#define SCTP_MAX_EXPLICT_STR_RESET 1000 561 562#define SCTP_RESET_LOCAL_RECV 0x0001 563#define SCTP_RESET_LOCAL_SEND 0x0002 564#define SCTP_RESET_BOTH 0x0003 565#define SCTP_RESET_TSN 0x0004 566 567struct sctp_stream_reset { 568 sctp_assoc_t strrst_assoc_id; 569 uint16_t strrst_flags; 570 uint16_t strrst_num_streams; /* 0 == ALL */ 571 uint16_t strrst_list[0];/* list if strrst_num_streams is not 0 */ 572}; 573 574 575struct sctp_get_nonce_values { 576 sctp_assoc_t gn_assoc_id; 577 uint32_t gn_peers_tag; 578 uint32_t gn_local_tag; 579}; 580 581/* Debugging logs */ 582struct sctp_str_log { 583 uint32_t n_tsn; 584 uint32_t e_tsn; 585 uint16_t n_sseq; 586 uint16_t e_sseq; 587}; 588 589struct sctp_sb_log { 590 void *stcb; 591 uint32_t so_sbcc; 592 uint32_t stcb_sbcc; 593 uint32_t incr; 594}; 595 596struct sctp_fr_log { 597 uint32_t largest_tsn; 598 uint32_t largest_new_tsn; 599 uint32_t tsn; 600}; 601 602struct sctp_fr_map { 603 uint32_t base; 604 uint32_t cum; 605 uint32_t high; 606}; 607 608struct sctp_rwnd_log { 609 uint32_t rwnd; 610 uint32_t send_size; 611 uint32_t overhead; 612 uint32_t new_rwnd; 613}; 614 615struct sctp_mbcnt_log { 616 uint32_t total_queue_size; 617 uint32_t size_change; 618 uint32_t total_queue_mb_size; 619 uint32_t mbcnt_change; 620}; 621 622struct sctp_sack_log { 623 uint32_t cumack; 624 uint32_t oldcumack; 625 uint32_t tsn; 626 uint16_t numGaps; 627 uint16_t numDups; 628}; 629 630struct sctp_lock_log { 631 void *sock; 632 void *inp; 633 uint8_t tcb_lock; 634 uint8_t inp_lock; 635 uint8_t info_lock; 636 uint8_t sock_lock; 637 uint8_t sockrcvbuf_lock; 638 uint8_t socksndbuf_lock; 639 uint8_t create_lock; 640 uint8_t resv; 641}; 642 643struct sctp_rto_log { 644 void *net; 645 uint32_t rtt; 646 uint32_t rttvar; 647 uint8_t direction; 648}; 649 650struct sctp_nagle_log { 651 void *stcb; 652 uint32_t total_flight; 653 uint32_t total_in_queue; 654 uint16_t count_in_queue; 655 uint16_t count_in_flight; 656}; 657 658struct sctp_sbwake_log { 659 void *stcb; 660 uint16_t send_q; 661 uint16_t sent_q; 662 uint16_t flight; 663 uint16_t wake_cnt; 664 uint8_t stream_qcnt; /* chnk cnt */ 665 uint8_t chunks_on_oque; /* chunks out */ 666 uint8_t sbflags; 667 uint8_t sctpflags; 668}; 669 670struct sctp_misc_info { 671 uint32_t log1; 672 uint32_t log2; 673 uint32_t log3; 674 uint32_t log4; 675}; 676 677struct sctp_log_closing { 678 void *inp; 679 void *stcb; 680 uint32_t sctp_flags; 681 uint16_t state; 682 int16_t loc; 683}; 684 685struct sctp_mbuf_log { 686 struct mbuf *mp; 687 caddr_t ext; 688 caddr_t data; 689 uint16_t size; 690 uint8_t refcnt; 691 uint8_t mbuf_flags; 692}; 693 694struct sctp_cwnd_log { 695 uint32_t time_event; 696 uint8_t from; 697 uint8_t event_type; 698 uint8_t resv[2]; 699 union { 700 struct sctp_log_closing close; 701 struct sctp_blk_args blk; 702 struct sctp_cwnd_args cwnd; 703 struct sctp_str_log strlog; 704 struct sctp_fr_log fr; 705 struct sctp_fr_map map; 706 struct sctp_rwnd_log rwnd; 707 struct sctp_mbcnt_log mbcnt; 708 struct sctp_sack_log sack; 709 struct sctp_lock_log lock; 710 struct sctp_rto_log rto; 711 struct sctp_sb_log sb; 712 struct sctp_nagle_log nagle; 713 struct sctp_sbwake_log wake; 714 struct sctp_mbuf_log mb; 715 struct sctp_misc_info misc; 716 } x; 717}; 718 719struct sctp_cwnd_log_req { 720 int num_in_log; /* Number in log */ 721 int num_ret; /* Number returned */ 722 int start_at; /* start at this one */ 723 int end_at; /* end at this one */ 724 struct sctp_cwnd_log log[0]; 725}; 726 727struct sctpstat { 728 /* MIB according to RFC 3873 */ 729 u_long sctps_currestab; /* sctpStats 1 (Gauge32) */ 730 u_long sctps_activeestab; /* sctpStats 2 (Counter32) */ 731 u_long sctps_passiveestab; /* sctpStats 3 (Counter32) */ 732 u_long sctps_aborted; /* sctpStats 4 (Counter32) */ 733 u_long sctps_shutdown; /* sctpStats 5 (Counter32) */ 734 u_long sctps_outoftheblue; /* sctpStats 6 (Counter32) */ 735 u_long sctps_checksumerrors; /* sctpStats 7 (Counter32) */ 736 u_long sctps_outcontrolchunks; /* sctpStats 8 (Counter64) */ 737 u_long sctps_outorderchunks; /* sctpStats 9 (Counter64) */ 738 u_long sctps_outunorderchunks; /* sctpStats 10 (Counter64) */ 739 u_long sctps_incontrolchunks; /* sctpStats 11 (Counter64) */ 740 u_long sctps_inorderchunks; /* sctpStats 12 (Counter64) */ 741 u_long sctps_inunorderchunks; /* sctpStats 13 (Counter64) */ 742 u_long sctps_fragusrmsgs; /* sctpStats 14 (Counter64) */ 743 u_long sctps_reasmusrmsgs; /* sctpStats 15 (Counter64) */ 744 u_long sctps_outpackets;/* sctpStats 16 (Counter64) */ 745 u_long sctps_inpackets; /* sctpStats 17 (Counter64) */ 746 u_long sctps_discontinuitytime; /* sctpStats 18 (TimeStamp) */ 747 /* input statistics: */ 748 u_long sctps_recvpackets; /* total input packets */ 749 u_long sctps_recvdatagrams; /* total input datagrams */ 750 u_long sctps_recvpktwithdata; 751 u_long sctps_recvsacks; /* total input SACK chunks */ 752 u_long sctps_recvdata; /* total input DATA chunks */ 753 u_long sctps_recvdupdata; /* total input duplicate DATA chunks */ 754 u_long sctps_recvheartbeat; /* total input HB chunks */ 755 u_long sctps_recvheartbeatack; /* total input HB-ACK chunks */ 756 u_long sctps_recvecne; /* total input ECNE chunks */ 757 u_long sctps_recvauth; /* total input AUTH chunks */ 758 u_long sctps_recvauthmissing; /* total input chunks missing AUTH */ 759 u_long sctps_recvivalhmacid; /* total number of invalid HMAC ids 760 * received */ 761 u_long sctps_recvivalkeyid; /* total number of invalid secret ids 762 * received */ 763 u_long sctps_recvauthfailed; /* total number of auth failed */ 764 u_long sctps_recvexpress; /* total fast path receives all one 765 * chunk */ 766 u_long sctps_recvexpressm; /* total fast path multi-part data */ 767 /* output statistics: */ 768 u_long sctps_sendpackets; /* total output packets */ 769 u_long sctps_sendsacks; /* total output SACKs */ 770 u_long sctps_senddata; /* total output DATA chunks */ 771 u_long sctps_sendretransdata; /* total output retransmitted DATA 772 * chunks */ 773 u_long sctps_sendfastretrans; /* total output fast retransmitted 774 * DATA chunks */ 775 u_long sctps_sendmultfastretrans; /* U-del */ 776 u_long sctps_sendheartbeat; /* total output HB chunks */ 777 u_long sctps_sendecne; /* total output ECNE chunks */ 778 u_long sctps_sendauth; /* total output AUTH chunks FIXME */ 779 u_long sctps_senderrors;/* ip_output error counter */ 780 /* PCKDROPREP statistics: */ 781 u_long sctps_pdrpfmbox; /* */ 782 u_long sctps_pdrpfehos; /* */ 783 u_long sctps_pdrpmbda; /* */ 784 u_long sctps_pdrpmbct; /* */ 785 u_long sctps_pdrpbwrpt; /* */ 786 u_long sctps_pdrpcrupt; /* */ 787 u_long sctps_pdrpnedat; /* */ 788 u_long sctps_pdrppdbrk; /* */ 789 u_long sctps_pdrptsnnf; /* */ 790 u_long sctps_pdrpdnfnd; /* */ 791 u_long sctps_pdrpdiwnp; /* */ 792 u_long sctps_pdrpdizrw; /* */ 793 u_long sctps_pdrpbadd; /* */ 794 u_long sctps_pdrpmark; /* */ 795 /* timeouts */ 796 u_long sctps_timoiterator; /* */ 797 u_long sctps_timodata; /* */ 798 u_long sctps_timowindowprobe; /* */ 799 u_long sctps_timoinit; /* */ 800 u_long sctps_timosack; /* */ 801 u_long sctps_timoshutdown; /* */ 802 u_long sctps_timoheartbeat; /* */ 803 u_long sctps_timocookie;/* */ 804 u_long sctps_timosecret;/* */ 805 u_long sctps_timopathmtu; /* */ 806 u_long sctps_timoshutdownack; /* */ 807 u_long sctps_timoshutdownguard; /* */ 808 u_long sctps_timostrmrst; /* */ 809 u_long sctps_timoearlyfr; /* */ 810 u_long sctps_timoasconf;/* */ 811 u_long sctps_timoautoclose; /* */ 812 u_long sctps_timoassockill; /* */ 813 u_long sctps_timoinpkill; /* */ 814 /* Early fast retransmission counters */ 815 u_long sctps_earlyfrstart; 816 u_long sctps_earlyfrstop; 817 u_long sctps_earlyfrmrkretrans; 818 u_long sctps_earlyfrstpout; 819 u_long sctps_earlyfrstpidsck1; 820 u_long sctps_earlyfrstpidsck2; 821 u_long sctps_earlyfrstpidsck3; 822 u_long sctps_earlyfrstpidsck4; 823 u_long sctps_earlyfrstrid; 824 u_long sctps_earlyfrstrout; 825 u_long sctps_earlyfrstrtmr; 826 /* otheres */ 827 u_long sctps_hdrops; /* packet shorter than header */ 828 u_long sctps_badsum; /* checksum error */ 829 u_long sctps_noport; /* no endpoint for port */ 830 u_long sctps_badvtag; /* bad v-tag */ 831 u_long sctps_badsid; /* bad SID */ 832 u_long sctps_nomem; /* no memory */ 833 u_long sctps_fastretransinrtt; /* number of multiple FR in a RTT 834 * window */ 835 u_long sctps_markedretrans; 836 u_long sctps_naglesent; /* nagle allowed sending */ 837 u_long sctps_naglequeued; /* nagle does't allow sending */ 838 u_long sctps_maxburstqueued; /* max burst dosn't allow sending */ 839 u_long sctps_ifnomemqueued; /* */ 840 u_long sctps_windowprobed; /* total number of window probes sent */ 841 u_long sctps_lowlevelerr; 842 u_long sctps_lowlevelerrusr; 843 u_long sctps_datadropchklmt; 844 u_long sctps_datadroprwnd; 845 u_long sctps_ecnereducedcwnd; 846 u_long sctps_vtagexpress; /* Used express lookup via vtag */ 847 u_long sctps_vtagbogus; /* Collision in express lookup. */ 848 u_long sctps_primary_randry; /* Number of times the sender ran dry 849 * of user data on primary */ 850 u_long sctps_cmt_randry;/* Same for above */ 851 u_long sctps_slowpath_sack; /* Sacks the slow way */ 852 u_long sctps_wu_sacks_sent; /* Window Update only sacks sent */ 853 u_long sctps_locks_in_rcv; /* How man so_rcv buf locks we did */ 854 u_long sctps_locks_in_rcva; /* How man so_rcv buf locks we did */ 855 u_long sctps_locks_in_rcvb; /* How man so_rcv buf locks we did */ 856 u_long sctps_locks_in_rcvc; /* How man so_rcv buf locks we did */ 857 u_long sctps_locks_in_rcvd; /* How man so_rcv buf locks we did */ 858 u_long sctps_locks_in_rcve; /* How man so_rcv buf locks we did */ 859 u_long sctps_locks_in_rcvf; /* How man so_rcv buf locks we did */ 860}; 861 862#define SCTP_STAT_INCR(_x) SCTP_STAT_INCR_BY(_x,1) 863#define SCTP_STAT_DECR(_x) SCTP_STAT_DECR_BY(_x,1) 864#define SCTP_STAT_INCR_BY(_x,_d) atomic_add_long(&sctpstat._x, _d) 865#define SCTP_STAT_DECR_BY(_x,_d) atomic_add_long(&sctpstat._x, -(_d)) 866/* The following macros are for handling MIB values, */ 867#define SCTP_STAT_INCR_COUNTER32(_x) SCTP_STAT_INCR(_x) 868#define SCTP_STAT_INCR_COUNTER64(_x) SCTP_STAT_INCR(_x) 869#define SCTP_STAT_INCR_GAUGE32(_x) SCTP_STAT_INCR(_x) 870#define SCTP_STAT_DECR_COUNTER32(_x) SCTP_STAT_DECR(_x) 871#define SCTP_STAT_DECR_COUNTER64(_x) SCTP_STAT_DECR(_x) 872#define SCTP_STAT_DECR_GAUGE32(_x) SCTP_STAT_DECR(_x) 873 874/* 875 * Kernel defined for sctp_send 876 */ 877#if defined(_KERNEL) 878int 879sctp_lower_sosend(struct socket *so, 880 struct sockaddr *addr, 881 struct uio *uio, 882 struct mbuf *top, 883 struct mbuf *control, 884 int flags, 885 int use_rcvinfo, 886 struct sctp_sndrcvinfo *srcv, 887 struct thread *p 888); 889 890int 891sctp_sorecvmsg(struct socket *so, 892 struct uio *uio, 893 struct mbuf **mp, 894 struct sockaddr *from, 895 int fromlen, 896 int *msg_flags, 897 struct sctp_sndrcvinfo *sinfo, 898 int filling_sinfo); 899 900 901#endif 902 903/* 904 * API system calls 905 */ 906 907#if !(defined(_KERNEL)) 908 909__BEGIN_DECLS 910int sctp_peeloff __P((int, sctp_assoc_t)); 911int sctp_bindx __P((int, struct sockaddr *, int, int)); 912int sctp_connectx __P((int, const struct sockaddr *, int)); 913int sctp_getaddrlen __P((sa_family_t)); 914int sctp_getpaddrs __P((int, sctp_assoc_t, struct sockaddr **)); 915void sctp_freepaddrs __P((struct sockaddr *)); 916int sctp_getladdrs __P((int, sctp_assoc_t, struct sockaddr **)); 917void sctp_freeladdrs __P((struct sockaddr *)); 918int sctp_opt_info __P((int, sctp_assoc_t, int, void *, socklen_t *)); 919 920ssize_t sctp_sendmsg 921__P((int, const void *, size_t, 922 const struct sockaddr *, 923 socklen_t, uint32_t, uint32_t, uint16_t, uint32_t, uint32_t)); 924 925 ssize_t sctp_send __P((int sd, const void *msg, size_t len, 926 const struct sctp_sndrcvinfo *sinfo, int flags)); 927 928 ssize_t 929 sctp_sendx __P((int sd, const void *msg, size_t len, 930 struct sockaddr *addrs, int addrcnt, 931 struct sctp_sndrcvinfo *sinfo, int flags)); 932 ssize_t 933 sctp_sendmsgx __P((int sd, const void *, size_t, 934 struct sockaddr *, int, 935 uint32_t, uint32_t, uint16_t, uint32_t, uint32_t)); 936 937sctp_assoc_t 938sctp_getassocid __P((int sd, struct sockaddr *sa)); 939 940 ssize_t sctp_recvmsg __P((int, void *, size_t, struct sockaddr *, 941 socklen_t *, struct sctp_sndrcvinfo *, int *)); 942 943__END_DECLS 944 945#endif /* !_KERNEL */ 946#endif /* !__sctp_uio_h__ */ 947