18348SEric.Yu@Sun.COM /* 28348SEric.Yu@Sun.COM * CDDL HEADER START 38348SEric.Yu@Sun.COM * 48348SEric.Yu@Sun.COM * The contents of this file are subject to the terms of the 58348SEric.Yu@Sun.COM * Common Development and Distribution License (the "License"). 68348SEric.Yu@Sun.COM * You may not use this file except in compliance with the License. 78348SEric.Yu@Sun.COM * 88348SEric.Yu@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 98348SEric.Yu@Sun.COM * or http://www.opensolaris.org/os/licensing. 108348SEric.Yu@Sun.COM * See the License for the specific language governing permissions 118348SEric.Yu@Sun.COM * and limitations under the License. 128348SEric.Yu@Sun.COM * 138348SEric.Yu@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 148348SEric.Yu@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 158348SEric.Yu@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 168348SEric.Yu@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 178348SEric.Yu@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 188348SEric.Yu@Sun.COM * 198348SEric.Yu@Sun.COM * CDDL HEADER END 208348SEric.Yu@Sun.COM */ 218348SEric.Yu@Sun.COM /* 22*12643SAnders.Persson@Sun.COM * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 238348SEric.Yu@Sun.COM */ 248348SEric.Yu@Sun.COM 258348SEric.Yu@Sun.COM #ifndef _SYS_SOCKET_PROTO_H_ 268348SEric.Yu@Sun.COM #define _SYS_SOCKET_PROTO_H_ 278348SEric.Yu@Sun.COM 288348SEric.Yu@Sun.COM #ifdef __cplusplus 298348SEric.Yu@Sun.COM extern "C" { 308348SEric.Yu@Sun.COM #endif 318348SEric.Yu@Sun.COM 328348SEric.Yu@Sun.COM #include <sys/socket.h> 338348SEric.Yu@Sun.COM 348348SEric.Yu@Sun.COM /* 358348SEric.Yu@Sun.COM * Generation count 368348SEric.Yu@Sun.COM */ 378348SEric.Yu@Sun.COM typedef uint64_t sock_connid_t; 388348SEric.Yu@Sun.COM 398348SEric.Yu@Sun.COM #define SOCK_CONNID_INIT(id) { \ 408348SEric.Yu@Sun.COM (id) = 0; \ 418348SEric.Yu@Sun.COM } 428348SEric.Yu@Sun.COM #define SOCK_CONNID_BUMP(id) (++(id)) 438348SEric.Yu@Sun.COM #define SOCK_CONNID_LT(id1, id2) ((int64_t)((id1)-(id2)) < 0) 448348SEric.Yu@Sun.COM 458348SEric.Yu@Sun.COM /* Socket protocol properties */ 468348SEric.Yu@Sun.COM struct sock_proto_props { 478348SEric.Yu@Sun.COM uint_t sopp_flags; /* options to set */ 488348SEric.Yu@Sun.COM ushort_t sopp_wroff; /* write offset */ 498348SEric.Yu@Sun.COM ssize_t sopp_txhiwat; /* tx hi water mark */ 508348SEric.Yu@Sun.COM ssize_t sopp_txlowat; /* tx lo water mark */ 518348SEric.Yu@Sun.COM ssize_t sopp_rxhiwat; /* recv high water mark */ 528348SEric.Yu@Sun.COM ssize_t sopp_rxlowat; /* recv low water mark */ 538348SEric.Yu@Sun.COM ssize_t sopp_maxblk; /* maximum message block size */ 548348SEric.Yu@Sun.COM ssize_t sopp_maxpsz; /* maximum packet size */ 558348SEric.Yu@Sun.COM ssize_t sopp_minpsz; /* minimum packet size */ 568348SEric.Yu@Sun.COM ushort_t sopp_tail; /* space available at the end */ 578348SEric.Yu@Sun.COM uint_t sopp_zcopyflag; /* zero copy flag */ 588348SEric.Yu@Sun.COM boolean_t sopp_oobinline; /* OOB inline */ 598348SEric.Yu@Sun.COM uint_t sopp_rcvtimer; /* delayed recv notification (time) */ 608348SEric.Yu@Sun.COM uint32_t sopp_rcvthresh; /* delayed recv notification (bytes) */ 618348SEric.Yu@Sun.COM socklen_t sopp_maxaddrlen; /* maximum size of protocol address */ 6210103SAnders.Persson@Sun.COM boolean_t sopp_loopback; /* loopback connection */ 638348SEric.Yu@Sun.COM }; 648348SEric.Yu@Sun.COM 658348SEric.Yu@Sun.COM /* flags to determine which socket options are set */ 668348SEric.Yu@Sun.COM #define SOCKOPT_WROFF 0x0001 /* set write offset */ 678348SEric.Yu@Sun.COM #define SOCKOPT_RCVHIWAT 0x0002 /* set read side high water */ 688348SEric.Yu@Sun.COM #define SOCKOPT_RCVLOWAT 0x0004 /* set read side high water */ 698348SEric.Yu@Sun.COM #define SOCKOPT_MAXBLK 0x0008 /* set maximum message block size */ 708348SEric.Yu@Sun.COM #define SOCKOPT_TAIL 0x0010 /* set the extra allocated space */ 718348SEric.Yu@Sun.COM #define SOCKOPT_ZCOPY 0x0020 /* set/unset zero copy for sendfile */ 728348SEric.Yu@Sun.COM #define SOCKOPT_MAXPSZ 0x0040 /* set maxpsz for protocols */ 738348SEric.Yu@Sun.COM #define SOCKOPT_OOBINLINE 0x0080 /* set oob inline processing */ 748348SEric.Yu@Sun.COM #define SOCKOPT_RCVTIMER 0x0100 758348SEric.Yu@Sun.COM #define SOCKOPT_RCVTHRESH 0x0200 768348SEric.Yu@Sun.COM #define SOCKOPT_MAXADDRLEN 0x0400 /* set max address length */ 778348SEric.Yu@Sun.COM #define SOCKOPT_MINPSZ 0x0800 /* set minpsz for protocols */ 7810103SAnders.Persson@Sun.COM #define SOCKOPT_LOOPBACK 0x1000 /* set loopback */ 798348SEric.Yu@Sun.COM 808348SEric.Yu@Sun.COM #define IS_SO_OOB_INLINE(so) ((so)->so_proto_props.sopp_oobinline) 818348SEric.Yu@Sun.COM 828348SEric.Yu@Sun.COM #ifdef _KERNEL 838348SEric.Yu@Sun.COM 848348SEric.Yu@Sun.COM struct T_capability_ack; 858348SEric.Yu@Sun.COM 868348SEric.Yu@Sun.COM typedef struct sock_upcalls_s sock_upcalls_t; 878348SEric.Yu@Sun.COM typedef struct sock_downcalls_s sock_downcalls_t; 888348SEric.Yu@Sun.COM 898348SEric.Yu@Sun.COM /* 908348SEric.Yu@Sun.COM * Upcall and downcall handle for sockfs and transport layer. 918348SEric.Yu@Sun.COM */ 928348SEric.Yu@Sun.COM typedef struct __sock_upper_handle *sock_upper_handle_t; 938348SEric.Yu@Sun.COM typedef struct __sock_lower_handle *sock_lower_handle_t; 948348SEric.Yu@Sun.COM 958348SEric.Yu@Sun.COM struct sock_downcalls_s { 968348SEric.Yu@Sun.COM void (*sd_activate)(sock_lower_handle_t, sock_upper_handle_t, 978348SEric.Yu@Sun.COM sock_upcalls_t *, int, cred_t *); 988348SEric.Yu@Sun.COM int (*sd_accept)(sock_lower_handle_t, sock_lower_handle_t, 998348SEric.Yu@Sun.COM sock_upper_handle_t, cred_t *); 1008348SEric.Yu@Sun.COM int (*sd_bind)(sock_lower_handle_t, struct sockaddr *, socklen_t, 1018348SEric.Yu@Sun.COM cred_t *); 1028348SEric.Yu@Sun.COM int (*sd_listen)(sock_lower_handle_t, int, cred_t *); 1038348SEric.Yu@Sun.COM int (*sd_connect)(sock_lower_handle_t, const struct sockaddr *, 1048348SEric.Yu@Sun.COM socklen_t, sock_connid_t *, cred_t *); 1058348SEric.Yu@Sun.COM int (*sd_getpeername)(sock_lower_handle_t, struct sockaddr *, 1068348SEric.Yu@Sun.COM socklen_t *, cred_t *); 1078348SEric.Yu@Sun.COM int (*sd_getsockname)(sock_lower_handle_t, struct sockaddr *, 1088348SEric.Yu@Sun.COM socklen_t *, cred_t *); 1098348SEric.Yu@Sun.COM int (*sd_getsockopt)(sock_lower_handle_t, int, int, void *, 1108348SEric.Yu@Sun.COM socklen_t *, cred_t *); 1118348SEric.Yu@Sun.COM int (*sd_setsockopt)(sock_lower_handle_t, int, int, const void *, 1128348SEric.Yu@Sun.COM socklen_t, cred_t *); 1138348SEric.Yu@Sun.COM int (*sd_send)(sock_lower_handle_t, mblk_t *, struct nmsghdr *, 1148348SEric.Yu@Sun.COM cred_t *); 1158348SEric.Yu@Sun.COM int (*sd_send_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *, 1168348SEric.Yu@Sun.COM cred_t *); 1178348SEric.Yu@Sun.COM int (*sd_recv_uio)(sock_lower_handle_t, uio_t *, struct nmsghdr *, 1188348SEric.Yu@Sun.COM cred_t *); 1198348SEric.Yu@Sun.COM short (*sd_poll)(sock_lower_handle_t, short, int, cred_t *); 1208348SEric.Yu@Sun.COM int (*sd_shutdown)(sock_lower_handle_t, int, cred_t *); 1218348SEric.Yu@Sun.COM void (*sd_clr_flowctrl)(sock_lower_handle_t); 1228348SEric.Yu@Sun.COM int (*sd_ioctl)(sock_lower_handle_t, int, intptr_t, int, 1238348SEric.Yu@Sun.COM int32_t *, cred_t *); 1248348SEric.Yu@Sun.COM int (*sd_close)(sock_lower_handle_t, int, cred_t *); 1258348SEric.Yu@Sun.COM }; 1268348SEric.Yu@Sun.COM 1278348SEric.Yu@Sun.COM typedef sock_lower_handle_t (*so_proto_create_func_t)(int, int, int, 1288348SEric.Yu@Sun.COM sock_downcalls_t **, uint_t *, int *, int, cred_t *); 1298348SEric.Yu@Sun.COM 130*12643SAnders.Persson@Sun.COM typedef struct sock_quiesce_arg { 131*12643SAnders.Persson@Sun.COM mblk_t *soqa_exdata_mp; 132*12643SAnders.Persson@Sun.COM mblk_t *soqa_urgmark_mp; 133*12643SAnders.Persson@Sun.COM } sock_quiesce_arg_t; 134*12643SAnders.Persson@Sun.COM typedef mblk_t *(*so_proto_quiesced_cb_t)(sock_upper_handle_t, 135*12643SAnders.Persson@Sun.COM sock_quiesce_arg_t *, struct T_capability_ack *, struct sockaddr *, 136*12643SAnders.Persson@Sun.COM socklen_t, struct sockaddr *, socklen_t, short); 1378963SAnders.Persson@Sun.COM typedef int (*so_proto_fallback_func_t)(sock_lower_handle_t, queue_t *, 138*12643SAnders.Persson@Sun.COM boolean_t, so_proto_quiesced_cb_t, sock_quiesce_arg_t *); 1398348SEric.Yu@Sun.COM 1408348SEric.Yu@Sun.COM /* 14110639SDarren.Reed@Sun.COM * These functions return EOPNOTSUPP and are intended for the sockfs 14210639SDarren.Reed@Sun.COM * developer that doesn't wish to supply stubs for every function themselves. 14310639SDarren.Reed@Sun.COM */ 14410639SDarren.Reed@Sun.COM extern int sock_accept_notsupp(sock_lower_handle_t, sock_lower_handle_t, 14510639SDarren.Reed@Sun.COM sock_upper_handle_t, cred_t *); 14610639SDarren.Reed@Sun.COM extern int sock_bind_notsupp(sock_lower_handle_t, struct sockaddr *, 14710639SDarren.Reed@Sun.COM socklen_t, cred_t *); 14810639SDarren.Reed@Sun.COM extern int sock_listen_notsupp(sock_lower_handle_t, int, cred_t *); 14910639SDarren.Reed@Sun.COM extern int sock_connect_notsupp(sock_lower_handle_t, 15010639SDarren.Reed@Sun.COM const struct sockaddr *, socklen_t, sock_connid_t *, cred_t *); 15110639SDarren.Reed@Sun.COM extern int sock_getpeername_notsupp(sock_lower_handle_t, struct sockaddr *, 15210639SDarren.Reed@Sun.COM socklen_t *, cred_t *); 15310639SDarren.Reed@Sun.COM extern int sock_getsockname_notsupp(sock_lower_handle_t, struct sockaddr *, 15410639SDarren.Reed@Sun.COM socklen_t *, cred_t *); 15510639SDarren.Reed@Sun.COM extern int sock_getsockopt_notsupp(sock_lower_handle_t, int, int, void *, 15610639SDarren.Reed@Sun.COM socklen_t *, cred_t *); 15710639SDarren.Reed@Sun.COM extern int sock_setsockopt_notsupp(sock_lower_handle_t, int, int, 15810639SDarren.Reed@Sun.COM const void *, socklen_t, cred_t *); 15910639SDarren.Reed@Sun.COM extern int sock_send_notsupp(sock_lower_handle_t, mblk_t *, 16010639SDarren.Reed@Sun.COM struct nmsghdr *, cred_t *); 16110639SDarren.Reed@Sun.COM extern int sock_send_uio_notsupp(sock_lower_handle_t, uio_t *, 16210639SDarren.Reed@Sun.COM struct nmsghdr *, cred_t *); 16310639SDarren.Reed@Sun.COM extern int sock_recv_uio_notsupp(sock_lower_handle_t, uio_t *, 16410639SDarren.Reed@Sun.COM struct nmsghdr *, cred_t *); 16510639SDarren.Reed@Sun.COM extern short sock_poll_notsupp(sock_lower_handle_t, short, int, cred_t *); 16610639SDarren.Reed@Sun.COM extern int sock_shutdown_notsupp(sock_lower_handle_t, int, cred_t *); 16710639SDarren.Reed@Sun.COM extern void sock_clr_flowctrl_notsupp(sock_lower_handle_t); 16810639SDarren.Reed@Sun.COM extern int sock_ioctl_notsupp(sock_lower_handle_t, int, intptr_t, int, 16910639SDarren.Reed@Sun.COM int32_t *, cred_t *); 17010639SDarren.Reed@Sun.COM extern int sock_close_notsupp(sock_lower_handle_t, int, cred_t *); 17110639SDarren.Reed@Sun.COM 17210639SDarren.Reed@Sun.COM /* 1738348SEric.Yu@Sun.COM * Upcalls and related information 1748348SEric.Yu@Sun.COM */ 1758348SEric.Yu@Sun.COM 1768348SEric.Yu@Sun.COM /* 1778348SEric.Yu@Sun.COM * su_opctl() actions 1788348SEric.Yu@Sun.COM */ 1798348SEric.Yu@Sun.COM typedef enum sock_opctl_action { 1808348SEric.Yu@Sun.COM SOCK_OPCTL_ENAB_ACCEPT = 0, 1818348SEric.Yu@Sun.COM SOCK_OPCTL_SHUT_SEND, 1828348SEric.Yu@Sun.COM SOCK_OPCTL_SHUT_RECV 1838348SEric.Yu@Sun.COM } sock_opctl_action_t; 1848348SEric.Yu@Sun.COM 1858348SEric.Yu@Sun.COM struct sock_upcalls_s { 1868348SEric.Yu@Sun.COM sock_upper_handle_t (*su_newconn)(sock_upper_handle_t, 1878348SEric.Yu@Sun.COM sock_lower_handle_t, sock_downcalls_t *, cred_t *, pid_t, 1888348SEric.Yu@Sun.COM sock_upcalls_t **); 1898348SEric.Yu@Sun.COM void (*su_connected)(sock_upper_handle_t, sock_connid_t, cred_t *, 1908348SEric.Yu@Sun.COM pid_t); 1918348SEric.Yu@Sun.COM int (*su_disconnected)(sock_upper_handle_t, sock_connid_t, int); 1928348SEric.Yu@Sun.COM void (*su_opctl)(sock_upper_handle_t, sock_opctl_action_t, 1938348SEric.Yu@Sun.COM uintptr_t); 1948348SEric.Yu@Sun.COM ssize_t (*su_recv)(sock_upper_handle_t, mblk_t *, size_t, int, 1958348SEric.Yu@Sun.COM int *, boolean_t *); 1968348SEric.Yu@Sun.COM void (*su_set_proto_props)(sock_upper_handle_t, 1978348SEric.Yu@Sun.COM struct sock_proto_props *); 1988348SEric.Yu@Sun.COM void (*su_txq_full)(sock_upper_handle_t, boolean_t); 1998348SEric.Yu@Sun.COM void (*su_signal_oob)(sock_upper_handle_t, ssize_t); 2008348SEric.Yu@Sun.COM void (*su_zcopy_notify)(sock_upper_handle_t); 2018348SEric.Yu@Sun.COM void (*su_set_error)(sock_upper_handle_t, int); 202*12643SAnders.Persson@Sun.COM void (*su_closed)(sock_upper_handle_t); 2038348SEric.Yu@Sun.COM }; 2048348SEric.Yu@Sun.COM 2058348SEric.Yu@Sun.COM #define SOCK_UC_VERSION sizeof (sock_upcalls_t) 2068348SEric.Yu@Sun.COM #define SOCK_DC_VERSION sizeof (sock_downcalls_t) 2078348SEric.Yu@Sun.COM 2088348SEric.Yu@Sun.COM #define SOCKET_RECVHIWATER (48 * 1024) 2098348SEric.Yu@Sun.COM #define SOCKET_RECVLOWATER 1024 2108348SEric.Yu@Sun.COM 2118348SEric.Yu@Sun.COM #define SOCKET_NO_RCVTIMER 0 2128348SEric.Yu@Sun.COM #define SOCKET_TIMER_INTERVAL 50 2138348SEric.Yu@Sun.COM 2148348SEric.Yu@Sun.COM #endif /* _KERNEL */ 2158348SEric.Yu@Sun.COM 2168348SEric.Yu@Sun.COM #ifdef __cplusplus 2178348SEric.Yu@Sun.COM } 2188348SEric.Yu@Sun.COM #endif 2198348SEric.Yu@Sun.COM 2208348SEric.Yu@Sun.COM #endif /* _SYS_SOCKET_PROTO_H_ */ 221