Changeset e10d1cd in rtems-libbsd


Ignore:
Timestamp:
Dec 13, 2013, 9:57:03 AM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
06ad80c
Parents:
1fea8c4
git-author:
Sebastian Huber <sebastian.huber@…> (12/13/13 09:57:03)
git-committer:
Sebastian Huber <sebastian.huber@…> (12/16/13 14:35:51)
Message:

BPF(4): Add support

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • freebsd/sys/net/bpf.c

    r1fea8c4 re10d1cd  
    8989
    9090#include <security/mac/mac_framework.h>
     91#ifdef __rtems__
     92#include <rtems/imfs.h>
     93#define devfs_get_cdevpriv(x) 0
     94#define devtoname(x) "bpf"
     95#endif /* __rtems__ */
    9196
    9297MALLOC_DEFINE(M_BPF, "BPF", "BPF data");
     
    174179SYSCTL_INT(_net_bpf, OID_AUTO, maxinsns, CTLFLAG_RW,
    175180    &bpf_maxinsns, 0, "Maximum bpf program instructions");
     181#ifndef __rtems__
    176182static int bpf_zerocopy_enable = 0;
    177183SYSCTL_INT(_net_bpf, OID_AUTO, zerocopy_enable, CTLFLAG_RW,
    178184    &bpf_zerocopy_enable, 0, "Enable new zero-copy BPF buffer sessions");
     185#endif /* __rtems__ */
    179186static SYSCTL_NODE(_net_bpf, OID_AUTO, stats, CTLFLAG_MPSAFE | CTLFLAG_RW,
    180187    bpf_stats_sysctl, "bpf statistics portal");
     
    186193    "Do not send packets until BPF program is set");
    187194
     195#ifndef __rtems__
    188196static  d_open_t        bpfopen;
    189197static  d_read_t        bpfread;
     
    203211        .d_kqfilter =   bpfkqfilter,
    204212};
     213#endif /* __rtems__ */
    205214
    206215static struct filterops bpfread_filtops = {
     
    257266                return (bpf_buffer_append_bytes(d, buf, offset, src, len));
    258267
     268#ifndef __rtems__
    259269        case BPF_BUFMODE_ZBUF:
    260270                d->bd_zcopy++;
    261271                return (bpf_zerocopy_append_bytes(d, buf, offset, src, len));
     272#endif /* __rtems__ */
    262273
    263274        default:
     
    277288                return (bpf_buffer_append_mbuf(d, buf, offset, src, len));
    278289
     290#ifndef __rtems__
    279291        case BPF_BUFMODE_ZBUF:
    280292                d->bd_zcopy++;
    281293                return (bpf_zerocopy_append_mbuf(d, buf, offset, src, len));
     294#endif /* __rtems__ */
    282295
    283296        default:
     
    299312                return;
    300313
     314#ifndef __rtems__
    301315        case BPF_BUFMODE_ZBUF:
    302316                bpf_zerocopy_buf_reclaimed(d);
    303317                return;
     318#endif /* __rtems__ */
    304319
    305320        default:
     
    319334        BPFD_LOCK_ASSERT(d);
    320335
     336#ifndef __rtems__
    321337        switch (d->bd_bufmode) {
    322338        case BPF_BUFMODE_ZBUF:
    323339                return (bpf_zerocopy_canfreebuf(d));
    324340        }
     341#endif /* __rtems__ */
    325342        return (0);
    326343}
     
    336353        BPFD_LOCK_ASSERT(d);
    337354
     355#ifndef __rtems__
    338356        switch (d->bd_bufmode) {
    339357        case BPF_BUFMODE_ZBUF:
    340358                return (bpf_zerocopy_canwritebuf(d));
    341359        }
     360#endif /* __rtems__ */
    342361        return (1);
    343362}
     
    354373        BPFD_LOCK_ASSERT(d);
    355374
     375#ifndef __rtems__
    356376        switch (d->bd_bufmode) {
    357377        case BPF_BUFMODE_ZBUF:
     
    359379                break;
    360380        }
     381#endif /* __rtems__ */
    361382}
    362383
     
    370391        BPFD_LOCK_ASSERT(d);
    371392
     393#ifndef __rtems__
    372394        switch (d->bd_bufmode) {
    373395        case BPF_BUFMODE_ZBUF:
     
    375397                break;
    376398        }
     399#endif /* __rtems__ */
    377400}
    378401
     
    385408                return (bpf_buffer_free(d));
    386409
     410#ifndef __rtems__
    387411        case BPF_BUFMODE_ZBUF:
    388412                return (bpf_zerocopy_free(d));
     413#endif /* __rtems__ */
    389414
    390415        default:
     
    415440{
    416441
     442#ifndef __rtems__
    417443        if (d->bd_bufmode != BPF_BUFMODE_ZBUF)
    418444                return (EOPNOTSUPP);
    419445        return (bpf_zerocopy_ioctl_getzmax(td, d, i));
     446#else /* __rtems__ */
     447        return (EOPNOTSUPP);
     448#endif /* __rtems__ */
    420449}
    421450
     
    424453{
    425454
     455#ifndef __rtems__
    426456        if (d->bd_bufmode != BPF_BUFMODE_ZBUF)
    427457                return (EOPNOTSUPP);
    428458        return (bpf_zerocopy_ioctl_rotzbuf(td, d, bz));
     459#else /* __rtems__ */
     460        return (EOPNOTSUPP);
     461#endif /* __rtems__ */
    429462}
    430463
     
    433466{
    434467
     468#ifndef __rtems__
    435469        if (d->bd_bufmode != BPF_BUFMODE_ZBUF)
    436470                return (EOPNOTSUPP);
    437471        return (bpf_zerocopy_ioctl_setzbuf(td, d, bz));
     472#else /* __rtems__ */
     473        return (EOPNOTSUPP);
     474#endif /* __rtems__ */
    438475}
    439476
     
    803840 */
    804841/* ARGSUSED */
     842#ifndef __rtems__
    805843static  int
     844#else /* __rtems__ */
     845static struct bpf_d *
     846#endif /* __rtems__ */
    806847bpfopen(struct cdev *dev, int flags, int fmt, struct thread *td)
    807848{
    808849        struct bpf_d *d;
     850#ifndef __rtems__
    809851        int error, size;
    810852
     
    815857                return (error);
    816858        }
     859#else /* __rtems__ */
     860        u_int size;
     861
     862        d = malloc(sizeof(*d), M_BPF, M_NOWAIT | M_ZERO);
     863        if (d == NULL) {
     864                return (d);
     865        }
     866#endif /* __rtems__ */
    817867
    818868        /*
     
    839889        bpf_buffer_ioctl_sblen(d, &size);
    840890
     891#ifndef __rtems__
    841892        return (0);
     893#else /* __rtems__ */
     894        return (d);
     895#endif /* __rtems__ */
    842896}
    843897
     
    846900 */
    847901static  int
     902#ifndef __rtems__
    848903bpfread(struct cdev *dev, struct uio *uio, int ioflag)
    849 {
     904#else /* __rtems__ */
     905bpfread(struct bpf_d *d, struct uio *uio, int ioflag)
     906#endif /* __rtems__ */
     907{
     908#ifndef __rtems__
    850909        struct bpf_d *d;
     910#endif /* __rtems__ */
    851911        int error;
    852912        int non_block;
     
    9911051        }
    9921052        wakeup(d);
     1053#ifndef __rtems__
    9931054        if (d->bd_async && d->bd_sig && d->bd_sigio)
    9941055                pgsigio(&d->bd_sigio, d->bd_sig, 0);
     1056#endif /* __rtems__ */
    9951057
    9961058        selwakeuppri(&d->bd_sel, PRINET);
     
    10291091
    10301092static int
     1093#ifndef __rtems__
    10311094bpfwrite(struct cdev *dev, struct uio *uio, int ioflag)
    1032 {
     1095#else /* __rtems__ */
     1096bpfwrite(struct bpf_d *d, struct uio *uio, int ioflag)
     1097#endif /* __rtems__ */
     1098{
     1099#ifndef __rtems__
    10331100        struct bpf_d *d;
     1101#endif /* __rtems__ */
    10341102        struct ifnet *ifp;
    10351103        struct mbuf *m, *mc;
     
    11811249/* ARGSUSED */
    11821250static  int
     1251#ifndef __rtems__
    11831252bpfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags,
    11841253    struct thread *td)
    1185 {
     1254#else /* __rtems__ */
     1255bpfioctl(struct bpf_d *d, u_long cmd, caddr_t addr, int flags,
     1256    struct thread *td)
     1257#endif /* __rtems__ */
     1258{
     1259#ifndef __rtems__
    11861260        struct bpf_d *d;
     1261#endif /* __rtems__ */
    11871262        int error;
    11881263
     
    16161691                break;
    16171692
     1693#ifndef __rtems__
    16181694        case FIOASYNC:          /* Send signal on receive packets */
    16191695                BPFD_LOCK(d);
     
    16211697                BPFD_UNLOCK(d);
    16221698                break;
     1699#endif /* __rtems__ */
    16231700
    16241701        case FIOSETOWN:
     
    16851762                        break;
    16861763
     1764#ifndef __rtems__
    16871765                case BPF_BUFMODE_ZBUF:
    16881766                        if (bpf_zerocopy_enable)
    16891767                                break;
    16901768                        /* FALLSTHROUGH */
     1769#endif /* __rtems__ */
    16911770
    16921771                default:
     
    18861965        switch (d->bd_bufmode) {
    18871966        case BPF_BUFMODE_BUFFER:
     1967#ifndef __rtems__
    18881968        case BPF_BUFMODE_ZBUF:
     1969#endif /* __rtems__ */
    18891970                if (d->bd_sbuf == NULL)
    18901971                        return (EINVAL);
     
    19091990 */
    19101991static int
     1992#ifndef __rtems__
    19111993bpfpoll(struct cdev *dev, int events, struct thread *td)
    1912 {
     1994#else /* __rtems__ */
     1995bpfpoll(struct bpf_d *d, int events, struct thread *td)
     1996#endif /* __rtems__ */
     1997{
     1998#ifndef __rtems__
    19131999        struct bpf_d *d;
     2000#endif /* __rtems__ */
    19142001        int revents;
    19152002
     
    19452032 * reject all others.
    19462033 */
     2034#ifdef __rtems__
     2035static
     2036#endif /* __rtems__ */
    19472037int
     2038#ifndef __rtems__
    19482039bpfkqfilter(struct cdev *dev, struct knote *kn)
    1949 {
     2040#else /* __rtems__ */
     2041bpfkqfilter(struct bpf_d *d, struct knote *kn)
     2042#endif /* __rtems__ */
     2043{
     2044#ifndef __rtems__
    19502045        struct bpf_d *d;
     2046#endif /* __rtems__ */
    19512047
    19522048        if (devfs_get_cdevpriv((void **)&d) != 0 ||
     
    26722768        return (bp == NULL ? EINVAL : 0);
    26732769}
     2770#ifdef __rtems__
     2771static struct bpf_d *
     2772bpf_imfs_get_context_by_iop(const rtems_libio_t *iop)
     2773{
     2774        return iop->data1;
     2775}
     2776
     2777static int
     2778bpf_imfs_open(rtems_libio_t *iop, const char *path, int oflag, mode_t mode)
     2779{
     2780        struct bpf_d *d;
     2781
     2782        d = bpfopen(NULL, 0, 0, NULL);
     2783        iop->data1 = d;
     2784
     2785        if (d != NULL) {
     2786                return (0);
     2787        } else {
     2788                rtems_set_errno_and_return_minus_one(ENOMEM);
     2789        }
     2790}
     2791
     2792static int
     2793bpf_imfs_close(rtems_libio_t *iop)
     2794{
     2795        struct bpf_d *d = bpf_imfs_get_context_by_iop(iop);
     2796
     2797        bpf_dtor(d);
     2798
     2799        return (0);
     2800}
     2801
     2802static ssize_t
     2803bpf_imfs_readv(rtems_libio_t *iop, const struct iovec *iov, int iovcnt, ssize_t total)
     2804{
     2805        struct bpf_d *d = bpf_imfs_get_context_by_iop(iop);
     2806        struct thread *td = rtems_bsd_get_curthread_or_null();
     2807        struct uio uio = {
     2808                .uio_iov = iov,
     2809                .uio_iovcnt = iovcnt,
     2810                .uio_offset = 0,
     2811                .uio_resid = total,
     2812                .uio_segflg = UIO_USERSPACE,
     2813                .uio_rw = UIO_READ,
     2814                .uio_td = td
     2815        };
     2816        int error;
     2817
     2818        if (td != NULL) {
     2819                error = bpfread(d, &uio,
     2820                    rtems_libio_to_fcntl_flags(iop->flags));
     2821        } else {
     2822                error = ENOMEM;
     2823        }
     2824
     2825        if (error == 0) {
     2826                return (total - uio.uio_resid);
     2827        } else {
     2828                rtems_set_errno_and_return_minus_one(error);
     2829        }
     2830}
     2831
     2832static ssize_t
     2833bpf_imfs_read(rtems_libio_t *iop, void *buffer, size_t count)
     2834{
     2835        struct iovec iov = {
     2836                .iov_base = buffer,
     2837                .iov_len = count
     2838        };
     2839
     2840        return bpf_imfs_readv(iop, &iov, 1, count);
     2841}
     2842
     2843static ssize_t
     2844bpf_imfs_writev(rtems_libio_t *iop, const struct iovec *iov, int iovcnt, ssize_t total)
     2845{
     2846        struct bpf_d *d = bpf_imfs_get_context_by_iop(iop);
     2847        struct thread *td = rtems_bsd_get_curthread_or_null();
     2848        struct uio uio = {
     2849                .uio_iov = iov,
     2850                .uio_iovcnt = iovcnt,
     2851                .uio_offset = 0,
     2852                .uio_resid = total,
     2853                .uio_segflg = UIO_USERSPACE,
     2854                .uio_rw = UIO_WRITE,
     2855                .uio_td = td
     2856        };
     2857        int error;
     2858
     2859        if (td != NULL) {
     2860                error = bpfwrite(d, &uio,
     2861                    rtems_libio_to_fcntl_flags(iop->flags));
     2862        } else {
     2863                error = ENOMEM;
     2864        }
     2865
     2866        if (error == 0) {
     2867                return (total - uio.uio_resid);
     2868        } else {
     2869                rtems_set_errno_and_return_minus_one(error);
     2870        }
     2871}
     2872
     2873static ssize_t
     2874bpf_imfs_write(rtems_libio_t *iop, const void *buffer, size_t count)
     2875{
     2876        struct iovec iov = {
     2877                .iov_base = buffer,
     2878                .iov_len = count
     2879        };
     2880
     2881        return bpf_imfs_writev(iop, &iov, 1, count);
     2882}
     2883
     2884static int
     2885bpf_imfs_ioctl(rtems_libio_t *iop, ioctl_command_t request, void *buffer)
     2886{
     2887        struct bpf_d *d = bpf_imfs_get_context_by_iop(iop);
     2888        struct thread *td = rtems_bsd_get_curthread_or_null();
     2889        int error;
     2890
     2891        if (td != 0) {
     2892                error = bpfioctl(d, request, buffer, 0, td);
     2893        } else {
     2894                error = ENOMEM;
     2895        }
     2896
     2897        return rtems_bsd_error_to_status_and_errno(error);
     2898}
     2899
     2900static int
     2901bpf_imfs_poll(rtems_libio_t *iop, int events)
     2902{
     2903        struct bpf_d *d = bpf_imfs_get_context_by_iop(iop);
     2904
     2905        return (bpfpoll(d, events, rtems_bsd_get_curthread_or_wait_forever()));
     2906}
     2907
     2908static int
     2909bpf_imfs_kqfilter(rtems_libio_t *iop, struct knote *kn)
     2910{
     2911        struct bpf_d *d = bpf_imfs_get_context_by_iop(iop);
     2912
     2913        return (bpfkqfilter(d, kn));
     2914}
     2915
     2916static const rtems_filesystem_file_handlers_r bpf_imfs_handlers = {
     2917        .open_h = bpf_imfs_open,
     2918        .close_h = bpf_imfs_close,
     2919        .read_h = bpf_imfs_read,
     2920        .write_h = bpf_imfs_write,
     2921        .ioctl_h = bpf_imfs_ioctl,
     2922        .lseek_h = rtems_filesystem_default_lseek_file,
     2923        .fstat_h = rtems_filesystem_default_fstat,
     2924        .ftruncate_h = rtems_filesystem_default_ftruncate,
     2925        .fsync_h = rtems_filesystem_default_fsync_or_fdatasync,
     2926        .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync,
     2927        .fcntl_h = rtems_filesystem_default_fcntl,
     2928        .poll_h = bpf_imfs_poll,
     2929        .kqfilter_h = bpf_imfs_kqfilter,
     2930        .readv_h = bpf_imfs_readv,
     2931        .writev_h = bpf_imfs_writev
     2932};
     2933
     2934static const IMFS_node_control bpf_imfs_control = {
     2935        .imfs_type = IMFS_GENERIC,
     2936        .handlers = &bpf_imfs_handlers,
     2937        .node_initialize = IMFS_node_initialize_default,
     2938        .node_remove = IMFS_node_remove_default,
     2939        .node_destroy = IMFS_node_destroy_default
     2940};
     2941#endif /* __rtems__ */
    26742942
    26752943static void
    26762944bpf_drvinit(void *unused)
    26772945{
     2946#ifndef __rtems__
    26782947        struct cdev *dev;
     2948#else /* __rtems__ */
     2949        mode_t mode = S_IFCHR | S_IRWXU | S_IRWXG | S_IRWXO;
     2950        int rv;
     2951#endif /* __rtems__ */
    26792952
    26802953        mtx_init(&bpf_mtx, "bpf global lock", NULL, MTX_DEF);
    26812954        LIST_INIT(&bpf_iflist);
    26822955
     2956#ifndef __rtems__
    26832957        dev = make_dev(&bpf_cdevsw, 0, UID_ROOT, GID_WHEEL, 0600, "bpf");
    26842958        /* For compatibility */
    26852959        make_dev_alias(dev, "bpf0");
     2960#else /* __rtems__ */
     2961        rv = IMFS_make_generic_node("/dev/bpf", mode, &bpf_imfs_control, NULL);
     2962        BSD_ASSERT(rv == 0);
     2963#endif /* __rtems__ */
    26862964
    26872965        /* Register interface departure handler */
     
    27363014        d->bd_direction = bd->bd_direction;
    27373015        d->bd_feedback = bd->bd_feedback;
     3016#ifndef __rtems__
    27383017        d->bd_async = bd->bd_async;
     3018#endif /* __rtems__ */
    27393019        d->bd_rcount = bd->bd_rcount;
    27403020        d->bd_dcount = bd->bd_dcount;
  • freebsd/sys/net/bpfdesc.h

    r1fea8c4 re10d1cd  
    8686        int             bd_tstamp;      /* select time stamping function */
    8787        int             bd_feedback;    /* true to feed back sent packets */
     88#ifndef __rtems__
    8889        int             bd_async;       /* non-zero if packet reception should generate signal */
     90#endif /* __rtems__ */
    8991        int             bd_sig;         /* signal to send upon packet reception */
    9092        struct sigio *  bd_sigio;       /* information for async I/O */
     
    113115#define BPFD_LOCK_ASSERT(bd)    mtx_assert(&(bd)->bd_lock, MA_OWNED)
    114116
     117#ifndef __rtems__
    115118#define BPF_PID_REFRESH(bd, td) (bd)->bd_pid = (td)->td_proc->p_pid
    116119#define BPF_PID_REFRESH_CUR(bd) (bd)->bd_pid = curthread->td_proc->p_pid
     120#else /* __rtems__ */
     121#define BPF_PID_REFRESH(bd, td) do { } while (0)
     122#define BPF_PID_REFRESH_CUR(bd) do { } while (0)
     123#endif /* __rtems__ */
    117124
    118125#define BPF_LOCK()              mtx_lock(&bpf_mtx)
     
    130137        int             bd_direction;
    131138        int             bd_feedback;
     139#ifndef __rtems__
    132140        int             bd_async;
     141#endif /* __rtems__ */
    133142        u_int64_t       bd_rcount;
    134143        u_int64_t       bd_dcount;
  • freebsd/usr.bin/netstat/bpf.c

    r1fea8c4 re10d1cd  
    9090            ((bd->bd_direction == BPF_D_OUT) ? 'o' : 's');
    9191        *flagbuf++ = bd->bd_feedback ? 'b' : '-';
     92#ifndef __rtems__
    9293        *flagbuf++ = bd->bd_async ? 'a' : '-';
     94#endif /* __rtems__ */
    9395        *flagbuf++ = bd->bd_locked ? 'l' : '-';
    9496        *flagbuf++ = '\0';
  • libbsd.txt

    r1fea8c4 re10d1cd  
    109109
    110110* <sys/param.h>: Update Newlib to use a MSIZE of 256.
     111
     112* BPF(4): Add support for zero-copy buffers.
    111113
    112114[listing]
  • rtemsbsd/include/rtems/bsd/local/opt_bpf.h

    r1fea8c4 re10d1cd  
     1#define DEV_BPF 1
Note: See TracChangeset for help on using the changeset viewer.