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 /*
  23  * Functions related to TPI.
  24  */
  25 
  26 #include <sys/types.h>
  27 #include <sys/stream.h>
  28 #include <sys/strsun.h>
  29 #include <sys/strsubr.h>
  30 #include <sys/stropts.h>
  31 #include <sys/strlog.h>
  32 #define _SUN_TPI_VERSION 2
  33 #include <sys/tihdr.h>
  34 #include <sys/suntpi.h>
  35 #include <sys/xti_inet.h>
  36 #include <sys/squeue_impl.h>
  37 #include <sys/squeue.h>
  38 #include <sys/tsol/tnet.h>
  39 
  40 #include <inet/common.h>
  41 #include <inet/ip.h>
  42 
  43 #include <sys/cmn_err.h>
  44 
  45 #include "dccp_impl.h"
  46 
  47 /*
  48  * Helper function to generate TPI errors acks.
  49  */
  50 void
  51 dccp_err_ack(dccp_t *dccp, mblk_t *mp, int t_error, int sys_error)
  52 {
  53         if ((mp = mi_tpi_err_ack_alloc(mp, t_error, sys_error)) != NULL) {
  54                 putnext(dccp->dccp_connp->conn_rq, mp);
  55         }
  56 }
  57 
  58 void
  59 dccp_tpi_connect(dccp_t *dccp, mblk_t *mp)
  60 {
  61         struct T_conn_req       *tcr;
  62         conn_t  *connp = dccp->dccp_connp;
  63         sin_t   *sin;
  64         sin6_t  *sin6;
  65         cred_t  *cr;
  66         pid_t   cpid;
  67         int     error;
  68 
  69         cmn_err(CE_NOTE, "dccp_tpi.c: dccp_tpi_connect");
  70 
  71         cr = msg_getcred(mp, &cpid);
  72         ASSERT(cr != NULL);
  73         if (cr == NULL) {
  74                 dccp_err_ack(dccp, mp, TSYSERR, EINVAL);
  75                 return;
  76         }
  77 
  78         tcr = (struct T_conn_req *)mp->b_rptr;
  79 
  80         ASSERT((uintptr_t)(mp->b_wptr - mp->b_rptr) <= (uintptr_t)INT_MAX);
  81         if ((mp->b_wptr - mp->b_rptr) < sizeof (*tcr)) {
  82                 dccp_err_ack(dccp, mp, TPROTO, 0);
  83                 return;
  84         }
  85 
  86 }
  87 
  88 int
  89 dccp_tpi_close(queue_t *q, int flags)
  90 {
  91         return (0);
  92 }
  93 
  94 /*
  95  * Options related functions.
  96  */
  97 int
  98 dccp_tpi_opt_get(queue_t *q, int level, int name, uchar_t *ptr)
  99 {
 100         return (tcp_opt_get(Q_TO_CONN(q), level, name, ptr));
 101 }
 102 
 103 /* ARGSUSED */
 104 int
 105 dccp_tpi_opt_set(queue_t *q, uint_t optset_context, int level, int name,
 106     uint_t inlen, uchar_t *invalp, uint_t *outlenp, uchar_t *outvalp,
 107     void *thisdg_attrs, cred_t *cr)
 108 {
 109         conn_t  *connp =  Q_TO_CONN(q);
 110 
 111         return (tcp_opt_set(connp, optset_context, level, name, inlen, invalp,
 112             outlenp, outvalp, thisdg_attrs, cr));
 113 }