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