1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved. 23 * Copyright (c) 1990 Mentat Inc. 24 * Copyright (c) 2013 by Delphix. All rights reserved. 25 */ 26 27 #ifndef _INET_TUNABLES_H 28 #define _INET_TUNABLES_H 29 30 #include <sys/types.h> 31 #include <net/if.h> 32 #ifdef _KERNEL 33 #include <sys/netstack.h> 34 #endif 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #define MAXPROPNAMELEN 64 41 42 /* 43 * The `mod_ioc_prop_s' datastructure is used as an IOCTL argument for 44 * SIOCSETPROP and SIOCGETPROP ioctls. This datastructure identifies the 45 * protocol (`mpr_proto') property (`mpr_name'), which needs to be modified 46 * or retrieved (`mpr_valsize' and `mpr_val'). If the property applies to an 47 * interface then `mpr_ifname' contains the name of the interface. 48 */ 49 typedef struct mod_ioc_prop_s { 50 uint_t mpr_version; 51 uint_t mpr_flags; /* see below */ 52 /* name of the interface (ill) for which property will be applied */ 53 char mpr_ifname[LIFNAMSIZ]; 54 uint_t mpr_proto; /* see below */ 55 char mpr_name[MAXPROPNAMELEN]; /* property name */ 56 uint_t mpr_valsize; /* size of mpr_val */ 57 char mpr_val[1]; 58 } mod_ioc_prop_t; 59 60 #define MOD_PROP_VERSION 1 61 62 /* permission flags for properties */ 63 #define MOD_PROP_PERM_READ 0x1 64 #define MOD_PROP_PERM_WRITE 0x2 65 #define MOD_PROP_PERM_RW (MOD_PROP_PERM_READ|MOD_PROP_PERM_WRITE) 66 67 /* mpr_flags values */ 68 #define MOD_PROP_ACTIVE 0x01 /* current value of the property */ 69 #define MOD_PROP_DEFAULT 0x02 /* default value of the property */ 70 #define MOD_PROP_POSSIBLE 0x04 /* possible values for the property */ 71 #define MOD_PROP_PERM 0x08 /* read/write permission for property */ 72 #define MOD_PROP_APPEND 0x10 /* append to multi-valued property */ 73 #define MOD_PROP_REMOVE 0x20 /* remove from multi-valued property */ 74 75 /* mpr_proto values */ 76 #define MOD_PROTO_NONE 0x00 77 #define MOD_PROTO_IPV4 0x01 /* property is applicable to IPV4 */ 78 #define MOD_PROTO_IPV6 0x02 /* property is applicable to IPV6 */ 79 #define MOD_PROTO_RAWIP 0x04 /* property is applicable to ICMP */ 80 #define MOD_PROTO_TCP 0x08 /* property is applicable to TCP */ 81 #define MOD_PROTO_UDP 0x10 /* property is applicable to UDP */ 82 #define MOD_PROTO_SCTP 0x20 /* property is applicable to SCTP */ 83 84 /* property is applicable to both IPV[4|6] */ 85 #define MOD_PROTO_IP (MOD_PROTO_IPV4|MOD_PROTO_IPV6) 86 87 #ifdef _KERNEL 88 89 typedef struct mod_prop_info_s mod_prop_info_t; 90 91 /* set/get property callback functions */ 92 typedef int mod_prop_setf_t(netstack_t *, cred_t *, mod_prop_info_t *, 93 const char *, const void *, uint_t); 94 typedef int mod_prop_getf_t(netstack_t *, mod_prop_info_t *, const char *, 95 void *, uint_t, uint_t); 96 97 typedef struct mod_propval_uint32_s { 98 uint32_t mod_propval_umin; 99 uint32_t mod_propval_umax; 100 uint32_t mod_propval_ucur; 101 } mod_propval_uint32_t; 102 103 /* 104 * protocol property information 105 */ 106 struct mod_prop_info_s { 107 char *mpi_name; /* property name */ 108 uint_t mpi_proto; /* property protocol */ 109 mod_prop_setf_t *mpi_setf; /* sets the property value */ 110 mod_prop_getf_t *mpi_getf; /* gets the property value */ 111 /* 112 * Holds the current value of the property. Whenever applicable 113 * holds the min/max value too. 114 */ 115 union { 116 mod_propval_uint32_t mpi_uval; 117 boolean_t mpi_bval; 118 uint64_t _pad[2]; 119 } u; 120 /* 121 * Holds the default value of the property, that is value of 122 * the property at boot time. 123 */ 124 union { 125 uint32_t mpi_def_uval; 126 boolean_t mpi_def_bval; 127 } u_def; 128 }; 129 130 /* shortcuts to access current/default values */ 131 #define prop_min_uval u.mpi_uval.mod_propval_umin 132 #define prop_max_uval u.mpi_uval.mod_propval_umax 133 #define prop_cur_uval u.mpi_uval.mod_propval_ucur 134 #define prop_cur_bval u.mpi_bval 135 #define prop_def_uval u_def.mpi_def_uval 136 #define prop_def_bval u_def.mpi_def_bval 137 138 #define MS 1L 139 #define SECONDS (1000 * MS) 140 #define MINUTES (60 * SECONDS) 141 #define HOURS (60 * MINUTES) 142 #define DAYS (24 * HOURS) 143 144 #define MB (1024 * 1024) 145 146 /* Largest TCP/UDP/SCTP port number */ 147 #define ULP_MAX_PORT (64 * 1024 - 1) 148 149 /* extra privilege ports for upper layer protocols, tcp, sctp and udp */ 150 #define ULP_DEF_EPRIV_PORT1 2049 151 #define ULP_DEF_EPRIV_PORT2 4045 152 153 #define ULP_MAX_BUF (1<<30) /* Largest possible send/receive buffer */ 154 155 /* generic function to set/get global module properties */ 156 extern mod_prop_setf_t mod_set_boolean, mod_set_uint32, 157 mod_set_aligned, mod_set_extra_privports; 158 159 extern mod_prop_getf_t mod_get_boolean, mod_get_uint32, 160 mod_get_allprop, mod_get_extra_privports; 161 162 extern int mod_uint32_value(const void *, mod_prop_info_t *, 163 uint_t, unsigned long *); 164 extern mod_prop_info_t *mod_prop_lookup(mod_prop_info_t[], const char *, 165 uint_t); 166 extern int mod_set_buf_prop(mod_prop_info_t[], netstack_t *, 167 cred_t *cr, mod_prop_info_t *, const char *, const void *, uint_t); 168 extern int mod_get_buf_prop(mod_prop_info_t[], netstack_t *, 169 mod_prop_info_t *, const char *, void *, uint_t, uint_t); 170 171 #endif /* _KERNEL */ 172 173 /* 174 * End-system model definitions that include the weak/strong end-system 175 * definitions in RFC 1122, Section 3.3.4.5. IP_WEAK_ES and IP_STRONG_ES 176 * conform to the corresponding RFC 1122 definitions. The IP_SRC_PRI_ES 177 * hostmodel is similar to IP_WEAK_ES with one additional enhancement: for 178 * a packet with source S2, destination D2, the route selection algorithm 179 * will first attempt to find a route for the destination that goes out 180 * through an interface where S2 is configured and marked UP. If such 181 * a route cannot be found, then the best-matching route for D2 will be 182 * selected, ignoring any mismatches between S2 and the interface addresses 183 * on the outgoing interface implied by the route. 184 */ 185 typedef enum { 186 IP_WEAK_ES = 0, 187 IP_SRC_PRI_ES, 188 IP_STRONG_ES, 189 IP_MAXVAL_ES 190 } ip_hostmodel_t; 191 192 #ifdef __cplusplus 193 } 194 #endif 195 196 #endif /* _INET_TUNABLES_H */