0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER START
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The contents of this file are subject to the terms of the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Common Development and Distribution License (the "License").
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You may not use this file except in compliance with the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * See the License for the specific language governing permissions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * and limitations under the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * When distributing Covered Code, include this CDDL HEADER in each
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * If applicable, add the following below this CDDL HEADER, with the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * fields enclosed by brackets "[]" replaced with your own identifying
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * information: Portions Copyright [yyyy] [name of copyright owner]
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER END
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Generation count
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_CONNID_LT(id1, id2) ((int64_t)((id1)-(id2)) < 0)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Socket protocol properties */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t sopp_rxhiwat; /* recv high water mark */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t sopp_rxlowat; /* recv low water mark */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t sopp_maxblk; /* maximum message block size */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ushort_t sopp_tail; /* space available at the end */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint_t sopp_rcvtimer; /* delayed recv notification (time) */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint32_t sopp_rcvthresh; /* delayed recv notification (bytes) */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t sopp_maxaddrlen; /* maximum size of protocol address */
081c0aa8fd8d801a6b12e7245814d260095dc103Anders Persson boolean_t sopp_loopback; /* loopback connection */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* flags to determine which socket options are set */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_WROFF 0x0001 /* set write offset */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_RCVHIWAT 0x0002 /* set read side high water */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_RCVLOWAT 0x0004 /* set read side high water */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_MAXBLK 0x0008 /* set maximum message block size */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_TAIL 0x0010 /* set the extra allocated space */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_ZCOPY 0x0020 /* set/unset zero copy for sendfile */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_MAXPSZ 0x0040 /* set maxpsz for protocols */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_OOBINLINE 0x0080 /* set oob inline processing */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_MAXADDRLEN 0x0400 /* set max address length */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_MINPSZ 0x0800 /* set minpsz for protocols */
081c0aa8fd8d801a6b12e7245814d260095dc103Anders Persson#define SOCKOPT_LOOPBACK 0x1000 /* set loopback */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define IS_SO_OOB_INLINE(so) ((so)->so_proto_props.sopp_oobinline)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct sock_downcalls_s sock_downcalls_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Upcall and downcall handle for sockfs and transport layer.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct __sock_upper_handle *sock_upper_handle_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct __sock_lower_handle *sock_lower_handle_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*sd_activate)(sock_lower_handle_t, sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_accept)(sock_lower_handle_t, sock_lower_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_bind)(sock_lower_handle_t, struct sockaddr *, socklen_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_listen)(sock_lower_handle_t, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_connect)(sock_lower_handle_t, const struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_getpeername)(sock_lower_handle_t, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_getsockname)(sock_lower_handle_t, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_getsockopt)(sock_lower_handle_t, int, int, void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_setsockopt)(sock_lower_handle_t, int, int, const void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_send)(sock_lower_handle_t, mblk_t *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_send_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_recv_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning short (*sd_poll)(sock_lower_handle_t, short, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_shutdown)(sock_lower_handle_t, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_ioctl)(sock_lower_handle_t, int, intptr_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_close)(sock_lower_handle_t, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef sock_lower_handle_t (*so_proto_create_func_t)(int, int, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_downcalls_t **, uint_t *, int *, int, cred_t *);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssontypedef mblk_t *(*so_proto_quiesced_cb_t)(sock_upper_handle_t,
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson sock_quiesce_arg_t *, struct T_capability_ack *, struct sockaddr *,
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson socklen_t, struct sockaddr *, socklen_t, short);
4117443759eb8485e3cfd93459f86a41ea241d20Anders Perssontypedef int (*so_proto_fallback_func_t)(sock_lower_handle_t, queue_t *,
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson boolean_t, so_proto_quiesced_cb_t, sock_quiesce_arg_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed * These functions return EOPNOTSUPP and are intended for the sockfs
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed * developer that doesn't wish to supply stubs for every function themselves.
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_accept_notsupp(sock_lower_handle_t, sock_lower_handle_t,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_bind_notsupp(sock_lower_handle_t, struct sockaddr *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_listen_notsupp(sock_lower_handle_t, int, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_connect_notsupp(sock_lower_handle_t,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed const struct sockaddr *, socklen_t, sock_connid_t *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_getpeername_notsupp(sock_lower_handle_t, struct sockaddr *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_getsockname_notsupp(sock_lower_handle_t, struct sockaddr *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_getsockopt_notsupp(sock_lower_handle_t, int, int, void *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_setsockopt_notsupp(sock_lower_handle_t, int, int,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_send_notsupp(sock_lower_handle_t, mblk_t *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_send_uio_notsupp(sock_lower_handle_t, uio_t *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_recv_uio_notsupp(sock_lower_handle_t, uio_t *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern short sock_poll_notsupp(sock_lower_handle_t, short, int, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_shutdown_notsupp(sock_lower_handle_t, int, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern void sock_clr_flowctrl_notsupp(sock_lower_handle_t);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_ioctl_notsupp(sock_lower_handle_t, int, intptr_t, int,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_close_notsupp(sock_lower_handle_t, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Upcalls and related information
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * su_opctl() actions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_upper_handle_t (*su_newconn)(sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_lower_handle_t, sock_downcalls_t *, cred_t *, pid_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_connected)(sock_upper_handle_t, sock_connid_t, cred_t *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*su_disconnected)(sock_upper_handle_t, sock_connid_t, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_opctl)(sock_upper_handle_t, sock_opctl_action_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t (*su_recv)(sock_upper_handle_t, mblk_t *, size_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_set_proto_props)(sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_txq_full)(sock_upper_handle_t, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_signal_oob)(sock_upper_handle_t, ssize_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_set_error)(sock_upper_handle_t, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_DC_VERSION sizeof (sock_downcalls_t)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif /* _KERNEL */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif /* _SYS_SOCKET_PROTO_H_ */