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 --- |