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. 237256a34eSDan McDonald * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 24*299625c6SSebastien Roy * Copyright (c) 2013 by Delphix. All rights reserved. 256e91bba0SGirish Moodalbail */ 268887b57dSGirish Moodalbail /* Copyright (c) 1990 Mentat Inc. */ 276e91bba0SGirish Moodalbail 286e91bba0SGirish Moodalbail #include <inet/ip.h> 296e91bba0SGirish Moodalbail #include <inet/ip6.h> 306e91bba0SGirish Moodalbail #include <inet/udp_impl.h> 316e91bba0SGirish Moodalbail #include <sys/sunddi.h> 326e91bba0SGirish Moodalbail 33*299625c6SSebastien Roy static int 34*299625c6SSebastien Roy udp_set_buf_prop(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo, 35*299625c6SSebastien Roy const char *ifname, const void *pval, uint_t flags) 36*299625c6SSebastien Roy { 37*299625c6SSebastien Roy return (mod_set_buf_prop(stack->netstack_udp->us_propinfo_tbl, stack, 38*299625c6SSebastien Roy cr, pinfo, ifname, pval, flags)); 39*299625c6SSebastien Roy } 40*299625c6SSebastien Roy 41*299625c6SSebastien Roy static int 42*299625c6SSebastien Roy udp_get_buf_prop(netstack_t *stack, mod_prop_info_t *pinfo, const char *ifname, 43*299625c6SSebastien Roy void *val, uint_t psize, uint_t flags) 44*299625c6SSebastien Roy { 45*299625c6SSebastien Roy return (mod_get_buf_prop(stack->netstack_udp->us_propinfo_tbl, stack, 46*299625c6SSebastien Roy pinfo, ifname, val, psize, flags)); 47*299625c6SSebastien Roy } 48*299625c6SSebastien Roy 496e91bba0SGirish Moodalbail /* 507256a34eSDan McDonald * Special checkers for smallest/largest anonymous port so they don't 517256a34eSDan McDonald * ever happen to be (largest < smallest). 527256a34eSDan McDonald */ 537256a34eSDan McDonald /* ARGSUSED */ 547256a34eSDan McDonald static int 55*299625c6SSebastien Roy udp_smallest_anon_set(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo, 567256a34eSDan McDonald const char *ifname, const void *pval, uint_t flags) 577256a34eSDan McDonald { 587256a34eSDan McDonald unsigned long new_value; 59*299625c6SSebastien Roy udp_stack_t *us = stack->netstack_udp; 607256a34eSDan McDonald int err; 617256a34eSDan McDonald 627256a34eSDan McDonald if ((err = mod_uint32_value(pval, pinfo, flags, &new_value)) != 0) 637256a34eSDan McDonald return (err); 647256a34eSDan McDonald /* mod_uint32_value() + pinfo guarantees we're in UDP port range. */ 657256a34eSDan McDonald if (new_value > us->us_largest_anon_port) 667256a34eSDan McDonald return (ERANGE); 677256a34eSDan McDonald pinfo->prop_cur_uval = (uint32_t)new_value; 687256a34eSDan McDonald return (0); 697256a34eSDan McDonald } 707256a34eSDan McDonald 717256a34eSDan McDonald /* ARGSUSED */ 727256a34eSDan McDonald static int 73*299625c6SSebastien Roy udp_largest_anon_set(netstack_t *stack, cred_t *cr, mod_prop_info_t *pinfo, 747256a34eSDan McDonald const char *ifname, const void *pval, uint_t flags) 757256a34eSDan McDonald { 767256a34eSDan McDonald unsigned long new_value; 77*299625c6SSebastien Roy udp_stack_t *us = stack->netstack_udp; 787256a34eSDan McDonald int err; 797256a34eSDan McDonald 807256a34eSDan McDonald if ((err = mod_uint32_value(pval, pinfo, flags, &new_value)) != 0) 817256a34eSDan McDonald return (err); 827256a34eSDan McDonald /* mod_uint32_value() + pinfo guarantees we're in UDP port range. */ 837256a34eSDan McDonald if (new_value < us->us_smallest_anon_port) 847256a34eSDan McDonald return (ERANGE); 857256a34eSDan McDonald pinfo->prop_cur_uval = (uint32_t)new_value; 867256a34eSDan McDonald return (0); 877256a34eSDan McDonald } 887256a34eSDan McDonald 897256a34eSDan McDonald /* 906e91bba0SGirish Moodalbail * All of these are alterable, within the min/max values given, at run time. 916e91bba0SGirish Moodalbail * 928887b57dSGirish Moodalbail * Note: All those tunables which do not start with "_" are Committed and 938887b57dSGirish Moodalbail * therefore are public. See PSARC 2010/080. 946e91bba0SGirish Moodalbail */ 956e91bba0SGirish Moodalbail mod_prop_info_t udp_propinfo_tbl[] = { 966e91bba0SGirish Moodalbail /* tunable - 0 */ 978887b57dSGirish Moodalbail { "_wroff_extra", MOD_PROTO_UDP, 986e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32, 996e91bba0SGirish Moodalbail {0, 256, 32}, {32} }, 1006e91bba0SGirish Moodalbail 1018887b57dSGirish Moodalbail { "_ipv4_ttl", MOD_PROTO_UDP, 1026e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32, 1036e91bba0SGirish Moodalbail {1, 255, 255}, {255} }, 1046e91bba0SGirish Moodalbail 1058887b57dSGirish Moodalbail { "_ipv6_hoplimit", MOD_PROTO_UDP, 1066e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32, 1076e91bba0SGirish Moodalbail {0, IPV6_MAX_HOPS, IPV6_DEFAULT_HOPS}, {IPV6_DEFAULT_HOPS} }, 1086e91bba0SGirish Moodalbail 1096e91bba0SGirish Moodalbail { "smallest_nonpriv_port", MOD_PROTO_UDP, 1106e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32, 1116e91bba0SGirish Moodalbail {1024, (32 * 1024), 1024}, {1024} }, 1126e91bba0SGirish Moodalbail 1138887b57dSGirish Moodalbail { "_do_checksum", MOD_PROTO_UDP, 1146e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean, 1156e91bba0SGirish Moodalbail {B_TRUE}, {B_TRUE} }, 1166e91bba0SGirish Moodalbail 1176e91bba0SGirish Moodalbail { "smallest_anon_port", MOD_PROTO_UDP, 1187256a34eSDan McDonald udp_smallest_anon_set, mod_get_uint32, 1196e91bba0SGirish Moodalbail {1024, ULP_MAX_PORT, (32 * 1024)}, {(32 * 1024)} }, 1206e91bba0SGirish Moodalbail 1216e91bba0SGirish Moodalbail { "largest_anon_port", MOD_PROTO_UDP, 1227256a34eSDan McDonald udp_largest_anon_set, mod_get_uint32, 1236e91bba0SGirish Moodalbail {1024, ULP_MAX_PORT, ULP_MAX_PORT}, {ULP_MAX_PORT} }, 1246e91bba0SGirish Moodalbail 125*299625c6SSebastien Roy { "send_buf", MOD_PROTO_UDP, 126*299625c6SSebastien Roy udp_set_buf_prop, udp_get_buf_prop, 127*299625c6SSebastien Roy {UDP_XMIT_LOWATER, ULP_MAX_BUF, UDP_XMIT_HIWATER}, 1286e91bba0SGirish Moodalbail {UDP_XMIT_HIWATER} }, 1296e91bba0SGirish Moodalbail 1308887b57dSGirish Moodalbail { "_xmit_lowat", MOD_PROTO_UDP, 1316e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32, 132*299625c6SSebastien Roy {0, ULP_MAX_BUF, UDP_XMIT_LOWATER}, 1336e91bba0SGirish Moodalbail {UDP_XMIT_LOWATER} }, 1346e91bba0SGirish Moodalbail 135*299625c6SSebastien Roy { "recv_buf", MOD_PROTO_UDP, 136*299625c6SSebastien Roy udp_set_buf_prop, udp_get_buf_prop, 137*299625c6SSebastien Roy {UDP_RECV_LOWATER, ULP_MAX_BUF, UDP_RECV_HIWATER}, 1386e91bba0SGirish Moodalbail {UDP_RECV_HIWATER} }, 1396e91bba0SGirish Moodalbail 1406e91bba0SGirish Moodalbail /* tunable - 10 */ 141*299625c6SSebastien Roy { "max_buf", MOD_PROTO_UDP, 1426e91bba0SGirish Moodalbail mod_set_uint32, mod_get_uint32, 143*299625c6SSebastien Roy {65536, ULP_MAX_BUF, 2*1024*1024}, {2*1024*1024} }, 1446e91bba0SGirish Moodalbail 1458887b57dSGirish Moodalbail { "_pmtu_discovery", MOD_PROTO_UDP, 1466e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean, 1476e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} }, 1486e91bba0SGirish Moodalbail 1498887b57dSGirish Moodalbail { "_sendto_ignerr", MOD_PROTO_UDP, 1506e91bba0SGirish Moodalbail mod_set_boolean, mod_get_boolean, 1516e91bba0SGirish Moodalbail {B_FALSE}, {B_FALSE} }, 1526e91bba0SGirish Moodalbail 1536e91bba0SGirish Moodalbail { "extra_priv_ports", MOD_PROTO_UDP, 1546e91bba0SGirish Moodalbail mod_set_extra_privports, mod_get_extra_privports, 1556e91bba0SGirish Moodalbail {1, ULP_MAX_PORT, 0}, {0} }, 1566e91bba0SGirish Moodalbail 1576e91bba0SGirish Moodalbail { "?", MOD_PROTO_UDP, NULL, mod_get_allprop, {0}, {0} }, 1586e91bba0SGirish Moodalbail 1596e91bba0SGirish Moodalbail { NULL, 0, NULL, NULL, {0}, {0} } 1606e91bba0SGirish Moodalbail }; 1616e91bba0SGirish Moodalbail 1626e91bba0SGirish Moodalbail int udp_propinfo_count = A_CNT(udp_propinfo_tbl); 163