1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Stanford Enetfilter subroutines for tcpdump
3478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Based on the MERIT NNstat etherifrt.c and the Ultrix pcap-pf.c
5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * subroutines.
6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Rayan Zachariassen, CA*Net
8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef lint
10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ =
11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project    "@(#) $Header: /tcpdump/master/libpcap/pcap-enet.c,v 1.8 2003/11/15 23:24:02 guy Exp $";
12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_CONFIG_H
15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "config.h"
16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/types.h>
19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/time.h>
20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/file.h>
21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/ioctl.h>
22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <sys/socket.h>
23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <net/if.h>
25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <pcap-bpf.h>
26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <net/enet.h>
27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/in.h>
29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <netinet/if_ether.h>
30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <stdio.h>
32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <errno.h>
33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include "interface.h"
35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
36478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct packet_header {
37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct LengthWords	length;
39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct tap_header	tap;
40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
41478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_char			packet[8]
42478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
43478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
44478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectextern int errno;
45478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
46478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define BUFSPACE (4*1024)
47478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
48478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Forwards */
49478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic void efReadError(int, char *);
50478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectvoid
52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectreadloop(int cnt, int if_fd, struct bpf_program *fp, printfunc printit)
53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register struct packet_header *ph;
56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *bp;
57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register int inc;
58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else	/* !IBMRTPC */
59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	static struct timeval tv = { 0 };
60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register int cc, caplen;
62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register struct bpf_insn *fcode = fp->bf_insns;
63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	union {
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		struct packet_header hdr;
65478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		u_char	p[BUFSPACE];
66478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		u_short	s;
67478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	} buf;
68478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
69478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (1) {
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if ((cc = read(if_fd, (char *)buf.p, sizeof(buf))) < 0)
71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			efReadError(if_fd, "reader");
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
75478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Loop through each packet.
76478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
77478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		bp = buf.p;
78478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		while (cc > 0) {
79478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			ph = (struct packet_header *)bp;
80478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			caplen = ph->tap.th_wirelen > snaplen ? snaplen : ph->tap
81478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project.th_wirelen ;
82478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (bpf_filter(fcode, (char *)ph->packet,
83478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project						ph->tap.th_wirelen, caplen)) {
84478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				if (cnt >= 0 && --cnt < 0)
85478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project					goto out;
86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				(*printit)((char *)ph->packet,
87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project					(struct timeval *)ph->tap.th_timestamp,
88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project					ph->tap.th_wirelen, caplen);
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			inc = ph->length.PacketOffset;
91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			cc -= inc;
92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			bp += inc;
93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else	/* !IBMRTPC */
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		caplen = cc > snaplen ? snaplen : cc ;
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (bpf_filter(fcode, buf.hdr.packet, cc, caplen)) {
97478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (cnt >= 0 && --cnt < 0)
98478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				goto out;
99478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			(*printit)(buf.hdr.packet, &tv, cc, caplen);
100478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
101478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
102478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
103478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project out:
104478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	wrapup(if_fd);
105478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
106478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
107478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Call ONLY if read() has returned an error on packet filter */
108478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic void
109478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source ProjectefReadError(int fid, char *msg)
110478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
111478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (errno == EINVAL) {	/* read MAXINT bytes already! */
112478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (lseek(fid, 0, 0) < 0) {
113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			perror("tcpdump: efReadError/lseek");
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			exit(-1);
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		else
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return;
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else {
120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		(void) fprintf(stderr, "tcpdump: ");
121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror(msg);
122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectvoid
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectwrapup(int fd)
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct enstats es;
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(fd, EIOSTATS, &es) == -1) {
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOSTATS error");
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	fprintf(stderr, "%d packets queued", es.enStat_Rcnt);
138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (es.enStat_Rdrops > 0)
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fprintf(stderr, ", %d dropped", es.enStat_Rdrops);
140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (es.enStat_Reads > 0)
141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fprintf(stderr, ", %d tcpdump %s", es.enStat_Reads,
142478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				es.enStat_Reads > 1 ? "reads" : "read");
143478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (es.enStat_MaxRead > 1)
144478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		fprintf(stderr, ", %d packets in largest read",
145478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			es.enStat_MaxRead);
146478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	putc('\n', stderr);
147478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
148478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	close(fd);
149478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
150478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
151478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
152478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectinitdevice(char *device, int pflag, int *linktype)
153478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
154478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct eniocb ctl;
155478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct enfilter filter;
156478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_int maxwaiting;
157478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int if_fd;
158478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
159478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
160478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	GETENETDEVICE(0, O_RDONLY, &if_fd);
161478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else	/* !IBMRTPC */
162478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if_fd = open("/dev/enet", O_RDONLY, 0);
163478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
164478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
165478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (if_fd == -1) {
166478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet open error");
167478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		error(
168478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project"your system may not be properly configured; see \"man enet(4)\"");
169478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
170478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
171478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
172478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*  Get operating parameters. */
173478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
174478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(if_fd, EIOCGETP, (char *)&ctl) == -1) {
175478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOCGETP error");
176478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
177478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
178478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
179478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*  Set operating parameters. */
180478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
181478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
182478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ctl.en_rtout = 1 * ctl.en_hz;
183478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ctl.en_tr_etherhead = 1;
184478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ctl.en_tap_network = 1;
185478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ctl.en_multi_packet = 1;
186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ctl.en_maxlen = BUFSPACE;
187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else	/* !IBMRTPC */
188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ctl.en_rtout = 64;	/* randomly picked value for HZ */
189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(if_fd, EIOCSETP, &ctl) == -1) {
191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOCSETP error");
192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*  Flush the receive queue, since we've changed
196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	    the operating parameters and we otherwise might
197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	    receive data without headers. */
198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(if_fd, EIOCFLUSH) == -1) {
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOCFLUSH error");
201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*  Set the receive queue depth to its maximum. */
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	maxwaiting = ctl.en_maxwaiting;
207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(if_fd, EIOCSETW, &maxwaiting) == -1) {
208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOCSETW error");
209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef	IBMRTPC
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*  Clear statistics. */
214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(if_fd, EIOCLRSTAT, 0) == -1) {
216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOCLRSTAT error");
217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif	/* IBMRTPC */
220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*  Set the filter (accept all packets). */
222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	filter.enf_Priority = 3;
224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	filter.enf_FilterLen = 0;
225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (ioctl(if_fd, EIOCSETF, &filter) == -1) {
226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		perror("tcpdump: enet ioctl EIOCSETF error");
227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		exit(-1);
228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * "enetfilter" supports only ethernets.
231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	*linktype = DLT_EN10MB;
233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return(if_fd);
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
236