xref: /onnv-gate/usr/src/uts/common/inet/ip/icmp_opt_data.c (revision 11042:2d6e217af1b4)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
51663Spriyanka  * Common Development and Distribution License (the "License").
61663Spriyanka  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
228485SPeter.Memishian@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #include <sys/types.h>
270Sstevel@tonic-gate #include <sys/stream.h>
280Sstevel@tonic-gate #define	_SUN_TPI_VERSION 2
290Sstevel@tonic-gate #include <sys/tihdr.h>
300Sstevel@tonic-gate #include <sys/socket.h>
310Sstevel@tonic-gate #include <sys/xti_xtiopt.h>
320Sstevel@tonic-gate #include <sys/xti_inet.h>
330Sstevel@tonic-gate 
340Sstevel@tonic-gate #include <netinet/in.h>
350Sstevel@tonic-gate #include <netinet/icmp6.h>
360Sstevel@tonic-gate #include <inet/common.h>
370Sstevel@tonic-gate #include <netinet/ip6.h>
380Sstevel@tonic-gate #include <inet/ip.h>
390Sstevel@tonic-gate 
400Sstevel@tonic-gate #include <netinet/tcp.h>
410Sstevel@tonic-gate #include <netinet/ip_mroute.h>
420Sstevel@tonic-gate #include <inet/optcom.h>
43*11042SErik.Nordmark@Sun.COM #include <inet/rawip_impl.h>
440Sstevel@tonic-gate 
450Sstevel@tonic-gate /*
460Sstevel@tonic-gate  * Table of all known options handled on a ICMP protocol stack.
470Sstevel@tonic-gate  *
480Sstevel@tonic-gate  * Note: This table contains options processed by both ICMP and IP levels
490Sstevel@tonic-gate  *       and is the superset of options that can be performed on a ICMP over IP
500Sstevel@tonic-gate  *       stack.
510Sstevel@tonic-gate  */
520Sstevel@tonic-gate opdes_t	icmp_opt_arr[] = {
530Sstevel@tonic-gate 
54*11042SErik.Nordmark@Sun.COM { SO_DEBUG,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
55*11042SErik.Nordmark@Sun.COM { SO_DONTROUTE,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
56*11042SErik.Nordmark@Sun.COM { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
570Sstevel@tonic-gate 	},
58*11042SErik.Nordmark@Sun.COM { SO_BROADCAST,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
59*11042SErik.Nordmark@Sun.COM { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
600Sstevel@tonic-gate 
610Sstevel@tonic-gate #ifdef	SO_PROTOTYPE
620Sstevel@tonic-gate 	/*
630Sstevel@tonic-gate 	 * icmp will only allow IPPROTO_ICMP for non-privileged streams
640Sstevel@tonic-gate 	 * that check is made on an adhoc basis.
650Sstevel@tonic-gate 	 */
66*11042SErik.Nordmark@Sun.COM { SO_PROTOTYPE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
670Sstevel@tonic-gate #endif
680Sstevel@tonic-gate 
69*11042SErik.Nordmark@Sun.COM { SO_TYPE,	SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
70*11042SErik.Nordmark@Sun.COM { SO_SNDBUF,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
71*11042SErik.Nordmark@Sun.COM { SO_RCVBUF,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
72*11042SErik.Nordmark@Sun.COM { SO_SNDTIMEO,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
738612SAnders.Persson@Sun.COM 	sizeof (struct timeval), 0 },
74*11042SErik.Nordmark@Sun.COM { SO_RCVTIMEO,	SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
758612SAnders.Persson@Sun.COM 	sizeof (struct timeval), 0 },
76*11042SErik.Nordmark@Sun.COM { SO_DGRAM_ERRIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
770Sstevel@tonic-gate 	0 },
78*11042SErik.Nordmark@Sun.COM { SO_TIMESTAMP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
791673Sgt145670 	},
80*11042SErik.Nordmark@Sun.COM { SO_MAC_EXEMPT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
812263Ssommerfe 	0 },
82*11042SErik.Nordmark@Sun.COM { SO_MAC_IMPLICIT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
8310934Ssommerfeld@sun.com 	0 },
842263Ssommerfe 
85*11042SErik.Nordmark@Sun.COM { SO_ALLZONES, SOL_SOCKET, OA_R, OA_RW, OP_CONFIG, 0, sizeof (int),
862263Ssommerfe 	0 },
87*11042SErik.Nordmark@Sun.COM { SO_DOMAIN,	SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
880Sstevel@tonic-gate 
890Sstevel@tonic-gate { IP_OPTIONS,	IPPROTO_IP, OA_RW, OA_RW, OP_NP,
90*11042SErik.Nordmark@Sun.COM 	(OP_VARLEN|OP_NODEFAULT),
918348SEric.Yu@Sun.COM 	IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ },
920Sstevel@tonic-gate { T_IP_OPTIONS,	IPPROTO_IP, OA_RW, OA_RW, OP_NP,
93*11042SErik.Nordmark@Sun.COM 	(OP_VARLEN|OP_NODEFAULT),
948348SEric.Yu@Sun.COM 	IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ },
950Sstevel@tonic-gate 
96*11042SErik.Nordmark@Sun.COM { IP_HDRINCL,	IPPROTO_IP, OA_R,  OA_RW, OP_RAW, 0,
970Sstevel@tonic-gate 	sizeof (int), 0 },
98*11042SErik.Nordmark@Sun.COM { IP_TOS,	IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
99*11042SErik.Nordmark@Sun.COM { T_IP_TOS,	IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
100*11042SErik.Nordmark@Sun.COM { IP_TTL,	IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
1010Sstevel@tonic-gate 
102*11042SErik.Nordmark@Sun.COM { IP_MULTICAST_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
1030Sstevel@tonic-gate 	sizeof (struct in_addr), 0 /* INADDR_ANY */ },
1040Sstevel@tonic-gate 
105*11042SErik.Nordmark@Sun.COM { IP_MULTICAST_LOOP, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
1060Sstevel@tonic-gate 	sizeof (uchar_t), -1 /* not initialized */},
1070Sstevel@tonic-gate 
108*11042SErik.Nordmark@Sun.COM { IP_MULTICAST_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
1090Sstevel@tonic-gate 	sizeof (uchar_t), -1 /* not initialized */ },
1100Sstevel@tonic-gate 
111*11042SErik.Nordmark@Sun.COM { IP_ADD_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
1120Sstevel@tonic-gate 	sizeof (struct ip_mreq), -1 /* not initialized */ },
1130Sstevel@tonic-gate 
114*11042SErik.Nordmark@Sun.COM { IP_DROP_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
1150Sstevel@tonic-gate 	sizeof (struct ip_mreq), 0 },
1160Sstevel@tonic-gate 
117*11042SErik.Nordmark@Sun.COM { IP_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
1180Sstevel@tonic-gate 	sizeof (struct ip_mreq_source), -1 },
1190Sstevel@tonic-gate 
120*11042SErik.Nordmark@Sun.COM { IP_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
1210Sstevel@tonic-gate 	sizeof (struct ip_mreq_source), -1 },
1220Sstevel@tonic-gate 
1230Sstevel@tonic-gate { IP_ADD_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
124*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 },
1250Sstevel@tonic-gate 
1260Sstevel@tonic-gate { IP_DROP_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
127*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 },
1280Sstevel@tonic-gate 
129*11042SErik.Nordmark@Sun.COM { IP_SEC_OPT, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
1300Sstevel@tonic-gate 	sizeof (ipsec_req_t), -1 /* not initialized */ },
1310Sstevel@tonic-gate 
132*11042SErik.Nordmark@Sun.COM { IP_BOUND_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
1330Sstevel@tonic-gate 	sizeof (int),	0 /* no ifindex */ },
1340Sstevel@tonic-gate 
135*11042SErik.Nordmark@Sun.COM { IP_UNSPEC_SRC, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0,
1360Sstevel@tonic-gate 	sizeof (int), 0 },
1370Sstevel@tonic-gate 
1385455Smeem { IP_BROADCAST_TTL, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, sizeof (uchar_t),
1395455Smeem 	0 /* disabled */ },
1405455Smeem 
141*11042SErik.Nordmark@Sun.COM { IP_RECVIF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
1420Sstevel@tonic-gate 
1433318Srshoaib { IP_PKTINFO, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
144*11042SErik.Nordmark@Sun.COM 	(OP_NODEFAULT|OP_VARLEN),
1453318Srshoaib 	sizeof (struct in_pktinfo), -1 /* not initialized */ },
1463318Srshoaib 
147*11042SErik.Nordmark@Sun.COM { IP_DONTFRAG, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
148*11042SErik.Nordmark@Sun.COM 
149*11042SErik.Nordmark@Sun.COM { IP_NEXTHOP, IPPROTO_IP, OA_R, OA_RW, OP_CONFIG, 0,
1503318Srshoaib 	sizeof (in_addr_t), -1 /* not initialized */ },
1511663Spriyanka 
1520Sstevel@tonic-gate { MRT_INIT, IPPROTO_IP, 0, OA_X, OP_CONFIG,
153*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (int),
1540Sstevel@tonic-gate 	-1 /* not initialized */ },
1550Sstevel@tonic-gate 
1560Sstevel@tonic-gate { MRT_DONE, IPPROTO_IP, 0, OA_X, OP_CONFIG,
157*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, 0, -1 /* not initialized */ },
1580Sstevel@tonic-gate 
159*11042SErik.Nordmark@Sun.COM { MRT_ADD_VIF, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
1600Sstevel@tonic-gate 	sizeof (struct vifctl), -1 /* not initialized */ },
1610Sstevel@tonic-gate 
162*11042SErik.Nordmark@Sun.COM { MRT_DEL_VIF, 	IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
1630Sstevel@tonic-gate 	sizeof (vifi_t), -1 /* not initialized */ },
1640Sstevel@tonic-gate 
165*11042SErik.Nordmark@Sun.COM { MRT_ADD_MFC, 	IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
1660Sstevel@tonic-gate 	sizeof (struct mfcctl), -1 /* not initialized */ },
1670Sstevel@tonic-gate 
168*11042SErik.Nordmark@Sun.COM { MRT_DEL_MFC, 	IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
1690Sstevel@tonic-gate 	sizeof (struct mfcctl), -1 /* not initialized */ },
1700Sstevel@tonic-gate 
171*11042SErik.Nordmark@Sun.COM { MRT_VERSION, 	IPPROTO_IP, OA_R, OA_R, OP_NP, OP_NODEFAULT,
1720Sstevel@tonic-gate 	sizeof (int), -1 /* not initialized */ },
1730Sstevel@tonic-gate 
1740Sstevel@tonic-gate { MRT_ASSERT, 	IPPROTO_IP, 0, OA_RW, OP_CONFIG,
175*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT,
1760Sstevel@tonic-gate 	sizeof (int), -1 /* not initialized */ },
1770Sstevel@tonic-gate 
1780Sstevel@tonic-gate { MCAST_JOIN_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
179*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_req),
1800Sstevel@tonic-gate 	-1 /* not initialized */ },
1810Sstevel@tonic-gate { MCAST_LEAVE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
182*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_req),
1830Sstevel@tonic-gate 	-1 /* not initialized */ },
1840Sstevel@tonic-gate { MCAST_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
185*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
1860Sstevel@tonic-gate 	-1 /* not initialized */ },
1870Sstevel@tonic-gate { MCAST_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
188*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
1890Sstevel@tonic-gate 	-1 /* not initialized */ },
1900Sstevel@tonic-gate { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
191*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
1920Sstevel@tonic-gate 	-1 /* not initialized */ },
1930Sstevel@tonic-gate { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
194*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
1950Sstevel@tonic-gate 	-1 /* not initialized */ },
1960Sstevel@tonic-gate 
197*11042SErik.Nordmark@Sun.COM { IPV6_MULTICAST_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
1980Sstevel@tonic-gate 	sizeof (int), 0 },
1990Sstevel@tonic-gate 
2000Sstevel@tonic-gate { IPV6_MULTICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
201*11042SErik.Nordmark@Sun.COM 	OP_DEF_FN, sizeof (int), -1 /* not initialized */ },
2020Sstevel@tonic-gate 
2030Sstevel@tonic-gate { IPV6_MULTICAST_LOOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
204*11042SErik.Nordmark@Sun.COM 	OP_DEF_FN, sizeof (int), -1 /* not initialized */},
2050Sstevel@tonic-gate 
206*11042SErik.Nordmark@Sun.COM { IPV6_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
2070Sstevel@tonic-gate 	sizeof (struct ipv6_mreq), -1 /* not initialized */ },
2080Sstevel@tonic-gate 
209*11042SErik.Nordmark@Sun.COM { IPV6_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
2100Sstevel@tonic-gate 	sizeof (struct ipv6_mreq), -1 /* not initialized */ },
2110Sstevel@tonic-gate 
212*11042SErik.Nordmark@Sun.COM { IPV6_UNICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
2130Sstevel@tonic-gate 	sizeof (int), -1 /* not initialized */ },
2140Sstevel@tonic-gate 
215*11042SErik.Nordmark@Sun.COM { IPV6_BOUND_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2160Sstevel@tonic-gate 	sizeof (int),	0 /* no ifindex */ },
2170Sstevel@tonic-gate 
218*11042SErik.Nordmark@Sun.COM { IPV6_UNSPEC_SRC, IPPROTO_IPV6, OA_R, OA_RW, OP_RAW, 0,
2190Sstevel@tonic-gate 	sizeof (int), 0 },
2200Sstevel@tonic-gate 
221*11042SErik.Nordmark@Sun.COM { IPV6_CHECKSUM, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
2220Sstevel@tonic-gate 	-1 },
2230Sstevel@tonic-gate 
2240Sstevel@tonic-gate { ICMP6_FILTER, IPPROTO_ICMPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN|OP_VARLEN,
2250Sstevel@tonic-gate 	sizeof (icmp6_filter_t), 0 },
2260Sstevel@tonic-gate { IPV6_PKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
227*11042SErik.Nordmark@Sun.COM 	(OP_NODEFAULT|OP_VARLEN),
2280Sstevel@tonic-gate 	sizeof (struct in6_pktinfo), -1 /* not initialized */ },
2290Sstevel@tonic-gate { IPV6_HOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
230*11042SErik.Nordmark@Sun.COM 	(OP_NODEFAULT|OP_VARLEN),
2310Sstevel@tonic-gate 	sizeof (int), -1 /* not initialized */ },
2320Sstevel@tonic-gate { IPV6_NEXTHOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
233*11042SErik.Nordmark@Sun.COM 	(OP_NODEFAULT|OP_VARLEN),
2340Sstevel@tonic-gate 	sizeof (sin6_t), -1 /* not initialized */ },
2350Sstevel@tonic-gate { IPV6_HOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
236*11042SErik.Nordmark@Sun.COM 	(OP_VARLEN|OP_NODEFAULT),
2370Sstevel@tonic-gate 	MAX_EHDR_LEN, -1 /* not initialized */ },
2380Sstevel@tonic-gate { IPV6_DSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
239*11042SErik.Nordmark@Sun.COM 	(OP_VARLEN|OP_NODEFAULT),
2400Sstevel@tonic-gate 	MAX_EHDR_LEN, -1 /* not initialized */ },
2410Sstevel@tonic-gate { IPV6_RTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
242*11042SErik.Nordmark@Sun.COM 	(OP_VARLEN|OP_NODEFAULT),
2430Sstevel@tonic-gate 	MAX_EHDR_LEN, -1 /* not initialized */ },
2440Sstevel@tonic-gate { IPV6_RTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
245*11042SErik.Nordmark@Sun.COM 	(OP_VARLEN|OP_NODEFAULT),
2460Sstevel@tonic-gate 	MAX_EHDR_LEN, -1 /* not initialized */ },
2470Sstevel@tonic-gate { IPV6_TCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
248*11042SErik.Nordmark@Sun.COM 	(OP_NODEFAULT|OP_VARLEN),
2490Sstevel@tonic-gate 	sizeof (int), -1 /* not initialized */ },
250*11042SErik.Nordmark@Sun.COM { IPV6_PATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2510Sstevel@tonic-gate 	sizeof (struct ip6_mtuinfo), -1 },
252*11042SErik.Nordmark@Sun.COM { IPV6_DONTFRAG, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2530Sstevel@tonic-gate 	sizeof (int), 0 },
254*11042SErik.Nordmark@Sun.COM { IPV6_USE_MIN_MTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2550Sstevel@tonic-gate 	sizeof (int), 0 },
256*11042SErik.Nordmark@Sun.COM { IPV6_V6ONLY, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2570Sstevel@tonic-gate 	sizeof (int), 0 },
2580Sstevel@tonic-gate 
259*11042SErik.Nordmark@Sun.COM { IPV6_RECVPKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2600Sstevel@tonic-gate 	sizeof (int), 0 },
261*11042SErik.Nordmark@Sun.COM { IPV6_RECVHOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2620Sstevel@tonic-gate 	sizeof (int), 0 },
263*11042SErik.Nordmark@Sun.COM { IPV6_RECVHOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2640Sstevel@tonic-gate 	sizeof (int), 0 },
265*11042SErik.Nordmark@Sun.COM { _OLD_IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2660Sstevel@tonic-gate 	sizeof (int), 0 },
267*11042SErik.Nordmark@Sun.COM { IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2680Sstevel@tonic-gate 	sizeof (int), 0 },
269*11042SErik.Nordmark@Sun.COM { IPV6_RECVRTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2700Sstevel@tonic-gate 	sizeof (int), 0 },
271*11042SErik.Nordmark@Sun.COM { IPV6_RECVRTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2720Sstevel@tonic-gate 	sizeof (int), 0 },
273*11042SErik.Nordmark@Sun.COM { IPV6_RECVPATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2740Sstevel@tonic-gate 	sizeof (int), 0 },
275*11042SErik.Nordmark@Sun.COM { IPV6_RECVTCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2760Sstevel@tonic-gate 	sizeof (int), 0 },
2770Sstevel@tonic-gate 
278*11042SErik.Nordmark@Sun.COM { IPV6_SEC_OPT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
2790Sstevel@tonic-gate 	sizeof (ipsec_req_t), -1 /* not initialized */ },
280*11042SErik.Nordmark@Sun.COM { IPV6_SRC_PREFERENCES, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
2810Sstevel@tonic-gate 	sizeof (uint32_t), IPV6_PREFER_SRC_DEFAULT },
2820Sstevel@tonic-gate 
2830Sstevel@tonic-gate { MCAST_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
284*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_req),
2850Sstevel@tonic-gate 	-1 /* not initialized */ },
2860Sstevel@tonic-gate { MCAST_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
287*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_req),
2880Sstevel@tonic-gate 	-1 /* not initialized */ },
2890Sstevel@tonic-gate { MCAST_BLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
290*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
2910Sstevel@tonic-gate 	-1 /* not initialized */ },
2920Sstevel@tonic-gate { MCAST_UNBLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
293*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
2940Sstevel@tonic-gate 	-1 /* not initialized */ },
2950Sstevel@tonic-gate { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
296*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
2970Sstevel@tonic-gate 	-1 /* not initialized */ },
2980Sstevel@tonic-gate { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
299*11042SErik.Nordmark@Sun.COM 	OP_NODEFAULT, sizeof (struct group_source_req),
3000Sstevel@tonic-gate 	-1 /* not initialized */ },
3010Sstevel@tonic-gate };
3020Sstevel@tonic-gate 
3030Sstevel@tonic-gate /*
3040Sstevel@tonic-gate  * Table of all supported levels
3050Sstevel@tonic-gate  * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have
3060Sstevel@tonic-gate  * any supported options so we need this info separately.
3070Sstevel@tonic-gate  *
3080Sstevel@tonic-gate  * This is needed only for topmost tpi providers and is used only by
3090Sstevel@tonic-gate  * XTI interfaces.
3100Sstevel@tonic-gate  */
3110Sstevel@tonic-gate optlevel_t	icmp_valid_levels_arr[] = {
3120Sstevel@tonic-gate 	XTI_GENERIC,
3130Sstevel@tonic-gate 	SOL_SOCKET,
3140Sstevel@tonic-gate 	IPPROTO_ICMP,
3150Sstevel@tonic-gate 	IPPROTO_IP,
3160Sstevel@tonic-gate 	IPPROTO_IPV6,
3170Sstevel@tonic-gate 	IPPROTO_ICMPV6
3180Sstevel@tonic-gate };
3190Sstevel@tonic-gate 
3200Sstevel@tonic-gate #define	ICMP_VALID_LEVELS_CNT	A_CNT(icmp_valid_levels_arr)
3210Sstevel@tonic-gate #define	ICMP_OPT_ARR_CNT		A_CNT(icmp_opt_arr)
3220Sstevel@tonic-gate 
3230Sstevel@tonic-gate uint_t	icmp_max_optsize; /* initialized when ICMP driver is loaded */
3240Sstevel@tonic-gate 
3250Sstevel@tonic-gate /*
3260Sstevel@tonic-gate  * Initialize option database object for ICMP
3270Sstevel@tonic-gate  *
3280Sstevel@tonic-gate  * This object represents database of options to search passed to
3290Sstevel@tonic-gate  * {sock,tpi}optcom_req() interface routine to take care of option
3300Sstevel@tonic-gate  * management and associated methods.
3310Sstevel@tonic-gate  */
3320Sstevel@tonic-gate 
3330Sstevel@tonic-gate optdb_obj_t icmp_opt_obj = {
3340Sstevel@tonic-gate 	icmp_opt_default,	/* ICMP default value function pointer */
335*11042SErik.Nordmark@Sun.COM 	icmp_tpi_opt_get,	/* ICMP get function pointer */
336*11042SErik.Nordmark@Sun.COM 	icmp_tpi_opt_set,	/* ICMP set function pointer */
3370Sstevel@tonic-gate 	ICMP_OPT_ARR_CNT,	/* ICMP option database count of entries */
3380Sstevel@tonic-gate 	icmp_opt_arr,		/* ICMP option database */
3390Sstevel@tonic-gate 	ICMP_VALID_LEVELS_CNT,	/* ICMP valid level count of entries */
3400Sstevel@tonic-gate 	icmp_valid_levels_arr	/* ICMP valid level array */
3410Sstevel@tonic-gate };
342