xref: /illumos-gate/usr/src/uts/common/sys/sockfilter.h (revision 3e95bd4a)
1*3e95bd4aSAnders Persson /*
2*3e95bd4aSAnders Persson  * CDDL HEADER START
3*3e95bd4aSAnders Persson  *
4*3e95bd4aSAnders Persson  * The contents of this file are subject to the terms of the
5*3e95bd4aSAnders Persson  * Common Development and Distribution License (the "License").
6*3e95bd4aSAnders Persson  * You may not use this file except in compliance with the License.
7*3e95bd4aSAnders Persson  *
8*3e95bd4aSAnders Persson  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*3e95bd4aSAnders Persson  * or http://www.opensolaris.org/os/licensing.
10*3e95bd4aSAnders Persson  * See the License for the specific language governing permissions
11*3e95bd4aSAnders Persson  * and limitations under the License.
12*3e95bd4aSAnders Persson  *
13*3e95bd4aSAnders Persson  * When distributing Covered Code, include this CDDL HEADER in each
14*3e95bd4aSAnders Persson  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*3e95bd4aSAnders Persson  * If applicable, add the following below this CDDL HEADER, with the
16*3e95bd4aSAnders Persson  * fields enclosed by brackets "[]" replaced with your own identifying
17*3e95bd4aSAnders Persson  * information: Portions Copyright [yyyy] [name of copyright owner]
18*3e95bd4aSAnders Persson  *
19*3e95bd4aSAnders Persson  * CDDL HEADER END
20*3e95bd4aSAnders Persson  */
21*3e95bd4aSAnders Persson /*
22*3e95bd4aSAnders Persson  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*3e95bd4aSAnders Persson  */
24*3e95bd4aSAnders Persson 
25*3e95bd4aSAnders Persson #ifndef	_SYS_SOCKFILTER_H
26*3e95bd4aSAnders Persson #define	_SYS_SOCKFILTER_H
27*3e95bd4aSAnders Persson 
28*3e95bd4aSAnders Persson #include <sys/cred.h>
29*3e95bd4aSAnders Persson #include <sys/errno.h>
30*3e95bd4aSAnders Persson #include <sys/socket.h>
31*3e95bd4aSAnders Persson 
32*3e95bd4aSAnders Persson #ifdef	__cplusplus
33*3e95bd4aSAnders Persson extern "C" {
34*3e95bd4aSAnders Persson #endif
35*3e95bd4aSAnders Persson 
36*3e95bd4aSAnders Persson /*
37*3e95bd4aSAnders Persson  * Opaque socket filter handle
38*3e95bd4aSAnders Persson  */
39*3e95bd4aSAnders Persson typedef struct __sof_handle	*sof_handle_t;
40*3e95bd4aSAnders Persson 
41*3e95bd4aSAnders Persson /*
42*3e95bd4aSAnders Persson  * Return values for callback functions.
43*3e95bd4aSAnders Persson  *
44*3e95bd4aSAnders Persson  * A - Attach (passive/active) only
45*3e95bd4aSAnders Persson  * P - Passive attach only
46*3e95bd4aSAnders Persson  */
47*3e95bd4aSAnders Persson typedef enum {
48*3e95bd4aSAnders Persson 	SOF_RVAL_DEFER = -3,		/* defer notification (P) */
49*3e95bd4aSAnders Persson 	SOF_RVAL_DETACH = -2,		/* detach filter, continue proc. (A) */
50*3e95bd4aSAnders Persson 	SOF_RVAL_CONTINUE = -1,		/* continue processing */
51*3e95bd4aSAnders Persson 	SOF_RVAL_RETURN = 0,		/* stop proc, does not return error */
52*3e95bd4aSAnders Persson 	SOF_RVAL_EINVAL = EINVAL,	/* stop proc., returns error */
53*3e95bd4aSAnders Persson 	SOF_RVAL_EACCES = EACCES,	/* stop proc., returns error */
54*3e95bd4aSAnders Persson 	SOF_RVAL_ENOMEM = ENOMEM,	/* stop proc., returns error */
55*3e95bd4aSAnders Persson 	SOF_RVAL_ECONNABORTED = ECONNABORTED /* stop proc, returns error */
56*3e95bd4aSAnders Persson } sof_rval_t;
57*3e95bd4aSAnders Persson 
58*3e95bd4aSAnders Persson /*
59*3e95bd4aSAnders Persson  * Events generated by the sofop_notify callback.
60*3e95bd4aSAnders Persson  */
61*3e95bd4aSAnders Persson typedef enum {				/* socket ... */
62*3e95bd4aSAnders Persson 	SOF_EV_CLOSING,			/* ... is closing */
63*3e95bd4aSAnders Persson 	SOF_EV_CONNECTED,		/* ... is connected */
64*3e95bd4aSAnders Persson 	SOF_EV_CONNECTFAILED,		/* ... failed to connect */
65*3e95bd4aSAnders Persson 	SOF_EV_DISCONNECTED,		/* ... was disconnected */
66*3e95bd4aSAnders Persson 	SOF_EV_CANTRECVMORE,		/* ... cannot receive any more data */
67*3e95bd4aSAnders Persson 	SOF_EV_CANTSENDMORE,		/* ... cannot send any more data */
68*3e95bd4aSAnders Persson 	SOF_EV_INJECT_DATA_IN_OK,	/* ... has cleared rcv flow ctrl */
69*3e95bd4aSAnders Persson 	SOF_EV_INJECT_DATA_OUT_OK,	/* ... has cleared snd flow ctrl */
70*3e95bd4aSAnders Persson } sof_event_t;
71*3e95bd4aSAnders Persson 
72*3e95bd4aSAnders Persson /* Filter callbacks */
73*3e95bd4aSAnders Persson typedef sof_rval_t 	(*sof_attach_active_fn_t)(sof_handle_t, int, int, int,
74*3e95bd4aSAnders Persson     cred_t *, void **);
75*3e95bd4aSAnders Persson typedef sof_rval_t 	(*sof_attach_passive_fn_t)(sof_handle_t, sof_handle_t,
76*3e95bd4aSAnders Persson     void *, struct sockaddr *, socklen_t, struct sockaddr *, socklen_t,
77*3e95bd4aSAnders Persson     void **);
78*3e95bd4aSAnders Persson typedef void 		(*sof_detach_fn_t)(sof_handle_t, void *, cred_t *);
79*3e95bd4aSAnders Persson typedef mblk_t 		*(*sof_data_in_fn_t)(sof_handle_t, void *, mblk_t *,
80*3e95bd4aSAnders Persson     int, size_t *);
81*3e95bd4aSAnders Persson typedef mblk_t		*(*sof_data_in_proc_fn_t)(sof_handle_t, void *,
82*3e95bd4aSAnders Persson     mblk_t *, cred_t *, size_t *);
83*3e95bd4aSAnders Persson typedef mblk_t		*(*sof_data_out_fn_t)(sof_handle_t, void *, mblk_t *,
84*3e95bd4aSAnders Persson     struct nmsghdr *, cred_t *, sof_rval_t *);
85*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_bind_fn_t)(sof_handle_t, void *,
86*3e95bd4aSAnders Persson     struct sockaddr *, socklen_t *, cred_t *);
87*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_listen_fn_t)(sof_handle_t, void *, int *,
88*3e95bd4aSAnders Persson     cred_t *);
89*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_accept_fn_t)(sof_handle_t, void *, cred_t *);
90*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_connect_fn_t)(sof_handle_t, void *,
91*3e95bd4aSAnders Persson     struct sockaddr *, socklen_t *, cred_t *);
92*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_shutdown_fn_t)(sof_handle_t, void *, int *,
93*3e95bd4aSAnders Persson     cred_t *);
94*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_getsockname_fn_t)(sof_handle_t, void *,
95*3e95bd4aSAnders Persson     struct sockaddr *, socklen_t *, cred_t *);
96*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_getpeername_fn_t)(sof_handle_t, void *,
97*3e95bd4aSAnders Persson     struct sockaddr *, socklen_t *, cred_t *);
98*3e95bd4aSAnders Persson typedef sof_rval_t 		(*sof_setsockopt_fn_t)(sof_handle_t, void *,
99*3e95bd4aSAnders Persson     int, int, void *, socklen_t *, cred_t *);
100*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_getsockopt_fn_t)(sof_handle_t, void *,
101*3e95bd4aSAnders Persson     int, int, void *, socklen_t *, cred_t *);
102*3e95bd4aSAnders Persson typedef sof_rval_t	(*sof_ioctl_fn_t)(sof_handle_t, void *, int, intptr_t,
103*3e95bd4aSAnders Persson     int, int32_t *, cred_t *);
104*3e95bd4aSAnders Persson typedef void		(*sof_mblk_prop_fn_t)(sof_handle_t, void *, ssize_t *,
105*3e95bd4aSAnders Persson     ushort_t *, ushort_t *);
106*3e95bd4aSAnders Persson typedef void		(*sof_notify_fn_t)(sof_handle_t, void *, sof_event_t,
107*3e95bd4aSAnders Persson     uintptr_t);
108*3e95bd4aSAnders Persson 
109*3e95bd4aSAnders Persson typedef struct sof_ops {
110*3e95bd4aSAnders Persson 	sof_attach_active_fn_t	sofop_attach_active;
111*3e95bd4aSAnders Persson 	sof_attach_passive_fn_t	sofop_attach_passive;
112*3e95bd4aSAnders Persson 	sof_detach_fn_t		sofop_detach;
113*3e95bd4aSAnders Persson 	sof_data_in_fn_t	sofop_data_in;
114*3e95bd4aSAnders Persson 	sof_data_in_proc_fn_t	sofop_data_in_proc;
115*3e95bd4aSAnders Persson 	sof_data_out_fn_t	sofop_data_out;
116*3e95bd4aSAnders Persson 	sof_bind_fn_t		sofop_bind;
117*3e95bd4aSAnders Persson 	sof_listen_fn_t		sofop_listen;
118*3e95bd4aSAnders Persson 	sof_connect_fn_t	sofop_connect;
119*3e95bd4aSAnders Persson 	sof_accept_fn_t		sofop_accept;
120*3e95bd4aSAnders Persson 	sof_shutdown_fn_t	sofop_shutdown;
121*3e95bd4aSAnders Persson 	sof_getsockname_fn_t	sofop_getsockname;
122*3e95bd4aSAnders Persson 	sof_getpeername_fn_t	sofop_getpeername;
123*3e95bd4aSAnders Persson 	sof_setsockopt_fn_t	sofop_setsockopt;
124*3e95bd4aSAnders Persson 	sof_getsockopt_fn_t	sofop_getsockopt;
125*3e95bd4aSAnders Persson 	sof_ioctl_fn_t		sofop_ioctl;
126*3e95bd4aSAnders Persson 	sof_mblk_prop_fn_t	sofop_mblk_prop;
127*3e95bd4aSAnders Persson 	sof_notify_fn_t		sofop_notify;
128*3e95bd4aSAnders Persson } sof_ops_t;
129*3e95bd4aSAnders Persson 
130*3e95bd4aSAnders Persson #define	SOF_VERSION	1
131*3e95bd4aSAnders Persson 
132*3e95bd4aSAnders Persson extern int	sof_register(int, const char *, const sof_ops_t *, int);
133*3e95bd4aSAnders Persson extern int	sof_unregister(const char *);
134*3e95bd4aSAnders Persson 
135*3e95bd4aSAnders Persson extern void	sof_newconn_ready(sof_handle_t);
136*3e95bd4aSAnders Persson extern void	sof_bypass(sof_handle_t);
137*3e95bd4aSAnders Persson extern void	*sof_get_cookie(sof_handle_t);
138*3e95bd4aSAnders Persson extern void 	*sof_cas_cookie(sof_handle_t, void *, void *);
139*3e95bd4aSAnders Persson extern int	sof_inject_data_out(sof_handle_t, mblk_t *, struct nmsghdr *,
140*3e95bd4aSAnders Persson     boolean_t *);
141*3e95bd4aSAnders Persson extern int	sof_inject_data_in(sof_handle_t, mblk_t *, size_t, int,
142*3e95bd4aSAnders Persson     boolean_t *);
143*3e95bd4aSAnders Persson extern void 	sof_rcv_flowctrl(sof_handle_t, boolean_t);
144*3e95bd4aSAnders Persson extern void 	sof_snd_flowctrl(sof_handle_t, boolean_t);
145*3e95bd4aSAnders Persson extern boolean_t sof_newconn_move(sof_handle_t, sof_handle_t);
146*3e95bd4aSAnders Persson 
147*3e95bd4aSAnders Persson #ifdef	__cplusplus
148*3e95bd4aSAnders Persson }
149*3e95bd4aSAnders Persson #endif
150*3e95bd4aSAnders Persson 
151*3e95bd4aSAnders Persson #endif	/* _SYS_SOCKFILTER_H */
152