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