2 * Copyright (c) 2007, by Cisco Systems, Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * a) Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
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.
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.
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.
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
34 #include <netinet/sctp_os.h>
35 #include <netinet/sctp.h>
36 #include <netinet/sctp_constants.h>
37 #include <netinet/sctp_sysctl.h>
38 #include <netinet/sctp_pcb.h>
39 #include <netinet/sctputil.h>
40 #include <netinet/sctp_output.h>
43 * sysctl tunable variables
49 SCTP_BASE_SYSCTL(sctp_sendspace
) = SCTPCTL_MAXDGRAM_DEFAULT
;
50 SCTP_BASE_SYSCTL(sctp_recvspace
) = SCTPCTL_RECVSPACE_DEFAULT
;
51 SCTP_BASE_SYSCTL(sctp_auto_asconf
) = SCTPCTL_AUTOASCONF_DEFAULT
;
52 SCTP_BASE_SYSCTL(sctp_multiple_asconfs
) = SCTPCTL_MULTIPLEASCONFS_DEFAULT
;
53 SCTP_BASE_SYSCTL(sctp_ecn_enable
) = SCTPCTL_ECN_ENABLE_DEFAULT
;
54 SCTP_BASE_SYSCTL(sctp_ecn_nonce
) = SCTPCTL_ECN_NONCE_DEFAULT
;
55 SCTP_BASE_SYSCTL(sctp_strict_sacks
) = SCTPCTL_STRICT_SACKS_DEFAULT
;
56 SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback
) = SCTPCTL_LOOPBACK_NOCSUM_DEFAULT
;
57 SCTP_BASE_SYSCTL(sctp_strict_init
) = SCTPCTL_STRICT_INIT_DEFAULT
;
58 SCTP_BASE_SYSCTL(sctp_peer_chunk_oh
) = SCTPCTL_PEER_CHKOH_DEFAULT
;
59 SCTP_BASE_SYSCTL(sctp_max_burst_default
) = SCTPCTL_MAXBURST_DEFAULT
;
60 SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue
) = SCTPCTL_MAXCHUNKS_DEFAULT
;
61 SCTP_BASE_SYSCTL(sctp_hashtblsize
) = SCTPCTL_TCBHASHSIZE_DEFAULT
;
62 SCTP_BASE_SYSCTL(sctp_pcbtblsize
) = SCTPCTL_PCBHASHSIZE_DEFAULT
;
63 SCTP_BASE_SYSCTL(sctp_min_split_point
) = SCTPCTL_MIN_SPLIT_POINT_DEFAULT
;
64 SCTP_BASE_SYSCTL(sctp_chunkscale
) = SCTPCTL_CHUNKSCALE_DEFAULT
;
65 SCTP_BASE_SYSCTL(sctp_delayed_sack_time_default
) = SCTPCTL_DELAYED_SACK_TIME_DEFAULT
;
66 SCTP_BASE_SYSCTL(sctp_sack_freq_default
) = SCTPCTL_SACK_FREQ_DEFAULT
;
67 SCTP_BASE_SYSCTL(sctp_system_free_resc_limit
) = SCTPCTL_SYS_RESOURCE_DEFAULT
;
68 SCTP_BASE_SYSCTL(sctp_asoc_free_resc_limit
) = SCTPCTL_ASOC_RESOURCE_DEFAULT
;
69 SCTP_BASE_SYSCTL(sctp_heartbeat_interval_default
) = SCTPCTL_HEARTBEAT_INTERVAL_DEFAULT
;
70 SCTP_BASE_SYSCTL(sctp_pmtu_raise_time_default
) = SCTPCTL_PMTU_RAISE_TIME_DEFAULT
;
71 SCTP_BASE_SYSCTL(sctp_shutdown_guard_time_default
) = SCTPCTL_SHUTDOWN_GUARD_TIME_DEFAULT
;
72 SCTP_BASE_SYSCTL(sctp_secret_lifetime_default
) = SCTPCTL_SECRET_LIFETIME_DEFAULT
;
73 SCTP_BASE_SYSCTL(sctp_rto_max_default
) = SCTPCTL_RTO_MAX_DEFAULT
;
74 SCTP_BASE_SYSCTL(sctp_rto_min_default
) = SCTPCTL_RTO_MIN_DEFAULT
;
75 SCTP_BASE_SYSCTL(sctp_rto_initial_default
) = SCTPCTL_RTO_INITIAL_DEFAULT
;
76 SCTP_BASE_SYSCTL(sctp_init_rto_max_default
) = SCTPCTL_INIT_RTO_MAX_DEFAULT
;
77 SCTP_BASE_SYSCTL(sctp_valid_cookie_life_default
) = SCTPCTL_VALID_COOKIE_LIFE_DEFAULT
;
78 SCTP_BASE_SYSCTL(sctp_init_rtx_max_default
) = SCTPCTL_INIT_RTX_MAX_DEFAULT
;
79 SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default
) = SCTPCTL_ASSOC_RTX_MAX_DEFAULT
;
80 SCTP_BASE_SYSCTL(sctp_path_rtx_max_default
) = SCTPCTL_PATH_RTX_MAX_DEFAULT
;
81 SCTP_BASE_SYSCTL(sctp_add_more_threshold
) = SCTPCTL_ADD_MORE_ON_OUTPUT_DEFAULT
;
82 SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default
) = SCTPCTL_OUTGOING_STREAMS_DEFAULT
;
83 SCTP_BASE_SYSCTL(sctp_cmt_on_off
) = SCTPCTL_CMT_ON_OFF_DEFAULT
;
84 SCTP_BASE_SYSCTL(sctp_cmt_use_dac
) = SCTPCTL_CMT_USE_DAC_DEFAULT
;
85 SCTP_BASE_SYSCTL(sctp_cmt_pf
) = SCTPCTL_CMT_PF_DEFAULT
;
86 SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst
) = SCTPCTL_CWND_MAXBURST_DEFAULT
;
87 SCTP_BASE_SYSCTL(sctp_early_fr
) = SCTPCTL_EARLY_FAST_RETRAN_DEFAULT
;
88 SCTP_BASE_SYSCTL(sctp_early_fr_msec
) = SCTPCTL_EARLY_FAST_RETRAN_MSEC_DEFAULT
;
89 SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk
) = SCTPCTL_ASCONF_AUTH_NOCHK_DEFAULT
;
90 SCTP_BASE_SYSCTL(sctp_auth_disable
) = SCTPCTL_AUTH_DISABLE_DEFAULT
;
91 SCTP_BASE_SYSCTL(sctp_nat_friendly
) = SCTPCTL_NAT_FRIENDLY_DEFAULT
;
92 SCTP_BASE_SYSCTL(sctp_L2_abc_variable
) = SCTPCTL_ABC_L_VAR_DEFAULT
;
93 SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count
) = SCTPCTL_MAX_CHAINED_MBUFS_DEFAULT
;
94 SCTP_BASE_SYSCTL(sctp_do_drain
) = SCTPCTL_DO_SCTP_DRAIN_DEFAULT
;
95 SCTP_BASE_SYSCTL(sctp_hb_maxburst
) = SCTPCTL_HB_MAX_BURST_DEFAULT
;
96 SCTP_BASE_SYSCTL(sctp_abort_if_one_2_one_hits_limit
) = SCTPCTL_ABORT_AT_LIMIT_DEFAULT
;
97 SCTP_BASE_SYSCTL(sctp_strict_data_order
) = SCTPCTL_STRICT_DATA_ORDER_DEFAULT
;
98 SCTP_BASE_SYSCTL(sctp_min_residual
) = SCTPCTL_MIN_RESIDUAL_DEFAULT
;
99 SCTP_BASE_SYSCTL(sctp_max_retran_chunk
) = SCTPCTL_MAX_RETRAN_CHUNK_DEFAULT
;
100 SCTP_BASE_SYSCTL(sctp_logging_level
) = SCTPCTL_LOGGING_LEVEL_DEFAULT
;
101 /* JRS - Variable for default congestion control module */
102 SCTP_BASE_SYSCTL(sctp_default_cc_module
) = SCTPCTL_DEFAULT_CC_MODULE_DEFAULT
;
103 SCTP_BASE_SYSCTL(sctp_default_frag_interleave
) = SCTPCTL_DEFAULT_FRAG_INTERLEAVE_DEFAULT
;
104 SCTP_BASE_SYSCTL(sctp_mobility_base
) = SCTPCTL_MOBILITY_BASE_DEFAULT
;
105 SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff
) = SCTPCTL_MOBILITY_FASTHANDOFF_DEFAULT
;
106 #if defined(SCTP_LOCAL_TRACE_BUF)
107 memset(&SCTP_BASE_SYSCTL(sctp_log
), 0, sizeof(struct sctp_log
));
109 SCTP_BASE_SYSCTL(sctp_udp_tunneling_for_client_enable
) = SCTPCTL_UDP_TUNNELING_FOR_CLIENT_ENABLE_DEFAULT
;
110 SCTP_BASE_SYSCTL(sctp_udp_tunneling_port
) = SCTPCTL_UDP_TUNNELING_PORT_DEFAULT
;
111 SCTP_BASE_SYSCTL(sctp_enable_sack_immediately
) = SCTPCTL_SACK_IMMEDIATELY_ENABLE_DEFAULT
;
112 #if defined(SCTP_DEBUG)
113 SCTP_BASE_SYSCTL(sctp_debug_on
) = SCTPCTL_DEBUG_DEFAULT
;
115 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
116 SCTP_BASE_SYSCTL(sctp_output_unlocked
) = SCTPCTL_OUTPUT_UNLOCKED_DEFAULT
;
120 /* It returns an upper limit. No filtering is done here */
122 number_of_addresses(struct sctp_inpcb
*inp
)
125 struct sctp_vrf
*vrf
;
126 struct sctp_ifn
*sctp_ifn
;
127 struct sctp_ifa
*sctp_ifa
;
128 struct sctp_laddr
*laddr
;
131 /* neither Mac OS X nor FreeBSD support mulitple routing functions */
132 if ((vrf
= sctp_find_vrf(inp
->def_vrf_id
)) == NULL
) {
135 if (inp
->sctp_flags
& SCTP_PCB_FLAGS_BOUNDALL
) {
136 LIST_FOREACH(sctp_ifn
, &vrf
->ifnlist
, next_ifn
) {
137 LIST_FOREACH(sctp_ifa
, &sctp_ifn
->ifalist
, next_ifa
) {
138 if ((sctp_ifa
->address
.sa
.sa_family
== AF_INET
) ||
139 (sctp_ifa
->address
.sa
.sa_family
== AF_INET6
)) {
145 LIST_FOREACH(laddr
, &inp
->sctp_addr_list
, sctp_nxt_addr
) {
146 if ((laddr
->ifa
->address
.sa
.sa_family
== AF_INET
) ||
147 (laddr
->ifa
->address
.sa
.sa_family
== AF_INET6
)) {
156 copy_out_local_addresses(struct sctp_inpcb
*inp
, struct sctp_tcb
*stcb
, struct sysctl_req
*req
)
158 struct sctp_ifn
*sctp_ifn
;
159 struct sctp_ifa
*sctp_ifa
;
160 int loopback_scope
, ipv4_local_scope
, local_scope
, site_scope
;
161 int ipv4_addr_legal
, ipv6_addr_legal
;
162 struct sctp_vrf
*vrf
;
163 struct xsctp_laddr xladdr
;
164 struct sctp_laddr
*laddr
;
167 /* Turn on all the appropriate scope */
169 /* use association specific values */
170 loopback_scope
= stcb
->asoc
.loopback_scope
;
171 ipv4_local_scope
= stcb
->asoc
.ipv4_local_scope
;
172 local_scope
= stcb
->asoc
.local_scope
;
173 site_scope
= stcb
->asoc
.site_scope
;
175 /* use generic values for endpoints */
177 ipv4_local_scope
= 1;
182 /* use only address families of interest */
183 if (inp
->sctp_flags
& SCTP_PCB_FLAGS_BOUND_V6
) {
185 if (SCTP_IPV6_V6ONLY(inp
)) {
197 /* neither Mac OS X nor FreeBSD support mulitple routing functions */
198 if ((vrf
= sctp_find_vrf(inp
->def_vrf_id
)) == NULL
) {
199 SCTP_INP_RUNLOCK(inp
);
200 SCTP_INP_INFO_RUNLOCK();
203 if (inp
->sctp_flags
& SCTP_PCB_FLAGS_BOUNDALL
) {
204 LIST_FOREACH(sctp_ifn
, &vrf
->ifnlist
, next_ifn
) {
205 if ((loopback_scope
== 0) && SCTP_IFN_IS_IFT_LOOP(sctp_ifn
))
206 /* Skip loopback if loopback_scope not set */
208 LIST_FOREACH(sctp_ifa
, &sctp_ifn
->ifalist
, next_ifa
) {
211 * ignore if blacklisted at
214 if (sctp_is_addr_restricted(stcb
, sctp_ifa
))
217 switch (sctp_ifa
->address
.sa
.sa_family
) {
219 if (ipv4_addr_legal
) {
220 struct sockaddr_in
*sin
;
222 sin
= (struct sockaddr_in
*)&sctp_ifa
->address
.sa
;
223 if (sin
->sin_addr
.s_addr
== 0)
225 if ((ipv4_local_scope
== 0) && (IN4_ISPRIVATE_ADDRESS(&sin
->sin_addr
)))
233 if (ipv6_addr_legal
) {
234 struct sockaddr_in6
*sin6
;
236 sin6
= (struct sockaddr_in6
*)&sctp_ifa
->address
.sa
;
237 if (IN6_IS_ADDR_UNSPECIFIED(&sin6
->sin6_addr
))
239 if (IN6_IS_ADDR_LINKLOCAL(&sin6
->sin6_addr
)) {
240 if (local_scope
== 0)
242 if (sin6
->sin6_scope_id
== 0) {
248 if (sa6_recoverscope(sin6
) != 0)
252 if ((site_scope
== 0) && (IN6_IS_ADDR_SITELOCAL(&sin6
->sin6_addr
)))
262 memset((void *)&xladdr
, 0, sizeof(struct xsctp_laddr
));
263 memcpy((void *)&xladdr
.address
, (const void *)&sctp_ifa
->address
, sizeof(union sctp_sockstore
));
264 SCTP_INP_RUNLOCK(inp
);
265 SCTP_INP_INFO_RUNLOCK();
266 error
= SYSCTL_OUT(req
, &xladdr
, sizeof(struct xsctp_laddr
));
270 SCTP_INP_INFO_RLOCK();
276 LIST_FOREACH(laddr
, &inp
->sctp_addr_list
, sctp_nxt_addr
) {
277 /* ignore if blacklisted at association level */
278 if (stcb
&& sctp_is_addr_restricted(stcb
, laddr
->ifa
))
280 memset((void *)&xladdr
, 0, sizeof(struct xsctp_laddr
));
281 memcpy((void *)&xladdr
.address
, (const void *)&laddr
->ifa
->address
, sizeof(union sctp_sockstore
));
282 xladdr
.start_time
.tv_sec
= (uint32_t) laddr
->start_time
.tv_sec
;
283 xladdr
.start_time
.tv_usec
= (uint32_t) laddr
->start_time
.tv_usec
;
284 SCTP_INP_RUNLOCK(inp
);
285 SCTP_INP_INFO_RUNLOCK();
286 error
= SYSCTL_OUT(req
, &xladdr
, sizeof(struct xsctp_laddr
));
290 SCTP_INP_INFO_RLOCK();
295 memset((void *)&xladdr
, 0, sizeof(struct xsctp_laddr
));
297 SCTP_INP_RUNLOCK(inp
);
298 SCTP_INP_INFO_RUNLOCK();
299 error
= SYSCTL_OUT(req
, &xladdr
, sizeof(struct xsctp_laddr
));
304 SCTP_INP_INFO_RLOCK();
314 sctp_assoclist(SYSCTL_HANDLER_ARGS
)
316 unsigned int number_of_endpoints
;
317 unsigned int number_of_local_addresses
;
318 unsigned int number_of_associations
;
319 unsigned int number_of_remote_addresses
;
322 struct sctp_inpcb
*inp
;
323 struct sctp_tcb
*stcb
;
324 struct sctp_nets
*net
;
325 struct xsctp_inpcb xinpcb
;
326 struct xsctp_tcb xstcb
;
327 struct xsctp_raddr xraddr
;
329 number_of_endpoints
= 0;
330 number_of_local_addresses
= 0;
331 number_of_associations
= 0;
332 number_of_remote_addresses
= 0;
334 SCTP_INP_INFO_RLOCK();
335 if (req
->oldptr
== USER_ADDR_NULL
) {
336 LIST_FOREACH(inp
, &SCTP_BASE_INFO(listhead
), sctp_list
) {
338 number_of_endpoints
++;
339 number_of_local_addresses
+= number_of_addresses(inp
);
340 LIST_FOREACH(stcb
, &inp
->sctp_asoc_list
, sctp_tcblist
) {
341 number_of_associations
++;
342 number_of_local_addresses
+= number_of_addresses(inp
);
343 TAILQ_FOREACH(net
, &stcb
->asoc
.nets
, sctp_next
) {
344 number_of_remote_addresses
++;
347 SCTP_INP_RUNLOCK(inp
);
349 SCTP_INP_INFO_RUNLOCK();
350 n
= (number_of_endpoints
+ 1) * sizeof(struct xsctp_inpcb
) +
351 (number_of_local_addresses
+ number_of_endpoints
+ number_of_associations
) * sizeof(struct xsctp_laddr
) +
352 (number_of_associations
+ number_of_endpoints
) * sizeof(struct xsctp_tcb
) +
353 (number_of_remote_addresses
+ number_of_associations
) * sizeof(struct xsctp_raddr
);
355 /* request some more memory than needed */
356 req
->oldidx
= (n
+ n
/ 8);
359 if (req
->newptr
!= USER_ADDR_NULL
) {
360 SCTP_INP_INFO_RUNLOCK();
361 SCTP_LTRACE_ERR_RET(NULL
, NULL
, NULL
, SCTP_FROM_SCTP_SYSCTL
, EPERM
);
364 LIST_FOREACH(inp
, &SCTP_BASE_INFO(listhead
), sctp_list
) {
367 xinpcb
.local_port
= ntohs(inp
->sctp_lport
);
368 xinpcb
.flags
= inp
->sctp_flags
;
369 xinpcb
.features
= inp
->sctp_features
;
370 xinpcb
.total_sends
= inp
->total_sends
;
371 xinpcb
.total_recvs
= inp
->total_recvs
;
372 xinpcb
.total_nospaces
= inp
->total_nospaces
;
373 xinpcb
.fragmentation_point
= inp
->sctp_frag_point
;
374 if ((inp
->sctp_flags
& SCTP_PCB_FLAGS_SOCKET_ALLGONE
) ||
375 (inp
->sctp_flags
& SCTP_PCB_FLAGS_SOCKET_GONE
)) {
379 xinpcb
.qlen
= inp
->sctp_socket
->so_qlen
;
380 xinpcb
.maxqlen
= inp
->sctp_socket
->so_qlimit
;
382 SCTP_INP_INCR_REF(inp
);
383 SCTP_INP_RUNLOCK(inp
);
384 SCTP_INP_INFO_RUNLOCK();
385 error
= SYSCTL_OUT(req
, &xinpcb
, sizeof(struct xsctp_inpcb
));
387 SCTP_INP_DECR_REF(inp
);
390 SCTP_INP_INFO_RLOCK();
392 error
= copy_out_local_addresses(inp
, NULL
, req
);
394 SCTP_INP_DECR_REF(inp
);
397 LIST_FOREACH(stcb
, &inp
->sctp_asoc_list
, sctp_tcblist
) {
399 atomic_add_int(&stcb
->asoc
.refcnt
, 1);
400 SCTP_TCB_UNLOCK(stcb
);
402 xstcb
.local_port
= ntohs(inp
->sctp_lport
);
403 xstcb
.remote_port
= ntohs(stcb
->rport
);
404 if (stcb
->asoc
.primary_destination
!= NULL
)
405 xstcb
.primary_addr
= stcb
->asoc
.primary_destination
->ro
._l_addr
;
406 xstcb
.heartbeat_interval
= stcb
->asoc
.heart_beat_delay
;
407 xstcb
.state
= SCTP_GET_STATE(&stcb
->asoc
); /* FIXME */
408 xstcb
.in_streams
= stcb
->asoc
.streamincnt
;
409 xstcb
.out_streams
= stcb
->asoc
.streamoutcnt
;
410 xstcb
.max_nr_retrans
= stcb
->asoc
.overall_error_count
;
411 xstcb
.primary_process
= 0; /* not really supported
413 xstcb
.T1_expireries
= stcb
->asoc
.timoinit
+ stcb
->asoc
.timocookie
;
414 xstcb
.T2_expireries
= stcb
->asoc
.timoshutdown
+ stcb
->asoc
.timoshutdownack
;
415 xstcb
.retransmitted_tsns
= stcb
->asoc
.marked_retrans
;
416 xstcb
.start_time
.tv_sec
= (uint32_t) stcb
->asoc
.start_time
.tv_sec
;
417 xstcb
.start_time
.tv_usec
= (uint32_t) stcb
->asoc
.start_time
.tv_usec
;
418 xstcb
.discontinuity_time
.tv_sec
= (uint32_t) stcb
->asoc
.discontinuity_time
.tv_sec
;
419 xstcb
.discontinuity_time
.tv_usec
= (uint32_t) stcb
->asoc
.discontinuity_time
.tv_usec
;
420 xstcb
.total_sends
= stcb
->total_sends
;
421 xstcb
.total_recvs
= stcb
->total_recvs
;
422 xstcb
.local_tag
= stcb
->asoc
.my_vtag
;
423 xstcb
.remote_tag
= stcb
->asoc
.peer_vtag
;
424 xstcb
.initial_tsn
= stcb
->asoc
.init_seq_number
;
425 xstcb
.highest_tsn
= stcb
->asoc
.sending_seq
- 1;
426 xstcb
.cumulative_tsn
= stcb
->asoc
.last_acked_seq
;
427 xstcb
.cumulative_tsn_ack
= stcb
->asoc
.cumulative_tsn
;
428 xstcb
.mtu
= stcb
->asoc
.smallest_mtu
;
429 xstcb
.refcnt
= stcb
->asoc
.refcnt
;
430 SCTP_INP_RUNLOCK(inp
);
431 SCTP_INP_INFO_RUNLOCK();
432 error
= SYSCTL_OUT(req
, &xstcb
, sizeof(struct xsctp_tcb
));
434 SCTP_INP_DECR_REF(inp
);
435 atomic_subtract_int(&stcb
->asoc
.refcnt
, 1);
438 SCTP_INP_INFO_RLOCK();
440 error
= copy_out_local_addresses(inp
, stcb
, req
);
442 SCTP_INP_DECR_REF(inp
);
443 atomic_subtract_int(&stcb
->asoc
.refcnt
, 1);
446 TAILQ_FOREACH(net
, &stcb
->asoc
.nets
, sctp_next
) {
448 xraddr
.address
= net
->ro
._l_addr
;
449 xraddr
.active
= ((net
->dest_state
& SCTP_ADDR_REACHABLE
) == SCTP_ADDR_REACHABLE
);
450 xraddr
.confirmed
= ((net
->dest_state
& SCTP_ADDR_UNCONFIRMED
) == 0);
451 xraddr
.heartbeat_enabled
= ((net
->dest_state
& SCTP_ADDR_NOHB
) == 0);
452 xraddr
.rto
= net
->RTO
;
453 xraddr
.max_path_rtx
= net
->failure_threshold
;
454 xraddr
.rtx
= net
->marked_retrans
;
455 xraddr
.error_counter
= net
->error_count
;
456 xraddr
.cwnd
= net
->cwnd
;
457 xraddr
.flight_size
= net
->flight_size
;
458 xraddr
.mtu
= net
->mtu
;
459 xraddr
.start_time
.tv_sec
= (uint32_t) net
->start_time
.tv_sec
;
460 xraddr
.start_time
.tv_usec
= (uint32_t) net
->start_time
.tv_usec
;
461 SCTP_INP_RUNLOCK(inp
);
462 SCTP_INP_INFO_RUNLOCK();
463 error
= SYSCTL_OUT(req
, &xraddr
, sizeof(struct xsctp_raddr
));
465 SCTP_INP_DECR_REF(inp
);
466 atomic_subtract_int(&stcb
->asoc
.refcnt
, 1);
469 SCTP_INP_INFO_RLOCK();
472 atomic_subtract_int(&stcb
->asoc
.refcnt
, 1);
473 memset((void *)&xraddr
, 0, sizeof(struct xsctp_raddr
));
475 SCTP_INP_RUNLOCK(inp
);
476 SCTP_INP_INFO_RUNLOCK();
477 error
= SYSCTL_OUT(req
, &xraddr
, sizeof(struct xsctp_raddr
));
479 SCTP_INP_DECR_REF(inp
);
482 SCTP_INP_INFO_RLOCK();
485 SCTP_INP_DECR_REF(inp
);
486 SCTP_INP_RUNLOCK(inp
);
487 SCTP_INP_INFO_RUNLOCK();
488 memset((void *)&xstcb
, 0, sizeof(struct xsctp_tcb
));
490 error
= SYSCTL_OUT(req
, &xstcb
, sizeof(struct xsctp_tcb
));
494 SCTP_INP_INFO_RLOCK();
496 SCTP_INP_INFO_RUNLOCK();
498 memset((void *)&xinpcb
, 0, sizeof(struct xsctp_inpcb
));
500 error
= SYSCTL_OUT(req
, &xinpcb
, sizeof(struct xsctp_inpcb
));
506 #define RANGECHK(var, min, max) \
507 if ((var) < (min)) { (var) = (min); } \
508 else if ((var) > (max)) { (var) = (max); }
511 sysctl_sctp_udp_tunneling_check(SYSCTL_HANDLER_ARGS
)
514 uint32_t old_sctp_udp_tunneling_port
;
516 old_sctp_udp_tunneling_port
= SCTP_BASE_SYSCTL(sctp_udp_tunneling_port
);
517 error
= sysctl_handle_int(oidp
, oidp
->oid_arg1
, oidp
->oid_arg2
, req
);
519 RANGECHK(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port
), SCTPCTL_UDP_TUNNELING_PORT_MIN
, SCTPCTL_UDP_TUNNELING_PORT_MAX
);
520 if (old_sctp_udp_tunneling_port
) {
521 sctp_over_udp_stop();
523 if (SCTP_BASE_SYSCTL(sctp_udp_tunneling_port
)) {
524 if (sctp_over_udp_start()) {
525 SCTP_BASE_SYSCTL(sctp_udp_tunneling_port
) = 0;
534 sysctl_sctp_check(SYSCTL_HANDLER_ARGS
)
538 error
= sysctl_handle_int(oidp
, oidp
->oid_arg1
, oidp
->oid_arg2
, req
);
540 RANGECHK(SCTP_BASE_SYSCTL(sctp_sendspace
), SCTPCTL_MAXDGRAM_MIN
, SCTPCTL_MAXDGRAM_MAX
);
541 RANGECHK(SCTP_BASE_SYSCTL(sctp_recvspace
), SCTPCTL_RECVSPACE_MIN
, SCTPCTL_RECVSPACE_MAX
);
542 #if defined(__FreeBSD__) || defined(SCTP_APPLE_AUTO_ASCONF)
543 RANGECHK(SCTP_BASE_SYSCTL(sctp_auto_asconf
), SCTPCTL_AUTOASCONF_MIN
, SCTPCTL_AUTOASCONF_MAX
);
545 RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_enable
), SCTPCTL_ECN_ENABLE_MIN
, SCTPCTL_ECN_ENABLE_MAX
);
546 RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_nonce
), SCTPCTL_ECN_NONCE_MIN
, SCTPCTL_ECN_NONCE_MAX
);
547 RANGECHK(SCTP_BASE_SYSCTL(sctp_strict_sacks
), SCTPCTL_STRICT_SACKS_MIN
, SCTPCTL_STRICT_SACKS_MAX
);
548 RANGECHK(SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback
), SCTPCTL_LOOPBACK_NOCSUM_MIN
, SCTPCTL_LOOPBACK_NOCSUM_MAX
);
549 RANGECHK(SCTP_BASE_SYSCTL(sctp_strict_init
), SCTPCTL_STRICT_INIT_MIN
, SCTPCTL_STRICT_INIT_MAX
);
550 RANGECHK(SCTP_BASE_SYSCTL(sctp_peer_chunk_oh
), SCTPCTL_PEER_CHKOH_MIN
, SCTPCTL_PEER_CHKOH_MAX
);
551 RANGECHK(SCTP_BASE_SYSCTL(sctp_max_burst_default
), SCTPCTL_MAXBURST_MIN
, SCTPCTL_MAXBURST_MAX
);
552 RANGECHK(SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue
), SCTPCTL_MAXCHUNKS_MIN
, SCTPCTL_MAXCHUNKS_MAX
);
553 RANGECHK(SCTP_BASE_SYSCTL(sctp_hashtblsize
), SCTPCTL_TCBHASHSIZE_MIN
, SCTPCTL_TCBHASHSIZE_MAX
);
554 RANGECHK(SCTP_BASE_SYSCTL(sctp_pcbtblsize
), SCTPCTL_PCBHASHSIZE_MIN
, SCTPCTL_PCBHASHSIZE_MAX
);
555 RANGECHK(SCTP_BASE_SYSCTL(sctp_min_split_point
), SCTPCTL_MIN_SPLIT_POINT_MIN
, SCTPCTL_MIN_SPLIT_POINT_MAX
);
556 RANGECHK(SCTP_BASE_SYSCTL(sctp_chunkscale
), SCTPCTL_CHUNKSCALE_MIN
, SCTPCTL_CHUNKSCALE_MAX
);
557 RANGECHK(SCTP_BASE_SYSCTL(sctp_delayed_sack_time_default
), SCTPCTL_DELAYED_SACK_TIME_MIN
, SCTPCTL_DELAYED_SACK_TIME_MAX
);
558 RANGECHK(SCTP_BASE_SYSCTL(sctp_sack_freq_default
), SCTPCTL_SACK_FREQ_MIN
, SCTPCTL_SACK_FREQ_MAX
);
559 RANGECHK(SCTP_BASE_SYSCTL(sctp_system_free_resc_limit
), SCTPCTL_SYS_RESOURCE_MIN
, SCTPCTL_SYS_RESOURCE_MAX
);
560 RANGECHK(SCTP_BASE_SYSCTL(sctp_asoc_free_resc_limit
), SCTPCTL_ASOC_RESOURCE_MIN
, SCTPCTL_ASOC_RESOURCE_MAX
);
561 RANGECHK(SCTP_BASE_SYSCTL(sctp_heartbeat_interval_default
), SCTPCTL_HEARTBEAT_INTERVAL_MIN
, SCTPCTL_HEARTBEAT_INTERVAL_MAX
);
562 RANGECHK(SCTP_BASE_SYSCTL(sctp_pmtu_raise_time_default
), SCTPCTL_PMTU_RAISE_TIME_MIN
, SCTPCTL_PMTU_RAISE_TIME_MAX
);
563 RANGECHK(SCTP_BASE_SYSCTL(sctp_shutdown_guard_time_default
), SCTPCTL_SHUTDOWN_GUARD_TIME_MIN
, SCTPCTL_SHUTDOWN_GUARD_TIME_MAX
);
564 RANGECHK(SCTP_BASE_SYSCTL(sctp_secret_lifetime_default
), SCTPCTL_SECRET_LIFETIME_MIN
, SCTPCTL_SECRET_LIFETIME_MAX
);
565 RANGECHK(SCTP_BASE_SYSCTL(sctp_rto_max_default
), SCTPCTL_RTO_MAX_MIN
, SCTPCTL_RTO_MAX_MAX
);
566 RANGECHK(SCTP_BASE_SYSCTL(sctp_rto_min_default
), SCTPCTL_RTO_MIN_MIN
, SCTPCTL_RTO_MIN_MAX
);
567 RANGECHK(SCTP_BASE_SYSCTL(sctp_rto_initial_default
), SCTPCTL_RTO_INITIAL_MIN
, SCTPCTL_RTO_INITIAL_MAX
);
568 RANGECHK(SCTP_BASE_SYSCTL(sctp_init_rto_max_default
), SCTPCTL_INIT_RTO_MAX_MIN
, SCTPCTL_INIT_RTO_MAX_MAX
);
569 RANGECHK(SCTP_BASE_SYSCTL(sctp_valid_cookie_life_default
), SCTPCTL_VALID_COOKIE_LIFE_MIN
, SCTPCTL_VALID_COOKIE_LIFE_MAX
);
570 RANGECHK(SCTP_BASE_SYSCTL(sctp_init_rtx_max_default
), SCTPCTL_INIT_RTX_MAX_MIN
, SCTPCTL_INIT_RTX_MAX_MAX
);
571 RANGECHK(SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default
), SCTPCTL_ASSOC_RTX_MAX_MIN
, SCTPCTL_ASSOC_RTX_MAX_MAX
);
572 RANGECHK(SCTP_BASE_SYSCTL(sctp_path_rtx_max_default
), SCTPCTL_PATH_RTX_MAX_MIN
, SCTPCTL_PATH_RTX_MAX_MAX
);
573 RANGECHK(SCTP_BASE_SYSCTL(sctp_add_more_threshold
), SCTPCTL_ADD_MORE_ON_OUTPUT_MIN
, SCTPCTL_ADD_MORE_ON_OUTPUT_MAX
);
574 RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default
), SCTPCTL_OUTGOING_STREAMS_MIN
, SCTPCTL_OUTGOING_STREAMS_MAX
);
575 RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_on_off
), SCTPCTL_CMT_ON_OFF_MIN
, SCTPCTL_CMT_ON_OFF_MAX
);
576 RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_use_dac
), SCTPCTL_CMT_USE_DAC_MIN
, SCTPCTL_CMT_USE_DAC_MAX
);
577 RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_pf
), SCTPCTL_CMT_PF_MIN
, SCTPCTL_CMT_PF_MAX
);
578 RANGECHK(SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst
), SCTPCTL_CWND_MAXBURST_MIN
, SCTPCTL_CWND_MAXBURST_MAX
);
579 RANGECHK(SCTP_BASE_SYSCTL(sctp_early_fr
), SCTPCTL_EARLY_FAST_RETRAN_MIN
, SCTPCTL_EARLY_FAST_RETRAN_MAX
);
580 RANGECHK(SCTP_BASE_SYSCTL(sctp_early_fr_msec
), SCTPCTL_EARLY_FAST_RETRAN_MSEC_MIN
, SCTPCTL_EARLY_FAST_RETRAN_MSEC_MAX
);
581 RANGECHK(SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk
), SCTPCTL_ASCONF_AUTH_NOCHK_MIN
, SCTPCTL_ASCONF_AUTH_NOCHK_MAX
);
582 RANGECHK(SCTP_BASE_SYSCTL(sctp_auth_disable
), SCTPCTL_AUTH_DISABLE_MIN
, SCTPCTL_AUTH_DISABLE_MAX
);
583 RANGECHK(SCTP_BASE_SYSCTL(sctp_nat_friendly
), SCTPCTL_NAT_FRIENDLY_MIN
, SCTPCTL_NAT_FRIENDLY_MAX
);
584 RANGECHK(SCTP_BASE_SYSCTL(sctp_L2_abc_variable
), SCTPCTL_ABC_L_VAR_MIN
, SCTPCTL_ABC_L_VAR_MAX
);
585 RANGECHK(SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count
), SCTPCTL_MAX_CHAINED_MBUFS_MIN
, SCTPCTL_MAX_CHAINED_MBUFS_MAX
);
586 RANGECHK(SCTP_BASE_SYSCTL(sctp_do_drain
), SCTPCTL_DO_SCTP_DRAIN_MIN
, SCTPCTL_DO_SCTP_DRAIN_MAX
);
587 RANGECHK(SCTP_BASE_SYSCTL(sctp_hb_maxburst
), SCTPCTL_HB_MAX_BURST_MIN
, SCTPCTL_HB_MAX_BURST_MAX
);
588 RANGECHK(SCTP_BASE_SYSCTL(sctp_abort_if_one_2_one_hits_limit
), SCTPCTL_ABORT_AT_LIMIT_MIN
, SCTPCTL_ABORT_AT_LIMIT_MAX
);
589 RANGECHK(SCTP_BASE_SYSCTL(sctp_strict_data_order
), SCTPCTL_STRICT_DATA_ORDER_MIN
, SCTPCTL_STRICT_DATA_ORDER_MAX
);
590 RANGECHK(SCTP_BASE_SYSCTL(sctp_min_residual
), SCTPCTL_MIN_RESIDUAL_MIN
, SCTPCTL_MIN_RESIDUAL_MAX
);
591 RANGECHK(SCTP_BASE_SYSCTL(sctp_max_retran_chunk
), SCTPCTL_MAX_RETRAN_CHUNK_MIN
, SCTPCTL_MAX_RETRAN_CHUNK_MAX
);
592 RANGECHK(SCTP_BASE_SYSCTL(sctp_logging_level
), SCTPCTL_LOGGING_LEVEL_MIN
, SCTPCTL_LOGGING_LEVEL_MAX
);
593 RANGECHK(SCTP_BASE_SYSCTL(sctp_default_cc_module
), SCTPCTL_DEFAULT_CC_MODULE_MIN
, SCTPCTL_DEFAULT_CC_MODULE_MAX
);
594 RANGECHK(SCTP_BASE_SYSCTL(sctp_default_frag_interleave
), SCTPCTL_DEFAULT_FRAG_INTERLEAVE_MIN
, SCTPCTL_DEFAULT_FRAG_INTERLEAVE_MAX
);
595 #if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_BASE)
596 RANGECHK(SCTP_BASE_SYSCTL(sctp_mobility_base
), SCTPCTL_MOBILITY_BASE_MIN
, SCTPCTL_MOBILITY_BASE_MAX
);
598 #if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_FASTHANDOFF)
599 RANGECHK(SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff
), SCTPCTL_MOBILITY_FASTHANDOFF_MIN
, SCTPCTL_MOBILITY_FASTHANDOFF_MAX
);
601 RANGECHK(SCTP_BASE_SYSCTL(sctp_udp_tunneling_for_client_enable
), SCTPCTL_UDP_TUNNELING_FOR_CLIENT_ENABLE_MIN
, SCTPCTL_UDP_TUNNELING_FOR_CLIENT_ENABLE_MAX
);
602 RANGECHK(SCTP_BASE_SYSCTL(sctp_enable_sack_immediately
), SCTPCTL_SACK_IMMEDIATELY_ENABLE_MIN
, SCTPCTL_SACK_IMMEDIATELY_ENABLE_MAX
);
604 RANGECHK(SCTP_BASE_SYSCTL(sctp_debug_on
), SCTPCTL_DEBUG_MIN
, SCTPCTL_DEBUG_MAX
);
606 #if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
607 RANGECHK(SCTP_BASE_SYSCTL(sctp_output_unlocked
), SCTPCTL_OUTPUT_UNLOCKED_MIN
, SCTPCTL_OUTPUT_UNLOCKED_MAX
);
615 #if defined(SCTP_LOCAL_TRACE_BUF)
617 sysctl_sctp_cleartrace(SYSCTL_HANDLER_ARGS
)
619 memset(&SCTP_BASE_SYSCTL(sctp_log
), 0, sizeof(struct sctp_log
));
631 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, sendspace
, CTLTYPE_INT
| CTLFLAG_RW
,
632 &SCTP_BASE_SYSCTL(sctp_sendspace
), 0, sysctl_sctp_check
, "IU",
633 SCTPCTL_MAXDGRAM_DESC
);
635 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, recvspace
, CTLTYPE_INT
| CTLFLAG_RW
,
636 &SCTP_BASE_SYSCTL(sctp_recvspace
), 0, sysctl_sctp_check
, "IU",
637 SCTPCTL_RECVSPACE_DESC
);
639 #if defined(__FreeBSD__) || defined(SCTP_APPLE_AUTO_ASCONF)
640 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, auto_asconf
, CTLTYPE_INT
| CTLFLAG_RW
,
641 &SCTP_BASE_SYSCTL(sctp_auto_asconf
), 0, sysctl_sctp_check
, "IU",
642 SCTPCTL_AUTOASCONF_DESC
);
645 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, ecn_enable
, CTLTYPE_INT
| CTLFLAG_RW
,
646 &SCTP_BASE_SYSCTL(sctp_ecn_enable
), 0, sysctl_sctp_check
, "IU",
647 SCTPCTL_ECN_ENABLE_DESC
);
649 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, ecn_nonce
, CTLTYPE_INT
| CTLFLAG_RW
,
650 &SCTP_BASE_SYSCTL(sctp_ecn_nonce
), 0, sysctl_sctp_check
, "IU",
651 SCTPCTL_ECN_NONCE_DESC
);
653 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, strict_sacks
, CTLTYPE_INT
| CTLFLAG_RW
,
654 &SCTP_BASE_SYSCTL(sctp_strict_sacks
), 0, sysctl_sctp_check
, "IU",
655 SCTPCTL_STRICT_SACKS_DESC
);
657 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, loopback_nocsum
, CTLTYPE_INT
| CTLFLAG_RW
,
658 &SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback
), 0, sysctl_sctp_check
, "IU",
659 SCTPCTL_LOOPBACK_NOCSUM_DESC
);
661 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, strict_init
, CTLTYPE_INT
| CTLFLAG_RW
,
662 &SCTP_BASE_SYSCTL(sctp_strict_init
), 0, sysctl_sctp_check
, "IU",
663 SCTPCTL_STRICT_INIT_DESC
);
665 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, peer_chkoh
, CTLTYPE_INT
| CTLFLAG_RW
,
666 &SCTP_BASE_SYSCTL(sctp_peer_chunk_oh
), 0, sysctl_sctp_check
, "IU",
667 SCTPCTL_PEER_CHKOH_DESC
);
669 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, maxburst
, CTLTYPE_INT
| CTLFLAG_RW
,
670 &SCTP_BASE_SYSCTL(sctp_max_burst_default
), 0, sysctl_sctp_check
, "IU",
671 SCTPCTL_MAXBURST_DESC
);
673 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, maxchunks
, CTLTYPE_INT
| CTLFLAG_RW
,
674 &SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue
), 0, sysctl_sctp_check
, "IU",
675 SCTPCTL_MAXCHUNKS_DESC
);
677 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, tcbhashsize
, CTLTYPE_INT
| CTLFLAG_RW
,
678 &SCTP_BASE_SYSCTL(sctp_hashtblsize
), 0, sysctl_sctp_check
, "IU",
679 SCTPCTL_TCBHASHSIZE_DESC
);
681 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, pcbhashsize
, CTLTYPE_INT
| CTLFLAG_RW
,
682 &SCTP_BASE_SYSCTL(sctp_pcbtblsize
), 0, sysctl_sctp_check
, "IU",
683 SCTPCTL_PCBHASHSIZE_DESC
);
685 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, min_split_point
, CTLTYPE_INT
| CTLFLAG_RW
,
686 &SCTP_BASE_SYSCTL(sctp_min_split_point
), 0, sysctl_sctp_check
, "IU",
687 SCTPCTL_MIN_SPLIT_POINT_DESC
);
689 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, chunkscale
, CTLTYPE_INT
| CTLFLAG_RW
,
690 &SCTP_BASE_SYSCTL(sctp_chunkscale
), 0, sysctl_sctp_check
, "IU",
691 SCTPCTL_CHUNKSCALE_DESC
);
693 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, delayed_sack_time
, CTLTYPE_INT
| CTLFLAG_RW
,
694 &SCTP_BASE_SYSCTL(sctp_delayed_sack_time_default
), 0, sysctl_sctp_check
, "IU",
695 SCTPCTL_DELAYED_SACK_TIME_DESC
);
697 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, sack_freq
, CTLTYPE_INT
| CTLFLAG_RW
,
698 &SCTP_BASE_SYSCTL(sctp_sack_freq_default
), 0, sysctl_sctp_check
, "IU",
699 SCTPCTL_SACK_FREQ_DESC
);
701 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, sys_resource
, CTLTYPE_INT
| CTLFLAG_RW
,
702 &SCTP_BASE_SYSCTL(sctp_system_free_resc_limit
), 0, sysctl_sctp_check
, "IU",
703 SCTPCTL_SYS_RESOURCE_DESC
);
705 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, asoc_resource
, CTLTYPE_INT
| CTLFLAG_RW
,
706 &SCTP_BASE_SYSCTL(sctp_asoc_free_resc_limit
), 0, sysctl_sctp_check
, "IU",
707 SCTPCTL_ASOC_RESOURCE_DESC
);
709 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, heartbeat_interval
, CTLTYPE_INT
| CTLFLAG_RW
,
710 &SCTP_BASE_SYSCTL(sctp_heartbeat_interval_default
), 0, sysctl_sctp_check
, "IU",
711 SCTPCTL_HEARTBEAT_INTERVAL_DESC
);
713 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, pmtu_raise_time
, CTLTYPE_INT
| CTLFLAG_RW
,
714 &SCTP_BASE_SYSCTL(sctp_pmtu_raise_time_default
), 0, sysctl_sctp_check
, "IU",
715 SCTPCTL_PMTU_RAISE_TIME_DESC
);
717 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, shutdown_guard_time
, CTLTYPE_INT
| CTLFLAG_RW
,
718 &SCTP_BASE_SYSCTL(sctp_shutdown_guard_time_default
), 0, sysctl_sctp_check
, "IU",
719 SCTPCTL_SHUTDOWN_GUARD_TIME_DESC
);
721 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, secret_lifetime
, CTLTYPE_INT
| CTLFLAG_RW
,
722 &SCTP_BASE_SYSCTL(sctp_secret_lifetime_default
), 0, sysctl_sctp_check
, "IU",
723 SCTPCTL_SECRET_LIFETIME_DESC
);
725 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, rto_max
, CTLTYPE_INT
| CTLFLAG_RW
,
726 &SCTP_BASE_SYSCTL(sctp_rto_max_default
), 0, sysctl_sctp_check
, "IU",
727 SCTPCTL_RTO_MAX_DESC
);
729 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, rto_min
, CTLTYPE_INT
| CTLFLAG_RW
,
730 &SCTP_BASE_SYSCTL(sctp_rto_min_default
), 0, sysctl_sctp_check
, "IU",
731 SCTPCTL_RTO_MIN_DESC
);
733 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, rto_initial
, CTLTYPE_INT
| CTLFLAG_RW
,
734 &SCTP_BASE_SYSCTL(sctp_rto_initial_default
), 0, sysctl_sctp_check
, "IU",
735 SCTPCTL_RTO_INITIAL_DESC
);
737 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, init_rto_max
, CTLTYPE_INT
| CTLFLAG_RW
,
738 &SCTP_BASE_SYSCTL(sctp_init_rto_max_default
), 0, sysctl_sctp_check
, "IU",
739 SCTPCTL_INIT_RTO_MAX_DESC
);
741 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, valid_cookie_life
, CTLTYPE_INT
| CTLFLAG_RW
,
742 &SCTP_BASE_SYSCTL(sctp_valid_cookie_life_default
), 0, sysctl_sctp_check
, "IU",
743 SCTPCTL_VALID_COOKIE_LIFE_DESC
);
745 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, init_rtx_max
, CTLTYPE_INT
| CTLFLAG_RW
,
746 &SCTP_BASE_SYSCTL(sctp_init_rtx_max_default
), 0, sysctl_sctp_check
, "IU",
747 SCTPCTL_INIT_RTX_MAX_DESC
);
749 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, assoc_rtx_max
, CTLTYPE_INT
| CTLFLAG_RW
,
750 &SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default
), 0, sysctl_sctp_check
, "IU",
751 SCTPCTL_ASSOC_RTX_MAX_DESC
);
753 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, path_rtx_max
, CTLTYPE_INT
| CTLFLAG_RW
,
754 &SCTP_BASE_SYSCTL(sctp_path_rtx_max_default
), 0, sysctl_sctp_check
, "IU",
755 SCTPCTL_PATH_RTX_MAX_DESC
);
757 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, add_more_on_output
, CTLTYPE_INT
| CTLFLAG_RW
,
758 &SCTP_BASE_SYSCTL(sctp_add_more_threshold
), 0, sysctl_sctp_check
, "IU",
759 SCTPCTL_ADD_MORE_ON_OUTPUT_DESC
);
761 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, outgoing_streams
, CTLTYPE_INT
| CTLFLAG_RW
,
762 &SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default
), 0, sysctl_sctp_check
, "IU",
763 SCTPCTL_OUTGOING_STREAMS_DESC
);
765 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, cmt_on_off
, CTLTYPE_INT
| CTLFLAG_RW
,
766 &SCTP_BASE_SYSCTL(sctp_cmt_on_off
), 0, sysctl_sctp_check
, "IU",
767 SCTPCTL_CMT_ON_OFF_DESC
);
769 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, cmt_use_dac
, CTLTYPE_INT
| CTLFLAG_RW
,
770 &SCTP_BASE_SYSCTL(sctp_cmt_use_dac
), 0, sysctl_sctp_check
, "IU",
771 SCTPCTL_CMT_USE_DAC_DESC
);
773 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, cmt_pf
, CTLTYPE_INT
| CTLFLAG_RW
,
774 &SCTP_BASE_SYSCTL(sctp_cmt_pf
), 0, sysctl_sctp_check
, "IU",
775 SCTPCTL_CMT_PF_DESC
);
777 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, cwnd_maxburst
, CTLTYPE_INT
| CTLFLAG_RW
,
778 &SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst
), 0, sysctl_sctp_check
, "IU",
779 SCTPCTL_CWND_MAXBURST_DESC
);
781 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, early_fast_retran
, CTLTYPE_INT
| CTLFLAG_RW
,
782 &SCTP_BASE_SYSCTL(sctp_early_fr
), 0, sysctl_sctp_check
, "IU",
783 SCTPCTL_EARLY_FAST_RETRAN_DESC
);
785 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, early_fast_retran_msec
, CTLTYPE_INT
| CTLFLAG_RW
,
786 &SCTP_BASE_SYSCTL(sctp_early_fr_msec
), 0, sysctl_sctp_check
, "IU",
787 SCTPCTL_EARLY_FAST_RETRAN_MSEC_DESC
);
789 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, asconf_auth_nochk
, CTLTYPE_INT
| CTLFLAG_RW
,
790 &SCTP_BASE_SYSCTL(sctp_asconf_auth_nochk
), 0, sysctl_sctp_check
, "IU",
791 SCTPCTL_ASCONF_AUTH_NOCHK_DESC
);
793 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, auth_disable
, CTLTYPE_INT
| CTLFLAG_RW
,
794 &SCTP_BASE_SYSCTL(sctp_auth_disable
), 0, sysctl_sctp_check
, "IU",
795 SCTPCTL_AUTH_DISABLE_DESC
);
797 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, nat_friendly
, CTLTYPE_INT
| CTLFLAG_RW
,
798 &SCTP_BASE_SYSCTL(sctp_nat_friendly
), 0, sysctl_sctp_check
, "IU",
799 SCTPCTL_NAT_FRIENDLY_DESC
);
801 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, abc_l_var
, CTLTYPE_INT
| CTLFLAG_RW
,
802 &SCTP_BASE_SYSCTL(sctp_L2_abc_variable
), 0, sysctl_sctp_check
, "IU",
803 SCTPCTL_ABC_L_VAR_DESC
);
805 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, max_chained_mbufs
, CTLTYPE_INT
| CTLFLAG_RW
,
806 &SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count
), 0, sysctl_sctp_check
, "IU",
807 SCTPCTL_MAX_CHAINED_MBUFS_DESC
);
809 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, do_sctp_drain
, CTLTYPE_INT
| CTLFLAG_RW
,
810 &SCTP_BASE_SYSCTL(sctp_do_drain
), 0, sysctl_sctp_check
, "IU",
811 SCTPCTL_DO_SCTP_DRAIN_DESC
);
813 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, hb_max_burst
, CTLTYPE_INT
| CTLFLAG_RW
,
814 &SCTP_BASE_SYSCTL(sctp_hb_maxburst
), 0, sysctl_sctp_check
, "IU",
815 SCTPCTL_HB_MAX_BURST_DESC
);
817 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, abort_at_limit
, CTLTYPE_INT
| CTLFLAG_RW
,
818 &SCTP_BASE_SYSCTL(sctp_abort_if_one_2_one_hits_limit
), 0, sysctl_sctp_check
, "IU",
819 SCTPCTL_ABORT_AT_LIMIT_DESC
);
821 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, strict_data_order
, CTLTYPE_INT
| CTLFLAG_RW
,
822 &SCTP_BASE_SYSCTL(sctp_strict_data_order
), 0, sysctl_sctp_check
, "IU",
823 SCTPCTL_STRICT_DATA_ORDER_DESC
);
825 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, min_residual
, CTLTYPE_INT
| CTLFLAG_RW
,
826 &SCTP_BASE_SYSCTL(sctp_min_residual
), 0, sysctl_sctp_check
, "IU",
827 SCTPCTL_MIN_RESIDUAL_DESC
);
829 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, max_retran_chunk
, CTLTYPE_INT
| CTLFLAG_RW
,
830 &SCTP_BASE_SYSCTL(sctp_max_retran_chunk
), 0, sysctl_sctp_check
, "IU",
831 SCTPCTL_MAX_RETRAN_CHUNK_DESC
);
833 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, log_level
, CTLTYPE_INT
| CTLFLAG_RW
,
834 &SCTP_BASE_SYSCTL(sctp_logging_level
), 0, sysctl_sctp_check
, "IU",
835 SCTPCTL_LOGGING_LEVEL_DESC
);
837 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, default_cc_module
, CTLTYPE_INT
| CTLFLAG_RW
,
838 &SCTP_BASE_SYSCTL(sctp_default_cc_module
), 0, sysctl_sctp_check
, "IU",
839 SCTPCTL_DEFAULT_CC_MODULE_DESC
);
841 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, default_frag_interleave
, CTLTYPE_INT
| CTLFLAG_RW
,
842 &SCTP_BASE_SYSCTL(sctp_default_frag_interleave
), 0, sysctl_sctp_check
, "IU",
843 SCTPCTL_DEFAULT_FRAG_INTERLEAVE_DESC
);
845 #if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_BASE)
846 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, mobility_base
, CTLTYPE_INT
| CTLFLAG_RW
,
847 &SCTP_BASE_SYSCTL(sctp_mobility_base
), 0, sysctl_sctp_check
, "IU",
848 SCTPCTL_MOBILITY_BASE_DESC
);
851 #if defined(__FreeBSD__) || defined(SCTP_APPLE_MOBILITY_FASTHANDOFF)
852 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, mobility_fasthandoff
, CTLTYPE_INT
| CTLFLAG_RW
,
853 &SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff
), 0, sysctl_sctp_check
, "IU",
854 SCTPCTL_MOBILITY_FASTHANDOFF_DESC
);
857 #if defined(SCTP_LOCAL_TRACE_BUF)
858 SYSCTL_STRUCT(_net_inet_sctp
, OID_AUTO
, log
, CTLFLAG_RD
,
859 &SCTP_BASE_SYSCTL(sctp_log
), sctp_log
,
860 "SCTP logging (struct sctp_log)");
862 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, clear_trace
, CTLTYPE_OPAQUE
| CTLFLAG_RW
,
863 &SCTP_BASE_SYSCTL(sctp_log
), 0, sysctl_sctp_cleartrace
, "IU",
864 "Clear SCTP Logging buffer");
870 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, udp_tunneling_for_client_enable
, CTLTYPE_INT
| CTLFLAG_RW
,
871 &SCTP_BASE_SYSCTL(sctp_udp_tunneling_for_client_enable
), 0, sysctl_sctp_check
, "IU",
872 SCTPCTL_UDP_TUNNELING_FOR_CLIENT_ENABLE_DESC
);
874 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, udp_tunneling_port
, CTLTYPE_INT
| CTLFLAG_RW
,
875 &SCTP_BASE_SYSCTL(sctp_udp_tunneling_port
), 0, sysctl_sctp_udp_tunneling_check
, "IU",
876 SCTPCTL_UDP_TUNNELING_PORT_DESC
);
878 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, enable_sack_immediately
, CTLTYPE_INT
| CTLFLAG_RW
,
879 &SCTP_BASE_SYSCTL(sctp_enable_sack_immediately
), 0, sysctl_sctp_check
, "IU",
880 SCTPCTL_SACK_IMMEDIATELY_ENABLE_DESC
);
883 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, debug
, CTLTYPE_INT
| CTLFLAG_RW
,
884 &SCTP_BASE_SYSCTL(sctp_debug_on
), 0, sysctl_sctp_check
, "IU",
886 #endif /* SCTP_DEBUG */
889 #if defined (__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
890 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, output_unlocked
, CTLTYPE_INT
| CTLFLAG_RW
,
891 &SCTP_BASE_SYSCTL(sctp_output_unlocked
), 0, sysctl_sctp_check
, "IU",
892 SCTPCTL_OUTPUT_UNLOCKED_DESC
);
895 SYSCTL_STRUCT(_net_inet_sctp
, OID_AUTO
, stats
, CTLFLAG_RW
,
896 &SCTP_BASE_STATS
, sctpstat
,
897 "SCTP statistics (struct sctp_stat)");
899 SYSCTL_PROC(_net_inet_sctp
, OID_AUTO
, assoclist
, CTLFLAG_RD
,
900 0, 0, sctp_assoclist
,
901 "S,xassoc", "List of active SCTP associations");