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 
220f1702c5SYu Xiangning /*
230f1702c5SYu Xiangning  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
240f1702c5SYu Xiangning  * Use is subject to license terms.
25*907c2824SRobert Mustacchi  * Copyright 2015, Joyent, Inc.
260f1702c5SYu Xiangning  */
270f1702c5SYu Xiangning 
280f1702c5SYu Xiangning #ifndef	_INET_KSOCKET_KSOCKET_IMPL_H
290f1702c5SYu Xiangning #define	_INET_KSOCKET_KSOCKET_IMPL_H
300f1702c5SYu Xiangning 
31*907c2824SRobert Mustacchi /*
32*907c2824SRobert Mustacchi  * Note that if this relationship ever changes, the logic in ksocket_krecv_set
33*907c2824SRobert Mustacchi  * must be updated and we must maintain local state about this on whatever the
34*907c2824SRobert Mustacchi  * new ksocket object is.
35*907c2824SRobert Mustacchi  */
360f1702c5SYu Xiangning #define	KSTOSO(ks)	((struct sonode *)(ks))
370f1702c5SYu Xiangning #define	SOTOKS(so)	((ksocket_t)(uintptr_t)(so))
380f1702c5SYu Xiangning 
390f1702c5SYu Xiangning #define	IS_KERNEL_SOCKET(so)	((so)->so_mode & SM_KERNEL)
400f1702c5SYu Xiangning 
410f1702c5SYu Xiangning #define	KSOCKET_MOD_VERSION	"kernel socket module"
420f1702c5SYu Xiangning 
430f1702c5SYu Xiangning #define	__KSOCKET_EV_connected		KSOCKET_EV_CONNECTED
440f1702c5SYu Xiangning #define	__KSOCKET_EV_connectfailed	KSOCKET_EV_CONNECTFAILED
450f1702c5SYu Xiangning #define	__KSOCKET_EV_disconnected	KSOCKET_EV_DISCONNECTED
460f1702c5SYu Xiangning #define	__KSOCKET_EV_oobdata		KSOCKET_EV_OOBDATA
470f1702c5SYu Xiangning #define	__KSOCKET_EV_newdata		KSOCKET_EV_NEWDATA
480f1702c5SYu Xiangning #define	__KSOCKET_EV_newconn		KSOCKET_EV_NEWCONN
490f1702c5SYu Xiangning #define	__KSOCKET_EV_cansend		KSOCKET_EV_CANSEND
500f1702c5SYu Xiangning #define	__KSOCKET_EV_cantsendmore	KSOCKET_EV_CANTSENDMORE
510f1702c5SYu Xiangning #define	__KSOCKET_EV_cantrecvmore	KSOCKET_EV_CANTRECVMORE
520f1702c5SYu Xiangning #define	__KSOCKET_EV_error		KSOCKET_EV_ERROR
530f1702c5SYu Xiangning 
54*907c2824SRobert Mustacchi #define	KSOCKET_CALLBACK(so, cbfn, arg)					\
550f1702c5SYu Xiangning 	if ((so)->so_ksock_callbacks.ksock_cb_##cbfn != NULL) {		\
560f1702c5SYu Xiangning 		(*(so)->so_ksock_callbacks.ksock_cb_##cbfn)(SOTOKS(so),	\
570f1702c5SYu Xiangning 		    __KSOCKET_EV_##cbfn, (so)->so_ksock_cb_arg, (arg));	\
580f1702c5SYu Xiangning 	}
590f1702c5SYu Xiangning 
600f1702c5SYu Xiangning #define	KSOCKET_FMODE(so)	FREAD|FWRITE|	\
610f1702c5SYu Xiangning 	((KSTOSO(so)->so_state & (SS_NDELAY|SS_NONBLOCK)) ? FNDELAY : 0)
620f1702c5SYu Xiangning 
630f1702c5SYu Xiangning #define	KSOCKET_VALID(ks)	\
640f1702c5SYu Xiangning 	((ks) != NULL && (KSTOSO(ks))->so_mode & SM_KERNEL &&		\
650f1702c5SYu Xiangning 	    !((KSTOSO(ks))->so_state & SS_CLOSING))
660f1702c5SYu Xiangning 
670f1702c5SYu Xiangning #define	SETCALLBACK(so, cb, cbfn, cbflg)			\
680f1702c5SYu Xiangning 	if ((cb)->ksock_cb_flags & (cbflg)) {			\
690f1702c5SYu Xiangning 		(so)->so_ksock_callbacks.ksock_cb_##cbfn	\
700f1702c5SYu Xiangning 		    = (cb)->ksock_cb_##cbfn;			\
710f1702c5SYu Xiangning 		if ((cb)->ksock_cb_##cbfn == NULL)		\
720f1702c5SYu Xiangning 			(so)->so_ksock_callbacks.ksock_cb_flags \
730f1702c5SYu Xiangning 			    &= ~(cbflg);			\
740f1702c5SYu Xiangning 		else						\
750f1702c5SYu Xiangning 			(so)->so_ksock_callbacks.ksock_cb_flags \
760f1702c5SYu Xiangning 			    |= (cbflg);				\
770f1702c5SYu Xiangning 	}
780f1702c5SYu Xiangning 
790f1702c5SYu Xiangning 
800f1702c5SYu Xiangning #endif /* _INET_KSOCKET_KSOCKET_IMPL_H */
81