/src/usrsctp/usrsctplib/netinet/sctp_sysctl.c
Line | Count | Source |
1 | | /*- |
2 | | * SPDX-License-Identifier: BSD-3-Clause |
3 | | * |
4 | | * Copyright (c) 2007, by Cisco Systems, Inc. All rights reserved. |
5 | | * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. |
6 | | * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. |
7 | | * |
8 | | * Redistribution and use in source and binary forms, with or without |
9 | | * modification, are permitted provided that the following conditions are met: |
10 | | * |
11 | | * a) Redistributions of source code must retain the above copyright notice, |
12 | | * this list of conditions and the following disclaimer. |
13 | | * |
14 | | * b) Redistributions in binary form must reproduce the above copyright |
15 | | * notice, this list of conditions and the following disclaimer in |
16 | | * the documentation and/or other materials provided with the distribution. |
17 | | * |
18 | | * c) Neither the name of Cisco Systems, Inc. nor the names of its |
19 | | * contributors may be used to endorse or promote products derived |
20 | | * from this software without specific prior written permission. |
21 | | * |
22 | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
23 | | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
24 | | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
25 | | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
26 | | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
27 | | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
28 | | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
29 | | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
30 | | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
31 | | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
32 | | * THE POSSIBILITY OF SUCH DAMAGE. |
33 | | */ |
34 | | |
35 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
36 | | #include <sys/cdefs.h> |
37 | | __FBSDID("$FreeBSD$"); |
38 | | #endif |
39 | | |
40 | | #include <netinet/sctp_os.h> |
41 | | #include <netinet/sctp.h> |
42 | | #include <netinet/sctp_constants.h> |
43 | | #include <netinet/sctp_sysctl.h> |
44 | | #include <netinet/sctp_pcb.h> |
45 | | #include <netinet/sctputil.h> |
46 | | #include <netinet/sctp_output.h> |
47 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
48 | | #include <sys/smp.h> |
49 | | #include <sys/sysctl.h> |
50 | | #endif |
51 | | #if defined(__APPLE__) && !defined(__Userspace__) |
52 | | #include <netinet/sctp_bsd_addr.h> |
53 | | #endif |
54 | | |
55 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
56 | | FEATURE(sctp, "Stream Control Transmission Protocol"); |
57 | | #endif |
58 | | |
59 | | /* |
60 | | * sysctl tunable variables |
61 | | */ |
62 | | |
63 | | void |
64 | | sctp_init_sysctls(void) |
65 | 3 | { |
66 | 3 | SCTP_BASE_SYSCTL(sctp_sendspace) = SCTPCTL_MAXDGRAM_DEFAULT; |
67 | 3 | SCTP_BASE_SYSCTL(sctp_recvspace) = SCTPCTL_RECVSPACE_DEFAULT; |
68 | 3 | SCTP_BASE_SYSCTL(sctp_auto_asconf) = SCTPCTL_AUTOASCONF_DEFAULT; |
69 | 3 | SCTP_BASE_SYSCTL(sctp_multiple_asconfs) = SCTPCTL_MULTIPLEASCONFS_DEFAULT; |
70 | 3 | SCTP_BASE_SYSCTL(sctp_ecn_enable) = SCTPCTL_ECN_ENABLE_DEFAULT; |
71 | 3 | SCTP_BASE_SYSCTL(sctp_pr_enable) = SCTPCTL_PR_ENABLE_DEFAULT; |
72 | 3 | SCTP_BASE_SYSCTL(sctp_auth_enable) = SCTPCTL_AUTH_ENABLE_DEFAULT; |
73 | 3 | SCTP_BASE_SYSCTL(sctp_asconf_enable) = SCTPCTL_ASCONF_ENABLE_DEFAULT; |
74 | 3 | SCTP_BASE_SYSCTL(sctp_reconfig_enable) = SCTPCTL_RECONFIG_ENABLE_DEFAULT; |
75 | 3 | SCTP_BASE_SYSCTL(sctp_nrsack_enable) = SCTPCTL_NRSACK_ENABLE_DEFAULT; |
76 | 3 | SCTP_BASE_SYSCTL(sctp_pktdrop_enable) = SCTPCTL_PKTDROP_ENABLE_DEFAULT; |
77 | 3 | #if !(defined(__FreeBSD__) && !defined(__Userspace__)) |
78 | 3 | SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback) = SCTPCTL_LOOPBACK_NOCSUM_DEFAULT; |
79 | 3 | #endif |
80 | 3 | SCTP_BASE_SYSCTL(sctp_peer_chunk_oh) = SCTPCTL_PEER_CHKOH_DEFAULT; |
81 | 3 | SCTP_BASE_SYSCTL(sctp_max_burst_default) = SCTPCTL_MAXBURST_DEFAULT; |
82 | 3 | SCTP_BASE_SYSCTL(sctp_fr_max_burst_default) = SCTPCTL_FRMAXBURST_DEFAULT; |
83 | 3 | SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue) = SCTPCTL_MAXCHUNKS_DEFAULT; |
84 | 3 | #if defined(__Userspace__) |
85 | 3 | if (SCTP_BASE_SYSCTL(sctp_hashtblsize) == 0) { |
86 | 3 | SCTP_BASE_SYSCTL(sctp_hashtblsize) = SCTPCTL_TCBHASHSIZE_DEFAULT; |
87 | 3 | } |
88 | | #else |
89 | | SCTP_BASE_SYSCTL(sctp_hashtblsize) = SCTPCTL_TCBHASHSIZE_DEFAULT; |
90 | | #endif |
91 | 3 | #if defined(__Userspace__) |
92 | 3 | if (SCTP_BASE_SYSCTL(sctp_pcbtblsize) == 0) { |
93 | 3 | SCTP_BASE_SYSCTL(sctp_pcbtblsize) = SCTPCTL_PCBHASHSIZE_DEFAULT; |
94 | 3 | } |
95 | | #else |
96 | | SCTP_BASE_SYSCTL(sctp_pcbtblsize) = SCTPCTL_PCBHASHSIZE_DEFAULT; |
97 | | #endif |
98 | 3 | SCTP_BASE_SYSCTL(sctp_min_split_point) = SCTPCTL_MIN_SPLIT_POINT_DEFAULT; |
99 | 3 | #if defined(__Userspace__) |
100 | 3 | if (SCTP_BASE_SYSCTL(sctp_chunkscale) == 0) { |
101 | 3 | SCTP_BASE_SYSCTL(sctp_chunkscale) = SCTPCTL_CHUNKSCALE_DEFAULT; |
102 | 3 | } |
103 | | #else |
104 | | SCTP_BASE_SYSCTL(sctp_chunkscale) = SCTPCTL_CHUNKSCALE_DEFAULT; |
105 | | #endif |
106 | 3 | SCTP_BASE_SYSCTL(sctp_delayed_sack_time_default) = SCTPCTL_DELAYED_SACK_TIME_DEFAULT; |
107 | 3 | SCTP_BASE_SYSCTL(sctp_sack_freq_default) = SCTPCTL_SACK_FREQ_DEFAULT; |
108 | 3 | SCTP_BASE_SYSCTL(sctp_system_free_resc_limit) = SCTPCTL_SYS_RESOURCE_DEFAULT; |
109 | 3 | SCTP_BASE_SYSCTL(sctp_asoc_free_resc_limit) = SCTPCTL_ASOC_RESOURCE_DEFAULT; |
110 | 3 | SCTP_BASE_SYSCTL(sctp_heartbeat_interval_default) = SCTPCTL_HEARTBEAT_INTERVAL_DEFAULT; |
111 | 3 | SCTP_BASE_SYSCTL(sctp_pmtu_raise_time_default) = SCTPCTL_PMTU_RAISE_TIME_DEFAULT; |
112 | 3 | SCTP_BASE_SYSCTL(sctp_shutdown_guard_time_default) = SCTPCTL_SHUTDOWN_GUARD_TIME_DEFAULT; |
113 | 3 | SCTP_BASE_SYSCTL(sctp_secret_lifetime_default) = SCTPCTL_SECRET_LIFETIME_DEFAULT; |
114 | 3 | SCTP_BASE_SYSCTL(sctp_rto_max_default) = SCTPCTL_RTO_MAX_DEFAULT; |
115 | 3 | SCTP_BASE_SYSCTL(sctp_rto_min_default) = SCTPCTL_RTO_MIN_DEFAULT; |
116 | 3 | SCTP_BASE_SYSCTL(sctp_rto_initial_default) = SCTPCTL_RTO_INITIAL_DEFAULT; |
117 | 3 | SCTP_BASE_SYSCTL(sctp_init_rto_max_default) = SCTPCTL_INIT_RTO_MAX_DEFAULT; |
118 | 3 | SCTP_BASE_SYSCTL(sctp_valid_cookie_life_default) = SCTPCTL_VALID_COOKIE_LIFE_DEFAULT; |
119 | 3 | SCTP_BASE_SYSCTL(sctp_init_rtx_max_default) = SCTPCTL_INIT_RTX_MAX_DEFAULT; |
120 | 3 | SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default) = SCTPCTL_ASSOC_RTX_MAX_DEFAULT; |
121 | 3 | SCTP_BASE_SYSCTL(sctp_path_rtx_max_default) = SCTPCTL_PATH_RTX_MAX_DEFAULT; |
122 | 3 | SCTP_BASE_SYSCTL(sctp_path_pf_threshold) = SCTPCTL_PATH_PF_THRESHOLD_DEFAULT; |
123 | 3 | SCTP_BASE_SYSCTL(sctp_add_more_threshold) = SCTPCTL_ADD_MORE_ON_OUTPUT_DEFAULT; |
124 | 3 | SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default) = SCTPCTL_INCOMING_STREAMS_DEFAULT; |
125 | 3 | SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default) = SCTPCTL_OUTGOING_STREAMS_DEFAULT; |
126 | 3 | SCTP_BASE_SYSCTL(sctp_cmt_on_off) = SCTPCTL_CMT_ON_OFF_DEFAULT; |
127 | 3 | SCTP_BASE_SYSCTL(sctp_cmt_use_dac) = SCTPCTL_CMT_USE_DAC_DEFAULT; |
128 | 3 | SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst) = SCTPCTL_CWND_MAXBURST_DEFAULT; |
129 | 3 | SCTP_BASE_SYSCTL(sctp_nat_friendly) = SCTPCTL_NAT_FRIENDLY_DEFAULT; |
130 | 3 | SCTP_BASE_SYSCTL(sctp_L2_abc_variable) = SCTPCTL_ABC_L_VAR_DEFAULT; |
131 | 3 | SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count) = SCTPCTL_MAX_CHAINED_MBUFS_DEFAULT; |
132 | 3 | SCTP_BASE_SYSCTL(sctp_do_drain) = SCTPCTL_DO_SCTP_DRAIN_DEFAULT; |
133 | 3 | SCTP_BASE_SYSCTL(sctp_hb_maxburst) = SCTPCTL_HB_MAX_BURST_DEFAULT; |
134 | 3 | SCTP_BASE_SYSCTL(sctp_abort_if_one_2_one_hits_limit) = SCTPCTL_ABORT_AT_LIMIT_DEFAULT; |
135 | 3 | SCTP_BASE_SYSCTL(sctp_min_residual) = SCTPCTL_MIN_RESIDUAL_DEFAULT; |
136 | 3 | SCTP_BASE_SYSCTL(sctp_max_retran_chunk) = SCTPCTL_MAX_RETRAN_CHUNK_DEFAULT; |
137 | 3 | SCTP_BASE_SYSCTL(sctp_logging_level) = SCTPCTL_LOGGING_LEVEL_DEFAULT; |
138 | 3 | SCTP_BASE_SYSCTL(sctp_default_cc_module) = SCTPCTL_DEFAULT_CC_MODULE_DEFAULT; |
139 | 3 | SCTP_BASE_SYSCTL(sctp_default_ss_module) = SCTPCTL_DEFAULT_SS_MODULE_DEFAULT; |
140 | 3 | SCTP_BASE_SYSCTL(sctp_default_frag_interleave) = SCTPCTL_DEFAULT_FRAG_INTERLEAVE_DEFAULT; |
141 | 3 | SCTP_BASE_SYSCTL(sctp_mobility_base) = SCTPCTL_MOBILITY_BASE_DEFAULT; |
142 | 3 | SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff) = SCTPCTL_MOBILITY_FASTHANDOFF_DEFAULT; |
143 | 3 | SCTP_BASE_SYSCTL(sctp_vtag_time_wait) = SCTPCTL_TIME_WAIT_DEFAULT; |
144 | 3 | SCTP_BASE_SYSCTL(sctp_buffer_splitting) = SCTPCTL_BUFFER_SPLITTING_DEFAULT; |
145 | 3 | SCTP_BASE_SYSCTL(sctp_initial_cwnd) = SCTPCTL_INITIAL_CWND_DEFAULT; |
146 | 3 | SCTP_BASE_SYSCTL(sctp_rttvar_bw) = SCTPCTL_RTTVAR_BW_DEFAULT; |
147 | 3 | SCTP_BASE_SYSCTL(sctp_rttvar_rtt) = SCTPCTL_RTTVAR_RTT_DEFAULT; |
148 | 3 | SCTP_BASE_SYSCTL(sctp_rttvar_eqret) = SCTPCTL_RTTVAR_EQRET_DEFAULT; |
149 | 3 | SCTP_BASE_SYSCTL(sctp_steady_step) = SCTPCTL_RTTVAR_STEADYS_DEFAULT; |
150 | 3 | SCTP_BASE_SYSCTL(sctp_use_dccc_ecn) = SCTPCTL_RTTVAR_DCCCECN_DEFAULT; |
151 | 3 | SCTP_BASE_SYSCTL(sctp_blackhole) = SCTPCTL_BLACKHOLE_DEFAULT; |
152 | 3 | SCTP_BASE_SYSCTL(sctp_sendall_limit) = SCTPCTL_SENDALL_LIMIT_DEFAULT; |
153 | 3 | SCTP_BASE_SYSCTL(sctp_diag_info_code) = SCTPCTL_DIAG_INFO_CODE_DEFAULT; |
154 | | #if defined(SCTP_LOCAL_TRACE_BUF) |
155 | | #if defined(_WIN32) && !defined(__Userspace__) |
156 | | /* On Windows, the resource for global variables is limited. */ |
157 | | MALLOC(SCTP_BASE_SYSCTL(sctp_log), struct sctp_log *, sizeof(struct sctp_log), M_SYSCTL, M_ZERO); |
158 | | #else |
159 | | memset(&SCTP_BASE_SYSCTL(sctp_log), 0, sizeof(struct sctp_log)); |
160 | | #endif |
161 | | #endif |
162 | 3 | SCTP_BASE_SYSCTL(sctp_udp_tunneling_port) = SCTPCTL_UDP_TUNNELING_PORT_DEFAULT; |
163 | 3 | SCTP_BASE_SYSCTL(sctp_enable_sack_immediately) = SCTPCTL_SACK_IMMEDIATELY_ENABLE_DEFAULT; |
164 | 3 | SCTP_BASE_SYSCTL(sctp_inits_include_nat_friendly) = SCTPCTL_NAT_FRIENDLY_INITS_DEFAULT; |
165 | | #if defined(SCTP_DEBUG) |
166 | | SCTP_BASE_SYSCTL(sctp_debug_on) = SCTPCTL_DEBUG_DEFAULT; |
167 | | #endif |
168 | | #if defined(__APPLE__) && !defined(__Userspace__) |
169 | | SCTP_BASE_SYSCTL(sctp_ignore_vmware_interfaces) = SCTPCTL_IGNORE_VMWARE_INTERFACES_DEFAULT; |
170 | | SCTP_BASE_SYSCTL(sctp_main_timer) = SCTPCTL_MAIN_TIMER_DEFAULT; |
171 | | SCTP_BASE_SYSCTL(sctp_addr_watchdog_limit) = SCTPCTL_ADDR_WATCHDOG_LIMIT_DEFAULT; |
172 | | SCTP_BASE_SYSCTL(sctp_vtag_watchdog_limit) = SCTPCTL_VTAG_WATCHDOG_LIMIT_DEFAULT; |
173 | | #endif |
174 | | #if defined(__APPLE__) && !defined(__Userspace__) |
175 | | SCTP_BASE_SYSCTL(sctp_output_unlocked) = SCTPCTL_OUTPUT_UNLOCKED_DEFAULT; |
176 | | #endif |
177 | 3 | } |
178 | | #if defined(_WIN32) && !defined(__Userspace__) |
179 | | |
180 | | void |
181 | | sctp_finish_sysctls() |
182 | | { |
183 | | #if defined(SCTP_LOCAL_TRACE_BUF) |
184 | | if (SCTP_BASE_SYSCTL(sctp_log) != NULL) { |
185 | | FREE(SCTP_BASE_SYSCTL(sctp_log), M_SYSCTL); |
186 | | SCTP_BASE_SYSCTL(sctp_log) = NULL; |
187 | | } |
188 | | #endif |
189 | | } |
190 | | #endif |
191 | | |
192 | | #if !defined(__Userspace__) |
193 | | /* It returns an upper limit. No filtering is done here */ |
194 | | static unsigned int |
195 | | sctp_sysctl_number_of_addresses(struct sctp_inpcb *inp) |
196 | | { |
197 | | unsigned int cnt; |
198 | | struct sctp_vrf *vrf; |
199 | | struct sctp_ifn *sctp_ifn; |
200 | | struct sctp_ifa *sctp_ifa; |
201 | | struct sctp_laddr *laddr; |
202 | | |
203 | | cnt = 0; |
204 | | /* neither Mac OS X nor FreeBSD support multiple routing functions */ |
205 | | if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) { |
206 | | return (0); |
207 | | } |
208 | | if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { |
209 | | LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { |
210 | | LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { |
211 | | switch (sctp_ifa->address.sa.sa_family) { |
212 | | #ifdef INET |
213 | | case AF_INET: |
214 | | #endif |
215 | | #ifdef INET6 |
216 | | case AF_INET6: |
217 | | #endif |
218 | | cnt++; |
219 | | break; |
220 | | default: |
221 | | break; |
222 | | } |
223 | | } |
224 | | } |
225 | | } else { |
226 | | LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { |
227 | | switch (laddr->ifa->address.sa.sa_family) { |
228 | | #ifdef INET |
229 | | case AF_INET: |
230 | | #endif |
231 | | #ifdef INET6 |
232 | | case AF_INET6: |
233 | | #endif |
234 | | cnt++; |
235 | | break; |
236 | | default: |
237 | | break; |
238 | | } |
239 | | } |
240 | | } |
241 | | return (cnt); |
242 | | } |
243 | | |
244 | | static int |
245 | | sctp_sysctl_copy_out_local_addresses(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sysctl_req *req) |
246 | | { |
247 | | struct sctp_ifn *sctp_ifn; |
248 | | struct sctp_ifa *sctp_ifa; |
249 | | int loopback_scope; |
250 | | #ifdef INET |
251 | | int ipv4_local_scope; |
252 | | int ipv4_addr_legal; |
253 | | #endif |
254 | | #ifdef INET6 |
255 | | int local_scope, site_scope; |
256 | | int ipv6_addr_legal; |
257 | | #endif |
258 | | #if defined(__Userspace__) |
259 | | int conn_addr_legal; |
260 | | #endif |
261 | | struct sctp_vrf *vrf; |
262 | | struct xsctp_laddr xladdr; |
263 | | struct sctp_laddr *laddr; |
264 | | int error; |
265 | | |
266 | | /* Turn on all the appropriate scope */ |
267 | | if (stcb != NULL) { |
268 | | /* use association specific values */ |
269 | | loopback_scope = stcb->asoc.scope.loopback_scope; |
270 | | #ifdef INET |
271 | | ipv4_local_scope = stcb->asoc.scope.ipv4_local_scope; |
272 | | ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal; |
273 | | #endif |
274 | | #ifdef INET6 |
275 | | local_scope = stcb->asoc.scope.local_scope; |
276 | | site_scope = stcb->asoc.scope.site_scope; |
277 | | ipv6_addr_legal = stcb->asoc.scope.ipv6_addr_legal; |
278 | | #endif |
279 | | #if defined(__Userspace__) |
280 | | conn_addr_legal = stcb->asoc.scope.conn_addr_legal; |
281 | | #endif |
282 | | } else { |
283 | | /* Use generic values for endpoints. */ |
284 | | loopback_scope = 1; |
285 | | #ifdef INET |
286 | | ipv4_local_scope = 1; |
287 | | #endif |
288 | | #ifdef INET6 |
289 | | local_scope = 1; |
290 | | site_scope = 1; |
291 | | #endif |
292 | | if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) { |
293 | | #ifdef INET6 |
294 | | ipv6_addr_legal = 1; |
295 | | #endif |
296 | | #ifdef INET |
297 | | if (SCTP_IPV6_V6ONLY(inp)) { |
298 | | ipv4_addr_legal = 0; |
299 | | } else { |
300 | | ipv4_addr_legal = 1; |
301 | | } |
302 | | #endif |
303 | | #if defined(__Userspace__) |
304 | | conn_addr_legal = 0; |
305 | | #endif |
306 | | } else { |
307 | | #ifdef INET6 |
308 | | ipv6_addr_legal = 0; |
309 | | #endif |
310 | | #if defined(__Userspace__) |
311 | | if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_CONN) { |
312 | | conn_addr_legal = 1; |
313 | | #ifdef INET |
314 | | ipv4_addr_legal = 0; |
315 | | #endif |
316 | | } else { |
317 | | conn_addr_legal = 0; |
318 | | #ifdef INET |
319 | | ipv4_addr_legal = 1; |
320 | | #endif |
321 | | } |
322 | | #else |
323 | | #ifdef INET |
324 | | ipv4_addr_legal = 1; |
325 | | #endif |
326 | | #endif |
327 | | } |
328 | | } |
329 | | |
330 | | /* Neither Mac OS X nor FreeBSD support multiple routing functions. */ |
331 | | if ((vrf = sctp_find_vrf(inp->def_vrf_id)) == NULL) { |
332 | | SCTP_INP_RUNLOCK(inp); |
333 | | SCTP_INP_INFO_RUNLOCK(); |
334 | | return (ENOENT); |
335 | | } |
336 | | if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) { |
337 | | LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) { |
338 | | if ((loopback_scope == 0) && SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) { |
339 | | /* Skip loopback if loopback_scope not set. */ |
340 | | continue; |
341 | | } |
342 | | LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) { |
343 | | if (stcb != NULL) { |
344 | | /* |
345 | | * Ignore if blacklisted at |
346 | | * association level. |
347 | | */ |
348 | | if (sctp_is_addr_restricted(stcb, sctp_ifa)) { |
349 | | continue; |
350 | | } |
351 | | } |
352 | | switch (sctp_ifa->address.sa.sa_family) { |
353 | | #ifdef INET |
354 | | case AF_INET: |
355 | | if (ipv4_addr_legal) { |
356 | | struct sockaddr_in *sin; |
357 | | |
358 | | sin = &sctp_ifa->address.sin; |
359 | | if (sin->sin_addr.s_addr == 0) { |
360 | | continue; |
361 | | } |
362 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
363 | | if (prison_check_ip4(inp->ip_inp.inp.inp_cred, |
364 | | &sin->sin_addr) != 0) { |
365 | | continue; |
366 | | } |
367 | | #endif |
368 | | if ((ipv4_local_scope == 0) && (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) { |
369 | | continue; |
370 | | } |
371 | | } else { |
372 | | continue; |
373 | | } |
374 | | break; |
375 | | #endif |
376 | | #ifdef INET6 |
377 | | case AF_INET6: |
378 | | if (ipv6_addr_legal) { |
379 | | struct sockaddr_in6 *sin6; |
380 | | |
381 | | sin6 = &sctp_ifa->address.sin6; |
382 | | if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { |
383 | | continue; |
384 | | } |
385 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
386 | | if (prison_check_ip6(inp->ip_inp.inp.inp_cred, |
387 | | &sin6->sin6_addr) != 0) { |
388 | | continue; |
389 | | } |
390 | | #endif |
391 | | if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) { |
392 | | if (local_scope == 0) { |
393 | | continue; |
394 | | } |
395 | | } |
396 | | if ((site_scope == 0) && (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) { |
397 | | continue; |
398 | | } |
399 | | } else { |
400 | | continue; |
401 | | } |
402 | | break; |
403 | | #endif |
404 | | #if defined(__Userspace__) |
405 | | case AF_CONN: |
406 | | if (!conn_addr_legal) { |
407 | | continue; |
408 | | } |
409 | | break; |
410 | | #endif |
411 | | default: |
412 | | continue; |
413 | | } |
414 | | memset((void *)&xladdr, 0, sizeof(struct xsctp_laddr)); |
415 | | memcpy((void *)&xladdr.address, (const void *)&sctp_ifa->address, sizeof(union sctp_sockstore)); |
416 | | SCTP_INP_RUNLOCK(inp); |
417 | | SCTP_INP_INFO_RUNLOCK(); |
418 | | error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); |
419 | | if (error != 0) { |
420 | | return (error); |
421 | | } else { |
422 | | SCTP_INP_INFO_RLOCK(); |
423 | | SCTP_INP_RLOCK(inp); |
424 | | } |
425 | | } |
426 | | } |
427 | | } else { |
428 | | LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) { |
429 | | /* ignore if blacklisted at association level */ |
430 | | if (stcb != NULL && sctp_is_addr_restricted(stcb, laddr->ifa)) |
431 | | continue; |
432 | | memset((void *)&xladdr, 0, sizeof(struct xsctp_laddr)); |
433 | | memcpy((void *)&xladdr.address, (const void *)&laddr->ifa->address, sizeof(union sctp_sockstore)); |
434 | | xladdr.start_time.tv_sec = (uint32_t)laddr->start_time.tv_sec; |
435 | | xladdr.start_time.tv_usec = (uint32_t)laddr->start_time.tv_usec; |
436 | | SCTP_INP_RUNLOCK(inp); |
437 | | SCTP_INP_INFO_RUNLOCK(); |
438 | | error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); |
439 | | if (error != 0) { |
440 | | return (error); |
441 | | } else { |
442 | | SCTP_INP_INFO_RLOCK(); |
443 | | SCTP_INP_RLOCK(inp); |
444 | | } |
445 | | } |
446 | | } |
447 | | memset((void *)&xladdr, 0, sizeof(struct xsctp_laddr)); |
448 | | xladdr.last = 1; |
449 | | SCTP_INP_RUNLOCK(inp); |
450 | | SCTP_INP_INFO_RUNLOCK(); |
451 | | error = SYSCTL_OUT(req, &xladdr, sizeof(struct xsctp_laddr)); |
452 | | |
453 | | if (error != 0) { |
454 | | return (error); |
455 | | } else { |
456 | | SCTP_INP_INFO_RLOCK(); |
457 | | SCTP_INP_RLOCK(inp); |
458 | | return (0); |
459 | | } |
460 | | } |
461 | | |
462 | | /* |
463 | | * sysctl functions |
464 | | */ |
465 | | #if defined(__APPLE__) && !defined(__Userspace__) |
466 | | static int |
467 | | sctp_sysctl_handle_assoclist SYSCTL_HANDLER_ARGS |
468 | | { |
469 | | #pragma unused(oidp, arg1, arg2) |
470 | | #else |
471 | | static int |
472 | | sctp_sysctl_handle_assoclist(SYSCTL_HANDLER_ARGS) |
473 | | { |
474 | | #endif |
475 | | unsigned int number_of_endpoints; |
476 | | unsigned int number_of_local_addresses; |
477 | | unsigned int number_of_associations; |
478 | | unsigned int number_of_remote_addresses; |
479 | | unsigned int n; |
480 | | int error; |
481 | | struct sctp_inpcb *inp; |
482 | | struct sctp_tcb *stcb; |
483 | | struct sctp_nets *net; |
484 | | struct xsctp_inpcb xinpcb; |
485 | | struct xsctp_tcb xstcb; |
486 | | struct xsctp_raddr xraddr; |
487 | | struct socket *so; |
488 | | |
489 | | number_of_endpoints = 0; |
490 | | number_of_local_addresses = 0; |
491 | | number_of_associations = 0; |
492 | | number_of_remote_addresses = 0; |
493 | | |
494 | | SCTP_INP_INFO_RLOCK(); |
495 | | #if defined(__APPLE__) && !defined(__Userspace__) |
496 | | if (req->oldptr == USER_ADDR_NULL) { |
497 | | #else |
498 | | if (req->oldptr == NULL) { |
499 | | #endif |
500 | | LIST_FOREACH(inp, &SCTP_BASE_INFO(listhead), sctp_list) { |
501 | | SCTP_INP_RLOCK(inp); |
502 | | number_of_endpoints++; |
503 | | number_of_local_addresses += sctp_sysctl_number_of_addresses(inp); |
504 | | LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { |
505 | | number_of_associations++; |
506 | | number_of_local_addresses += sctp_sysctl_number_of_addresses(inp); |
507 | | TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { |
508 | | number_of_remote_addresses++; |
509 | | } |
510 | | } |
511 | | SCTP_INP_RUNLOCK(inp); |
512 | | } |
513 | | SCTP_INP_INFO_RUNLOCK(); |
514 | | n = (number_of_endpoints + 1) * sizeof(struct xsctp_inpcb) + |
515 | | (number_of_local_addresses + number_of_endpoints + number_of_associations) * sizeof(struct xsctp_laddr) + |
516 | | (number_of_associations + number_of_endpoints) * sizeof(struct xsctp_tcb) + |
517 | | (number_of_remote_addresses + number_of_associations) * sizeof(struct xsctp_raddr); |
518 | | |
519 | | /* request some more memory than needed */ |
520 | | #if !(defined(_WIN32) && !defined(__Userspace__)) |
521 | | req->oldidx = (n + n / 8); |
522 | | #else |
523 | | req->dataidx = (n + n / 8); |
524 | | #endif |
525 | | return (0); |
526 | | } |
527 | | #if defined(__APPLE__) && !defined(__Userspace__) |
528 | | if (req->newptr != USER_ADDR_NULL) { |
529 | | #else |
530 | | if (req->newptr != NULL) { |
531 | | #endif |
532 | | SCTP_INP_INFO_RUNLOCK(); |
533 | | SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTP_SYSCTL, EPERM); |
534 | | return (EPERM); |
535 | | } |
536 | | memset(&xinpcb, 0, sizeof(xinpcb)); |
537 | | memset(&xstcb, 0, sizeof(xstcb)); |
538 | | memset(&xraddr, 0, sizeof(xraddr)); |
539 | | LIST_FOREACH(inp, &SCTP_BASE_INFO(listhead), sctp_list) { |
540 | | SCTP_INP_RLOCK(inp); |
541 | | if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) { |
542 | | /* if its allgone it is being freed - skip it */ |
543 | | goto skip; |
544 | | } |
545 | | xinpcb.last = 0; |
546 | | xinpcb.local_port = ntohs(inp->sctp_lport); |
547 | | xinpcb.flags = inp->sctp_flags; |
548 | | xinpcb.features = inp->sctp_features; |
549 | | xinpcb.total_sends = inp->total_sends; |
550 | | xinpcb.total_recvs = inp->total_recvs; |
551 | | xinpcb.total_nospaces = inp->total_nospaces; |
552 | | xinpcb.fragmentation_point = inp->sctp_frag_point; |
553 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
554 | | xinpcb.socket = (uintptr_t)inp->sctp_socket; |
555 | | #else |
556 | | xinpcb.socket = inp->sctp_socket; |
557 | | #endif |
558 | | so = inp->sctp_socket; |
559 | | if ((so == NULL) || |
560 | | (!SCTP_IS_LISTENING(inp)) || |
561 | | (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) { |
562 | | xinpcb.qlen = 0; |
563 | | xinpcb.maxqlen = 0; |
564 | | } else { |
565 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
566 | | xinpcb.qlen = so->sol_qlen; |
567 | | xinpcb.qlen_old = so->sol_qlen > USHRT_MAX ? |
568 | | USHRT_MAX : (uint16_t) so->sol_qlen; |
569 | | xinpcb.maxqlen = so->sol_qlimit; |
570 | | xinpcb.maxqlen_old = so->sol_qlimit > USHRT_MAX ? |
571 | | USHRT_MAX : (uint16_t) so->sol_qlimit; |
572 | | #else |
573 | | xinpcb.qlen = so->so_qlen; |
574 | | xinpcb.maxqlen = so->so_qlimit; |
575 | | #endif |
576 | | } |
577 | | SCTP_INP_INCR_REF(inp); |
578 | | SCTP_INP_RUNLOCK(inp); |
579 | | SCTP_INP_INFO_RUNLOCK(); |
580 | | error = SYSCTL_OUT(req, &xinpcb, sizeof(struct xsctp_inpcb)); |
581 | | if (error) { |
582 | | SCTP_INP_DECR_REF(inp); |
583 | | return (error); |
584 | | } |
585 | | SCTP_INP_INFO_RLOCK(); |
586 | | SCTP_INP_RLOCK(inp); |
587 | | error = sctp_sysctl_copy_out_local_addresses(inp, NULL, req); |
588 | | if (error) { |
589 | | SCTP_INP_DECR_REF(inp); |
590 | | return (error); |
591 | | } |
592 | | LIST_FOREACH(stcb, &inp->sctp_asoc_list, sctp_tcblist) { |
593 | | SCTP_TCB_LOCK(stcb); |
594 | | atomic_add_int(&stcb->asoc.refcnt, 1); |
595 | | SCTP_TCB_UNLOCK(stcb); |
596 | | xstcb.last = 0; |
597 | | xstcb.local_port = ntohs(inp->sctp_lport); |
598 | | xstcb.remote_port = ntohs(stcb->rport); |
599 | | if (stcb->asoc.primary_destination != NULL) |
600 | | xstcb.primary_addr = stcb->asoc.primary_destination->ro._l_addr; |
601 | | xstcb.heartbeat_interval = stcb->asoc.heart_beat_delay; |
602 | | xstcb.state = (uint32_t)sctp_map_assoc_state(stcb->asoc.state); |
603 | | xstcb.assoc_id = sctp_get_associd(stcb); |
604 | | xstcb.peers_rwnd = stcb->asoc.peers_rwnd; |
605 | | xstcb.in_streams = stcb->asoc.streamincnt; |
606 | | xstcb.out_streams = stcb->asoc.streamoutcnt; |
607 | | xstcb.max_nr_retrans = stcb->asoc.overall_error_count; |
608 | | xstcb.primary_process = 0; /* not really supported yet */ |
609 | | xstcb.T1_expireries = stcb->asoc.timoinit + stcb->asoc.timocookie; |
610 | | xstcb.T2_expireries = stcb->asoc.timoshutdown + stcb->asoc.timoshutdownack; |
611 | | xstcb.retransmitted_tsns = stcb->asoc.marked_retrans; |
612 | | xstcb.start_time.tv_sec = (uint32_t)stcb->asoc.start_time.tv_sec; |
613 | | xstcb.start_time.tv_usec = (uint32_t)stcb->asoc.start_time.tv_usec; |
614 | | xstcb.discontinuity_time.tv_sec = (uint32_t)stcb->asoc.discontinuity_time.tv_sec; |
615 | | xstcb.discontinuity_time.tv_usec = (uint32_t)stcb->asoc.discontinuity_time.tv_usec; |
616 | | xstcb.total_sends = stcb->total_sends; |
617 | | xstcb.total_recvs = stcb->total_recvs; |
618 | | xstcb.local_tag = stcb->asoc.my_vtag; |
619 | | xstcb.remote_tag = stcb->asoc.peer_vtag; |
620 | | xstcb.initial_tsn = stcb->asoc.init_seq_number; |
621 | | xstcb.highest_tsn = stcb->asoc.sending_seq - 1; |
622 | | xstcb.cumulative_tsn = stcb->asoc.last_acked_seq; |
623 | | xstcb.cumulative_tsn_ack = stcb->asoc.cumulative_tsn; |
624 | | xstcb.mtu = stcb->asoc.smallest_mtu; |
625 | | xstcb.refcnt = stcb->asoc.refcnt; |
626 | | SCTP_INP_RUNLOCK(inp); |
627 | | SCTP_INP_INFO_RUNLOCK(); |
628 | | error = SYSCTL_OUT(req, &xstcb, sizeof(struct xsctp_tcb)); |
629 | | if (error) { |
630 | | SCTP_INP_DECR_REF(inp); |
631 | | atomic_subtract_int(&stcb->asoc.refcnt, 1); |
632 | | return (error); |
633 | | } |
634 | | SCTP_INP_INFO_RLOCK(); |
635 | | SCTP_INP_RLOCK(inp); |
636 | | error = sctp_sysctl_copy_out_local_addresses(inp, stcb, req); |
637 | | if (error) { |
638 | | SCTP_INP_DECR_REF(inp); |
639 | | atomic_subtract_int(&stcb->asoc.refcnt, 1); |
640 | | return (error); |
641 | | } |
642 | | TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) { |
643 | | xraddr.last = 0; |
644 | | xraddr.address = net->ro._l_addr; |
645 | | xraddr.active = ((net->dest_state & SCTP_ADDR_REACHABLE) == SCTP_ADDR_REACHABLE); |
646 | | xraddr.confirmed = ((net->dest_state & SCTP_ADDR_UNCONFIRMED) == 0); |
647 | | xraddr.heartbeat_enabled = ((net->dest_state & SCTP_ADDR_NOHB) == 0); |
648 | | xraddr.potentially_failed = ((net->dest_state & SCTP_ADDR_PF) == SCTP_ADDR_PF); |
649 | | xraddr.rto = net->RTO; |
650 | | xraddr.max_path_rtx = net->failure_threshold; |
651 | | xraddr.rtx = net->marked_retrans; |
652 | | xraddr.error_counter = net->error_count; |
653 | | xraddr.cwnd = net->cwnd; |
654 | | xraddr.flight_size = net->flight_size; |
655 | | xraddr.mtu = net->mtu; |
656 | | xraddr.rtt = net->rtt / 1000; |
657 | | xraddr.heartbeat_interval = net->heart_beat_delay; |
658 | | xraddr.ssthresh = net->ssthresh; |
659 | | xraddr.encaps_port = net->port; |
660 | | if (net->dest_state & SCTP_ADDR_UNCONFIRMED) { |
661 | | xraddr.state = SCTP_UNCONFIRMED; |
662 | | } else if (net->dest_state & SCTP_ADDR_REACHABLE) { |
663 | | xraddr.state = SCTP_ACTIVE; |
664 | | } else { |
665 | | xraddr.state = SCTP_INACTIVE; |
666 | | } |
667 | | xraddr.start_time.tv_sec = (uint32_t)net->start_time.tv_sec; |
668 | | xraddr.start_time.tv_usec = (uint32_t)net->start_time.tv_usec; |
669 | | SCTP_INP_RUNLOCK(inp); |
670 | | SCTP_INP_INFO_RUNLOCK(); |
671 | | error = SYSCTL_OUT(req, &xraddr, sizeof(struct xsctp_raddr)); |
672 | | if (error) { |
673 | | SCTP_INP_DECR_REF(inp); |
674 | | atomic_subtract_int(&stcb->asoc.refcnt, 1); |
675 | | return (error); |
676 | | } |
677 | | SCTP_INP_INFO_RLOCK(); |
678 | | SCTP_INP_RLOCK(inp); |
679 | | } |
680 | | atomic_subtract_int(&stcb->asoc.refcnt, 1); |
681 | | memset((void *)&xraddr, 0, sizeof(struct xsctp_raddr)); |
682 | | xraddr.last = 1; |
683 | | SCTP_INP_RUNLOCK(inp); |
684 | | SCTP_INP_INFO_RUNLOCK(); |
685 | | error = SYSCTL_OUT(req, &xraddr, sizeof(struct xsctp_raddr)); |
686 | | if (error) { |
687 | | SCTP_INP_DECR_REF(inp); |
688 | | return (error); |
689 | | } |
690 | | SCTP_INP_INFO_RLOCK(); |
691 | | SCTP_INP_RLOCK(inp); |
692 | | } |
693 | | SCTP_INP_DECR_REF(inp); |
694 | | SCTP_INP_RUNLOCK(inp); |
695 | | SCTP_INP_INFO_RUNLOCK(); |
696 | | memset((void *)&xstcb, 0, sizeof(struct xsctp_tcb)); |
697 | | xstcb.last = 1; |
698 | | error = SYSCTL_OUT(req, &xstcb, sizeof(struct xsctp_tcb)); |
699 | | if (error) { |
700 | | return (error); |
701 | | } |
702 | | skip: |
703 | | SCTP_INP_INFO_RLOCK(); |
704 | | } |
705 | | SCTP_INP_INFO_RUNLOCK(); |
706 | | |
707 | | memset((void *)&xinpcb, 0, sizeof(struct xsctp_inpcb)); |
708 | | xinpcb.last = 1; |
709 | | error = SYSCTL_OUT(req, &xinpcb, sizeof(struct xsctp_inpcb)); |
710 | | return (error); |
711 | | } |
712 | | |
713 | | #if defined(__APPLE__) && !defined(__Userspace__) |
714 | | static int |
715 | | sctp_sysctl_handle_udp_tunneling SYSCTL_HANDLER_ARGS |
716 | | { |
717 | | #pragma unused(arg1, arg2) |
718 | | #else |
719 | | static int |
720 | | sctp_sysctl_handle_udp_tunneling(SYSCTL_HANDLER_ARGS) |
721 | | { |
722 | | #endif |
723 | | int error; |
724 | | uint32_t old, new; |
725 | | |
726 | | SCTP_INP_INFO_RLOCK(); |
727 | | old = SCTP_BASE_SYSCTL(sctp_udp_tunneling_port); |
728 | | SCTP_INP_INFO_RUNLOCK(); |
729 | | new = old; |
730 | | error = sysctl_handle_int(oidp, &new, 0, req); |
731 | | if ((error == 0) && |
732 | | #if defined(__APPLE__) && !defined(__Userspace__) |
733 | | (req->newptr != USER_ADDR_NULL)) { |
734 | | #else |
735 | | (req->newptr != NULL)) { |
736 | | #endif |
737 | | #if defined(_WIN32) && !defined(__Userspace__) |
738 | | SCTP_INP_INFO_WLOCK(); |
739 | | sctp_over_udp_restart(); |
740 | | SCTP_INP_INFO_WUNLOCK(); |
741 | | #else |
742 | | #if (SCTPCTL_UDP_TUNNELING_PORT_MIN == 0) |
743 | | if (new > SCTPCTL_UDP_TUNNELING_PORT_MAX) { |
744 | | #else |
745 | | if ((new < SCTPCTL_UDP_TUNNELING_PORT_MIN) || |
746 | | (new > SCTPCTL_UDP_TUNNELING_PORT_MAX)) { |
747 | | #endif |
748 | | error = EINVAL; |
749 | | } else { |
750 | | SCTP_INP_INFO_WLOCK(); |
751 | | SCTP_BASE_SYSCTL(sctp_udp_tunneling_port) = new; |
752 | | if (old != 0) { |
753 | | sctp_over_udp_stop(); |
754 | | } |
755 | | if (new != 0) { |
756 | | error = sctp_over_udp_start(); |
757 | | } |
758 | | SCTP_INP_INFO_WUNLOCK(); |
759 | | } |
760 | | #endif |
761 | | } |
762 | | return (error); |
763 | | } |
764 | | #if defined(__APPLE__) && !defined(__Userspace__) |
765 | | |
766 | | int sctp_is_vmware_interface(struct ifnet *); |
767 | | |
768 | | static int |
769 | | sctp_sysctl_handle_vmware_interfaces SYSCTL_HANDLER_ARGS |
770 | | { |
771 | | #pragma unused(arg1, arg2) |
772 | | int error; |
773 | | uint32_t old, new; |
774 | | |
775 | | old = SCTP_BASE_SYSCTL(sctp_ignore_vmware_interfaces); |
776 | | new = old; |
777 | | error = sysctl_handle_int(oidp, &new, 0, req); |
778 | | if ((error == 0) && (req->newptr != USER_ADDR_NULL)) { |
779 | | if ((new < SCTPCTL_IGNORE_VMWARE_INTERFACES_MIN) || |
780 | | (new > SCTPCTL_IGNORE_VMWARE_INTERFACES_MAX)) { |
781 | | error = EINVAL; |
782 | | } else { |
783 | | if ((old == 1) && (new == 0)) { |
784 | | sctp_add_or_del_interfaces(sctp_is_vmware_interface, 1); |
785 | | } |
786 | | if ((old == 0) && (new == 1)) { |
787 | | sctp_add_or_del_interfaces(sctp_is_vmware_interface, 0); |
788 | | } |
789 | | if (old != new) { |
790 | | SCTP_BASE_SYSCTL(sctp_ignore_vmware_interfaces) = new; |
791 | | } |
792 | | } |
793 | | } |
794 | | return (error); |
795 | | } |
796 | | #endif |
797 | | |
798 | | #if defined(__APPLE__) && !defined(__Userspace__) |
799 | | static int |
800 | | sctp_sysctl_handle_auth SYSCTL_HANDLER_ARGS |
801 | | { |
802 | | #pragma unused(arg1, arg2) |
803 | | #else |
804 | | static int |
805 | | sctp_sysctl_handle_auth(SYSCTL_HANDLER_ARGS) |
806 | | { |
807 | | #endif |
808 | | int error; |
809 | | uint32_t new; |
810 | | |
811 | | new = SCTP_BASE_SYSCTL(sctp_auth_enable); |
812 | | error = sysctl_handle_int(oidp, &new, 0, req); |
813 | | if ((error == 0) && |
814 | | #if defined(__APPLE__) && !defined(__Userspace__) |
815 | | (req->newptr != USER_ADDR_NULL)) { |
816 | | #else |
817 | | (req->newptr != NULL)) { |
818 | | #endif |
819 | | #if (SCTPCTL_AUTH_ENABLE_MIN == 0) |
820 | | if ((new > SCTPCTL_AUTH_ENABLE_MAX) || |
821 | | ((new == 0) && (SCTP_BASE_SYSCTL(sctp_asconf_enable) == 1))) { |
822 | | #else |
823 | | if ((new < SCTPCTL_AUTH_ENABLE_MIN) || |
824 | | (new > SCTPCTL_AUTH_ENABLE_MAX) || |
825 | | ((new == 0) && (SCTP_BASE_SYSCTL(sctp_asconf_enable) == 1))) { |
826 | | #endif |
827 | | error = EINVAL; |
828 | | } else { |
829 | | SCTP_BASE_SYSCTL(sctp_auth_enable) = new; |
830 | | } |
831 | | } |
832 | | return (error); |
833 | | } |
834 | | |
835 | | #if defined(__APPLE__) && !defined(__Userspace__) |
836 | | static int |
837 | | sctp_sysctl_handle_asconf SYSCTL_HANDLER_ARGS |
838 | | { |
839 | | #pragma unused(arg1, arg2) |
840 | | #else |
841 | | static int |
842 | | sctp_sysctl_handle_asconf(SYSCTL_HANDLER_ARGS) |
843 | | { |
844 | | #endif |
845 | | int error; |
846 | | uint32_t new; |
847 | | |
848 | | new = SCTP_BASE_SYSCTL(sctp_asconf_enable); |
849 | | error = sysctl_handle_int(oidp, &new, 0, req); |
850 | | if ((error == 0) && |
851 | | #if defined(__APPLE__) && !defined(__Userspace__) |
852 | | (req->newptr != USER_ADDR_NULL)) { |
853 | | #else |
854 | | (req->newptr != NULL)) { |
855 | | #endif |
856 | | #if (SCTPCTL_ASCONF_ENABLE_MIN == 0) |
857 | | if ((new > SCTPCTL_ASCONF_ENABLE_MAX) || |
858 | | ((new == 1) && (SCTP_BASE_SYSCTL(sctp_auth_enable) == 0))) { |
859 | | #else |
860 | | if ((new < SCTPCTL_ASCONF_ENABLE_MIN) || |
861 | | (new > SCTPCTL_ASCONF_ENABLE_MAX) || |
862 | | ((new == 1) && (SCTP_BASE_SYSCTL(sctp_auth_enable) == 0))) { |
863 | | #endif |
864 | | error = EINVAL; |
865 | | } else { |
866 | | SCTP_BASE_SYSCTL(sctp_asconf_enable) = new; |
867 | | } |
868 | | } |
869 | | return (error); |
870 | | } |
871 | | |
872 | | #if defined(__APPLE__) && !defined(__Userspace__) |
873 | | static int |
874 | | sctp_sysctl_handle_stats SYSCTL_HANDLER_ARGS |
875 | | { |
876 | | #pragma unused(oidp, arg1, arg2) |
877 | | #else |
878 | | static int |
879 | | sctp_sysctl_handle_stats(SYSCTL_HANDLER_ARGS) |
880 | | { |
881 | | #endif |
882 | | int error; |
883 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
884 | | #if defined(SMP) && defined(SCTP_USE_PERCPU_STAT) |
885 | | struct sctpstat *sarry; |
886 | | struct sctpstat sb; |
887 | | int cpu; |
888 | | #endif |
889 | | struct sctpstat sb_temp; |
890 | | #endif |
891 | | |
892 | | #if defined(__APPLE__) && !defined(__Userspace__) |
893 | | if ((req->newptr != USER_ADDR_NULL) && |
894 | | #else |
895 | | if ((req->newptr != NULL) && |
896 | | #endif |
897 | | (req->newlen != sizeof(struct sctpstat))) { |
898 | | return (EINVAL); |
899 | | } |
900 | | #if defined(__FreeBSD__) && !defined(__Userspace__) |
901 | | memset(&sb_temp, 0, sizeof(struct sctpstat)); |
902 | | |
903 | | if (req->newptr != NULL) { |
904 | | error = SYSCTL_IN(req, &sb_temp, sizeof(struct sctpstat)); |
905 | | if (error != 0) { |
906 | | return (error); |
907 | | } |
908 | | } |
909 | | #if defined(SMP) && defined(SCTP_USE_PERCPU_STAT) |
910 | | memset(&sb, 0, sizeof(sb)); |
911 | | for (cpu = 0; cpu < mp_maxid; cpu++) { |
912 | | sarry = &SCTP_BASE_STATS[cpu]; |
913 | | if (sarry->sctps_discontinuitytime.tv_sec > sb.sctps_discontinuitytime.tv_sec) { |
914 | | sb.sctps_discontinuitytime.tv_sec = sarry->sctps_discontinuitytime.tv_sec; |
915 | | sb.sctps_discontinuitytime.tv_usec = sarry->sctps_discontinuitytime.tv_usec; |
916 | | } |
917 | | sb.sctps_currestab += sarry->sctps_currestab; |
918 | | sb.sctps_activeestab += sarry->sctps_activeestab; |
919 | | sb.sctps_restartestab += sarry->sctps_restartestab; |
920 | | sb.sctps_collisionestab += sarry->sctps_collisionestab; |
921 | | sb.sctps_passiveestab += sarry->sctps_passiveestab; |
922 | | sb.sctps_aborted += sarry->sctps_aborted; |
923 | | sb.sctps_shutdown += sarry->sctps_shutdown; |
924 | | sb.sctps_outoftheblue += sarry->sctps_outoftheblue; |
925 | | sb.sctps_checksumerrors += sarry->sctps_checksumerrors; |
926 | | sb.sctps_outcontrolchunks += sarry->sctps_outcontrolchunks; |
927 | | sb.sctps_outorderchunks += sarry->sctps_outorderchunks; |
928 | | sb.sctps_outunorderchunks += sarry->sctps_outunorderchunks; |
929 | | sb.sctps_incontrolchunks += sarry->sctps_incontrolchunks; |
930 | | sb.sctps_inorderchunks += sarry->sctps_inorderchunks; |
931 | | sb.sctps_inunorderchunks += sarry->sctps_inunorderchunks; |
932 | | sb.sctps_fragusrmsgs += sarry->sctps_fragusrmsgs; |
933 | | sb.sctps_reasmusrmsgs += sarry->sctps_reasmusrmsgs; |
934 | | sb.sctps_outpackets += sarry->sctps_outpackets; |
935 | | sb.sctps_inpackets += sarry->sctps_inpackets; |
936 | | sb.sctps_recvpackets += sarry->sctps_recvpackets; |
937 | | sb.sctps_recvdatagrams += sarry->sctps_recvdatagrams; |
938 | | sb.sctps_recvpktwithdata += sarry->sctps_recvpktwithdata; |
939 | | sb.sctps_recvsacks += sarry->sctps_recvsacks; |
940 | | sb.sctps_recvdata += sarry->sctps_recvdata; |
941 | | sb.sctps_recvdupdata += sarry->sctps_recvdupdata; |
942 | | sb.sctps_recvheartbeat += sarry->sctps_recvheartbeat; |
943 | | sb.sctps_recvheartbeatack += sarry->sctps_recvheartbeatack; |
944 | | sb.sctps_recvecne += sarry->sctps_recvecne; |
945 | | sb.sctps_recvauth += sarry->sctps_recvauth; |
946 | | sb.sctps_recvauthmissing += sarry->sctps_recvauthmissing; |
947 | | sb.sctps_recvivalhmacid += sarry->sctps_recvivalhmacid; |
948 | | sb.sctps_recvivalkeyid += sarry->sctps_recvivalkeyid; |
949 | | sb.sctps_recvauthfailed += sarry->sctps_recvauthfailed; |
950 | | sb.sctps_recvexpress += sarry->sctps_recvexpress; |
951 | | sb.sctps_recvexpressm += sarry->sctps_recvexpressm; |
952 | | sb.sctps_recvswcrc += sarry->sctps_recvswcrc; |
953 | | sb.sctps_recvhwcrc += sarry->sctps_recvhwcrc; |
954 | | sb.sctps_sendpackets += sarry->sctps_sendpackets; |
955 | | sb.sctps_sendsacks += sarry->sctps_sendsacks; |
956 | | sb.sctps_senddata += sarry->sctps_senddata; |
957 | | sb.sctps_sendretransdata += sarry->sctps_sendretransdata; |
958 | | sb.sctps_sendfastretrans += sarry->sctps_sendfastretrans; |
959 | | sb.sctps_sendmultfastretrans += sarry->sctps_sendmultfastretrans; |
960 | | sb.sctps_sendheartbeat += sarry->sctps_sendheartbeat; |
961 | | sb.sctps_sendecne += sarry->sctps_sendecne; |
962 | | sb.sctps_sendauth += sarry->sctps_sendauth; |
963 | | sb.sctps_senderrors += sarry->sctps_senderrors; |
964 | | sb.sctps_sendswcrc += sarry->sctps_sendswcrc; |
965 | | sb.sctps_sendhwcrc += sarry->sctps_sendhwcrc; |
966 | | sb.sctps_pdrpfmbox += sarry->sctps_pdrpfmbox; |
967 | | sb.sctps_pdrpfehos += sarry->sctps_pdrpfehos; |
968 | | sb.sctps_pdrpmbda += sarry->sctps_pdrpmbda; |
969 | | sb.sctps_pdrpmbct += sarry->sctps_pdrpmbct; |
970 | | sb.sctps_pdrpbwrpt += sarry->sctps_pdrpbwrpt; |
971 | | sb.sctps_pdrpcrupt += sarry->sctps_pdrpcrupt; |
972 | | sb.sctps_pdrpnedat += sarry->sctps_pdrpnedat; |
973 | | sb.sctps_pdrppdbrk += sarry->sctps_pdrppdbrk; |
974 | | sb.sctps_pdrptsnnf += sarry->sctps_pdrptsnnf; |
975 | | sb.sctps_pdrpdnfnd += sarry->sctps_pdrpdnfnd; |
976 | | sb.sctps_pdrpdiwnp += sarry->sctps_pdrpdiwnp; |
977 | | sb.sctps_pdrpdizrw += sarry->sctps_pdrpdizrw; |
978 | | sb.sctps_pdrpbadd += sarry->sctps_pdrpbadd; |
979 | | sb.sctps_pdrpmark += sarry->sctps_pdrpmark; |
980 | | sb.sctps_timoiterator += sarry->sctps_timoiterator; |
981 | | sb.sctps_timodata += sarry->sctps_timodata; |
982 | | sb.sctps_timowindowprobe += sarry->sctps_timowindowprobe; |
983 | | sb.sctps_timoinit += sarry->sctps_timoinit; |
984 | | sb.sctps_timosack += sarry->sctps_timosack; |
985 | | sb.sctps_timoshutdown += sarry->sctps_timoshutdown; |
986 | | sb.sctps_timoheartbeat += sarry->sctps_timoheartbeat; |
987 | | sb.sctps_timocookie += sarry->sctps_timocookie; |
988 | | sb.sctps_timosecret += sarry->sctps_timosecret; |
989 | | sb.sctps_timopathmtu += sarry->sctps_timopathmtu; |
990 | | sb.sctps_timoshutdownack += sarry->sctps_timoshutdownack; |
991 | | sb.sctps_timoshutdownguard += sarry->sctps_timoshutdownguard; |
992 | | sb.sctps_timostrmrst += sarry->sctps_timostrmrst; |
993 | | sb.sctps_timoearlyfr += sarry->sctps_timoearlyfr; |
994 | | sb.sctps_timoasconf += sarry->sctps_timoasconf; |
995 | | sb.sctps_timodelprim += sarry->sctps_timodelprim; |
996 | | sb.sctps_timoautoclose += sarry->sctps_timoautoclose; |
997 | | sb.sctps_timoassockill += sarry->sctps_timoassockill; |
998 | | sb.sctps_timoinpkill += sarry->sctps_timoinpkill; |
999 | | sb.sctps_hdrops += sarry->sctps_hdrops; |
1000 | | sb.sctps_badsum += sarry->sctps_badsum; |
1001 | | sb.sctps_noport += sarry->sctps_noport; |
1002 | | sb.sctps_badvtag += sarry->sctps_badvtag; |
1003 | | sb.sctps_badsid += sarry->sctps_badsid; |
1004 | | sb.sctps_nomem += sarry->sctps_nomem; |
1005 | | sb.sctps_fastretransinrtt += sarry->sctps_fastretransinrtt; |
1006 | | sb.sctps_markedretrans += sarry->sctps_markedretrans; |
1007 | | sb.sctps_naglesent += sarry->sctps_naglesent; |
1008 | | sb.sctps_naglequeued += sarry->sctps_naglequeued; |
1009 | | sb.sctps_maxburstqueued += sarry->sctps_maxburstqueued; |
1010 | | sb.sctps_ifnomemqueued += sarry->sctps_ifnomemqueued; |
1011 | | sb.sctps_windowprobed += sarry->sctps_windowprobed; |
1012 | | sb.sctps_lowlevelerr += sarry->sctps_lowlevelerr; |
1013 | | sb.sctps_lowlevelerrusr += sarry->sctps_lowlevelerrusr; |
1014 | | sb.sctps_datadropchklmt += sarry->sctps_datadropchklmt; |
1015 | | sb.sctps_datadroprwnd += sarry->sctps_datadroprwnd; |
1016 | | sb.sctps_ecnereducedcwnd += sarry->sctps_ecnereducedcwnd; |
1017 | | sb.sctps_vtagexpress += sarry->sctps_vtagexpress; |
1018 | | sb.sctps_vtagbogus += sarry->sctps_vtagbogus; |
1019 | | sb.sctps_primary_randry += sarry->sctps_primary_randry; |
1020 | | sb.sctps_cmt_randry += sarry->sctps_cmt_randry; |
1021 | | sb.sctps_slowpath_sack += sarry->sctps_slowpath_sack; |
1022 | | sb.sctps_wu_sacks_sent += sarry->sctps_wu_sacks_sent; |
1023 | | sb.sctps_sends_with_flags += sarry->sctps_sends_with_flags; |
1024 | | sb.sctps_sends_with_unord += sarry->sctps_sends_with_unord; |
1025 | | sb.sctps_sends_with_eof += sarry->sctps_sends_with_eof; |
1026 | | sb.sctps_sends_with_abort += sarry->sctps_sends_with_abort; |
1027 | | sb.sctps_protocol_drain_calls += sarry->sctps_protocol_drain_calls; |
1028 | | sb.sctps_protocol_drains_done += sarry->sctps_protocol_drains_done; |
1029 | | sb.sctps_read_peeks += sarry->sctps_read_peeks; |
1030 | | sb.sctps_cached_chk += sarry->sctps_cached_chk; |
1031 | | sb.sctps_cached_strmoq += sarry->sctps_cached_strmoq; |
1032 | | sb.sctps_left_abandon += sarry->sctps_left_abandon; |
1033 | | sb.sctps_send_burst_avoid += sarry->sctps_send_burst_avoid; |
1034 | | sb.sctps_send_cwnd_avoid += sarry->sctps_send_cwnd_avoid; |
1035 | | sb.sctps_fwdtsn_map_over += sarry->sctps_fwdtsn_map_over; |
1036 | | if (req->newptr != NULL) { |
1037 | | memcpy(sarry, &sb_temp, sizeof(struct sctpstat)); |
1038 | | } |
1039 | | } |
1040 | | error = SYSCTL_OUT(req, &sb, sizeof(struct sctpstat)); |
1041 | | #else |
1042 | | error = SYSCTL_OUT(req, &SCTP_BASE_STATS, sizeof(struct sctpstat)); |
1043 | | if (error != 0) { |
1044 | | return (error); |
1045 | | } |
1046 | | if (req->newptr != NULL) { |
1047 | | memcpy(&SCTP_BASE_STATS, &sb_temp, sizeof(struct sctpstat)); |
1048 | | } |
1049 | | #endif |
1050 | | #else |
1051 | | error = SYSCTL_OUT(req, &SCTP_BASE_STATS, sizeof(struct sctpstat)); |
1052 | | #endif |
1053 | | return (error); |
1054 | | } |
1055 | | |
1056 | | #if defined(SCTP_LOCAL_TRACE_BUF) |
1057 | | #if defined(__APPLE__) && !defined(__Userspace__) |
1058 | | static int |
1059 | | sctp_sysctl_handle_trace_log SYSCTL_HANDLER_ARGS |
1060 | | { |
1061 | | #pragma unused(arg1, arg2, oidp) |
1062 | | #else |
1063 | | static int |
1064 | | sctp_sysctl_handle_trace_log(SYSCTL_HANDLER_ARGS) |
1065 | | { |
1066 | | #endif |
1067 | | int error; |
1068 | | |
1069 | | #if defined(_WIN32) && !defined(__Userspace__) |
1070 | | error = SYSCTL_OUT(req, SCTP_BASE_SYSCTL(sctp_log), sizeof(struct sctp_log)); |
1071 | | #else |
1072 | | error = SYSCTL_OUT(req, &SCTP_BASE_SYSCTL(sctp_log), sizeof(struct sctp_log)); |
1073 | | #endif |
1074 | | return (error); |
1075 | | } |
1076 | | |
1077 | | #if defined(__APPLE__) && !defined(__Userspace__) |
1078 | | static int |
1079 | | sctp_sysctl_handle_trace_log_clear SYSCTL_HANDLER_ARGS |
1080 | | { |
1081 | | #pragma unused(arg1, arg2, req, oidp) |
1082 | | #else |
1083 | | static int |
1084 | | sctp_sysctl_handle_trace_log_clear(SYSCTL_HANDLER_ARGS) |
1085 | | { |
1086 | | #endif |
1087 | | int error = 0; |
1088 | | #if defined(_WIN32) && !defined(__Userspace__) |
1089 | | int value = 0; |
1090 | | |
1091 | | if (req->new_data == NULL) { |
1092 | | return (error); |
1093 | | } |
1094 | | error = SYSCTL_IN(req, &value, sizeof(int)); |
1095 | | if (error == 0 && value != 0 && SCTP_BASE_SYSCTL(sctp_log) != NULL) { |
1096 | | memset(SCTP_BASE_SYSCTL(sctp_log), 0, sizeof(struct sctp_log)); |
1097 | | } |
1098 | | #else |
1099 | | |
1100 | | memset(&SCTP_BASE_SYSCTL(sctp_log), 0, sizeof(struct sctp_log)); |
1101 | | #endif |
1102 | | return (error); |
1103 | | } |
1104 | | #endif |
1105 | | |
1106 | | #if (defined(__APPLE__) || defined(__FreeBSD__)) && !defined(__Userspace__) |
1107 | | #if defined(__FreeBSD__) |
1108 | | #define SCTP_UINT_SYSCTL(mib_name, var_name, prefix) \ |
1109 | | static int \ |
1110 | | sctp_sysctl_handle_##mib_name(SYSCTL_HANDLER_ARGS) \ |
1111 | | { \ |
1112 | | int error; \ |
1113 | | uint32_t new; \ |
1114 | | \ |
1115 | | new = SCTP_BASE_SYSCTL(var_name); \ |
1116 | | error = sysctl_handle_int(oidp, &new, 0, req); \ |
1117 | | if ((error == 0) && (req->newptr != NULL)) { \ |
1118 | | if ((new < prefix##_MIN) || \ |
1119 | | (new > prefix##_MAX)) { \ |
1120 | | error = EINVAL; \ |
1121 | | } else { \ |
1122 | | SCTP_BASE_SYSCTL(var_name) = new; \ |
1123 | | } \ |
1124 | | } \ |
1125 | | return (error); \ |
1126 | | } \ |
1127 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, mib_name, \ |
1128 | | CTLFLAG_VNET|CTLTYPE_UINT|CTLFLAG_RW, NULL, 0, \ |
1129 | | sctp_sysctl_handle_##mib_name, "UI", prefix##_DESC); |
1130 | | #else |
1131 | | #define SCTP_UINT_SYSCTL(mib_name, var_name, prefix) \ |
1132 | | static int \ |
1133 | | sctp_sysctl_handle_##mib_name(struct sysctl_oid *oidp, \ |
1134 | | void *arg1 __attribute__((unused)), \ |
1135 | | int arg2 __attribute__((unused)), \ |
1136 | | struct sysctl_req *req) \ |
1137 | | { \ |
1138 | | int error; \ |
1139 | | uint32_t new; \ |
1140 | | \ |
1141 | | new = SCTP_BASE_SYSCTL(var_name); \ |
1142 | | error = sysctl_handle_int(oidp, &new, 0, req); \ |
1143 | | if ((error == 0) && (req->newptr != USER_ADDR_NULL)) { \ |
1144 | | if ((new < prefix##_MIN) || \ |
1145 | | (new > prefix##_MAX)) { \ |
1146 | | error = EINVAL; \ |
1147 | | } else { \ |
1148 | | SCTP_BASE_SYSCTL(var_name) = new; \ |
1149 | | } \ |
1150 | | } \ |
1151 | | return (error); \ |
1152 | | } \ |
1153 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, mib_name, \ |
1154 | | CTLTYPE_INT | CTLFLAG_RW, NULL, 0, \ |
1155 | | sctp_sysctl_handle_##mib_name, "I", prefix##_DESC); |
1156 | | #define CTLTYPE_UINT CTLTYPE_INT |
1157 | | #define CTLFLAG_VNET 0 |
1158 | | #endif |
1159 | | |
1160 | | /* |
1161 | | * sysctl definitions |
1162 | | */ |
1163 | | |
1164 | | SCTP_UINT_SYSCTL(sendspace, sctp_sendspace, SCTPCTL_MAXDGRAM) |
1165 | | SCTP_UINT_SYSCTL(recvspace, sctp_recvspace, SCTPCTL_RECVSPACE) |
1166 | | SCTP_UINT_SYSCTL(auto_asconf, sctp_auto_asconf, SCTPCTL_AUTOASCONF) |
1167 | | SCTP_UINT_SYSCTL(ecn_enable, sctp_ecn_enable, SCTPCTL_ECN_ENABLE) |
1168 | | SCTP_UINT_SYSCTL(pr_enable, sctp_pr_enable, SCTPCTL_PR_ENABLE) |
1169 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, auth_enable, CTLFLAG_VNET|CTLTYPE_UINT|CTLFLAG_RW, |
1170 | | NULL, 0, sctp_sysctl_handle_auth, "IU", SCTPCTL_AUTH_ENABLE_DESC); |
1171 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, asconf_enable, CTLFLAG_VNET|CTLTYPE_UINT|CTLFLAG_RW, |
1172 | | NULL, 0, sctp_sysctl_handle_asconf, "IU", SCTPCTL_ASCONF_ENABLE_DESC); |
1173 | | SCTP_UINT_SYSCTL(reconfig_enable, sctp_reconfig_enable, SCTPCTL_RECONFIG_ENABLE) |
1174 | | SCTP_UINT_SYSCTL(nrsack_enable, sctp_nrsack_enable, SCTPCTL_NRSACK_ENABLE) |
1175 | | SCTP_UINT_SYSCTL(pktdrop_enable, sctp_pktdrop_enable, SCTPCTL_PKTDROP_ENABLE) |
1176 | | #if defined(__APPLE__) && !defined(__Userspace__) |
1177 | | SCTP_UINT_SYSCTL(loopback_nocsum, sctp_no_csum_on_loopback, SCTPCTL_LOOPBACK_NOCSUM) |
1178 | | #endif |
1179 | | SCTP_UINT_SYSCTL(peer_chkoh, sctp_peer_chunk_oh, SCTPCTL_PEER_CHKOH) |
1180 | | SCTP_UINT_SYSCTL(maxburst, sctp_max_burst_default, SCTPCTL_MAXBURST) |
1181 | | SCTP_UINT_SYSCTL(fr_maxburst, sctp_fr_max_burst_default, SCTPCTL_FRMAXBURST) |
1182 | | SCTP_UINT_SYSCTL(maxchunks, sctp_max_chunks_on_queue, SCTPCTL_MAXCHUNKS) |
1183 | | SCTP_UINT_SYSCTL(tcbhashsize, sctp_hashtblsize, SCTPCTL_TCBHASHSIZE) |
1184 | | SCTP_UINT_SYSCTL(pcbhashsize, sctp_pcbtblsize, SCTPCTL_PCBHASHSIZE) |
1185 | | SCTP_UINT_SYSCTL(min_split_point, sctp_min_split_point, SCTPCTL_MIN_SPLIT_POINT) |
1186 | | SCTP_UINT_SYSCTL(chunkscale, sctp_chunkscale, SCTPCTL_CHUNKSCALE) |
1187 | | SCTP_UINT_SYSCTL(delayed_sack_time, sctp_delayed_sack_time_default, SCTPCTL_DELAYED_SACK_TIME) |
1188 | | SCTP_UINT_SYSCTL(sack_freq, sctp_sack_freq_default, SCTPCTL_SACK_FREQ) |
1189 | | SCTP_UINT_SYSCTL(sys_resource, sctp_system_free_resc_limit, SCTPCTL_SYS_RESOURCE) |
1190 | | SCTP_UINT_SYSCTL(asoc_resource, sctp_asoc_free_resc_limit, SCTPCTL_ASOC_RESOURCE) |
1191 | | SCTP_UINT_SYSCTL(heartbeat_interval, sctp_heartbeat_interval_default, SCTPCTL_HEARTBEAT_INTERVAL) |
1192 | | SCTP_UINT_SYSCTL(pmtu_raise_time, sctp_pmtu_raise_time_default, SCTPCTL_PMTU_RAISE_TIME) |
1193 | | SCTP_UINT_SYSCTL(shutdown_guard_time, sctp_shutdown_guard_time_default, SCTPCTL_SHUTDOWN_GUARD_TIME) |
1194 | | SCTP_UINT_SYSCTL(secret_lifetime, sctp_secret_lifetime_default, SCTPCTL_SECRET_LIFETIME) |
1195 | | SCTP_UINT_SYSCTL(rto_max, sctp_rto_max_default, SCTPCTL_RTO_MAX) |
1196 | | SCTP_UINT_SYSCTL(rto_min, sctp_rto_min_default, SCTPCTL_RTO_MIN) |
1197 | | SCTP_UINT_SYSCTL(rto_initial, sctp_rto_initial_default, SCTPCTL_RTO_INITIAL) |
1198 | | SCTP_UINT_SYSCTL(init_rto_max, sctp_init_rto_max_default, SCTPCTL_INIT_RTO_MAX) |
1199 | | SCTP_UINT_SYSCTL(valid_cookie_life, sctp_valid_cookie_life_default, SCTPCTL_VALID_COOKIE_LIFE) |
1200 | | SCTP_UINT_SYSCTL(init_rtx_max, sctp_init_rtx_max_default, SCTPCTL_INIT_RTX_MAX) |
1201 | | SCTP_UINT_SYSCTL(assoc_rtx_max, sctp_assoc_rtx_max_default, SCTPCTL_ASSOC_RTX_MAX) |
1202 | | SCTP_UINT_SYSCTL(path_rtx_max, sctp_path_rtx_max_default, SCTPCTL_PATH_RTX_MAX) |
1203 | | SCTP_UINT_SYSCTL(path_pf_threshold, sctp_path_pf_threshold, SCTPCTL_PATH_PF_THRESHOLD) |
1204 | | SCTP_UINT_SYSCTL(add_more_on_output, sctp_add_more_threshold, SCTPCTL_ADD_MORE_ON_OUTPUT) |
1205 | | SCTP_UINT_SYSCTL(incoming_streams, sctp_nr_incoming_streams_default, SCTPCTL_INCOMING_STREAMS) |
1206 | | SCTP_UINT_SYSCTL(outgoing_streams, sctp_nr_outgoing_streams_default, SCTPCTL_OUTGOING_STREAMS) |
1207 | | SCTP_UINT_SYSCTL(cmt_on_off, sctp_cmt_on_off, SCTPCTL_CMT_ON_OFF) |
1208 | | SCTP_UINT_SYSCTL(cmt_use_dac, sctp_cmt_use_dac, SCTPCTL_CMT_USE_DAC) |
1209 | | SCTP_UINT_SYSCTL(cwnd_maxburst, sctp_use_cwnd_based_maxburst, SCTPCTL_CWND_MAXBURST) |
1210 | | SCTP_UINT_SYSCTL(nat_friendly, sctp_nat_friendly, SCTPCTL_NAT_FRIENDLY) |
1211 | | SCTP_UINT_SYSCTL(abc_l_var, sctp_L2_abc_variable, SCTPCTL_ABC_L_VAR) |
1212 | | SCTP_UINT_SYSCTL(max_chained_mbufs, sctp_mbuf_threshold_count, SCTPCTL_MAX_CHAINED_MBUFS) |
1213 | | SCTP_UINT_SYSCTL(do_sctp_drain, sctp_do_drain, SCTPCTL_DO_SCTP_DRAIN) |
1214 | | SCTP_UINT_SYSCTL(hb_max_burst, sctp_hb_maxburst, SCTPCTL_HB_MAX_BURST) |
1215 | | SCTP_UINT_SYSCTL(abort_at_limit, sctp_abort_if_one_2_one_hits_limit, SCTPCTL_ABORT_AT_LIMIT) |
1216 | | SCTP_UINT_SYSCTL(min_residual, sctp_min_residual, SCTPCTL_MIN_RESIDUAL) |
1217 | | SCTP_UINT_SYSCTL(max_retran_chunk, sctp_max_retran_chunk, SCTPCTL_MAX_RETRAN_CHUNK) |
1218 | | SCTP_UINT_SYSCTL(log_level, sctp_logging_level, SCTPCTL_LOGGING_LEVEL) |
1219 | | SCTP_UINT_SYSCTL(default_cc_module, sctp_default_cc_module, SCTPCTL_DEFAULT_CC_MODULE) |
1220 | | SCTP_UINT_SYSCTL(default_ss_module, sctp_default_ss_module, SCTPCTL_DEFAULT_SS_MODULE) |
1221 | | SCTP_UINT_SYSCTL(default_frag_interleave, sctp_default_frag_interleave, SCTPCTL_DEFAULT_FRAG_INTERLEAVE) |
1222 | | SCTP_UINT_SYSCTL(mobility_base, sctp_mobility_base, SCTPCTL_MOBILITY_BASE) |
1223 | | SCTP_UINT_SYSCTL(mobility_fasthandoff, sctp_mobility_fasthandoff, SCTPCTL_MOBILITY_FASTHANDOFF) |
1224 | | #if defined(SCTP_LOCAL_TRACE_BUF) |
1225 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, log, CTLFLAG_VNET|CTLTYPE_STRUCT|CTLFLAG_RD, |
1226 | | NULL, 0, sctp_sysctl_handle_trace_log, "S,sctplog", "SCTP logging (struct sctp_log)"); |
1227 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, clear_trace, CTLFLAG_VNET|CTLTYPE_UINT | CTLFLAG_RW, |
1228 | | NULL, 0, sctp_sysctl_handle_trace_log_clear, "IU", "Clear SCTP Logging buffer"); |
1229 | | #endif |
1230 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, udp_tunneling_port, CTLFLAG_VNET|CTLTYPE_UINT|CTLFLAG_RW, |
1231 | | NULL, 0, sctp_sysctl_handle_udp_tunneling, "IU", SCTPCTL_UDP_TUNNELING_PORT_DESC); |
1232 | | SCTP_UINT_SYSCTL(enable_sack_immediately, sctp_enable_sack_immediately, SCTPCTL_SACK_IMMEDIATELY_ENABLE) |
1233 | | SCTP_UINT_SYSCTL(nat_friendly_init, sctp_inits_include_nat_friendly, SCTPCTL_NAT_FRIENDLY_INITS) |
1234 | | SCTP_UINT_SYSCTL(vtag_time_wait, sctp_vtag_time_wait, SCTPCTL_TIME_WAIT) |
1235 | | SCTP_UINT_SYSCTL(buffer_splitting, sctp_buffer_splitting, SCTPCTL_BUFFER_SPLITTING) |
1236 | | SCTP_UINT_SYSCTL(initial_cwnd, sctp_initial_cwnd, SCTPCTL_INITIAL_CWND) |
1237 | | SCTP_UINT_SYSCTL(rttvar_bw, sctp_rttvar_bw, SCTPCTL_RTTVAR_BW) |
1238 | | SCTP_UINT_SYSCTL(rttvar_rtt, sctp_rttvar_rtt, SCTPCTL_RTTVAR_RTT) |
1239 | | SCTP_UINT_SYSCTL(rttvar_eqret, sctp_rttvar_eqret, SCTPCTL_RTTVAR_EQRET) |
1240 | | SCTP_UINT_SYSCTL(rttvar_steady_step, sctp_steady_step, SCTPCTL_RTTVAR_STEADYS) |
1241 | | SCTP_UINT_SYSCTL(use_dcccecn, sctp_use_dccc_ecn, SCTPCTL_RTTVAR_DCCCECN) |
1242 | | SCTP_UINT_SYSCTL(blackhole, sctp_blackhole, SCTPCTL_BLACKHOLE) |
1243 | | SCTP_UINT_SYSCTL(sendall_limit, sctp_sendall_limit, SCTPCTL_SENDALL_LIMIT) |
1244 | | SCTP_UINT_SYSCTL(diag_info_code, sctp_diag_info_code, SCTPCTL_DIAG_INFO_CODE) |
1245 | | #ifdef SCTP_DEBUG |
1246 | | SCTP_UINT_SYSCTL(debug, sctp_debug_on, SCTPCTL_DEBUG) |
1247 | | #endif |
1248 | | #if defined(__APPLE__) && !defined(__Userspace__) |
1249 | | SCTP_UINT_SYSCTL(main_timer, sctp_main_timer, SCTPCTL_MAIN_TIMER) |
1250 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, ignore_vmware_interfaces, CTLTYPE_UINT|CTLFLAG_RW, |
1251 | | NULL, 0, sctp_sysctl_handle_vmware_interfaces, "IU", SCTPCTL_IGNORE_VMWARE_INTERFACES_DESC); |
1252 | | SCTP_UINT_SYSCTL(addr_watchdog_limit, sctp_addr_watchdog_limit, SCTPCTL_ADDR_WATCHDOG_LIMIT) |
1253 | | SCTP_UINT_SYSCTL(vtag_watchdog_limit, sctp_vtag_watchdog_limit, SCTPCTL_VTAG_WATCHDOG_LIMIT) |
1254 | | #endif |
1255 | | #if defined(__APPLE__) && !defined(__Userspace__) |
1256 | | SCTP_UINT_SYSCTL(output_unlocked, sctp_output_unlocked, SCTPCTL_OUTPUT_UNLOCKED) |
1257 | | #endif |
1258 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, stats, CTLFLAG_VNET|CTLTYPE_STRUCT|CTLFLAG_RW, |
1259 | | NULL, 0, sctp_sysctl_handle_stats, "S,sctpstat", "SCTP statistics (struct sctp_stat)"); |
1260 | | SYSCTL_PROC(_net_inet_sctp, OID_AUTO, assoclist, CTLFLAG_VNET|CTLTYPE_OPAQUE|CTLFLAG_RD, |
1261 | | NULL, 0, sctp_sysctl_handle_assoclist, "S,xassoc", "List of active SCTP associations"); |
1262 | | |
1263 | | #elif defined(_WIN32) && !defined(__Userspace__) |
1264 | | |
1265 | | #define RANGECHK(var, min, max) \ |
1266 | | if ((var) < (min)) { (var) = (min); } \ |
1267 | | else if ((var) > (max)) { (var) = (max); } |
1268 | | |
1269 | | static int |
1270 | | sctp_sysctl_handle_int(SYSCTL_HANDLER_ARGS) |
1271 | | { |
1272 | | int error; |
1273 | | |
1274 | | error = sysctl_handle_int(oidp, oidp->oid_arg1, oidp->oid_arg2, req); |
1275 | | if (error == 0) { |
1276 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_sendspace), SCTPCTL_MAXDGRAM_MIN, SCTPCTL_MAXDGRAM_MAX); |
1277 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_recvspace), SCTPCTL_RECVSPACE_MIN, SCTPCTL_RECVSPACE_MAX); |
1278 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_auto_asconf), SCTPCTL_AUTOASCONF_MIN, SCTPCTL_AUTOASCONF_MAX); |
1279 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_auto_asconf), SCTPCTL_AUTOASCONF_MIN, SCTPCTL_AUTOASCONF_MAX); |
1280 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_ecn_enable), SCTPCTL_ECN_ENABLE_MIN, SCTPCTL_ECN_ENABLE_MAX); |
1281 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_pr_enable), SCTPCTL_PR_ENABLE_MIN, SCTPCTL_PR_ENABLE_MAX); |
1282 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_reconfig_enable), SCTPCTL_RECONFIG_ENABLE_MIN, SCTPCTL_RECONFIG_ENABLE_MAX); |
1283 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_nrsack_enable), SCTPCTL_NRSACK_ENABLE_MIN, SCTPCTL_NRSACK_ENABLE_MAX); |
1284 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_pktdrop_enable), SCTPCTL_PKTDROP_ENABLE_MIN, SCTPCTL_PKTDROP_ENABLE_MAX); |
1285 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback), SCTPCTL_LOOPBACK_NOCSUM_MIN, SCTPCTL_LOOPBACK_NOCSUM_MAX); |
1286 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_peer_chunk_oh), SCTPCTL_PEER_CHKOH_MIN, SCTPCTL_PEER_CHKOH_MAX); |
1287 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_max_burst_default), SCTPCTL_MAXBURST_MIN, SCTPCTL_MAXBURST_MAX); |
1288 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_fr_max_burst_default), SCTPCTL_FRMAXBURST_MIN, SCTPCTL_FRMAXBURST_MAX); |
1289 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue), SCTPCTL_MAXCHUNKS_MIN, SCTPCTL_MAXCHUNKS_MAX); |
1290 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_hashtblsize), SCTPCTL_TCBHASHSIZE_MIN, SCTPCTL_TCBHASHSIZE_MAX); |
1291 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_pcbtblsize), SCTPCTL_PCBHASHSIZE_MIN, SCTPCTL_PCBHASHSIZE_MAX); |
1292 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_min_split_point), SCTPCTL_MIN_SPLIT_POINT_MIN, SCTPCTL_MIN_SPLIT_POINT_MAX); |
1293 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_chunkscale), SCTPCTL_CHUNKSCALE_MIN, SCTPCTL_CHUNKSCALE_MAX); |
1294 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_delayed_sack_time_default), SCTPCTL_DELAYED_SACK_TIME_MIN, SCTPCTL_DELAYED_SACK_TIME_MAX); |
1295 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_sack_freq_default), SCTPCTL_SACK_FREQ_MIN, SCTPCTL_SACK_FREQ_MAX); |
1296 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_system_free_resc_limit), SCTPCTL_SYS_RESOURCE_MIN, SCTPCTL_SYS_RESOURCE_MAX); |
1297 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_asoc_free_resc_limit), SCTPCTL_ASOC_RESOURCE_MIN, SCTPCTL_ASOC_RESOURCE_MAX); |
1298 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_heartbeat_interval_default), SCTPCTL_HEARTBEAT_INTERVAL_MIN, SCTPCTL_HEARTBEAT_INTERVAL_MAX); |
1299 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_pmtu_raise_time_default), SCTPCTL_PMTU_RAISE_TIME_MIN, SCTPCTL_PMTU_RAISE_TIME_MAX); |
1300 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_shutdown_guard_time_default), SCTPCTL_SHUTDOWN_GUARD_TIME_MIN, SCTPCTL_SHUTDOWN_GUARD_TIME_MAX); |
1301 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_secret_lifetime_default), SCTPCTL_SECRET_LIFETIME_MIN, SCTPCTL_SECRET_LIFETIME_MAX); |
1302 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_rto_max_default), SCTPCTL_RTO_MAX_MIN, SCTPCTL_RTO_MAX_MAX); |
1303 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_rto_min_default), SCTPCTL_RTO_MIN_MIN, SCTPCTL_RTO_MIN_MAX); |
1304 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_rto_initial_default), SCTPCTL_RTO_INITIAL_MIN, SCTPCTL_RTO_INITIAL_MAX); |
1305 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_init_rto_max_default), SCTPCTL_INIT_RTO_MAX_MIN, SCTPCTL_INIT_RTO_MAX_MAX); |
1306 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_valid_cookie_life_default), SCTPCTL_VALID_COOKIE_LIFE_MIN, SCTPCTL_VALID_COOKIE_LIFE_MAX); |
1307 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_init_rtx_max_default), SCTPCTL_INIT_RTX_MAX_MIN, SCTPCTL_INIT_RTX_MAX_MAX); |
1308 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default), SCTPCTL_ASSOC_RTX_MAX_MIN, SCTPCTL_ASSOC_RTX_MAX_MAX); |
1309 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_path_rtx_max_default), SCTPCTL_PATH_RTX_MAX_MIN, SCTPCTL_PATH_RTX_MAX_MAX); |
1310 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_path_pf_threshold), SCTPCTL_PATH_PF_THRESHOLD_MIN, SCTPCTL_PATH_PF_THRESHOLD_MAX); |
1311 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_add_more_threshold), SCTPCTL_ADD_MORE_ON_OUTPUT_MIN, SCTPCTL_ADD_MORE_ON_OUTPUT_MAX); |
1312 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default), SCTPCTL_INCOMING_STREAMS_MIN, SCTPCTL_INCOMING_STREAMS_MAX); |
1313 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default), SCTPCTL_OUTGOING_STREAMS_MIN, SCTPCTL_OUTGOING_STREAMS_MAX); |
1314 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_on_off), SCTPCTL_CMT_ON_OFF_MIN, SCTPCTL_CMT_ON_OFF_MAX); |
1315 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_cmt_use_dac), SCTPCTL_CMT_USE_DAC_MIN, SCTPCTL_CMT_USE_DAC_MAX); |
1316 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst), SCTPCTL_CWND_MAXBURST_MIN, SCTPCTL_CWND_MAXBURST_MAX); |
1317 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_nat_friendly), SCTPCTL_NAT_FRIENDLY_MIN, SCTPCTL_NAT_FRIENDLY_MAX); |
1318 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_L2_abc_variable), SCTPCTL_ABC_L_VAR_MIN, SCTPCTL_ABC_L_VAR_MAX); |
1319 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count), SCTPCTL_MAX_CHAINED_MBUFS_MIN, SCTPCTL_MAX_CHAINED_MBUFS_MAX); |
1320 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_do_drain), SCTPCTL_DO_SCTP_DRAIN_MIN, SCTPCTL_DO_SCTP_DRAIN_MAX); |
1321 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_hb_maxburst), SCTPCTL_HB_MAX_BURST_MIN, SCTPCTL_HB_MAX_BURST_MAX); |
1322 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_abort_if_one_2_one_hits_limit), SCTPCTL_ABORT_AT_LIMIT_MIN, SCTPCTL_ABORT_AT_LIMIT_MAX); |
1323 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_min_residual), SCTPCTL_MIN_RESIDUAL_MIN, SCTPCTL_MIN_RESIDUAL_MAX); |
1324 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_max_retran_chunk), SCTPCTL_MAX_RETRAN_CHUNK_MIN, SCTPCTL_MAX_RETRAN_CHUNK_MAX); |
1325 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_logging_level), SCTPCTL_LOGGING_LEVEL_MIN, SCTPCTL_LOGGING_LEVEL_MAX); |
1326 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_default_cc_module), SCTPCTL_DEFAULT_CC_MODULE_MIN, SCTPCTL_DEFAULT_CC_MODULE_MAX); |
1327 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_default_ss_module), SCTPCTL_DEFAULT_SS_MODULE_MIN, SCTPCTL_DEFAULT_SS_MODULE_MAX); |
1328 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_default_frag_interleave), SCTPCTL_DEFAULT_FRAG_INTERLEAVE_MIN, SCTPCTL_DEFAULT_FRAG_INTERLEAVE_MAX); |
1329 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_vtag_time_wait), SCTPCTL_TIME_WAIT_MIN, SCTPCTL_TIME_WAIT_MAX); |
1330 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_buffer_splitting), SCTPCTL_BUFFER_SPLITTING_MIN, SCTPCTL_BUFFER_SPLITTING_MAX); |
1331 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_initial_cwnd), SCTPCTL_INITIAL_CWND_MIN, SCTPCTL_INITIAL_CWND_MAX); |
1332 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_rttvar_bw), SCTPCTL_RTTVAR_BW_MIN, SCTPCTL_RTTVAR_BW_MAX); |
1333 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_rttvar_rtt), SCTPCTL_RTTVAR_RTT_MIN, SCTPCTL_RTTVAR_RTT_MAX); |
1334 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_rttvar_eqret), SCTPCTL_RTTVAR_EQRET_MIN, SCTPCTL_RTTVAR_EQRET_MAX); |
1335 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_steady_step), SCTPCTL_RTTVAR_STEADYS_MIN, SCTPCTL_RTTVAR_STEADYS_MAX); |
1336 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_use_dccc_ecn), SCTPCTL_RTTVAR_DCCCECN_MIN, SCTPCTL_RTTVAR_DCCCECN_MAX); |
1337 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_mobility_base), SCTPCTL_MOBILITY_BASE_MIN, SCTPCTL_MOBILITY_BASE_MAX); |
1338 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff), SCTPCTL_MOBILITY_FASTHANDOFF_MIN, SCTPCTL_MOBILITY_FASTHANDOFF_MAX); |
1339 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_enable_sack_immediately), SCTPCTL_SACK_IMMEDIATELY_ENABLE_MIN, SCTPCTL_SACK_IMMEDIATELY_ENABLE_MAX); |
1340 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_inits_include_nat_friendly), SCTPCTL_NAT_FRIENDLY_INITS_MIN, SCTPCTL_NAT_FRIENDLY_INITS_MAX); |
1341 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_blackhole), SCTPCTL_BLACKHOLE_MIN, SCTPCTL_BLACKHOLE_MAX); |
1342 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_sendall_limit), SCTPCTL_SENDALL_LIMIT_MIN, SCTPCTL_SENDALL_LIMIT_MAX); |
1343 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_diag_info_code), SCTPCTL_DIAG_INFO_CODE_MIN, SCTPCTL_DIAG_INFO_CODE_MAX); |
1344 | | #ifdef SCTP_DEBUG |
1345 | | RANGECHK(SCTP_BASE_SYSCTL(sctp_debug_on), SCTPCTL_DEBUG_MIN, SCTPCTL_DEBUG_MAX); |
1346 | | #endif |
1347 | | } |
1348 | | return (error); |
1349 | | } |
1350 | | |
1351 | | void |
1352 | | sysctl_setup_sctp(void) |
1353 | | { |
1354 | | sysctl_add_oid(&sysctl_oid_top, "sendspace", CTLTYPE_INT|CTLFLAG_RW, |
1355 | | &SCTP_BASE_SYSCTL(sctp_sendspace), 0, sctp_sysctl_handle_int, |
1356 | | SCTPCTL_MAXDGRAM_DESC); |
1357 | | |
1358 | | sysctl_add_oid(&sysctl_oid_top, "recvspace", CTLTYPE_INT|CTLFLAG_RW, |
1359 | | &SCTP_BASE_SYSCTL(sctp_recvspace), 0, sctp_sysctl_handle_int, |
1360 | | SCTPCTL_RECVSPACE_DESC); |
1361 | | |
1362 | | sysctl_add_oid(&sysctl_oid_top, "auto_asconf", CTLTYPE_INT|CTLFLAG_RW, |
1363 | | &SCTP_BASE_SYSCTL(sctp_auto_asconf), 0, sctp_sysctl_handle_int, |
1364 | | SCTPCTL_AUTOASCONF_DESC); |
1365 | | |
1366 | | sysctl_add_oid(&sysctl_oid_top, "ecn_enable", CTLTYPE_INT|CTLFLAG_RW, |
1367 | | &SCTP_BASE_SYSCTL(sctp_ecn_enable), 0, sctp_sysctl_handle_int, |
1368 | | SCTPCTL_ECN_ENABLE_DESC); |
1369 | | |
1370 | | sysctl_add_oid(&sysctl_oid_top, "pr_enable", CTLTYPE_INT|CTLFLAG_RW, |
1371 | | &SCTP_BASE_SYSCTL(sctp_pr_enable), 0, sctp_sysctl_handle_int, |
1372 | | SCTPCTL_PR_ENABLE_DESC); |
1373 | | |
1374 | | sysctl_add_oid(&sysctl_oid_top, "auth_enable", CTLTYPE_INT|CTLFLAG_RW, |
1375 | | &SCTP_BASE_SYSCTL(sctp_auth_enable), 0, sctp_sysctl_handle_auth, |
1376 | | SCTPCTL_AUTH_ENABLE_DESC); |
1377 | | |
1378 | | sysctl_add_oid(&sysctl_oid_top, "asconf_enable", CTLTYPE_INT|CTLFLAG_RW, |
1379 | | &SCTP_BASE_SYSCTL(sctp_asconf_enable), 0, sctp_sysctl_handle_asconf, |
1380 | | SCTPCTL_ASCONF_ENABLE_DESC); |
1381 | | |
1382 | | sysctl_add_oid(&sysctl_oid_top, "reconfig_enable", CTLTYPE_INT|CTLFLAG_RW, |
1383 | | &SCTP_BASE_SYSCTL(sctp_reconfig_enable), 0, sctp_sysctl_handle_int, |
1384 | | SCTPCTL_RECONFIG_ENABLE_DESC); |
1385 | | |
1386 | | sysctl_add_oid(&sysctl_oid_top, "nrsack_enable", CTLTYPE_INT|CTLFLAG_RW, |
1387 | | &SCTP_BASE_SYSCTL(sctp_nrsack_enable), 0, sctp_sysctl_handle_int, |
1388 | | SCTPCTL_NRSACK_ENABLE_DESC); |
1389 | | |
1390 | | sysctl_add_oid(&sysctl_oid_top, "pktdrop_enable", CTLTYPE_INT|CTLFLAG_RW, |
1391 | | &SCTP_BASE_SYSCTL(sctp_pktdrop_enable), 0, sctp_sysctl_handle_int, |
1392 | | SCTPCTL_PKTDROP_ENABLE_DESC); |
1393 | | |
1394 | | sysctl_add_oid(&sysctl_oid_top, "loopback_nocsum", CTLTYPE_INT|CTLFLAG_RW, |
1395 | | &SCTP_BASE_SYSCTL(sctp_no_csum_on_loopback), 0, sctp_sysctl_handle_int, |
1396 | | SCTPCTL_LOOPBACK_NOCSUM_DESC); |
1397 | | |
1398 | | sysctl_add_oid(&sysctl_oid_top, "peer_chkoh", CTLTYPE_INT|CTLFLAG_RW, |
1399 | | &SCTP_BASE_SYSCTL(sctp_peer_chunk_oh), 0, sctp_sysctl_handle_int, |
1400 | | SCTPCTL_PEER_CHKOH_DESC); |
1401 | | |
1402 | | sysctl_add_oid(&sysctl_oid_top, "maxburst", CTLTYPE_INT|CTLFLAG_RW, |
1403 | | &SCTP_BASE_SYSCTL(sctp_max_burst_default), 0, sctp_sysctl_handle_int, |
1404 | | SCTPCTL_MAXBURST_DESC); |
1405 | | |
1406 | | sysctl_add_oid(&sysctl_oid_top, "fr_maxburst", CTLTYPE_INT|CTLFLAG_RW, |
1407 | | &SCTP_BASE_SYSCTL(sctp_fr_max_burst_default), 0, sctp_sysctl_handle_int, |
1408 | | SCTPCTL_FRMAXBURST_DESC); |
1409 | | |
1410 | | sysctl_add_oid(&sysctl_oid_top, "maxchunks", CTLTYPE_INT|CTLFLAG_RW, |
1411 | | &SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue), 0, sctp_sysctl_handle_int, |
1412 | | SCTPCTL_MAXCHUNKS_DESC); |
1413 | | |
1414 | | sysctl_add_oid(&sysctl_oid_top, "tcbhashsize", CTLTYPE_INT|CTLFLAG_RW, |
1415 | | &SCTP_BASE_SYSCTL(sctp_hashtblsize), 0, sctp_sysctl_handle_int, |
1416 | | SCTPCTL_TCBHASHSIZE_DESC); |
1417 | | |
1418 | | sysctl_add_oid(&sysctl_oid_top, "pcbhashsize", CTLTYPE_INT|CTLFLAG_RW, |
1419 | | &SCTP_BASE_SYSCTL(sctp_pcbtblsize), 0, sctp_sysctl_handle_int, |
1420 | | SCTPCTL_PCBHASHSIZE_DESC); |
1421 | | |
1422 | | sysctl_add_oid(&sysctl_oid_top, "min_split_point", CTLTYPE_INT|CTLFLAG_RW, |
1423 | | &SCTP_BASE_SYSCTL(sctp_min_split_point), 0, sctp_sysctl_handle_int, |
1424 | | SCTPCTL_MIN_SPLIT_POINT_DESC); |
1425 | | |
1426 | | sysctl_add_oid(&sysctl_oid_top, "chunkscale", CTLTYPE_INT|CTLFLAG_RW, |
1427 | | &SCTP_BASE_SYSCTL(sctp_chunkscale), 0, sctp_sysctl_handle_int, |
1428 | | SCTPCTL_CHUNKSCALE_DESC); |
1429 | | |
1430 | | sysctl_add_oid(&sysctl_oid_top, "delayed_sack_time", CTLTYPE_INT|CTLFLAG_RW, |
1431 | | &SCTP_BASE_SYSCTL(sctp_delayed_sack_time_default), 0, sctp_sysctl_handle_int, |
1432 | | SCTPCTL_DELAYED_SACK_TIME_DESC); |
1433 | | |
1434 | | sysctl_add_oid(&sysctl_oid_top, "sack_freq", CTLTYPE_INT|CTLFLAG_RW, |
1435 | | &SCTP_BASE_SYSCTL(sctp_sack_freq_default), 0, sctp_sysctl_handle_int, |
1436 | | SCTPCTL_SACK_FREQ_DESC); |
1437 | | |
1438 | | sysctl_add_oid(&sysctl_oid_top, "sys_resource", CTLTYPE_INT|CTLFLAG_RW, |
1439 | | &SCTP_BASE_SYSCTL(sctp_system_free_resc_limit), 0, sctp_sysctl_handle_int, |
1440 | | SCTPCTL_SYS_RESOURCE_DESC); |
1441 | | |
1442 | | sysctl_add_oid(&sysctl_oid_top, "asoc_resource", CTLTYPE_INT|CTLFLAG_RW, |
1443 | | &SCTP_BASE_SYSCTL(sctp_asoc_free_resc_limit), 0, sctp_sysctl_handle_int, |
1444 | | SCTPCTL_ASOC_RESOURCE_DESC); |
1445 | | |
1446 | | sysctl_add_oid(&sysctl_oid_top, "heartbeat_interval", CTLTYPE_INT|CTLFLAG_RW, |
1447 | | &SCTP_BASE_SYSCTL(sctp_heartbeat_interval_default), 0, sctp_sysctl_handle_int, |
1448 | | SCTPCTL_HEARTBEAT_INTERVAL_DESC); |
1449 | | |
1450 | | sysctl_add_oid(&sysctl_oid_top, "pmtu_raise_time", CTLTYPE_INT|CTLFLAG_RW, |
1451 | | &SCTP_BASE_SYSCTL(sctp_pmtu_raise_time_default), 0, sctp_sysctl_handle_int, |
1452 | | SCTPCTL_PMTU_RAISE_TIME_DESC); |
1453 | | |
1454 | | sysctl_add_oid(&sysctl_oid_top, "shutdown_guard_time", CTLTYPE_INT|CTLFLAG_RW, |
1455 | | &SCTP_BASE_SYSCTL(sctp_shutdown_guard_time_default), 0, sctp_sysctl_handle_int, |
1456 | | SCTPCTL_SHUTDOWN_GUARD_TIME_DESC); |
1457 | | |
1458 | | sysctl_add_oid(&sysctl_oid_top, "secret_lifetime", CTLTYPE_INT|CTLFLAG_RW, |
1459 | | &SCTP_BASE_SYSCTL(sctp_secret_lifetime_default), 0, sctp_sysctl_handle_int, |
1460 | | SCTPCTL_SECRET_LIFETIME_DESC); |
1461 | | |
1462 | | sysctl_add_oid(&sysctl_oid_top, "rto_max", CTLTYPE_INT|CTLFLAG_RW, |
1463 | | &SCTP_BASE_SYSCTL(sctp_rto_max_default), 0, sctp_sysctl_handle_int, |
1464 | | SCTPCTL_RTO_MAX_DESC); |
1465 | | |
1466 | | sysctl_add_oid(&sysctl_oid_top, "rto_min", CTLTYPE_INT|CTLFLAG_RW, |
1467 | | &SCTP_BASE_SYSCTL(sctp_rto_min_default), 0, sctp_sysctl_handle_int, |
1468 | | SCTPCTL_RTO_MIN_DESC); |
1469 | | |
1470 | | sysctl_add_oid(&sysctl_oid_top, "rto_initial", CTLTYPE_INT|CTLFLAG_RW, |
1471 | | &SCTP_BASE_SYSCTL(sctp_rto_initial_default), 0, sctp_sysctl_handle_int, |
1472 | | SCTPCTL_RTO_INITIAL_DESC); |
1473 | | |
1474 | | sysctl_add_oid(&sysctl_oid_top, "init_rto_max", CTLTYPE_INT|CTLFLAG_RW, |
1475 | | &SCTP_BASE_SYSCTL(sctp_init_rto_max_default), 0, sctp_sysctl_handle_int, |
1476 | | SCTPCTL_INIT_RTO_MAX_DESC); |
1477 | | |
1478 | | sysctl_add_oid(&sysctl_oid_top, "valid_cookie_life", CTLTYPE_INT|CTLFLAG_RW, |
1479 | | &SCTP_BASE_SYSCTL(sctp_valid_cookie_life_default), 0, sctp_sysctl_handle_int, |
1480 | | SCTPCTL_VALID_COOKIE_LIFE_DESC); |
1481 | | |
1482 | | sysctl_add_oid(&sysctl_oid_top, "init_rtx_max", CTLTYPE_INT|CTLFLAG_RW, |
1483 | | &SCTP_BASE_SYSCTL(sctp_init_rtx_max_default), 0, sctp_sysctl_handle_int, |
1484 | | SCTPCTL_INIT_RTX_MAX_DESC); |
1485 | | |
1486 | | sysctl_add_oid(&sysctl_oid_top, "assoc_rtx_max", CTLTYPE_INT|CTLFLAG_RW, |
1487 | | &SCTP_BASE_SYSCTL(sctp_assoc_rtx_max_default), 0, sctp_sysctl_handle_int, |
1488 | | SCTPCTL_ASSOC_RTX_MAX_DESC); |
1489 | | |
1490 | | sysctl_add_oid(&sysctl_oid_top, "path_rtx_max", CTLTYPE_INT|CTLFLAG_RW, |
1491 | | &SCTP_BASE_SYSCTL(sctp_path_rtx_max_default), 0, sctp_sysctl_handle_int, |
1492 | | SCTPCTL_PATH_RTX_MAX_DESC); |
1493 | | |
1494 | | sysctl_add_oid(&sysctl_oid_top, "path_pf_threshold", CTLTYPE_INT|CTLFLAG_RW, |
1495 | | &SCTP_BASE_SYSCTL(sctp_path_pf_threshold), 0, sctp_sysctl_handle_int, |
1496 | | SCTPCTL_PATH_PF_THRESHOLD_DESC); |
1497 | | |
1498 | | sysctl_add_oid(&sysctl_oid_top, "add_more_on_output", CTLTYPE_INT|CTLFLAG_RW, |
1499 | | &SCTP_BASE_SYSCTL(sctp_add_more_threshold), 0, sctp_sysctl_handle_int, |
1500 | | SCTPCTL_ADD_MORE_ON_OUTPUT_DESC); |
1501 | | |
1502 | | sysctl_add_oid(&sysctl_oid_top, "incoming_streams", CTLTYPE_INT|CTLFLAG_RW, |
1503 | | &SCTP_BASE_SYSCTL(sctp_nr_incoming_streams_default), 0, sctp_sysctl_handle_int, |
1504 | | SCTPCTL_INCOMING_STREAMS_DESC); |
1505 | | |
1506 | | sysctl_add_oid(&sysctl_oid_top, "outgoing_streams", CTLTYPE_INT|CTLFLAG_RW, |
1507 | | &SCTP_BASE_SYSCTL(sctp_nr_outgoing_streams_default), 0, sctp_sysctl_handle_int, |
1508 | | SCTPCTL_OUTGOING_STREAMS_DESC); |
1509 | | |
1510 | | sysctl_add_oid(&sysctl_oid_top, "cmt_on_off", CTLTYPE_INT|CTLFLAG_RW, |
1511 | | &SCTP_BASE_SYSCTL(sctp_cmt_on_off), 0, sctp_sysctl_handle_int, |
1512 | | SCTPCTL_CMT_ON_OFF_DESC); |
1513 | | |
1514 | | sysctl_add_oid(&sysctl_oid_top, "cmt_use_dac", CTLTYPE_INT|CTLFLAG_RW, |
1515 | | &SCTP_BASE_SYSCTL(sctp_cmt_use_dac), 0, sctp_sysctl_handle_int, |
1516 | | SCTPCTL_CMT_USE_DAC_DESC); |
1517 | | |
1518 | | sysctl_add_oid(&sysctl_oid_top, "cwnd_maxburst", CTLTYPE_INT|CTLFLAG_RW, |
1519 | | &SCTP_BASE_SYSCTL(sctp_use_cwnd_based_maxburst), 0, sctp_sysctl_handle_int, |
1520 | | SCTPCTL_CWND_MAXBURST_DESC); |
1521 | | |
1522 | | sysctl_add_oid(&sysctl_oid_top, "nat_friendly", CTLTYPE_INT|CTLFLAG_RW, |
1523 | | &SCTP_BASE_SYSCTL(sctp_nat_friendly), 0, sctp_sysctl_handle_int, |
1524 | | SCTPCTL_NAT_FRIENDLY_DESC); |
1525 | | |
1526 | | sysctl_add_oid(&sysctl_oid_top, "abc_l_var", CTLTYPE_INT|CTLFLAG_RW, |
1527 | | &SCTP_BASE_SYSCTL(sctp_L2_abc_variable), 0, sctp_sysctl_handle_int, |
1528 | | SCTPCTL_ABC_L_VAR_DESC); |
1529 | | |
1530 | | sysctl_add_oid(&sysctl_oid_top, "max_chained_mbufs", CTLTYPE_INT|CTLFLAG_RW, |
1531 | | &SCTP_BASE_SYSCTL(sctp_mbuf_threshold_count), 0, sctp_sysctl_handle_int, |
1532 | | SCTPCTL_MAX_CHAINED_MBUFS_DESC); |
1533 | | |
1534 | | sysctl_add_oid(&sysctl_oid_top, "do_sctp_drain", CTLTYPE_INT|CTLFLAG_RW, |
1535 | | &SCTP_BASE_SYSCTL(sctp_do_drain), 0, sctp_sysctl_handle_int, |
1536 | | SCTPCTL_DO_SCTP_DRAIN_DESC); |
1537 | | |
1538 | | sysctl_add_oid(&sysctl_oid_top, "hb_max_burst", CTLTYPE_INT|CTLFLAG_RW, |
1539 | | &SCTP_BASE_SYSCTL(sctp_hb_maxburst), 0, sctp_sysctl_handle_int, |
1540 | | SCTPCTL_HB_MAX_BURST_DESC); |
1541 | | |
1542 | | sysctl_add_oid(&sysctl_oid_top, "abort_at_limit", CTLTYPE_INT|CTLFLAG_RW, |
1543 | | &SCTP_BASE_SYSCTL(sctp_abort_if_one_2_one_hits_limit), 0, sctp_sysctl_handle_int, |
1544 | | SCTPCTL_ABORT_AT_LIMIT_DESC); |
1545 | | |
1546 | | sysctl_add_oid(&sysctl_oid_top, "min_residual", CTLTYPE_INT|CTLFLAG_RW, |
1547 | | &SCTP_BASE_SYSCTL(sctp_min_residual), 0, sctp_sysctl_handle_int, |
1548 | | SCTPCTL_MIN_RESIDUAL_DESC); |
1549 | | |
1550 | | sysctl_add_oid(&sysctl_oid_top, "max_retran_chunk", CTLTYPE_INT|CTLFLAG_RW, |
1551 | | &SCTP_BASE_SYSCTL(sctp_max_retran_chunk), 0, sctp_sysctl_handle_int, |
1552 | | SCTPCTL_MAX_RETRAN_CHUNK_DESC); |
1553 | | |
1554 | | sysctl_add_oid(&sysctl_oid_top, "log_level", CTLTYPE_INT|CTLFLAG_RW, |
1555 | | &SCTP_BASE_SYSCTL(sctp_logging_level), 0, sctp_sysctl_handle_int, |
1556 | | SCTPCTL_LOGGING_LEVEL_DESC); |
1557 | | |
1558 | | sysctl_add_oid(&sysctl_oid_top, "default_cc_module", CTLTYPE_INT|CTLFLAG_RW, |
1559 | | &SCTP_BASE_SYSCTL(sctp_default_cc_module), 0, sctp_sysctl_handle_int, |
1560 | | SCTPCTL_DEFAULT_CC_MODULE_DESC); |
1561 | | |
1562 | | sysctl_add_oid(&sysctl_oid_top, "default_ss_module", CTLTYPE_INT|CTLFLAG_RW, |
1563 | | &SCTP_BASE_SYSCTL(sctp_default_ss_module), 0, sctp_sysctl_handle_int, |
1564 | | SCTPCTL_DEFAULT_SS_MODULE_DESC); |
1565 | | |
1566 | | sysctl_add_oid(&sysctl_oid_top, "default_frag_interleave", CTLTYPE_INT|CTLFLAG_RW, |
1567 | | &SCTP_BASE_SYSCTL(sctp_default_frag_interleave), 0, sctp_sysctl_handle_int, |
1568 | | SCTPCTL_DEFAULT_FRAG_INTERLEAVE_DESC); |
1569 | | |
1570 | | sysctl_add_oid(&sysctl_oid_top, "mobility_base", CTLTYPE_INT|CTLFLAG_RW, |
1571 | | &SCTP_BASE_SYSCTL(sctp_mobility_base), 0, sctp_sysctl_handle_int, |
1572 | | SCTPCTL_MOBILITY_BASE_DESC); |
1573 | | |
1574 | | sysctl_add_oid(&sysctl_oid_top, "mobility_fasthandoff", CTLTYPE_INT|CTLFLAG_RW, |
1575 | | &SCTP_BASE_SYSCTL(sctp_mobility_fasthandoff), 0, sctp_sysctl_handle_int, |
1576 | | SCTPCTL_MOBILITY_FASTHANDOFF_DESC); |
1577 | | |
1578 | | #if defined(SCTP_LOCAL_TRACE_BUF) |
1579 | | sysctl_add_oid(&sysctl_oid_top, "sctp_log", CTLTYPE_STRUCT|CTLFLAG_RD, |
1580 | | SCTP_BASE_SYSCTL(sctp_log), sizeof(struct sctp_log), NULL, |
1581 | | "SCTP logging (struct sctp_log)"); |
1582 | | |
1583 | | sysctl_add_oid(&sysctl_oid_top, "clear_trace", CTLTYPE_INT|CTLFLAG_WR, |
1584 | | NULL, 0, sctp_sysctl_handle_trace_log_clear, |
1585 | | "Clear SCTP Logging buffer"); |
1586 | | #endif |
1587 | | |
1588 | | sysctl_add_oid(&sysctl_oid_top, "udp_tunneling_port", CTLTYPE_INT|CTLFLAG_RW, |
1589 | | &SCTP_BASE_SYSCTL(sctp_udp_tunneling_port), 0, sctp_sysctl_handle_udp_tunneling, |
1590 | | SCTPCTL_UDP_TUNNELING_PORT_DESC); |
1591 | | |
1592 | | sysctl_add_oid(&sysctl_oid_top, "enable_sack_immediately", CTLTYPE_INT|CTLFLAG_RW, |
1593 | | &SCTP_BASE_SYSCTL(sctp_enable_sack_immediately), 0, sctp_sysctl_handle_int, |
1594 | | SCTPCTL_SACK_IMMEDIATELY_ENABLE_DESC); |
1595 | | |
1596 | | sysctl_add_oid(&sysctl_oid_top, "nat_friendly_init", CTLTYPE_INT|CTLFLAG_RW, |
1597 | | &SCTP_BASE_SYSCTL(sctp_inits_include_nat_friendly), 0, sctp_sysctl_handle_int, |
1598 | | SCTPCTL_NAT_FRIENDLY_DESC); |
1599 | | |
1600 | | sysctl_add_oid(&sysctl_oid_top, "vtag_time_wait", CTLTYPE_INT|CTLFLAG_RW, |
1601 | | &SCTP_BASE_SYSCTL(sctp_vtag_time_wait), 0, sctp_sysctl_handle_int, |
1602 | | SCTPCTL_TIME_WAIT_DESC); |
1603 | | |
1604 | | sysctl_add_oid(&sysctl_oid_top, "buffer_splitting", CTLTYPE_INT|CTLFLAG_RW, |
1605 | | &SCTP_BASE_SYSCTL(sctp_buffer_splitting), 0, sctp_sysctl_handle_int, |
1606 | | SCTPCTL_BUFFER_SPLITTING_DESC); |
1607 | | |
1608 | | sysctl_add_oid(&sysctl_oid_top, "initial_cwnd", CTLTYPE_INT|CTLFLAG_RW, |
1609 | | &SCTP_BASE_SYSCTL(sctp_initial_cwnd), 0, sctp_sysctl_handle_int, |
1610 | | SCTPCTL_INITIAL_CWND_DESC); |
1611 | | |
1612 | | sysctl_add_oid(&sysctl_oid_top, "rttvar_bw", CTLTYPE_INT|CTLFLAG_RW, |
1613 | | &SCTP_BASE_SYSCTL(sctp_rttvar_bw), 0, sctp_sysctl_handle_int, |
1614 | | SCTPCTL_RTTVAR_BW_DESC); |
1615 | | |
1616 | | sysctl_add_oid(&sysctl_oid_top, "rttvar_rtt", CTLTYPE_INT|CTLFLAG_RW, |
1617 | | &SCTP_BASE_SYSCTL(sctp_rttvar_rtt), 0, sctp_sysctl_handle_int, |
1618 | | SCTPCTL_RTTVAR_RTT_DESC); |
1619 | | |
1620 | | sysctl_add_oid(&sysctl_oid_top, "rttvar_eqret", CTLTYPE_INT|CTLFLAG_RW, |
1621 | | &SCTP_BASE_SYSCTL(sctp_rttvar_eqret), 0, sctp_sysctl_handle_int, |
1622 | | SCTPCTL_RTTVAR_EQRET_DESC); |
1623 | | |
1624 | | sysctl_add_oid(&sysctl_oid_top, "rttvar_steady_step", CTLTYPE_INT|CTLFLAG_RW, |
1625 | | &SCTP_BASE_SYSCTL(sctp_steady_step), 0, sctp_sysctl_handle_int, |
1626 | | SCTPCTL_RTTVAR_STEADYS_DESC); |
1627 | | |
1628 | | sysctl_add_oid(&sysctl_oid_top, "use_dcccecn", CTLTYPE_INT|CTLFLAG_RW, |
1629 | | &SCTP_BASE_SYSCTL(sctp_use_dccc_ecn), 0, sctp_sysctl_handle_int, |
1630 | | SCTPCTL_RTTVAR_DCCCECN_DESC); |
1631 | | |
1632 | | sysctl_add_oid(&sysctl_oid_top, "blackhole", CTLTYPE_INT|CTLFLAG_RW, |
1633 | | &SCTP_BASE_SYSCTL(sctp_blackhole), 0, sctp_sysctl_handle_int, |
1634 | | SCTPCTL_BLACKHOLE_DESC); |
1635 | | |
1636 | | sysctl_add_oid(&sysctl_oid_top, "sendall_limit", CTLTYPE_INT|CTLFLAG_RW, |
1637 | | &SCTP_BASE_SYSCTL(sctp_sendall_limit), 0, sctp_sysctl_handle_int, |
1638 | | SCTPCTL_SENDALL_LIMIT_DESC); |
1639 | | |
1640 | | sysctl_add_oid(&sysctl_oid_top, "diag_info_code", CTLTYPE_INT|CTLFLAG_RW, |
1641 | | &SCTP_BASE_SYSCTL(sctp_diag_info_code), 0, sctp_sysctl_handle_int, |
1642 | | SCTPCTL_DIAG_INFO_CODE_DESC); |
1643 | | |
1644 | | #ifdef SCTP_DEBUG |
1645 | | sysctl_add_oid(&sysctl_oid_top, "debug", CTLTYPE_INT|CTLFLAG_RW, |
1646 | | &SCTP_BASE_SYSCTL(sctp_debug_on), 0, sctp_sysctl_handle_int, |
1647 | | SCTPCTL_DEBUG_DESC); |
1648 | | #endif |
1649 | | |
1650 | | sysctl_add_oid(&sysctl_oid_top, "stats", CTLTYPE_STRUCT|CTLFLAG_RW, |
1651 | | &SCTP_BASE_STATS, sizeof(SCTP_BASE_STATS), NULL, |
1652 | | "SCTP statistics (struct sctp_stat)"); |
1653 | | |
1654 | | sysctl_add_oid(&sysctl_oid_top, "assoclist", CTLTYPE_STRUCT|CTLFLAG_RD, |
1655 | | NULL, 0, sctp_assoclist, |
1656 | | "List of active SCTP associations"); |
1657 | | } |
1658 | | #endif |
1659 | | #endif |