diff options
-rw-r--r-- | sys/amd64/amd64/bpf_jit_machdep.c | 32 | ||||
-rw-r--r-- | sys/i386/i386/bpf_jit_machdep.c | 32 | ||||
-rw-r--r-- | sys/net/bpf_jitter.c | 61 | ||||
-rw-r--r-- | sys/net/bpf_jitter.h | 6 |
4 files changed, 112 insertions, 19 deletions
diff --git a/sys/amd64/amd64/bpf_jit_machdep.c b/sys/amd64/amd64/bpf_jit_machdep.c index 62436b9..90eb735 100644 --- a/sys/amd64/amd64/bpf_jit_machdep.c +++ b/sys/amd64/amd64/bpf_jit_machdep.c @@ -32,16 +32,20 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#ifdef _KERNEL #include "opt_bpf.h" - #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/types.h> #include <sys/socket.h> #include <sys/malloc.h> - #include <net/if.h> +#else +#include <stdlib.h> +#endif + +#include <sys/types.h> + #include <net/bpf.h> #include <net/bpf_jitter.h> @@ -53,7 +57,7 @@ bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, int *); * emit routine to update the jump table */ static void -emit_length(bpf_bin_stream *stream, u_int value, u_int len) +emit_length(bpf_bin_stream *stream, __unused u_int value, u_int len) { (stream->refs)[stream->bpf_pc] += len; @@ -108,8 +112,12 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) return (NULL); /* Allocate the reference table for the jumps */ +#ifdef _KERNEL stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int), M_BPFJIT, M_NOWAIT); +#else + stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int)); +#endif if (stream.refs == NULL) return (NULL); @@ -141,7 +149,11 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) switch (ins->code) { default: +#ifdef _KERNEL return (NULL); +#else + abort(); +#endif case BPF_RET|BPF_K: MOVid(ins->k, EAX); @@ -450,11 +462,19 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) if (pass == 2) break; +#ifdef _KERNEL stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT); if (stream.ibuf == NULL) { free(stream.refs, M_BPFJIT); return (NULL); } +#else + stream.ibuf = (char *)malloc(stream.cur_ip); + if (stream.ibuf == NULL) { + free(stream.refs); + return (NULL); + } +#endif /* * modify the reference table to contain the offsets and @@ -475,7 +495,11 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) * the reference table is needed only during compilation, * now we can free it */ +#ifdef _KERNEL free(stream.refs, M_BPFJIT); +#else + free(stream.refs); +#endif return ((bpf_filter_func)stream.ibuf); } diff --git a/sys/i386/i386/bpf_jit_machdep.c b/sys/i386/i386/bpf_jit_machdep.c index d8d9e51..a2597f0 100644 --- a/sys/i386/i386/bpf_jit_machdep.c +++ b/sys/i386/i386/bpf_jit_machdep.c @@ -32,16 +32,20 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#ifdef _KERNEL #include "opt_bpf.h" - #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> -#include <sys/types.h> #include <sys/socket.h> #include <sys/malloc.h> - #include <net/if.h> +#else +#include <stdlib.h> +#endif + +#include <sys/types.h> + #include <net/bpf.h> #include <net/bpf_jitter.h> @@ -53,7 +57,7 @@ bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, int *); * emit routine to update the jump table */ static void -emit_length(bpf_bin_stream *stream, u_int value, u_int len) +emit_length(bpf_bin_stream *stream, __unused u_int value, u_int len) { (stream->refs)[stream->bpf_pc] += len; @@ -108,8 +112,12 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) return (NULL); /* Allocate the reference table for the jumps */ +#ifdef _KERNEL stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int), M_BPFJIT, M_NOWAIT); +#else + stream.refs = (u_int *)malloc((nins + 1) * sizeof(u_int)); +#endif if (stream.refs == NULL) return (NULL); @@ -144,7 +152,11 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) switch (ins->code) { default: +#ifdef _KERNEL return (NULL); +#else + abort(); +#endif case BPF_RET|BPF_K: MOVid(ins->k, EAX); @@ -473,11 +485,19 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) if (pass == 2) break; +#ifdef _KERNEL stream.ibuf = (char *)malloc(stream.cur_ip, M_BPFJIT, M_NOWAIT); if (stream.ibuf == NULL) { free(stream.refs, M_BPFJIT); return (NULL); } +#else + stream.ibuf = (char *)malloc(stream.cur_ip); + if (stream.ibuf == NULL) { + free(stream.refs); + return (NULL); + } +#endif /* * modify the reference table to contain the offsets and @@ -498,7 +518,11 @@ bpf_jit_compile(struct bpf_insn *prog, u_int nins, int *mem) * the reference table is needed only during compilation, * now we can free it */ +#ifdef _KERNEL free(stream.refs, M_BPFJIT); +#else + free(stream.refs); +#endif return ((bpf_filter_func)stream.ibuf); } diff --git a/sys/net/bpf_jitter.c b/sys/net/bpf_jitter.c index b1a61c5..69b2511 100644 --- a/sys/net/bpf_jitter.c +++ b/sys/net/bpf_jitter.c @@ -1,6 +1,6 @@ /*- - * Copyright (c) 2002 - 2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (c) 2005 Jung-uk Kim <jkim@FreeBSD.org> + * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) + * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#ifdef _KERNEL #include "opt_bpf.h" #include <sys/param.h> @@ -39,14 +40,19 @@ __FBSDID("$FreeBSD$"); #include <sys/malloc.h> #include <sys/mbuf.h> #include <sys/sysctl.h> +#else +#include <stdlib.h> +#include <sys/types.h> +#endif #include <net/bpf.h> #include <net/bpf_jitter.h> -MALLOC_DEFINE(M_BPFJIT, "BPF_JIT", "BPF JIT compiler"); - bpf_filter_func bpf_jit_compile(struct bpf_insn *, u_int, int *); +#ifdef _KERNEL +MALLOC_DEFINE(M_BPFJIT, "BPF_JIT", "BPF JIT compiler"); + SYSCTL_NODE(_net, OID_AUTO, bpf_jitter, CTLFLAG_RW, 0, "BPF JIT compiler"); int bpf_jitter_enable = 1; SYSCTL_INT(_net_bpf_jitter, OID_AUTO, enable, CTLFLAG_RW, @@ -58,27 +64,27 @@ bpf_jitter(struct bpf_insn *fp, int nins) bpf_jit_filter *filter; /* Allocate the filter structure */ - filter = (struct bpf_jit_filter *)malloc(sizeof(struct bpf_jit_filter), + filter = (struct bpf_jit_filter *)malloc(sizeof(*filter), M_BPFJIT, M_NOWAIT); if (filter == NULL) - return NULL; + return (NULL); /* Allocate the filter's memory */ filter->mem = (int *)malloc(BPF_MEMWORDS * sizeof(int), M_BPFJIT, M_NOWAIT); if (filter->mem == NULL) { free(filter, M_BPFJIT); - return NULL; + return (NULL); } /* Create the binary */ if ((filter->func = bpf_jit_compile(fp, nins, filter->mem)) == NULL) { free(filter->mem, M_BPFJIT); free(filter, M_BPFJIT); - return NULL; + return (NULL); } - return filter; + return (filter); } void @@ -89,3 +95,40 @@ bpf_destroy_jit_filter(bpf_jit_filter *filter) free(filter->func, M_BPFJIT); free(filter, M_BPFJIT); } +#else +bpf_jit_filter * +bpf_jitter(struct bpf_insn *fp, int nins) +{ + bpf_jit_filter *filter; + + /* Allocate the filter structure */ + filter = (struct bpf_jit_filter *)malloc(sizeof(*filter)); + if (filter == NULL) + return (NULL); + + /* Allocate the filter's memory */ + filter->mem = (int *)malloc(BPF_MEMWORDS * sizeof(int)); + if (filter->mem == NULL) { + free(filter); + return (NULL); + } + + /* Create the binary */ + if ((filter->func = bpf_jit_compile(fp, nins, filter->mem)) == NULL) { + free(filter->mem); + free(filter); + return (NULL); + } + + return (filter); +} + +void +bpf_destroy_jit_filter(bpf_jit_filter *filter) +{ + + free(filter->mem); + free(filter->func); + free(filter); +} +#endif diff --git a/sys/net/bpf_jitter.h b/sys/net/bpf_jitter.h index 9eed2c9..bba33a4 100644 --- a/sys/net/bpf_jitter.h +++ b/sys/net/bpf_jitter.h @@ -1,6 +1,6 @@ /*- - * Copyright (c) 2002 - 2003 NetGroup, Politecnico di Torino (Italy) - * Copyright (c) 2005 Jung-uk Kim <jkim@FreeBSD.org> + * Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy) + * Copyright (C) 2005-2008 Jung-uk Kim <jkim@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,9 @@ #ifndef _NET_BPF_JITTER_H_ #define _NET_BPF_JITTER_H_ +#ifdef _KERNEL MALLOC_DECLARE(M_BPFJIT); +#endif extern int bpf_jitter_enable; |