Print this page
OS-5549 move bpf filter functions into ip module
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>
        
*** 19,29 ****
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2015 Joyent, Inc. All rights reserved.
   */
  
  #include <sys/types.h>
  #include <sys/param.h>
  #include <sys/systm.h>
--- 19,29 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2016 Joyent, Inc.
   */
  
  #include <sys/types.h>
  #include <sys/param.h>
  #include <sys/systm.h>
*** 49,58 ****
--- 49,59 ----
  #include <sys/dls.h>
  #include <sys/mac.h>
  #include <sys/mac_client.h>
  #include <sys/mac_provider.h>
  #include <sys/mac_client_priv.h>
+ #include <inet/bpf.h>
  
  #include <netpacket/packet.h>
  
  static void pfp_close(mac_handle_t, mac_client_handle_t);
  static int pfp_dl_to_arphrd(int);
*** 446,456 ****
                  } else {
                          buflen = 0;
                          buffer = (uchar_t *)mp;
                  }
                  rw_enter(&ps->ps_bpflock, RW_READER);
!                 if (bpf_filter(ps->ps_bpf.bf_insns, buffer,
                      hdr.mhi_pktsize, buflen) == 0) {
                          rw_exit(&ps->ps_bpflock);
                          ps->ps_stats.tp_drops++;
                          ks_stats.kp_recv_filtered.value.ui64++;
                          freemsg(mp);
--- 447,457 ----
                  } else {
                          buflen = 0;
                          buffer = (uchar_t *)mp;
                  }
                  rw_enter(&ps->ps_bpflock, RW_READER);
!                 if (ip_bpf_filter((ip_bpf_insn_t *)ps->ps_bpf.bf_insns, buffer,
                      hdr.mhi_pktsize, buflen) == 0) {
                          rw_exit(&ps->ps_bpflock);
                          ps->ps_stats.tp_drops++;
                          ks_stats.kp_recv_filtered.value.ui64++;
                          freemsg(mp);
*** 1334,1344 ****
  static int
  pfp_setsocket_sockopt(sock_lower_handle_t handle, int option_name,
      const void *optval, socklen_t optlen)
  {
          struct bpf_program prog;
!         struct bpf_insn *fcode;
          struct pfpsock *ps;
          struct sock_proto_props sopp;
          int error = 0;
          int size;
  
--- 1335,1345 ----
  static int
  pfp_setsocket_sockopt(sock_lower_handle_t handle, int option_name,
      const void *optval, socklen_t optlen)
  {
          struct bpf_program prog;
!         ip_bpf_insn_t *fcode;
          struct pfpsock *ps;
          struct sock_proto_props sopp;
          int error = 0;
          int size;
  
*** 1368,1381 ****
                  if (ddi_copyin(prog.bf_insns, fcode, size, 0) != 0) {
                          kmem_free(fcode, size);
                          return (EFAULT);
                  }
  
!                 if (bpf_validate(fcode, (int)prog.bf_len)) {
                          rw_enter(&ps->ps_bpflock, RW_WRITER);
                          pfp_release_bpf(ps);
!                         ps->ps_bpf.bf_insns = fcode;
                          ps->ps_bpf.bf_len = size;
                          rw_exit(&ps->ps_bpflock);
  
                          return (0);
                  }
--- 1369,1382 ----
                  if (ddi_copyin(prog.bf_insns, fcode, size, 0) != 0) {
                          kmem_free(fcode, size);
                          return (EFAULT);
                  }
  
!                 if (ip_bpf_validate(fcode, prog.bf_len)) {
                          rw_enter(&ps->ps_bpflock, RW_WRITER);
                          pfp_release_bpf(ps);
!                         ps->ps_bpf.bf_insns = (struct bpf_insn *)fcode;
                          ps->ps_bpf.bf_len = size;
                          rw_exit(&ps->ps_bpflock);
  
                          return (0);
                  }