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