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