142551e99SRandall Stewart /*- 2b1006367SRandall Stewart * Copyright (c) 2007, by Cisco Systems, Inc. All rights reserved. 342551e99SRandall Stewart * 442551e99SRandall Stewart * Redistribution and use in source and binary forms, with or without 542551e99SRandall Stewart * modification, are permitted provided that the following conditions are met: 642551e99SRandall Stewart * 742551e99SRandall Stewart * a) Redistributions of source code must retain the above copyright notice, 842551e99SRandall Stewart * this list of conditions and the following disclaimer. 942551e99SRandall Stewart * 1042551e99SRandall Stewart * b) Redistributions in binary form must reproduce the above copyright 1142551e99SRandall Stewart * notice, this list of conditions and the following disclaimer in 1242551e99SRandall Stewart * the documentation and/or other materials provided with the distribution. 1342551e99SRandall Stewart * 1442551e99SRandall Stewart * c) Neither the name of Cisco Systems, Inc. nor the names of its 1542551e99SRandall Stewart * contributors may be used to endorse or promote products derived 1642551e99SRandall Stewart * from this software without specific prior written permission. 1742551e99SRandall Stewart * 1842551e99SRandall Stewart * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1942551e99SRandall Stewart * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 2042551e99SRandall Stewart * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2142551e99SRandall Stewart * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2242551e99SRandall Stewart * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2342551e99SRandall Stewart * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2442551e99SRandall Stewart * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2542551e99SRandall Stewart * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2642551e99SRandall Stewart * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2742551e99SRandall Stewart * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2842551e99SRandall Stewart * THE POSSIBILITY OF SUCH DAMAGE. 2942551e99SRandall Stewart */ 3042551e99SRandall Stewart 3142551e99SRandall Stewart #include <sys/cdefs.h> 3242551e99SRandall Stewart __FBSDID("$FreeBSD$"); 3342551e99SRandall Stewart 3442551e99SRandall Stewart #include <netinet/sctp_os.h> 3542551e99SRandall Stewart #include <netinet/sctp_constants.h> 3642551e99SRandall Stewart #include <netinet/sctp_sysctl.h> 3742551e99SRandall Stewart #include <netinet/sctp_pcb.h> 3842551e99SRandall Stewart #include <netinet/sctputil.h> 39d61a0ae0SRandall Stewart #include <netinet/sctp_output.h> 4042551e99SRandall Stewart /* 4142551e99SRandall Stewart * sysctl tunable variables 4242551e99SRandall Stewart */ 4342551e99SRandall Stewart uint32_t sctp_sendspace = (128 * 1024); 4442551e99SRandall Stewart uint32_t sctp_recvspace = 128 * (1024 + 4542551e99SRandall Stewart #ifdef INET6 4642551e99SRandall Stewart sizeof(struct sockaddr_in6) 4742551e99SRandall Stewart #else 4842551e99SRandall Stewart sizeof(struct sockaddr_in) 4942551e99SRandall Stewart #endif 5042551e99SRandall Stewart ); 5142551e99SRandall Stewart uint32_t sctp_mbuf_threshold_count = SCTP_DEFAULT_MBUFS_IN_CHAIN; 5242551e99SRandall Stewart uint32_t sctp_auto_asconf = SCTP_DEFAULT_AUTO_ASCONF; 5342551e99SRandall Stewart uint32_t sctp_ecn_enable = 1; 5442551e99SRandall Stewart uint32_t sctp_ecn_nonce = 0; 5542551e99SRandall Stewart uint32_t sctp_strict_sacks = 0; 5642551e99SRandall Stewart uint32_t sctp_no_csum_on_loopback = 1; 5742551e99SRandall Stewart uint32_t sctp_strict_init = 1; 5842551e99SRandall Stewart uint32_t sctp_abort_if_one_2_one_hits_limit = 0; 5942551e99SRandall Stewart uint32_t sctp_strict_data_order = 0; 6042551e99SRandall Stewart 6142551e99SRandall Stewart uint32_t sctp_peer_chunk_oh = sizeof(struct mbuf); 6242551e99SRandall Stewart uint32_t sctp_max_burst_default = SCTP_DEF_MAX_BURST; 6342551e99SRandall Stewart uint32_t sctp_use_cwnd_based_maxburst = 1; 6442551e99SRandall Stewart uint32_t sctp_do_drain = 1; 6542551e99SRandall Stewart uint32_t sctp_hb_maxburst = SCTP_DEF_MAX_BURST; 6642551e99SRandall Stewart 6742551e99SRandall Stewart uint32_t sctp_max_chunks_on_queue = SCTP_ASOC_MAX_CHUNKS_ON_QUEUE; 6842551e99SRandall Stewart uint32_t sctp_delayed_sack_time_default = SCTP_RECV_MSEC; 6942551e99SRandall Stewart uint32_t sctp_sack_freq_default = SCTP_DEFAULT_SACK_FREQ; 7042551e99SRandall Stewart uint32_t sctp_heartbeat_interval_default = SCTP_HB_DEFAULT_MSEC; 7142551e99SRandall Stewart uint32_t sctp_pmtu_raise_time_default = SCTP_DEF_PMTU_RAISE_SEC; 7242551e99SRandall Stewart uint32_t sctp_shutdown_guard_time_default = SCTP_DEF_MAX_SHUTDOWN_SEC; 7342551e99SRandall Stewart uint32_t sctp_secret_lifetime_default = SCTP_DEFAULT_SECRET_LIFE_SEC; 7442551e99SRandall Stewart uint32_t sctp_rto_max_default = SCTP_RTO_UPPER_BOUND; 7542551e99SRandall Stewart uint32_t sctp_rto_min_default = SCTP_RTO_LOWER_BOUND; 7642551e99SRandall Stewart uint32_t sctp_rto_initial_default = SCTP_RTO_INITIAL; 7742551e99SRandall Stewart uint32_t sctp_init_rto_max_default = SCTP_RTO_UPPER_BOUND; 7842551e99SRandall Stewart uint32_t sctp_valid_cookie_life_default = SCTP_DEFAULT_COOKIE_LIFE; 7942551e99SRandall Stewart uint32_t sctp_init_rtx_max_default = SCTP_DEF_MAX_INIT; 8042551e99SRandall Stewart uint32_t sctp_assoc_rtx_max_default = SCTP_DEF_MAX_SEND; 8142551e99SRandall Stewart uint32_t sctp_path_rtx_max_default = SCTP_DEF_MAX_PATH_RTX; 8242551e99SRandall Stewart uint32_t sctp_nr_outgoing_streams_default = SCTP_OSTREAM_INITIAL; 8342551e99SRandall Stewart uint32_t sctp_add_more_threshold = SCTP_DEFAULT_ADD_MORE; 8442551e99SRandall Stewart uint32_t sctp_asoc_free_resc_limit = SCTP_DEF_ASOC_RESC_LIMIT; 8542551e99SRandall Stewart uint32_t sctp_system_free_resc_limit = SCTP_DEF_SYSTEM_RESC_LIMIT; 8642551e99SRandall Stewart 8742551e99SRandall Stewart uint32_t sctp_min_split_point = SCTP_DEFAULT_SPLIT_POINT_MIN; 8842551e99SRandall Stewart uint32_t sctp_pcbtblsize = SCTP_PCBHASHSIZE; 8942551e99SRandall Stewart uint32_t sctp_hashtblsize = SCTP_TCBHASHSIZE; 9042551e99SRandall Stewart uint32_t sctp_chunkscale = SCTP_CHUNKQUEUE_SCALE; 9142551e99SRandall Stewart 9242551e99SRandall Stewart uint32_t sctp_cmt_on_off = 0; 9342551e99SRandall Stewart uint32_t sctp_cmt_use_dac = 0; 94bff64a4dSRandall Stewart uint32_t sctp_max_retran_chunk = SCTPCTL_MAX_RETRAN_CHUNK_DEFAULT; 955e54f665SRandall Stewart 9642551e99SRandall Stewart 9742551e99SRandall Stewart uint32_t sctp_L2_abc_variable = 1; 9842551e99SRandall Stewart uint32_t sctp_early_fr = 0; 9942551e99SRandall Stewart uint32_t sctp_early_fr_msec = SCTP_MINFR_MSEC_TIMER; 10042551e99SRandall Stewart uint32_t sctp_says_check_for_deadlock = 0; 10142551e99SRandall Stewart uint32_t sctp_asconf_auth_nochk = 0; 10242551e99SRandall Stewart uint32_t sctp_auth_disable = 0; 10342551e99SRandall Stewart uint32_t sctp_nat_friendly = 1; 1045e54f665SRandall Stewart uint32_t sctp_min_residual = SCTPCTL_MIN_RESIDUAL_DEFAULT;; 1055e54f665SRandall Stewart 1065e54f665SRandall Stewart 10742551e99SRandall Stewart struct sctpstat sctpstat; 10842551e99SRandall Stewart 10942551e99SRandall Stewart #ifdef SCTP_DEBUG 11042551e99SRandall Stewart uint32_t sctp_debug_on = 0; 11142551e99SRandall Stewart 11242551e99SRandall Stewart #endif 11342551e99SRandall Stewart 11442551e99SRandall Stewart 115d61a0ae0SRandall Stewart 116d61a0ae0SRandall Stewart /* It returns an upper limit. No filtering is done here */ 117d61a0ae0SRandall Stewart static unsigned int 118d61a0ae0SRandall Stewart number_of_addresses(struct sctp_inpcb *inp) 119d61a0ae0SRandall Stewart { 120d61a0ae0SRandall Stewart int cnt; 121d61a0ae0SRandall Stewart struct sctp_vrf *vrf; 122d61a0ae0SRandall Stewart struct sctp_ifn *sctp_ifn; 123d61a0ae0SRandall Stewart struct sctp_ifa *sctp_ifa; 124d61a0ae0SRandall Stewart struct sctp_laddr *laddr; 125d61a0ae0SRandall Stewart 126d61a0ae0SRandall Stewart cnt = 0; 127d61a0ae0SRandall Stewart /* neither Mac OS X nor FreeBSD support mulitple routing functions */ 128d61a0ae0SRandall Stewart if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) { 129d61a0ae0SRandall Stewart return (0); 130d61a0ae0SRandall Stewart } 131d61a0ae0SRandall Stewart if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 132d61a0ae0SRandall Stewart LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 133d61a0ae0SRandall Stewart LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 134d61a0ae0SRandall Stewart if ((sctp_ifa->address.sa.sa_family == AF_INET) || 135d61a0ae0SRandall Stewart (sctp_ifa->address.sa.sa_family == AF_INET6)) { 136d61a0ae0SRandall Stewart cnt++; 137d61a0ae0SRandall Stewart } 138d61a0ae0SRandall Stewart } 139d61a0ae0SRandall Stewart } 140d61a0ae0SRandall Stewart } else { 141d61a0ae0SRandall Stewart LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 142d61a0ae0SRandall Stewart if ((laddr->ifa->address.sa.sa_family == AF_INET) || 143d61a0ae0SRandall Stewart (laddr->ifa->address.sa.sa_family == AF_INET6)) { 144d61a0ae0SRandall Stewart cnt++; 145d61a0ae0SRandall Stewart } 146d61a0ae0SRandall Stewart } 147d61a0ae0SRandall Stewart } 148d61a0ae0SRandall Stewart return (cnt); 149d61a0ae0SRandall Stewart } 150d61a0ae0SRandall Stewart 151d61a0ae0SRandall Stewart static int 152d61a0ae0SRandall Stewart copy_out_local_addresses(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sysctl_req *req) 153d61a0ae0SRandall Stewart { 154d61a0ae0SRandall Stewart struct sctp_ifn *sctp_ifn; 155d61a0ae0SRandall Stewart struct sctp_ifa *sctp_ifa; 156d61a0ae0SRandall Stewart int loopback_scope, ipv4_local_scope, local_scope, site_scope; 157d61a0ae0SRandall Stewart int ipv4_addr_legal, ipv6_addr_legal; 158d61a0ae0SRandall Stewart struct sctp_vrf *vrf; 159d61a0ae0SRandall Stewart struct xsctp_laddr xladdr; 160d61a0ae0SRandall Stewart struct sctp_laddr *laddr; 161d61a0ae0SRandall Stewart int error; 162d61a0ae0SRandall Stewart 163d61a0ae0SRandall Stewart /* Turn on all the appropriate scope */ 164d61a0ae0SRandall Stewart if (stcb) { 165d61a0ae0SRandall Stewart /* use association specific values */ 166d61a0ae0SRandall Stewart loopback_scope = stcb->asoc.loopback_scope; 167d61a0ae0SRandall Stewart ipv4_local_scope = stcb->asoc.ipv4_local_scope; 168d61a0ae0SRandall Stewart local_scope = stcb->asoc.local_scope; 169d61a0ae0SRandall Stewart site_scope = stcb->asoc.site_scope; 170d61a0ae0SRandall Stewart } else { 171d61a0ae0SRandall Stewart /* use generic values for endpoints */ 172d61a0ae0SRandall Stewart loopback_scope = 1; 173d61a0ae0SRandall Stewart ipv4_local_scope = 1; 174d61a0ae0SRandall Stewart local_scope = 1; 175d61a0ae0SRandall Stewart site_scope = 1; 176d61a0ae0SRandall Stewart } 177d61a0ae0SRandall Stewart 178d61a0ae0SRandall Stewart /* use only address families of interest */ 179d61a0ae0SRandall Stewart if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { 180d61a0ae0SRandall Stewart ipv6_addr_legal = 1; 181d61a0ae0SRandall Stewart if (SCTP_IPV6_V6ONLY(inp)) { 182d61a0ae0SRandall Stewart ipv4_addr_legal = 0; 183d61a0ae0SRandall Stewart } else { 184d61a0ae0SRandall Stewart ipv4_addr_legal = 1; 185d61a0ae0SRandall Stewart } 186d61a0ae0SRandall Stewart } else { 187d61a0ae0SRandall Stewart ipv4_addr_legal = 1; 188d61a0ae0SRandall Stewart ipv6_addr_legal = 0; 189d61a0ae0SRandall Stewart } 190d61a0ae0SRandall Stewart 191d61a0ae0SRandall Stewart error = 0; 192d61a0ae0SRandall Stewart 193d61a0ae0SRandall Stewart /* neither Mac OS X nor FreeBSD support mulitple routing functions */ 194d61a0ae0SRandall Stewart if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) { 1955f26a41dSRandall Stewart SCTP_INP_RUNLOCK(inp); 1965f26a41dSRandall Stewart SCTP_INP_INFO_RUNLOCK(); 197d61a0ae0SRandall Stewart return (-1); 198d61a0ae0SRandall Stewart } 199d61a0ae0SRandall Stewart if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { 200d61a0ae0SRandall Stewart LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { 201d61a0ae0SRandall Stewart if ((loopback_scope == 0) && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) 202d61a0ae0SRandall Stewart /* Skip loopback if loopback_scope not set */ 203d61a0ae0SRandall Stewart continue; 204d61a0ae0SRandall Stewart LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { 205d61a0ae0SRandall Stewart if (stcb) { 206d61a0ae0SRandall Stewart /* 207d61a0ae0SRandall Stewart * ignore if blacklisted at 208d61a0ae0SRandall Stewart * association level 209d61a0ae0SRandall Stewart */ 210d61a0ae0SRandall Stewart if (sctp_is_addr_restricted(stcb, sctp_ifa)) 211d61a0ae0SRandall Stewart continue; 212d61a0ae0SRandall Stewart } 213d61a0ae0SRandall Stewart if ((sctp_ifa->address.sa.sa_family == AF_INET) && (ipv4_addr_legal)) { 214d61a0ae0SRandall Stewart struct sockaddr_in *sin; 215d61a0ae0SRandall Stewart 216d61a0ae0SRandall Stewart sin = (struct sockaddr_in *)&sctp_ifa->address.sa; 217d61a0ae0SRandall Stewart if (sin->sin_addr.s_addr == 0) 218d61a0ae0SRandall Stewart continue; 219d61a0ae0SRandall Stewart if ((ipv4_local_scope == 0) && (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) 220d61a0ae0SRandall Stewart continue; 221d61a0ae0SRandall Stewart } else if ((sctp_ifa->address.sa.sa_family == AF_INET6) && (ipv6_addr_legal)) { 222d61a0ae0SRandall Stewart struct sockaddr_in6 *sin6; 223d61a0ae0SRandall Stewart 224d61a0ae0SRandall Stewart sin6 = (struct sockaddr_in6 *)&sctp_ifa->address.sa; 225d61a0ae0SRandall Stewart if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) 226d61a0ae0SRandall Stewart continue; 227d61a0ae0SRandall Stewart if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { 228d61a0ae0SRandall Stewart if (local_scope == 0) 229d61a0ae0SRandall Stewart continue; 230d61a0ae0SRandall Stewart if (sin6->sin6_scope_id == 0) { 231d61a0ae0SRandall Stewart /* 232d61a0ae0SRandall Stewart * bad link local 233d61a0ae0SRandall Stewart * address 234d61a0ae0SRandall Stewart */ 235d61a0ae0SRandall Stewart if (sa6_recoverscope(sin6) != 0) 236d61a0ae0SRandall Stewart continue; 237d61a0ae0SRandall Stewart } 238d61a0ae0SRandall Stewart } 239d61a0ae0SRandall Stewart if ((site_scope == 0) && (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) 240d61a0ae0SRandall Stewart continue; 241d61a0ae0SRandall Stewart } else 242d61a0ae0SRandall Stewart continue; 243d61a0ae0SRandall Stewart memset((void *)&xladdr, 0, sizeof(union sctp_sockstore)); 244d61a0ae0SRandall Stewart memcpy((void *)&xladdr.address, (const void *)&sctp_ifa->address, sizeof(union sctp_sockstore)); 245d61a0ae0SRandall Stewart (void)SCTP_GETTIME_TIMEVAL(&xladdr.start_time); 246d61a0ae0SRandall Stewart SCTP_INP_RUNLOCK(inp); 247d61a0ae0SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 248d61a0ae0SRandall Stewart error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); 249d61a0ae0SRandall Stewart if (error) 250d61a0ae0SRandall Stewart return (error); 251d61a0ae0SRandall Stewart else { 252d61a0ae0SRandall Stewart SCTP_INP_INFO_RLOCK(); 253d61a0ae0SRandall Stewart SCTP_INP_RLOCK(inp); 254d61a0ae0SRandall Stewart } 255d61a0ae0SRandall Stewart } 256d61a0ae0SRandall Stewart } 257d61a0ae0SRandall Stewart } else { 258d61a0ae0SRandall Stewart LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { 259d61a0ae0SRandall Stewart /* ignore if blacklisted at association level */ 260d61a0ae0SRandall Stewart if (stcb && sctp_is_addr_restricted(stcb, laddr->ifa)) 261d61a0ae0SRandall Stewart continue; 262d61a0ae0SRandall Stewart memset((void *)&xladdr, 0, sizeof(union sctp_sockstore)); 263d61a0ae0SRandall Stewart memcpy((void *)&xladdr.address, (const void *)&laddr->ifa->address, sizeof(union sctp_sockstore)); 264d61a0ae0SRandall Stewart xladdr.start_time = laddr->start_time; 265d61a0ae0SRandall Stewart SCTP_INP_RUNLOCK(inp); 266d61a0ae0SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 267d61a0ae0SRandall Stewart error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); 268d61a0ae0SRandall Stewart if (error) 269d61a0ae0SRandall Stewart return (error); 270d61a0ae0SRandall Stewart else { 271d61a0ae0SRandall Stewart SCTP_INP_INFO_RLOCK(); 272d61a0ae0SRandall Stewart SCTP_INP_RLOCK(inp); 273d61a0ae0SRandall Stewart } 274d61a0ae0SRandall Stewart } 275d61a0ae0SRandall Stewart } 276d61a0ae0SRandall Stewart memset((void *)&xladdr, 0, sizeof(union sctp_sockstore)); 277d61a0ae0SRandall Stewart xladdr.last = 1; 2785f26a41dSRandall Stewart SCTP_INP_RUNLOCK(inp); 2795f26a41dSRandall Stewart SCTP_INP_INFO_RUNLOCK(); 280d61a0ae0SRandall Stewart error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); 2815f26a41dSRandall Stewart 282d61a0ae0SRandall Stewart if (error) 283d61a0ae0SRandall Stewart return (error); 2845f26a41dSRandall Stewart 2855f26a41dSRandall Stewart else { 2865f26a41dSRandall Stewart SCTP_INP_INFO_RLOCK(); 2875f26a41dSRandall Stewart SCTP_INP_RLOCK(inp); 288d61a0ae0SRandall Stewart return (0); 289d61a0ae0SRandall Stewart } 2905f26a41dSRandall Stewart } 291d61a0ae0SRandall Stewart 29242551e99SRandall Stewart /* 29342551e99SRandall Stewart * sysctl functions 29442551e99SRandall Stewart */ 29542551e99SRandall Stewart static int 29642551e99SRandall Stewart sctp_assoclist(SYSCTL_HANDLER_ARGS) 29742551e99SRandall Stewart { 29842551e99SRandall Stewart unsigned int number_of_endpoints; 29942551e99SRandall Stewart unsigned int number_of_local_addresses; 30042551e99SRandall Stewart unsigned int number_of_associations; 30142551e99SRandall Stewart unsigned int number_of_remote_addresses; 30242551e99SRandall Stewart unsigned int n; 30342551e99SRandall Stewart int error; 30442551e99SRandall Stewart struct sctp_inpcb *inp; 30542551e99SRandall Stewart struct sctp_tcb *stcb; 30642551e99SRandall Stewart struct sctp_nets *net; 30742551e99SRandall Stewart struct xsctp_inpcb xinpcb; 30842551e99SRandall Stewart struct xsctp_tcb xstcb; 30942551e99SRandall Stewart struct xsctp_raddr xraddr; 31042551e99SRandall Stewart 31142551e99SRandall Stewart number_of_endpoints = 0; 31242551e99SRandall Stewart number_of_local_addresses = 0; 31342551e99SRandall Stewart number_of_associations = 0; 31442551e99SRandall Stewart number_of_remote_addresses = 0; 31542551e99SRandall Stewart 31642551e99SRandall Stewart SCTP_INP_INFO_RLOCK(); 31742551e99SRandall Stewart if (req->oldptr == USER_ADDR_NULL) { 31842551e99SRandall Stewart LIST_FOREACH(inp, &sctppcbinfo.listhead, sctp_list) { 31942551e99SRandall Stewart SCTP_INP_RLOCK(inp); 32042551e99SRandall Stewart number_of_endpoints++; 321d61a0ae0SRandall Stewart number_of_local_addresses += number_of_addresses(inp); 32242551e99SRandall Stewart LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { 32342551e99SRandall Stewart number_of_associations++; 324d61a0ae0SRandall Stewart number_of_local_addresses += number_of_addresses(inp); 32542551e99SRandall Stewart TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { 32642551e99SRandall Stewart number_of_remote_addresses++; 32742551e99SRandall Stewart } 32842551e99SRandall Stewart } 32942551e99SRandall Stewart SCTP_INP_RUNLOCK(inp); 33042551e99SRandall Stewart } 33142551e99SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 33242551e99SRandall Stewart n = (number_of_endpoints + 1) * sizeof(struct xsctp_inpcb) + 333d61a0ae0SRandall Stewart (number_of_local_addresses + number_of_endpoints + number_of_associations) * sizeof(struct xsctp_laddr) + 334d61a0ae0SRandall Stewart (number_of_associations + number_of_endpoints) * sizeof(struct xsctp_tcb) + 335d61a0ae0SRandall Stewart (number_of_remote_addresses + number_of_associations) * sizeof(struct xsctp_raddr); 336d61a0ae0SRandall Stewart 33742551e99SRandall Stewart /* request some more memory than needed */ 33842551e99SRandall Stewart req->oldidx = (n + n / 8); 33942551e99SRandall Stewart return 0; 34042551e99SRandall Stewart } 34142551e99SRandall Stewart if (req->newptr != USER_ADDR_NULL) { 34242551e99SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 34342551e99SRandall Stewart return EPERM; 34442551e99SRandall Stewart } 34542551e99SRandall Stewart LIST_FOREACH(inp, &sctppcbinfo.listhead, sctp_list) { 34642551e99SRandall Stewart SCTP_INP_RLOCK(inp); 34742551e99SRandall Stewart xinpcb.last = 0; 34842551e99SRandall Stewart xinpcb.local_port = ntohs(inp->sctp_lport); 34942551e99SRandall Stewart xinpcb.flags = inp->sctp_flags; 35042551e99SRandall Stewart xinpcb.features = inp->sctp_features; 35142551e99SRandall Stewart xinpcb.total_sends = inp->total_sends; 35242551e99SRandall Stewart xinpcb.total_recvs = inp->total_recvs; 35342551e99SRandall Stewart xinpcb.total_nospaces = inp->total_nospaces; 35417205eccSRandall Stewart xinpcb.fragmentation_point = inp->sctp_frag_point; 355d61a0ae0SRandall Stewart xinpcb.qlen = inp->sctp_socket->so_qlen; 356d61a0ae0SRandall Stewart xinpcb.maxqlen = inp->sctp_socket->so_qlimit; 35742551e99SRandall Stewart SCTP_INP_INCR_REF(inp); 35842551e99SRandall Stewart SCTP_INP_RUNLOCK(inp); 35942551e99SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 36042551e99SRandall Stewart error = SYSCTL_OUT(req, &xinpcb, sizeof(struct xsctp_inpcb)); 36142551e99SRandall Stewart if (error) { 362d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 36342551e99SRandall Stewart return error; 36442551e99SRandall Stewart } 36542551e99SRandall Stewart SCTP_INP_INFO_RLOCK(); 36642551e99SRandall Stewart SCTP_INP_RLOCK(inp); 367d61a0ae0SRandall Stewart error = copy_out_local_addresses(inp, NULL, req); 368d61a0ae0SRandall Stewart if (error) { 369d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 370d61a0ae0SRandall Stewart return error; 371d61a0ae0SRandall Stewart } 37242551e99SRandall Stewart LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { 37342551e99SRandall Stewart SCTP_TCB_LOCK(stcb); 37442551e99SRandall Stewart atomic_add_int(&stcb->asoc.refcnt, 1); 37542551e99SRandall Stewart SCTP_TCB_UNLOCK(stcb); 376d61a0ae0SRandall Stewart xstcb.last = 0; 377d61a0ae0SRandall Stewart xstcb.local_port = ntohs(inp->sctp_lport); 378d61a0ae0SRandall Stewart xstcb.remote_port = ntohs(stcb->rport); 37942551e99SRandall Stewart if (stcb->asoc.primary_destination != NULL) 380d61a0ae0SRandall Stewart xstcb.primary_addr = stcb->asoc.primary_destination->ro._l_addr; 381d61a0ae0SRandall Stewart xstcb.heartbeat_interval = stcb->asoc.heart_beat_delay; 382d61a0ae0SRandall Stewart xstcb.state = SCTP_GET_STATE(&stcb->asoc); /* FIXME */ 383d61a0ae0SRandall Stewart xstcb.in_streams = stcb->asoc.streamincnt; 384d61a0ae0SRandall Stewart xstcb.out_streams = stcb->asoc.streamoutcnt; 385d61a0ae0SRandall Stewart xstcb.max_nr_retrans = stcb->asoc.overall_error_count; 386d61a0ae0SRandall Stewart xstcb.primary_process = 0; /* not really supported 387d61a0ae0SRandall Stewart * yet */ 388d61a0ae0SRandall Stewart xstcb.T1_expireries = stcb->asoc.timoinit + stcb->asoc.timocookie; 389d61a0ae0SRandall Stewart xstcb.T2_expireries = stcb->asoc.timoshutdown + stcb->asoc.timoshutdownack; 390d61a0ae0SRandall Stewart xstcb.retransmitted_tsns = stcb->asoc.marked_retrans; 391d61a0ae0SRandall Stewart xstcb.start_time = stcb->asoc.start_time; 392d61a0ae0SRandall Stewart xstcb.discontinuity_time = stcb->asoc.discontinuity_time; 39342551e99SRandall Stewart 39442551e99SRandall Stewart xstcb.total_sends = stcb->total_sends; 39542551e99SRandall Stewart xstcb.total_recvs = stcb->total_recvs; 39642551e99SRandall Stewart xstcb.local_tag = stcb->asoc.my_vtag; 39742551e99SRandall Stewart xstcb.remote_tag = stcb->asoc.peer_vtag; 39842551e99SRandall Stewart xstcb.initial_tsn = stcb->asoc.init_seq_number; 39942551e99SRandall Stewart xstcb.highest_tsn = stcb->asoc.sending_seq - 1; 40042551e99SRandall Stewart xstcb.cumulative_tsn = stcb->asoc.last_acked_seq; 40142551e99SRandall Stewart xstcb.cumulative_tsn_ack = stcb->asoc.cumulative_tsn; 40217205eccSRandall Stewart xstcb.mtu = stcb->asoc.smallest_mtu; 403207304d4SRandall Stewart xstcb.refcnt = stcb->asoc.refcnt; 40442551e99SRandall Stewart SCTP_INP_RUNLOCK(inp); 40542551e99SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 40642551e99SRandall Stewart error = SYSCTL_OUT(req, &xstcb, sizeof(struct xsctp_tcb)); 40742551e99SRandall Stewart if (error) { 408d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 409d61a0ae0SRandall Stewart atomic_add_int(&stcb->asoc.refcnt, -1); 410d61a0ae0SRandall Stewart return error; 411d61a0ae0SRandall Stewart } 412d61a0ae0SRandall Stewart SCTP_INP_INFO_RLOCK(); 413d61a0ae0SRandall Stewart SCTP_INP_RLOCK(inp); 414d61a0ae0SRandall Stewart error = copy_out_local_addresses(inp, stcb, req); 415d61a0ae0SRandall Stewart if (error) { 416d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 41742551e99SRandall Stewart atomic_add_int(&stcb->asoc.refcnt, -1); 41842551e99SRandall Stewart return error; 41942551e99SRandall Stewart } 42042551e99SRandall Stewart TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { 421d61a0ae0SRandall Stewart xraddr.last = 0; 422d61a0ae0SRandall Stewart xraddr.address = net->ro._l_addr; 423d61a0ae0SRandall Stewart xraddr.active = ((net->dest_state & SCTP_ADDR_REACHABLE) == SCTP_ADDR_REACHABLE); 424d61a0ae0SRandall Stewart xraddr.confirmed = ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0); 425d61a0ae0SRandall Stewart xraddr.heartbeat_enabled = ((net->dest_state & SCTP_ADDR_NOHB) == 0); 426d61a0ae0SRandall Stewart xraddr.rto = net->RTO; 427d61a0ae0SRandall Stewart xraddr.max_path_rtx = net->failure_threshold; 428d61a0ae0SRandall Stewart xraddr.rtx = net->marked_retrans; 429d61a0ae0SRandall Stewart xraddr.error_counter = net->error_count; 430d61a0ae0SRandall Stewart xraddr.cwnd = net->cwnd; 431d61a0ae0SRandall Stewart xraddr.flight_size = net->flight_size; 432d61a0ae0SRandall Stewart xraddr.mtu = net->mtu; 433d61a0ae0SRandall Stewart xraddr.start_time = net->start_time; 434d61a0ae0SRandall Stewart SCTP_INP_RUNLOCK(inp); 435d61a0ae0SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 43642551e99SRandall Stewart error = SYSCTL_OUT(req, &xraddr, sizeof(struct xsctp_raddr)); 43742551e99SRandall Stewart if (error) { 438d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 43942551e99SRandall Stewart atomic_add_int(&stcb->asoc.refcnt, -1); 44042551e99SRandall Stewart return error; 44142551e99SRandall Stewart } 44242551e99SRandall Stewart SCTP_INP_INFO_RLOCK(); 44342551e99SRandall Stewart SCTP_INP_RLOCK(inp); 44442551e99SRandall Stewart } 445d61a0ae0SRandall Stewart atomic_add_int(&stcb->asoc.refcnt, -1); 446d61a0ae0SRandall Stewart memset((void *)&xraddr, 0, sizeof(struct xsctp_raddr)); 447d61a0ae0SRandall Stewart xraddr.last = 1; 44842551e99SRandall Stewart SCTP_INP_RUNLOCK(inp); 449d61a0ae0SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 450d61a0ae0SRandall Stewart error = SYSCTL_OUT(req, &xraddr, sizeof(struct xsctp_raddr)); 451d61a0ae0SRandall Stewart if (error) { 452d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 453d61a0ae0SRandall Stewart return error; 454d61a0ae0SRandall Stewart } 455d61a0ae0SRandall Stewart SCTP_INP_INFO_RLOCK(); 456d61a0ae0SRandall Stewart SCTP_INP_RLOCK(inp); 457d61a0ae0SRandall Stewart } 458d61a0ae0SRandall Stewart SCTP_INP_RUNLOCK(inp); 459d61a0ae0SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 460d61a0ae0SRandall Stewart memset((void *)&xstcb, 0, sizeof(struct xsctp_tcb)); 461d61a0ae0SRandall Stewart xstcb.last = 1; 462d61a0ae0SRandall Stewart error = SYSCTL_OUT(req, &xstcb, sizeof(struct xsctp_tcb)); 463d61a0ae0SRandall Stewart if (error) { 464d61a0ae0SRandall Stewart return error; 465d61a0ae0SRandall Stewart } 466d61a0ae0SRandall Stewart SCTP_INP_INFO_RLOCK(); 467d61a0ae0SRandall Stewart SCTP_INP_DECR_REF(inp); 46842551e99SRandall Stewart } 46942551e99SRandall Stewart SCTP_INP_INFO_RUNLOCK(); 47042551e99SRandall Stewart 471d61a0ae0SRandall Stewart memset((void *)&xinpcb, 0, sizeof(struct xsctp_inpcb)); 47242551e99SRandall Stewart xinpcb.last = 1; 47342551e99SRandall Stewart error = SYSCTL_OUT(req, &xinpcb, sizeof(struct xsctp_inpcb)); 47442551e99SRandall Stewart return error; 47542551e99SRandall Stewart } 47642551e99SRandall Stewart 47742551e99SRandall Stewart 47842551e99SRandall Stewart /* 47942551e99SRandall Stewart * sysctl definitions 48042551e99SRandall Stewart */ 48142551e99SRandall Stewart 48242551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, sendspace, CTLFLAG_RW, 48342551e99SRandall Stewart &sctp_sendspace, 0, "Maximum outgoing SCTP buffer size"); 48442551e99SRandall Stewart 48542551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, recvspace, CTLFLAG_RW, 48642551e99SRandall Stewart &sctp_recvspace, 0, "Maximum incoming SCTP buffer size"); 48742551e99SRandall Stewart 48842551e99SRandall Stewart #if defined(__FreeBSD__) || defined(SCTP_APPLE_AUTO_ASCONF) 48942551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, auto_asconf, CTLFLAG_RW, 49042551e99SRandall Stewart &sctp_auto_asconf, 0, "Enable SCTP Auto-ASCONF"); 49142551e99SRandall Stewart #endif 49242551e99SRandall Stewart 49342551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, ecn_enable, CTLFLAG_RW, 49442551e99SRandall Stewart &sctp_ecn_enable, 0, "Enable SCTP ECN"); 49542551e99SRandall Stewart 49642551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, ecn_nonce, CTLFLAG_RW, 49742551e99SRandall Stewart &sctp_ecn_nonce, 0, "Enable SCTP ECN Nonce"); 49842551e99SRandall Stewart 49942551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, strict_sacks, CTLFLAG_RW, 50042551e99SRandall Stewart &sctp_strict_sacks, 0, "Enable SCTP Strict SACK checking"); 50142551e99SRandall Stewart 50242551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, loopback_nocsum, CTLFLAG_RW, 50342551e99SRandall Stewart &sctp_no_csum_on_loopback, 0, 50442551e99SRandall Stewart "Enable NO Csum on packets sent on loopback"); 50542551e99SRandall Stewart 50642551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, strict_init, CTLFLAG_RW, 50742551e99SRandall Stewart &sctp_strict_init, 0, 50842551e99SRandall Stewart "Enable strict INIT/INIT-ACK singleton enforcement"); 50942551e99SRandall Stewart 51042551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, peer_chkoh, CTLFLAG_RW, 51142551e99SRandall Stewart &sctp_peer_chunk_oh, 0, 51242551e99SRandall Stewart "Amount to debit peers rwnd per chunk sent"); 51342551e99SRandall Stewart 51442551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, maxburst, CTLFLAG_RW, 51542551e99SRandall Stewart &sctp_max_burst_default, 0, 51642551e99SRandall Stewart "Default max burst for sctp endpoints"); 51742551e99SRandall Stewart 51842551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, maxchunks, CTLFLAG_RW, 51942551e99SRandall Stewart &sctp_max_chunks_on_queue, 0, 52042551e99SRandall Stewart "Default max chunks on queue per asoc"); 52142551e99SRandall Stewart 52242551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, tcbhashsize, CTLFLAG_RW, 52342551e99SRandall Stewart &sctp_hashtblsize, 0, 52442551e99SRandall Stewart "Tuneable for Hash table sizes"); 52542551e99SRandall Stewart 52642551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, min_split_point, CTLFLAG_RW, 52742551e99SRandall Stewart &sctp_min_split_point, 0, 52842551e99SRandall Stewart "Minimum size when splitting a chunk"); 52942551e99SRandall Stewart 53042551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, pcbhashsize, CTLFLAG_RW, 53142551e99SRandall Stewart &sctp_pcbtblsize, 0, 53242551e99SRandall Stewart "Tuneable for PCB Hash table sizes"); 53342551e99SRandall Stewart 53442551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, sys_resource, CTLFLAG_RW, 53542551e99SRandall Stewart &sctp_system_free_resc_limit, 0, 53642551e99SRandall Stewart "Max number of cached resources in the system"); 53742551e99SRandall Stewart 53842551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, asoc_resource, CTLFLAG_RW, 53942551e99SRandall Stewart &sctp_asoc_free_resc_limit, 0, 54042551e99SRandall Stewart "Max number of cached resources in an asoc"); 54142551e99SRandall Stewart 54242551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, chunkscale, CTLFLAG_RW, 54342551e99SRandall Stewart &sctp_chunkscale, 0, 54442551e99SRandall Stewart "Tuneable for Scaling of number of chunks and messages"); 54542551e99SRandall Stewart 54642551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, delayed_sack_time, CTLFLAG_RW, 54742551e99SRandall Stewart &sctp_delayed_sack_time_default, 0, 54842551e99SRandall Stewart "Default delayed SACK timer in msec"); 54942551e99SRandall Stewart 55042551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, sack_freq, CTLFLAG_RW, 55142551e99SRandall Stewart &sctp_sack_freq_default, 0, 55242551e99SRandall Stewart "Default SACK frequency"); 55342551e99SRandall Stewart 55442551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, heartbeat_interval, CTLFLAG_RW, 55542551e99SRandall Stewart &sctp_heartbeat_interval_default, 0, 55642551e99SRandall Stewart "Default heartbeat interval in msec"); 55742551e99SRandall Stewart 55842551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, pmtu_raise_time, CTLFLAG_RW, 55942551e99SRandall Stewart &sctp_pmtu_raise_time_default, 0, 56042551e99SRandall Stewart "Default PMTU raise timer in sec"); 56142551e99SRandall Stewart 56242551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, shutdown_guard_time, CTLFLAG_RW, 56342551e99SRandall Stewart &sctp_shutdown_guard_time_default, 0, 56442551e99SRandall Stewart "Default shutdown guard timer in sec"); 56542551e99SRandall Stewart 56642551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, secret_lifetime, CTLFLAG_RW, 56742551e99SRandall Stewart &sctp_secret_lifetime_default, 0, 56842551e99SRandall Stewart "Default secret lifetime in sec"); 56942551e99SRandall Stewart 57042551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, rto_max, CTLFLAG_RW, 57142551e99SRandall Stewart &sctp_rto_max_default, 0, 57242551e99SRandall Stewart "Default maximum retransmission timeout in msec"); 57342551e99SRandall Stewart 57442551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, rto_min, CTLFLAG_RW, 57542551e99SRandall Stewart &sctp_rto_min_default, 0, 57642551e99SRandall Stewart "Default minimum retransmission timeout in msec"); 57742551e99SRandall Stewart 57842551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, rto_initial, CTLFLAG_RW, 57942551e99SRandall Stewart &sctp_rto_initial_default, 0, 58042551e99SRandall Stewart "Default initial retransmission timeout in msec"); 58142551e99SRandall Stewart 58242551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, init_rto_max, CTLFLAG_RW, 58342551e99SRandall Stewart &sctp_init_rto_max_default, 0, 58442551e99SRandall Stewart "Default maximum retransmission timeout during association setup in msec"); 58542551e99SRandall Stewart 58642551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, valid_cookie_life, CTLFLAG_RW, 58742551e99SRandall Stewart &sctp_valid_cookie_life_default, 0, 5883c503c28SRandall Stewart "Default cookie lifetime in ticks"); 58942551e99SRandall Stewart 59042551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, init_rtx_max, CTLFLAG_RW, 59142551e99SRandall Stewart &sctp_init_rtx_max_default, 0, 59242551e99SRandall Stewart "Default maximum number of retransmission for INIT chunks"); 59342551e99SRandall Stewart 59442551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, assoc_rtx_max, CTLFLAG_RW, 59542551e99SRandall Stewart &sctp_assoc_rtx_max_default, 0, 59642551e99SRandall Stewart "Default maximum number of retransmissions per association"); 59742551e99SRandall Stewart 59842551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, path_rtx_max, CTLFLAG_RW, 59942551e99SRandall Stewart &sctp_path_rtx_max_default, 0, 60042551e99SRandall Stewart "Default maximum of retransmissions per path"); 60142551e99SRandall Stewart 60242551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, add_more_on_output, CTLFLAG_RW, 60342551e99SRandall Stewart &sctp_add_more_threshold, 0, 60442551e99SRandall Stewart "When space wise is it worthwhile to try to add more to a socket send buffer"); 60542551e99SRandall Stewart 60642551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, outgoing_streams, CTLFLAG_RW, 60742551e99SRandall Stewart &sctp_nr_outgoing_streams_default, 0, 60842551e99SRandall Stewart "Default number of outgoing streams"); 60942551e99SRandall Stewart 61042551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, cmt_on_off, CTLFLAG_RW, 61142551e99SRandall Stewart &sctp_cmt_on_off, 0, 61242551e99SRandall Stewart "CMT ON/OFF flag"); 61342551e99SRandall Stewart 61442551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, cwnd_maxburst, CTLFLAG_RW, 61542551e99SRandall Stewart &sctp_use_cwnd_based_maxburst, 0, 61642551e99SRandall Stewart "Use a CWND adjusting maxburst"); 61742551e99SRandall Stewart 61842551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, early_fast_retran, CTLFLAG_RW, 61942551e99SRandall Stewart &sctp_early_fr, 0, 62042551e99SRandall Stewart "Early Fast Retransmit with timer"); 62142551e99SRandall Stewart 62242551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, deadlock_detect, CTLFLAG_RW, 62342551e99SRandall Stewart &sctp_says_check_for_deadlock, 0, 62442551e99SRandall Stewart "SMP Deadlock detection on/off"); 62542551e99SRandall Stewart 62642551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, early_fast_retran_msec, CTLFLAG_RW, 62742551e99SRandall Stewart &sctp_early_fr_msec, 0, 62842551e99SRandall Stewart "Early Fast Retransmit minimum timer value"); 62942551e99SRandall Stewart 63042551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, asconf_auth_nochk, CTLFLAG_RW, 63142551e99SRandall Stewart &sctp_asconf_auth_nochk, 0, 63242551e99SRandall Stewart "Disable SCTP ASCONF AUTH requirement"); 63342551e99SRandall Stewart 63442551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, auth_disable, CTLFLAG_RW, 63542551e99SRandall Stewart &sctp_auth_disable, 0, 63642551e99SRandall Stewart "Disable SCTP AUTH function"); 63742551e99SRandall Stewart 63842551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, nat_friendly, CTLFLAG_RW, 63942551e99SRandall Stewart &sctp_nat_friendly, 0, 64042551e99SRandall Stewart "SCTP NAT friendly operation"); 64142551e99SRandall Stewart 64242551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, abc_l_var, CTLFLAG_RW, 64342551e99SRandall Stewart &sctp_L2_abc_variable, 0, 64442551e99SRandall Stewart "SCTP ABC max increase per SACK (L)"); 64542551e99SRandall Stewart 64642551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, max_chained_mbufs, CTLFLAG_RW, 64742551e99SRandall Stewart &sctp_mbuf_threshold_count, 0, 64842551e99SRandall Stewart "Default max number of small mbufs on a chain"); 64942551e99SRandall Stewart 65042551e99SRandall Stewart SYSCTL_UINT(_net_inet_sctp, OID_AUTO, cmt_use_dac, CTLFLAG_RW, 65142551e99SRandall Stewart &sctp_cmt_use_dac, 0, 65242551e99SRandall Stewart "CMT DAC ON/OFF flag"); 65342551e99SRandall Stewart 65442551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, do_sctp_drain, CTLFLAG_RW, 65542551e99SRandall Stewart &sctp_do_drain, 0, 65642551e99SRandall Stewart "Should SCTP respond to the drain calls"); 65742551e99SRandall Stewart 65842551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, hb_max_burst, CTLFLAG_RW, 65942551e99SRandall Stewart &sctp_hb_maxburst, 0, 66042551e99SRandall Stewart "Confirmation Heartbeat max burst?"); 66142551e99SRandall Stewart 66242551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, abort_at_limit, CTLFLAG_RW, 66342551e99SRandall Stewart &sctp_abort_if_one_2_one_hits_limit, 0, 66442551e99SRandall Stewart "When one-2-one hits qlimit abort"); 66542551e99SRandall Stewart 66642551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, strict_data_order, CTLFLAG_RW, 66742551e99SRandall Stewart &sctp_strict_data_order, 0, 66842551e99SRandall Stewart "Enforce strict data ordering, abort if control inside data"); 66942551e99SRandall Stewart 67042551e99SRandall Stewart SYSCTL_STRUCT(_net_inet_sctp, OID_AUTO, stats, CTLFLAG_RW, 67142551e99SRandall Stewart &sctpstat, sctpstat, 67242551e99SRandall Stewart "SCTP statistics (struct sctps_stat, netinet/sctp.h"); 67342551e99SRandall Stewart 67442551e99SRandall Stewart SYSCTL_PROC(_net_inet_sctp, OID_AUTO, assoclist, CTLFLAG_RD, 67542551e99SRandall Stewart 0, 0, sctp_assoclist, 67642551e99SRandall Stewart "S,xassoc", "List of active SCTP associations"); 67742551e99SRandall Stewart 678bff64a4dSRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, min_residual, CTLFLAG_RW, 679bff64a4dSRandall Stewart &sctp_min_residual, 0, 680bff64a4dSRandall Stewart SCTPCTL_MIN_RESIDUAL_DESC); 681bff64a4dSRandall Stewart 682bff64a4dSRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, max_retran_chunk, CTLFLAG_RW, 683bff64a4dSRandall Stewart &sctp_max_retran_chunk, 0, 684bff64a4dSRandall Stewart SCTPCTL_MAX_RETRAN_CHUNK_DESC); 685bff64a4dSRandall Stewart 68642551e99SRandall Stewart #ifdef SCTP_DEBUG 68742551e99SRandall Stewart SYSCTL_INT(_net_inet_sctp, OID_AUTO, debug, CTLFLAG_RW, 68842551e99SRandall Stewart &sctp_debug_on, 0, "Configure debug output"); 68942551e99SRandall Stewart #endif /* SCTP_DEBUG */ 690