17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5db5b637cSpriyanka * Common Development and Distribution License (the "License"). 6db5b637cSpriyanka * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22e11c3f44Smeem * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate #include <sys/types.h> 277c478bd9Sstevel@tonic-gate #include <sys/stream.h> 287c478bd9Sstevel@tonic-gate #define _SUN_TPI_VERSION 2 297c478bd9Sstevel@tonic-gate #include <sys/tihdr.h> 307c478bd9Sstevel@tonic-gate #include <sys/socket.h> 317c478bd9Sstevel@tonic-gate #include <sys/xti_xtiopt.h> 327c478bd9Sstevel@tonic-gate #include <sys/xti_inet.h> 337c478bd9Sstevel@tonic-gate 347c478bd9Sstevel@tonic-gate #include <netinet/in.h> 357c478bd9Sstevel@tonic-gate #include <netinet/icmp6.h> 367c478bd9Sstevel@tonic-gate #include <inet/common.h> 377c478bd9Sstevel@tonic-gate #include <netinet/ip6.h> 387c478bd9Sstevel@tonic-gate #include <inet/ip.h> 397c478bd9Sstevel@tonic-gate 407c478bd9Sstevel@tonic-gate #include <netinet/tcp.h> 417c478bd9Sstevel@tonic-gate #include <netinet/ip_mroute.h> 427c478bd9Sstevel@tonic-gate #include <inet/optcom.h> 43*bd670b35SErik Nordmark #include <inet/rawip_impl.h> 447c478bd9Sstevel@tonic-gate 457c478bd9Sstevel@tonic-gate /* 467c478bd9Sstevel@tonic-gate * Table of all known options handled on a ICMP protocol stack. 477c478bd9Sstevel@tonic-gate * 487c478bd9Sstevel@tonic-gate * Note: This table contains options processed by both ICMP and IP levels 497c478bd9Sstevel@tonic-gate * and is the superset of options that can be performed on a ICMP over IP 507c478bd9Sstevel@tonic-gate * stack. 517c478bd9Sstevel@tonic-gate */ 527c478bd9Sstevel@tonic-gate opdes_t icmp_opt_arr[] = { 537c478bd9Sstevel@tonic-gate 54*bd670b35SErik Nordmark { SO_DEBUG, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 55*bd670b35SErik Nordmark { SO_DONTROUTE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 56*bd670b35SErik Nordmark { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 577c478bd9Sstevel@tonic-gate }, 58*bd670b35SErik Nordmark { SO_BROADCAST, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 59*bd670b35SErik Nordmark { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 607c478bd9Sstevel@tonic-gate 617c478bd9Sstevel@tonic-gate #ifdef SO_PROTOTYPE 627c478bd9Sstevel@tonic-gate /* 637c478bd9Sstevel@tonic-gate * icmp will only allow IPPROTO_ICMP for non-privileged streams 647c478bd9Sstevel@tonic-gate * that check is made on an adhoc basis. 657c478bd9Sstevel@tonic-gate */ 66*bd670b35SErik Nordmark { SO_PROTOTYPE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 677c478bd9Sstevel@tonic-gate #endif 687c478bd9Sstevel@tonic-gate 69*bd670b35SErik Nordmark { SO_TYPE, SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 }, 70*bd670b35SErik Nordmark { SO_SNDBUF, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 71*bd670b35SErik Nordmark { SO_RCVBUF, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 72*bd670b35SErik Nordmark { SO_SNDTIMEO, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, 733986c91eSanders sizeof (struct timeval), 0 }, 74*bd670b35SErik Nordmark { SO_RCVTIMEO, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, 753986c91eSanders sizeof (struct timeval), 0 }, 76*bd670b35SErik Nordmark { SO_DGRAM_ERRIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 777c478bd9Sstevel@tonic-gate 0 }, 78*bd670b35SErik Nordmark { SO_TIMESTAMP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 79e4f35dbaSgt }, 80*bd670b35SErik Nordmark { SO_MAC_EXEMPT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 815d3b8cb7SBill Sommerfeld 0 }, 82*bd670b35SErik Nordmark { SO_MAC_IMPLICIT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 835d0bc3edSsommerfe 0 }, 845d0bc3edSsommerfe 85*bd670b35SErik Nordmark { SO_ALLZONES, SOL_SOCKET, OA_R, OA_RW, OP_CONFIG, 0, sizeof (int), 865d0bc3edSsommerfe 0 }, 87*bd670b35SErik Nordmark { SO_DOMAIN, SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 }, 887c478bd9Sstevel@tonic-gate 897c478bd9Sstevel@tonic-gate { IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 90*bd670b35SErik Nordmark (OP_VARLEN|OP_NODEFAULT), 910f1702c5SYu Xiangning IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ }, 927c478bd9Sstevel@tonic-gate { T_IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 93*bd670b35SErik Nordmark (OP_VARLEN|OP_NODEFAULT), 940f1702c5SYu Xiangning IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ }, 957c478bd9Sstevel@tonic-gate 96*bd670b35SErik Nordmark { IP_HDRINCL, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, 977c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 98*bd670b35SErik Nordmark { IP_TOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 99*bd670b35SErik Nordmark { T_IP_TOS, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 100*bd670b35SErik Nordmark { IP_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 1017c478bd9Sstevel@tonic-gate 102*bd670b35SErik Nordmark { IP_MULTICAST_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, 1037c478bd9Sstevel@tonic-gate sizeof (struct in_addr), 0 /* INADDR_ANY */ }, 1047c478bd9Sstevel@tonic-gate 105*bd670b35SErik Nordmark { IP_MULTICAST_LOOP, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN, 1067c478bd9Sstevel@tonic-gate sizeof (uchar_t), -1 /* not initialized */}, 1077c478bd9Sstevel@tonic-gate 108*bd670b35SErik Nordmark { IP_MULTICAST_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN, 1097c478bd9Sstevel@tonic-gate sizeof (uchar_t), -1 /* not initialized */ }, 1107c478bd9Sstevel@tonic-gate 111*bd670b35SErik Nordmark { IP_ADD_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT, 1127c478bd9Sstevel@tonic-gate sizeof (struct ip_mreq), -1 /* not initialized */ }, 1137c478bd9Sstevel@tonic-gate 114*bd670b35SErik Nordmark { IP_DROP_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT, 1157c478bd9Sstevel@tonic-gate sizeof (struct ip_mreq), 0 }, 1167c478bd9Sstevel@tonic-gate 117*bd670b35SErik Nordmark { IP_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT, 1187c478bd9Sstevel@tonic-gate sizeof (struct ip_mreq_source), -1 }, 1197c478bd9Sstevel@tonic-gate 120*bd670b35SErik Nordmark { IP_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT, 1217c478bd9Sstevel@tonic-gate sizeof (struct ip_mreq_source), -1 }, 1227c478bd9Sstevel@tonic-gate 1237c478bd9Sstevel@tonic-gate { IP_ADD_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, 124*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 }, 1257c478bd9Sstevel@tonic-gate 1267c478bd9Sstevel@tonic-gate { IP_DROP_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, 127*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 }, 1287c478bd9Sstevel@tonic-gate 129*bd670b35SErik Nordmark { IP_SEC_OPT, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_NODEFAULT, 1307c478bd9Sstevel@tonic-gate sizeof (ipsec_req_t), -1 /* not initialized */ }, 1317c478bd9Sstevel@tonic-gate 132*bd670b35SErik Nordmark { IP_BOUND_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, 1337c478bd9Sstevel@tonic-gate sizeof (int), 0 /* no ifindex */ }, 1347c478bd9Sstevel@tonic-gate 135*bd670b35SErik Nordmark { IP_UNSPEC_SRC, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, 1367c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1377c478bd9Sstevel@tonic-gate 138a7107231Smeem { IP_BROADCAST_TTL, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, sizeof (uchar_t), 139a7107231Smeem 0 /* disabled */ }, 140a7107231Smeem 141*bd670b35SErik Nordmark { IP_RECVIF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 1427c478bd9Sstevel@tonic-gate 14319a30e1aSrshoaib { IP_PKTINFO, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 144*bd670b35SErik Nordmark (OP_NODEFAULT|OP_VARLEN), 14519a30e1aSrshoaib sizeof (struct in_pktinfo), -1 /* not initialized */ }, 14619a30e1aSrshoaib 147*bd670b35SErik Nordmark { IP_DONTFRAG, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 }, 148*bd670b35SErik Nordmark 149*bd670b35SErik Nordmark { IP_NEXTHOP, IPPROTO_IP, OA_R, OA_RW, OP_CONFIG, 0, 15019a30e1aSrshoaib sizeof (in_addr_t), -1 /* not initialized */ }, 151db5b637cSpriyanka 1527c478bd9Sstevel@tonic-gate { MRT_INIT, IPPROTO_IP, 0, OA_X, OP_CONFIG, 153*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (int), 1547c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1557c478bd9Sstevel@tonic-gate 1567c478bd9Sstevel@tonic-gate { MRT_DONE, IPPROTO_IP, 0, OA_X, OP_CONFIG, 157*bd670b35SErik Nordmark OP_NODEFAULT, 0, -1 /* not initialized */ }, 1587c478bd9Sstevel@tonic-gate 159*bd670b35SErik Nordmark { MRT_ADD_VIF, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT, 1607c478bd9Sstevel@tonic-gate sizeof (struct vifctl), -1 /* not initialized */ }, 1617c478bd9Sstevel@tonic-gate 162*bd670b35SErik Nordmark { MRT_DEL_VIF, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT, 1637c478bd9Sstevel@tonic-gate sizeof (vifi_t), -1 /* not initialized */ }, 1647c478bd9Sstevel@tonic-gate 165*bd670b35SErik Nordmark { MRT_ADD_MFC, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT, 1667c478bd9Sstevel@tonic-gate sizeof (struct mfcctl), -1 /* not initialized */ }, 1677c478bd9Sstevel@tonic-gate 168*bd670b35SErik Nordmark { MRT_DEL_MFC, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT, 1697c478bd9Sstevel@tonic-gate sizeof (struct mfcctl), -1 /* not initialized */ }, 1707c478bd9Sstevel@tonic-gate 171*bd670b35SErik Nordmark { MRT_VERSION, IPPROTO_IP, OA_R, OA_R, OP_NP, OP_NODEFAULT, 1727c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 1737c478bd9Sstevel@tonic-gate 1747c478bd9Sstevel@tonic-gate { MRT_ASSERT, IPPROTO_IP, 0, OA_RW, OP_CONFIG, 175*bd670b35SErik Nordmark OP_NODEFAULT, 1767c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 1777c478bd9Sstevel@tonic-gate 1787c478bd9Sstevel@tonic-gate { MCAST_JOIN_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP, 179*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_req), 1807c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1817c478bd9Sstevel@tonic-gate { MCAST_LEAVE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP, 182*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_req), 1837c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1847c478bd9Sstevel@tonic-gate { MCAST_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, 185*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 1867c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1877c478bd9Sstevel@tonic-gate { MCAST_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, 188*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 1897c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1907c478bd9Sstevel@tonic-gate { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP, 191*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 1927c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1937c478bd9Sstevel@tonic-gate { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP, 194*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 1957c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 1967c478bd9Sstevel@tonic-gate 197*bd670b35SErik Nordmark { IPV6_MULTICAST_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 1987c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 1997c478bd9Sstevel@tonic-gate 2007c478bd9Sstevel@tonic-gate { IPV6_MULTICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 201*bd670b35SErik Nordmark OP_DEF_FN, sizeof (int), -1 /* not initialized */ }, 2027c478bd9Sstevel@tonic-gate 2037c478bd9Sstevel@tonic-gate { IPV6_MULTICAST_LOOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 204*bd670b35SErik Nordmark OP_DEF_FN, sizeof (int), -1 /* not initialized */}, 2057c478bd9Sstevel@tonic-gate 206*bd670b35SErik Nordmark { IPV6_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT, 2077c478bd9Sstevel@tonic-gate sizeof (struct ipv6_mreq), -1 /* not initialized */ }, 2087c478bd9Sstevel@tonic-gate 209*bd670b35SErik Nordmark { IPV6_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT, 2107c478bd9Sstevel@tonic-gate sizeof (struct ipv6_mreq), -1 /* not initialized */ }, 2117c478bd9Sstevel@tonic-gate 212*bd670b35SErik Nordmark { IPV6_UNICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN, 2137c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 2147c478bd9Sstevel@tonic-gate 215*bd670b35SErik Nordmark { IPV6_BOUND_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2167c478bd9Sstevel@tonic-gate sizeof (int), 0 /* no ifindex */ }, 2177c478bd9Sstevel@tonic-gate 218*bd670b35SErik Nordmark { IPV6_UNSPEC_SRC, IPPROTO_IPV6, OA_R, OA_RW, OP_RAW, 0, 2197c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 2207c478bd9Sstevel@tonic-gate 221*bd670b35SErik Nordmark { IPV6_CHECKSUM, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 2227c478bd9Sstevel@tonic-gate -1 }, 2237c478bd9Sstevel@tonic-gate 2247c478bd9Sstevel@tonic-gate { ICMP6_FILTER, IPPROTO_ICMPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN|OP_VARLEN, 2257c478bd9Sstevel@tonic-gate sizeof (icmp6_filter_t), 0 }, 2267c478bd9Sstevel@tonic-gate { IPV6_PKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 227*bd670b35SErik Nordmark (OP_NODEFAULT|OP_VARLEN), 2287c478bd9Sstevel@tonic-gate sizeof (struct in6_pktinfo), -1 /* not initialized */ }, 2297c478bd9Sstevel@tonic-gate { IPV6_HOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 230*bd670b35SErik Nordmark (OP_NODEFAULT|OP_VARLEN), 2317c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 2327c478bd9Sstevel@tonic-gate { IPV6_NEXTHOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 233*bd670b35SErik Nordmark (OP_NODEFAULT|OP_VARLEN), 2347c478bd9Sstevel@tonic-gate sizeof (sin6_t), -1 /* not initialized */ }, 2357c478bd9Sstevel@tonic-gate { IPV6_HOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 236*bd670b35SErik Nordmark (OP_VARLEN|OP_NODEFAULT), 2377c478bd9Sstevel@tonic-gate MAX_EHDR_LEN, -1 /* not initialized */ }, 2387c478bd9Sstevel@tonic-gate { IPV6_DSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 239*bd670b35SErik Nordmark (OP_VARLEN|OP_NODEFAULT), 2407c478bd9Sstevel@tonic-gate MAX_EHDR_LEN, -1 /* not initialized */ }, 2417c478bd9Sstevel@tonic-gate { IPV6_RTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 242*bd670b35SErik Nordmark (OP_VARLEN|OP_NODEFAULT), 2437c478bd9Sstevel@tonic-gate MAX_EHDR_LEN, -1 /* not initialized */ }, 2447c478bd9Sstevel@tonic-gate { IPV6_RTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 245*bd670b35SErik Nordmark (OP_VARLEN|OP_NODEFAULT), 2467c478bd9Sstevel@tonic-gate MAX_EHDR_LEN, -1 /* not initialized */ }, 2477c478bd9Sstevel@tonic-gate { IPV6_TCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 248*bd670b35SErik Nordmark (OP_NODEFAULT|OP_VARLEN), 2497c478bd9Sstevel@tonic-gate sizeof (int), -1 /* not initialized */ }, 250*bd670b35SErik Nordmark { IPV6_PATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2517c478bd9Sstevel@tonic-gate sizeof (struct ip6_mtuinfo), -1 }, 252*bd670b35SErik Nordmark { IPV6_DONTFRAG, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2537c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 254*bd670b35SErik Nordmark { IPV6_USE_MIN_MTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2557c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 256*bd670b35SErik Nordmark { IPV6_V6ONLY, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2577c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 2587c478bd9Sstevel@tonic-gate 259*bd670b35SErik Nordmark { IPV6_RECVPKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2607c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 261*bd670b35SErik Nordmark { IPV6_RECVHOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2627c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 263*bd670b35SErik Nordmark { IPV6_RECVHOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2647c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 265*bd670b35SErik Nordmark { _OLD_IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2667c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 267*bd670b35SErik Nordmark { IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2687c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 269*bd670b35SErik Nordmark { IPV6_RECVRTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2707c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 271*bd670b35SErik Nordmark { IPV6_RECVRTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2727c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 273*bd670b35SErik Nordmark { IPV6_RECVPATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2747c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 275*bd670b35SErik Nordmark { IPV6_RECVTCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2767c478bd9Sstevel@tonic-gate sizeof (int), 0 }, 2777c478bd9Sstevel@tonic-gate 278*bd670b35SErik Nordmark { IPV6_SEC_OPT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_NODEFAULT, 2797c478bd9Sstevel@tonic-gate sizeof (ipsec_req_t), -1 /* not initialized */ }, 280*bd670b35SErik Nordmark { IPV6_SRC_PREFERENCES, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, 2817c478bd9Sstevel@tonic-gate sizeof (uint32_t), IPV6_PREFER_SRC_DEFAULT }, 2827c478bd9Sstevel@tonic-gate 2837c478bd9Sstevel@tonic-gate { MCAST_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, 284*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_req), 2857c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 2867c478bd9Sstevel@tonic-gate { MCAST_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, 287*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_req), 2887c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 2897c478bd9Sstevel@tonic-gate { MCAST_BLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP, 290*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 2917c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 2927c478bd9Sstevel@tonic-gate { MCAST_UNBLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP, 293*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 2947c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 2957c478bd9Sstevel@tonic-gate { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, 296*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 2977c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 2987c478bd9Sstevel@tonic-gate { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, 299*bd670b35SErik Nordmark OP_NODEFAULT, sizeof (struct group_source_req), 3007c478bd9Sstevel@tonic-gate -1 /* not initialized */ }, 3017c478bd9Sstevel@tonic-gate }; 3027c478bd9Sstevel@tonic-gate 3037c478bd9Sstevel@tonic-gate /* 3047c478bd9Sstevel@tonic-gate * Table of all supported levels 3057c478bd9Sstevel@tonic-gate * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have 3067c478bd9Sstevel@tonic-gate * any supported options so we need this info separately. 3077c478bd9Sstevel@tonic-gate * 3087c478bd9Sstevel@tonic-gate * This is needed only for topmost tpi providers and is used only by 3097c478bd9Sstevel@tonic-gate * XTI interfaces. 3107c478bd9Sstevel@tonic-gate */ 3117c478bd9Sstevel@tonic-gate optlevel_t icmp_valid_levels_arr[] = { 3127c478bd9Sstevel@tonic-gate XTI_GENERIC, 3137c478bd9Sstevel@tonic-gate SOL_SOCKET, 3147c478bd9Sstevel@tonic-gate IPPROTO_ICMP, 3157c478bd9Sstevel@tonic-gate IPPROTO_IP, 3167c478bd9Sstevel@tonic-gate IPPROTO_IPV6, 3177c478bd9Sstevel@tonic-gate IPPROTO_ICMPV6 3187c478bd9Sstevel@tonic-gate }; 3197c478bd9Sstevel@tonic-gate 3207c478bd9Sstevel@tonic-gate #define ICMP_VALID_LEVELS_CNT A_CNT(icmp_valid_levels_arr) 3217c478bd9Sstevel@tonic-gate #define ICMP_OPT_ARR_CNT A_CNT(icmp_opt_arr) 3227c478bd9Sstevel@tonic-gate 3237c478bd9Sstevel@tonic-gate uint_t icmp_max_optsize; /* initialized when ICMP driver is loaded */ 3247c478bd9Sstevel@tonic-gate 3257c478bd9Sstevel@tonic-gate /* 3267c478bd9Sstevel@tonic-gate * Initialize option database object for ICMP 3277c478bd9Sstevel@tonic-gate * 3287c478bd9Sstevel@tonic-gate * This object represents database of options to search passed to 3297c478bd9Sstevel@tonic-gate * {sock,tpi}optcom_req() interface routine to take care of option 3307c478bd9Sstevel@tonic-gate * management and associated methods. 3317c478bd9Sstevel@tonic-gate */ 3327c478bd9Sstevel@tonic-gate 3337c478bd9Sstevel@tonic-gate optdb_obj_t icmp_opt_obj = { 3347c478bd9Sstevel@tonic-gate icmp_opt_default, /* ICMP default value function pointer */ 335*bd670b35SErik Nordmark icmp_tpi_opt_get, /* ICMP get function pointer */ 336*bd670b35SErik Nordmark icmp_tpi_opt_set, /* ICMP set function pointer */ 3377c478bd9Sstevel@tonic-gate ICMP_OPT_ARR_CNT, /* ICMP option database count of entries */ 3387c478bd9Sstevel@tonic-gate icmp_opt_arr, /* ICMP option database */ 3397c478bd9Sstevel@tonic-gate ICMP_VALID_LEVELS_CNT, /* ICMP valid level count of entries */ 3407c478bd9Sstevel@tonic-gate icmp_valid_levels_arr /* ICMP valid level array */ 3417c478bd9Sstevel@tonic-gate }; 342