1*8348SEric.Yu@Sun.COM /* 2*8348SEric.Yu@Sun.COM * CDDL HEADER START 3*8348SEric.Yu@Sun.COM * 4*8348SEric.Yu@Sun.COM * The contents of this file are subject to the terms of the 5*8348SEric.Yu@Sun.COM * Common Development and Distribution License (the "License"). 6*8348SEric.Yu@Sun.COM * You may not use this file except in compliance with the License. 7*8348SEric.Yu@Sun.COM * 8*8348SEric.Yu@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*8348SEric.Yu@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*8348SEric.Yu@Sun.COM * See the License for the specific language governing permissions 11*8348SEric.Yu@Sun.COM * and limitations under the License. 12*8348SEric.Yu@Sun.COM * 13*8348SEric.Yu@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*8348SEric.Yu@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*8348SEric.Yu@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*8348SEric.Yu@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*8348SEric.Yu@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*8348SEric.Yu@Sun.COM * 19*8348SEric.Yu@Sun.COM * CDDL HEADER END 20*8348SEric.Yu@Sun.COM */ 21*8348SEric.Yu@Sun.COM /* 22*8348SEric.Yu@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23*8348SEric.Yu@Sun.COM * Use is subject to license terms. 24*8348SEric.Yu@Sun.COM */ 25*8348SEric.Yu@Sun.COM 26*8348SEric.Yu@Sun.COM #ifndef _SYS_SOCKET_PROTO_H_ 27*8348SEric.Yu@Sun.COM #define _SYS_SOCKET_PROTO_H_ 28*8348SEric.Yu@Sun.COM 29*8348SEric.Yu@Sun.COM #ifdef __cplusplus 30*8348SEric.Yu@Sun.COM extern "C" { 31*8348SEric.Yu@Sun.COM #endif 32*8348SEric.Yu@Sun.COM 33*8348SEric.Yu@Sun.COM #include <sys/socket.h> 34*8348SEric.Yu@Sun.COM 35*8348SEric.Yu@Sun.COM /* 36*8348SEric.Yu@Sun.COM * Generation count 37*8348SEric.Yu@Sun.COM */ 38*8348SEric.Yu@Sun.COM typedef uint64_t sock_connid_t; 39*8348SEric.Yu@Sun.COM 40*8348SEric.Yu@Sun.COM #define SOCK_CONNID_INIT(id) { \ 41*8348SEric.Yu@Sun.COM (id) = 0; \ 42*8348SEric.Yu@Sun.COM } 43*8348SEric.Yu@Sun.COM #define SOCK_CONNID_BUMP(id) (++(id)) 44*8348SEric.Yu@Sun.COM #define SOCK_CONNID_LT(id1, id2) ((int64_t)((id1)-(id2)) < 0) 45*8348SEric.Yu@Sun.COM 46*8348SEric.Yu@Sun.COM /* Socket protocol properties */ 47*8348SEric.Yu@Sun.COM struct sock_proto_props { 48*8348SEric.Yu@Sun.COM uint_t sopp_flags; /* options to set */ 49*8348SEric.Yu@Sun.COM ushort_t sopp_wroff; /* write offset */ 50*8348SEric.Yu@Sun.COM ssize_t sopp_txhiwat; /* tx hi water mark */ 51*8348SEric.Yu@Sun.COM ssize_t sopp_txlowat; /* tx lo water mark */ 52*8348SEric.Yu@Sun.COM ssize_t sopp_rxhiwat; /* recv high water mark */ 53*8348SEric.Yu@Sun.COM ssize_t sopp_rxlowat; /* recv low water mark */ 54*8348SEric.Yu@Sun.COM ssize_t sopp_maxblk; /* maximum message block size */ 55*8348SEric.Yu@Sun.COM ssize_t sopp_maxpsz; /* maximum packet size */ 56*8348SEric.Yu@Sun.COM ssize_t sopp_minpsz; /* minimum packet size */ 57*8348SEric.Yu@Sun.COM ushort_t sopp_tail; /* space available at the end */ 58*8348SEric.Yu@Sun.COM uint_t sopp_zcopyflag; /* zero copy flag */ 59*8348SEric.Yu@Sun.COM boolean_t sopp_oobinline; /* OOB inline */ 60*8348SEric.Yu@Sun.COM uint_t sopp_rcvtimer; /* delayed recv notification (time) */ 61*8348SEric.Yu@Sun.COM uint32_t sopp_rcvthresh; /* delayed recv notification (bytes) */ 62*8348SEric.Yu@Sun.COM socklen_t sopp_maxaddrlen; /* maximum size of protocol address */ 63*8348SEric.Yu@Sun.COM }; 64*8348SEric.Yu@Sun.COM 65*8348SEric.Yu@Sun.COM /* flags to determine which socket options are set */ 66*8348SEric.Yu@Sun.COM #define SOCKOPT_WROFF 0x0001 /* set write offset */ 67*8348SEric.Yu@Sun.COM #define SOCKOPT_RCVHIWAT 0x0002 /* set read side high water */ 68*8348SEric.Yu@Sun.COM #define SOCKOPT_RCVLOWAT 0x0004 /* set read side high water */ 69*8348SEric.Yu@Sun.COM #define SOCKOPT_MAXBLK 0x0008 /* set maximum message block size */ 70*8348SEric.Yu@Sun.COM #define SOCKOPT_TAIL 0x0010 /* set the extra allocated space */ 71*8348SEric.Yu@Sun.COM #define SOCKOPT_ZCOPY 0x0020 /* set/unset zero copy for sendfile */ 72*8348SEric.Yu@Sun.COM #define SOCKOPT_MAXPSZ 0x0040 /* set maxpsz for protocols */ 73*8348SEric.Yu@Sun.COM #define SOCKOPT_OOBINLINE 0x0080 /* set oob inline processing */ 74*8348SEric.Yu@Sun.COM #define SOCKOPT_RCVTIMER 0x0100 75*8348SEric.Yu@Sun.COM #define SOCKOPT_RCVTHRESH 0x0200 76*8348SEric.Yu@Sun.COM #define SOCKOPT_MAXADDRLEN 0x0400 /* set max address length */ 77*8348SEric.Yu@Sun.COM #define SOCKOPT_MINPSZ 0x0800 /* set minpsz for protocols */ 78*8348SEric.Yu@Sun.COM 79*8348SEric.Yu@Sun.COM #define IS_SO_OOB_INLINE(so) ((so)->so_proto_props.sopp_oobinline) 80*8348SEric.Yu@Sun.COM 81*8348SEric.Yu@Sun.COM #ifdef _KERNEL 82*8348SEric.Yu@Sun.COM 83*8348SEric.Yu@Sun.COM struct T_capability_ack; 84*8348SEric.Yu@Sun.COM 85*8348SEric.Yu@Sun.COM typedef struct sock_upcalls_s sock_upcalls_t; 86*8348SEric.Yu@Sun.COM typedef struct sock_downcalls_s sock_downcalls_t; 87*8348SEric.Yu@Sun.COM 88*8348SEric.Yu@Sun.COM /* 89*8348SEric.Yu@Sun.COM * Upcall and downcall handle for sockfs and transport layer. 90*8348SEric.Yu@Sun.COM */ 91*8348SEric.Yu@Sun.COM typedef struct __sock_upper_handle *sock_upper_handle_t; 92*8348SEric.Yu@Sun.COM typedef struct __sock_lower_handle *sock_lower_handle_t; 93*8348SEric.Yu@Sun.COM 94*8348SEric.Yu@Sun.COM struct sock_downcalls_s { 95*8348SEric.Yu@Sun.COM void (*sd_activate)(sock_lower_handle_t, sock_upper_handle_t, 96*8348SEric.Yu@Sun.COM sock_upcalls_t *, int, cred_t *); 97*8348SEric.Yu@Sun.COM int (*sd_accept)(sock_lower_handle_t, sock_lower_handle_t, 98*8348SEric.Yu@Sun.COM sock_upper_handle_t, cred_t *); 99*8348SEric.Yu@Sun.COM int (*sd_bind)(sock_lower_handle_t, struct sockaddr *, socklen_t, 100*8348SEric.Yu@Sun.COM cred_t *); 101*8348SEric.Yu@Sun.COM int (*sd_listen)(sock_lower_handle_t, int, cred_t *); 102*8348SEric.Yu@Sun.COM int (*sd_connect)(sock_lower_handle_t, const struct sockaddr *, 103*8348SEric.Yu@Sun.COM socklen_t, sock_connid_t *, cred_t *); 104*8348SEric.Yu@Sun.COM int (*sd_getpeername)(sock_lower_handle_t, struct sockaddr *, 105*8348SEric.Yu@Sun.COM socklen_t *, cred_t *); 106*8348SEric.Yu@Sun.COM int (*sd_getsockname)(sock_lower_handle_t, struct sockaddr *, 107*8348SEric.Yu@Sun.COM socklen_t *, cred_t *); 108*8348SEric.Yu@Sun.COM int (*sd_getsockopt)(sock_lower_handle_t, int, int, void *, 109*8348SEric.Yu@Sun.COM socklen_t *, cred_t *); 110*8348SEric.Yu@Sun.COM int (*sd_setsockopt)(sock_lower_handle_t, int, int, const void *, 111*8348SEric.Yu@Sun.COM socklen_t, cred_t *); 112*8348SEric.Yu@Sun.COM int (*sd_send)(sock_lower_handle_t, mblk_t *, struct nmsghdr *, 113*8348SEric.Yu@Sun.COM cred_t *); 114*8348SEric.Yu@Sun.COM int (*sd_send_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *, 115*8348SEric.Yu@Sun.COM cred_t *); 116*8348SEric.Yu@Sun.COM int (*sd_recv_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *, 117*8348SEric.Yu@Sun.COM cred_t *); 118*8348SEric.Yu@Sun.COM short (*sd_poll)(sock_lower_handle_t, short, int, cred_t *); 119*8348SEric.Yu@Sun.COM int (*sd_shutdown)(sock_lower_handle_t, int, cred_t *); 120*8348SEric.Yu@Sun.COM void (*sd_clr_flowctrl)(sock_lower_handle_t); 121*8348SEric.Yu@Sun.COM int (*sd_ioctl)(sock_lower_handle_t, int, intptr_t, int, 122*8348SEric.Yu@Sun.COM int32_t *, cred_t *); 123*8348SEric.Yu@Sun.COM int (*sd_close)(sock_lower_handle_t, int, cred_t *); 124*8348SEric.Yu@Sun.COM }; 125*8348SEric.Yu@Sun.COM 126*8348SEric.Yu@Sun.COM typedef sock_lower_handle_t (*so_proto_create_func_t)(int, int, int, 127*8348SEric.Yu@Sun.COM sock_downcalls_t **, uint_t *, int *, int, cred_t *); 128*8348SEric.Yu@Sun.COM 129*8348SEric.Yu@Sun.COM typedef void (*so_proto_quiesced_cb_t)(sock_upper_handle_t, queue_t *, 130*8348SEric.Yu@Sun.COM struct T_capability_ack *, struct sockaddr *, socklen_t, 131*8348SEric.Yu@Sun.COM struct sockaddr *, socklen_t, short); 132*8348SEric.Yu@Sun.COM typedef void (*so_proto_fallback_func_t)(sock_lower_handle_t, queue_t *, 133*8348SEric.Yu@Sun.COM boolean_t, so_proto_quiesced_cb_t); 134*8348SEric.Yu@Sun.COM 135*8348SEric.Yu@Sun.COM /* 136*8348SEric.Yu@Sun.COM * Upcalls and related information 137*8348SEric.Yu@Sun.COM */ 138*8348SEric.Yu@Sun.COM 139*8348SEric.Yu@Sun.COM /* 140*8348SEric.Yu@Sun.COM * su_opctl() actions 141*8348SEric.Yu@Sun.COM */ 142*8348SEric.Yu@Sun.COM typedef enum sock_opctl_action { 143*8348SEric.Yu@Sun.COM SOCK_OPCTL_ENAB_ACCEPT = 0, 144*8348SEric.Yu@Sun.COM SOCK_OPCTL_SHUT_SEND, 145*8348SEric.Yu@Sun.COM SOCK_OPCTL_SHUT_RECV 146*8348SEric.Yu@Sun.COM } sock_opctl_action_t; 147*8348SEric.Yu@Sun.COM 148*8348SEric.Yu@Sun.COM struct sock_upcalls_s { 149*8348SEric.Yu@Sun.COM sock_upper_handle_t (*su_newconn)(sock_upper_handle_t, 150*8348SEric.Yu@Sun.COM sock_lower_handle_t, sock_downcalls_t *, cred_t *, pid_t, 151*8348SEric.Yu@Sun.COM sock_upcalls_t **); 152*8348SEric.Yu@Sun.COM void (*su_connected)(sock_upper_handle_t, sock_connid_t, cred_t *, 153*8348SEric.Yu@Sun.COM pid_t); 154*8348SEric.Yu@Sun.COM int (*su_disconnected)(sock_upper_handle_t, sock_connid_t, int); 155*8348SEric.Yu@Sun.COM void (*su_opctl)(sock_upper_handle_t, sock_opctl_action_t, 156*8348SEric.Yu@Sun.COM uintptr_t); 157*8348SEric.Yu@Sun.COM ssize_t (*su_recv)(sock_upper_handle_t, mblk_t *, size_t, int, 158*8348SEric.Yu@Sun.COM int *, boolean_t *); 159*8348SEric.Yu@Sun.COM void (*su_set_proto_props)(sock_upper_handle_t, 160*8348SEric.Yu@Sun.COM struct sock_proto_props *); 161*8348SEric.Yu@Sun.COM void (*su_txq_full)(sock_upper_handle_t, boolean_t); 162*8348SEric.Yu@Sun.COM void (*su_signal_oob)(sock_upper_handle_t, ssize_t); 163*8348SEric.Yu@Sun.COM void (*su_zcopy_notify)(sock_upper_handle_t); 164*8348SEric.Yu@Sun.COM void (*su_set_error)(sock_upper_handle_t, int); 165*8348SEric.Yu@Sun.COM }; 166*8348SEric.Yu@Sun.COM 167*8348SEric.Yu@Sun.COM #define SOCK_UC_VERSION sizeof (sock_upcalls_t) 168*8348SEric.Yu@Sun.COM #define SOCK_DC_VERSION sizeof (sock_downcalls_t) 169*8348SEric.Yu@Sun.COM 170*8348SEric.Yu@Sun.COM #define SOCKET_RECVHIWATER (48 * 1024) 171*8348SEric.Yu@Sun.COM #define SOCKET_RECVLOWATER 1024 172*8348SEric.Yu@Sun.COM 173*8348SEric.Yu@Sun.COM #define SOCKET_NO_RCVTIMER 0 174*8348SEric.Yu@Sun.COM #define SOCKET_TIMER_INTERVAL 50 175*8348SEric.Yu@Sun.COM 176*8348SEric.Yu@Sun.COM #endif /* _KERNEL */ 177*8348SEric.Yu@Sun.COM 178*8348SEric.Yu@Sun.COM #ifdef __cplusplus 179*8348SEric.Yu@Sun.COM } 180*8348SEric.Yu@Sun.COM #endif 181*8348SEric.Yu@Sun.COM 182*8348SEric.Yu@Sun.COM #endif /* _SYS_SOCKET_PROTO_H_ */ 183