Deleted Added
full compact
bpf.c (150929) bpf.c (153151)
1/*-
2 * Copyright (c) 1990, 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from the Stanford/CMU enet packet filter,
6 * (net/enet.c) distributed as part of 4.3BSD, and code contributed
7 * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence
8 * Berkeley Laboratory.

--- 19 unchanged lines hidden (view full) ---

28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 * @(#)bpf.c 8.4 (Berkeley) 1/9/95
35 *
1/*-
2 * Copyright (c) 1990, 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from the Stanford/CMU enet packet filter,
6 * (net/enet.c) distributed as part of 4.3BSD, and code contributed
7 * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence
8 * Berkeley Laboratory.

--- 19 unchanged lines hidden (view full) ---

28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 * @(#)bpf.c 8.4 (Berkeley) 1/9/95
35 *
36 * $FreeBSD: head/sys/net/bpf.c 150929 2005-10-04 15:06:10Z csjp $
36 * $FreeBSD: head/sys/net/bpf.c 153151 2005-12-06 02:58:12Z jkim $
37 */
38
39#include "opt_bpf.h"
40#include "opt_mac.h"
41#include "opt_netgraph.h"
42
43#include <sys/types.h>
44#include <sys/param.h>

--- 15 unchanged lines hidden (view full) ---

60#include <sys/file.h>
61#include <sys/poll.h>
62#include <sys/proc.h>
63
64#include <sys/socket.h>
65
66#include <net/if.h>
67#include <net/bpf.h>
37 */
38
39#include "opt_bpf.h"
40#include "opt_mac.h"
41#include "opt_netgraph.h"
42
43#include <sys/types.h>
44#include <sys/param.h>

--- 15 unchanged lines hidden (view full) ---

60#include <sys/file.h>
61#include <sys/poll.h>
62#include <sys/proc.h>
63
64#include <sys/socket.h>
65
66#include <net/if.h>
67#include <net/bpf.h>
68#ifdef BPF_JITTER
69#include <net/bpf_jitter.h>
70#endif
68#include <net/bpfdesc.h>
69
70#include <netinet/in.h>
71#include <netinet/if_ether.h>
72#include <sys/kernel.h>
73#include <sys/sysctl.h>
74
75static MALLOC_DEFINE(M_BPF, "BPF", "BPF data");

--- 45 unchanged lines hidden (view full) ---

121static int bpf_maxbufsize = BPF_MAXBUFSIZE;
122SYSCTL_INT(_net_bpf, OID_AUTO, maxbufsize, CTLFLAG_RW,
123 &bpf_maxbufsize, 0, "");
124static int bpf_maxinsns = BPF_MAXINSNS;
125SYSCTL_INT(_net_bpf, OID_AUTO, maxinsns, CTLFLAG_RW,
126 &bpf_maxinsns, 0, "Maximum bpf program instructions");
127SYSCTL_NODE(_net_bpf, OID_AUTO, stats, CTLFLAG_RW,
128 bpf_stats_sysctl, "bpf statistics portal");
71#include <net/bpfdesc.h>
72
73#include <netinet/in.h>
74#include <netinet/if_ether.h>
75#include <sys/kernel.h>
76#include <sys/sysctl.h>
77
78static MALLOC_DEFINE(M_BPF, "BPF", "BPF data");

--- 45 unchanged lines hidden (view full) ---

124static int bpf_maxbufsize = BPF_MAXBUFSIZE;
125SYSCTL_INT(_net_bpf, OID_AUTO, maxbufsize, CTLFLAG_RW,
126 &bpf_maxbufsize, 0, "");
127static int bpf_maxinsns = BPF_MAXINSNS;
128SYSCTL_INT(_net_bpf, OID_AUTO, maxinsns, CTLFLAG_RW,
129 &bpf_maxinsns, 0, "Maximum bpf program instructions");
130SYSCTL_NODE(_net_bpf, OID_AUTO, stats, CTLFLAG_RW,
131 bpf_stats_sysctl, "bpf statistics portal");
132#ifdef BPF_JITTER
133SYSCTL_NODE(_net_bpf, OID_AUTO, jitter, CTLFLAG_RW, 0, "bpf jitter sysctl");
134static int bpf_jitter_enable = 1;
135SYSCTL_INT(_net_bpf_jitter, OID_AUTO, enable, CTLFLAG_RW,
136 &bpf_jitter_enable, 0, "bpf JIT compiler");
137#endif
129
130static d_open_t bpfopen;
131static d_close_t bpfclose;
132static d_read_t bpfread;
133static d_write_t bpfwrite;
134static d_ioctl_t bpfioctl;
135static d_poll_t bpfpoll;
136static d_kqfilter_t bpfkqfilter;

--- 875 unchanged lines hidden (view full) ---

