xref: /titanic_41/usr/src/uts/common/inet/tcp/tcp_tunables.c (revision 4d2aeb95468ad926468f083e4239bd4089e0cba3)
16e91bba0SGirish Moodalbail /*
26e91bba0SGirish Moodalbail  * CDDL HEADER START
36e91bba0SGirish Moodalbail  *
46e91bba0SGirish Moodalbail  * The contents of this file are subject to the terms of the
56e91bba0SGirish Moodalbail  * Common Development and Distribution License (the "License").
66e91bba0SGirish Moodalbail  * You may not use this file except in compliance with the License.
76e91bba0SGirish Moodalbail  *
86e91bba0SGirish Moodalbail  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96e91bba0SGirish Moodalbail  * or http://www.opensolaris.org/os/licensing.
106e91bba0SGirish Moodalbail  * See the License for the specific language governing permissions
116e91bba0SGirish Moodalbail  * and limitations under the License.
126e91bba0SGirish Moodalbail  *
136e91bba0SGirish Moodalbail  * When distributing Covered Code, include this CDDL HEADER in each
146e91bba0SGirish Moodalbail  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156e91bba0SGirish Moodalbail  * If applicable, add the following below this CDDL HEADER, with the
166e91bba0SGirish Moodalbail  * fields enclosed by brackets "[]" replaced with your own identifying
176e91bba0SGirish Moodalbail  * information: Portions Copyright [yyyy] [name of copyright owner]
186e91bba0SGirish Moodalbail  *
196e91bba0SGirish Moodalbail  * CDDL HEADER END
206e91bba0SGirish Moodalbail  */
216e91bba0SGirish Moodalbail /*
228887b57dSGirish Moodalbail  * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
23c0e6663fSJerry Jelinek  * Copyright (c) 2011, Joyent Inc. All rights reserved.
247256a34eSDan McDonald  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
25299625c6SSebastien Roy  * Copyright (c) 2013 by Delphix. All rights reserved.
266e91bba0SGirish Moodalbail  */
278887b57dSGirish Moodalbail /* Copyright (c) 1990 Mentat Inc. */
286e91bba0SGirish Moodalbail 
296e91bba0SGirish Moodalbail #include <inet/ip.h>
306e91bba0SGirish Moodalbail #include <inet/tcp_impl.h>
316e91bba0SGirish Moodalbail #include <sys/multidata.h>
326e91bba0SGirish Moodalbail #include <sys/sunddi.h>
336e91bba0SGirish Moodalbail 
346e91bba0SGirish Moodalbail /* Max size IP datagram is 64k - 1 */
356e91bba0SGirish Moodalbail #define	TCP_MSS_MAX_IPV4 (IP_MAXPACKET - (sizeof (ipha_t) + sizeof (tcpha_t)))
366e91bba0SGirish Moodalbail #define	TCP_MSS_MAX_IPV6 (IP_MAXPACKET - (sizeof (ip6_t) + sizeof (tcpha_t)))
376e91bba0SGirish Moodalbail 
386e91bba0SGirish Moodalbail /* Max of the above */
396e91bba0SGirish Moodalbail #define	TCP_MSS_MAX		TCP_MSS_MAX_IPV4
406e91bba0SGirish Moodalbail 
416e91bba0SGirish Moodalbail /*
426e91bba0SGirish Moodalbail  * Set the RFC 1948 pass phrase
436e91bba0SGirish Moodalbail  */
446e91bba0SGirish Moodalbail /* ARGSUSED */
456e91bba0SGirish Moodalbail static int
tcp_set_1948phrase(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pr_val,uint_t flags)46299625c6SSebastien Roy tcp_set_1948phrase(netstack_t *stack,  cred_t *cr, mod_prop_info_t *pinfo,
476e91bba0SGirish Moodalbail     const char *ifname, const void* pr_val, uint_t flags)
486e91bba0SGirish Moodalbail {
496e91bba0SGirish Moodalbail 	if (flags & MOD_PROP_DEFAULT)
506e91bba0SGirish Moodalbail 		return (ENOTSUP);
516e91bba0SGirish Moodalbail 
526e91bba0SGirish Moodalbail 	/*
536e91bba0SGirish Moodalbail 	 * Basically, value contains a new pass phrase.  Pass it along!
546e91bba0SGirish Moodalbail 	 */
55299625c6SSebastien Roy 	tcp_iss_key_init((uint8_t *)pr_val, strlen(pr_val),
56299625c6SSebastien Roy 	    stack->netstack_tcp);
576e91bba0SGirish Moodalbail 	return (0);
586e91bba0SGirish Moodalbail }
596e91bba0SGirish Moodalbail 
606e91bba0SGirish Moodalbail /*
616e91bba0SGirish Moodalbail  * returns the current list of listener limit configuration.
626e91bba0SGirish Moodalbail  */
636e91bba0SGirish Moodalbail /* ARGSUSED */
646e91bba0SGirish Moodalbail static int
tcp_listener_conf_get(netstack_t * stack,mod_prop_info_t * pinfo,const char * ifname,void * val,uint_t psize,uint_t flags)65299625c6SSebastien Roy tcp_listener_conf_get(netstack_t *stack, mod_prop_info_t *pinfo,
66299625c6SSebastien Roy     const char *ifname, void *val, uint_t psize, uint_t flags)
676e91bba0SGirish Moodalbail {
68299625c6SSebastien Roy 	tcp_stack_t	*tcps = stack->netstack_tcp;
696e91bba0SGirish Moodalbail 	tcp_listener_t	*tl;
706e91bba0SGirish Moodalbail 	char		*pval = val;
716e91bba0SGirish Moodalbail 	size_t		nbytes = 0, tbytes = 0;
726e91bba0SGirish Moodalbail 	uint_t		size;
736e91bba0SGirish Moodalbail 	int		err = 0;
746e91bba0SGirish Moodalbail 
756e91bba0SGirish Moodalbail 	bzero(pval, psize);
766e91bba0SGirish Moodalbail 	size = psize;
776e91bba0SGirish Moodalbail 
786e91bba0SGirish Moodalbail 	if (flags & (MOD_PROP_DEFAULT|MOD_PROP_PERM|MOD_PROP_POSSIBLE))
796e91bba0SGirish Moodalbail 		return (0);
806e91bba0SGirish Moodalbail 
816e91bba0SGirish Moodalbail 	mutex_enter(&tcps->tcps_listener_conf_lock);
826e91bba0SGirish Moodalbail 	for (tl = list_head(&tcps->tcps_listener_conf); tl != NULL;
836e91bba0SGirish Moodalbail 	    tl = list_next(&tcps->tcps_listener_conf, tl)) {
846e91bba0SGirish Moodalbail 		if (psize == size)
856e91bba0SGirish Moodalbail 			nbytes = snprintf(pval, size, "%d:%d",  tl->tl_port,
866e91bba0SGirish Moodalbail 			    tl->tl_ratio);
876e91bba0SGirish Moodalbail 		else
886e91bba0SGirish Moodalbail 			nbytes = snprintf(pval, size, ",%d:%d",  tl->tl_port,
896e91bba0SGirish Moodalbail 			    tl->tl_ratio);
906e91bba0SGirish Moodalbail 		size -= nbytes;
916e91bba0SGirish Moodalbail 		pval += nbytes;
926e91bba0SGirish Moodalbail 		tbytes += nbytes;
936e91bba0SGirish Moodalbail 		if (tbytes >= psize) {
946e91bba0SGirish Moodalbail 			/* Buffer overflow, stop copying information */
956e91bba0SGirish Moodalbail 			err = ENOBUFS;
966e91bba0SGirish Moodalbail 			break;
976e91bba0SGirish Moodalbail 		}
986e91bba0SGirish Moodalbail 	}
995dd46ab5SKacheong Poon 
1006e91bba0SGirish Moodalbail 	mutex_exit(&tcps->tcps_listener_conf_lock);
1016e91bba0SGirish Moodalbail 	return (err);
1026e91bba0SGirish Moodalbail }
1036e91bba0SGirish Moodalbail 
1046e91bba0SGirish Moodalbail /*
1056e91bba0SGirish Moodalbail  * add a new listener limit configuration.
1066e91bba0SGirish Moodalbail  */
1076e91bba0SGirish Moodalbail /* ARGSUSED */
1086e91bba0SGirish Moodalbail static int
tcp_listener_conf_add(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pval,uint_t flags)109299625c6SSebastien Roy tcp_listener_conf_add(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
1106e91bba0SGirish Moodalbail     const char *ifname, const void* pval, uint_t flags)
1116e91bba0SGirish Moodalbail {
1126e91bba0SGirish Moodalbail 	tcp_listener_t	*new_tl;
1136e91bba0SGirish Moodalbail 	tcp_listener_t	*tl;
1146e91bba0SGirish Moodalbail 	long		lport;
1156e91bba0SGirish Moodalbail 	long		ratio;
1166e91bba0SGirish Moodalbail 	char		*colon;
117299625c6SSebastien Roy 	tcp_stack_t	*tcps = stack->netstack_tcp;
1186e91bba0SGirish Moodalbail 
1196e91bba0SGirish Moodalbail 	if (flags & MOD_PROP_DEFAULT)
1206e91bba0SGirish Moodalbail 		return (ENOTSUP);
1216e91bba0SGirish Moodalbail 
1226e91bba0SGirish Moodalbail 	if (ddi_strtol(pval, &colon, 10, &lport) != 0 || lport <= 0 ||
1236e91bba0SGirish Moodalbail 	    lport > USHRT_MAX || *colon != ':') {
1246e91bba0SGirish Moodalbail 		return (EINVAL);
1256e91bba0SGirish Moodalbail 	}
1266e91bba0SGirish Moodalbail 	if (ddi_strtol(colon + 1, NULL, 10, &ratio) != 0 || ratio <= 0)
1276e91bba0SGirish Moodalbail 		return (EINVAL);
1286e91bba0SGirish Moodalbail 
1296e91bba0SGirish Moodalbail 	mutex_enter(&tcps->tcps_listener_conf_lock);
1306e91bba0SGirish Moodalbail 	for (tl = list_head(&tcps->tcps_listener_conf); tl != NULL;
1316e91bba0SGirish Moodalbail 	    tl = list_next(&tcps->tcps_listener_conf, tl)) {
1326e91bba0SGirish Moodalbail 		/* There is an existing entry, so update its ratio value. */
1336e91bba0SGirish Moodalbail 		if (tl->tl_port == lport) {
1346e91bba0SGirish Moodalbail 			tl->tl_ratio = ratio;
1356e91bba0SGirish Moodalbail 			mutex_exit(&tcps->tcps_listener_conf_lock);
1366e91bba0SGirish Moodalbail 			return (0);
1376e91bba0SGirish Moodalbail 		}
1386e91bba0SGirish Moodalbail 	}
1396e91bba0SGirish Moodalbail 
1406e91bba0SGirish Moodalbail 	if ((new_tl = kmem_alloc(sizeof (tcp_listener_t), KM_NOSLEEP)) ==
1416e91bba0SGirish Moodalbail 	    NULL) {
1426e91bba0SGirish Moodalbail 		mutex_exit(&tcps->tcps_listener_conf_lock);
1436e91bba0SGirish Moodalbail 		return (ENOMEM);
1446e91bba0SGirish Moodalbail 	}
1456e91bba0SGirish Moodalbail 
1466e91bba0SGirish Moodalbail 	new_tl->tl_port = lport;
1476e91bba0SGirish Moodalbail 	new_tl->tl_ratio = ratio;
1486e91bba0SGirish Moodalbail 	list_insert_tail(&tcps->tcps_listener_conf, new_tl);
1496e91bba0SGirish Moodalbail 	mutex_exit(&tcps->tcps_listener_conf_lock);
1506e91bba0SGirish Moodalbail 	return (0);
1516e91bba0SGirish Moodalbail }
1526e91bba0SGirish Moodalbail 
1536e91bba0SGirish Moodalbail /*
1546e91bba0SGirish Moodalbail  * remove a listener limit configuration.
1556e91bba0SGirish Moodalbail  */
1566e91bba0SGirish Moodalbail /* ARGSUSED */
1576e91bba0SGirish Moodalbail static int
tcp_listener_conf_del(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pval,uint_t flags)158299625c6SSebastien Roy tcp_listener_conf_del(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
1596e91bba0SGirish Moodalbail     const char *ifname, const void* pval, uint_t flags)
1606e91bba0SGirish Moodalbail {
1616e91bba0SGirish Moodalbail 	tcp_listener_t	*tl;
1626e91bba0SGirish Moodalbail 	long		lport;
163299625c6SSebastien Roy 	tcp_stack_t	*tcps = stack->netstack_tcp;
1646e91bba0SGirish Moodalbail 
1656e91bba0SGirish Moodalbail 	if (flags & MOD_PROP_DEFAULT)
1666e91bba0SGirish Moodalbail 		return (ENOTSUP);
1676e91bba0SGirish Moodalbail 
1686e91bba0SGirish Moodalbail 	if (ddi_strtol(pval, NULL, 10, &lport) != 0 || lport <= 0 ||
1696e91bba0SGirish Moodalbail 	    lport > USHRT_MAX) {
1706e91bba0SGirish Moodalbail 		return (EINVAL);
1716e91bba0SGirish Moodalbail 	}
1726e91bba0SGirish Moodalbail 	mutex_enter(&tcps->tcps_listener_conf_lock);
1736e91bba0SGirish Moodalbail 	for (tl = list_head(&tcps->tcps_listener_conf); tl != NULL;
1746e91bba0SGirish Moodalbail 	    tl = list_next(&tcps->tcps_listener_conf, tl)) {
1756e91bba0SGirish Moodalbail 		if (tl->tl_port == lport) {
1766e91bba0SGirish Moodalbail 			list_remove(&tcps->tcps_listener_conf, tl);
1776e91bba0SGirish Moodalbail 			mutex_exit(&tcps->tcps_listener_conf_lock);
1786e91bba0SGirish Moodalbail 			kmem_free(tl, sizeof (tcp_listener_t));
1796e91bba0SGirish Moodalbail 			return (0);
1806e91bba0SGirish Moodalbail 		}
1816e91bba0SGirish Moodalbail 	}
1826e91bba0SGirish Moodalbail 	mutex_exit(&tcps->tcps_listener_conf_lock);
1836e91bba0SGirish Moodalbail 	return (ESRCH);
1846e91bba0SGirish Moodalbail }
1856e91bba0SGirish Moodalbail 
186299625c6SSebastien Roy static int
tcp_set_buf_prop(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pval,uint_t flags)187299625c6SSebastien Roy tcp_set_buf_prop(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
188299625c6SSebastien Roy     const char *ifname, const void *pval, uint_t flags)
189299625c6SSebastien Roy {
190299625c6SSebastien Roy 	return (mod_set_buf_prop(stack->netstack_tcp->tcps_propinfo_tbl, stack,
191299625c6SSebastien Roy 	    cr, pinfo, ifname, pval, flags));
192299625c6SSebastien Roy }
193299625c6SSebastien Roy 
194299625c6SSebastien Roy static int
tcp_get_buf_prop(netstack_t * stack,mod_prop_info_t * pinfo,const char * ifname,void * val,uint_t psize,uint_t flags)195299625c6SSebastien Roy tcp_get_buf_prop(netstack_t *stack, mod_prop_info_t *pinfo, const char *ifname,
196299625c6SSebastien Roy     void *val, uint_t psize, uint_t flags)
197299625c6SSebastien Roy {
198299625c6SSebastien Roy 	return (mod_get_buf_prop(stack->netstack_tcp->tcps_propinfo_tbl, stack,
199299625c6SSebastien Roy 	    pinfo, ifname, val, psize, flags));
200299625c6SSebastien Roy }
201299625c6SSebastien Roy 
2026e91bba0SGirish Moodalbail /*
2037256a34eSDan McDonald  * Special checkers for smallest/largest anonymous port so they don't
2047256a34eSDan McDonald  * ever happen to be (largest < smallest).
2057256a34eSDan McDonald  */
2067256a34eSDan McDonald /* ARGSUSED */
2077256a34eSDan McDonald static int
tcp_smallest_anon_set(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pval,uint_t flags)208299625c6SSebastien Roy tcp_smallest_anon_set(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
2097256a34eSDan McDonald     const char *ifname, const void *pval, uint_t flags)
2107256a34eSDan McDonald {
2117256a34eSDan McDonald 	unsigned long new_value;
212299625c6SSebastien Roy 	tcp_stack_t *tcps = stack->netstack_tcp;
2137256a34eSDan McDonald 	int err;
2147256a34eSDan McDonald 
2157256a34eSDan McDonald 	if ((err = mod_uint32_value(pval, pinfo, flags, &new_value)) != 0)
2167256a34eSDan McDonald 		return (err);
2177256a34eSDan McDonald 	/* mod_uint32_value() + pinfo guarantees we're in TCP port range. */
2187256a34eSDan McDonald 	if ((uint32_t)new_value > tcps->tcps_largest_anon_port)
2197256a34eSDan McDonald 		return (ERANGE);
2207256a34eSDan McDonald 	pinfo->prop_cur_uval = (uint32_t)new_value;
2217256a34eSDan McDonald 	return (0);
2227256a34eSDan McDonald }
2237256a34eSDan McDonald 
2247256a34eSDan McDonald /* ARGSUSED */
2257256a34eSDan McDonald static int
tcp_largest_anon_set(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pval,uint_t flags)226299625c6SSebastien Roy tcp_largest_anon_set(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
2277256a34eSDan McDonald     const char *ifname, const void *pval, uint_t flags)
2287256a34eSDan McDonald {
2297256a34eSDan McDonald 	unsigned long new_value;
230299625c6SSebastien Roy 	tcp_stack_t *tcps = stack->netstack_tcp;
2317256a34eSDan McDonald 	int err;
2327256a34eSDan McDonald 
2337256a34eSDan McDonald 	if ((err = mod_uint32_value(pval, pinfo, flags, &new_value)) != 0)
2347256a34eSDan McDonald 		return (err);
2357256a34eSDan McDonald 	/* mod_uint32_value() + pinfo guarantees we're in TCP port range. */
2367256a34eSDan McDonald 	if ((uint32_t)new_value < tcps->tcps_smallest_anon_port)
2377256a34eSDan McDonald 		return (ERANGE);
2387256a34eSDan McDonald 	pinfo->prop_cur_uval = (uint32_t)new_value;
2397256a34eSDan McDonald 	return (0);
2407256a34eSDan McDonald }
2417256a34eSDan McDonald 
2427256a34eSDan McDonald /*
2436e91bba0SGirish Moodalbail  * All of these are alterable, within the min/max values given, at run time.
2446e91bba0SGirish Moodalbail  *
2458887b57dSGirish Moodalbail  * Note: All those tunables which do not start with "_" are Committed and
2468887b57dSGirish Moodalbail  * therefore are public. See PSARC 2010/080.
2476e91bba0SGirish Moodalbail  */
2486e91bba0SGirish Moodalbail mod_prop_info_t tcp_propinfo_tbl[] = {
2496e91bba0SGirish Moodalbail 	/* tunable - 0 */
2508887b57dSGirish Moodalbail 	{ "_time_wait_interval", MOD_PROTO_TCP,
2516e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2526e91bba0SGirish Moodalbail 	    {1*SECONDS, 10*MINUTES, 1*MINUTES}, {1*MINUTES} },
2536e91bba0SGirish Moodalbail 
2548887b57dSGirish Moodalbail 	{ "_conn_req_max_q", MOD_PROTO_TCP,
2556e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2566e91bba0SGirish Moodalbail 	    {1, UINT32_MAX, 128}, {128} },
2576e91bba0SGirish Moodalbail 
2588887b57dSGirish Moodalbail 	{ "_conn_req_max_q0", MOD_PROTO_TCP,
2596e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2606e91bba0SGirish Moodalbail 	    {0, UINT32_MAX, 1024}, {1024} },
2616e91bba0SGirish Moodalbail 
2628887b57dSGirish Moodalbail 	{ "_conn_req_min", MOD_PROTO_TCP,
2636e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2646e91bba0SGirish Moodalbail 	    {1, 1024, 1}, {1} },
2656e91bba0SGirish Moodalbail 
2668887b57dSGirish Moodalbail 	{ "_conn_grace_period", MOD_PROTO_TCP,
2676e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2686e91bba0SGirish Moodalbail 	    {0*MS, 20*SECONDS, 0*MS}, {0*MS} },
2696e91bba0SGirish Moodalbail 
2708887b57dSGirish Moodalbail 	{ "_cwnd_max", MOD_PROTO_TCP,
2716e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
272299625c6SSebastien Roy 	    {128, ULP_MAX_BUF, 1024*1024}, {1024*1024} },
2736e91bba0SGirish Moodalbail 
2748887b57dSGirish Moodalbail 	{ "_debug", MOD_PROTO_TCP,
2756e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2766e91bba0SGirish Moodalbail 	    {0, 10, 0}, {0} },
2776e91bba0SGirish Moodalbail 
2786e91bba0SGirish Moodalbail 	{ "smallest_nonpriv_port", MOD_PROTO_TCP,
2796e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2806e91bba0SGirish Moodalbail 	    {1024, (32*1024), 1024}, {1024} },
2816e91bba0SGirish Moodalbail 
2828887b57dSGirish Moodalbail 	{ "_ip_abort_cinterval", MOD_PROTO_TCP,
2836e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2846e91bba0SGirish Moodalbail 	    {1*SECONDS, UINT32_MAX, 3*MINUTES}, {3*MINUTES} },
2856e91bba0SGirish Moodalbail 
2868887b57dSGirish Moodalbail 	{ "_ip_abort_linterval", MOD_PROTO_TCP,
2876e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2886e91bba0SGirish Moodalbail 	    {1*SECONDS, UINT32_MAX, 3*MINUTES}, {3*MINUTES} },
2896e91bba0SGirish Moodalbail 
2906e91bba0SGirish Moodalbail 	/* tunable - 10 */
2918887b57dSGirish Moodalbail 	{ "_ip_abort_interval", MOD_PROTO_TCP,
2926e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2936e91bba0SGirish Moodalbail 	    {500*MS, UINT32_MAX, 5*MINUTES}, {5*MINUTES} },
2946e91bba0SGirish Moodalbail 
2958887b57dSGirish Moodalbail 	{ "_ip_notify_cinterval", MOD_PROTO_TCP,
2966e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
2976e91bba0SGirish Moodalbail 	    {1*SECONDS, UINT32_MAX, 10*SECONDS},
2986e91bba0SGirish Moodalbail 	    {10*SECONDS} },
2996e91bba0SGirish Moodalbail 
3008887b57dSGirish Moodalbail 	{ "_ip_notify_interval", MOD_PROTO_TCP,
3016e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3026e91bba0SGirish Moodalbail 	    {500*MS, UINT32_MAX, 10*SECONDS}, {10*SECONDS} },
3036e91bba0SGirish Moodalbail 
3048887b57dSGirish Moodalbail 	{ "_ipv4_ttl", MOD_PROTO_TCP,
3056e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3066e91bba0SGirish Moodalbail 	    {1, 255, 64}, {64} },
3076e91bba0SGirish Moodalbail 
3088887b57dSGirish Moodalbail 	{ "_keepalive_interval", MOD_PROTO_TCP,
3096e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3106e91bba0SGirish Moodalbail 	    {10*SECONDS, 10*DAYS, 2*HOURS}, {2*HOURS} },
3116e91bba0SGirish Moodalbail 
3128887b57dSGirish Moodalbail 	{ "_maxpsz_multiplier", MOD_PROTO_TCP,
3136e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3146e91bba0SGirish Moodalbail 	    {0, 100, 10}, {10} },
3156e91bba0SGirish Moodalbail 
3168887b57dSGirish Moodalbail 	{ "_mss_def_ipv4", MOD_PROTO_TCP,
3176e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3186e91bba0SGirish Moodalbail 	    {1, TCP_MSS_MAX_IPV4, 536}, {536} },
3196e91bba0SGirish Moodalbail 
3208887b57dSGirish Moodalbail 	{ "_mss_max_ipv4", MOD_PROTO_TCP,
3216e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3226e91bba0SGirish Moodalbail 	    {1, TCP_MSS_MAX_IPV4, TCP_MSS_MAX_IPV4},
3236e91bba0SGirish Moodalbail 	    {TCP_MSS_MAX_IPV4} },
3246e91bba0SGirish Moodalbail 
3258887b57dSGirish Moodalbail 	{ "_mss_min", MOD_PROTO_TCP,
3266e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3276e91bba0SGirish Moodalbail 	    {1, TCP_MSS_MAX, 108}, {108} },
3286e91bba0SGirish Moodalbail 
3298887b57dSGirish Moodalbail 	{ "_naglim_def", MOD_PROTO_TCP,
3306e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3316e91bba0SGirish Moodalbail 	    {1, (64*1024)-1, (4*1024)-1}, {(4*1024)-1} },
3326e91bba0SGirish Moodalbail 
3336e91bba0SGirish Moodalbail 	/* tunable - 20 */
3348887b57dSGirish Moodalbail 	{ "_rexmit_interval_initial", MOD_PROTO_TCP,
3356e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3366e91bba0SGirish Moodalbail 	    {1*MS, 20*SECONDS, 1*SECONDS}, {1*SECONDS} },
3376e91bba0SGirish Moodalbail 
3388887b57dSGirish Moodalbail 	{ "_rexmit_interval_max", MOD_PROTO_TCP,
3396e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3406e91bba0SGirish Moodalbail 	    {1*MS, 2*HOURS, 60*SECONDS}, {60*SECONDS} },
3416e91bba0SGirish Moodalbail 
3428887b57dSGirish Moodalbail 	{ "_rexmit_interval_min", MOD_PROTO_TCP,
3436e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3446e91bba0SGirish Moodalbail 	    {1*MS, 2*HOURS, 400*MS}, {400*MS} },
3456e91bba0SGirish Moodalbail 
3468887b57dSGirish Moodalbail 	{ "_deferred_ack_interval", MOD_PROTO_TCP,
3476e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3486e91bba0SGirish Moodalbail 	    {1*MS, 1*MINUTES, 100*MS}, {100*MS} },
3496e91bba0SGirish Moodalbail 
3508887b57dSGirish Moodalbail 	{ "_snd_lowat_fraction", MOD_PROTO_TCP,
3516e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
352299625c6SSebastien Roy 	    {0, 16, 10}, {10} },
3536e91bba0SGirish Moodalbail 
3548887b57dSGirish Moodalbail 	{ "_dupack_fast_retransmit", MOD_PROTO_TCP,
3556e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3566e91bba0SGirish Moodalbail 	    {1, 10000, 3}, {3} },
3576e91bba0SGirish Moodalbail 
3588887b57dSGirish Moodalbail 	{ "_ignore_path_mtu", MOD_PROTO_TCP,
3596e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
3606e91bba0SGirish Moodalbail 	    {B_FALSE}, {B_FALSE} },
3616e91bba0SGirish Moodalbail 
3626e91bba0SGirish Moodalbail 	{ "smallest_anon_port", MOD_PROTO_TCP,
3637256a34eSDan McDonald 	    tcp_smallest_anon_set, mod_get_uint32,
3646e91bba0SGirish Moodalbail 	    {1024, ULP_MAX_PORT, 32*1024}, {32*1024} },
3656e91bba0SGirish Moodalbail 
3666e91bba0SGirish Moodalbail 	{ "largest_anon_port", MOD_PROTO_TCP,
3677256a34eSDan McDonald 	    tcp_largest_anon_set, mod_get_uint32,
3686e91bba0SGirish Moodalbail 	    {1024, ULP_MAX_PORT, ULP_MAX_PORT},
3696e91bba0SGirish Moodalbail 	    {ULP_MAX_PORT} },
3706e91bba0SGirish Moodalbail 
371299625c6SSebastien Roy 	{ "send_buf", MOD_PROTO_TCP,
372299625c6SSebastien Roy 	    tcp_set_buf_prop, tcp_get_buf_prop,
373299625c6SSebastien Roy 	    {TCP_XMIT_LOWATER, ULP_MAX_BUF, TCP_XMIT_HIWATER},
3746e91bba0SGirish Moodalbail 	    {TCP_XMIT_HIWATER} },
3756e91bba0SGirish Moodalbail 
3766e91bba0SGirish Moodalbail 	/* tunable - 30 */
3778887b57dSGirish Moodalbail 	{ "_xmit_lowat", MOD_PROTO_TCP,
3786e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
379299625c6SSebastien Roy 	    {TCP_XMIT_LOWATER, ULP_MAX_BUF, TCP_XMIT_LOWATER},
3806e91bba0SGirish Moodalbail 	    {TCP_XMIT_LOWATER} },
3816e91bba0SGirish Moodalbail 
382299625c6SSebastien Roy 	{ "recv_buf", MOD_PROTO_TCP,
383299625c6SSebastien Roy 	    tcp_set_buf_prop, tcp_get_buf_prop,
384299625c6SSebastien Roy 	    {TCP_RECV_LOWATER, ULP_MAX_BUF, TCP_RECV_HIWATER},
3856e91bba0SGirish Moodalbail 	    {TCP_RECV_HIWATER} },
3866e91bba0SGirish Moodalbail 
3878887b57dSGirish Moodalbail 	{ "_recv_hiwat_minmss", MOD_PROTO_TCP,
3886e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
3896e91bba0SGirish Moodalbail 	    {1, 65536, 4}, {4} },
3906e91bba0SGirish Moodalbail 
3918887b57dSGirish Moodalbail 	{ "_fin_wait_2_flush_interval", MOD_PROTO_TCP,
3926e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
393707e74bcSKacheong Poon 	    {1*SECONDS, 2*HOURS, 60*SECONDS},
394707e74bcSKacheong Poon 	    {60*SECONDS} },
3956e91bba0SGirish Moodalbail 
396299625c6SSebastien Roy 	{ "max_buf", MOD_PROTO_TCP,
3976e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
398299625c6SSebastien Roy 	    {8192, ULP_MAX_BUF, 1024*1024}, {1024*1024} },
3996e91bba0SGirish Moodalbail 
4008887b57dSGirish Moodalbail 	{ "_strong_iss", MOD_PROTO_TCP,
4016e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
402*4d2aeb95SDan McDonald 	    {0, 2, 2}, {2} },
4036e91bba0SGirish Moodalbail 
4048887b57dSGirish Moodalbail 	{ "_rtt_updates", MOD_PROTO_TCP,
4056e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4066e91bba0SGirish Moodalbail 	    {0, 65536, 20}, {20} },
4076e91bba0SGirish Moodalbail 
4088887b57dSGirish Moodalbail 	{ "_wscale_always", MOD_PROTO_TCP,
4096e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
4106e91bba0SGirish Moodalbail 	    {B_TRUE}, {B_TRUE} },
4116e91bba0SGirish Moodalbail 
4128887b57dSGirish Moodalbail 	{ "_tstamp_always", MOD_PROTO_TCP,
4136e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
4146e91bba0SGirish Moodalbail 	    {B_FALSE}, {B_FALSE} },
4156e91bba0SGirish Moodalbail 
4168887b57dSGirish Moodalbail 	{ "_tstamp_if_wscale", MOD_PROTO_TCP,
4176e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
4186e91bba0SGirish Moodalbail 	    {B_TRUE}, {B_TRUE} },
4196e91bba0SGirish Moodalbail 
4206e91bba0SGirish Moodalbail 	/* tunable - 40 */
4218887b57dSGirish Moodalbail 	{ "_rexmit_interval_extra", MOD_PROTO_TCP,
4226e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4236e91bba0SGirish Moodalbail 	    {0*MS, 2*HOURS, 0*MS}, {0*MS} },
4246e91bba0SGirish Moodalbail 
4258887b57dSGirish Moodalbail 	{ "_deferred_acks_max", MOD_PROTO_TCP,
4266e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4276e91bba0SGirish Moodalbail 	    {0, 16, 2}, {2} },
4286e91bba0SGirish Moodalbail 
4298887b57dSGirish Moodalbail 	{ "_slow_start_after_idle", MOD_PROTO_TCP,
4306e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
431e068a72aSTheo Schlossnagle 	    {0, 16384, 0}, {0} },
4326e91bba0SGirish Moodalbail 
4338887b57dSGirish Moodalbail 	{ "_slow_start_initial", MOD_PROTO_TCP,
4346e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
435e068a72aSTheo Schlossnagle 	    {0, 16, 0}, {0} },
4366e91bba0SGirish Moodalbail 
4376e91bba0SGirish Moodalbail 	{ "sack", MOD_PROTO_TCP,
4386e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4396e91bba0SGirish Moodalbail 	    {0, 2, 2}, {2} },
4406e91bba0SGirish Moodalbail 
4418887b57dSGirish Moodalbail 	{ "_ipv6_hoplimit", MOD_PROTO_TCP,
4426e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4436e91bba0SGirish Moodalbail 	    {0, IPV6_MAX_HOPS, IPV6_DEFAULT_HOPS},
4446e91bba0SGirish Moodalbail 	    {IPV6_DEFAULT_HOPS} },
4456e91bba0SGirish Moodalbail 
4468887b57dSGirish Moodalbail 	{ "_mss_def_ipv6", MOD_PROTO_TCP,
4476e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4486e91bba0SGirish Moodalbail 	    {1, TCP_MSS_MAX_IPV6, 1220}, {1220} },
4496e91bba0SGirish Moodalbail 
4508887b57dSGirish Moodalbail 	{ "_mss_max_ipv6", MOD_PROTO_TCP,
4516e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4526e91bba0SGirish Moodalbail 	    {1, TCP_MSS_MAX_IPV6, TCP_MSS_MAX_IPV6},
4536e91bba0SGirish Moodalbail 	    {TCP_MSS_MAX_IPV6} },
4546e91bba0SGirish Moodalbail 
4558887b57dSGirish Moodalbail 	{ "_rev_src_routes", MOD_PROTO_TCP,
4566e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
4576e91bba0SGirish Moodalbail 	    {B_FALSE}, {B_FALSE} },
4586e91bba0SGirish Moodalbail 
4598887b57dSGirish Moodalbail 	{ "_local_dack_interval", MOD_PROTO_TCP,
4606e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4616e91bba0SGirish Moodalbail 	    {10*MS, 500*MS, 50*MS}, {50*MS} },
4626e91bba0SGirish Moodalbail 
4636e91bba0SGirish Moodalbail 	/* tunable - 50 */
4648887b57dSGirish Moodalbail 	{ "_local_dacks_max", MOD_PROTO_TCP,
4656e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4666e91bba0SGirish Moodalbail 	    {0, 16, 8}, {8} },
4676e91bba0SGirish Moodalbail 
4686e91bba0SGirish Moodalbail 	{ "ecn", MOD_PROTO_TCP,
4696e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4706e91bba0SGirish Moodalbail 	    {0, 2, 1}, {1} },
4716e91bba0SGirish Moodalbail 
4728887b57dSGirish Moodalbail 	{ "_rst_sent_rate_enabled", MOD_PROTO_TCP,
4736e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
4746e91bba0SGirish Moodalbail 	    {B_TRUE}, {B_TRUE} },
4756e91bba0SGirish Moodalbail 
4768887b57dSGirish Moodalbail 	{ "_rst_sent_rate", MOD_PROTO_TCP,
4776e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4786e91bba0SGirish Moodalbail 	    {0, UINT32_MAX, 40}, {40} },
4796e91bba0SGirish Moodalbail 
4808887b57dSGirish Moodalbail 	{ "_push_timer_interval", MOD_PROTO_TCP,
4816e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4826e91bba0SGirish Moodalbail 	    {0, 100*MS, 50*MS}, {50*MS} },
4836e91bba0SGirish Moodalbail 
4848887b57dSGirish Moodalbail 	{ "_use_smss_as_mss_opt", MOD_PROTO_TCP,
4856e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
4866e91bba0SGirish Moodalbail 	    {B_FALSE}, {B_FALSE} },
4876e91bba0SGirish Moodalbail 
4888887b57dSGirish Moodalbail 	{ "_keepalive_abort_interval", MOD_PROTO_TCP,
4896e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
4906e91bba0SGirish Moodalbail 	    {0, UINT32_MAX, 8*MINUTES}, {8*MINUTES} },
4916e91bba0SGirish Moodalbail 
4926e91bba0SGirish Moodalbail 	/*
4936e91bba0SGirish Moodalbail 	 * tcp_wroff_xtra is the extra space in front of TCP/IP header for link
4946e91bba0SGirish Moodalbail 	 * layer header.  It has to be a multiple of 8.
4956e91bba0SGirish Moodalbail 	 */
4968887b57dSGirish Moodalbail 	{ "_wroff_xtra", MOD_PROTO_TCP,
4976e91bba0SGirish Moodalbail 	    mod_set_aligned, mod_get_uint32,
4986e91bba0SGirish Moodalbail 	    {0, 256, 32}, {32} },
4996e91bba0SGirish Moodalbail 
5008887b57dSGirish Moodalbail 	{ "_dev_flow_ctl", MOD_PROTO_TCP,
5016e91bba0SGirish Moodalbail 	    mod_set_boolean, mod_get_boolean,
5026e91bba0SGirish Moodalbail 	    {B_FALSE}, {B_FALSE} },
5036e91bba0SGirish Moodalbail 
5048887b57dSGirish Moodalbail 	{ "_reass_timeout", MOD_PROTO_TCP,
5056e91bba0SGirish Moodalbail 	    mod_set_uint32, mod_get_uint32,
5066e91bba0SGirish Moodalbail 	    {0, UINT32_MAX, 100*SECONDS}, {100*SECONDS} },
5076e91bba0SGirish Moodalbail 
5086e91bba0SGirish Moodalbail 	/* tunable - 60 */
5096e91bba0SGirish Moodalbail 	{ "extra_priv_ports", MOD_PROTO_TCP,
5106e91bba0SGirish Moodalbail 	    mod_set_extra_privports, mod_get_extra_privports,
5116e91bba0SGirish Moodalbail 	    {1, ULP_MAX_PORT, 0}, {0} },
5126e91bba0SGirish Moodalbail 
5138887b57dSGirish Moodalbail 	{ "_1948_phrase", MOD_PROTO_TCP,
5146e91bba0SGirish Moodalbail 	    tcp_set_1948phrase, NULL, {0}, {0} },
5156e91bba0SGirish Moodalbail 
5168887b57dSGirish Moodalbail 	{ "_listener_limit_conf", MOD_PROTO_TCP,
5176e91bba0SGirish Moodalbail 	    NULL, tcp_listener_conf_get, {0}, {0} },
5186e91bba0SGirish Moodalbail 
5198887b57dSGirish Moodalbail 	{ "_listener_limit_conf_add", MOD_PROTO_TCP,
5206e91bba0SGirish Moodalbail 	    tcp_listener_conf_add, NULL, {0}, {0} },
5216e91bba0SGirish Moodalbail 
5228887b57dSGirish Moodalbail 	{ "_listener_limit_conf_del", MOD_PROTO_TCP,
5236e91bba0SGirish Moodalbail 	    tcp_listener_conf_del, NULL, {0}, {0} },
5246e91bba0SGirish Moodalbail 
525c0e6663fSJerry Jelinek 	{ "_iss_incr", MOD_PROTO_TCP,
526c0e6663fSJerry Jelinek 	    mod_set_uint32, mod_get_uint32,
527c0e6663fSJerry Jelinek 	    {1, ISS_INCR, ISS_INCR},
528c0e6663fSJerry Jelinek 	    {ISS_INCR} },
529c0e6663fSJerry Jelinek 
5306e91bba0SGirish Moodalbail 	{ "?", MOD_PROTO_TCP, NULL, mod_get_allprop, {0}, {0} },
5316e91bba0SGirish Moodalbail 
5326e91bba0SGirish Moodalbail 	{ NULL, 0, NULL, NULL, {0}, {0} }
5336e91bba0SGirish Moodalbail };
5346e91bba0SGirish Moodalbail 
5356e91bba0SGirish Moodalbail int tcp_propinfo_count = A_CNT(tcp_propinfo_tbl);
536