/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _SYS_SOCKFILTER_H #define _SYS_SOCKFILTER_H #include #include #include #ifdef __cplusplus extern "C" { #endif /* * Opaque socket filter handle */ typedef struct __sof_handle *sof_handle_t; /* * Return values for callback functions. * * A - Attach (passive/active) only * P - Passive attach only */ typedef enum { SOF_RVAL_DEFER = -3, /* defer notification (P) */ SOF_RVAL_DETACH = -2, /* detach filter, continue proc. (A) */ SOF_RVAL_CONTINUE = -1, /* continue processing */ SOF_RVAL_RETURN = 0, /* stop proc, does not return error */ SOF_RVAL_EINVAL = EINVAL, /* stop proc., returns error */ SOF_RVAL_EACCES = EACCES, /* stop proc., returns error */ SOF_RVAL_ENOMEM = ENOMEM, /* stop proc., returns error */ SOF_RVAL_ECONNABORTED = ECONNABORTED /* stop proc, returns error */ } sof_rval_t; /* * Events generated by the sofop_notify callback. */ typedef enum { /* socket ... */ SOF_EV_CLOSING, /* ... is closing */ SOF_EV_CONNECTED, /* ... is connected */ SOF_EV_CONNECTFAILED, /* ... failed to connect */ SOF_EV_DISCONNECTED, /* ... was disconnected */ SOF_EV_CANTRECVMORE, /* ... cannot receive any more data */ SOF_EV_CANTSENDMORE, /* ... cannot send any more data */ SOF_EV_INJECT_DATA_IN_OK, /* ... has cleared rcv flow ctrl */ SOF_EV_INJECT_DATA_OUT_OK, /* ... has cleared snd flow ctrl */ } sof_event_t; /* Filter callbacks */ typedef sof_rval_t (*sof_attach_active_fn_t)(sof_handle_t, int, int, int, cred_t *, void **); typedef sof_rval_t (*sof_attach_passive_fn_t)(sof_handle_t, sof_handle_t, void *, struct sockaddr *, socklen_t, struct sockaddr *, socklen_t, void **); typedef void (*sof_detach_fn_t)(sof_handle_t, void *, cred_t *); typedef mblk_t *(*sof_data_in_fn_t)(sof_handle_t, void *, mblk_t *, int, size_t *); typedef mblk_t *(*sof_data_in_proc_fn_t)(sof_handle_t, void *, mblk_t *, cred_t *, size_t *); typedef mblk_t *(*sof_data_out_fn_t)(sof_handle_t, void *, mblk_t *, struct nmsghdr *, cred_t *, sof_rval_t *); typedef sof_rval_t (*sof_bind_fn_t)(sof_handle_t, void *, struct sockaddr *, socklen_t *, cred_t *); typedef sof_rval_t (*sof_listen_fn_t)(sof_handle_t, void *, int *, cred_t *); typedef sof_rval_t (*sof_accept_fn_t)(sof_handle_t, void *, cred_t *); typedef sof_rval_t (*sof_connect_fn_t)(sof_handle_t, void *, struct sockaddr *, socklen_t *, cred_t *); typedef sof_rval_t (*sof_shutdown_fn_t)(sof_handle_t, void *, int *, cred_t *); typedef sof_rval_t (*sof_getsockname_fn_t)(sof_handle_t, void *, struct sockaddr *, socklen_t *, cred_t *); typedef sof_rval_t (*sof_getpeername_fn_t)(sof_handle_t, void *, struct sockaddr *, socklen_t *, cred_t *); typedef sof_rval_t (*sof_setsockopt_fn_t)(sof_handle_t, void *, int, int, void *, socklen_t *, cred_t *); typedef sof_rval_t (*sof_getsockopt_fn_t)(sof_handle_t, void *, int, int, void *, socklen_t *, cred_t *); typedef sof_rval_t (*sof_ioctl_fn_t)(sof_handle_t, void *, int, intptr_t, int, int32_t *, cred_t *); typedef void (*sof_mblk_prop_fn_t)(sof_handle_t, void *, ssize_t *, ushort_t *, ushort_t *); typedef void (*sof_notify_fn_t)(sof_handle_t, void *, sof_event_t, uintptr_t); typedef struct sof_ops { sof_attach_active_fn_t sofop_attach_active; sof_attach_passive_fn_t sofop_attach_passive; sof_detach_fn_t sofop_detach; sof_data_in_fn_t sofop_data_in; sof_data_in_proc_fn_t sofop_data_in_proc; sof_data_out_fn_t sofop_data_out; sof_bind_fn_t sofop_bind; sof_listen_fn_t sofop_listen; sof_connect_fn_t sofop_connect; sof_accept_fn_t sofop_accept; sof_shutdown_fn_t sofop_shutdown; sof_getsockname_fn_t sofop_getsockname; sof_getpeername_fn_t sofop_getpeername; sof_setsockopt_fn_t sofop_setsockopt; sof_getsockopt_fn_t sofop_getsockopt; sof_ioctl_fn_t sofop_ioctl; sof_mblk_prop_fn_t sofop_mblk_prop; sof_notify_fn_t sofop_notify; } sof_ops_t; #define SOF_VERSION 1 extern int sof_register(int, const char *, const sof_ops_t *, int); extern int sof_unregister(const char *); extern void sof_newconn_ready(sof_handle_t); extern void sof_bypass(sof_handle_t); extern void *sof_get_cookie(sof_handle_t); extern void *sof_cas_cookie(sof_handle_t, void *, void *); extern int sof_inject_data_out(sof_handle_t, mblk_t *, struct nmsghdr *, boolean_t *); extern int sof_inject_data_in(sof_handle_t, mblk_t *, size_t, int, boolean_t *); extern void sof_rcv_flowctrl(sof_handle_t, boolean_t); extern void sof_snd_flowctrl(sof_handle_t, boolean_t); extern boolean_t sof_newconn_move(sof_handle_t, sof_handle_t); #ifdef __cplusplus } #endif #endif /* _SYS_SOCKFILTER_H */