Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/net/bpf_jitter.c
39478 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
3
*
4
* Copyright (C) 2002-2003 NetGroup, Politecnico di Torino (Italy)
5
* Copyright (C) 2005-2017 Jung-uk Kim <[email protected]>
6
* All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
*
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
14
* 2. Redistributions in binary form must reproduce the above copyright
15
* notice, this list of conditions and the following disclaimer in the
16
* documentation and/or other materials provided with the distribution.
17
* 3. Neither the name of the Politecnico di Torino nor the names of its
18
* contributors may be used to endorse or promote products derived from
19
* this software without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
*/
33
34
#include <sys/cdefs.h>
35
#ifdef _KERNEL
36
#include "opt_bpf.h"
37
38
#include <sys/param.h>
39
#include <sys/kernel.h>
40
#include <sys/malloc.h>
41
#include <sys/mbuf.h>
42
#include <sys/sysctl.h>
43
#else
44
#include <stdlib.h>
45
#include <sys/mman.h>
46
#include <sys/param.h>
47
#include <sys/types.h>
48
#endif
49
50
#include <net/bpf.h>
51
#include <net/bpf_jitter.h>
52
53
static u_int bpf_jit_accept_all(u_char *, u_int, u_int);
54
55
#ifdef _KERNEL
56
MALLOC_DEFINE(M_BPFJIT, "BPF_JIT", "BPF JIT compiler");
57
58
SYSCTL_NODE(_net, OID_AUTO, bpf_jitter, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
59
"BPF JIT compiler");
60
int bpf_jitter_enable = 1;
61
SYSCTL_INT(_net_bpf_jitter, OID_AUTO, enable, CTLFLAG_RW,
62
&bpf_jitter_enable, 0, "enable BPF JIT compiler");
63
#endif
64
65
bpf_jit_filter *
66
bpf_jitter(struct bpf_insn *fp, int nins)
67
{
68
bpf_jit_filter *filter;
69
70
/* Allocate the filter structure. */
71
#ifdef _KERNEL
72
filter = (struct bpf_jit_filter *)malloc(sizeof(*filter),
73
M_BPFJIT, M_NOWAIT);
74
#else
75
filter = (struct bpf_jit_filter *)malloc(sizeof(*filter));
76
#endif
77
if (filter == NULL)
78
return (NULL);
79
80
/* No filter means accept all. */
81
if (fp == NULL || nins == 0) {
82
filter->func = bpf_jit_accept_all;
83
return (filter);
84
}
85
86
/* Create the binary. */
87
if ((filter->func = bpf_jit_compile(fp, nins, &filter->size)) == NULL) {
88
#ifdef _KERNEL
89
free(filter, M_BPFJIT);
90
#else
91
free(filter);
92
#endif
93
return (NULL);
94
}
95
96
return (filter);
97
}
98
99
void
100
bpf_destroy_jit_filter(bpf_jit_filter *filter)
101
{
102
103
#ifdef _KERNEL
104
if (filter->func != bpf_jit_accept_all)
105
free(filter->func, M_BPFJIT);
106
free(filter, M_BPFJIT);
107
#else
108
if (filter->func != bpf_jit_accept_all)
109
munmap(filter->func, filter->size);
110
free(filter);
111
#endif
112
}
113
114
static u_int
115
bpf_jit_accept_all(__unused u_char *p, __unused u_int wirelen,
116
__unused u_int buflen)
117
{
118
119
return ((u_int)-1);
120
}
121
122