1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 #include <sys/types.h>
  27 #include <sys/stream.h>
  28 #define _SUN_TPI_VERSION 2
  29 #include <sys/tihdr.h>
  30 #include <sys/socket.h>
  31 #include <sys/xti_xtiopt.h>
  32 
  33 #include <inet/common.h>
  34 #include <netinet/ip6.h>
  35 #include <inet/ip.h>
  36 
  37 #include <netinet/in.h>
  38 #include <netinet/tcp.h>
  39 #include <netinet/ip_mroute.h>
  40 #include <inet/optcom.h>
  41 #include <inet/rts_impl.h>
  42 
  43 #include <inet/rts_impl.h>
  44 /*
  45  * Table of all known options handled on a RTS protocol stack.
  46  *
  47  * Note: This table contains options processed by both RTS and IP levels
  48  *       and is the superset of options that can be performed on a RTS over IP
  49  *       stack.
  50  */
  51 opdes_t rts_opt_arr[] = {
  52 
  53 { SO_DEBUG,     SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  54 { SO_DONTROUTE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  55 { SO_USELOOPBACK, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int),
  56         0 },
  57 { SO_BROADCAST, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  58 { SO_REUSEADDR, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  59 { SO_TYPE,      SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
  60 { SO_SNDBUF,    SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  61 { SO_RCVBUF,    SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  62 { SO_SNDTIMEO,  SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
  63         sizeof (struct timeval), 0 },
  64 { SO_RCVTIMEO,  SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0,
  65         sizeof (struct timeval), 0 },
  66 { SO_PROTOTYPE, SOL_SOCKET, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  67 { SO_DOMAIN,    SOL_SOCKET, OA_R, OA_R, OP_NP, 0, sizeof (int), 0 },
  68 { RT_AWARE,     SOL_ROUTE, OA_RW, OA_RW, OP_NP, 0, sizeof (int), 0 },
  69 };
  70 
  71 /*
  72  * Table of all supported levels
  73  * Note: Some levels (e.g. XTI_GENERIC) may be valid but may not have
  74  * any supported options so we need this info separately.
  75  *
  76  * This is needed only for topmost tpi providers and is used only by
  77  * XTI interfaces.
  78  */
  79 optlevel_t      rts_valid_levels_arr[] = {
  80         XTI_GENERIC,
  81         SOL_SOCKET,
  82         IPPROTO_IP,
  83         IPPROTO_IPV6
  84 };
  85 
  86 #define RTS_VALID_LEVELS_CNT    A_CNT(rts_valid_levels_arr)
  87 
  88 #define RTS_OPT_ARR_CNT         A_CNT(rts_opt_arr)
  89 
  90 uint_t rts_max_optsize; /* initialized in _init() */
  91 
  92 /*
  93  * Intialize option database object for RTS
  94  *
  95  * This object represents database of options to search passed to
  96  * {sock,tpi}optcom_req() interface routine to take care of option
  97  * management and associated methods.
  98  */
  99 
 100 optdb_obj_t rts_opt_obj = {
 101         rts_opt_default,        /* RTS default value function pointer */
 102         rts_tpi_opt_get,        /* RTS get function pointer */
 103         rts_tpi_opt_set,        /* RTS set function pointer */
 104         RTS_OPT_ARR_CNT,        /* RTS option database count of entries */
 105         rts_opt_arr,            /* RTS option database */
 106         RTS_VALID_LEVELS_CNT,   /* RTS valid level count of entries */
 107         rts_valid_levels_arr    /* RTS valid level array */
 108 };