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