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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/inet/sockmods/sockmod_pfp.c
          +++ new/usr/src/uts/common/inet/sockmods/sockmod_pfp.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  24      - * Copyright 2015 Joyent, Inc. All rights reserved.
       24 + * Copyright 2016 Joyent, Inc.
  25   25   */
  26   26  
  27   27  #include <sys/types.h>
  28   28  #include <sys/param.h>
  29   29  #include <sys/systm.h>
  30   30  #include <sys/stropts.h>
  31   31  #include <sys/socket.h>
  32   32  #include <sys/socketvar.h>
  33   33  #include <sys/socket_proto.h>
  34   34  #include <sys/sockio.h>
↓ open down ↓ 9 lines elided ↑ open up ↑
  44   44  #include <sys/llc1.h>
  45   45  #include <fs/sockfs/sockcommon.h>
  46   46  #include <net/if.h>
  47   47  #include <inet/ip_arp.h>
  48   48  
  49   49  #include <sys/dls.h>
  50   50  #include <sys/mac.h>
  51   51  #include <sys/mac_client.h>
  52   52  #include <sys/mac_provider.h>
  53   53  #include <sys/mac_client_priv.h>
       54 +#include <inet/bpf.h>
  54   55  
  55   56  #include <netpacket/packet.h>
  56   57  
  57   58  static void pfp_close(mac_handle_t, mac_client_handle_t);
  58   59  static int pfp_dl_to_arphrd(int);
  59   60  static int pfp_getpacket_sockopt(sock_lower_handle_t, int, void *,
  60   61      socklen_t *);
  61   62  static int pfp_ifreq_getlinkid(intptr_t, struct ifreq *, datalink_id_t *, int);
  62   63  static int pfp_lifreq_getlinkid(intptr_t, struct lifreq *, datalink_id_t *,
  63   64      int);
↓ open down ↓ 377 lines elided ↑ open up ↑
 441  442                  int buflen;
 442  443  
 443  444                  buflen = MBLKL(mp);
 444  445                  if (hdr.mhi_pktsize == buflen) {
 445  446                          buffer = mp->b_rptr;
 446  447                  } else {
 447  448                          buflen = 0;
 448  449                          buffer = (uchar_t *)mp;
 449  450                  }
 450  451                  rw_enter(&ps->ps_bpflock, RW_READER);
 451      -                if (bpf_filter(ps->ps_bpf.bf_insns, buffer,
      452 +                if (ip_bpf_filter((ip_bpf_insn_t *)ps->ps_bpf.bf_insns, buffer,
 452  453                      hdr.mhi_pktsize, buflen) == 0) {
 453  454                          rw_exit(&ps->ps_bpflock);
 454  455                          ps->ps_stats.tp_drops++;
 455  456                          ks_stats.kp_recv_filtered.value.ui64++;
 456  457                          freemsg(mp);
 457  458                          return;
 458  459                  }
 459  460                  rw_exit(&ps->ps_bpflock);
 460  461          }
 461  462  
↓ open down ↓ 867 lines elided ↑ open up ↑
1329 1330   *
1330 1331   * Both of these setsockopt values are candidates for being handled by the
1331 1332   * socket layer itself in future, however this requires understanding how
1332 1333   * they would interact with all other sockets.
1333 1334   */
1334 1335  static int
1335 1336  pfp_setsocket_sockopt(sock_lower_handle_t handle, int option_name,
1336 1337      const void *optval, socklen_t optlen)
1337 1338  {
1338 1339          struct bpf_program prog;
1339      -        struct bpf_insn *fcode;
     1340 +        ip_bpf_insn_t *fcode;
1340 1341          struct pfpsock *ps;
1341 1342          struct sock_proto_props sopp;
1342 1343          int error = 0;
1343 1344          int size;
1344 1345  
1345 1346          ps = (struct pfpsock *)handle;
1346 1347  
1347 1348          switch (option_name) {
1348 1349          case SO_ATTACH_FILTER :
1349 1350  #ifdef _LP64
↓ open down ↓ 13 lines elided ↑ open up ↑
1363 1364                  if (prog.bf_len > BPF_MAXINSNS)
1364 1365                          return (EINVAL);
1365 1366  
1366 1367                  size = prog.bf_len * sizeof (*prog.bf_insns);
1367 1368                  fcode = kmem_alloc(size, KM_SLEEP);
1368 1369                  if (ddi_copyin(prog.bf_insns, fcode, size, 0) != 0) {
1369 1370                          kmem_free(fcode, size);
1370 1371                          return (EFAULT);
1371 1372                  }
1372 1373  
1373      -                if (bpf_validate(fcode, (int)prog.bf_len)) {
     1374 +                if (ip_bpf_validate(fcode, prog.bf_len)) {
1374 1375                          rw_enter(&ps->ps_bpflock, RW_WRITER);
1375 1376                          pfp_release_bpf(ps);
1376      -                        ps->ps_bpf.bf_insns = fcode;
     1377 +                        ps->ps_bpf.bf_insns = (struct bpf_insn *)fcode;
1377 1378                          ps->ps_bpf.bf_len = size;
1378 1379                          rw_exit(&ps->ps_bpflock);
1379 1380  
1380 1381                          return (0);
1381 1382                  }
1382 1383                  kmem_free(fcode, size);
1383 1384                  error = EINVAL;
1384 1385                  break;
1385 1386  
1386 1387          case SO_DETACH_FILTER :
↓ open down ↓ 176 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX