summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/bpf_jit_machdep.c32
-rw-r--r--sys/i386/i386/bpf_jit_machdep.c32
-rw-r--r--sys/net/bpf_jitter.c61
-rw-r--r--sys/net/bpf_jitter.h6
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;
OpenPOWER on IntegriCloud