1012static int
1013bpf_setf(d, fp, cmd)
1014 struct bpf_d *d;
1015 struct bpf_program *fp;
1016 u_long cmd;
1017{
1018 struct bpf_insn *fcode, *old;
1019 u_int wfilter, flen, size;
138
139static d_open_t bpfopen;
140static d_close_t bpfclose;
141static d_read_t bpfread;
142static d_write_t bpfwrite;
143static d_ioctl_t bpfioctl;
144static d_poll_t bpfpoll;
145static d_kqfilter_t bpfkqfilter;

--- 875 unchanged lines hidden (view full) ---

1021static int
1022bpf_setf(d, fp, cmd)
1023 struct bpf_d *d;
1024 struct bpf_program *fp;
1025 u_long cmd;
1026{
1027 struct bpf_insn *fcode, *old;
1028 u_int wfilter, flen, size;
1029#if BPF_JITTER
1030 bpf_jit_filter *ofunc;
1031#endif
1020
1021 if (cmd == BIOCSETWF) {
1022 old = d->bd_wfilter;
1023 wfilter = 1;
1032
1033 if (cmd == BIOCSETWF) {
1034 old = d->bd_wfilter;
1035 wfilter = 1;
1036#if BPF_JITTER
1037 ofunc = NULL;
1038#endif
1024 } else {
1025 wfilter = 0;
1026 old = d->bd_rfilter;
1039 } else {
1040 wfilter = 0;
1041 old = d->bd_rfilter;
1042#if BPF_JITTER
1043 ofunc = d->bd_bfilter;
1044#endif
1027 }
1028 if (fp->bf_insns == NULL) {
1029 if (fp->bf_len != 0)
1030 return (EINVAL);
1031 BPFD_LOCK(d);
1032 if (wfilter)
1033 d->bd_wfilter = NULL;
1045 }
1046 if (fp->bf_insns == NULL) {
1047 if (fp->bf_len != 0)
1048 return (EINVAL);
1049 BPFD_LOCK(d);
1050 if (wfilter)
1051 d->bd_wfilter = NULL;
1034 else
1052 else {
1035 d->bd_rfilter = NULL;
1053 d->bd_rfilter = NULL;
1054#if BPF_JITTER
1055 d->bd_bfilter = NULL;
1056#endif
1057 }
1036 reset_d(d);
1037 BPFD_UNLOCK(d);
1038 if (old != NULL)
1039 free((caddr_t)old, M_BPF);
1058 reset_d(d);
1059 BPFD_UNLOCK(d);
1060 if (old != NULL)
1061 free((caddr_t)old, M_BPF);
1062#if BPF_JITTER
1063 if (ofunc != NULL)
1064 bpf_destroy_jit_filter(ofunc);
1065#endif
1040 return (0);
1041 }
1042 flen = fp->bf_len;
1043 if (flen > bpf_maxinsns)
1044 return (EINVAL);
1045
1046 size = flen * sizeof(*fp->bf_insns);
1047 fcode = (struct bpf_insn *)malloc(size, M_BPF, M_WAITOK);
1048 if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size) == 0 &&
1049 bpf_validate(fcode, (int)flen)) {
1050 BPFD_LOCK(d);
1051 if (wfilter)
1052 d->bd_wfilter = fcode;
1066 return (0);
1067 }
1068 flen = fp->bf_len;
1069 if (flen > bpf_maxinsns)
1070 return (EINVAL);
1071
1072 size = flen * sizeof(*fp->bf_insns);
1073 fcode = (struct bpf_insn *)malloc(size, M_BPF, M_WAITOK);
1074 if (copyin((caddr_t)fp->bf_insns, (caddr_t)fcode, size) == 0 &&
1075 bpf_validate(fcode, (int)flen)) {
1076 BPFD_LOCK(d);
1077 if (wfilter)
1078 d->bd_wfilter = fcode;
1053 else
1079 else {
1054 d->bd_rfilter = fcode;
1080 d->bd_rfilter = fcode;
1081#if BPF_JITTER
1082 d->bd_bfilter = bpf_jitter(fcode, flen);
1083#endif
1084 }
1055 reset_d(d);
1056 BPFD_UNLOCK(d);
1057 if (old != NULL)
1058 free((caddr_t)old, M_BPF);
1085 reset_d(d);
1086 BPFD_UNLOCK(d);
1087 if (old != NULL)
1088 free((caddr_t)old, M_BPF);
1089#if BPF_JITTER
1090 if (ofunc != NULL)
1091 bpf_destroy_jit_filter(ofunc);
1092#endif
1059
1060 return (0);
1061 }
1062 free((caddr_t)fcode, M_BPF);
1063 return (EINVAL);
1064}
1065
1066/*

--- 183 unchanged lines hidden (view full) ---

1250 */
1251 if (LIST_EMPTY(&bp->bif_dlist))
1252 return;
1253
1254 BPFIF_LOCK(bp);
1255 LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
1256 BPFD_LOCK(d);
1257 ++d->bd_rcount;
1093
1094 return (0);
1095 }
1096 free((caddr_t)fcode, M_BPF);
1097 return (EINVAL);
1098}
1099
1100/*

--- 183 unchanged lines hidden (view full) ---

1284 */
1285 if (LIST_EMPTY(&bp->bif_dlist))
1286 return;
1287
1288 BPFIF_LOCK(bp);
1289 LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
1290 BPFD_LOCK(d);
1291 ++d->bd_rcount;
1292#ifdef BPF_JITTER
1293 if (bpf_jitter_enable != 0 && d->bd_bfilter != NULL)
1294 slen = (*(d->bd_bfilter->func))(pkt, pktlen, pktlen);
1295 else
1296#endif
1258 slen = bpf_filter(d->bd_rfilter, pkt, pktlen, pktlen);
1259 if (slen != 0) {
1260 d->bd_fcount++;
1261#ifdef MAC
1262 if (mac_check_bpfdesc_receive(d, bp->bif_ifp) == 0)
1263#endif
1264 catchpacket(d, pkt, pktlen, slen, bcopy);
1265 }

