Print this page
*** 1,39 ****
/*
! * This file and its contents are supplied under the terms of the
! * Common Development and Distribution License ("CDDL"), version 1.0.
! * You may only use this file in accordance with the terms of version
! * 1.0 of the CDDL.
*
! * A full copy of the text of the CDDL should have accompanied this
! * source. A copy of the CDDL is also available via the Internet at
! * http://www.illumos.org/license/CDDL.
*/
-
/*
* Copyright (c) 2012, OmniTI Computer Consulting, Inc. All rights reserved.
*/
- /*
- * This file implements a socketfilter used to deter TCP connections.
- * To defer a connection means to delay the return of accept(3SOCKET)
- * until at least one byte is ready to be read(2). This filter may be
- * applied automatically or programmatically through the use of
- * soconfig(1M) and setsockopt(3SOCKET).
- */
-
#include <sys/kmem.h>
#include <sys/systm.h>
#include <sys/stropts.h>
#include <sys/strsun.h>
#include <sys/socketvar.h>
#include <sys/sockfilter.h>
#include <sys/note.h>
#include <sys/taskq.h>
- #define DATAFILT_MODULE "datafilt"
-
static struct modlmisc dataf_modlmisc = {
&mod_miscops,
"Kernel data-ready socket filter"
};
--- 1,38 ----
/*
! * 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) 2012, OmniTI Computer Consulting, Inc. All rights reserved.
*/
#include <sys/kmem.h>
#include <sys/systm.h>
#include <sys/stropts.h>
#include <sys/strsun.h>
#include <sys/socketvar.h>
#include <sys/sockfilter.h>
#include <sys/note.h>
#include <sys/taskq.h>
static struct modlmisc dataf_modlmisc = {
&mod_miscops,
"Kernel data-ready socket filter"
};
*** 41,112 ****
MODREV_1,
&dataf_modlmisc,
NULL
};
! static sof_rval_t
dataf_attach_passive_cb(sof_handle_t handle, sof_handle_t ph,
void *parg, struct sockaddr *laddr, socklen_t laddrlen,
struct sockaddr *faddr, socklen_t faddrlen, void **cookiep)
{
- _NOTE(ARGUNUSED(handle, ph, parg, laddr, laddrlen, faddr, faddrlen,
- cookiep));
return (SOF_RVAL_DEFER);
}
! static void
dataf_detach_cb(sof_handle_t handle, void *cookie, cred_t *cr)
{
_NOTE(ARGUNUSED(handle, cookie, cr));
}
! static mblk_t *
dataf_data_in_cb(sof_handle_t handle, void *cookie, mblk_t *mp, int flags,
size_t *lenp)
{
_NOTE(ARGUNUSED(cookie, flags, lenp));
! if (mp != NULL && MBLKL(mp) > 0) {
sof_newconn_ready(handle);
- sof_bypass(handle);
- }
return (mp);
}
! static sof_ops_t dataf_ops = {
.sofop_attach_passive = dataf_attach_passive_cb,
.sofop_detach = dataf_detach_cb,
.sofop_data_in = dataf_data_in_cb
};
int
_init(void)
{
! int err;
/*
* This module is safe to attach even after some preliminary socket
* setup calls have taken place. See the comment for SOF_ATT_SAFE.
*/
! err = sof_register(SOF_VERSION, DATAFILT_MODULE, &dataf_ops,
SOF_ATT_SAFE);
! if (err != 0)
! return (err);
! if ((err = mod_install(&dataf_modlinkage)) != 0)
(void) sof_unregister(DATAFILT_MODULE);
! return (err);
}
int
_fini(void)
{
! int err;
! if ((err = sof_unregister(DATAFILT_MODULE)) != 0)
! return (err);
return (mod_remove(&dataf_modlinkage));
}
int
--- 40,113 ----
MODREV_1,
&dataf_modlmisc,
NULL
};
! #define DATAFILT_MODULE "datafilt"
!
! /* ARGSUSED */
! sof_rval_t
dataf_attach_passive_cb(sof_handle_t handle, sof_handle_t ph,
void *parg, struct sockaddr *laddr, socklen_t laddrlen,
struct sockaddr *faddr, socklen_t faddrlen, void **cookiep)
{
return (SOF_RVAL_DEFER);
}
! void
dataf_detach_cb(sof_handle_t handle, void *cookie, cred_t *cr)
{
_NOTE(ARGUNUSED(handle, cookie, cr));
}
! /*
! * Called for each incoming segment.
! */
! mblk_t *
dataf_data_in_cb(sof_handle_t handle, void *cookie, mblk_t *mp, int flags,
size_t *lenp)
{
_NOTE(ARGUNUSED(cookie, flags, lenp));
! if (mp != NULL && MBLKL(mp) > 0)
sof_newconn_ready(handle);
return (mp);
}
! sof_ops_t dataf_ops = {
.sofop_attach_passive = dataf_attach_passive_cb,
.sofop_detach = dataf_detach_cb,
.sofop_data_in = dataf_data_in_cb
};
int
_init(void)
{
! int error;
/*
* This module is safe to attach even after some preliminary socket
* setup calls have taken place. See the comment for SOF_ATT_SAFE.
*/
! error = sof_register(SOF_VERSION, DATAFILT_MODULE, &dataf_ops,
SOF_ATT_SAFE);
! if (error != 0)
! return (error);
! if ((error = mod_install(&dataf_modlinkage)) != 0)
(void) sof_unregister(DATAFILT_MODULE);
! return (error);
}
int
_fini(void)
{
! int error;
! if ((error = sof_unregister(DATAFILT_MODULE)) != 0)
! return (error);
return (mod_remove(&dataf_modlinkage));
}
int