Print this page
7127  remove -Wno-missing-braces from Makefile.uts


  34 #include <netinet/in.h>
  35 #include <netinet/icmp6.h>
  36 #include <inet/common.h>
  37 #include <netinet/ip6.h>
  38 #include <inet/ip.h>
  39 
  40 #include <netinet/tcp.h>
  41 #include <netinet/ip_mroute.h>
  42 #include <inet/optcom.h>
  43 #include <inet/rawip_impl.h>
  44 
  45 /*
  46  * Table of all known options handled on a ICMP protocol stack.
  47  *
  48  * Note: This table contains options processed by both ICMP and IP levels
  49  *       and is the superset of options that can be performed on a ICMP over IP
  50  *       stack.
  51  */
  52 opdes_t icmp_opt_arr[] = {
  53 
  54 { SO_DEBUG,     SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  55 { SO_DONTROUTE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  56 { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
  57         },
  58 { SO_BROADCAST, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  59 { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  60 
  61 #ifdef  SO_PROTOTYPE
  62         /*
  63          * icmp will only allow IPPROTO_ICMP for non-privileged streams
  64          * that check is made on an adhoc basis.
  65          */
  66 { SO_PROTOTYPE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  67 #endif
  68 
  69 { SO_TYPE,      SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
  70 { SO_SNDBUF,    SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  71 { SO_RCVBUF,    SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  72 { SO_SNDTIMEO,  SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
  73         sizeof (struct timeval), 0 },
  74 { SO_RCVTIMEO,  SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
  75         sizeof (struct timeval), 0 },
  76 { SO_DGRAM_ERRIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  77         0 },
  78 { SO_TIMESTAMP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0
  79         },
  80 { SO_MAC_EXEMPT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  81         0 },
  82 { SO_MAC_IMPLICIT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  83         0 },
  84 
  85 { SO_ALLZONES, SOL_SOCKET, OA_R, OA_RW, OP_CONFIG, 0, sizeof (int),
  86         0 },
  87 { SO_DOMAIN,    SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
  88 
  89 { IP_OPTIONS,   IPPROTO_IP, OA_RW, OA_RW, OP_NP,
  90         (OP_VARLEN|OP_NODEFAULT),
  91         IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ },
  92 { T_IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
  93         (OP_VARLEN|OP_NODEFAULT),
  94         IP_MAX_OPT_LENGTH + IP_ADDR_LEN, -1 /* not initialized */ },
  95 
  96 { IP_HDRINCL,   IPPROTO_IP, OA_R,  OA_RW, OP_RAW, 0,
  97         sizeof (int), 0 },
  98 { IP_TOS,       IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  99 { T_IP_TOS,     IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
 100 { IP_TTL,       IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
 101 
 102 { IP_MULTICAST_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
 103         sizeof (struct in_addr), 0 /* INADDR_ANY */ },
 104 
 105 { IP_MULTICAST_LOOP, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
 106         sizeof (uchar_t), -1 /* not initialized */},
 107 
 108 { IP_MULTICAST_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
 109         sizeof (uchar_t), -1 /* not initialized */ },
 110 
 111 { IP_ADD_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 112         sizeof (struct ip_mreq), -1 /* not initialized */ },
 113 
 114 { IP_DROP_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 115         sizeof (struct ip_mreq), 0 },
 116 
 117 { IP_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 118         sizeof (struct ip_mreq_source), -1 },
 119 
 120 { IP_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 121         sizeof (struct ip_mreq_source), -1 },
 122 
 123 { IP_ADD_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 124         OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 },
 125 
 126 { IP_DROP_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 127         OP_NODEFAULT, sizeof (struct ip_mreq_source), -1 },
 128 
 129 { IP_SEC_OPT, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
 130         sizeof (ipsec_req_t), -1 /* not initialized */ },
 131 
 132 { IP_BOUND_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
 133         sizeof (int),   0 /* no ifindex */ },
 134 
 135 { IP_UNSPEC_SRC, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0,
 136         sizeof (int), 0 },
 137 
 138 { IP_BROADCAST_TTL, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, sizeof (uchar_t),
 139         0 /* disabled */ },
 140 
 141 { IP_RECVIF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
 142 
 143 { IP_PKTINFO, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
 144         (OP_NODEFAULT|OP_VARLEN),
 145         sizeof (struct in_pktinfo), -1 /* not initialized */ },
 146 
 147 { IP_DONTFRAG, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
 148 
 149 { IP_NEXTHOP, IPPROTO_IP, OA_R, OA_RW, OP_CONFIG, 0,
 150         sizeof (in_addr_t), -1 /* not initialized */ },
 151 
 152 { MRT_INIT, IPPROTO_IP, 0, OA_X, OP_CONFIG,
 153         OP_NODEFAULT, sizeof (int),
 154         -1 /* not initialized */ },
 155 
 156 { MRT_DONE, IPPROTO_IP, 0, OA_X, OP_CONFIG,
 157         OP_NODEFAULT, 0, -1 /* not initialized */ },
 158 
 159 { MRT_ADD_VIF, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 160         sizeof (struct vifctl), -1 /* not initialized */ },
 161 
 162 { MRT_DEL_VIF,  IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 163         sizeof (vifi_t), -1 /* not initialized */ },
 164 
 165 { MRT_ADD_MFC,  IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 166         sizeof (struct mfcctl), -1 /* not initialized */ },
 167 
 168 { MRT_DEL_MFC,  IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 169         sizeof (struct mfcctl), -1 /* not initialized */ },
 170 
 171 { MRT_VERSION,  IPPROTO_IP, OA_R, OA_R, OP_NP, OP_NODEFAULT,
 172         sizeof (int), -1 /* not initialized */ },
 173 
 174 { MRT_ASSERT,   IPPROTO_IP, 0, OA_RW, OP_CONFIG,
 175         OP_NODEFAULT,
 176         sizeof (int), -1 /* not initialized */ },
 177 
 178 { MCAST_JOIN_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 179         OP_NODEFAULT, sizeof (struct group_req),
 180         -1 /* not initialized */ },
 181 { MCAST_LEAVE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 182         OP_NODEFAULT, sizeof (struct group_req),
 183         -1 /* not initialized */ },
 184 { MCAST_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
 185         OP_NODEFAULT, sizeof (struct group_source_req),
 186         -1 /* not initialized */ },
 187 { MCAST_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
 188         OP_NODEFAULT, sizeof (struct group_source_req),
 189         -1 /* not initialized */ },
 190 { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 191         OP_NODEFAULT, sizeof (struct group_source_req),
 192         -1 /* not initialized */ },
 193 { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 194         OP_NODEFAULT, sizeof (struct group_source_req),
 195         -1 /* not initialized */ },
 196 
 197 { IPV6_MULTICAST_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 198         sizeof (int), 0 },
 199 
 200 { IPV6_MULTICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 201         OP_DEF_FN, sizeof (int), -1 /* not initialized */ },
 202 
 203 { IPV6_MULTICAST_LOOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 204         OP_DEF_FN, sizeof (int), -1 /* not initialized */},
 205 
 206 { IPV6_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 207         sizeof (struct ipv6_mreq), -1 /* not initialized */ },
 208 
 209 { IPV6_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 210         sizeof (struct ipv6_mreq), -1 /* not initialized */ },
 211 
 212 { IPV6_UNICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
 213         sizeof (int), -1 /* not initialized */ },
 214 
 215 { IPV6_BOUND_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 216         sizeof (int),   0 /* no ifindex */ },
 217 
 218 { IPV6_UNSPEC_SRC, IPPROTO_IPV6, OA_R, OA_RW, OP_RAW, 0,
 219         sizeof (int), 0 },
 220 
 221 { IPV6_CHECKSUM, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
 222         -1 },
 223 
 224 { ICMP6_FILTER, IPPROTO_ICMPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN|OP_VARLEN,
 225         sizeof (icmp6_filter_t), 0 },
 226 { IPV6_PKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 227         (OP_NODEFAULT|OP_VARLEN),
 228         sizeof (struct in6_pktinfo), -1 /* not initialized */ },
 229 { IPV6_HOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 230         (OP_NODEFAULT|OP_VARLEN),
 231         sizeof (int), -1 /* not initialized */ },
 232 { IPV6_NEXTHOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 233         (OP_NODEFAULT|OP_VARLEN),
 234         sizeof (sin6_t), -1 /* not initialized */ },
 235 { IPV6_HOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 236         (OP_VARLEN|OP_NODEFAULT),
 237         MAX_EHDR_LEN, -1 /* not initialized */ },
 238 { IPV6_DSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 239         (OP_VARLEN|OP_NODEFAULT),
 240         MAX_EHDR_LEN, -1 /* not initialized */ },
 241 { IPV6_RTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 242         (OP_VARLEN|OP_NODEFAULT),
 243         MAX_EHDR_LEN, -1 /* not initialized */ },
 244 { IPV6_RTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 245         (OP_VARLEN|OP_NODEFAULT),
 246         MAX_EHDR_LEN, -1 /* not initialized */ },
 247 { IPV6_TCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 248         (OP_NODEFAULT|OP_VARLEN),
 249         sizeof (int), -1 /* not initialized */ },
 250 { IPV6_PATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 251         sizeof (struct ip6_mtuinfo), -1 },
 252 { IPV6_DONTFRAG, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 253         sizeof (int), 0 },
 254 { IPV6_USE_MIN_MTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 255         sizeof (int), 0 },
 256 { IPV6_V6ONLY, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 257         sizeof (int), 0 },
 258 
 259 { IPV6_RECVPKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 260         sizeof (int), 0 },
 261 { IPV6_RECVHOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 262         sizeof (int), 0 },
 263 { IPV6_RECVHOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 264         sizeof (int), 0 },
 265 { _OLD_IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 266         sizeof (int), 0 },
 267 { IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 268         sizeof (int), 0 },
 269 { IPV6_RECVRTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 270         sizeof (int), 0 },
 271 { IPV6_RECVRTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 272         sizeof (int), 0 },
 273 { IPV6_RECVPATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 274         sizeof (int), 0 },
 275 { IPV6_RECVTCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 276         sizeof (int), 0 },
 277 
 278 { IPV6_SEC_OPT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
 279         sizeof (ipsec_req_t), -1 /* not initialized */ },
 280 { IPV6_SRC_PREFERENCES, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 281         sizeof (uint32_t), IPV6_PREFER_SRC_DEFAULT },
 282 
 283 { MCAST_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 284         OP_NODEFAULT, sizeof (struct group_req),
 285         -1 /* not initialized */ },
 286 { MCAST_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 287         OP_NODEFAULT, sizeof (struct group_req),
 288         -1 /* not initialized */ },
 289 { MCAST_BLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 290         OP_NODEFAULT, sizeof (struct group_source_req),
 291         -1 /* not initialized */ },
 292 { MCAST_UNBLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 293         OP_NODEFAULT, sizeof (struct group_source_req),
 294         -1 /* not initialized */ },
 295 { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 296         OP_NODEFAULT, sizeof (struct group_source_req),
 297         -1 /* not initialized */ },
 298 { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 299         OP_NODEFAULT, sizeof (struct group_source_req),
 300         -1 /* not initialized */ },
 301 };
 302 
 303 /*
 304  * Table of all supported levels
 305  * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have
 306  * any supported options so we need this info separately.
 307  *
 308  * This is needed only for topmost tpi providers and is used only by
 309  * XTI interfaces.
 310  */
 311 optlevel_t      icmp_valid_levels_arr[] = {
 312         XTI_GENERIC,
 313         SOL_SOCKET,
 314         IPPROTO_ICMP,
 315         IPPROTO_IP,
 316         IPPROTO_IPV6,
 317         IPPROTO_ICMPV6
 318 };
 319 
 320 #define ICMP_VALID_LEVELS_CNT   A_CNT(icmp_valid_levels_arr)




  34 #include <netinet/in.h>
  35 #include <netinet/icmp6.h>
  36 #include <inet/common.h>
  37 #include <netinet/ip6.h>
  38 #include <inet/ip.h>
  39 
  40 #include <netinet/tcp.h>
  41 #include <netinet/ip_mroute.h>
  42 #include <inet/optcom.h>
  43 #include <inet/rawip_impl.h>
  44 
  45 /*
  46  * Table of all known options handled on a ICMP protocol stack.
  47  *
  48  * Note: This table contains options processed by both ICMP and IP levels
  49  *       and is the superset of options that can be performed on a ICMP over IP
  50  *       stack.
  51  */
  52 opdes_t icmp_opt_arr[] = {
  53 
  54 { SO_DEBUG,     SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  55 { SO_DONTROUTE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  56 { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0}
  57         },
  58 { SO_BROADCAST, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  59 { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  60 
  61 #ifdef  SO_PROTOTYPE
  62         /*
  63          * icmp will only allow IPPROTO_ICMP for non-privileged streams
  64          * that check is made on an adhoc basis.
  65          */
  66 { SO_PROTOTYPE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  67 #endif
  68 
  69 { SO_TYPE,      SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), {0} },
  70 { SO_SNDBUF,    SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  71 { SO_RCVBUF,    SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  72 { SO_SNDTIMEO,  SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
  73         sizeof (struct timeval), {0} },
  74 { SO_RCVTIMEO,  SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
  75         sizeof (struct timeval), {0} },
  76 { SO_DGRAM_ERRIND, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  77         {0} },
  78 { SO_TIMESTAMP, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0}
  79         },
  80 { SO_MAC_EXEMPT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  81         {0} },
  82 { SO_MAC_IMPLICIT, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  83         {0} },
  84 
  85 { SO_ALLZONES, SOL_SOCKET, OA_R, OA_RW, OP_CONFIG, 0, sizeof (int),
  86         {0} },
  87 { SO_DOMAIN,    SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), {0} },
  88 
  89 { IP_OPTIONS,   IPPROTO_IP, OA_RW, OA_RW, OP_NP,
  90         (OP_VARLEN|OP_NODEFAULT),
  91         IP_MAX_OPT_LENGTH + IP_ADDR_LEN, {-1} /* not initialized */ },
  92 { T_IP_OPTIONS, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
  93         (OP_VARLEN|OP_NODEFAULT),
  94         IP_MAX_OPT_LENGTH + IP_ADDR_LEN, {-1} /* not initialized */ },
  95 
  96 { IP_HDRINCL,   IPPROTO_IP, OA_R,  OA_RW, OP_RAW, 0,
  97         sizeof (int), {0} },
  98 { IP_TOS,       IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
  99 { T_IP_TOS,     IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
 100 { IP_TTL,       IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
 101 
 102 { IP_MULTICAST_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
 103         sizeof (struct in_addr), {0} /* INADDR_ANY */ },
 104 
 105 { IP_MULTICAST_LOOP, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
 106         sizeof (uchar_t), {-1} /* not initialized */},
 107 
 108 { IP_MULTICAST_TTL, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
 109         sizeof (uchar_t), {-1} /* not initialized */ },
 110 
 111 { IP_ADD_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 112         sizeof (struct ip_mreq), {-1} /* not initialized */ },
 113 
 114 { IP_DROP_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 115         sizeof (struct ip_mreq), {0} },
 116 
 117 { IP_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 118         sizeof (struct ip_mreq_source), {-1} },
 119 
 120 { IP_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 121         sizeof (struct ip_mreq_source), {-1} },
 122 
 123 { IP_ADD_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 124         OP_NODEFAULT, sizeof (struct ip_mreq_source), {-1} },
 125 
 126 { IP_DROP_SOURCE_MEMBERSHIP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 127         OP_NODEFAULT, sizeof (struct ip_mreq_source), {-1} },
 128 
 129 { IP_SEC_OPT, IPPROTO_IP, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
 130         sizeof (ipsec_req_t), {-1} /* not initialized */ },
 131 
 132 { IP_BOUND_IF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0,
 133         sizeof (int),   {0} /* no ifindex */ },
 134 
 135 { IP_UNSPEC_SRC, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0,
 136         sizeof (int), {0} },
 137 
 138 { IP_BROADCAST_TTL, IPPROTO_IP, OA_R, OA_RW, OP_RAW, 0, sizeof (uchar_t),
 139         {0} /* disabled */ },
 140 
 141 { IP_RECVIF, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
 142 
 143 { IP_PKTINFO, IPPROTO_IP, OA_RW, OA_RW, OP_NP,
 144         (OP_NODEFAULT|OP_VARLEN),
 145         sizeof (struct in_pktinfo), {-1} /* not initialized */ },
 146 
 147 { IP_DONTFRAG, IPPROTO_IP, OA_RW, OA_RW, OP_NP, 0, sizeof (int), {0} },
 148 
 149 { IP_NEXTHOP, IPPROTO_IP, OA_R, OA_RW, OP_CONFIG, 0,
 150         sizeof (in_addr_t), {-1} /* not initialized */ },
 151 
 152 { MRT_INIT, IPPROTO_IP, 0, OA_X, OP_CONFIG,
 153         OP_NODEFAULT, sizeof (int),
 154         {-1} /* not initialized */ },
 155 
 156 { MRT_DONE, IPPROTO_IP, 0, OA_X, OP_CONFIG,
 157         OP_NODEFAULT, 0, {-1} /* not initialized */ },
 158 
 159 { MRT_ADD_VIF, IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 160         sizeof (struct vifctl), {-1} /* not initialized */ },
 161 
 162 { MRT_DEL_VIF,  IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 163         sizeof (vifi_t), {-1} /* not initialized */ },
 164 
 165 { MRT_ADD_MFC,  IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 166         sizeof (struct mfcctl), {-1} /* not initialized */ },
 167 
 168 { MRT_DEL_MFC,  IPPROTO_IP, 0, OA_X, OP_CONFIG, OP_NODEFAULT,
 169         sizeof (struct mfcctl), {-1} /* not initialized */ },
 170 
 171 { MRT_VERSION,  IPPROTO_IP, OA_R, OA_R, OP_NP, OP_NODEFAULT,
 172         sizeof (int), {-1} /* not initialized */ },
 173 
 174 { MRT_ASSERT,   IPPROTO_IP, 0, OA_RW, OP_CONFIG,
 175         OP_NODEFAULT,
 176         sizeof (int), {-1} /* not initialized */ },
 177 
 178 { MCAST_JOIN_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 179         OP_NODEFAULT, sizeof (struct group_req),
 180         {-1} /* not initialized */ },
 181 { MCAST_LEAVE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 182         OP_NODEFAULT, sizeof (struct group_req),
 183         {-1} /* not initialized */ },
 184 { MCAST_BLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
 185         OP_NODEFAULT, sizeof (struct group_source_req),
 186         {-1} /* not initialized */ },
 187 { MCAST_UNBLOCK_SOURCE, IPPROTO_IP, OA_X, OA_X, OP_NP,
 188         OP_NODEFAULT, sizeof (struct group_source_req),
 189         {-1} /* not initialized */ },
 190 { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 191         OP_NODEFAULT, sizeof (struct group_source_req),
 192         {-1} /* not initialized */ },
 193 { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IP, OA_X, OA_X, OP_NP,
 194         OP_NODEFAULT, sizeof (struct group_source_req),
 195         {-1} /* not initialized */ },
 196 
 197 { IPV6_MULTICAST_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 198         sizeof (int), {0} },
 199 
 200 { IPV6_MULTICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 201         OP_DEF_FN, sizeof (int), {-1} /* not initialized */ },
 202 
 203 { IPV6_MULTICAST_LOOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 204         OP_DEF_FN, sizeof (int), {-1} /* not initialized */},
 205 
 206 { IPV6_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 207         sizeof (struct ipv6_mreq), {-1} /* not initialized */ },
 208 
 209 { IPV6_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP, OP_NODEFAULT,
 210         sizeof (struct ipv6_mreq), {-1} /* not initialized */ },
 211 
 212 { IPV6_UNICAST_HOPS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN,
 213         sizeof (int), {-1} /* not initialized */ },
 214 
 215 { IPV6_BOUND_IF, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 216         sizeof (int),   {0} /* no ifindex */ },
 217 
 218 { IPV6_UNSPEC_SRC, IPPROTO_IPV6, OA_R, OA_RW, OP_RAW, 0,
 219         sizeof (int), {0} },
 220 
 221 { IPV6_CHECKSUM, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
 222         {-1} },
 223 
 224 { ICMP6_FILTER, IPPROTO_ICMPV6, OA_RW, OA_RW, OP_NP, OP_DEF_FN|OP_VARLEN,
 225         sizeof (icmp6_filter_t), {0} },
 226 { IPV6_PKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 227         (OP_NODEFAULT|OP_VARLEN),
 228         sizeof (struct in6_pktinfo), {-1} /* not initialized */ },
 229 { IPV6_HOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 230         (OP_NODEFAULT|OP_VARLEN),
 231         sizeof (int), {-1} /* not initialized */ },
 232 { IPV6_NEXTHOP, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 233         (OP_NODEFAULT|OP_VARLEN),
 234         sizeof (sin6_t), {-1} /* not initialized */ },
 235 { IPV6_HOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 236         (OP_VARLEN|OP_NODEFAULT),
 237         MAX_EHDR_LEN, {-1} /* not initialized */ },
 238 { IPV6_DSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 239         (OP_VARLEN|OP_NODEFAULT),
 240         MAX_EHDR_LEN, {-1} /* not initialized */ },
 241 { IPV6_RTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 242         (OP_VARLEN|OP_NODEFAULT),
 243         MAX_EHDR_LEN, {-1} /* not initialized */ },
 244 { IPV6_RTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 245         (OP_VARLEN|OP_NODEFAULT),
 246         MAX_EHDR_LEN, {-1} /* not initialized */ },
 247 { IPV6_TCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP,
 248         (OP_NODEFAULT|OP_VARLEN),
 249         sizeof (int), {-1} /* not initialized */ },
 250 { IPV6_PATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 251         sizeof (struct ip6_mtuinfo), {-1} },
 252 { IPV6_DONTFRAG, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 253         sizeof (int), {0} },
 254 { IPV6_USE_MIN_MTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 255         sizeof (int), {0} },
 256 { IPV6_V6ONLY, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 257         sizeof (int), {0} },
 258 
 259 { IPV6_RECVPKTINFO, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 260         sizeof (int), {0} },
 261 { IPV6_RECVHOPLIMIT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 262         sizeof (int), {0} },
 263 { IPV6_RECVHOPOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 264         sizeof (int), {0} },
 265 { _OLD_IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 266         sizeof (int), {0} },
 267 { IPV6_RECVDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 268         sizeof (int), {0} },
 269 { IPV6_RECVRTHDR, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 270         sizeof (int), {0} },
 271 { IPV6_RECVRTHDRDSTOPTS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 272         sizeof (int), {0} },
 273 { IPV6_RECVPATHMTU, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 274         sizeof (int), {0} },
 275 { IPV6_RECVTCLASS, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 276         sizeof (int), {0} },
 277 
 278 { IPV6_SEC_OPT, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, OP_NODEFAULT,
 279         sizeof (ipsec_req_t), {-1} /* not initialized */ },
 280 { IPV6_SRC_PREFERENCES, IPPROTO_IPV6, OA_RW, OA_RW, OP_NP, 0,
 281         sizeof (uint32_t), {IPV6_PREFER_SRC_DEFAULT} },
 282 
 283 { MCAST_JOIN_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 284         OP_NODEFAULT, sizeof (struct group_req),
 285         {-1} /* not initialized */ },
 286 { MCAST_LEAVE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 287         OP_NODEFAULT, sizeof (struct group_req),
 288         {-1} /* not initialized */ },
 289 { MCAST_BLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 290         OP_NODEFAULT, sizeof (struct group_source_req),
 291         {-1} /* not initialized */ },
 292 { MCAST_UNBLOCK_SOURCE, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 293         OP_NODEFAULT, sizeof (struct group_source_req),
 294         {-1} /* not initialized */ },
 295 { MCAST_JOIN_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 296         OP_NODEFAULT, sizeof (struct group_source_req),
 297         {-1} /* not initialized */ },
 298 { MCAST_LEAVE_SOURCE_GROUP, IPPROTO_IPV6, OA_X, OA_X, OP_NP,
 299         OP_NODEFAULT, sizeof (struct group_source_req),
 300         {-1} /* not initialized */ },
 301 };
 302 
 303 /*
 304  * Table of all supported levels
 305  * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have
 306  * any supported options so we need this info separately.
 307  *
 308  * This is needed only for topmost tpi providers and is used only by
 309  * XTI interfaces.
 310  */
 311 optlevel_t      icmp_valid_levels_arr[] = {
 312         XTI_GENERIC,
 313         SOL_SOCKET,
 314         IPPROTO_ICMP,
 315         IPPROTO_IP,
 316         IPPROTO_IPV6,
 317         IPPROTO_ICMPV6
 318 };
 319 
 320 #define ICMP_VALID_LEVELS_CNT   A_CNT(icmp_valid_levels_arr)