Print this page
13175 Add support for IP_RECVTOS
13182 CMSG_ macros should have man pages
Change-ID: I784aa36cfd3c17e3cccbf1fd329fa7e69b663ef9
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/common/inet/udp/udp_opt_data.c
+++ new/usr/src/uts/common/inet/udp/udp_opt_data.c
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
↓ open down ↓ |
13 lines elided |
↑ open up ↑ |
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 23 * Use is subject to license terms.
24 + * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
24 25 */
25 26
26 27 #include <sys/types.h>
27 28 #include <sys/stream.h>
28 29 #define _SUN_TPI_VERSION 2
29 30 #include <sys/tihdr.h>
30 31 #include <sys/socket.h>
31 32 #include <sys/xti_xtiopt.h>
32 33 #include <sys/xti_inet.h>
33 34
34 35 #include <inet/common.h>
35 36 #include <netinet/ip6.h>
36 37 #include <inet/ip.h>
37 38 #include <inet/udp_impl.h>
38 39 /*
39 40 * MK_XXX Following 2 includes temporary to import ip6_rthdr_t
40 41 * definition. May not be needed if we fix ip6_dg_snd_attrs_t
41 42 * to do all extension headers in identical manner.
42 43 */
43 44 #include <net/if.h>
44 45 #include <inet/ip6.h>
45 46
46 47 #include <netinet/in.h>
47 48 #include <netinet/udp.h>
48 49 #include <inet/optcom.h>
49 50
50 51 /*
51 52 * Table of all known options handled on a UDP protocol stack.
52 53 *
53 54 * Note: This table contains options processed by both UDP and IP levels
54 55 * and is the superset of options that can be performed on a UDP over IP
55 56 * stack.
56 57 */
57 58 opdes_t udp_opt_arr[] = {
58 59
59 60 { SO_DEBUG, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
60 61 { SO_DONTROUTE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
61 62 { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
62 63 },
63 64 { SO_BROADCAST, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
64 65 { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
65 66 { SO_TYPE, SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
66 67 { SO_SNDBUF, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
67 68 { SO_RCVBUF, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
68 69 { SO_SNDTIMEO, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
69 70 sizeof (struct timeval), 0 },
70 71 { SO_RCVTIMEO, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
71 72 sizeof (struct timeval), 0 },
72 73 { SO_DGRAM_ERRIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
73 74 0 },
74 75 { SO_RECVUCRED, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
75 76 },
76 77 { SO_ALLZONES, SOL_SOCKET, OA_R, OA_RW, OP_CONFIG, 0, sizeof (int),
77 78 0 },
78 79 { SO_VRRP, SOL_SOCKET, OA_RW, OA_RW, OP_CONFIG, 0, sizeof (int), 0 },
79 80 { SO_TIMESTAMP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
80 81 },
81 82 { SO_ANON_MLP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
82 83 0 },
83 84 { SO_MAC_EXEMPT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
84 85 0 },
85 86 { SO_MAC_IMPLICIT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
86 87 0 },
87 88 /*
88 89 * The maximum size reported here depends on the maximum value for
89 90 * ucredsize; unfortunately, we can't add ucredsize here so we need
90 91 * to estimate here. Before it was 512 or 384 + NGROUPS_UMAX * sizeof (gid_t);
91 92 * as we're changing NGROUPS_UMAX we now codify this here using NGROUPS_UMAX.
92 93 */
93 94 { SCM_UCRED, SOL_SOCKET, OA_W, OA_W, OP_NP, OP_VARLEN|OP_NODEFAULT,
94 95 384 + NGROUPS_UMAX * sizeof (gid_t), 0 },
95 96 { SO_EXCLBIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
96 97 { SO_DOMAIN, SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
97 98 { SO_PROTOTYPE, SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
98 99
99 100 { IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
100 101 (OP_VARLEN|OP_NODEFAULT),
101 102 IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ },
102 103 { T_IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
103 104 (OP_VARLEN|OP_NODEFAULT),
↓ open down ↓ |
70 lines elided |
↑ open up ↑ |
104 105 IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ },
105 106
106 107 { IP_TOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
107 108 { T_IP_TOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
108 109 { IP_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
109 110 { IP_RECVOPTS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
110 111 { IP_RECVDSTADDR, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
111 112 },
112 113 { IP_RECVIF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
113 114 { IP_RECVSLLA, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
114 -{ IP_RECVTTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
115 - 0 },
115 +{ IP_RECVTTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
116 +{ IP_RECVTOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
116 117 { IP_MULTICAST_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
117 118 sizeof (struct in_addr), 0 /* INADDR_ANY */ },
118 119
119 120 { IP_MULTICAST_LOOP, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
120 121 sizeof (uchar_t), -1 /* not initialized */},
121 122
122 123 { IP_MULTICAST_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
123 124 sizeof (uchar_t), -1 /* not initialized */ },
124 125
125 126 { IP_ADD_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
126 127 sizeof (struct ip_mreq), -1 /* not initialized */ },
127 128
128 129 { IP_DROP_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
129 130 sizeof (struct ip_mreq), -1 /* not initialized */ },
130 131
131 132 { IP_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
132 133 sizeof (struct ip_mreq_source), -1 /* not initialized */ },
133 134
134 135 { IP_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
135 136 sizeof (struct ip_mreq_source), -1 /* not initialized */ },
136 137
137 138 { IP_ADD_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
138 139 OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 },
139 140
140 141 { IP_DROP_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
141 142 OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 },
142 143
143 144 { IP_SEC_OPT, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
144 145 sizeof (ipsec_req_t), -1 /* not initialized */ },
145 146
146 147 { IP_BOUND_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
147 148 sizeof (int), 0 /* no ifindex */ },
148 149
149 150 { IP_DHCPINIT_IF, IPPROTO_IP, OA_R, OA_RW, OP_CONFIG, 0,
150 151 sizeof (int), 0 },
151 152
152 153 { IP_UNSPEC_SRC, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0,
153 154 sizeof (int), 0 },
154 155
155 156 { IP_BROADCAST_TTL, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, sizeof (uchar_t),
156 157 0 /* disabled */ },
157 158
158 159 { IP_PKTINFO, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
159 160 (OP_NODEFAULT|OP_VARLEN),
160 161 sizeof (struct in_pktinfo), -1 /* not initialized */ },
161 162 { IP_NEXTHOP, IPPROTO_IP, OA_R, OA_RW, OP_CONFIG, 0,
162 163 sizeof (in_addr_t), -1 /* not initialized */ },
163 164
164 165 { IP_DONTFRAG, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
165 166
166 167 { MCAST_JOIN_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
167 168 OP_NODEFAULT, sizeof (struct group_req),
168 169 -1 /* not initialized */ },
169 170 { MCAST_LEAVE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
170 171 OP_NODEFAULT, sizeof (struct group_req),
171 172 -1 /* not initialized */ },
172 173 { MCAST_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
173 174 OP_NODEFAULT, sizeof (struct group_source_req),
174 175 -1 /* not initialized */ },
175 176 { MCAST_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
176 177 OP_NODEFAULT, sizeof (struct group_source_req),
177 178 -1 /* not initialized */ },
178 179 { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
179 180 OP_NODEFAULT, sizeof (struct group_source_req),
180 181 -1 /* not initialized */ },
181 182 { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
182 183 OP_NODEFAULT, sizeof (struct group_source_req),
183 184 -1 /* not initialized */ },
184 185
185 186 { IPV6_MULTICAST_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
186 187 sizeof (int), 0 },
187 188
188 189 { IPV6_MULTICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
189 190 OP_DEF_FN, sizeof (int), -1 /* not initialized */ },
190 191
191 192 { IPV6_MULTICAST_LOOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
192 193 OP_DEF_FN, sizeof (int), -1 /* not initialized */},
193 194
194 195 { IPV6_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
195 196 sizeof (struct ipv6_mreq), -1 /* not initialized */ },
196 197
197 198 { IPV6_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
198 199 OP_NODEFAULT,
199 200 sizeof (struct ipv6_mreq), -1 /* not initialized */ },
200 201
201 202 { IPV6_UNICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
202 203 sizeof (int), -1 /* not initialized */ },
203 204
204 205 { IPV6_BOUND_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
205 206 sizeof (int), 0 /* no ifindex */ },
206 207
207 208 { IPV6_UNSPEC_SRC, IPPROTO_IPV6, OA_R, OA_RW, OP_RAW, 0,
208 209 sizeof (int), 0 },
209 210
210 211 { IPV6_PKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
211 212 (OP_NODEFAULT|OP_VARLEN),
212 213 sizeof (struct in6_pktinfo), -1 /* not initialized */ },
213 214 { IPV6_HOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
214 215 OP_NODEFAULT,
215 216 sizeof (int), -1 /* not initialized */ },
216 217 { IPV6_NEXTHOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
217 218 (OP_NODEFAULT|OP_VARLEN),
218 219 sizeof (sin6_t), -1 /* not initialized */ },
219 220 { IPV6_HOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
220 221 (OP_VARLEN|OP_NODEFAULT),
221 222 MAX_EHDR_LEN, -1 /* not initialized */ },
222 223 { IPV6_DSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
223 224 (OP_VARLEN|OP_NODEFAULT),
224 225 MAX_EHDR_LEN, -1 /* not initialized */ },
225 226 { IPV6_RTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
226 227 (OP_VARLEN|OP_NODEFAULT),
227 228 MAX_EHDR_LEN, -1 /* not initialized */ },
228 229 { IPV6_RTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
229 230 (OP_VARLEN|OP_NODEFAULT),
230 231 MAX_EHDR_LEN, -1 /* not initialized */ },
231 232 { IPV6_TCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
232 233 OP_NODEFAULT,
233 234 sizeof (int), -1 /* not initialized */ },
234 235 { IPV6_PATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
235 236 OP_NODEFAULT,
236 237 sizeof (struct ip6_mtuinfo), -1 },
237 238 { IPV6_DONTFRAG, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
238 239 sizeof (int), 0 },
239 240 { IPV6_USE_MIN_MTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
240 241 sizeof (int), 0 },
241 242 { IPV6_V6ONLY, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
242 243 sizeof (int), 0 },
243 244
244 245 { IPV6_RECVPKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
245 246 sizeof (int), 0 },
246 247 { IPV6_RECVHOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
247 248 sizeof (int), 0 },
248 249 { IPV6_RECVHOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
249 250 sizeof (int), 0 },
250 251 { _OLD_IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
251 252 sizeof (int), 0 },
252 253 { IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
253 254 sizeof (int), 0 },
254 255 { IPV6_RECVRTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
255 256 sizeof (int), 0 },
256 257 { IPV6_RECVRTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
257 258 sizeof (int), 0 },
258 259 { IPV6_RECVPATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
259 260 0, sizeof (int), 0 },
260 261 { IPV6_RECVTCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
261 262 sizeof (int), 0 },
262 263
263 264 { IPV6_SEC_OPT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
264 265 sizeof (ipsec_req_t), -1 /* not initialized */ },
265 266 { IPV6_SRC_PREFERENCES, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
266 267 sizeof (uint32_t), IPV6_PREFER_SRC_DEFAULT },
267 268
268 269 { MCAST_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
269 270 OP_NODEFAULT, sizeof (struct group_req),
270 271 -1 /* not initialized */ },
271 272 { MCAST_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
272 273 OP_NODEFAULT, sizeof (struct group_req),
273 274 -1 /* not initialized */ },
274 275 { MCAST_BLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
275 276 OP_NODEFAULT, sizeof (struct group_source_req),
276 277 -1 /* not initialized */ },
277 278 { MCAST_UNBLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
278 279 OP_NODEFAULT, sizeof (struct group_source_req),
279 280 -1 /* not initialized */ },
280 281 { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
281 282 OP_NODEFAULT, sizeof (struct group_source_req),
282 283 -1 /* not initialized */ },
283 284 { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
284 285 OP_NODEFAULT, sizeof (struct group_source_req),
285 286 -1 /* not initialized */ },
286 287
287 288 { UDP_ANONPRIVBIND, IPPROTO_UDP, OA_R, OA_RW, OP_PRIVPORT, 0,
288 289 sizeof (int), 0 },
289 290 { UDP_EXCLBIND, IPPROTO_UDP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
290 291 },
291 292 { UDP_RCVHDR, IPPROTO_UDP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
292 293 },
293 294 { UDP_NAT_T_ENDPOINT, IPPROTO_UDP, OA_RW, OA_RW, OP_PRIVPORT, 0, sizeof (int),
294 295 0 },
295 296 };
296 297
297 298 /*
298 299 * Table of all supported levels
299 300 * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have
300 301 * any supported options so we need this info separately.
301 302 *
302 303 * This is needed only for topmost tpi providers and is used only by
303 304 * XTI interfaces.
304 305 */
305 306 optlevel_t udp_valid_levels_arr[] = {
306 307 XTI_GENERIC,
307 308 SOL_SOCKET,
308 309 IPPROTO_UDP,
309 310 IPPROTO_IP,
310 311 IPPROTO_IPV6
311 312 };
312 313
313 314 #define UDP_VALID_LEVELS_CNT A_CNT(udp_valid_levels_arr)
314 315 #define UDP_OPT_ARR_CNT A_CNT(udp_opt_arr)
315 316
316 317 uint_t udp_max_optsize; /* initialized when UDP driver is loaded */
317 318
318 319 /*
319 320 * Initialize option database object for UDP
320 321 *
321 322 * This object represents database of options to search passed to
322 323 * {sock,tpi}optcom_req() interface routine to take care of option
323 324 * management and associated methods.
324 325 */
325 326
326 327 optdb_obj_t udp_opt_obj = {
327 328 udp_opt_default, /* UDP default value function pointer */
328 329 udp_tpi_opt_get, /* UDP get function pointer */
329 330 udp_tpi_opt_set, /* UDP set function pointer */
330 331 UDP_OPT_ARR_CNT, /* UDP option database count of entries */
331 332 udp_opt_arr, /* UDP option database */
332 333 UDP_VALID_LEVELS_CNT, /* UDP valid level count of entries */
333 334 udp_valid_levels_arr /* UDP valid level array */
334 335 };
↓ open down ↓ |
209 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX