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