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 (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  23  */
  24 
  25 #ifndef _SYS_SOCKET_PROTO_H_
  26 #define _SYS_SOCKET_PROTO_H_
  27 
  28 #ifdef  __cplusplus
  29 extern "C" {
  30 #endif
  31 
  32 #include <sys/socket.h>
  33 #include <sys/pidnode.h>
  34 
  35 /*
  36  * Generation count
  37  */
  38 typedef uint64_t sock_connid_t;
  39 
  40 #define SOCK_CONNID_INIT(id) {  \
  41         (id) = 0;               \
  42 }
  43 #define SOCK_CONNID_BUMP(id)            (++(id))
  44 #define SOCK_CONNID_LT(id1, id2)        ((int64_t)((id1)-(id2)) < 0)
  45 
  46 /* Socket protocol properties */
  47 struct sock_proto_props {
  48         uint_t sopp_flags;              /* options to set */
  49         ushort_t sopp_wroff;            /* write offset */
  50         ssize_t sopp_txhiwat;           /* tx hi water mark */
  51         ssize_t sopp_txlowat;           /* tx lo water mark */
  52         ssize_t sopp_rxhiwat;           /* recv high water mark */
  53         ssize_t sopp_rxlowat;           /* recv low water mark */
  54         ssize_t sopp_maxblk;            /* maximum message block size */
  55         ssize_t sopp_maxpsz;            /* maximum packet size */
  56         ssize_t sopp_minpsz;            /* minimum packet size */
  57         ushort_t sopp_tail;             /* space available at the end */
  58         uint_t  sopp_zcopyflag;         /* zero copy flag */
  59         boolean_t sopp_oobinline;       /* OOB inline */
  60         uint_t sopp_rcvtimer;           /* delayed recv notification (time) */
  61         uint32_t sopp_rcvthresh;        /* delayed recv notification (bytes) */
  62         socklen_t sopp_maxaddrlen;      /* maximum size of protocol address */
  63         boolean_t sopp_loopback;        /* loopback connection */
  64 };
  65 
  66 /* flags to determine which socket options are set */
  67 #define SOCKOPT_WROFF           0x0001  /* set write offset */
  68 #define SOCKOPT_RCVHIWAT        0x0002  /* set read side high water */
  69 #define SOCKOPT_RCVLOWAT        0x0004  /* set read side high water */
  70 #define SOCKOPT_MAXBLK          0x0008  /* set maximum message block size */
  71 #define SOCKOPT_TAIL            0x0010  /* set the extra allocated space */
  72 #define SOCKOPT_ZCOPY           0x0020  /* set/unset zero copy for sendfile */
  73 #define SOCKOPT_MAXPSZ          0x0040  /* set maxpsz for protocols */
  74 #define SOCKOPT_OOBINLINE       0x0080  /* set oob inline processing */
  75 #define SOCKOPT_RCVTIMER        0x0100
  76 #define SOCKOPT_RCVTHRESH       0x0200
  77 #define SOCKOPT_MAXADDRLEN      0x0400  /* set max address length */
  78 #define SOCKOPT_MINPSZ          0x0800  /* set minpsz for protocols */
  79 #define SOCKOPT_LOOPBACK        0x1000  /* set loopback */
  80 
  81 #define IS_SO_OOB_INLINE(so)    ((so)->so_proto_props.sopp_oobinline)
  82 
  83 #ifdef _KERNEL
  84 
  85 struct T_capability_ack;
  86 
  87 typedef struct sock_upcalls_s sock_upcalls_t;
  88 typedef struct sock_downcalls_s sock_downcalls_t;
  89 
  90 /*
  91  * Upcall and downcall handle for sockfs and transport layer.
  92  */
  93 typedef struct __sock_upper_handle *sock_upper_handle_t;
  94 typedef struct __sock_lower_handle *sock_lower_handle_t;
  95 
  96 struct sock_downcalls_s {
  97         void    (*sd_activate)(sock_lower_handle_t, sock_upper_handle_t,
  98                     sock_upcalls_t *, int, cred_t *);
  99         int     (*sd_accept)(sock_lower_handle_t, sock_lower_handle_t,
 100                     sock_upper_handle_t, cred_t *);
 101         int     (*sd_bind)(sock_lower_handle_t, struct sockaddr *, socklen_t,
 102                     cred_t *);
 103         int     (*sd_listen)(sock_lower_handle_t, int, cred_t *);
 104         int     (*sd_connect)(sock_lower_handle_t, const struct sockaddr *,
 105                     socklen_t, sock_connid_t *, cred_t *);
 106         int     (*sd_getpeername)(sock_lower_handle_t, struct sockaddr *,
 107                     socklen_t *, cred_t *);
 108         int     (*sd_getsockname)(sock_lower_handle_t, struct sockaddr *,
 109                     socklen_t *, cred_t *);
 110         int     (*sd_getsockopt)(sock_lower_handle_t, int, int, void *,
 111                     socklen_t *, cred_t *);
 112         int     (*sd_setsockopt)(sock_lower_handle_t, int, int, const void *,
 113                     socklen_t, cred_t *);
 114         int     (*sd_send)(sock_lower_handle_t, mblk_t *, struct nmsghdr *,
 115                     cred_t *);
 116         int     (*sd_send_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *,
 117                     cred_t *);
 118         int     (*sd_recv_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *,
 119                     cred_t *);
 120         short   (*sd_poll)(sock_lower_handle_t, short, int, cred_t *);
 121         int     (*sd_shutdown)(sock_lower_handle_t, int, cred_t *);
 122         void    (*sd_clr_flowctrl)(sock_lower_handle_t);
 123         int     (*sd_ioctl)(sock_lower_handle_t, int, intptr_t, int,
 124                     int32_t *, cred_t *);
 125         int     (*sd_close)(sock_lower_handle_t, int, cred_t *);
 126 };
 127 
 128 typedef sock_lower_handle_t (*so_proto_create_func_t)(int, int, int,
 129     sock_downcalls_t **, uint_t *, int *, int, cred_t *);
 130 
 131 typedef struct sock_quiesce_arg {
 132         mblk_t *soqa_exdata_mp;
 133         mblk_t *soqa_urgmark_mp;
 134 } sock_quiesce_arg_t;
 135 typedef mblk_t *(*so_proto_quiesced_cb_t)(sock_upper_handle_t,
 136     sock_quiesce_arg_t *, struct T_capability_ack *, struct sockaddr *,
 137     socklen_t, struct sockaddr *, socklen_t, short);
 138 typedef int (*so_proto_fallback_func_t)(sock_lower_handle_t, queue_t *,
 139     boolean_t, so_proto_quiesced_cb_t, sock_quiesce_arg_t *);
 140 
 141 /*
 142  * These functions return EOPNOTSUPP and are intended for the sockfs
 143  * developer that doesn't wish to supply stubs for every function themselves.
 144  */
 145 extern int sock_accept_notsupp(sock_lower_handle_t, sock_lower_handle_t,
 146     sock_upper_handle_t, cred_t *);
 147 extern int sock_bind_notsupp(sock_lower_handle_t, struct sockaddr *,
 148     socklen_t, cred_t *);
 149 extern int sock_listen_notsupp(sock_lower_handle_t, int, cred_t *);
 150 extern int sock_connect_notsupp(sock_lower_handle_t,
 151     const struct sockaddr *, socklen_t, sock_connid_t *, cred_t *);
 152 extern int sock_getpeername_notsupp(sock_lower_handle_t, struct sockaddr *,
 153     socklen_t *, cred_t *);
 154 extern int sock_getsockname_notsupp(sock_lower_handle_t, struct sockaddr *,
 155     socklen_t *, cred_t *);
 156 extern int sock_getsockopt_notsupp(sock_lower_handle_t, int, int, void *,
 157     socklen_t *, cred_t *);
 158 extern int sock_setsockopt_notsupp(sock_lower_handle_t, int, int,
 159     const void *, socklen_t, cred_t *);
 160 extern int sock_send_notsupp(sock_lower_handle_t, mblk_t *,
 161     struct nmsghdr *, cred_t *);
 162 extern int sock_send_uio_notsupp(sock_lower_handle_t, uio_t *,
 163     struct nmsghdr *, cred_t *);
 164 extern int sock_recv_uio_notsupp(sock_lower_handle_t, uio_t *,
 165     struct nmsghdr *, cred_t *);
 166 extern short sock_poll_notsupp(sock_lower_handle_t, short, int, cred_t *);
 167 extern int sock_shutdown_notsupp(sock_lower_handle_t, int, cred_t *);
 168 extern void sock_clr_flowctrl_notsupp(sock_lower_handle_t);
 169 extern int sock_ioctl_notsupp(sock_lower_handle_t, int, intptr_t, int,
 170     int32_t *, cred_t *);
 171 extern int sock_close_notsupp(sock_lower_handle_t, int, cred_t *);
 172 
 173 /*
 174  * Upcalls and related information
 175  */
 176 
 177 /*
 178  * su_opctl() actions
 179  */
 180 typedef enum sock_opctl_action {
 181         SOCK_OPCTL_ENAB_ACCEPT = 0,
 182         SOCK_OPCTL_SHUT_SEND,
 183         SOCK_OPCTL_SHUT_RECV
 184 } sock_opctl_action_t;
 185 
 186 struct sock_upcalls_s {
 187         sock_upper_handle_t (*su_newconn)(sock_upper_handle_t,
 188             sock_lower_handle_t, sock_downcalls_t *, cred_t *, pid_t,
 189             sock_upcalls_t **);
 190         void    (*su_connected)(sock_upper_handle_t, sock_connid_t, cred_t *,
 191             pid_t);
 192         int     (*su_disconnected)(sock_upper_handle_t, sock_connid_t, int);
 193         void    (*su_opctl)(sock_upper_handle_t, sock_opctl_action_t,
 194             uintptr_t);
 195         ssize_t (*su_recv)(sock_upper_handle_t, mblk_t *, size_t, int,
 196                     int *, boolean_t *);
 197         void    (*su_set_proto_props)(sock_upper_handle_t,
 198                     struct sock_proto_props *);
 199         void    (*su_txq_full)(sock_upper_handle_t, boolean_t);
 200         void    (*su_signal_oob)(sock_upper_handle_t, ssize_t);
 201         void    (*su_zcopy_notify)(sock_upper_handle_t);
 202         void    (*su_set_error)(sock_upper_handle_t, int);
 203         void    (*su_closed)(sock_upper_handle_t);
 204         mblk_t *        (*su_get_sock_pid_mblk)(sock_upper_handle_t);
 205 };
 206 
 207 #define SOCK_UC_VERSION         sizeof (sock_upcalls_t)
 208 #define SOCK_DC_VERSION         sizeof (sock_downcalls_t)
 209 
 210 #define SOCKET_RECVHIWATER      (48 * 1024)
 211 #define SOCKET_RECVLOWATER      1024
 212 
 213 #define SOCKET_NO_RCVTIMER      0
 214 #define SOCKET_TIMER_INTERVAL   50
 215 
 216 #endif /* _KERNEL */
 217 
 218 #ifdef  __cplusplus
 219 }
 220 #endif
 221 
 222 #endif /* _SYS_SOCKET_PROTO_H_ */