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