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