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 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 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 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 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 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 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 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 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*6400a6beSDan 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