table of contents
BPF(9) | Kernel Developer's Manual | BPF(9) |
NAME¶
bpf — Berkeley Packet FilterSYNOPSIS¶
#include <net/bpf.h> voidbpfattach(struct ifnet *ifp, u_int dlt, u_int hdrlen); void
bpfattach2(struct ifnet *ifp, u_int dlt, u_int hdrlen, struct bpf_if **driverp); void
bpfdetach(struct ifnet *ifp); void
bpf_tap(struct ifnet *ifp, u_char *pkt, u_int *pktlen); void
bpf_mtap(struct ifnet *ifp, struct mbuf *m); void
bpf_mtap2(struct bpf_if *bp, void *data, u_int dlen, struct mbuf *m); u_int
bpf_filter(const struct bpf_insn *pc , u_char *pkt, u_int wirelen, u_int buflen); int
bpf_validate(const struct bpf_insn *fcode, int flen);
DESCRIPTION¶
The Berkeley Packet Filter provides a raw interface, that is protocol independent, to data link layers. It allows all packets on the network, even those destined for other hosts, to be passed from a network interface to user programs. Each program may specify a filter, in the form of a bpf filter machine program. The bpf(4) manual page describes the interface used by user programs. This manual page describes the functions used by interfaces to pass packets to bpf and the functions for testing and running bpf filter machine programs. The bpfattach() function attaches a network interface to bpf. The ifp argument is a pointer to the structure that defines the interface to be attached to an interface. The dlt argument is the data link-layer type:DLT_NULL
(no link-layer encapsulation),
DLT_EN10MB
(Ethernet),
DLT_IEEE802_11
(802.11 wireless networks), etc. The
rest of the link layer types can be found in
<net/bpf.h>. The
hdrlen argument is the fixed size of the link header;
variable length headers are not yet supported. The bpf
system will hold a pointer to ifp->if_bpf. This
variable will set to a non-NULL
value when
bpf requires packets from this interface to be tapped using
the functions below.
The bpfattach2() function allows multiple
bpf instances to be attached to a single interface, by
registering an explicit if_bpf rather than using
ifp->if_bpf. It is then possible to run
tcpdump(1) on the interface for any data link-layer types
attached.
The bpfdetach() function detaches a bpf
instance from an interface, specified by ifp. The
bpfdetach() function should be called once for each
bpf instance attached.
The bpf_tap() function is used by an interface to pass the
packet to bpf. The packet data (including link-header),
pointed to by pkt, is of length
pktlen, which must be a contiguous buffer. The
ifp argument is a pointer to the structure that defines
the interface to be tapped. The packet is parsed by each processes filter, and
if accepted, it is buffered for the process to read.
The bpf_mtap() function is like bpf_tap()
except that it is used to tap packets that are in an
mbuf chain, m. The
ifp argument is a pointer to the structure that defines
the interface to be tapped. Like bpf_tap(),
bpf_mtap() requires a link-header for whatever data link
layer type is specified. Note that bpf only reads from the
mbuf chain, it does not free it or keep a pointer to it.
This means that an mbuf containing the link-header can
be prepended to the chain if necessary. A cleaner interface to achieve this is
provided by bpf_mtap2().
The bpf_mtap2() function allows the user to pass a link-header
data, of length dlen, independent
of the mbuf m, containing the
packet. This simplifies the passing of some link-headers.
The bpf_filter() function executes the filter program starting
at pc on the packet pkt. The
wirelen argument is the length of the original packet
and buflen is the amount of data present. The
buflen value of 0 is special; it indicates that the
pkt is actually a pointer to an mbuf chain
(struct mbuf *).
The bpf_validate() function checks that the filter code
fcode, of length flen, is valid.
RETURN VALUES¶
The bpf_filter() function returns -1 (cast to an unsigned integer) if there is no filter. Otherwise, it returns the result of the filter program. The bpf_validate() function returns 0 when the program is not a valid filter program.SEE ALSO¶
tcpdump(1), bpf(4)HISTORY¶
The Enet packet filter was created in 1980 by Mike Accetta and Rick Rashid at Carnegie-Mellon University. Jeffrey Mogul, at Stanford, ported the code to BSD and continued its development from 1983 on. Since then, it has evolved into the Ultrix Packet Filter at DEC, a STREAMS NIT module under SunOS 4.1, and BPF.AUTHORS¶
Steven McCanne, of Lawrence Berkeley Laboratory, implemented BPF in Summer 1990. Much of the design is due to Van Jacobson. This manpage was written by Orla McGann.December 13, 2006 | Debian |