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 #define MOD_PROTO_DCCP          0x40    /* property is applicable to DCCP */
  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(void *, cred_t *, mod_prop_info_t *,
  93                     const char *, const void *, uint_t);
  94 typedef int     mod_prop_getf_t(void *, mod_prop_info_t *, const char *,
  95                     void *val, 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 /* generic function to set/get global module properties */
 154 extern mod_prop_setf_t  mod_set_boolean, mod_set_uint32,
 155                         mod_set_aligned, mod_set_extra_privports;
 156 
 157 extern mod_prop_getf_t  mod_get_boolean, mod_get_uint32,
 158                         mod_get_allprop, mod_get_extra_privports;
 159 
 160 extern int mod_uint32_value(const void *, mod_prop_info_t *, uint_t,
 161     unsigned long *);
 162 
 163 #endif  /* _KERNEL */
 164 
 165 /*
 166  * End-system model definitions that include the weak/strong end-system
 167  * definitions in RFC 1122, Section 3.3.4.5. IP_WEAK_ES and IP_STRONG_ES
 168  * conform to the corresponding  RFC 1122 definitions. The IP_SRC_PRI_ES
 169  * hostmodel is similar to IP_WEAK_ES with one additional enhancement: for
 170  * a packet with source S2, destination D2, the route selection algorithm
 171  * will first attempt to find a route for the destination that goes out
 172  * through an interface where S2 is configured and marked UP.  If such
 173  * a route cannot be found, then the best-matching route for D2 will be
 174  * selected, ignoring any mismatches between S2 and the interface addresses
 175  * on the outgoing interface implied by the route.
 176  */
 177 typedef enum {
 178         IP_WEAK_ES = 0,
 179         IP_SRC_PRI_ES,
 180         IP_STRONG_ES,
 181         IP_MAXVAL_ES
 182 } ip_hostmodel_t;
 183 
 184 #ifdef  __cplusplus
 185 }
 186 #endif
 187 
 188 #endif  /* _INET_TUNABLES_H */