xref: /illumos-gate/usr/src/uts/common/inet/tunables.h (revision 2983dda76a6d296fdb560c88114fe41caad1b84f)
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 */
188