29 #include <sys/types.h>
31 #include <sys/timeb.h>
32 #include <sys/socket.h>
34 #include <sys/ioctl.h>
35 #include <net/pfilt.h>
41 #include <netinet/in.h>
42 #include <netinet/in_systm.h>
43 #include <netinet/ip.h>
44 #include <netinet/if_ether.h>
45 #include <netinet/ip_var.h>
46 #include <netinet/udp.h>
47 #include <netinet/udp_var.h>
48 #include <netinet/tcp.h>
49 #include <netinet/tcpip.h>
62 #define PCAP_DONT_INCLUDE_PCAP_BPF_H
67 #ifdef HAVE_OS_PROTO_H
74 #define PCAP_FDDIPAD 3
97 #define BUFSPACE (200 * 256)
103 register u_char *p, *bp;
104 register int cc, n, buflen, inc;
105 register struct enstamp *sp;
106 struct enstamp stamp;
114 if (
errno == EWOULDBLOCK)
116 if (
errno == EINVAL &&
124 (void)
lseek(pc->
fd, 0L, SEEK_SET);
159 if (cc <
sizeof(*sp)) {
161 "pf short read (%d)", cc);
166 memcpy((
char *)sp, (
char *)bp,
sizeof(*sp));
168 sp = (
struct enstamp *)bp;
169 if (sp->ens_stamplen !=
sizeof(*sp)) {
171 "pf short stamplen (%d)",
176 p = bp + sp->ens_stamplen;
177 buflen = sp->ens_count;
182 inc = ENALIGN(buflen + sp->ens_stamplen);
206 h.
ts = sp->ens_tstamp;
207 h.
len = sp->ens_count - pad;
211 (*callback)(user, &h, p);
289 #define DLT_DOCSIS 143
298 struct enfilter Filter;
299 struct endevp devparams;
325 if (p->
fd == -1 &&
errno == EACCES)
328 if (
errno == EACCES) {
330 "pf open: %s: Permission denied\n"
331 "your system may not be properly configured; see the packetfilter(4) man page",
354 enmode = ENTSTAMP|ENNONEXCL;
359 if (
ioctl(p->
fd, EIOCMBIS, (caddr_t)&enmode) < 0) {
368 (void)
ioctl(p->
fd, EIOCMBIS, (caddr_t)&enmode);
371 if (
ioctl(p->
fd, EIOCSETW, (caddr_t)&backlog) < 0) {
378 if (
ioctl(p->
fd, EIOCDEVP, (caddr_t)&devparams) < 0) {
388 switch (devparams.end_dev_type) {
403 p->
dlt_list = (u_int *) malloc(
sizeof(u_int) * 2);
463 "unknown data-link type %u", devparams.end_dev_type);
477 errno,
"EIOCTRUNCATE");
482 memset(&Filter, 0,
sizeof(Filter));
483 Filter.enf_Priority = 37;
484 Filter.enf_FilterLen = 0;
485 if (
ioctl(p->
fd, EIOCSETF, (caddr_t)&Filter) < 0) {
493 struct timeval timeout;
495 timeout.tv_usec = (p->
opt.
timeout * 1000) % 1000000;
496 if (
ioctl(p->
fd, EIOCSRTIMEOUT, (caddr_t)&timeout) < 0) {
498 errno,
"EIOCSRTIMEOUT");
588 struct bpf_version bv;
598 if (
ioctl(p->
fd, BIOCVERSION, (caddr_t)&bv) >= 0) {
604 if (bv.bv_major == BPF_MAJOR_VERSION &&
605 bv.bv_minor >= BPF_MINOR_VERSION) {
609 if (
ioctl(p->
fd, BIOCSETF, (caddr_t)fp) < 0) {
628 fprintf(stderr,
"tcpdump: Using kernel BPF filter\n");
651 "tcpdump: Requires BPF language %d.%d or higher; kernel is %d.%d\n",
652 BPF_MAJOR_VERSION, BPF_MINOR_VERSION,
653 bv.bv_major, bv.bv_minor);
666 fprintf(stderr,
"tcpdump: Filtering in user process\n");
u_int pcap_filter(const struct bpf_insn *pc, const u_char *p, u_int wirelen, u_int buflen)
int pcap_findalldevs_interfaces(pcap_if_list_t *devlistp, char *errbuf, int(*check_usable)(const char *), get_if_flags_func get_flags_func)
void pcap_fmt_errmsg_for_errno(char *errbuf, size_t errbuflen, int errnum, const char *fmt,...)
int install_bpf_program(pcap_t *p, struct bpf_program *fp)
int snprintf(char *, size_t, const char *,...)
int ioctl(int, int, caddr_t)
off_t lseek(int, off_t, int)
int read(int, char *, u_int)
int write(int, char *, u_int)
#define PACKET_COUNT_IS_UNLIMITED(count)
void pcap_cleanup_live_common(pcap_t *)
int pcap_getnonblock_fd(pcap_t *)
int pcap_setnonblock_fd(pcap_t *p, int)
#define PCAP_VERSION_STRING
#define PCAP_CREATE_COMMON(ebuf, type)
static int get_if_flags(const char *name, bpf_u_int32 *flags, char *errbuf)
static int pcap_inject_pf(pcap_t *p, const void *buf, int size)
const char * pcap_lib_version(void)
int pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
static int pcap_read_pf(pcap_t *pc, int cnt, pcap_handler callback, u_char *user)
static int pcap_stats_pf(pcap_t *p, struct pcap_stat *ps)
pcap_t * pcap_create_interface(const char *device, char *ebuf)
static int can_be_bound(const char *name)
static int pcap_activate_pf(pcap_t *p)
static int pcap_setfilter_pf(pcap_t *, struct bpf_program *)
#define PCAP_ERROR_PERM_DENIED
#define PCAP_IF_CONNECTION_STATUS_NOT_APPLICABLE
void(* pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *)
struct bpf_insn * bf_insns
activate_op_t activate_op
setnonblock_op_t setnonblock_op
setfilter_op_t setfilter_op
getnonblock_op_t getnonblock_op
setdirection_op_t setdirection_op
set_datalink_op_t set_datalink_op