10f1702c5SYu Xiangning /* 20f1702c5SYu Xiangning * CDDL HEADER START 30f1702c5SYu Xiangning * 40f1702c5SYu Xiangning * The contents of this file are subject to the terms of the 50f1702c5SYu Xiangning * Common Development and Distribution License (the "License"). 60f1702c5SYu Xiangning * You may not use this file except in compliance with the License. 70f1702c5SYu Xiangning * 80f1702c5SYu Xiangning * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90f1702c5SYu Xiangning * or http://www.opensolaris.org/os/licensing. 100f1702c5SYu Xiangning * See the License for the specific language governing permissions 110f1702c5SYu Xiangning * and limitations under the License. 120f1702c5SYu Xiangning * 130f1702c5SYu Xiangning * When distributing Covered Code, include this CDDL HEADER in each 140f1702c5SYu Xiangning * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150f1702c5SYu Xiangning * If applicable, add the following below this CDDL HEADER, with the 160f1702c5SYu Xiangning * fields enclosed by brackets "[]" replaced with your own identifying 170f1702c5SYu Xiangning * information: Portions Copyright [yyyy] [name of copyright owner] 180f1702c5SYu Xiangning * 190f1702c5SYu Xiangning * CDDL HEADER END 200f1702c5SYu Xiangning */ 210f1702c5SYu Xiangning /* 223076c25aSStepan Zastupov * Copyright 2011 Nexenta Systems, Inc. All rights reserved. 233e95bd4aSAnders Persson * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 24*907c2824SRobert Mustacchi * Copyright 2015, Joyent, Inc. 250f1702c5SYu Xiangning */ 260f1702c5SYu Xiangning 270f1702c5SYu Xiangning #ifndef _SYS_KSOCKET_H_ 280f1702c5SYu Xiangning #define _SYS_KSOCKET_H_ 290f1702c5SYu Xiangning 300f1702c5SYu Xiangning #ifdef __cplusplus 310f1702c5SYu Xiangning extern "C" { 320f1702c5SYu Xiangning #endif 330f1702c5SYu Xiangning 340f1702c5SYu Xiangning /* Opaque kernel socket type */ 350f1702c5SYu Xiangning typedef struct __ksocket *ksocket_t; 360f1702c5SYu Xiangning struct nmsghdr; 3733697085SGordon Ross struct msgb; /* avoiding sys/stream.h here */ 380f1702c5SYu Xiangning 390f1702c5SYu Xiangning /* flag bit for each Callback Event */ 400f1702c5SYu Xiangning #define KSOCKET_CB_CONNECTED 0x00000001 410f1702c5SYu Xiangning #define KSOCKET_CB_CONNECTFAILED 0x00000002 420f1702c5SYu Xiangning #define KSOCKET_CB_DISCONNECTED 0x00000004 430f1702c5SYu Xiangning #define KSOCKET_CB_NEWDATA 0x00000008 440f1702c5SYu Xiangning #define KSOCKET_CB_NEWCONN 0x00000010 450f1702c5SYu Xiangning #define KSOCKET_CB_CANSEND 0x00000020 460f1702c5SYu Xiangning #define KSOCKET_CB_OOBDATA 0x00000040 470f1702c5SYu Xiangning #define KSOCKET_CB_CANTSENDMORE 0x00000080 480f1702c5SYu Xiangning #define KSOCKET_CB_CANTRECVMORE 0x00000100 490f1702c5SYu Xiangning #define KSOCKET_CB_ERROR 0x00000200 500f1702c5SYu Xiangning 510f1702c5SYu Xiangning /* 520f1702c5SYu Xiangning * Kernel Socket Callback Events 530f1702c5SYu Xiangning */ 540f1702c5SYu Xiangning typedef enum ksocket_event { 550f1702c5SYu Xiangning KSOCKET_EV_CONNECTED, 560f1702c5SYu Xiangning KSOCKET_EV_CONNECTFAILED, 570f1702c5SYu Xiangning KSOCKET_EV_DISCONNECTED, 580f1702c5SYu Xiangning KSOCKET_EV_OOBDATA, 590f1702c5SYu Xiangning KSOCKET_EV_NEWDATA, 600f1702c5SYu Xiangning KSOCKET_EV_NEWCONN, 610f1702c5SYu Xiangning KSOCKET_EV_CANSEND, 620f1702c5SYu Xiangning KSOCKET_EV_CANTSENDMORE, 630f1702c5SYu Xiangning KSOCKET_EV_CANTRECVMORE, 640f1702c5SYu Xiangning KSOCKET_EV_ERROR 650f1702c5SYu Xiangning } ksocket_callback_event_t; 660f1702c5SYu Xiangning 670f1702c5SYu Xiangning typedef void (*ksocket_callback_t)(ksocket_t, ksocket_callback_event_t, 680f1702c5SYu Xiangning void *, uintptr_t); 690f1702c5SYu Xiangning 700f1702c5SYu Xiangning typedef struct ksocket_callbacks { 710f1702c5SYu Xiangning uint32_t ksock_cb_flags; 720f1702c5SYu Xiangning ksocket_callback_t ksock_cb_connected; 730f1702c5SYu Xiangning ksocket_callback_t ksock_cb_connectfailed; 740f1702c5SYu Xiangning ksocket_callback_t ksock_cb_disconnected; 750f1702c5SYu Xiangning ksocket_callback_t ksock_cb_newdata; 760f1702c5SYu Xiangning ksocket_callback_t ksock_cb_newconn; 770f1702c5SYu Xiangning ksocket_callback_t ksock_cb_cansend; 780f1702c5SYu Xiangning ksocket_callback_t ksock_cb_oobdata; 790f1702c5SYu Xiangning ksocket_callback_t ksock_cb_cantsendmore; 800f1702c5SYu Xiangning ksocket_callback_t ksock_cb_cantrecvmore; 810f1702c5SYu Xiangning ksocket_callback_t ksock_cb_error; 820f1702c5SYu Xiangning } ksocket_callbacks_t; 830f1702c5SYu Xiangning 840f1702c5SYu Xiangning #define KSOCKET_SLEEP SOCKET_SLEEP 850f1702c5SYu Xiangning #define KSOCKET_NOSLEEP SOCKET_NOSLEEP 860f1702c5SYu Xiangning 870f1702c5SYu Xiangning extern int ksocket_socket(ksocket_t *, int, int, int, int, struct cred *); 880f1702c5SYu Xiangning extern int ksocket_bind(ksocket_t, struct sockaddr *, socklen_t, 890f1702c5SYu Xiangning struct cred *); 900f1702c5SYu Xiangning extern int ksocket_listen(ksocket_t, int, struct cred *); 910f1702c5SYu Xiangning extern int ksocket_accept(ksocket_t, struct sockaddr *, socklen_t *, 920f1702c5SYu Xiangning ksocket_t *, struct cred *); 933e95bd4aSAnders Persson extern int ksocket_connect(ksocket_t, struct sockaddr *, socklen_t, 940f1702c5SYu Xiangning struct cred *); 950f1702c5SYu Xiangning extern int ksocket_send(ksocket_t, void *, size_t, int, size_t *, 960f1702c5SYu Xiangning struct cred *); 970f1702c5SYu Xiangning extern int ksocket_sendto(ksocket_t, void *, size_t, int, 980f1702c5SYu Xiangning struct sockaddr *, socklen_t, size_t *, struct cred *); 990f1702c5SYu Xiangning extern int ksocket_sendmsg(ksocket_t, struct nmsghdr *, int, size_t *, 1000f1702c5SYu Xiangning struct cred *); 10133697085SGordon Ross extern int ksocket_sendmblk(ksocket_t, struct nmsghdr *, int, 10233697085SGordon Ross struct msgb **, struct cred *); 1030f1702c5SYu Xiangning extern int ksocket_recv(ksocket_t, void *, size_t, int, size_t *, 1040f1702c5SYu Xiangning struct cred *); 1050f1702c5SYu Xiangning extern int ksocket_recvfrom(ksocket_t, void *, size_t, int, 1060f1702c5SYu Xiangning struct sockaddr *, socklen_t *, size_t *, struct cred *); 1070f1702c5SYu Xiangning extern int ksocket_recvmsg(ksocket_t, struct nmsghdr *, int, size_t *, 1080f1702c5SYu Xiangning struct cred *); 1090f1702c5SYu Xiangning extern int ksocket_shutdown(ksocket_t, int, struct cred *); 1100f1702c5SYu Xiangning extern int ksocket_setsockopt(ksocket_t, int, int, const void *, int, 1110f1702c5SYu Xiangning struct cred *); 1120f1702c5SYu Xiangning extern int ksocket_getsockopt(ksocket_t, int, int, void *, int *, 1130f1702c5SYu Xiangning struct cred *); 1140f1702c5SYu Xiangning extern int ksocket_getpeername(ksocket_t, struct sockaddr *, socklen_t *, 1150f1702c5SYu Xiangning struct cred *); 1160f1702c5SYu Xiangning extern int ksocket_getsockname(ksocket_t, struct sockaddr *, socklen_t *, 1170f1702c5SYu Xiangning struct cred *); 1180f1702c5SYu Xiangning extern int ksocket_ioctl(ksocket_t, int, intptr_t, int *, struct cred *); 1193076c25aSStepan Zastupov extern int ksocket_spoll(ksocket_t, int, short, short *, struct cred *); 1200f1702c5SYu Xiangning extern int ksocket_setcallbacks(ksocket_t, ksocket_callbacks_t *, void *, 1210f1702c5SYu Xiangning struct cred *); 1220f1702c5SYu Xiangning extern int ksocket_close(ksocket_t, struct cred *); 1230f1702c5SYu Xiangning extern void ksocket_hold(ksocket_t); 1240f1702c5SYu Xiangning extern void ksocket_rele(ksocket_t); 1250f1702c5SYu Xiangning 126*907c2824SRobert Mustacchi /* 127*907c2824SRobert Mustacchi * These functions allow an alternative way for a ksocket to directly 128*907c2824SRobert Mustacchi * receive data when it arrives in sockfs rather than having it queued 129*907c2824SRobert Mustacchi * in a socket buffer that it must separately poll. The use of this 130*907c2824SRobert Mustacchi * results in no data being queued in sockfs. 131*907c2824SRobert Mustacchi * 132*907c2824SRobert Mustacchi * When the receive function receives data, it is responsible for always 133*907c2824SRobert Mustacchi * consuming all of the data. The return value of the callback function 134*907c2824SRobert Mustacchi * is used to indicate flow control and backpressure (similar to 135*907c2824SRobert Mustacchi * mac_tx(9E)). If, after processing the data, additional data can be 136*907c2824SRobert Mustacchi * received and processed, then the callback function should return 137*907c2824SRobert Mustacchi * B_TRUE. Otherwise it should return B_FALSE. This will result in the 138*907c2824SRobert Mustacchi * lower level socket interfaces (e.g. TCP) understanding that 139*907c2824SRobert Mustacchi * backpressure has been asserted (as though the sockfs buffer is full). 140*907c2824SRobert Mustacchi * 141*907c2824SRobert Mustacchi * Once whatever conditions that caused the callback function to assert 142*907c2824SRobert Mustacchi * that it needed to assert flow control are done, then it must call 143*907c2824SRobert Mustacchi * ksocket_krecv_unblock() to allow the flow to continue. If the receive 144*907c2824SRobert Mustacchi * callback ever returns B_FALSE there will generally be no additional 145*907c2824SRobert Mustacchi * data received until this is called. 146*907c2824SRobert Mustacchi */ 147*907c2824SRobert Mustacchi typedef boolean_t (*ksocket_krecv_f)(ksocket_t, struct msgb *, size_t, int, 148*907c2824SRobert Mustacchi void *); 149*907c2824SRobert Mustacchi extern int ksocket_krecv_set(ksocket_t, ksocket_krecv_f, void *); 150*907c2824SRobert Mustacchi extern void ksocket_krecv_unblock(ksocket_t); 151*907c2824SRobert Mustacchi 1520f1702c5SYu Xiangning #ifdef __cplusplus 1530f1702c5SYu Xiangning } 1540f1702c5SYu Xiangning #endif 1550f1702c5SYu Xiangning 1560f1702c5SYu Xiangning #endif /* _SYS_KSOCKET_H_ */ 157