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.
232404c9e6SPatrick Mooney * Copyright 2016 Joyent, Inc.
247256a34eSDan McDonald * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
2545a4b79dSSebastien Roy * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
26*9b664393SGarrett D'Amore * Copyright 2022 Garrett D'Amore
276e91bba0SGirish Moodalbail */
288887b57dSGirish Moodalbail /* Copyright (c) 1990 Mentat Inc. */
296e91bba0SGirish Moodalbail
306e91bba0SGirish Moodalbail #include <inet/ip.h>
316e91bba0SGirish Moodalbail #include <inet/tcp_impl.h>
3245a4b79dSSebastien Roy #include <inet/cc.h>
336e91bba0SGirish Moodalbail #include <sys/sunddi.h>
346e91bba0SGirish Moodalbail
356e91bba0SGirish Moodalbail /* Max size IP datagram is 64k - 1 */
366e91bba0SGirish Moodalbail #define TCP_MSS_MAX_IPV4 (IP_MAXPACKET - (sizeof (ipha_t) + sizeof (tcpha_t)))
376e91bba0SGirish Moodalbail #define TCP_MSS_MAX_IPV6 (IP_MAXPACKET - (sizeof (ip6_t) + sizeof (tcpha_t)))
386e91bba0SGirish Moodalbail
396e91bba0SGirish Moodalbail /* Max of the above */
406e91bba0SGirish Moodalbail #define TCP_MSS_MAX TCP_MSS_MAX_IPV4
416e91bba0SGirish Moodalbail
4245a4b79dSSebastien Roy typedef struct {
4345a4b79dSSebastien Roy char *ccn_buf;
4445a4b79dSSebastien Roy uint_t ccn_bufsize;
4545a4b79dSSebastien Roy uint_t ccn_bytes;
4645a4b79dSSebastien Roy } tcp_copy_ccname_t;
4745a4b79dSSebastien Roy
486e91bba0SGirish Moodalbail /*
496e91bba0SGirish Moodalbail * Set the RFC 1948 pass phrase
506e91bba0SGirish Moodalbail */
516e91bba0SGirish Moodalbail /* ARGSUSED */
526e91bba0SGirish 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)53299625c6SSebastien Roy tcp_set_1948phrase(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
546e91bba0SGirish Moodalbail const char *ifname, const void* pr_val, uint_t flags)
556e91bba0SGirish Moodalbail {
566e91bba0SGirish Moodalbail if (flags & MOD_PROP_DEFAULT)
576e91bba0SGirish Moodalbail return (ENOTSUP);
586e91bba0SGirish Moodalbail
596e91bba0SGirish Moodalbail /*
606e91bba0SGirish Moodalbail * Basically, value contains a new pass phrase. Pass it along!
616e91bba0SGirish Moodalbail */
62299625c6SSebastien Roy tcp_iss_key_init((uint8_t *)pr_val, strlen(pr_val),
63299625c6SSebastien Roy stack->netstack_tcp);
646e91bba0SGirish Moodalbail return (0);
656e91bba0SGirish Moodalbail }
666e91bba0SGirish Moodalbail
676e91bba0SGirish Moodalbail /*
686e91bba0SGirish Moodalbail * returns the current list of listener limit configuration.
696e91bba0SGirish Moodalbail */
706e91bba0SGirish Moodalbail /* ARGSUSED */
716e91bba0SGirish 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)72299625c6SSebastien Roy tcp_listener_conf_get(netstack_t *stack, mod_prop_info_t *pinfo,
73299625c6SSebastien Roy const char *ifname, void *val, uint_t psize, uint_t flags)
746e91bba0SGirish Moodalbail {
75299625c6SSebastien Roy tcp_stack_t *tcps = stack->netstack_tcp;
766e91bba0SGirish Moodalbail tcp_listener_t *tl;
776e91bba0SGirish Moodalbail char *pval = val;
786e91bba0SGirish Moodalbail size_t nbytes = 0, tbytes = 0;
796e91bba0SGirish Moodalbail uint_t size;
806e91bba0SGirish Moodalbail int err = 0;
816e91bba0SGirish Moodalbail
826e91bba0SGirish Moodalbail bzero(pval, psize);
836e91bba0SGirish Moodalbail size = psize;
846e91bba0SGirish Moodalbail
856e91bba0SGirish Moodalbail if (flags & (MOD_PROP_DEFAULT|MOD_PROP_PERM|MOD_PROP_POSSIBLE))
866e91bba0SGirish Moodalbail return (0);
876e91bba0SGirish Moodalbail
886e91bba0SGirish Moodalbail mutex_enter(&tcps->tcps_listener_conf_lock);
896e91bba0SGirish Moodalbail for (tl = list_head(&tcps->tcps_listener_conf); tl != NULL;
906e91bba0SGirish Moodalbail tl = list_next(&tcps->tcps_listener_conf, tl)) {
916e91bba0SGirish Moodalbail if (psize == size)
926e91bba0SGirish Moodalbail nbytes = snprintf(pval, size, "%d:%d", tl->tl_port,
936e91bba0SGirish Moodalbail tl->tl_ratio);
946e91bba0SGirish Moodalbail else
956e91bba0SGirish Moodalbail nbytes = snprintf(pval, size, ",%d:%d", tl->tl_port,
966e91bba0SGirish Moodalbail tl->tl_ratio);
976e91bba0SGirish Moodalbail size -= nbytes;
986e91bba0SGirish Moodalbail pval += nbytes;
996e91bba0SGirish Moodalbail tbytes += nbytes;
1006e91bba0SGirish Moodalbail if (tbytes >= psize) {
1016e91bba0SGirish Moodalbail /* Buffer overflow, stop copying information */
1026e91bba0SGirish Moodalbail err = ENOBUFS;
1036e91bba0SGirish Moodalbail break;
1046e91bba0SGirish Moodalbail }
1056e91bba0SGirish Moodalbail }
1065dd46ab5SKacheong Poon
1076e91bba0SGirish Moodalbail mutex_exit(&tcps->tcps_listener_conf_lock);
1086e91bba0SGirish Moodalbail return (err);
1096e91bba0SGirish Moodalbail }
1106e91bba0SGirish Moodalbail
1116e91bba0SGirish Moodalbail /*
1126e91bba0SGirish Moodalbail * add a new listener limit configuration.
1136e91bba0SGirish Moodalbail */
1146e91bba0SGirish Moodalbail /* ARGSUSED */
1156e91bba0SGirish 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)116299625c6SSebastien Roy tcp_listener_conf_add(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
1176e91bba0SGirish Moodalbail const char *ifname, const void* pval, uint_t flags)
1186e91bba0SGirish Moodalbail {
1196e91bba0SGirish Moodalbail tcp_listener_t *new_tl;
1206e91bba0SGirish Moodalbail tcp_listener_t *tl;
1216e91bba0SGirish Moodalbail long lport;
1226e91bba0SGirish Moodalbail long ratio;
1236e91bba0SGirish Moodalbail char *colon;
124299625c6SSebastien Roy tcp_stack_t *tcps = stack->netstack_tcp;
1256e91bba0SGirish Moodalbail
1266e91bba0SGirish Moodalbail if (flags & MOD_PROP_DEFAULT)
1276e91bba0SGirish Moodalbail return (ENOTSUP);
1286e91bba0SGirish Moodalbail
1296e91bba0SGirish Moodalbail if (ddi_strtol(pval, &colon, 10, &lport) != 0 || lport <= 0 ||
1306e91bba0SGirish Moodalbail lport > USHRT_MAX || *colon != ':') {
1316e91bba0SGirish Moodalbail return (EINVAL);
1326e91bba0SGirish Moodalbail }
1336e91bba0SGirish Moodalbail if (ddi_strtol(colon + 1, NULL, 10, &ratio) != 0 || ratio <= 0)
1346e91bba0SGirish Moodalbail return (EINVAL);
1356e91bba0SGirish Moodalbail
1366e91bba0SGirish Moodalbail mutex_enter(&tcps->tcps_listener_conf_lock);
1376e91bba0SGirish Moodalbail for (tl = list_head(&tcps->tcps_listener_conf); tl != NULL;
1386e91bba0SGirish Moodalbail tl = list_next(&tcps->tcps_listener_conf, tl)) {
1396e91bba0SGirish Moodalbail /* There is an existing entry, so update its ratio value. */
1406e91bba0SGirish Moodalbail if (tl->tl_port == lport) {
1416e91bba0SGirish Moodalbail tl->tl_ratio = ratio;
1426e91bba0SGirish Moodalbail mutex_exit(&tcps->tcps_listener_conf_lock);
1436e91bba0SGirish Moodalbail return (0);
1446e91bba0SGirish Moodalbail }
1456e91bba0SGirish Moodalbail }
1466e91bba0SGirish Moodalbail
1476e91bba0SGirish Moodalbail if ((new_tl = kmem_alloc(sizeof (tcp_listener_t), KM_NOSLEEP)) ==
1486e91bba0SGirish Moodalbail NULL) {
1496e91bba0SGirish Moodalbail mutex_exit(&tcps->tcps_listener_conf_lock);
1506e91bba0SGirish Moodalbail return (ENOMEM);
1516e91bba0SGirish Moodalbail }
1526e91bba0SGirish Moodalbail
1536e91bba0SGirish Moodalbail new_tl->tl_port = lport;
1546e91bba0SGirish Moodalbail new_tl->tl_ratio = ratio;
1556e91bba0SGirish Moodalbail list_insert_tail(&tcps->tcps_listener_conf, new_tl);
1566e91bba0SGirish Moodalbail mutex_exit(&tcps->tcps_listener_conf_lock);
1576e91bba0SGirish Moodalbail return (0);
1586e91bba0SGirish Moodalbail }
1596e91bba0SGirish Moodalbail
1606e91bba0SGirish Moodalbail /*
1616e91bba0SGirish Moodalbail * remove a listener limit configuration.
1626e91bba0SGirish Moodalbail */
1636e91bba0SGirish Moodalbail /* ARGSUSED */
1646e91bba0SGirish 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)165299625c6SSebastien Roy tcp_listener_conf_del(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
1666e91bba0SGirish Moodalbail const char *ifname, const void* pval, uint_t flags)
1676e91bba0SGirish Moodalbail {
1686e91bba0SGirish Moodalbail tcp_listener_t *tl;
1696e91bba0SGirish Moodalbail long lport;
170299625c6SSebastien Roy tcp_stack_t *tcps = stack->netstack_tcp;
1716e91bba0SGirish Moodalbail
1726e91bba0SGirish Moodalbail if (flags & MOD_PROP_DEFAULT)
1736e91bba0SGirish Moodalbail return (ENOTSUP);
1746e91bba0SGirish Moodalbail
1756e91bba0SGirish Moodalbail if (ddi_strtol(pval, NULL, 10, &lport) != 0 || lport <= 0 ||
1766e91bba0SGirish Moodalbail lport > USHRT_MAX) {
1776e91bba0SGirish Moodalbail return (EINVAL);
1786e91bba0SGirish Moodalbail }
1796e91bba0SGirish Moodalbail mutex_enter(&tcps->tcps_listener_conf_lock);
1806e91bba0SGirish Moodalbail for (tl = list_head(&tcps->tcps_listener_conf); tl != NULL;
1816e91bba0SGirish Moodalbail tl = list_next(&tcps->tcps_listener_conf, tl)) {
1826e91bba0SGirish Moodalbail if (tl->tl_port == lport) {
1836e91bba0SGirish Moodalbail list_remove(&tcps->tcps_listener_conf, tl);
1846e91bba0SGirish Moodalbail mutex_exit(&tcps->tcps_listener_conf_lock);
1856e91bba0SGirish Moodalbail kmem_free(tl, sizeof (tcp_listener_t));
1866e91bba0SGirish Moodalbail return (0);
1876e91bba0SGirish Moodalbail }
1886e91bba0SGirish Moodalbail }
1896e91bba0SGirish Moodalbail mutex_exit(&tcps->tcps_listener_conf_lock);
1906e91bba0SGirish Moodalbail return (ESRCH);
1916e91bba0SGirish Moodalbail }
1926e91bba0SGirish Moodalbail
193299625c6SSebastien 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)194299625c6SSebastien Roy tcp_set_buf_prop(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
195299625c6SSebastien Roy const char *ifname, const void *pval, uint_t flags)
196299625c6SSebastien Roy {
197299625c6SSebastien Roy return (mod_set_buf_prop(stack->netstack_tcp->tcps_propinfo_tbl, stack,
198299625c6SSebastien Roy cr, pinfo, ifname, pval, flags));
199299625c6SSebastien Roy }
200299625c6SSebastien Roy
201299625c6SSebastien 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)202299625c6SSebastien Roy tcp_get_buf_prop(netstack_t *stack, mod_prop_info_t *pinfo, const char *ifname,
203299625c6SSebastien Roy void *val, uint_t psize, uint_t flags)
204299625c6SSebastien Roy {
205299625c6SSebastien Roy return (mod_get_buf_prop(stack->netstack_tcp->tcps_propinfo_tbl, stack,
206299625c6SSebastien Roy pinfo, ifname, val, psize, flags));
207299625c6SSebastien Roy }
208299625c6SSebastien Roy
2097256a34eSDan McDonald /*
2107256a34eSDan McDonald * Special checkers for smallest/largest anonymous port so they don't
2117256a34eSDan McDonald * ever happen to be (largest < smallest).
2127256a34eSDan McDonald */
2137256a34eSDan McDonald /* ARGSUSED */
2147256a34eSDan 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)215299625c6SSebastien Roy tcp_smallest_anon_set(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
2167256a34eSDan McDonald const char *ifname, const void *pval, uint_t flags)
2177256a34eSDan McDonald {
2187256a34eSDan McDonald unsigned long new_value;
219299625c6SSebastien Roy tcp_stack_t *tcps = stack->netstack_tcp;
2207256a34eSDan McDonald int err;
2217256a34eSDan McDonald
2227256a34eSDan McDonald if ((err = mod_uint32_value(pval, pinfo, flags, &new_value)) != 0)
2237256a34eSDan McDonald return (err);
2247256a34eSDan McDonald /* mod_uint32_value() + pinfo guarantees we're in TCP port range. */
2257256a34eSDan McDonald if ((uint32_t)new_value > tcps->tcps_largest_anon_port)
2267256a34eSDan McDonald return (ERANGE);
2277256a34eSDan McDonald pinfo->prop_cur_uval = (uint32_t)new_value;
2287256a34eSDan McDonald return (0);
2297256a34eSDan McDonald }
2307256a34eSDan McDonald
2317256a34eSDan McDonald /* ARGSUSED */
2327256a34eSDan 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)233299625c6SSebastien Roy tcp_largest_anon_set(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
2347256a34eSDan McDonald const char *ifname, const void *pval, uint_t flags)
2357256a34eSDan McDonald {
2367256a34eSDan McDonald unsigned long new_value;
237299625c6SSebastien Roy tcp_stack_t *tcps = stack->netstack_tcp;
2387256a34eSDan McDonald int err;
2397256a34eSDan McDonald
2407256a34eSDan McDonald if ((err = mod_uint32_value(pval, pinfo, flags, &new_value)) != 0)
2417256a34eSDan McDonald return (err);
2427256a34eSDan McDonald /* mod_uint32_value() + pinfo guarantees we're in TCP port range. */
2437256a34eSDan McDonald if ((uint32_t)new_value < tcps->tcps_smallest_anon_port)
2447256a34eSDan McDonald return (ERANGE);
2457256a34eSDan McDonald pinfo->prop_cur_uval = (uint32_t)new_value;
2467256a34eSDan McDonald return (0);
2477256a34eSDan McDonald }
2487256a34eSDan McDonald
24945a4b79dSSebastien Roy /* ARGSUSED */
25045a4b79dSSebastien Roy static int
tcp_set_cc_algorithm(netstack_t * stack,cred_t * cr,mod_prop_info_t * pinfo,const char * ifname,const void * pval,uint_t flags)25145a4b79dSSebastien Roy tcp_set_cc_algorithm(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo,
25245a4b79dSSebastien Roy const char *ifname, const void *pval, uint_t flags)
25345a4b79dSSebastien Roy {
25445a4b79dSSebastien Roy tcp_stack_t *tcps = stack->netstack_tcp;
25545a4b79dSSebastien Roy char *name = (flags & MOD_PROP_DEFAULT) ?
25645a4b79dSSebastien Roy CC_DEFAULT_ALGO_NAME : (char *)pval;
25745a4b79dSSebastien Roy struct cc_algo *algo = cc_load_algo(name);
25845a4b79dSSebastien Roy
25945a4b79dSSebastien Roy if (algo == NULL) {
26045a4b79dSSebastien Roy return (EINVAL);
26145a4b79dSSebastien Roy }
26245a4b79dSSebastien Roy
26345a4b79dSSebastien Roy tcps->tcps_default_cc_algo = algo;
26445a4b79dSSebastien Roy
26545a4b79dSSebastien Roy return (0);
26645a4b79dSSebastien Roy }
26745a4b79dSSebastien Roy
26845a4b79dSSebastien Roy static int
tcp_copy_ccname(void * data,struct cc_algo * algo)26945a4b79dSSebastien Roy tcp_copy_ccname(void *data, struct cc_algo *algo)
27045a4b79dSSebastien Roy {
27145a4b79dSSebastien Roy tcp_copy_ccname_t *cd = data;
27245a4b79dSSebastien Roy char *sep = cd->ccn_bytes > 0 ? "," : "";
27345a4b79dSSebastien Roy size_t avail = 0;
27445a4b79dSSebastien Roy
27545a4b79dSSebastien Roy if (cd->ccn_bytes < cd->ccn_bufsize) {
27645a4b79dSSebastien Roy avail = cd->ccn_bufsize - cd->ccn_bytes;
27745a4b79dSSebastien Roy }
27845a4b79dSSebastien Roy
27945a4b79dSSebastien Roy cd->ccn_bytes += snprintf(cd->ccn_buf + cd->ccn_bytes, avail,
28045a4b79dSSebastien Roy "%s%s", sep, algo->name);
28145a4b79dSSebastien Roy
28245a4b79dSSebastien Roy return (cd->ccn_bytes >= cd->ccn_bufsize ? ENOBUFS : 0);
28345a4b79dSSebastien Roy }
28445a4b79dSSebastien Roy
28545a4b79dSSebastien Roy /* ARGSUSED */
28645a4b79dSSebastien Roy static int
tcp_get_cc_algorithm(netstack_t * stack,mod_prop_info_t * pinfo,const char * ifname,void * pval,uint_t psize,uint_t flags)28745a4b79dSSebastien Roy tcp_get_cc_algorithm(netstack_t *stack, mod_prop_info_t *pinfo,
28845a4b79dSSebastien Roy const char *ifname, void *pval, uint_t psize, uint_t flags)
28945a4b79dSSebastien Roy {
29045a4b79dSSebastien Roy size_t nbytes;
29145a4b79dSSebastien Roy
29245a4b79dSSebastien Roy if (flags & MOD_PROP_POSSIBLE) {
29345a4b79dSSebastien Roy tcp_copy_ccname_t cd = { pval, psize, 0 };
29445a4b79dSSebastien Roy return (cc_walk_algos(tcp_copy_ccname, &cd));
29545a4b79dSSebastien Roy } else if (flags & MOD_PROP_PERM) {
29645a4b79dSSebastien Roy nbytes = snprintf(pval, psize, "%u", MOD_PROP_PERM_RW);
29745a4b79dSSebastien Roy } else if (flags & MOD_PROP_DEFAULT) {
29845a4b79dSSebastien Roy nbytes = snprintf(pval, psize, "%s", CC_DEFAULT_ALGO_NAME);
29945a4b79dSSebastien Roy } else {
30045a4b79dSSebastien Roy nbytes = snprintf(pval, psize, "%s",
30145a4b79dSSebastien Roy stack->netstack_tcp->tcps_default_cc_algo->name);
30245a4b79dSSebastien Roy }
30345a4b79dSSebastien Roy if (nbytes >= psize)
30445a4b79dSSebastien Roy return (ENOBUFS);
30545a4b79dSSebastien Roy return (0);
30645a4b79dSSebastien Roy }
30745a4b79dSSebastien Roy
3086e91bba0SGirish Moodalbail /*
3096e91bba0SGirish Moodalbail * All of these are alterable, within the min/max values given, at run time.
3106e91bba0SGirish Moodalbail *
3118887b57dSGirish Moodalbail * Note: All those tunables which do not start with "_" are Committed and
3128887b57dSGirish Moodalbail * therefore are public. See PSARC 2010/080.
3136e91bba0SGirish Moodalbail */
3146e91bba0SGirish Moodalbail mod_prop_info_t tcp_propinfo_tbl[] = {
3156e91bba0SGirish Moodalbail /* tunable - 0 */
3168887b57dSGirish Moodalbail { "_time_wait_interval", MOD_PROTO_TCP,
3176e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3182404c9e6SPatrick Mooney {1*SECONDS, TCP_TIME_WAIT_MAX, 1*MINUTES}, {1*MINUTES} },
3196e91bba0SGirish Moodalbail
3208887b57dSGirish Moodalbail { "_conn_req_max_q", MOD_PROTO_TCP,
3216e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3226e91bba0SGirish Moodalbail {1, UINT32_MAX, 128}, {128} },
3236e91bba0SGirish Moodalbail
3248887b57dSGirish Moodalbail { "_conn_req_max_q0", MOD_PROTO_TCP,
3256e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3266e91bba0SGirish Moodalbail {0, UINT32_MAX, 1024}, {1024} },
3276e91bba0SGirish Moodalbail
3288887b57dSGirish Moodalbail { "_conn_req_min", MOD_PROTO_TCP,
3296e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3306e91bba0SGirish Moodalbail {1, 1024, 1}, {1} },
3316e91bba0SGirish Moodalbail
3328887b57dSGirish Moodalbail { "_conn_grace_period", MOD_PROTO_TCP,
3336e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3346e91bba0SGirish Moodalbail {0*MS, 20*SECONDS, 0*MS}, {0*MS} },
3356e91bba0SGirish Moodalbail
3368887b57dSGirish Moodalbail { "_cwnd_max", MOD_PROTO_TCP,
3376e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
338299625c6SSebastien Roy {128, ULP_MAX_BUF, 1024*1024}, {1024*1024} },
3396e91bba0SGirish Moodalbail
3408887b57dSGirish Moodalbail { "_debug", MOD_PROTO_TCP,
3416e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3426e91bba0SGirish Moodalbail {0, 10, 0}, {0} },
3436e91bba0SGirish Moodalbail
3446e91bba0SGirish Moodalbail { "smallest_nonpriv_port", MOD_PROTO_TCP,
3456e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3466e91bba0SGirish Moodalbail {1024, (32*1024), 1024}, {1024} },
3476e91bba0SGirish Moodalbail
3488887b57dSGirish Moodalbail { "_ip_abort_cinterval", MOD_PROTO_TCP,
3496e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3506e91bba0SGirish Moodalbail {1*SECONDS, UINT32_MAX, 3*MINUTES}, {3*MINUTES} },
3516e91bba0SGirish Moodalbail
3528887b57dSGirish Moodalbail { "_ip_abort_linterval", MOD_PROTO_TCP,
3536e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3546e91bba0SGirish Moodalbail {1*SECONDS, UINT32_MAX, 3*MINUTES}, {3*MINUTES} },
3556e91bba0SGirish Moodalbail
3566e91bba0SGirish Moodalbail /* tunable - 10 */
3578887b57dSGirish Moodalbail { "_ip_abort_interval", MOD_PROTO_TCP,
3586e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3596e91bba0SGirish Moodalbail {500*MS, UINT32_MAX, 5*MINUTES}, {5*MINUTES} },
3606e91bba0SGirish Moodalbail
3618887b57dSGirish Moodalbail { "_ip_notify_cinterval", MOD_PROTO_TCP,
3626e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3636e91bba0SGirish Moodalbail {1*SECONDS, UINT32_MAX, 10*SECONDS},
3646e91bba0SGirish Moodalbail {10*SECONDS} },
3656e91bba0SGirish Moodalbail
3668887b57dSGirish Moodalbail { "_ip_notify_interval", MOD_PROTO_TCP,
3676e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3686e91bba0SGirish Moodalbail {500*MS, UINT32_MAX, 10*SECONDS}, {10*SECONDS} },
3696e91bba0SGirish Moodalbail
3708887b57dSGirish Moodalbail { "_ipv4_ttl", MOD_PROTO_TCP,
3716e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3726e91bba0SGirish Moodalbail {1, 255, 64}, {64} },
3736e91bba0SGirish Moodalbail
3748887b57dSGirish Moodalbail { "_keepalive_interval", MOD_PROTO_TCP,
3756e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
376995de729SPatrick Mooney {1*SECONDS, 10*DAYS, 2*HOURS}, {2*HOURS} },
3776e91bba0SGirish Moodalbail
3788887b57dSGirish Moodalbail { "_maxpsz_multiplier", MOD_PROTO_TCP,
3796e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3806e91bba0SGirish Moodalbail {0, 100, 10}, {10} },
3816e91bba0SGirish Moodalbail
3828887b57dSGirish Moodalbail { "_mss_def_ipv4", MOD_PROTO_TCP,
3836e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3846e91bba0SGirish Moodalbail {1, TCP_MSS_MAX_IPV4, 536}, {536} },
3856e91bba0SGirish Moodalbail
3868887b57dSGirish Moodalbail { "_mss_max_ipv4", MOD_PROTO_TCP,
3876e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3886e91bba0SGirish Moodalbail {1, TCP_MSS_MAX_IPV4, TCP_MSS_MAX_IPV4},
3896e91bba0SGirish Moodalbail {TCP_MSS_MAX_IPV4} },
3906e91bba0SGirish Moodalbail
3918887b57dSGirish Moodalbail { "_mss_min", MOD_PROTO_TCP,
3926e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3936e91bba0SGirish Moodalbail {1, TCP_MSS_MAX, 108}, {108} },
3946e91bba0SGirish Moodalbail
3958887b57dSGirish Moodalbail { "_naglim_def", MOD_PROTO_TCP,
3966e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
3976e91bba0SGirish Moodalbail {1, (64*1024)-1, (4*1024)-1}, {(4*1024)-1} },
3986e91bba0SGirish Moodalbail
3996e91bba0SGirish Moodalbail /* tunable - 20 */
4008887b57dSGirish Moodalbail { "_rexmit_interval_initial", MOD_PROTO_TCP,
4016e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4026e91bba0SGirish Moodalbail {1*MS, 20*SECONDS, 1*SECONDS}, {1*SECONDS} },
4036e91bba0SGirish Moodalbail
4048887b57dSGirish Moodalbail { "_rexmit_interval_max", MOD_PROTO_TCP,
4056e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4066e91bba0SGirish Moodalbail {1*MS, 2*HOURS, 60*SECONDS}, {60*SECONDS} },
4076e91bba0SGirish Moodalbail
4088887b57dSGirish Moodalbail { "_rexmit_interval_min", MOD_PROTO_TCP,
4096e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4106e91bba0SGirish Moodalbail {1*MS, 2*HOURS, 400*MS}, {400*MS} },
4116e91bba0SGirish Moodalbail
4128887b57dSGirish Moodalbail { "_deferred_ack_interval", MOD_PROTO_TCP,
4136e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4146e91bba0SGirish Moodalbail {1*MS, 1*MINUTES, 100*MS}, {100*MS} },
4156e91bba0SGirish Moodalbail
4168887b57dSGirish Moodalbail { "_snd_lowat_fraction", MOD_PROTO_TCP,
4176e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
418299625c6SSebastien Roy {0, 16, 10}, {10} },
4196e91bba0SGirish Moodalbail
4208887b57dSGirish Moodalbail { "_dupack_fast_retransmit", MOD_PROTO_TCP,
4216e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4226e91bba0SGirish Moodalbail {1, 10000, 3}, {3} },
4236e91bba0SGirish Moodalbail
4248887b57dSGirish Moodalbail { "_ignore_path_mtu", MOD_PROTO_TCP,
4256e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
4266e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} },
4276e91bba0SGirish Moodalbail
4286e91bba0SGirish Moodalbail { "smallest_anon_port", MOD_PROTO_TCP,
4297256a34eSDan McDonald tcp_smallest_anon_set, mod_get_uint32,
4306e91bba0SGirish Moodalbail {1024, ULP_MAX_PORT, 32*1024}, {32*1024} },
4316e91bba0SGirish Moodalbail
4326e91bba0SGirish Moodalbail { "largest_anon_port", MOD_PROTO_TCP,
4337256a34eSDan McDonald tcp_largest_anon_set, mod_get_uint32,
4346e91bba0SGirish Moodalbail {1024, ULP_MAX_PORT, ULP_MAX_PORT},
4356e91bba0SGirish Moodalbail {ULP_MAX_PORT} },
4366e91bba0SGirish Moodalbail
437299625c6SSebastien Roy { "send_buf", MOD_PROTO_TCP,
438299625c6SSebastien Roy tcp_set_buf_prop, tcp_get_buf_prop,
439299625c6SSebastien Roy {TCP_XMIT_LOWATER, ULP_MAX_BUF, TCP_XMIT_HIWATER},
4406e91bba0SGirish Moodalbail {TCP_XMIT_HIWATER} },
4416e91bba0SGirish Moodalbail
4426e91bba0SGirish Moodalbail /* tunable - 30 */
4438887b57dSGirish Moodalbail { "_xmit_lowat", MOD_PROTO_TCP,
4446e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
445299625c6SSebastien Roy {TCP_XMIT_LOWATER, ULP_MAX_BUF, TCP_XMIT_LOWATER},
4466e91bba0SGirish Moodalbail {TCP_XMIT_LOWATER} },
4476e91bba0SGirish Moodalbail
448299625c6SSebastien Roy { "recv_buf", MOD_PROTO_TCP,
449299625c6SSebastien Roy tcp_set_buf_prop, tcp_get_buf_prop,
450299625c6SSebastien Roy {TCP_RECV_LOWATER, ULP_MAX_BUF, TCP_RECV_HIWATER},
4516e91bba0SGirish Moodalbail {TCP_RECV_HIWATER} },
4526e91bba0SGirish Moodalbail
4538887b57dSGirish Moodalbail { "_recv_hiwat_minmss", MOD_PROTO_TCP,
4546e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4556e91bba0SGirish Moodalbail {1, 65536, 4}, {4} },
4566e91bba0SGirish Moodalbail
4578887b57dSGirish Moodalbail { "_fin_wait_2_flush_interval", MOD_PROTO_TCP,
4586e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
459707e74bcSKacheong Poon {1*SECONDS, 2*HOURS, 60*SECONDS},
460707e74bcSKacheong Poon {60*SECONDS} },
4616e91bba0SGirish Moodalbail
462299625c6SSebastien Roy { "max_buf", MOD_PROTO_TCP,
4636e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
464299625c6SSebastien Roy {8192, ULP_MAX_BUF, 1024*1024}, {1024*1024} },
4656e91bba0SGirish Moodalbail
4668887b57dSGirish Moodalbail { "_strong_iss", MOD_PROTO_TCP,
4676e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4686400a6beSDan McDonald {0, 2, 2}, {2} },
4696e91bba0SGirish Moodalbail
4708887b57dSGirish Moodalbail { "_rtt_updates", MOD_PROTO_TCP,
4716e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4726e91bba0SGirish Moodalbail {0, 65536, 20}, {20} },
4736e91bba0SGirish Moodalbail
4748887b57dSGirish Moodalbail { "_wscale_always", MOD_PROTO_TCP,
4756e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
4766e91bba0SGirish Moodalbail {B_TRUE}, {B_TRUE} },
4776e91bba0SGirish Moodalbail
4788887b57dSGirish Moodalbail { "_tstamp_always", MOD_PROTO_TCP,
4796e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
4806e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} },
4816e91bba0SGirish Moodalbail
4828887b57dSGirish Moodalbail { "_tstamp_if_wscale", MOD_PROTO_TCP,
4836e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
4846e91bba0SGirish Moodalbail {B_TRUE}, {B_TRUE} },
4856e91bba0SGirish Moodalbail
4866e91bba0SGirish Moodalbail /* tunable - 40 */
4878887b57dSGirish Moodalbail { "_rexmit_interval_extra", MOD_PROTO_TCP,
4886e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4896e91bba0SGirish Moodalbail {0*MS, 2*HOURS, 0*MS}, {0*MS} },
4906e91bba0SGirish Moodalbail
4918887b57dSGirish Moodalbail { "_deferred_acks_max", MOD_PROTO_TCP,
4926e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
4936e91bba0SGirish Moodalbail {0, 16, 2}, {2} },
4946e91bba0SGirish Moodalbail
4958887b57dSGirish Moodalbail { "_slow_start_after_idle", MOD_PROTO_TCP,
4966e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
497e068a72aSTheo Schlossnagle {0, 16384, 0}, {0} },
4986e91bba0SGirish Moodalbail
4998887b57dSGirish Moodalbail { "_slow_start_initial", MOD_PROTO_TCP,
5006e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
501e068a72aSTheo Schlossnagle {0, 16, 0}, {0} },
5026e91bba0SGirish Moodalbail
5036e91bba0SGirish Moodalbail { "sack", MOD_PROTO_TCP,
5046e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5056e91bba0SGirish Moodalbail {0, 2, 2}, {2} },
5066e91bba0SGirish Moodalbail
5078887b57dSGirish Moodalbail { "_ipv6_hoplimit", MOD_PROTO_TCP,
5086e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5096e91bba0SGirish Moodalbail {0, IPV6_MAX_HOPS, IPV6_DEFAULT_HOPS},
5106e91bba0SGirish Moodalbail {IPV6_DEFAULT_HOPS} },
5116e91bba0SGirish Moodalbail
5128887b57dSGirish Moodalbail { "_mss_def_ipv6", MOD_PROTO_TCP,
5136e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5146e91bba0SGirish Moodalbail {1, TCP_MSS_MAX_IPV6, 1220}, {1220} },
5156e91bba0SGirish Moodalbail
5168887b57dSGirish Moodalbail { "_mss_max_ipv6", MOD_PROTO_TCP,
5176e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5186e91bba0SGirish Moodalbail {1, TCP_MSS_MAX_IPV6, TCP_MSS_MAX_IPV6},
5196e91bba0SGirish Moodalbail {TCP_MSS_MAX_IPV6} },
5206e91bba0SGirish Moodalbail
5218887b57dSGirish Moodalbail { "_rev_src_routes", MOD_PROTO_TCP,
5226e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
5236e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} },
5246e91bba0SGirish Moodalbail
5258887b57dSGirish Moodalbail { "_local_dack_interval", MOD_PROTO_TCP,
5266e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5276e91bba0SGirish Moodalbail {10*MS, 500*MS, 50*MS}, {50*MS} },
5286e91bba0SGirish Moodalbail
5296e91bba0SGirish Moodalbail /* tunable - 50 */
5308887b57dSGirish Moodalbail { "_local_dacks_max", MOD_PROTO_TCP,
5316e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5326e91bba0SGirish Moodalbail {0, 16, 8}, {8} },
5336e91bba0SGirish Moodalbail
5346e91bba0SGirish Moodalbail { "ecn", MOD_PROTO_TCP,
5356e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5366e91bba0SGirish Moodalbail {0, 2, 1}, {1} },
5376e91bba0SGirish Moodalbail
5388887b57dSGirish Moodalbail { "_rst_sent_rate_enabled", MOD_PROTO_TCP,
5396e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
5406e91bba0SGirish Moodalbail {B_TRUE}, {B_TRUE} },
5416e91bba0SGirish Moodalbail
5428887b57dSGirish Moodalbail { "_rst_sent_rate", MOD_PROTO_TCP,
5436e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5446e91bba0SGirish Moodalbail {0, UINT32_MAX, 40}, {40} },
5456e91bba0SGirish Moodalbail
5468887b57dSGirish Moodalbail { "_push_timer_interval", MOD_PROTO_TCP,
5476e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5486e91bba0SGirish Moodalbail {0, 100*MS, 50*MS}, {50*MS} },
5496e91bba0SGirish Moodalbail
5508887b57dSGirish Moodalbail { "_use_smss_as_mss_opt", MOD_PROTO_TCP,
5516e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
5526e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} },
5536e91bba0SGirish Moodalbail
5548887b57dSGirish Moodalbail { "_keepalive_abort_interval", MOD_PROTO_TCP,
5556e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5566e91bba0SGirish Moodalbail {0, UINT32_MAX, 8*MINUTES}, {8*MINUTES} },
5576e91bba0SGirish Moodalbail
5586e91bba0SGirish Moodalbail /*
5596e91bba0SGirish Moodalbail * tcp_wroff_xtra is the extra space in front of TCP/IP header for link
5606e91bba0SGirish Moodalbail * layer header. It has to be a multiple of 8.
5616e91bba0SGirish Moodalbail */
5628887b57dSGirish Moodalbail { "_wroff_xtra", MOD_PROTO_TCP,
5636e91bba0SGirish Moodalbail mod_set_aligned, mod_get_uint32,
5646e91bba0SGirish Moodalbail {0, 256, 32}, {32} },
5656e91bba0SGirish Moodalbail
5668887b57dSGirish Moodalbail { "_dev_flow_ctl", MOD_PROTO_TCP,
5676e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean,
5686e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} },
5696e91bba0SGirish Moodalbail
5708887b57dSGirish Moodalbail { "_reass_timeout", MOD_PROTO_TCP,
5716e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32,
5726e91bba0SGirish Moodalbail {0, UINT32_MAX, 100*SECONDS}, {100*SECONDS} },
5736e91bba0SGirish Moodalbail
5746e91bba0SGirish Moodalbail /* tunable - 60 */
5756e91bba0SGirish Moodalbail { "extra_priv_ports", MOD_PROTO_TCP,
5766e91bba0SGirish Moodalbail mod_set_extra_privports, mod_get_extra_privports,
5776e91bba0SGirish Moodalbail {1, ULP_MAX_PORT, 0}, {0} },
5786e91bba0SGirish Moodalbail
5798887b57dSGirish Moodalbail { "_1948_phrase", MOD_PROTO_TCP,
5806e91bba0SGirish Moodalbail tcp_set_1948phrase, NULL, {0}, {0} },
5816e91bba0SGirish Moodalbail
5828887b57dSGirish Moodalbail { "_listener_limit_conf", MOD_PROTO_TCP,
5836e91bba0SGirish Moodalbail NULL, tcp_listener_conf_get, {0}, {0} },
5846e91bba0SGirish Moodalbail
5858887b57dSGirish Moodalbail { "_listener_limit_conf_add", MOD_PROTO_TCP,
5866e91bba0SGirish Moodalbail tcp_listener_conf_add, NULL, {0}, {0} },
5876e91bba0SGirish Moodalbail
5888887b57dSGirish Moodalbail { "_listener_limit_conf_del", MOD_PROTO_TCP,
5896e91bba0SGirish Moodalbail tcp_listener_conf_del, NULL, {0}, {0} },
5906e91bba0SGirish Moodalbail
591c0e6663fSJerry Jelinek { "_iss_incr", MOD_PROTO_TCP,
592c0e6663fSJerry Jelinek mod_set_uint32, mod_get_uint32,
593c0e6663fSJerry Jelinek {1, ISS_INCR, ISS_INCR},
594c0e6663fSJerry Jelinek {ISS_INCR} },
595c0e6663fSJerry Jelinek
59645a4b79dSSebastien Roy { "congestion_control", MOD_PROTO_TCP,
59745a4b79dSSebastien Roy tcp_set_cc_algorithm, tcp_get_cc_algorithm, {0}, {0} },
59845a4b79dSSebastien Roy
59945a4b79dSSebastien Roy /* RFC 3465 - TCP Congestion Control with Appropriate Byte Counting */
60045a4b79dSSebastien Roy { "_abc", MOD_PROTO_TCP,
60145a4b79dSSebastien Roy mod_set_boolean, mod_get_boolean, {B_TRUE}, {B_TRUE} },
60245a4b79dSSebastien Roy
60345a4b79dSSebastien Roy /* "L" value from RFC 3465 */
60445a4b79dSSebastien Roy { "_abc_l_var", MOD_PROTO_TCP,
60545a4b79dSSebastien Roy mod_set_uint32, mod_get_uint32, {1, UINT32_MAX, 2}, {2} },
60645a4b79dSSebastien Roy
6076e91bba0SGirish Moodalbail { "?", MOD_PROTO_TCP, NULL, mod_get_allprop, {0}, {0} },
6086e91bba0SGirish Moodalbail
6096e91bba0SGirish Moodalbail { NULL, 0, NULL, NULL, {0}, {0} }
6106e91bba0SGirish Moodalbail };
6116e91bba0SGirish Moodalbail
6126e91bba0SGirish Moodalbail int tcp_propinfo_count = A_CNT(tcp_propinfo_tbl);
613