0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER START
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
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 *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * or http://www.opensolaris.org/os/licensing.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * See the License for the specific language governing permissions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * and limitations under the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
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 *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER END
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifndef _SYS_SOCKET_PROTO_H_
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define _SYS_SOCKET_PROTO_H_
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef __cplusplus
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern "C" {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#include <sys/socket.h>
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Generation count
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef uint64_t sock_connid_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_CONNID_INIT(id) { \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning (id) = 0; \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning}
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_CONNID_BUMP(id) (++(id))
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_CONNID_LT(id1, id2) ((int64_t)((id1)-(id2)) < 0)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Socket protocol properties */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct sock_proto_props {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint_t sopp_flags; /* options to set */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ushort_t sopp_wroff; /* write offset */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t sopp_txhiwat; /* tx hi water mark */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t sopp_txlowat; /* tx lo water mark */
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 ssize_t sopp_maxpsz; /* maximum packet size */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t sopp_minpsz; /* minimum packet size */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ushort_t sopp_tail; /* space available at the end */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning uint_t sopp_zcopyflag; /* zero copy flag */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning boolean_t sopp_oobinline; /* OOB inline */
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};
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
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_RCVTIMER 0x0100
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKOPT_RCVTHRESH 0x0200
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
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define IS_SO_OOB_INLINE(so) ((so)->so_proto_props.sopp_oobinline)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef _KERNEL
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct T_capability_ack;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct sock_upcalls_s sock_upcalls_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct sock_downcalls_s sock_downcalls_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Upcall and downcall handle for sockfs and transport layer.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct __sock_upper_handle *sock_upper_handle_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef struct __sock_lower_handle *sock_lower_handle_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct sock_downcalls_s {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*sd_activate)(sock_lower_handle_t, sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_upcalls_t *, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_accept)(sock_lower_handle_t, sock_lower_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_upper_handle_t, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_bind)(sock_lower_handle_t, struct sockaddr *, socklen_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning cred_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 socklen_t, sock_connid_t *, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_getpeername)(sock_lower_handle_t, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_getsockname)(sock_lower_handle_t, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_getsockopt)(sock_lower_handle_t, int, int, void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_setsockopt)(sock_lower_handle_t, int, int, const void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_send)(sock_lower_handle_t, mblk_t *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_send_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_recv_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning cred_t *);
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 void (*sd_clr_flowctrl)(sock_lower_handle_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_ioctl)(sock_lower_handle_t, int, intptr_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int32_t *, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int (*sd_close)(sock_lower_handle_t, int, cred_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning};
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
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 *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssontypedef struct sock_quiesce_arg {
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson mblk_t *soqa_exdata_mp;
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson mblk_t *soqa_urgmark_mp;
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson} sock_quiesce_arg_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 *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed/*
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 Reed */
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_accept_notsupp(sock_lower_handle_t, sock_lower_handle_t,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed sock_upper_handle_t, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_bind_notsupp(sock_lower_handle_t, struct sockaddr *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed socklen_t, cred_t *);
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 Reed socklen_t *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_getsockname_notsupp(sock_lower_handle_t, struct sockaddr *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed socklen_t *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_getsockopt_notsupp(sock_lower_handle_t, int, int, void *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed socklen_t *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_setsockopt_notsupp(sock_lower_handle_t, int, int,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed const void *, socklen_t, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_send_notsupp(sock_lower_handle_t, mblk_t *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed struct nmsghdr *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_send_uio_notsupp(sock_lower_handle_t, uio_t *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed struct nmsghdr *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_recv_uio_notsupp(sock_lower_handle_t, uio_t *,
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed struct nmsghdr *, cred_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 Reed int32_t *, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reedextern int sock_close_notsupp(sock_lower_handle_t, int, cred_t *);
0a0e9771ca0211c15f3ac4466b661c145feeb9e4Darren Reed
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Upcalls and related information
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * su_opctl() actions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningtypedef enum sock_opctl_action {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning SOCK_OPCTL_ENAB_ACCEPT = 0,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning SOCK_OPCTL_SHUT_SEND,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning SOCK_OPCTL_SHUT_RECV
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning} sock_opctl_action_t;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct sock_upcalls_s {
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 sock_upcalls_t **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_connected)(sock_upper_handle_t, sock_connid_t, cred_t *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning pid_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 uintptr_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ssize_t (*su_recv)(sock_upper_handle_t, mblk_t *, size_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int *, boolean_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_set_proto_props)(sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sock_proto_props *);
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_zcopy_notify)(sock_upper_handle_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning void (*su_set_error)(sock_upper_handle_t, int);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson void (*su_closed)(sock_upper_handle_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning};
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_UC_VERSION sizeof (sock_upcalls_t)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCK_DC_VERSION sizeof (sock_downcalls_t)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKET_RECVHIWATER (48 * 1024)
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKET_RECVLOWATER 1024
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKET_NO_RCVTIMER 0
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKET_TIMER_INTERVAL 50
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif /* _KERNEL */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef __cplusplus
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning}
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif /* _SYS_SOCKET_PROTO_H_ */