--- 50 unchanged lines hidden (view full) ---

1316 pktlen = m_length(m, NULL);
1317
1318 BPFIF_LOCK(bp);
1319 LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
1320 if (!d->bd_seesent && (m->m_pkthdr.rcvif == NULL))
1321 continue;
1322 BPFD_LOCK(d);
1323 ++d->bd_rcount;
1297 slen = bpf_filter(d->bd_rfilter, pkt, pktlen, pktlen);
1298 if (slen != 0) {
1299 d->bd_fcount++;
1300#ifdef MAC
1301 if (mac_check_bpfdesc_receive(d, bp->bif_ifp) == 0)
1302#endif
1303 catchpacket(d, pkt, pktlen, slen, bcopy);
1304 }

--- 50 unchanged lines hidden (view full) ---

1355 pktlen = m_length(m, NULL);
1356
1357 BPFIF_LOCK(bp);
1358 LIST_FOREACH(d, &bp->bif_dlist, bd_next) {
1359 if (!d->bd_seesent && (m->m_pkthdr.rcvif == NULL))
1360 continue;
1361 BPFD_LOCK(d);
1362 ++d->bd_rcount;
1363#ifdef BPF_JITTER
1364 /* XXX We cannot handle multiple mbufs. */
1365 if (bpf_jitter_enable != 0 && d->bd_bfilter != NULL &&
1366 m->m_next == NULL)
1367 slen = (*(d->bd_bfilter->func))(mtod(m, u_char *),
1368 pktlen, pktlen);
1369 else
1370#endif
1324 slen = bpf_filter(d->bd_rfilter, (u_char *)m, pktlen, 0);
1325 if (slen != 0) {
1326 d->bd_fcount++;
1327#ifdef MAC
1328 if (mac_check_bpfdesc_receive(d, bp->bif_ifp) == 0)
1329#endif
1330 catchpacket(d, (u_char *)m, pktlen, slen,
1331 bpf_mcopy);

--- 169 unchanged lines hidden (view full) ---

1501 */
1502 if (d->bd_sbuf != NULL) {
1503 free(d->bd_sbuf, M_BPF);
1504 if (d->bd_hbuf != NULL)
1505 free(d->bd_hbuf, M_BPF);
1506 if (d->bd_fbuf != NULL)
1507 free(d->bd_fbuf, M_BPF);
1508 }
1371 slen = bpf_filter(d->bd_rfilter, (u_char *)m, pktlen, 0);
1372 if (slen != 0) {
1373 d->bd_fcount++;
1374#ifdef MAC
1375 if (mac_check_bpfdesc_receive(d, bp->bif_ifp) == 0)
1376#endif
1377 catchpacket(d, (u_char *)m, pktlen, slen,
1378 bpf_mcopy);

--- 169 unchanged lines hidden (view full) ---

1548 */
1549 if (d->bd_sbuf != NULL) {
1550 free(d->bd_sbuf, M_BPF);
1551 if (d->bd_hbuf != NULL)
1552 free(d->bd_hbuf, M_BPF);
1553 if (d->bd_fbuf != NULL)
1554 free(d->bd_fbuf, M_BPF);
1555 }
1509 if (d->bd_rfilter)
1556 if (d->bd_rfilter) {
1510 free((caddr_t)d->bd_rfilter, M_BPF);
1557 free((caddr_t)d->bd_rfilter, M_BPF);
1558#ifdef BPF_JITTER
1559 bpf_destroy_jit_filter(d->bd_bfilter);
1560#endif
1561 }
1511 if (d->bd_wfilter)
1512 free((caddr_t)d->bd_wfilter, M_BPF);
1513 mtx_destroy(&d->bd_mtx);
1514}
1515
1516/*
1517 * Attach an interface to bpf. dlt is the link layer type; hdrlen is the
1518 * fixed size of the link header (variable length headers not yet supported).

--- 339 unchanged lines hidden ---
1562 if (d->bd_wfilter)
1563 free((caddr_t)d->bd_wfilter, M_BPF);
1564 mtx_destroy(&d->bd_mtx);
1565}
1566
1567/*
1568 * Attach an interface to bpf. dlt is the link layer type; hdrlen is the
1569 * fixed size of the link header (variable length headers not yet supported).

--- 339 unchanged lines hidden ---