1478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
2478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy)
3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Copyright (c) 2005 - 2008 CACE Technologies, Davis (California)
4478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * All rights reserved.
5478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
6478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Redistribution and use in source and binary forms, with or without
7478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * modification, are permitted provided that the following conditions
8478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * are met:
9478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
10478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
11478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer.
12478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
13478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * notice, this list of conditions and the following disclaimer in the
14478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * documentation and/or other materials provided with the distribution.
15478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * 3. Neither the name of the Politecnico di Torino, CACE Technologies
16478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * nor the names of its contributors may be used to endorse or promote
17478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * products derived from this software without specific prior written
18478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * permission.
19478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
20478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project *
32478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
33478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
34478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifndef lint
35478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic const char rcsid[] _U_ =
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall    "@(#) $Header: /tcpdump/master/libpcap/pcap-win32.c,v 1.42 2008-05-21 22:15:25 gianluca Exp $ (LBL)";
37478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif
38478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
39478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <pcap-int.h>
40478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <Packet32.h>
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef __MINGW32__
42511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef __MINGW64__
43511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ntddndis.h>
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else  /*__MINGW64__*/
45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ddk/ntddndis.h>
46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ddk/ndis.h>
47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /*__MINGW64__*/
48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#else /*__MINGW32__*/
49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <ntddndis.h>
50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /*__MINGW32__*/
51478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API
52478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <dagnew.h>
53478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#include <dagapi.h>
54478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */
55478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef __MINGW32__
56478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint* _errno();
57478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define errno (*_errno())
58478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* __MINGW32__ */
59478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
60478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_setfilter_win32_npf(pcap_t *, struct bpf_program *);
61478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_setfilter_win32_dag(pcap_t *, struct bpf_program *);
62478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_getnonblock_win32(pcap_t *, char *);
63478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int pcap_setnonblock_win32(pcap_t *, int, char *);
64478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
65511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*dimension of the buffer in the pcap_t structure*/
66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define	WIN32_DEFAULT_USER_BUFFER_SIZE 256000
67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*dimension of the buffer in the kernel driver NPF */
69511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define	WIN32_DEFAULT_KERNEL_BUFFER_SIZE 1000000
70478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
71478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Equivalent to ntohs(), but a lot faster under Windows */
72478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define SWAPS(_X) ((_X & 0xff) << 8) | (_X >> 8)
73478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
74478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Private data for capturing on WinPcap devices.
76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstruct pcap_win {
78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	int nonblock;
79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#ifdef HAVE_DAG_API
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	int	dag_fcs_bits;	/* Number of checksum bits from link layer */
82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif
83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall};
84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
86478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Header that the WinPcap driver associates to the packets.
87478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * Once was in bpf.h
88478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
89478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstruct bpf_hdr {
90478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct timeval	bh_tstamp;	/* time stamp */
91478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	bpf_u_int32	bh_caplen;	/* length of captured portion */
92478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	bpf_u_int32	bh_datalen;	/* original length of packet */
93478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_short		bh_hdrlen;	/* length of bpf header (this struct
94478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project					   plus alignment padding) */
95478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project};
96478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
97511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallCRITICAL_SECTION g_PcapCompileCriticalSection;
98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
99511eca30a483e912c274e1d8ba3a0f8f081e2227JP AbgrallBOOL WINAPI DllMain(
100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  HANDLE hinstDLL,
101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  DWORD dwReason,
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall  LPVOID lpvReserved
103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall)
104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (dwReason == DLL_PROCESS_ATTACH)
106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	{
107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		InitializeCriticalSection(&g_PcapCompileCriticalSection);
108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return TRUE;
111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
113478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Start winsock */
114478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectint
115478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectwsockinit()
116478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
117478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	WORD wVersionRequested;
118478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	WSADATA wsaData;
119478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int err;
120478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	wVersionRequested = MAKEWORD( 1, 1);
121478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	err = WSAStartup( wVersionRequested, &wsaData );
122478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if ( err != 0 )
123478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
124478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return -1;
125478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
126478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 0;
127478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
128478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
129478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
130478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
131478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_stats_win32(pcap_t *p, struct pcap_stat *ps)
132478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
133478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
134478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(PacketGetStats(p->adapter, (struct bpf_stat*)ps) != TRUE){
135478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "PacketGetStats error: %s", pcap_win32strerror());
136478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return -1;
137478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
138478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
139478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return 0;
140478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
141478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
142511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* Set the dimension of the kernel-level capture buffer */
143511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int
144511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_setbuff_win32(pcap_t *p, int dim)
145511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
146511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if(PacketSetBuff(p->adapter,dim)==FALSE)
147511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	{
148511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer");
149511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return -1;
150511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
151511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return 0;
152511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
153511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
154511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/* Set the driver working mode */
155511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int
156511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_setmode_win32(pcap_t *p, int mode)
157511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
158511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if(PacketSetMode(p->adapter,mode)==FALSE)
159511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	{
160511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: working mode not recognized");
161511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return -1;
162511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
163511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
164511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return 0;
165511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
166511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
167511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*set the minimum amount of data that will release a read call*/
168511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int
169511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_setmintocopy_win32(pcap_t *p, int size)
170511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
171511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if(PacketSetMinToCopy(p->adapter, size)==FALSE)
172511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	{
173511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: unable to set the requested mintocopy size");
174511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return -1;
175511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
176511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return 0;
177511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
178511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
179511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*return the Adapter for a pcap_t*/
180511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic Adapter *
181511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_getadapter_win32(pcap_t *p)
182511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
183511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return p->adapter;
184511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
185511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
186478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
187478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_read_win32_npf(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
188478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
189478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int cc;
190478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int n = 0;
191478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	register u_char *bp, *ep;
192478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
193478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	cc = p->cc;
194478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (p->cc == 0) {
195478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
196478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Has "pcap_breakloop()" been called?
197478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
198478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (p->break_loop) {
199478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			/*
200478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			 * Yes - clear the flag that indicates that it
201478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			 * has, and return -2 to indicate that we were
202478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			 * told to break out of the loop.
203478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			 */
204478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->break_loop = 0;
205478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (-2);
206478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
207478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
208478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	    /* capture the packets */
209478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if(PacketReceivePacket(p->adapter,p->Packet,TRUE)==FALSE){
210478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read error: PacketReceivePacket failed");
211478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (-1);
212478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
213478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
214478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		cc = p->Packet->ulBytesReceived;
215478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
216478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		bp = p->Packet->Buffer;
217478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
218478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
219478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		bp = p->bp;
220478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
221478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
222478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * Loop through each packet.
223478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
224478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#define bhp ((struct bpf_hdr *)bp)
225478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ep = bp + cc;
226478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while (1) {
227478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		register int caplen, hdrlen;
228478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
229478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
230478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Has "pcap_breakloop()" been called?
231478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * If so, return immediately - if we haven't read any
232478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * packets, clear the flag and return -2 to indicate
233478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * that we were told to break out of the loop, otherwise
234478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * leave the flag set, so that the *next* call will break
235478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * out of the loop without having read any packets, and
236478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * return the number of packets we've processed so far.
237478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
238478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (p->break_loop) {
239478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (n == 0) {
240478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				p->break_loop = 0;
241478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				return (-2);
242478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			} else {
243478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				p->bp = bp;
244478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				p->cc = ep - bp;
245478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				return (n);
246478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
247478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
248478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (bp >= ep)
249478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
250478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
251478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		caplen = bhp->bh_caplen;
252478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		hdrlen = bhp->bh_hdrlen;
253478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
254478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
255478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * XXX A bpf_hdr matches a pcap_pkthdr.
256478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
257478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		(*callback)(user, (struct pcap_pkthdr*)bp, bp + hdrlen);
258511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		bp += Packet_WORDALIGN(caplen + hdrlen);
259511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt)) {
260478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->bp = bp;
261478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->cc = ep - bp;
262478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (n);
263478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
264478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
265478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#undef bhp
266478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->cc = 0;
267478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (n);
268478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
269478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
270478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API
271478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
272478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_read_win32_dag(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
273478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
274511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	struct pcap_win *pw = p->priv;
275478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_char *dp = NULL;
276478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int	packet_len = 0, caplen = 0;
277478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	struct pcap_pkthdr	pcap_header;
278478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	u_char *endofbuf;
279478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int n = 0;
280478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	dag_record_t *header;
281478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	unsigned erf_record_len;
282478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	ULONGLONG ts;
283478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int cc;
284478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	unsigned swt;
285478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	unsigned dfp = p->adapter->DagFastProcess;
286478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
287478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	cc = p->cc;
288478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (cc == 0) /* Get new packets only if we have processed all the ones of the previous read */
289478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
290478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	    /* Get new packets from the network */
291478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if(PacketReceivePacket(p->adapter, p->Packet, TRUE)==FALSE){
292478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "read error: PacketReceivePacket failed");
293478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (-1);
294478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
295478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
296478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		cc = p->Packet->ulBytesReceived;
297478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if(cc == 0)
298478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			/* The timeout has expired but we no packets arrived */
299478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return 0;
300478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		header = (dag_record_t*)p->adapter->DagBuffer;
301478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
302478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
303478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		header = (dag_record_t*)p->bp;
304478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
305478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	endofbuf = (char*)header + cc;
306478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
307478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
308478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * Cycle through the packets
309478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
310478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	do
311478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
312478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		erf_record_len = SWAPS(header->rlen);
313478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if((char*)header + erf_record_len > endofbuf)
314478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
315478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
316478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Increase the number of captured packets */
317511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		pw->stat.ps_recv++;
318478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
319478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Find the beginning of the packet */
320478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		dp = ((u_char *)header) + dag_record_size;
321478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
322478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Determine actual packet len */
323478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		switch(header->type)
324478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
325478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		case TYPE_ATM:
326478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			packet_len = ATM_SNAPLEN;
327478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			caplen = ATM_SNAPLEN;
328478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			dp += 4;
329478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
330478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
331478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
332478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		case TYPE_ETH:
333478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			swt = SWAPS(header->wlen);
334511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			packet_len = swt - (pw->dag_fcs_bits);
335478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			caplen = erf_record_len - dag_record_size - 2;
336478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (caplen > packet_len)
337478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			{
338478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				caplen = packet_len;
339478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
340478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			dp += 2;
341478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
342478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
343478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
344478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		case TYPE_HDLC_POS:
345478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			swt = SWAPS(header->wlen);
346511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			packet_len = swt - (pw->dag_fcs_bits);
347478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			caplen = erf_record_len - dag_record_size;
348478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (caplen > packet_len)
349478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			{
350478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				caplen = packet_len;
351478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
352478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
353478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			break;
354478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
355478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
356478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if(caplen > p->snapshot)
357478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			caplen = p->snapshot;
358478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
359478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
360478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Has "pcap_breakloop()" been called?
361478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * If so, return immediately - if we haven't read any
362478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * packets, clear the flag and return -2 to indicate
363478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * that we were told to break out of the loop, otherwise
364478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * leave the flag set, so that the *next* call will break
365478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * out of the loop without having read any packets, and
366478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * return the number of packets we've processed so far.
367478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
368478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (p->break_loop)
369478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
370478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (n == 0)
371478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			{
372478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				p->break_loop = 0;
373478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				return (-2);
374478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
375478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			else
376478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			{
377478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				p->bp = (char*)header;
378478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				p->cc = endofbuf - (char*)header;
379478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				return (n);
380478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
381478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
382478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
383478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if(!dfp)
384478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
385478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			/* convert between timestamp formats */
386478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			ts = header->ts;
387478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			pcap_header.ts.tv_sec = (int)(ts >> 32);
388478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			ts = (ts & 0xffffffffi64) * 1000000;
389478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			ts += 0x80000000; /* rounding */
390478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			pcap_header.ts.tv_usec = (int)(ts >> 32);
391478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (pcap_header.ts.tv_usec >= 1000000) {
392478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				pcap_header.ts.tv_usec -= 1000000;
393478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				pcap_header.ts.tv_sec++;
394478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
395478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
396478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
397478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* No underlaying filtering system. We need to filter on our own */
398478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (p->fcode.bf_insns)
399478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
400478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if (bpf_filter(p->fcode.bf_insns, dp, packet_len, caplen) == 0)
401478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			{
402478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				/* Move to next packet */
403478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				header = (dag_record_t*)((char*)header + erf_record_len);
404478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				continue;
405478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
406478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
407478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
408478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Fill the header for the user suppplied callback function */
409478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		pcap_header.caplen = caplen;
410478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		pcap_header.len = packet_len;
411478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
412478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Call the callback function */
413478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		(*callback)(user, &pcap_header, dp);
414478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
415478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Move to next packet */
416478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		header = (dag_record_t*)((char*)header + erf_record_len);
417478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
418478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Stop if the number of packets requested by user has been reached*/
419511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (++n >= cnt && !PACKET_COUNT_IS_UNLIMITED(cnt))
420478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
421478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->bp = (char*)header;
422478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->cc = endofbuf - (char*)header;
423478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			return (n);
424478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
425478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
426478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	while((u_char*)header < endofbuf);
427478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
428478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project  return 1;
429478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
430478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */
431478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
432478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/* Send a packet to the network */
433478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
434478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_inject_win32(pcap_t *p, const void *buf, size_t size){
435478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	LPPACKET PacketToSend;
436478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
437478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	PacketToSend=PacketAllocatePacket();
438478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
439478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (PacketToSend == NULL)
440478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
441478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send error: PacketAllocatePacket failed");
442478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return -1;
443478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
444478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
445478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	PacketInitPacket(PacketToSend,(PVOID)buf,size);
446478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(PacketSendPacket(p->adapter,PacketToSend,TRUE) == FALSE){
447478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "send error: PacketSendPacket failed");
448478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		PacketFreePacket(PacketToSend);
449478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return -1;
450478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
451478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
452478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	PacketFreePacket(PacketToSend);
453478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
454478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
455478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * We assume it all got sent if "PacketSendPacket()" succeeded.
456478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * "pcap_inject()" is expected to return the number of bytes
457478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * sent.
458478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
459478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return size;
460478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
461478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
462478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic void
463511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_cleanup_win32(pcap_t *p)
464478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
465478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (p->adapter != NULL) {
466478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		PacketCloseAdapter(p->adapter);
467478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->adapter = NULL;
468478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
469478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (p->Packet) {
470478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		PacketFreePacket(p->Packet);
471478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->Packet = NULL;
472478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
473511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	pcap_cleanup_live_common(p);
474478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
475478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
476511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic int
477511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_activate_win32(pcap_t *p)
478478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
479511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	struct pcap_win *pw = p->priv;
480478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	NetType type;
481478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
482511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (p->opt.rfmon) {
483511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		/*
484511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * No monitor mode on Windows.  It could be done on
485511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * Vista with drivers that support the native 802.11
486511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * mechanism and monitor mode.
487511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 */
488511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (PCAP_ERROR_RFMON_NOTSUP);
489511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
490511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
491478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* Init WinSock */
492478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	wsockinit();
493478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
494511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->adapter = PacketOpenAdapter(p->opt.source);
495478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
496478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (p->adapter == NULL)
497478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
498478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Adapter detected but we are not able to open it. Return failure. */
499511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Error opening adapter: %s", pcap_win32strerror());
500511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return PCAP_ERROR;
501478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
502478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
503478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*get network type*/
504478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(PacketGetNetType (p->adapter,&type) == FALSE)
505478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
506511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Cannot determine the network type: %s", pcap_win32strerror());
507478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		goto bad;
508478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
509478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
510478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*Set the linktype*/
511478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	switch (type.LinkType)
512478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
513478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumWan:
514478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_EN10MB;
515478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
516478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
517478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMedium802_3:
518478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_EN10MB;
519478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
520478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * This is (presumably) a real Ethernet capture; give it a
521478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * link-layer-type list with DLT_EN10MB and DLT_DOCSIS, so
522478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * that an application can let you choose it, in case you're
523478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * capturing DOCSIS traffic that a Cisco Cable Modem
524478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Termination System is putting out onto an Ethernet (it
525478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * doesn't put an Ethernet header onto the wire, it puts raw
526478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * DOCSIS frames out on the wire inside the low-level
527478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Ethernet framing).
528478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
529478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->dlt_list = (u_int *) malloc(sizeof(u_int) * 2);
530478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
531478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * If that fails, just leave the list empty.
532478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
533478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (p->dlt_list != NULL) {
534478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->dlt_list[0] = DLT_EN10MB;
535478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->dlt_list[1] = DLT_DOCSIS;
536478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			p->dlt_count = 2;
537478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
538478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
539478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
540478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumFddi:
541478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_FDDI;
542478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
543478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
544478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMedium802_5:
545478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_IEEE802;
546478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
547478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
548478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumArcnetRaw:
549478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_ARCNET;
550478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
551478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
552478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumArcnet878_2:
553478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_ARCNET;
554478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
555478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
556478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumAtm:
557478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_ATM_RFC1483;
558478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
559478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
560478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumCHDLC:
561478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_CHDLC;
562478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
563478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
564478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumPPPSerial:
565478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_PPP_SERIAL;
566478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
567478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
568478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumNull:
569478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_NULL;
570478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
571478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
572478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumBare80211:
573478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_IEEE802_11;
574478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
575478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
576478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumRadio80211:
577478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_IEEE802_11_RADIO;
578478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
579478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
580478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	case NdisMediumPpi:
581478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_PPI;
582478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
583478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
584478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	default:
585478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->linktype = DLT_EN10MB;			/*an unknown adapter is assumed to be ethernet*/
586478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		break;
587478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
588478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
589478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* Set promiscuous mode */
590511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (p->opt.promisc)
591478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
592478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
593478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (PacketSetHwFilter(p->adapter,NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE)
594478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
595511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to promiscuous mode");
596478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			goto bad;
597478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
598478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
599478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
600478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
601478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (PacketSetHwFilter(p->adapter,NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE)
602478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
603511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to set hardware filter to non-promiscuous mode");
604478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			goto bad;
605478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
606478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
607478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
608478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* Set the buffer size */
609511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->bufsize = WIN32_DEFAULT_USER_BUFFER_SIZE;
610478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
611478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* allocate Packet structure used during the capture */
612478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if((p->Packet = PacketAllocatePacket())==NULL)
613478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
614511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "failed to allocate the PACKET structure");
615478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		goto bad;
616478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
617478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
618478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(!(p->adapter->Flags & INFO_FLAG_DAG_CARD))
619478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
620478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
621478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * Traditional Adapter
622478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
623511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		/*
624511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * If the buffer size wasn't explicitly set, default to
625511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * WIN32_DEFAULT_USER_BUFFER_SIZE.
626511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 */
627511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	 	if (p->opt.buffer_size == 0)
628511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	 		p->opt.buffer_size = WIN32_DEFAULT_KERNEL_BUFFER_SIZE;
629511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
630511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if(PacketSetBuff(p->adapter,p->opt.buffer_size)==FALSE)
631511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		{
632511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "driver error: not enough memory to allocate the kernel buffer");
633511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			goto bad;
634511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		}
635478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
636511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		p->buffer = (u_char *)malloc(p->bufsize);
637478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		if (p->buffer == NULL)
638478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
639511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "malloc: %s", pcap_strerror(errno));
640478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			goto bad;
641478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
642478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
643478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		PacketInitPacket(p->Packet,(BYTE*)p->buffer,p->bufsize);
644478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
645511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (p-opt.immediate)
646478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
647511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			/* tell the driver to copy the buffer as soon as data arrives */
648511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			if(PacketSetMinToCopy(p->adapter,0)==FALSE)
649511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			{
650511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s", pcap_win32strerror());
651511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				goto bad;
652511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			}
653478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
654511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		else
655478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
656511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			/* tell the driver to copy the buffer only if it contains at least 16K */
657511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			if(PacketSetMinToCopy(p->adapter,16000)==FALSE)
658511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			{
659511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				snprintf(p->errbuf, PCAP_ERRBUF_SIZE,"Error calling PacketSetMinToCopy: %s", pcap_win32strerror());
660511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				goto bad;
661511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			}
662478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
663478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
664478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
665478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API
666478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
667478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
668478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * Dag Card
669478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
670478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		LONG	status;
671478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		HKEY	dagkey;
672478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		DWORD	lptype;
673478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		DWORD	lpcbdata;
674478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		int		postype = 0;
675478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		char	keyname[512];
676478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
677478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		snprintf(keyname, sizeof(keyname), "%s\\CardParams\\%s",
678478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			"SYSTEM\\CurrentControlSet\\Services\\DAG",
679511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			strstr(_strlwr(p->opt.source), "dag"));
680478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		do
681478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		{
682478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, KEY_READ, &dagkey);
683478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if(status != ERROR_SUCCESS)
684478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				break;
685478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
686478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			status = RegQueryValueEx(dagkey,
687478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				"PosType",
688478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				NULL,
689478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				&lptype,
690478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				(char*)&postype,
691478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				&lpcbdata);
692478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
693478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			if(status != ERROR_SUCCESS)
694478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			{
695478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project				postype = 0;
696478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			}
697478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
698478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			RegCloseKey(dagkey);
699478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		}
700478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		while(FALSE);
701478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
702478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
703478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->snapshot = PacketSetSnapLen(p->adapter, snaplen);
704478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
705478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* Set the length of the FCS associated to any packet. This value
706478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * will be subtracted to the packet length */
707511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		pw->dag_fcs_bits = p->adapter->DagFcsLen;
708478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
709478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#else
710478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	goto bad;
711478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */
712478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
713511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	PacketSetReadTimeout(p->adapter, p->opt.timeout);
714478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
715478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API
716478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(p->adapter->Flags & INFO_FLAG_DAG_CARD)
717478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
718478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* install dag specific handlers for read and setfilter */
719478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->read_op = pcap_read_win32_dag;
720478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->setfilter_op = pcap_setfilter_win32_dag;
721478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
722478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	else
723478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
724478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */
725478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/* install traditional npf handlers for read and setfilter */
726478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->read_op = pcap_read_win32_npf;
727478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		p->setfilter_op = pcap_setfilter_win32_npf;
728478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#ifdef HAVE_DAG_API
729478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
730478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project#endif /* HAVE_DAG_API */
731478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->setdirection_op = NULL;	/* Not implemented. */
732478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	    /* XXX - can this be implemented on some versions of Windows? */
733478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->inject_op = pcap_inject_win32;
734478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->set_datalink_op = NULL;	/* can't change data link type */
735478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->getnonblock_op = pcap_getnonblock_win32;
736478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->setnonblock_op = pcap_setnonblock_win32;
737478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->stats_op = pcap_stats_win32;
738511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->setbuff_op = pcap_setbuff_win32;
739511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->setmode_op = pcap_setmode_win32;
740511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->setmintocopy_op = pcap_setmintocopy_win32;
741511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->getadapter_op = pcap_getadapter_win32;
742511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->cleanup_op = pcap_cleanup_win32;
743478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
744511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (0);
745478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectbad:
746511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	pcap_cleanup_win32(p);
747511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (PCAP_ERROR);
748478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
749478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
750511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_t *
751511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_create_interface(const char *device, char *ebuf)
752511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
753511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	pcap_t *p;
754511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
755511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (strlen(device) == 1)
756511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	{
757511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		/*
758511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * It's probably a unicode string
759511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * Convert to ascii and pass it to pcap_create_common
760511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 *
761511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * This wonderful hack is needed because pcap_lookupdev still returns
762511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * unicode strings, and it's used by windump when no device is specified
763511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * in the command line
764511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 */
765511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		size_t length;
766511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		char* deviceAscii;
767511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
768511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		length = wcslen((wchar_t*)device);
769511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
770511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		deviceAscii = (char*)malloc(length + 1);
771511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
772511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (deviceAscii == NULL)
773511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		{
774511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			snprintf(ebuf, PCAP_ERRBUF_SIZE, "Malloc failed");
775511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			return NULL;
776511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		}
777511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
778511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(deviceAscii, length + 1, "%ws", (wchar_t*)device);
779511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		p = pcap_create_common(deviceAscii, ebuf, sizeof (struct pcap_win));
780511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		free(deviceAscii);
781511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
782511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	else
783511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	{
784511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		p = pcap_create_common(device, ebuf, sizeof (struct pcap_win));
785511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
786511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
787511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (p == NULL)
788511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (NULL);
789511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
790511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	p->activate_op = pcap_activate_win32;
791511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (p);
792511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
793478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
794478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
795478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_setfilter_win32_npf(pcap_t *p, struct bpf_program *fp)
796478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
797478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(PacketSetBpf(p->adapter,fp)==FALSE){
798478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
799478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Kernel filter not installed.
800478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * XXX - fall back on userland filtering, as is done
801478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * on other platforms?
802478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
803478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "Driver error: cannot set bpf filter: %s", pcap_win32strerror());
804478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return (-1);
805478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
806478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
807478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
808478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * Discard any previously-received packets, as they might have
809478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * passed whatever filter was formerly in effect, but might
810478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * not pass this filter (BIOCSETF discards packets buffered
811478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * in the kernel, so you can lose packets in any case).
812478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
813478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	p->cc = 0;
814478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (0);
815478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
816478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
817478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project/*
818478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project * We filter at user level, since the kernel driver does't process the packets
819478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project */
820478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
821478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_setfilter_win32_dag(pcap_t *p, struct bpf_program *fp) {
822478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
823478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if(!fp)
824478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
825478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		strncpy(p->errbuf, "setfilter: No filter specified", sizeof(p->errbuf));
826478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return -1;
827478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
828478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
829478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/* Install a user level filter */
830478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (install_bpf_program(p, fp) < 0)
831478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	{
832478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		snprintf(p->errbuf, sizeof(p->errbuf),
833478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project			"setfilter, unable to install the filter: %s", pcap_strerror(errno));
834478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return -1;
835478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
836478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
837478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (0);
838478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
839478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
840478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
841478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_getnonblock_win32(pcap_t *p, char *errbuf)
842478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
843511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	struct pcap_win *pw = p->priv;
844511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
845478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	/*
846478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * XXX - if there were a PacketGetReadTimeout() call, we
847478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * would use it, and return 1 if the timeout is -1
848478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 * and 0 otherwise.
849478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	 */
850511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (pw->nonblock);
851478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
852478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
853478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectstatic int
854478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Projectpcap_setnonblock_win32(pcap_t *p, int nonblock, char *errbuf)
855478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
856511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	struct pcap_win *pw = p->priv;
857478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	int newtimeout;
858478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
859478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (nonblock) {
860478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
861478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Set the read timeout to -1 for non-blocking mode.
862478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
863478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		newtimeout = -1;
864478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	} else {
865478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		/*
866478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * Restore the timeout set when the device was opened.
867478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * (Note that this may be -1, in which case we're not
868478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 * really leaving non-blocking mode.)
869478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		 */
870511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		newtimeout = p->opt.timeout;
871478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
872478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	if (!PacketSetReadTimeout(p->adapter, newtimeout)) {
873511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		snprintf(errbuf, PCAP_ERRBUF_SIZE,
874478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		    "PacketSetReadTimeout: %s", pcap_win32strerror());
875478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project		return (-1);
876478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	}
877511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	pw->nonblock = (newtimeout == -1);
878478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project	return (0);
879478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
880478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project
881511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*platform-dependent routine to add devices other than NDIS interfaces*/
882511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint
883511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallpcap_platform_finddevs(pcap_if_t **alldevsp, char *errbuf)
884478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project{
885511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (0);
886478ab6c8b5bc982589be32eae1e5736efe721b58The Android Open Source Project}
887